{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "UglXS4h7VrQZ", "jp-MarkdownHeadingCollapsed": true, "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "smMY1r5EVrQh" }, "source": [ "# Problem Statement\n", "\n", "A large child education toy company which sells edutainment tablets and gaming systems\n", "both online and in retail stores wanted to analyze the customer data. They are operating\n", "from last few years and maintaining all transactional information data. The given data\n", "‘CustomerData.csv’ is a sample of customer level data extracted and processed for the\n", "analysis from various set of transactional files.\n", "\n", "The objectives of today’s activity are :\n", "* Building a regression model to predict the customer revenue based on other factors and understand the influence of other attributes on revenue" ] }, { "cell_type": "markdown", "metadata": { "id": "20Wm6u9QVrQj" }, "source": [ "## Identify right Error Metrics" ] }, { "cell_type": "markdown", "metadata": { "id": "U0sgJPBbVrQk" }, "source": [ "##### Error Metrics for Regression\n", "\n", "* Mean Absolute Error (MAE):\n", "\n", "$$MAE = \\dfrac{1}{n}\\times\\sum_{i = 1}^{n}|y_{i} - \\hat{y_{i}}|$$\n", "\n", "\n", "* Mean Squared Error (MSE):\n", "\n", "$$MSE = \\dfrac{1}{n}\\times\\sum_{i = 1}^{n}(y_{i} - \\hat{y_{i}})^2$$\n", "\n", "\n", "* Root Mean Squared Error (RMSE):\n", "\n", "$$RMSE = \\sqrt{\\dfrac{1}{n}\\times\\sum_{i = 1}^{n}(y_{i} - \\hat{y_{i}})^2}$$\n", "\n", "\n", "* Mean Absolute Percentage Error (MAPE):\n", "\n", "$$MAPE = \\dfrac{100}{n}\\times\\dfrac{\\sum_{i = 1}^{n}\\mid y_{i} - \\hat{y_{i}}\\mid}{y_{i}}$$" ] }, { "cell_type": "markdown", "metadata": { "id": "LKj920TBVrQm" }, "source": [ "# Loading the required libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "JjHJJU97VrQm" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "from sklearn.model_selection import train_test_split, GridSearchCV\n", "\n", "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n", "from sklearn.tree import DecisionTreeRegressor, export_graphviz\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "import graphviz\n", "import math" ] }, { "cell_type": "markdown", "metadata": { "id": "2IOWi07-VrQo" }, "source": [ "# Loading the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "AO1RtAIsVrQp" }, "outputs": [], "source": [ "data = pd.read_csv(\"CustomerData.csv\", header=0)" ] }, { "cell_type": "markdown", "metadata": { "id": "HXDfG9wwVrQq" }, "source": [ "# Understand the Data - Exploratory Data Analysis (EDA)" ] }, { "cell_type": "markdown", "metadata": { "id": "PJeD8w63VrQq" }, "source": [ "## Number of rows and columns" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2uh9DCqpVrQr", "outputId": "75eaf8bb-ae1a-4af1-9f3e-e2692f9e182e" }, "outputs": [ { "data": { "text/plain": [ "(3209, 14)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "-n5jWSNrVrQs" }, "source": [ "## Display the columns" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "wpIkB45xVrQs", "outputId": "b601d47b-6cdd-4213-f083-1043d0cb4fc5", "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Index(['CustomerID', 'City', 'NoOfChildren', 'MinAgeOfChild', 'MaxAgeOfChild',\n", " 'Tenure', 'FrquncyOfPurchase', 'NoOfUnitsPurchased', 'FrequencyOFPlay',\n", " 'NoOfGamesPlayed', 'NoOfGamesBought', 'FavoriteChannelOfTransaction',\n", " 'FavoriteGame', 'TotalRevenueGenerated'],\n", " dtype='object')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.columns" ] }, { "cell_type": "markdown", "metadata": { "id": "DDFmzBtIVrQt" }, "source": [ "## Display first five records" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "Zu6BOZHEVrQt", "outputId": "3297720a-0119-440a-e7c6-b1b8f0400d27" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CustomerIDCityNoOfChildrenMinAgeOfChildMaxAgeOfChildTenureFrquncyOfPurchaseNoOfUnitsPurchasedFrequencyOFPlayNoOfGamesPlayedNoOfGamesBoughtFavoriteChannelOfTransactionFavoriteGameTotalRevenueGenerated
0100112382101111234410810UniformUniform107.51
1100212364422020245227FavoriteUniform382.40
2100314354241818105913018FavoriteUniform135.01
3100411662611193653411FavoriteUniform125.00
4100513694224431106610244UniformUniform335.05
\n", "
" ], "text/plain": [ " CustomerID City NoOfChildren MinAgeOfChild MaxAgeOfChild Tenure \\\n", "0 1001 1 2 3 8 210 \n", "1 1002 1 2 3 6 442 \n", "2 1003 1 4 3 5 424 \n", "3 1004 1 1 6 6 261 \n", "4 1005 1 3 6 9 422 \n", "\n", " FrquncyOfPurchase NoOfUnitsPurchased FrequencyOFPlay NoOfGamesPlayed \\\n", "0 11 11 2344 108 \n", "1 20 20 245 22 \n", "2 18 18 1059 130 \n", "3 11 9 365 34 \n", "4 44 31 1066 102 \n", "\n", " NoOfGamesBought FavoriteChannelOfTransaction FavoriteGame \\\n", "0 10 Uniform Uniform \n", "1 7 Favorite Uniform \n", "2 18 Favorite Uniform \n", "3 11 Favorite Uniform \n", "4 44 Uniform Uniform \n", "\n", " TotalRevenueGenerated \n", "0 107.51 \n", "1 382.40 \n", "2 135.01 \n", "3 125.00 \n", "4 335.05 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "J7Tu9iM6VrQu" }, "source": [ "## Summary Stats" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "l41d_iVcVrQu", "outputId": "07a356da-8b99-46f0-ab67-a3a5fb71da79", "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CustomerIDCityNoOfChildrenMinAgeOfChildMaxAgeOfChildTenureFrquncyOfPurchaseNoOfUnitsPurchasedFrequencyOFPlayNoOfGamesPlayedNoOfGamesBoughtFavoriteChannelOfTransactionFavoriteGameTotalRevenueGenerated
count3209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.000000320932093209.000000
uniqueNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN22NaN
topNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNFavoriteUniformNaN
freqNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN26373083NaN
mean2605.0000001.1140542.1283894.9607357.990651347.52041116.26955414.6840141568.20785393.62792114.761608NaNNaN168.477183
std926.5028330.3179271.0350923.7141918.78408490.5201188.4416707.1820291810.63046488.9363728.773910NaNNaN81.798528
min1001.0000001.0000001.0000000.0000003.000000100.0000001.0000001.0000000.0000000.0000000.000000NaNNaN100.000000
25%1803.0000001.0000001.0000004.0000006.000000301.00000011.00000010.000000446.00000037.00000010.000000NaNNaN116.640000
50%2605.0000001.0000002.0000005.0000007.000000368.00000014.00000013.0000001029.00000070.00000014.000000NaNNaN142.390000
75%3407.0000001.0000003.0000006.0000008.000000417.00000019.00000017.0000002029.000000119.00000019.000000NaNNaN191.250000
max4209.0000002.00000011.000000113.000000113.000000472.000000119.000000112.00000027829.0000001166.000000115.000000NaNNaN990.560000
\n", "
" ], "text/plain": [ " CustomerID City NoOfChildren MinAgeOfChild MaxAgeOfChild \\\n", "count 3209.000000 3209.000000 3209.000000 3209.000000 3209.000000 \n", "unique NaN NaN NaN NaN NaN \n", "top NaN NaN NaN NaN NaN \n", "freq NaN NaN NaN NaN NaN \n", "mean 2605.000000 1.114054 2.128389 4.960735 7.990651 \n", "std 926.502833 0.317927 1.035092 3.714191 8.784084 \n", "min 1001.000000 1.000000 1.000000 0.000000 3.000000 \n", "25% 1803.000000 1.000000 1.000000 4.000000 6.000000 \n", "50% 2605.000000 1.000000 2.000000 5.000000 7.000000 \n", "75% 3407.000000 1.000000 3.000000 6.000000 8.000000 \n", "max 4209.000000 2.000000 11.000000 113.000000 113.000000 \n", "\n", " Tenure FrquncyOfPurchase NoOfUnitsPurchased FrequencyOFPlay \\\n", "count 3209.000000 3209.000000 3209.000000 3209.000000 \n", "unique NaN NaN NaN NaN \n", "top NaN NaN NaN NaN \n", "freq NaN NaN NaN NaN \n", "mean 347.520411 16.269554 14.684014 1568.207853 \n", "std 90.520118 8.441670 7.182029 1810.630464 \n", "min 100.000000 1.000000 1.000000 0.000000 \n", "25% 301.000000 11.000000 10.000000 446.000000 \n", "50% 368.000000 14.000000 13.000000 1029.000000 \n", "75% 417.000000 19.000000 17.000000 2029.000000 \n", "max 472.000000 119.000000 112.000000 27829.000000 \n", "\n", " NoOfGamesPlayed NoOfGamesBought FavoriteChannelOfTransaction \\\n", "count 3209.000000 3209.000000 3209 \n", "unique NaN NaN 2 \n", "top NaN NaN Favorite \n", "freq NaN NaN 2637 \n", "mean 93.627921 14.761608 NaN \n", "std 88.936372 8.773910 NaN \n", "min 0.000000 0.000000 NaN \n", "25% 37.000000 10.000000 NaN \n", "50% 70.000000 14.000000 NaN \n", "75% 119.000000 19.000000 NaN \n", "max 1166.000000 115.000000 NaN \n", "\n", " FavoriteGame TotalRevenueGenerated \n", "count 3209 3209.000000 \n", "unique 2 NaN \n", "top Uniform NaN \n", "freq 3083 NaN \n", "mean NaN 168.477183 \n", "std NaN 81.798528 \n", "min NaN 100.000000 \n", "25% NaN 116.640000 \n", "50% NaN 142.390000 \n", "75% NaN 191.250000 \n", "max NaN 990.560000 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe(include='all')" ] }, { "cell_type": "markdown", "metadata": { "id": "tRShOT6RVrQv" }, "source": [ "### Observations:\n", " 1. City is interpreted as numeric (which is actually categorical)\n", " 2. max age of children is 113 which must be a wrong entry\n", " 3. Summary statistics for CustomerID is not meaningful" ] }, { "cell_type": "markdown", "metadata": { "id": "7M9ZZubUVrQv" }, "source": [ "# Data Maipulation & Feature Engineering" ] }, { "cell_type": "markdown", "metadata": { "id": "6s4fOSzsVrQv" }, "source": [ "## Not useful attributes" ] }, { "cell_type": "markdown", "metadata": { "id": "Rgy0iyIMVrQw" }, "source": [ "Exclude customer id from the data for analysis" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "aomNPnQ7VrQw", "outputId": "540b5e67-bc12-4e3f-e07e-1c19701da7fa" }, "outputs": [ { "data": { "text/plain": [ "3209" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.size(np.unique(data.CustomerID, return_counts=True)[0])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "_RfMn6UMVrQx" }, "outputs": [], "source": [ "#drop CustomerID\n", "data = data.drop('CustomerID', axis=1)" ] }, { "cell_type": "markdown", "metadata": { "id": "MZDB_h8yVrQx" }, "source": [ "## Display the data type of attributes" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "zcULsP-KVrQy", "outputId": "3524cf31-5f1c-49ac-94f9-215d5ccfe46d" }, "outputs": [ { "data": { "text/plain": [ "City int64\n", "NoOfChildren int64\n", "MinAgeOfChild int64\n", "MaxAgeOfChild int64\n", "Tenure int64\n", "FrquncyOfPurchase int64\n", "NoOfUnitsPurchased int64\n", "FrequencyOFPlay int64\n", "NoOfGamesPlayed int64\n", "NoOfGamesBought int64\n", "FavoriteChannelOfTransaction object\n", "FavoriteGame object\n", "TotalRevenueGenerated float64\n", "dtype: object" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtypes" ] }, { "cell_type": "markdown", "metadata": { "id": "vrnXsWDGVrQy" }, "source": [ "__Observation__:\n", "\n", "`FavouriteGame` and `FavouriteChannelOfTransaction` are interpreted as objects." ] }, { "cell_type": "markdown", "metadata": { "id": "TZYWATmdVrQz" }, "source": [ "### Data type conversion *\n", " Using astype('category') convert 'City', 'FavoriteChannelOfTransaction', 'FavoriteGame' attributes to a categorical data type ." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "7mAVuaY8VrQz" }, "outputs": [], "source": [ "data['City'] = data['City'].astype('category')\n", "data['FavoriteChannelOfTransaction'] = data['FavoriteChannelOfTransaction'].astype('category')\n", "data['FavoriteGame'] = data['FavoriteGame'].astype('category')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "gTsTkpcwVrQ0", "outputId": "3426cd39-d958-4575-a62b-6ac921e64a01" }, "outputs": [ { "data": { "text/plain": [ "City category\n", "NoOfChildren int64\n", "MinAgeOfChild int64\n", "MaxAgeOfChild int64\n", "Tenure int64\n", "FrquncyOfPurchase int64\n", "NoOfUnitsPurchased int64\n", "FrequencyOFPlay int64\n", "NoOfGamesPlayed int64\n", "NoOfGamesBought int64\n", "FavoriteChannelOfTransaction category\n", "FavoriteGame category\n", "TotalRevenueGenerated float64\n", "dtype: object" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtypes" ] }, { "cell_type": "markdown", "metadata": { "id": "qHWkLqYeVrQ0" }, "source": [ "## Handling Outliers" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "id": "_yuHTqZgVrQ0", "outputId": "3bdf648e-6c80-47c8-bfce-ae76c1b68bed" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityNoOfChildrenMinAgeOfChildMaxAgeOfChildTenureFrquncyOfPurchaseNoOfUnitsPurchasedFrequencyOFPlayNoOfGamesPlayedNoOfGamesBoughtFavoriteChannelOfTransactionFavoriteGameTotalRevenueGenerated
count3209.03209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.0000003209.000000320932093209.000000
unique2.0NaNNaNNaNNaNNaNNaNNaNNaNNaN22NaN
top1.0NaNNaNNaNNaNNaNNaNNaNNaNNaNFavoriteUniformNaN
freq2843.0NaNNaNNaNNaNNaNNaNNaNNaNNaN26373083NaN
meanNaN2.1283894.9607357.990651347.52041116.26955414.6840141568.20785393.62792114.761608NaNNaN168.477183
stdNaN1.0350923.7141918.78408490.5201188.4416707.1820291810.63046488.9363728.773910NaNNaN81.798528
minNaN1.0000000.0000003.000000100.0000001.0000001.0000000.0000000.0000000.000000NaNNaN100.000000
25%NaN1.0000004.0000006.000000301.00000011.00000010.000000446.00000037.00000010.000000NaNNaN116.640000
50%NaN2.0000005.0000007.000000368.00000014.00000013.0000001029.00000070.00000014.000000NaNNaN142.390000
75%NaN3.0000006.0000008.000000417.00000019.00000017.0000002029.000000119.00000019.000000NaNNaN191.250000
maxNaN11.000000113.000000113.000000472.000000119.000000112.00000027829.0000001166.000000115.000000NaNNaN990.560000
\n", "
" ], "text/plain": [ " City NoOfChildren MinAgeOfChild MaxAgeOfChild Tenure \\\n", "count 3209.0 3209.000000 3209.000000 3209.000000 3209.000000 \n", "unique 2.0 NaN NaN NaN NaN \n", "top 1.0 NaN NaN NaN NaN \n", "freq 2843.0 NaN NaN NaN NaN \n", "mean NaN 2.128389 4.960735 7.990651 347.520411 \n", "std NaN 1.035092 3.714191 8.784084 90.520118 \n", "min NaN 1.000000 0.000000 3.000000 100.000000 \n", "25% NaN 1.000000 4.000000 6.000000 301.000000 \n", "50% NaN 2.000000 5.000000 7.000000 368.000000 \n", "75% NaN 3.000000 6.000000 8.000000 417.000000 \n", "max NaN 11.000000 113.000000 113.000000 472.000000 \n", "\n", " FrquncyOfPurchase NoOfUnitsPurchased FrequencyOFPlay \\\n", "count 3209.000000 3209.000000 3209.000000 \n", "unique NaN NaN NaN \n", "top NaN NaN NaN \n", "freq NaN NaN NaN \n", "mean 16.269554 14.684014 1568.207853 \n", "std 8.441670 7.182029 1810.630464 \n", "min 1.000000 1.000000 0.000000 \n", "25% 11.000000 10.000000 446.000000 \n", "50% 14.000000 13.000000 1029.000000 \n", "75% 19.000000 17.000000 2029.000000 \n", "max 119.000000 112.000000 27829.000000 \n", "\n", " NoOfGamesPlayed NoOfGamesBought FavoriteChannelOfTransaction \\\n", "count 3209.000000 3209.000000 3209 \n", "unique NaN NaN 2 \n", "top NaN NaN Favorite \n", "freq NaN NaN 2637 \n", "mean 93.627921 14.761608 NaN \n", "std 88.936372 8.773910 NaN \n", "min 0.000000 0.000000 NaN \n", "25% 37.000000 10.000000 NaN \n", "50% 70.000000 14.000000 NaN \n", "75% 119.000000 19.000000 NaN \n", "max 1166.000000 115.000000 NaN \n", "\n", " FavoriteGame TotalRevenueGenerated \n", "count 3209 3209.000000 \n", "unique 2 NaN \n", "top Uniform NaN \n", "freq 3083 NaN \n", "mean NaN 168.477183 \n", "std NaN 81.798528 \n", "min NaN 100.000000 \n", "25% NaN 116.640000 \n", "50% NaN 142.390000 \n", "75% NaN 191.250000 \n", "max NaN 990.560000 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe(include='all')" ] }, { "cell_type": "markdown", "metadata": { "id": "I5vFimnLVrQ1" }, "source": [ "Observe how many records have values 113 for age of children" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "Tu5zJxYTVrQ1" }, "outputs": [ { "data": { "text/plain": [ "(20, 13)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[(data['MinAgeOfChild'] == 113) | (data['MaxAgeOfChild'] == 113)].shape" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "fQUQ8VQEVrQ1", "outputId": "517801d6-ebb5-41ab-9072-ce306dbdc989" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3209, 13)\n" ] } ], "source": [ "print (data.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "N076K_D-VrQ2" }, "source": [ "### Removing outliers" ] }, { "cell_type": "markdown", "metadata": { "id": "sTjV-vsuVrQ2" }, "source": [ "Lets ignore these 20 records for the analysis" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "dq2pPserVrQ2" }, "outputs": [], "source": [ "data = data[(data['MinAgeOfChild'] != 113) & (data['MaxAgeOfChild'] != 113)]" ] }, { "cell_type": "markdown", "metadata": { "id": "pUCWyXi2VrQ3" }, "source": [ "Observe that the number of rows in data is less than those in original data" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "id": "-yQbd6FYVrQ3", "outputId": "fed19f26-9584-4b8b-b7d9-f2c8cb4f7693" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3189, 13)\n" ] } ], "source": [ "print (data.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "wj7tdlIpVrQ8" }, "source": [ "## Missing Data\n", "\n", "pandas primarily uses the value np.nan to represent missing data." ] }, { "cell_type": "markdown", "metadata": { "id": "Klu2Fm39VrQ9" }, "source": [ "Check for missing value\n", "\n", " is.null() output boolean i.e. if missing value then true else false.\n", "\n", " sum function counts 'true' thus gives total number of missing values" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "id": "6jSq5iqSVrQ9", "outputId": "a2c3cc98-4142-49ed-f145-5a41b55d6d29" }, "outputs": [ { "data": { "text/plain": [ "City 0\n", "NoOfChildren 0\n", "MinAgeOfChild 0\n", "MaxAgeOfChild 0\n", "Tenure 0\n", "FrquncyOfPurchase 0\n", "NoOfUnitsPurchased 0\n", "FrequencyOFPlay 0\n", "NoOfGamesPlayed 0\n", "NoOfGamesBought 0\n", "FavoriteChannelOfTransaction 0\n", "FavoriteGame 0\n", "TotalRevenueGenerated 0\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.isnull().sum()" ] }, { "cell_type": "markdown", "metadata": { "id": "ELV8cVPmVrQ9" }, "source": [ "In this case there are no missing values. However if we find any missing values in the data, as a rule of thumb\n", "\n", "\n", " If the perticular row/column has more number of missing values then drop that perticular rows/column\n", " \n", " e.g. To drop any rows that have missing data use data.dropna(axis=0, inplace=True)\n", " \n", " Otherwise, impute/fill missing data based on domain knowledge or using imputation techniques\n", " \n", " e.g. To fill missing values with mean use data.fillna(data.mean(), inplace=True) " ] }, { "cell_type": "markdown", "metadata": { "id": "2hbtlQ_vVrQ9" }, "source": [ "## Encoding Categorical to Numeric - Dummification\n", "\n", "* For some of the models all the independent attribute should be of type numeric. \n", "* For all models sklearn expects only numeric attributes .\n", "* But this data set has some categorial attributes.\n", "* `pandas.get_dummies` To convert convert categorical variable into dummy/indicator variables" ] }, { "cell_type": "markdown", "metadata": { "id": "Nts26kNeVrQ-" }, "source": [ "### Data types" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "id": "fb4RMPdtVrQ-", "outputId": "8c5154ba-a547-466f-8688-d84be0fb814f", "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "City category\n", "NoOfChildren int64\n", "MinAgeOfChild int64\n", "MaxAgeOfChild int64\n", "Tenure int64\n", "FrquncyOfPurchase int64\n", "NoOfUnitsPurchased int64\n", "FrequencyOFPlay int64\n", "NoOfGamesPlayed int64\n", "NoOfGamesBought int64\n", "FavoriteChannelOfTransaction category\n", "FavoriteGame category\n", "TotalRevenueGenerated float64\n", "dtype: object" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtypes" ] }, { "cell_type": "markdown", "metadata": { "id": "_eYyw0YcVrQ-" }, "source": [ "### Creating dummy variables.\n", " \n", " If we have k levels in a category, then we create k-1 dummy variables as the last one would be redundant. So we use the parameter drop_first in pd.get_dummies function that drops the first level in each of the category" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "sfrGt1yxVrQ-" }, "outputs": [], "source": [ "#include categorical columns" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "id": "ofbVIJ8SVrQ-" }, "outputs": [], "source": [ "#drop the first level of each category\n", "data = pd.get_dummies(data, drop_first=True, dtype=int)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "id": "7iSFlAUIVrQ_", "outputId": "a32b4d59-b8b3-40a6-8b65-5a79044c33aa" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['NoOfChildren', 'MinAgeOfChild', 'MaxAgeOfChild', 'Tenure',\n", " 'FrquncyOfPurchase', 'NoOfUnitsPurchased', 'FrequencyOFPlay',\n", " 'NoOfGamesPlayed', 'NoOfGamesBought', 'TotalRevenueGenerated', 'City_2',\n", " 'FavoriteChannelOfTransaction_Uniform', 'FavoriteGame_Uniform'],\n", " dtype='object')\n" ] } ], "source": [ "print (data.columns)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "id": "UW388Yp2VrQ_", "outputId": "f4e730d4-24c4-47d2-dfe5-1d2800526470" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NoOfChildrenMinAgeOfChildMaxAgeOfChildTenureFrquncyOfPurchaseNoOfUnitsPurchasedFrequencyOFPlayNoOfGamesPlayedNoOfGamesBoughtTotalRevenueGeneratedCity_2FavoriteChannelOfTransaction_UniformFavoriteGame_Uniform
02382101111234410810107.51011
12364422020245227382.40001
24354241818105913018135.01001
31662611193653411125.00001
43694224431106610244335.05011
\n", "
" ], "text/plain": [ " NoOfChildren MinAgeOfChild MaxAgeOfChild Tenure FrquncyOfPurchase \\\n", "0 2 3 8 210 11 \n", "1 2 3 6 442 20 \n", "2 4 3 5 424 18 \n", "3 1 6 6 261 11 \n", "4 3 6 9 422 44 \n", "\n", " NoOfUnitsPurchased FrequencyOFPlay NoOfGamesPlayed NoOfGamesBought \\\n", "0 11 2344 108 10 \n", "1 20 245 22 7 \n", "2 18 1059 130 18 \n", "3 9 365 34 11 \n", "4 31 1066 102 44 \n", "\n", " TotalRevenueGenerated City_2 FavoriteChannelOfTransaction_Uniform \\\n", "0 107.51 0 1 \n", "1 382.40 0 0 \n", "2 135.01 0 0 \n", "3 125.00 0 0 \n", "4 335.05 0 1 \n", "\n", " FavoriteGame_Uniform \n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "4 1 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "o9SLbMjmVrQ_" }, "source": [ "## Split the data into train and test:\n", "\n", "sklearn.model_selection.train_test_split\n", " \n", " Split arrays or matrices into random train and test subsets" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "id": "rGdTmMR6VrQ_" }, "outputs": [], "source": [ "#split into train and test at 70-30\n", "X = data.drop(['TotalRevenueGenerated'], axis = 1)\n", "y = data['TotalRevenueGenerated']\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 123)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "id": "HBwd-ti6VrRA", "outputId": "57b6193b-7223-47a2-c16b-63c2daafe327" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] } ], "source": [ "print (type(X_train))\n", "print (type(y_train))" ] }, { "cell_type": "markdown", "metadata": { "id": "xIM_5TSIVrRA" }, "source": [ "# Modelling" ] }, { "cell_type": "markdown", "metadata": { "id": "1hcCNuHBVrRA" }, "source": [ "## Building a Decision Tree Model" ] }, { "cell_type": "markdown", "metadata": { "id": "vsYa3TDpVrRB" }, "source": [ "### Instantiate DecisionTreeRegressor" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "id": "rfa6lbRKVrRB" }, "outputs": [], "source": [ "clf = DecisionTreeRegressor()" ] }, { "cell_type": "markdown", "metadata": { "id": "IQ44NjX2VrRB" }, "source": [ "### Train the model" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "id": "lESaP-xRVrRB" }, "outputs": [], "source": [ "clf = clf.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": { "id": "H8xid-dvVrRC" }, "source": [ "### Feature Importances" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "id": "WhrO7m6rVrRC", "outputId": "fb222b37-2745-4707-8052-2dec74383fab" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234567891011
0NoOfUnitsPurchasedNoOfGamesBoughtFrquncyOfPurchaseFrequencyOFPlayTenureNoOfGamesPlayedMinAgeOfChildMaxAgeOfChildNoOfChildrenCity_2TotalRevenueGeneratedFavoriteChannelOfTransaction_Uniform
10.6243440.1135010.0556890.0508990.0463950.0433360.0257420.0189570.0108670.0064270.0030840.000761
\n", "
" ], "text/plain": [ " 0 1 2 3 \\\n", "0 NoOfUnitsPurchased NoOfGamesBought FrquncyOfPurchase FrequencyOFPlay \n", "1 0.624344 0.113501 0.055689 0.050899 \n", "\n", " 4 5 6 7 8 \\\n", "0 Tenure NoOfGamesPlayed MinAgeOfChild MaxAgeOfChild NoOfChildren \n", "1 0.046395 0.043336 0.025742 0.018957 0.010867 \n", "\n", " 9 10 11 \n", "0 City_2 TotalRevenueGenerated FavoriteChannelOfTransaction_Uniform \n", "1 0.006427 0.003084 0.000761 " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "features = data.columns\n", "importances = clf.feature_importances_\n", "\n", "indices = np.argsort(importances)[::-1]\n", "pd.DataFrame([data.columns[indices],np.sort(importances)[::-1]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "bnYriU3TVrRC", "outputId": "6f3447fb-2f93-43c6-e6b7-218d72477fca" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "#plot bar graph for feature importances vs relative importances" ] }, { "cell_type": "markdown", "metadata": { "id": "koE8aTTrVrRD" }, "source": [ "### Predict" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "id": "KZbo8pSrVrRD" }, "outputs": [], "source": [ "train_pred = clf.predict(X_train)\n", "test_pred = clf.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "id": "oGxksQrGVrRD", "outputId": "7e4d98c8-23df-4592-eb1a-6ce769a5d605" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[229.56 140. 399.85 125. 102.5 ]\n", "[147.52 152.5 130. 142. 197.47]\n" ] } ], "source": [ "print(train_pred[:5])\n", "print(test_pred[:5])" ] }, { "cell_type": "markdown", "metadata": { "id": "Kdt9bzMEVrRD" }, "source": [ "### Evaluation" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "Dvc8H_AhVrRD" }, "outputs": [], "source": [ "\n", "#create a mean_absolute_percentage_error and print The Mean Absolute Error on train and test dataset and\n", "#print The Mean Absolute Percentage Error on train and test dataset\n" ] }, { "cell_type": "markdown", "metadata": { "id": "Ht4gB_IqVrRE" }, "source": [ "## Building Decision Tree Model using attributes Importance" ] }, { "cell_type": "markdown", "metadata": { "id": "fyqYEyovVrRE" }, "source": [ "### Select important attributes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0ebH2jx9VrRE", "scrolled": true }, "outputs": [], "source": [ "select = indices[0:3].tolist()" ] }, { "cell_type": "markdown", "metadata": { "id": "u47JC4B1VrRF" }, "source": [ "### Instantiate DecisionTreeRegressor" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "M4KAHl4xVrRF" }, "outputs": [], "source": [ "clf = DecisionTreeRegressor()" ] }, { "cell_type": "markdown", "metadata": { "id": "0ob7_RfNVrRF" }, "source": [ "### Train the model" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OJ3xvk8YVrRF" }, "outputs": [], "source": [ "clf = clf.fit(X_train[:,select], y_train)" ] }, { "cell_type": "markdown", "metadata": { "id": "FO_SnBGBVrRG" }, "source": [ "### Predict" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yMZOLu7qVrRG" }, "outputs": [], "source": [ "train_pred = clf.predict(X_train[:,select])\n", "test_pred = clf.predict(X_test[:,select])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "QVaJU0_bVrRG", "outputId": "eb3413fa-b63e-4ea1-f07f-4c2527f80eb6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[229.56 114.375 399.85 122.6355 120.35714286]\n", "[105. 147.504 114.4 148.14709677 182.59125 ]\n" ] } ], "source": [ "print(train_pred[:5])\n", "print(test_pred[:5])" ] }, { "cell_type": "markdown", "metadata": { "id": "fCU4CfbTVrRG" }, "source": [ "### Evaluation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "FbfgfeQ4VrRH" }, "outputs": [], "source": [ "\n", "#create a mean_absolute_percentage_error and print The Mean Absolute Error on train and test dataset and\n", "#print The Mean Absolute Percentage Error on train and test dataset\n" ] }, { "cell_type": "markdown", "metadata": { "id": "fub-vH2yVrRH" }, "source": [ "## Grid Search for Hyper-parameter tuning" ] }, { "cell_type": "markdown", "metadata": { "id": "6SHJh6jWVrRH" }, "source": [ "### Hyper-parameter" ] }, { "cell_type": "markdown", "metadata": { "id": "jEZ81MzaVrRH" }, "source": [ "max_depth : int or None, optional (default=None)\n", "\n", " The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "WTJGLS4gVrRH" }, "outputs": [], "source": [ "#define max depth" ] }, { "cell_type": "markdown", "metadata": { "id": "iRfv7NrXVrRI" }, "source": [ "### Instantiate DecisionTreeRegressor" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "H8M1huo7VrRI" }, "outputs": [], "source": [ "#call the regressor" ] }, { "cell_type": "markdown", "metadata": { "id": "D4vcf1X3VrRI" }, "source": [ "### GridSearchCV" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ucvulx79VrRI" }, "outputs": [], "source": [ "#apply gridsearchcv" ] }, { "cell_type": "markdown", "metadata": { "id": "gLwUbj1tVrRJ" }, "source": [ "### Train" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "hIQwvWosVrRJ" }, "outputs": [], "source": [ "#train the model" ] }, { "cell_type": "markdown", "metadata": { "id": "MXPLzsInVrRJ" }, "source": [ "### Best params" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yIc3288zVrRN", "outputId": "aaf06082-3adb-4950-9ab0-408e0555f803" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'max_depth': 4}\n", "DecisionTreeRegressor(max_depth=4)\n" ] } ], "source": [ "#find max depth" ] }, { "cell_type": "markdown", "metadata": { "id": "ERiBe-dQVrRN" }, "source": [ "### Predict" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2hX8wKGeVrRO" }, "outputs": [], "source": [ "#perform prediction" ] }, { "cell_type": "markdown", "metadata": { "id": "PaYztIwYVrRO" }, "source": [ "### Evaluations" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "rp_Rv-CxVrRO" }, "outputs": [], "source": [ "\n", "#create a mean_absolute_percentage_error and print The Mean Absolute Error on train and test dataset and\n", "#print The Mean Absolute Percentage Error on train and test dataset\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YbXEmDpLVrRO" }, "source": [ "### Visualizing Decision Trees" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "hsUEIsPYVrRO" }, "outputs": [], "source": [ "#visulize the DT" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ThwgWyR6VrRP" }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "colab": { "provenance": [] }, "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.12.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }