Skip to content

Instantly share code, notes, and snippets.

@priyankamandikal
Created October 21, 2015 21:47
Show Gist options
  • Save priyankamandikal/18bd3c13a29d7397b883 to your computer and use it in GitHub Desktop.
Save priyankamandikal/18bd3c13a29d7397b883 to your computer and use it in GitHub Desktop.
Analysis of Mozilla Firefox feedback data.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Mozilla Feedback Analysis\n",
"\n",
"\n",
"Mozilla Firefox releases various versions of its web browser over time. These versions are run on different platforms by users around the world. Some versions may make users happy, while some others, not so much. There is a huge amount of feedback that is generated by users across platforms and versions.\n",
"#### How do we make sense of this feedback? <br/>How can Mozilla analyze this data in order to cater to users' growing needs and tackle issues swiftly? \n",
"\n",
"In this project, the aim is to analyze the feedback data and find interesting behaviours associated with it. <br/>\n",
"The feedback is available at the following link. <br/>\n",
"https://input.mozilla.org/en-US/?product=Firefox<br/><br/>\n",
"\n",
"## Part 1: Web Scraping\n",
"\n",
"### Task: Scrape data from the site\n",
"### Completed: Scraped a week's worth of data (200 pages) using BeautifulSoup\n",
"Since the data is not readily available in the form of a table, it is necessary to scrape relevant information from the website. As a sample dataset to play around with, I scraped a week's worth of data (around 200 pages) using BeautifulSoup, a Python library for pulling data out of HTML and XML files.<br/><br/>\n",
"The code for scraping is as follows:\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'\\nimport requests\\nfrom pattern import web\\nfrom bs4 import BeautifulSoup\\nimport traceback\\n\\n#base url with GET dictionary\\nurl = \\'https://input.mozilla.org/en-US\\'\\nfeedback1 = open(\\'feedback1.txt\\',\\'a\\')\\nfor i in xrange(1,203): \\n#feedback1 - 1st 202 pages are valid as of 19th Oct 8:30AM IST\\n\\ttry:\\n\\t\\tparams = dict(product=\\'Firefox\\', page=i)\\n\\t\\tr = requests.get(url, params=params)\\n\\t\\tbs = BeautifulSoup(r.text)\\n\\t\\tfor opinion in bs.findAll(\\'li\\',\\'opinion\\'):\\n\\t\\t\\tsenti = opinion.find(\\'span\\',\\'sprite\\').contents[0]\\n\\t\\t\\tdatetime = opinion.find(\\'time\\')[\\'datetime\\']\\n\\t\\t\\ttime = opinion.find(\\'time\\').string #not a very useful value. We want the absolute date and time\\n\\t\\t\\t#to remove whitespaces on either side of s tring, just do for e.g. time.strip()\\n\\t\\t\\tversion = time.find_next(\\'a\\').find_next(\\'a\\').contents[0]\\n\\t\\t\\tplatform = version.find_next(\\'a\\').contents[0]\\n\\t\\t\\tlocale = platform.find_next(\\'a\\').contents[0]\\n\\t\\t\\tfeedback1.write(senti+\\'\\t\\'+datetime+\\'\\t\\'+version+\\'\\t\\'+platform+\\'\\t\\'+locale+\\'\\n\\')\\n\\texcept:\\n\\t\\t#the try catch block was added beacuse ceratin opinions in a page were geving errors as\\n\\t\\t#certain characters couldn\\'t be encoded by ascii codec. E.g. (Norwegian Bokmal), the \\'a\\' was different\\n\\t\\tprint \"Error while retreiving page \", i\\n\\t\\tprint traceback.format_exc()\\n\\t\\tcontinue\\n\\nfeedback1.close()\\n'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#I have commented out the scraping code here.\n",
"\n",
"'''\n",
"import requests\n",
"from pattern import web\n",
"from bs4 import BeautifulSoup\n",
"import traceback\n",
"\n",
"#base url with GET dictionary\n",
"url = 'https://input.mozilla.org/en-US'\n",
"feedback1 = open('feedback1.txt','a')\n",
"for i in xrange(1,203): \n",
"#feedback1 - 1st 202 pages are valid as of 19th Oct 8:30AM IST\n",
"\ttry:\n",
"\t\tparams = dict(product='Firefox', page=i)\n",
"\t\tr = requests.get(url, params=params)\n",
"\t\tbs = BeautifulSoup(r.text)\n",
"\t\tfor opinion in bs.findAll('li','opinion'):\n",
"\t\t\tsenti = opinion.find('span','sprite').contents[0]\n",
"\t\t\tdatetime = opinion.find('time')['datetime']\n",
"\t\t\ttime = opinion.find('time').string #not a very useful value. We want the absolute date and time\n",
"\t\t\t#to remove whitespaces on either side of s tring, just do for e.g. time.strip()\n",
"\t\t\tversion = time.find_next('a').find_next('a').contents[0]\n",
"\t\t\tplatform = version.find_next('a').contents[0]\n",
"\t\t\tlocale = platform.find_next('a').contents[0]\n",
"\t\t\tfeedback1.write(senti+'\\t'+datetime+'\\t'+version+'\\t'+platform+'\\t'+locale+'\\n')\n",
"\texcept:\n",
"\t\t#the try catch block was added beacuse ceratin opinions in a page were geving errors as\n",
"\t\t#certain characters couldn't be encoded by ascii codec. E.g. (Norwegian Bokmal), the 'a' was different\n",
"\t\tprint \"Error while retreiving page \", i\n",
"\t\tprint traceback.format_exc()\n",
"\t\tcontinue\n",
"\n",
"feedback1.close()\n",
"'''"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sad\t2015-10-18-08:00\t41.0\tLinux\tEnglish (US)\r\n",
"Sad\t2015-10-18-08:00\t41.0\tWindows XP\tVietnamese\r\n",
"Happy\t2015-10-18-08:00\t41.0.2\tWindows 7\tEnglish (US)\r\n",
"Sad\t2015-10-18-08:00\t37.0\tWindows 7\tEnglish (US)\r\n",
"Sad\t2015-10-18-08:00\t38.3.0\tWindows 7\tEnglish (US)\r\n",
"Happy\t2015-10-18-08:00\t8.0\tLinux\tSpanish (Spain)\r\n",
"Sad\t2015-10-18-08:00\t41.0.2\tWindows 7\tEnglish (US)\r\n",
"Sad\t2015-10-18-08:00\t41.0\tWindows 10\tEnglish (US)\r\n",
"Sad\t2015-10-18-08:00\t41.0.2\tWindows XP\tGerman\r\n",
"Sad\t2015-10-18-08:00\t41.0.2\tWindows 8.1\tSpanish (Spain)\r\n"
]
}
],
"source": [
"# Scraped data has been sevd in feedback2.txt\n",
"!head feedback2.txt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 2: Converting the data into a dataframe\n",
"\n",
"It is extremely important to convert the data into the right format to be able to perform operations on it. \n",
"#### I'm using Pandas (a Python data analysis toolkit) for dataframe related operations. \n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.pylab as P\n",
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of rows: 3760\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" <th>date</th>\n",
" <th>version</th>\n",
" <th>platform</th>\n",
" <th>locale</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Sad</td>\n",
" <td>2015-10-18-08:00</td>\n",
" <td>41.0</td>\n",
" <td>Linux</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Sad</td>\n",
" <td>2015-10-18-08:00</td>\n",
" <td>41.0</td>\n",
" <td>Windows XP</td>\n",
" <td>Vietnamese</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Happy</td>\n",
" <td>2015-10-18-08:00</td>\n",
" <td>41.0.2</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sad</td>\n",
" <td>2015-10-18-08:00</td>\n",
" <td>37.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sad</td>\n",
" <td>2015-10-18-08:00</td>\n",
" <td>38.3.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment date version platform locale\n",
"0 Sad 2015-10-18-08:00 41.0 Linux English (US)\n",
"1 Sad 2015-10-18-08:00 41.0 Windows XP Vietnamese\n",
"2 Happy 2015-10-18-08:00 41.0.2 Windows 7 English (US)\n",
"3 Sad 2015-10-18-08:00 37.0 Windows 7 English (US)\n",
"4 Sad 2015-10-18-08:00 38.3.0 Windows 7 English (US)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"names = ['sentiment', 'date', 'version', 'platform', 'locale']\n",
"data = pd.read_csv('feedback2.txt', delimiter='\\t', names=names).dropna()\n",
"print \"Number of rows: %i\" % data.shape[0]\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we have the data in the right format.<br/>\n",
"For the next part, I'm using an ad-hoc way for dealing with the datetime column. I am going to extract only the day. However, I'll learn how to use the actual date in later analysis that I perform in the future. For now, this is a dirty way, but suffices for the sample dataset that I have scraped."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" <th>date</th>\n",
" <th>version</th>\n",
" <th>platform</th>\n",
" <th>locale</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>41.0</td>\n",
" <td>Linux</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>41.0</td>\n",
" <td>Windows XP</td>\n",
" <td>Vietnamese</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Happy</td>\n",
" <td>18</td>\n",
" <td>41.0.2</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>37.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>38.3.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment date version platform locale\n",
"0 Sad 18 41.0 Linux English (US)\n",
"1 Sad 18 41.0 Windows XP Vietnamese\n",
"2 Happy 18 41.0.2 Windows 7 English (US)\n",
"3 Sad 18 37.0 Windows 7 English (US)\n",
"4 Sad 18 38.3.0 Windows 7 English (US)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# extracting the exact day from date\n",
"# This is not a good practice since I'm just extracting the date\n",
"# Ideally we should be extracting the entire date to compare them. Will do that later.\n",
"\n",
"data.date = [int(d.split('-')[2]) for d in data.date]\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" <th>version</th>\n",
" <th>platform</th>\n",
" <th>locale</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3760</td>\n",
" <td>3760</td>\n",
" <td>3760</td>\n",
" <td>3760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unique</th>\n",
" <td>2</td>\n",
" <td>69</td>\n",
" <td>31</td>\n",
" <td>48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>top</th>\n",
" <td>Sad</td>\n",
" <td>41.0.1</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>freq</th>\n",
" <td>3134</td>\n",
" <td>1546</td>\n",
" <td>1382</td>\n",
" <td>2090</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment version platform locale\n",
"count 3760 3760 3760 3760\n",
"unique 2 69 31 48\n",
"top Sad 41.0.1 Windows 7 English (US)\n",
"freq 3134 1546 1382 2090"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[['sentiment', 'version', 'platform', 'locale']].describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we can infer that majority of the feedabck has been negative.<br/>\n",
"The top version, platform and locale from where feedback has been coming can also be seen."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"count 3760.000000\n",
"mean 14.633511\n",
"std 2.175523\n",
"min 11.000000\n",
"25% 13.000000\n",
"50% 15.000000\n",
"75% 16.000000\n",
"max 18.000000\n",
"Name: date, dtype: float64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['date'].describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 3: Analyze the data and make some Basic plots\n",
"\n",
"We can now look at answering some questions that we may have regarding the given data.<br/>\n",
"What exactly are we looking for? Some questions instantly come to mind.<br/>\n",
"#### 1. Which version is causing a lot of problems?\n",
"#### 2. Which platform is causing the most problems?\n",
"#### 3. Which localities are users sending in feedback from?\n",
"#### 4. How is the positive feedback characterized?\n",
"#### 5. Which day has had maximum feedback coming in?\n",
"\n",
"Although the above are important questions, we may want to dig a little deeper into the data to find certain<br/>\n",
"correlations between attributes.\n",
"#### 6. Is there any correlation between specific versions causing problems when used on certain platforms?\n",
"#### 7. Which versions and platforms go well together? \n",
"<br/>\n",
"I will be using Matplotlib, a Python graph-plotting library.<br/><br/>\n",
"I have written a custom function that will be used with the matplotlib to make certain modifications to the in-built graphs. This makes the graphs simple and pretty by removing uneccesary borders, etc."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Custom function to make graphs simple and pretty\n",
"\n",
"%matplotlib inline\n",
"\n",
"#tell pandas to display wide tables as pretty HTML tables\n",
"pd.set_option('display.width', 500)\n",
"pd.set_option('display.max_columns', 100)\n",
"\n",
"#--------------------------To remove borders from the matplotlib plots-------------------------\n",
"def remove_border(axes=None, top=False, right=False, left=True, bottom=True):\n",
" \"\"\"\n",
" Minimize chartjunk by stripping out unnecesasry plot borders and axis ticks\n",
" \n",
" The top/right/left/bottom keywords toggle whether the corresponding plot border is drawn\n",
" \"\"\"\n",
" ax = axes or plt.gca()\n",
" ax.spines['top'].set_visible(top)\n",
" ax.spines['right'].set_visible(right)\n",
" ax.spines['left'].set_visible(left)\n",
" ax.spines['bottom'].set_visible(bottom)\n",
" \n",
" #turn off all ticks\n",
" ax.yaxis.set_ticks_position('none')\n",
" ax.xaxis.set_ticks_position('none')\n",
" \n",
" #now re-enable visibles\n",
" if top:\n",
" ax.xaxis.tick_top()\n",
" if bottom:\n",
" ax.xaxis.tick_bottom()\n",
" if left:\n",
" ax.yaxis.tick_left()\n",
" if right:\n",
" ax.yaxis.tick_right()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Feedback over time"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\nX0CVPzRbe/4/YzTAGbyZ1ZPFOx1ep+X2evfpmmcyK+IEb2YNZmuvWr7otvaqzQnezBqUq5bqpj4O\nju5CwMwsp5zgzcxyygnezHKrWbNmXHbZZRXjv/nNb7jqqqvqfTtjxozZZPyww4pfMVwaTvBm1mgk\n1funOq1ateKBBx7gvffeq9h+Q/jVr361yfgzzzzTINvZUr7JamaNqq5NRStTU/PRli1bMmzYMG64\n4QZ+8YtfbDJt1apVnHfeebzxRvYa4RtvvJFDDz2UVatW8YMf/IAVK1ZwyCGHMG3aNGbPns2OO+7I\nSSedxLJly1i3bh3Dhw/nhz/8IZdffjmffPIJvXv3Zv/99+euu+6ibdu2fPTRR5x66qkMGTKE7373\nuwCcddZZHH/88Zx44omMGDGCJ598kn/9619ccMEFDBs2rN6+l3I+gzezXDv//POZMGECH3744Sbl\nw4cP55JLLmHGjBncd999nHvuuQBcddVVHH300bz00kucfPLJFQcAgDvuuIOZM2fy4osvMnbsWFav\nXs3VV1/N9ttvz5w5c7jrrruAz68UTj31VCZNmgTA+vXrefzxx/ne977H7bffTocOHZgxYwYzZszg\ntttuY+nSpfW+7z6DN7Nca9euHUOGDGHs2LFsv/32FeWPPvooL7/8csX4mjVr+Pjjj3nmmWd48MEH\nAfjOd75Dx44dK+b57W9/WzFt2bJlvPbaa/TpU/XrLgYMGMDw4cNZv349U6ZM4aijjmK77bZj6tSp\nLFiwgPvuuw+ADz/8kMWLF9OlS5f63HUneDPLv4svvpgDDzyQoUOHVpRFBC+88AKtWrXabP7K2u5P\nnz6dxx57jOeff57WrVvTt29f1q1bV+12W7duTVlZGY888giTJk3itNNOq5h28803c8wxx2zFXtXM\nVTRmlnsdO3Zk0KBBjBs3rqL6pH///owdO7Zinnnz5gFZC5jyapWpU6eyevVqIDvL7tixI61bt2bR\nokU8//zzFcu2bNmSDRs2VLrtwYMHc8cdd/DUU08xYMAAILsyuOWWWyqWefXVV1m7dm0977UTvJnl\nWGGrmUsvvZR33323Ynzs2LHMnDmTnj17st9++/H73/8egFGjRjF16lR69OjBfffdx6677kq7du0Y\nMGAAGzZsoHv37owcOZJDDjmkYl3Dhg3jgAMO4Iwzzthsu/379+dvf/sbxxxzDC1aZJUm5557Lt27\nd+fAAw+kR48enHfeeVUeILZq/92bpFnjkLRVnY1ti/9nJG0Sd0M0U6zv72X9+vU0b96c5s2b89xz\nz3HBBRcwe/bset1GbRR/d+XFW7IO18GbWaPZFg5Sb7zxBoMGDWLjxo20atWK2267rdQh1ZkTvJlZ\ngb322qskZ+wNwXXwZmY55TN42yp+S5FZ0+UEb1vNbykya5pcRWNmllNO8GaWW82bN6d379706NGD\nQYMG8cknn2zR8m+99RannHIKkD0INWXKlIppf/7zn7nmmmvqNd765gRvZo2msbsLbtOmDXPmzGHB\nggW0atWKW2+9dYvi3X333bn33nsBmDNnDn/9618rpg0cOJARI0Zs+ZfQiFwHb2aNalQ93le/agvu\n8R9++OEsWLCA1atXM3ToUJYsWUKbNm347//+b3r06MGTTz7JxRdfDGQHoqeeeopVq1YxcOBAZs+e\nzZVXXsm6det4+umnGTlyJGvXrmXWrFn88pe/5IADDqjoDfLjjz9m3333ZcmSJSxdupQLL7yQVatW\n0aZNG2677Tb22Wef+vsCauAzeDPLvQ0bNvDwww9zwAEHcOWVV/KNb3yDefPmMWbMGIYMGQLAdddd\nxy233MKcOXN4+umnad26dcXyLVu25Oc//zmnnnoqc+bMYdCgQRVXD+3bt6dXr15Mnz4dgIceeogB\nAwbQvHlzhg0bxk033cTMmTO59tprOf/88xt1v30Gb2a5Vf4iDoAjjzySs88+m4MPPpj7778fgL59\n+/Lee++xZs0aDjvsMC655BJOP/10vv/977PHHntssq6IqLJZ7+DBg/njH/9IWVkZ99xzDxdeeCEf\nffQRzz77bEUdPmTdIDQmJ3gzy63yF3EUK07UkhgxYgTHHXccf/nLXzjssMN45JFH2G677Wq1nYED\nB3LFFVewevVqZs+eTb9+/VizZg0dO3asdPuNxVU0ZvaFcsQRRzBhwgQg6+N95513pm3btrz++uvs\nt99+/PSnP+Wggw7ilVde2WS59u3bs2bNmorxwoNE27ZtOeigg7jooosYOHAgkmjfvj1du3ateKlH\nRDB//vxG2MPPOcGbWW5V1spm9OjRzJo1i549e3LFFVcwfvx4IHtbU48ePejZsyetWrXi2GOP3WQd\nffv2ZeHChfTu3ZtJkyZt1opn8ODBTJw4kcGDB1eUTZgwgXHjxtGrVy/2339/Jk+e3JC7uxl3F2xb\n5YvYBW5dfRG/q22xu+Cmwt0Fm9k2Ja/JuKlyFY2ZWU45wZuZ5ZSraCyX3I2xmRO85Zi7MbYvOid4\nM2tQDdFyxmrHCd7MGoyrukqrVjdZJTWXNEfSn9P4jpKmSXpV0lRJHQrmHSnpNUmLJPVvqMDNzKx6\ntW1FMxxYCJQfji8HpkXE3sBjaRxJ3YHBQHdgAHCLJLfUMTMrgRqTr6Q9ge8Ct/P5U1THA+PT8Hjg\nxDR8AnB3RHwaEUuBxUCf+gzYzMxqpzZn1zcAPwE2FpR1ioiVaXgl0CkN7w4sL5hvObBpn5tmZtYo\nqr3JKuk44J2ImCOprLJ5IiIkVXcnpdJpo0ePrhguKyujrKzS1ZuZWR3V1IrmUOB4Sd8FWgPtJd0F\nrJS0a0S8LWk34J00/5tA54Ll90xlmylM8GZmVv+qraKJiCsionNEdAVOBR6PiDOAycCZabYzgQfT\n8GTgVEmtJHUFugEzGiZ0MzOrzpa2gy+vbrkamCTpHGApMAggIhZKmkTW4mYDcL77BTYzK41aJ/iI\neBJ4Mg2/DxxdxXxjgDH1Ep2ZmdWZ26ibmeWUE7yZWU45wZuZ5ZQ7GzP7AnO/+fnmBG/2Bed+8/PL\nVTRmZjnlM/gq+NLVzLZ1TvDV8KWrmW3LnOC3Ib6qMLMt4QS/jfFVhZnVlm+ympnllBO8mVlOOcGb\nmeWU6+DNrElxY4L64wRvZk2OGxPUD1fRmJnllBO8mVlOOcGbmeWUE7yZWU45wZuZ5ZQTvJlZTjnB\nm5nllBO8mVlOOcGbmeWUE7yZWU45wZuZ5ZQTvJlZTjnBm5nllBO8mVlOOcGbmeWUE7yZWU45wZuZ\n5ZQTvJlZTjnBm5nllBO8mVlOVZvgJbWW9IKkuZIWSvpVKt9R0jRJr0qaKqlDwTIjJb0maZGk/g29\nA2ZmVrlqE3xErAP6RkQv4ACgr6TDgcuBaRGxN/BYGkdSd2Aw0B0YANwiyVcJZmYlUGPyjYi1abAV\n0BxYDRwPjE/l44ET0/AJwN0R8WlELAUWA33qM2AzM6udGhO8pGaS5gIrgSci4u9Ap4hYmWZZCXRK\nw7sDywsWXw7sUY/xmplZLbWoaYaI2Aj0krQD8IikvkXTQ1JUt4qtjNHMzOqgxgRfLiL+KekvwDeA\nlZJ2jYi3Je0GvJNmexPoXLDYnqlsM6NHj64YLisro6ysbMsiNzOzalWb4CXtBGyIiA8kbQ8cA1wF\nTAbOBK5J/z6YFpkMTJR0PVnVTDdgRmXrLkzwZmZW/2o6g98NGJ9awjQD7oqIxyTNASZJOgdYCgwC\niIiFkiYBC4ENwPkR4SoaM7MSqDbBR8QC4MBKyt8Hjq5imTHAmHqJzszM6sxt1M3McsoJ3swsp5zg\nzcxyygnezCynat0OvqFc9+trmT7l4bot3KI5V994A/vtt1/9BmVmlgMlT/Cznn2OnZ5fxMEtd9ji\nZa/nbd5///0GiMrMbNtX8gQPsH+Lthyz3Ze3eLk/xD8bIBozs3xwHbyZWU45wZuZ5ZQTvJlZTjnB\nm5nllBO8mVlOOcGbmeWUE7yZWU45wZuZ5ZQTvJlZTjnBm5nllBO8mVlOOcGbmeWUE7yZWU45wZuZ\n5ZQTvJlZTjnBm5nllBO8mVlOOcGbmeWUE7yZWU45wZuZ5ZQTvJlZTjnBm5nllBO8mVlOOcGbmeWU\nE7yZWU45wZuZ5ZQTvJlZTjnBm5nllBO8mVlO1ZjgJXWW9ISkv0t6SdJFqXxHSdMkvSppqqQOBcuM\nlPSapEWS+jfkDpiZWeVqcwb/KXBJROwHfAu4QNK+wOXAtIjYG3gsjSOpOzAY6A4MAG6R5CsFM7NG\nVmPijYi3I2JuGv4IeBnYAzgeGJ9mGw+cmIZPAO6OiE8jYimwGOhTz3GbmVkNtujMWlIXoDfwAtAp\nIlamSSuBTml4d2B5wWLLyQ4IZmbWiGqd4CW1Bf4EDI+INYXTIiKAqGbx6qaZmVkDaFGbmSS1JEvu\nd0XEg6l4paRdI+JtSbsB76TyN4HOBYvvmco2MXr0aAAWLHqZHTasrVv0ZmZWpRoTvCQB44CFEXFj\nwaTJwJnANenfBwvKJ0q6nqxqphswo3i95Qn+1bnz2evNv9d9D8zMrFK1OYM/DPh3YL6kOalsJHA1\nMEnSOcBSYBBARCyUNAlYCGwAzk9VOGZm1ohqTPAR8TRV19UfXcUyY4AxWxGXmZltJbdPNzPLKSd4\nM7OccoI3M8spJ3gzs5xygjczyykneDOznHKCNzPLKSd4M7OccoI3M8spJ3gzs5xygjczyykneDOz\nnHKCNzPLKSd4M7OccoI3M8spJ3gzs5xygjczyykneDOznHKCNzPLKSd4M7OccoI3M8spJ3gzs5xy\ngjczyykneDOznHKCNzPLKSd4M7OccoI3M8spJ3gzs5xygjczyykneDOznHKCNzPLKSd4M7OccoI3\n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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f9a7dd90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#negative and positive feedback over time\n",
"#resources: http://matplotlib.org/examples/pylab_examples/histogram_demo_extended.html\n",
"# http://matplotlib.org/examples/statistics/histogram_demo_multihist.html\n",
"\n",
"#Happy gives KeyError without .values\n",
"\n",
"fig = plt.figure(1)\n",
"plt.hist([[data[data.sentiment=='Sad'].date],[data[data.sentiment=='Happy'].date]],\n",
" bins=np.arange(11,21), \n",
" color=['crimson','chartreuse'],\n",
" label=['Negative','Positive'])\n",
"plt.xlabel('Date (day of October 2015)')\n",
"plt.title('Feedback over Time')\n",
"plt.legend(prop={'size': 10})\n",
"remove_border()\n",
"\n",
"#handles, labels = ax.get_legend_handles_labels()\n",
"fig.savefig('fig1.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We observe that positive feedback has been low and almost constant on all days.<br/>\n",
"Negative feedback has slightly varied with time, peaking on 16-10-2015.<br/>\n",
"We can assume a bias in the result because not everyone reports positive feedback, but problems are immediately reported by users.<br/>\n",
"So we need to place more emphasis on negative feedback in our analysis in order to pinpoint areas which Mozilla needs to focus on, in order to fix issues.\n",
"### Which versions are popular?"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f9918d50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Finding the versions with the most number of positive and negative feedbacks.I am ignoring the ones which \n",
"#have a count of <20. I am also ignoring the 'Unknown' column.\n",
"#Resources: http://pandas.pydata.org/pandas-docs/version/0.13.1/visualization.html\n",
"\n",
"fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(15,5))\n",
"\n",
"data[(data.sentiment=='Sad') & (data.version!='Unknown')].version.value_counts()[:9].plot(kind=\"bar\",\n",
" ax=axes[0],color='crimson')\n",
"axes[0].set_xlabel('Version')\n",
"axes[0].set_title('Versions with negative feedback')\n",
"remove_border(axes=axes[0])\n",
"\n",
"\n",
"data[(data.sentiment=='Happy') & (data.version!='Unknown')].version.value_counts()[:9].plot(kind=\"bar\",\n",
" ax=axes[1],color='chartreuse')\n",
"plt.ylim([0,1400])\n",
"axes[1].set_xlabel('Version')\n",
"axes[1].set_title('Versions with postive feedback')\n",
"remove_border(axes=axes[1])\n",
"\n",
"fig.savefig('fig2.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We find that the versoin causin maximum problems is also the one with the most positive feedback.<br/>\n",
"This is true for other versions as well. So it is safe to assume that Version 41.0.1 seems to be the most\n",
"popular version amongst users, as it generates the most feedback (positive and negative) overall. But as I had already mentioned, the positive feedback doesn't really help us as the number is small. We may have to look into the text to see if there's any information in there."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Which platforms are causing problems or are compatible?"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f97da390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Finding the platforms with the most number of positive and negative feedbacks.I am ignoring the ones \n",
"#with a low count value. I am also ignoring the 'Unknown' column.\n",
"\n",
"fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(15,5))\n",
"\n",
"data[(data.sentiment=='Sad') & (data.platform!='Unknown')].platform.value_counts()[:8].plot(kind=\"bar\",\n",
" ax=axes[0],color='crimson')\n",
"axes[0].set_xlabel('Platform')\n",
"axes[0].set_title('Platforms with negative feedback')\n",
"remove_border(axes=axes[0])\n",
"\n",
"\n",
"data[(data.sentiment=='Happy') & (data.platform!='Unknown')].platform.value_counts()[:8].plot(kind=\"bar\",\n",
" ax=axes[1],color='chartreuse')\n",
"plt.ylim([0,1200])\n",
"axes[1].set_xlabel('Platform')\n",
"axes[1].set_title('Platforms with postive feedback')\n",
"remove_border(axes=axes[1])\n",
"\n",
"fig.savefig('fig3.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Windows platforms seem to be generating the most problems. One thing to note here is that platform count is not directly proportional to the percentag of those platform users facing the problem. This is because the number of overall users for a platform varies. <br/><br/>\n",
"For e.g. Windows 7 problems > Windows 8.1 problems<br/>\n",
"But this does not imply that %(7 users facing problems) > %(8 users facing problems)<br/>\n",
"Because the number of 8 users may be much lesser than 7 users leading to lower feedback count.<br/><br/>\n",
"While dealing with the issues, Mozilla probably needs to assign equal importance to 8 users so that it doesn't lose out on the 8 userbase."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Where is feedback coming in from?"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nHx0+e+SoapnvAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f961a210>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Finding the locations with the most number of positive and negative feedbacks.I am ignoring the ones \n",
"#with a low count value. I am also ignoring the 'Unknown' column.\n",
"\n",
"fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(15,5))\n",
"\n",
"data[(data.sentiment=='Sad') & (data.locale!='Permalink')].locale.value_counts()[:8].plot(kind=\"bar\",\n",
" ax=axes[0],color='crimson')\n",
"axes[0].set_xlabel('Locale')\n",
"axes[0].set_title('Locales with negative feedback')\n",
"remove_border(axes=axes[0])\n",
"\n",
"\n",
"data[(data.sentiment=='Happy') & (data.locale!='Permalink')].locale.value_counts()[:8].plot(kind=\"bar\",\n",
" ax=axes[1],color='chartreuse')\n",
"plt.ylim([0,1800])\n",
"axes[1].set_xlabel('Locale')\n",
"axes[1].set_title('Locales with postive feedback')\n",
"remove_border(axes=axes[1])\n",
"\n",
"fig.savefig('fig4.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Users in USA have a huge share in the providing feedback, both positive and negative.\n",
"## Part 4: Finding Correlations\n",
"### Task: Find which version/platform combinations are successful/unsuccessful\n",
"### Completed: Plotted a heatmap showing the distribution\n",
"After dabbling with a lot of bar graphs and getting a sense of how the general bahaviour of the data is, it would be interesting to see if there are any correlations between different versions and platforms. The most apt graph for thos purpose would be a heat map. Since the attributes are non-numerical, it is quite a task to get a heatmap out of it. But with a bit of effort (and a LOT of googling), I was successful in getting the desired output!<br/><br/>\n",
"In the following sections, I have explained in detail how I went about the entire process."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#I'm using dummy column to have a lits of 1s as count value for each instance. This is needed for the pivot table.\n",
"\n",
"data.insert(len(data.columns), column='dummy', value=[1]*len(data))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>platform</th>\n",
" <th>Android 4.2.2</th>\n",
" <th>Android 4.3</th>\n",
" <th>Fedora</th>\n",
" <th>FreeBSD</th>\n",
" <th>Linux</th>\n",
" <th>Maemo</th>\n",
" <th>OS X</th>\n",
" <th>Windows 10</th>\n",
" <th>Windows 2000</th>\n",
" <th>Windows 7</th>\n",
" <th>Windows 8</th>\n",
" <th>Windows 8.1</th>\n",
" <th>Windows NT</th>\n",
" <th>Windows NT 4.10</th>\n",
" <th>Windows Vista</th>\n",
" <th>Windows XP</th>\n",
" </tr>\n",
" <tr>\n",
" <th>version</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>10.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"platform Android 4.2.2 Android 4.3 Fedora FreeBSD Linux Maemo OS X Windows 10 Windows 2000 Windows 7 Windows 8 Windows 8.1 Windows NT Windows NT 4.10 Windows Vista Windows XP\n",
"version \n",
"10.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3\n",
"11.0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1\n",
"12.0 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 2\n",
"13.0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 2\n",
"14.0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Resources: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html\n",
"\n",
"pt1 = pd.pivot_table(data[(data.sentiment=='Sad') & (data.version!='Unknown') & (data.platform!='Unknown')], \n",
" index='version', values='dummy', columns='platform', aggfunc=np.sum, fill_value=0)\n",
"pt1.head()\n",
"#use pt1 to look at the entire pivot table"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>platform</th>\n",
" <th>Android 4.2.2</th>\n",
" <th>Android 4.3</th>\n",
" <th>Fedora</th>\n",
" <th>FreeBSD</th>\n",
" <th>Linux</th>\n",
" <th>Maemo</th>\n",
" <th>OS X</th>\n",
" <th>Windows 10</th>\n",
" <th>Windows 2000</th>\n",
" <th>Windows 7</th>\n",
" <th>Windows 8</th>\n",
" <th>Windows 8.1</th>\n",
" <th>Windows NT</th>\n",
" <th>Windows NT 4.10</th>\n",
" <th>Windows Vista</th>\n",
" <th>Windows XP</th>\n",
" </tr>\n",
" <tr>\n",
" <th>version</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>40.0.3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>14</td>\n",
" <td>0</td>\n",
" <td>21</td>\n",
" <td>2</td>\n",
" <td>10</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>27</td>\n",
" <td>89</td>\n",
" <td>0</td>\n",
" <td>124</td>\n",
" <td>7</td>\n",
" <td>25</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>12</td>\n",
" <td>39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0.1</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>58</td>\n",
" <td>0</td>\n",
" <td>117</td>\n",
" <td>290</td>\n",
" <td>0</td>\n",
" <td>513</td>\n",
" <td>19</td>\n",
" <td>133</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>56</td>\n",
" <td>153</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0.2</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>11</td>\n",
" <td>0</td>\n",
" <td>56</td>\n",
" <td>206</td>\n",
" <td>0</td>\n",
" <td>316</td>\n",
" <td>14</td>\n",
" <td>86</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>30</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42.0</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>17</td>\n",
" <td>47</td>\n",
" <td>0</td>\n",
" <td>74</td>\n",
" <td>8</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44.0a1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>33</td>\n",
" <td>0</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"platform Android 4.2.2 Android 4.3 Fedora FreeBSD Linux Maemo OS X Windows 10 Windows 2000 Windows 7 Windows 8 Windows 8.1 Windows NT Windows NT 4.10 Windows Vista Windows XP\n",
"version \n",
"40.0.3 0 0 0 0 2 0 5 14 0 21 2 10 1 0 2 9\n",
"41.0 0 0 0 0 19 0 27 89 0 124 7 25 0 1 12 39\n",
"41.0.1 1 0 1 0 58 0 117 290 0 513 19 133 0 0 56 153\n",
"41.0.2 0 1 0 0 11 0 56 206 0 316 14 86 0 0 30 95\n",
"42.0 0 1 0 0 2 0 17 47 0 74 8 8 0 0 16 14\n",
"44.0a1 0 0 0 1 9 0 3 33 0 23 0 5 0 0 2 0"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Removing versions having a total negative feedback count of less than 30\n",
"#Note that I haven't used a for loop since the upper limit is taken to be non-changing in for loops.\n",
"#But in our case, we keep decrementing nrows every time a row is deleted. So I have used a do-while equivalent\n",
"#in Python.\n",
"\n",
"nrows = len(pt1)\n",
"i = 0;\n",
"while True:\n",
" row = pt1.ix[i,]\n",
" if(row.sum()<30):\n",
" pt1.drop(pt1.index[i],inplace=True)\n",
" i=i-1 #Because of dropping, indexing of rows changes. So need to read next row from same position\n",
" nrows = nrows-1\n",
" i = i+1\n",
" if(i>=nrows):\n",
" break\n",
"\n",
"pt1"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# You can also plot a heatmap with normed values if needed. Replace pt1 with pt1_norm in the next code snippet.\n",
"# And uncomment below line.\n",
"\n",
"#pt1_norm = (pt1 - pt1.mean()) / (pt1.max() - pt1.min())"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nA5xDWikpYzDwXIPvlvFL4FBJ2wGfIE0cHyHV0cbAgqyOriOtipTpCHAuqY4fkPSYpM+V5DfI5RZ1\nHpLdv1C7MLOVftlSof9E0kQc4ATSai1m9gpwPGnlcb7X924VMgBu9r6yjZkdYWYPl70k6WxJM9xF\ncxlpVWVQB3KL1GuvRWb2n0KaF7PrVcDikr5WVT+Q1ae/3wIgaTNJ17vr5XLSClSr9IYLc7Fup1j1\nPrklZrY6u1/p+WxFWnXK+8rzHehapnNNFqR+OSXrkzOA10kG2na5bDNbBSyp3a/luM4p7Ws0NlY6\nog34ZuF7tL2Xp8NvFanvFL8VRUq/JXXafyjJUFxeofMA0qr1pWa2osFyBkHQzQnjMAiCnkS+Z28u\nabVmYBY2N7NjPP5a0qRzZzNrJa2uNfOb2Ij8HQrX8ypkzSettuTvzm9UETN7jrQi8hkP4zxqLmnV\nZcusjlrNbM88eUHWQjM71cyGAKcBP9WbT3VdTHJBLOrciMFQxi3AcN8r9RHSBL6mzx1mdhTJpfJJ\n0l6vMowGDiJROmXyHOA4MxvgPzosz9JaZeJ26rVXUUYjMteWbwK7klwjW4H3ku2/JK2gbiVpb9Ih\nRRML6RvRbRHJeBuaPRta8W4jzCGtvOZjdzMzm09y8d2+9qLSXtrc+FvXcV3V1xoZK/XKdEmhTC1m\ndrPHdfStWsCbvxVFqr4lHbX/XGALSa0VOi8DjgHGSjqowXIGQdDNCeMwCIKeygPACqWDP/pK6i3p\nHZL28/gWkuveSkm7k9w6cxYCO61D/vXkA5ztB0YMBc4Cbq6QdRNwgaRBkgaRXOuK/06hHuOAM0l7\ntWorbwuAO4ArJfWX1EvSTpIOqRLih3jUJucvkYyHfDUJM/svaW/TJZJaJLUBXyetYHYaM1sE/JV0\nuupMM3vKddla0ocl9SMZo6+Q3ORKVW8wu/4kQ2ex0sEy3yW54tZ4ARiWrbyVye5se3Xl6ZktpJXE\n5UqH74zKI83sNWAycAVpv9qfCnrV1c3b+1ZgtI+13YGTWHuj9zrg+5J2AJC0laQPedwtwLGSDlQ6\n5Gd0Qcd1GtdVfW1txkqBG4DTlQ7MkaR+kj4oqYX636pfASP9W7E9aRznCPiypCHexufT/i2pbH8v\n022kH3gGSNq4WB4zm0rag3urpLKDcIIg6GGEcRgEQU/CPNQmrMeQ9tjMJK1u/Iz2if7ZJLexl/35\nJNaczI4Gxrmb1ydy2YX8qqgnH+A3pIMoHgZ+D4ypkHUxaT/jox6m+7NG9Kjxa9Lk/y4zy11hTyYd\nLFJ8CAEAAAHOSURBVDODtLduMmkVria3KHs/4D5JK1z/s6z9fxvm755JMtZmklYtbyTtYauSW68M\nE4HDWXNlqxfJ6JxHci08mHIjvCrPsrg/eniatK91FWu68dVOs1wiaXqF7M62VyP10RlDK5d3NWlf\n3mLSIS+3lciq1e3kgttoUa+OdPgKyf32BdIPETeR9gl2pGMV1wC/Be6Q9DLwd9LeRsxsBqlvTSKt\nxq4gueT+29M2Y1yX9TXoeKyUle8NuWb2EGmv4E887T9dHl7nHX2rvkdyU55F6pvjeXO73EgyXp91\n2bX+Vq/9TyL9sPIkyXA+qyAXM7sT+DzwO0n7VJQ3CIIeQm2zexAEQbAekbSa5Po2c0PrEgTNRtJl\npAOGyvakNjOfFpL7487uPh0EQRCsA7FyGARBEATBOiFpN0l7ucvkAaSVptL/mdeEvI71g1b6kdxh\nHw3DMAiCoDmEcRgEQbBhCLeNoCfRn+S6/C+SK+cVZvbbLsrrQyRX4nmk/YOf6qJ8giAI3nKEW2kQ\nBEEQBEEQBEEQK4dBEARBEARBEARBGIdBEARBEARBEAQBYRwGQRAEQRAEQRAEhHEYBEEQBEEQBEEQ\nEMZhEARBEARBEARBAPwPcAmm5hi0QTgAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f9677a10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Resources:\n",
"#http://stackoverflow.com/questions/14391959/heatmap-in-matplotlib-with-pcolor\n",
"#https://plot.ly/python/heatmaps/\n",
"\n",
"fig, ax = plt.subplots()\n",
"heatmap = ax.pcolor(pt1, cmap=plt.cm.Reds, alpha=0.89)\n",
"\n",
"# Format\n",
"fig = plt.gcf()\n",
"fig.set_size_inches(15,5)\n",
"\n",
"# turn off the frame\n",
"ax.set_frame_on(False)\n",
"\n",
"# put the major ticks at the middle of each cell\n",
"ax.set_yticks(np.arange(pt1.shape[0]) + 0.5, minor=False)\n",
"ax.set_xticks(np.arange(pt1.shape[1]) + 0.5, minor=False)\n",
"\n",
"# want a more natural, table-like display\n",
"ax.invert_yaxis()\n",
"ax.xaxis.tick_top()\n",
"\n",
"# Set the labels\n",
"ax.set_xticklabels(pt1.columns, minor=False)\n",
"ax.set_yticklabels(pt1.index, minor=False)\n",
"\n",
"# rotate the x labels\n",
"plt.xticks(rotation=90)\n",
"\n",
"ax.grid(False)\n",
"\n",
"# Turn off all the ticks\n",
"ax = plt.gca()\n",
"\n",
"for t in ax.xaxis.get_major_ticks():\n",
" t.tick1On = False\n",
" t.tick2On = False\n",
"for t in ax.yaxis.get_major_ticks():\n",
" t.tick1On = False\n",
" t.tick2On = False\n",
" \n",
"# name the axes and plot\n",
"ax.set_xlabel('Platform')\n",
"ax.set_ylabel('Version') \n",
"ax.xaxis.set_label_position('top')\n",
"plt.title('Heatmap of Version vs Platform having negative feedback',y=-0.08)\n",
"\n",
"handles, labels = ax.get_legend_handles_labels()\n",
"#lgd = ax.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5,-0.1))\n",
"#fig.savefig('heatmap.png', bbox_extra_artists=(lgd,), bbox_inches='tight')\n",
"fig.savefig('fig5.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Voila! Here is our much-waited heatmap!<br/>\n",
"#### Some observations:\n",
"1. Version 41.0.1 is in general problematic with a lot of platforms, Windows 7 and 10 in general.<br/>\n",
"2. Version 41.0.2 (which seems to be an updated version of 41.0.1) has fewer number of issues, but users are still facing problems. So it will have to be looked into.\n",
"3. Firefox probably works best with Linux, as it has a remarkably low negative feedback count.\n",
"\n",
"### Repeating the heatmap process for positive feedback\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>platform</th>\n",
" <th>Android 4.2.2</th>\n",
" <th>Linux</th>\n",
" <th>Maemo</th>\n",
" <th>OS X</th>\n",
" <th>Windows 10</th>\n",
" <th>Windows 7</th>\n",
" <th>Windows 8</th>\n",
" <th>Windows 8.1</th>\n",
" <th>Windows Vista</th>\n",
" <th>Windows XP</th>\n",
" </tr>\n",
" <tr>\n",
" <th>version</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>10.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10.0.2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"platform Android 4.2.2 Linux Maemo OS X Windows 10 Windows 7 Windows 8 Windows 8.1 Windows Vista Windows XP\n",
"version \n",
"10.0 0 0 0 0 0 1 0 0 1 0\n",
"10.0.2 0 0 0 0 0 1 0 0 0 1\n",
"11.0 0 0 0 0 0 3 1 0 0 0\n",
"12.0 0 0 0 0 0 2 2 0 0 0\n",
"13.0 0 0 0 0 0 2 1 0 0 2"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pt2 = pd.pivot_table(data[(data.sentiment=='Happy') & (data.version!='Unknown') & (data.platform!='Unknown')], \n",
" index='version', values='dummy', columns='platform', aggfunc=np.sum, fill_value=0)\n",
"pt2.head()\n",
"#use pt2 to look at the entire pivot table"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>platform</th>\n",
" <th>Android 4.2.2</th>\n",
" <th>Linux</th>\n",
" <th>Maemo</th>\n",
" <th>OS X</th>\n",
" <th>Windows 10</th>\n",
" <th>Windows 7</th>\n",
" <th>Windows 8</th>\n",
" <th>Windows 8.1</th>\n",
" <th>Windows Vista</th>\n",
" <th>Windows XP</th>\n",
" </tr>\n",
" <tr>\n",
" <th>version</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>40.0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40.0.3</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0</th>\n",
" <td>0</td>\n",
" <td>7</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>12</td>\n",
" <td>24</td>\n",
" <td>2</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0.1</th>\n",
" <td>1</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>15</td>\n",
" <td>48</td>\n",
" <td>55</td>\n",
" <td>4</td>\n",
" <td>17</td>\n",
" <td>5</td>\n",
" <td>45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41.0.2</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>26</td>\n",
" <td>34</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42.0</th>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44.0a1</th>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8.0</th>\n",
" <td>0</td>\n",
" <td>12</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"platform Android 4.2.2 Linux Maemo OS X Windows 10 Windows 7 Windows 8 Windows 8.1 Windows Vista Windows XP\n",
"version \n",
"40.0 0 0 0 1 4 3 0 1 0 2\n",
"40.0.3 0 2 0 1 1 8 0 2 0 5\n",
"41.0 0 7 0 3 12 24 2 10 2 9\n",
"41.0.1 1 9 0 15 48 55 4 17 5 45\n",
"41.0.2 0 3 0 4 26 34 2 7 4 26\n",
"42.0 0 2 0 2 6 23 0 3 5 5\n",
"44.0a1 0 3 0 1 5 3 1 1 0 0\n",
"8.0 0 12 0 0 0 3 0 0 0 2"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Removing versions having a total positive feedback count of less than 20\n",
"\n",
"nrows = len(pt2)\n",
"i = 0;\n",
"while True:\n",
" row = pt2.ix[i,]\n",
" if(row.sum()<10):\n",
" pt2.drop(pt2.index[i],inplace=True)\n",
" i=i-1 #Because of dropping, indexing of rows changes. So need to read next row from same position\n",
" nrows = nrows-1\n",
" i = i+1\n",
" if(i>=nrows):\n",
" break\n",
"\n",
"pt2"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nDYS+aA6B3wS+VVU/r6rVwOeBfcdtczOwcMzyAh556KkkSZIkaQL90hxeA+yTZJMkAX4PuGrcNmcD\nrwRIsg+9Q09vn9kyJUmSJKk/ze26gKmoqiuSnAZcCowClwMfTvL6Zv2pVfWlJEuSXA/cBxzVXcWS\nJEmS1F/6ojkEqKr3AO8ZN3zquG2OmbmKJEmSJGlw9MthpZIkSZKkaWRzKEmSJEmyOZQkSZIk2RxK\nkiRJkrA5lCRJkiRhcyhJkiRJwuZQkiRJkoTNoSRJkiQJm0NJkiRJEjaHkiRJkiRsDiVJkiRJ2BxK\nkiRJkrA5lCRJkiQBqaqua5AkSZIkdcyZQ0mSJEmSzaEkSZIkyeZQkiRJkoTNoSRJkiQJm0NJkiRJ\nEjaHkiRJkiRsDiVJkiRJ2BxK0kBJ8mdJbk9yd5JtOqzjniSLunr8RyvJkUm+8Rj23y7JRU3+722z\ntik+/vIkL5yG+/1Qkre1fb/TJckPkjx3Leu/lOSIaXjc305yXfP6P6Dl+74gydHN7cf0Op3KY0ja\nMNkcSup7E/2HuM3/PCUZTbJzG/c1nZLMA94HvLCqtqyqX45ZNz/JnUleMMF+JyX5bJu1VNUWVbW8\nzftsS5J3JFnV/Af+l0m+mWSfR3k/p48bfh1wR5P/8e1UvF6q+Wr3Tqv+rKr+vu37nS5V9RtVdRFM\n/HOqqiVVNf5n14b/H/hg8/o/u+X7npafbQePIWkWszmUNAhm4j80meb7b8OTgPnA1eNXVNUK4Czg\nlWPHkwwBhwKfWJ8HavbrVwWcWVVbAE8ALgY+39J9P5kJ8p+KJHNbqkHd2RG4qusiJOnRsjmUNKge\n1iwm2T7J55LckeR/khw7Zt3eSb7dzCLdkuTkZhaOJBc1m13RzDS9PMnzk9yU5Pjm/m5JclCSJUmu\nTfLzJG+Zyv0360eTHJvkhiQ/TfKeJBM2o0k2TvIvSW5uvk5KslGSp/BQU3Jnkq9OsPsngZcl2WTM\n2O/Tey84N8lWST7a1HhTkncmmdM87pHNDNv7k/wMeHuSXZNc2MxI/jTJWeOe087N7a2SnNZktTzJ\n36x5fs39XpzkvUl+0fxsFk/y3E8YP8OZ5ANJPjDmvm5oDun8nyR/PNH90Gv0A1BVq4HTgCcl2XaC\nx/xAkp8kuSvJpUl+pxlfDLwVOKR5XXwvycfpNd9/3Yzt1/xsHvHzau5jzevor5PcCnwsyduTfDbJ\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f44f965e610>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Resources:\n",
"#http://stackoverflow.com/questions/14391959/heatmap-in-matplotlib-with-pcolor\n",
"#https://plot.ly/python/heatmaps/\n",
"\n",
"fig, ax = plt.subplots()\n",
"heatmap = ax.pcolor(pt2, cmap=plt.cm.Greens, alpha=0.89)\n",
"\n",
"# Format\n",
"fig = plt.gcf()\n",
"fig.set_size_inches(15,5)\n",
"\n",
"# turn off the frame\n",
"ax.set_frame_on(False)\n",
"\n",
"# put the major ticks at the middle of each cell\n",
"ax.set_yticks(np.arange(pt2.shape[0]) + 0.5, minor=False)\n",
"ax.set_xticks(np.arange(pt2.shape[1]) + 0.5, minor=False)\n",
"\n",
"# want a more natural, table-like display\n",
"ax.invert_yaxis()\n",
"ax.xaxis.tick_top()\n",
"\n",
"# Set the labels\n",
"ax.set_xticklabels(pt2.columns, minor=False)\n",
"ax.set_yticklabels(pt2.index, minor=False)\n",
"\n",
"# rotate the x labels\n",
"plt.xticks(rotation=90)\n",
"\n",
"ax.grid(False)\n",
"\n",
"# Turn off all the ticks\n",
"ax = plt.gca()\n",
"\n",
"for t in ax.xaxis.get_major_ticks():\n",
" t.tick1On = False\n",
" t.tick2On = False\n",
"for t in ax.yaxis.get_major_ticks():\n",
" t.tick1On = False\n",
" t.tick2On = False\n",
" \n",
"# name the axes and plot\n",
"ax.set_xlabel('Platform')\n",
"ax.set_ylabel('Version') \n",
"ax.xaxis.set_label_position('top')\n",
"plt.title('Heatmap of Version vs Platform having positive feedback',y=-0.08)\n",
"\n",
"handles, labels = ax.get_legend_handles_labels()\n",
"#lgd = ax.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5,-0.1))\n",
"#fig.savefig('heatmap.png', bbox_extra_artists=(lgd,), bbox_inches='tight')\n",
"fig.savefig('fig6.png', bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We notice a similar trend in this heatmap as well. But it should be noted that positive count is much lesser than the negative one. A heatmap is always relative to the data that is used for plotting it.\n",
"\n",
"<br/><br/>Finally we need to delete the dummy column that we had created."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" <th>date</th>\n",
" <th>version</th>\n",
" <th>platform</th>\n",
" <th>locale</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>41.0</td>\n",
" <td>Linux</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>41.0</td>\n",
" <td>Windows XP</td>\n",
" <td>Vietnamese</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Happy</td>\n",
" <td>18</td>\n",
" <td>41.0.2</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>37.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sad</td>\n",
" <td>18</td>\n",
" <td>38.3.0</td>\n",
" <td>Windows 7</td>\n",
" <td>English (US)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment date version platform locale\n",
"0 Sad 18 41.0 Linux English (US)\n",
"1 Sad 18 41.0 Windows XP Vietnamese\n",
"2 Happy 18 41.0.2 Windows 7 English (US)\n",
"3 Sad 18 37.0 Windows 7 English (US)\n",
"4 Sad 18 38.3.0 Windows 7 English (US)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#deleting the dummy column\n",
"\n",
"data.drop('dummy', axis=1, inplace=True)\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"## Final Thoughts\n",
" In this analysis, a Mozilla Firefox feedback data was analyzed and certain insights were drawn into user behaviour and version/platform dependency. \n",
" \n",
"#### Further Analysis:\n",
"1. I hope to scrape a larger amount of data (3 months' worth) and run the analysis again.<br/>\n",
"2. It might help to explore some group properties<br/>\n",
"3. An extensive time-series analysis can be performed for data over a longer period of time to determine whether issues have been resolved or new ones have cropped up after a version update<br/>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment