Skip to content

Instantly share code, notes, and snippets.

@mleila
Created August 5, 2018 22:06
Show Gist options
  • Save mleila/5701935bf0851ed20ce053f051f52ab4 to your computer and use it in GitHub Desktop.
Save mleila/5701935bf0851ed20ce053f051f52ab4 to your computer and use it in GitHub Desktop.
Exploratory analysis for the Black Friday dataset
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploring Blackfriday Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook we will explore the blackfriday dataset to learn about the features we can use for predicting customer purchases. We start by importing two of the most popular data analysis and visualization libraries in Python: Pandas and Matplotlib. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Read Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we read the csv file as a Pnadas dataframe. The dataset is available on [Kaggle](https://www.kaggle.com/sdolezel/black-friday)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('BlackFriday.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset size and missing values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we take a quick glance at the data"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>User_ID</th>\n",
" <th>Product_ID</th>\n",
" <th>Gender</th>\n",
" <th>Age</th>\n",
" <th>Occupation</th>\n",
" <th>City_Category</th>\n",
" <th>Stay_In_Current_City_Years</th>\n",
" <th>Marital_Status</th>\n",
" <th>Product_Category_1</th>\n",
" <th>Product_Category_2</th>\n",
" <th>Product_Category_3</th>\n",
" <th>Purchase</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1000001</td>\n",
" <td>P00069042</td>\n",
" <td>F</td>\n",
" <td>0-17</td>\n",
" <td>10</td>\n",
" <td>A</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>8370</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1000001</td>\n",
" <td>P00248942</td>\n",
" <td>F</td>\n",
" <td>0-17</td>\n",
" <td>10</td>\n",
" <td>A</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>6.0</td>\n",
" <td>14.0</td>\n",
" <td>15200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1000001</td>\n",
" <td>P00087842</td>\n",
" <td>F</td>\n",
" <td>0-17</td>\n",
" <td>10</td>\n",
" <td>A</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>12</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1422</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" User_ID Product_ID Gender Age Occupation City_Category \\\n",
"0 1000001 P00069042 F 0-17 10 A \n",
"1 1000001 P00248942 F 0-17 10 A \n",
"2 1000001 P00087842 F 0-17 10 A \n",
"\n",
" Stay_In_Current_City_Years Marital_Status Product_Category_1 \\\n",
"0 2 0 3 \n",
"1 2 0 1 \n",
"2 2 0 12 \n",
"\n",
" Product_Category_2 Product_Category_3 Purchase \n",
"0 NaN NaN 8370 \n",
"1 6.0 14.0 15200 \n",
"2 NaN NaN 1422 "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first think to notice here is that there are some missing values. Let's find out which columns have missing values and how many of them are there. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"User_ID 0\n",
"Product_ID 0\n",
"Gender 0\n",
"Age 0\n",
"Occupation 0\n",
"City_Category 0\n",
"Stay_In_Current_City_Years 0\n",
"Marital_Status 0\n",
"Product_Category_1 0\n",
"Product_Category_2 166986\n",
"Product_Category_3 373299\n",
"Purchase 0\n"
]
}
],
"source": [
"for column_name in df.columns:\n",
" missing_value = df[column_name].isnull().sum()\n",
" print(column_name, missing_value)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Interseting! only two columns 'Product_Category_2' and 'Product_Category_3' have missing values. Let's see how the number of missing values relate to the total number of recrods."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total rows:537577\n",
"Prod2 Missing:31%\n",
"Prod3 Missing:69%\n"
]
}
],
"source": [
"total_rows = len(df)\n",
"percent_missing_prod2 = df['Product_Category_2'].isnull().sum()/total_rows\n",
"percent_missing_prod3 = df['Product_Category_3'].isnull().sum()/total_rows\n",
"\n",
"print('Total rows:{}\\nProd2 Missing:{:.0%}\\nProd3 Missing:{:.0%}'.format(total_rows, percent_missing_prod2, percent_missing_prod3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We really have a shortage of data in the Product Category 3 field, almost 70% of the data is not available. We will have to take this in consideration in our feature engineering phase. If we intend to keep these columns however, then we need to replace the missing values by something our deep nerual network can recognize. Since both columns represent categorical data, we can create a new category that represent missing values. \n",
"\n",
"As you can see these columns represent their categories using integer values. Let's examine how many categories are there "
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{nan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, nan}"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"unique_categories = []\n",
"for col_name in ['Product_Category_1', 'Product_Category_2', 'Product_Category_3']:\n",
" unique_categories += list(df[col_name].unique())\n",
"set(unique_categories)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks like the categories start at 1, so we can use 0 to represent missing information"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"df['Product_Category_2'].fillna(0, inplace=True)\n",
"df['Product_Category_3'].fillna(0, inplace=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data types and representations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just as we examined the Product Category columns and found out they are represented by integer values ranging from 1 to 18,we need to lern about the data types and distribution of the rest of the features. this will help us decide on how to condoe these features in the most meaningful way possible for our deep neural networks to learn from them. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pandas dataframes provide an easy to explore all the your data types"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"User_ID int64\n",
"Product_ID object\n",
"Gender object\n",
"Age object\n",
"Occupation int64\n",
"City_Category object\n",
"Stay_In_Current_City_Years object\n",
"Marital_Status int64\n",
"Product_Category_1 int64\n",
"Product_Category_2 float64\n",
"Product_Category_3 float64\n",
"Purchase int64\n",
"dtype: object"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where the object representation usually means the data is stored as a string."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### User_ID and Product_ID"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Both of the first two columns seem to have an obvious representation. They each refer to a parituclar entity (user or product) and therefore can be considered categorical. However, we need to know a bit more about their distribution to assess how many categories will have to deal with. "
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 5891 unique users and 3623 unique products\n"
]
}
],
"source": [
"unique_users = len(df.User_ID.unique())\n",
"unique_products = len(df.Product_ID.unique())\n",
"print('There are {} unique users and {} unique products'.format(unique_users, unique_products))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall that we have over half a million rows in this dataset, so on average, there are about 100 rows for each user and 160 rows for each product. This is great! It means that these columns are valuable. We have enough information in our dataset to learn about each indiviual user and product. However, these are A LOT of categories to represent naively using some one-hot vector. We might want to consider embedding these columns in a space with smaller dimensions. This will be a fertile area of experimentation when we start our feature engineering phase. So keep that in mind.\n",
"\n",
"One thing to note, hwoever, that USER_ID is represented as an integer, but this is not really a numerical feature. i.e. users with closer id numbers do not necessarily exhibit the same behavioural patterns. This column is categorical. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Gender, Age, Occupation, and City_Category"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These four features are relatively straigthforward. Age is represented as a string rather than an integer because it is provided for each customer as a range, rather than an exact age."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['F', 'M']\n",
"['0-17', '18-25', '26-35', '36-45', '46-50', '51-55', '55+']\n",
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]\n",
"['A', 'B', 'C']\n"
]
}
],
"source": [
"for col_name in ['Gender', 'Age', 'Occupation', 'City_Category']:\n",
" print(sorted(df[col_name].unique()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Each of these columns will be represented as a categorial feature column in our deep learning model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Stay_In_Current_City_Years"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Stay Stay_In_Current_City_Years column is a bit complicated. Unexpectedly, the feature is represented as a string rather than an integer. Let's see why"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['2', '4+', '3', '1', '0'], dtype=object)"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Stay_In_Current_City_Years'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, it makes sense! The representation is indeed an integer, but there is a category that lumps up all customers who have been living in the city for more than 4 years. This poses a challeneg with regards to how to represent this particular feature. \n",
"\n",
"On one hand, the natural inclination would be to represent it as a numerical column to capture the linear function (the longer customers have lived in the city, the more likely they exhibit some behaviour). To accomplish this effect, you will have to cast the 4+ data values as an integer (simply 4). We will however lose information and create some distortion. What if most customers in the 4+ category have lived in the city for 10+ years? Think about how the distribution of the actualy years spent in the city by the customers with \"4+ years\" category may influence your linearity assumptions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The other approach would be to deal with this column as a categorical column. Now, this is very feasible because the number of categories is small (5). However, we will lose this linear relationship in the process. We will have to think about it. Since I can't come up with a decision at this phase, I would leave the column representation as a string and move on. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Marital_Status"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This column is straightforward. A customer is either married or not. This is obviously categorical."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 1])"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Marital_Status'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One thing to note here is that the relationship between customers marital status and the purchases they make is not very obvious. It would be interesting to create new features by crossing this column with others like age or geneder and see if the model performs better. \n",
"\n",
"One reasoning behind this is to capture some relationship between a customer's marital status and age with the amount they purchase. In less formal terms, while a married customer might not necassarily purchase more than a single one, a married customer at a certain age group might exhibit a special pattern. For example, maybe married customer with ages ranging from 26 to 35 are more likely to have kids and thus they end up with larger purchases. There is no way to infer these complex relationships without emprirical experimentation, so prepare to get your hands dirty."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Distributions and visualization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, let's get a glimpse of how each feature column data is distributed. For columns with small number of unique categories, we will use a bar plot to visualize how many rows each cateogry has and for columns with larger number of categories we will use histograms"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"User_ID 5891\n",
"Product_ID 3623\n",
"Gender 2\n",
"Age 7\n",
"Occupation 21\n",
"City_Category 3\n",
"Stay_In_Current_City_Years 5\n",
"Marital_Status 2\n",
"Product_Category_1 18\n",
"Product_Category_2 18\n",
"Product_Category_3 16\n",
"Purchase 17959\n"
]
}
],
"source": [
"for col_name in df.columns:\n",
" print(col_name, len(df[col_name].unique()))"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x10af30b00>"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x1080 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=3, ncols=2, figsize=[15, 15])\n",
"\n",
"df['Gender'].value_counts().plot(kind='barh', ax=axes[0,0], title='Gender')\n",
"df['Age'].value_counts().plot(kind='barh', ax=axes[0,1], title='Age')\n",
"df['City_Category'].value_counts().plot(kind='barh', ax=axes[1,0], title='City_Category')\n",
"df['Marital_Status'].value_counts().plot(kind='barh', ax=axes[1,1], title='Marital_Status')\n",
"df['Occupation'].value_counts().plot(kind='barh', ax=axes[2,0], title='Occupation')\n",
"df['Stay_In_Current_City_Years'].value_counts().plot(kind='barh', ax=axes[2,1], title='Stay_In_Current_City_Years')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I can't see anything too alarming about how the data is dsitrubuted. We have much more data about male than female customers for some reason and some occupations are represented more than others. The most interesting observation here is the Stay_In_Current_City_Years distribution. The problematic 4+ category does not seem to represent a large fraction of customers, suggesting that even if the internal distribution the category (which we dont know about) might distort the category, it might be a good idea to turn represent the feature numerically. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Histograms"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11649d7b8>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x360 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=1, ncols=2, figsize=[15, 5])\n",
"\n",
"df['User_ID'].hist(ax=axes[0])\n",
"df['Product_ID'].apply(lambda x:int(x[1:])).hist(ax=axes[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Both User and Product IDs seem to be uniformly distributed which backs up the asusmption we made earlier about how we have enough data to learn about purchasing behaviour from unique user and product IDs. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Preprocessing "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, the following code carries out all necessary data type transoformations and splits the dataset to train/dev sets"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# clean\n",
"df.User_ID = df.User_ID.astype(str)\n",
"df.Product_Category_2.fillna(0, inplace=True)\n",
"df.Product_Category_3.fillna(0, inplace=True)\n",
"df.Product_Category_1 = df.Product_Category_1.astype(int)\n",
"df.Product_Category_2 = df.Product_Category_2.astype(int)\n",
"df.Product_Category_3 = df.Product_Category_3.astype(int)\n",
"# shuffle\n",
"df = df.sample(frac=1).reset_index(drop=True)\n",
"# split train/eval\n",
"size = len(df)\n",
"eval_idx = int(size * EVAL_TRAIN_RATIO)\n",
"# write to disk\n",
"df.iloc[eval_idx:].to_csv(TRAIN, index=False)\n",
"df.iloc[:eval_idx].to_csv(EVAL, index=False)\n",
"print(len(df.iloc[eval_idx:]), 'training records')\n",
"print(len(df.iloc[:eval_idx]), 'eval records')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "dl",
"language": "python",
"name": "dl"
},
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment