{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "454b72fb-e6df-4465-9a78-3ab2b9237733", "metadata": {}, "outputs": [], "source": [ "# 1. Import libraries\n", "import pandas as pd\n", "\n", "# 2. Load the customer reviews data\n", "# Make sure \"reviews_demo.csv\" is in the same folder as this notebook\n", "df = pd.read_csv(\"reviews_demo.csv\")\n", "\n", "# 3. Quick sanity check\n", "print(\"Rows, Columns:\", df.shape)\n", "display(df.head(5))\n", "\n", "# Optional: peek at a few random reviews\n", "df[[\"rating\", \"recommend\", \"review_text\"]].sample(3, random_state=1)" ] }, { "cell_type": "code", "execution_count": null, "id": "394afbdf-be3a-4ce7-93a0-a01dcd2f18cd", "metadata": {}, "outputs": [], "source": [ "# 4. Create a simple sentiment label based on rating\n", "def label_sentiment(r):\n", " if r >= 4:\n", " return \"positive\"\n", " elif r <= 2:\n", " return \"negative\"\n", " else:\n", " return \"neutral\"\n", "\n", "df[\"sentiment_rating\"] = df[\"rating\"].apply(label_sentiment)\n", "\n", "# 5. Look at a few rows to confirm\n", "df[[\"rating\", \"sentiment_rating\", \"recommend\", \"review_text\"]].head(10)" ] }, { "cell_type": "code", "execution_count": null, "id": "9855254c-2818-4040-a1f0-23557643d686", "metadata": {}, "outputs": [], "source": [ "# How many reviews in each sentiment bucket?\n", "print(\"Sentiment counts:\")\n", "print(df[\"sentiment_rating\"].value_counts())\n", "\n", "print(\"\\nSentiment vs Recommend (row %):\")\n", "sent_reco = pd.crosstab(df[\"sentiment_rating\"],\n", " df[\"recommend\"],\n", " normalize=\"index\").round(2)\n", "display(sent_reco)" ] }, { "cell_type": "code", "execution_count": null, "id": "2401e0d0-2f34-44ac-aede-4ec2dd77c68c", "metadata": {}, "outputs": [], "source": [ "# 6. Flag key themes/aspects in the review text\n", "def contains_keywords(text, keywords):\n", " text = str(text).lower()\n", " return any(k in text for k in keywords)\n", "\n", "# Aspect flags\n", "df[\"mentions_battery\"] = df[\"review_text\"].apply(\n", " lambda x: contains_keywords(x, [\"battery\"])\n", ")\n", "df[\"mentions_screen\"] = df[\"review_text\"].apply(\n", " lambda x: contains_keywords(x, [\"screen\", \"display\"])\n", ")\n", "\n", "# 7. Helper to summarize aspect sentiment\n", "def summarize_aspect(df, flag_col, aspect_name):\n", " subset = df[df[flag_col]]\n", " total = len(subset)\n", " sentiment_pct = (\n", " subset[\"sentiment_rating\"]\n", " .value_counts(normalize=True)\n", " .mul(100)\n", " .round(1)\n", " .to_dict()\n", " )\n", "\n", " print(f\"{aspect_name} mentioned {total} times\")\n", " for s, p in sentiment_pct.items():\n", " print(f\" {s.capitalize():8}: {p:4.1f}%\")\n", " print()\n", " return total, sentiment_pct\n", "\n", "print(\"=== Aspect Sentiment Summary ===\")\n", "battery_count, battery_sent = summarize_aspect(df, \"mentions_battery\", \"Battery life\")\n", "screen_count, screen_sent = summarize_aspect(df, \"mentions_screen\", \"Screen quality\")" ] }, { "cell_type": "code", "execution_count": null, "id": "85ecfa1d-42f9-4b3b-a4ea-673a30b9de77", "metadata": {}, "outputs": [], "source": [ "# 8. Simple business takeaway based on aspect sentiment\n", "\n", "print(\"=== Business Decision View ===\")\n", "print(\"• Battery life is frequently mentioned and mostly negative.\")\n", "print(\"• Screen quality is frequently mentioned and mostly positive.\\n\")\n", "\n", "print(\"So what should the product team do?\")\n", "print(\"- PRIORITY FIX: Improve battery life and overheating issues.\")\n", "print(\"- MARKETING ANGLE: Promote the strong screen quality in ads and on the website.\")\n", "print(\"- CUSTOMER SUCCESS: Proactively reach out to users complaining about battery issues.\")" ] }, { "cell_type": "code", "execution_count": null, "id": "115c6d38-b2f7-447b-9f44-92da8ef065b2", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 5 }