{"cells":[{"metadata":{},"cell_type":"markdown","source":"

MALL CUSTOMER SEGMENTATION

\n

AN EXPLORATORY DATA ANALYSIS

\n\n\"mall\" \n\nIt is the number one goal of a mall to attract and retain customers. To meet that goal it is helpful to have insight into customers and their spending habits to aid in the development of marketing strategies."},{"metadata":{},"cell_type":"markdown","source":"

Table of Contents

\n\n* I. LOAD LIBRARIES & PACKAGES\n\n* II. DATA OVERVIEW & INSIGHTS\n\n* III. FEATURE ENGINEERING\n \n* IV. EXPLORATORY DATA ANALYSIS\n * IVa. Univariate Exploration \n * IVb. Bivariate Exploration \n "},{"metadata":{},"cell_type":"markdown","source":"# I. LOAD PACKAGES & LIBRARIES"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\n!pip install seaborn==0.11.0\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport plotly.offline as py\nimport plotly.express as px\nimport missingno as msno\nimport plotly.graph_objects as go\nimport plotly.figure_factory as ff\nfrom plotly.subplots import make_subplots\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n for filename in filenames:\n print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":1,"outputs":[{"output_type":"stream","text":"Collecting seaborn==0.11.0\n Downloading seaborn-0.11.0-py3-none-any.whl (283 kB)\n\u001b[K |████████████████████████████████| 283 kB 1.3 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied: matplotlib>=2.2 in /opt/conda/lib/python3.7/site-packages (from seaborn==0.11.0) (3.3.3)\nRequirement already satisfied: scipy>=1.0 in /opt/conda/lib/python3.7/site-packages (from seaborn==0.11.0) (1.4.1)\nRequirement already satisfied: pandas>=0.23 in /opt/conda/lib/python3.7/site-packages (from seaborn==0.11.0) (1.2.0)\nRequirement already satisfied: numpy>=1.15 in /opt/conda/lib/python3.7/site-packages (from seaborn==0.11.0) (1.19.5)\nRequirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn==0.11.0) (0.10.0)\nRequirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /opt/conda/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn==0.11.0) (2.4.7)\nRequirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn==0.11.0) (2.8.1)\nRequirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn==0.11.0) (1.3.1)\nRequirement already satisfied: pillow>=6.2.0 in /opt/conda/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn==0.11.0) (7.2.0)\nRequirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib>=2.2->seaborn==0.11.0) (1.15.0)\nRequirement already satisfied: pytz>=2017.3 in /opt/conda/lib/python3.7/site-packages (from pandas>=0.23->seaborn==0.11.0) (2019.3)\nInstalling collected packages: seaborn\n Attempting uninstall: seaborn\n Found existing installation: seaborn 0.11.1\n Uninstalling seaborn-0.11.1:\n Successfully uninstalled seaborn-0.11.1\nSuccessfully installed seaborn-0.11.0\n\u001b[33mWARNING: You are using pip version 21.0; however, version 21.0.1 is available.\nYou should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n/kaggle/input/customer-segmentation-tutorial-in-python/Mall_Customers.csv\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# II. DATA OVERVIEW & INSIGHTS"},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/customer-segmentation-tutorial-in-python/Mall_Customers.csv')\ndf.head()","execution_count":2,"outputs":[{"output_type":"execute_result","execution_count":2,"data":{"text/plain":" CustomerID Gender Age Annual Income (k$) Spending Score (1-100)\n0 1 Male 19 15 39\n1 2 Male 21 15 81\n2 3 Female 20 16 6\n3 4 Female 23 16 77\n4 5 Female 31 17 40","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
CustomerIDGenderAgeAnnual Income (k$)Spending Score (1-100)
01Male191539
12Male211581
23Female20166
34Female231677
45Female311740
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"col = ['cutomer_id', 'gender', 'age', 'annual_income', 'spending_score']\ndf.columns = col\n","execution_count":3,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.info()","execution_count":4,"outputs":[{"output_type":"stream","text":"\nRangeIndex: 200 entries, 0 to 199\nData columns (total 5 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 cutomer_id 200 non-null int64 \n 1 gender 200 non-null object\n 2 age 200 non-null int64 \n 3 annual_income 200 non-null int64 \n 4 spending_score 200 non-null int64 \ndtypes: int64(4), object(1)\nmemory usage: 7.9+ KB\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.describe()","execution_count":5,"outputs":[{"output_type":"execute_result","execution_count":5,"data":{"text/plain":" cutomer_id age annual_income spending_score\ncount 200.000000 200.000000 200.000000 200.000000\nmean 100.500000 38.850000 60.560000 50.200000\nstd 57.879185 13.969007 26.264721 25.823522\nmin 1.000000 18.000000 15.000000 1.000000\n25% 50.750000 28.750000 41.500000 34.750000\n50% 100.500000 36.000000 61.500000 50.000000\n75% 150.250000 49.000000 78.000000 73.000000\nmax 200.000000 70.000000 137.000000 99.000000","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
cutomer_idageannual_incomespending_score
count200.000000200.000000200.000000200.000000
mean100.50000038.85000060.56000050.200000
std57.87918513.96900726.26472125.823522
min1.00000018.00000015.0000001.000000
25%50.75000028.75000041.50000034.750000
50%100.50000036.00000061.50000050.000000
75%150.25000049.00000078.00000073.000000
max200.00000070.000000137.00000099.000000
\n
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"# III. FEATURE ENGINEERING"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Create new feature 'age_cat' to categorize values from 'age' colummn\n\ndf['age_cat'] = np.nan \n\nfor col in [df]:\n col.loc[(col['age'] >= 18) & (col['age'] <= 35), 'age_cat'] = 'young adult'\n col.loc[(col['age'] > 35) & (col['age'] <= 55), 'age_cat'] = 'middle age'\n col.loc[col['age'] > 55, 'age_cat'] = 'senior adult'\n\n \n#Create new feature 'weight_status' to categorize values from 'bmi' colummn\n\ndf[\"income_class\"] = np.nan\n\nfor col in [df]:\n col.loc[col[\"annual_income\"] < 32, \"income_class\"] = \"poor\"\n col.loc[(col[\"annual_income\"] >= 33) & (col[\"annual_income\"] <= 54), \"income_class\"] = \"lower middle\"\n col.loc[(col[\"annual_income\"] >= 55) & (col[\"annual_income\"] < 106), \"income_class\"] = \"middle\"\n col.loc[col[\"annual_income\"] >= 106, \"income_class\"] = \"upper middle\"\n \ndf.head()","execution_count":6,"outputs":[{"output_type":"execute_result","execution_count":6,"data":{"text/plain":" cutomer_id gender age annual_income spending_score age_cat \\\n0 1 Male 19 15 39 young adult \n1 2 Male 21 15 81 young adult \n2 3 Female 20 16 6 young adult \n3 4 Female 23 16 77 young adult \n4 5 Female 31 17 40 young adult \n\n income_class \n0 poor \n1 poor \n2 poor \n3 poor \n4 poor ","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
cutomer_idgenderageannual_incomespending_scoreage_catincome_class
01Male191539young adultpoor
12Male211581young adultpoor
23Female20166young adultpoor
34Female231677young adultpoor
45Female311740young adultpoor
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(8,8))\nsns.heatmap(df.corr(), cbar = True, square = True, annot=True, cmap= 'YlGnBu')\nplt.title('FEATURE VARIABLE CORRELATIONS')","execution_count":7,"outputs":[{"output_type":"execute_result","execution_count":7,"data":{"text/plain":"Text(0.5, 1.0, 'FEATURE VARIABLE CORRELATIONS')"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAAdAAAAHFCAYAAABCRqgoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABKyElEQVR4nO3dd3wUdf7H8dcnAQwgEKpSVBARu6CgosJZwAJ6eHbUs4vt7L3reZYTRbGciqcnYsUGqCh2EAUEBAXEwk9pIr1XCfn8/pgJbsImZJPZZDf7fvKYRzIz35n5zDLZ73y+850Zc3dEREQkMVmVHYCIiEg6UgUqIiJSBqpARUREykAVqIiISBmoAhURESkDVaAiIiJloApURETSmpk9Z2YLzGxKMfPNzB41s+lm9p2Z7RPFdlWBiohIunseOKqE+UcDbcKhN/BkFBtVBSoiImnN3UcCS0oo0hN4wQNjgFwza1re7aoCFRGRqq45MDtmfE44rVyqlXcFIiIiBWpu3yvy58Oum/3qhQRNrwX6u3v/BFZhcaaVO05VoCIiktLCyjKRCrOoOcB2MeMtgLnlCgo14YqISITMsiIfIjAUODPsjXsAsNzdfy/vSpWBiohIWjOzV4BDgEZmNge4A6gO4O5PAcOA7sB0YA1wThTbVQUqIiKRsUpo2HT3XluY78ClUW9XTbgiIiJloAxUREQiE9E1y7SgClRERCKTSRVo5uypiIhIhJSBiohIZMziPbOgalIGKiIiUgbKQEVEJEKZk5epAhURkcioE5GIiIiUSBmoiIhERhmoiIiIlEgZqIiIRKYynoVbWVSBiohIZNSEKyIiIiVSBioiIpFRBioiIiIlUgYqIiKRUQYqIiIiJVIGKiIikTH0NhapBGY2w8zWmtmqmKGZmbU0My8yfZWZnVJk+TvDcvuF46fHlF1rZvmxy4dl3Mx2irOeF8PfD4lZbqWZ/Whm5xQp72a2ukhs18fZv5vMbGSc6Y3M7A8z2yMcrx2uY9gWPqN5Zva8mW0dM/95M/tXkWVKu76lZvaemW1X0voS3e+Y8vuZ2TAzW2ZmS8zs69jP0sxyzezJcL/WmNnkOJ91afb/j3D+EjP7yMx2iZl/tpltjHMsNYtZf9cS9sHM7Bcz+z5m2vsx69kQs/1VZvZUeAzNKbKeY8L9X21mi83sJTNrUSRON7Priiw3x8wOifm8ngs/h5Vm9pOZ3VBc7FIxzLIiH1JV6kaWuY51961jhrkx83KLzHutYIaZGfB3YAlwFoC7v1RQFjgamBu7fAIxzQ3L1wWuAp4xs7ZFyuxdJLYH4qxnIHCgmbUqMv1UYLK7TwnHTwTWA0eYWdM46zk2jKcd0B64aQvxl3Z9TYH5wGNbWF+s0uw3ZtYJ+BQYAewENAQuJvh/wcxqAB8DOwCdgHrAdcD9ZnZ1MfG2I/7+PxDObw78BjxbZP7oIjEXPc5K0gVoAuxoZh0B3P3omGPqpYLth8NFcT6LE4GXgX5AI2B3gv+fUWZWP6boEuAGM6tbTCwPA1sDuxJ8Xn8F/q+U+yFSbqpAq47OQDPgCuDU8As5Uh4YRvDFtlcZlp9DUIn8vcisM4EBMeNnAU8B3wGnl7C+ecBwgoqkJKVd3zrgDWC3LayvLPoAA9z93+6+KPwsJ7j7yeH8vwPbAye5+6/uvsHdPwAuB/4ZrxLZ0v67+1pgUHHzy+gsYAgwLPw9IeGJ3kPAv8ITvLXhfpwPrCI4QSswDRhdZFqsjsDL7r7U3fPd/Qd3fyPRmCRaykAlHZ0FvAMUZKXHRL0BM8sys78SZA3Ty7iaAcRUoGEm2w54JRzfHjiEIJN5iaByLS6eFgQZXLGxJLi+WsApwJjS7UrphOvtRFA5F6cb8L67ry4y/U0gJ1y+6HpL3H8zqw30Km5+osL9OJE/P8uynKi1JThReD12orvnE+xrtyLlbwOuMrMGcdY1BrjHzM4xszYJxiFSbqpAU8/g8BrZMjMbXGTeoph5y8xsV9j0xXYSwdn4BoIv6oSzgxI0M7NlwFrgbeBqd59YpMw3RWI7sph1vQ1sY2YHhuNnElQcC2PGv3P37wkq1d3NrH2RdQw2s5XAbGABcEcJsZd2fcuAFQRf4H1KWF9Rpdnv+gR/a7+XsJ5G8ea7ex6wKJwfG29J+39tuD8rgYPZPOM/oEjMpW32PJ6gqfVD4F2CTog9SrlsgYL9iPdZ/E7h/cTdJ4Xbi3dt8zKCivwfwPdmNt3Mjk4wHomYMlCpTMe5e244HFdkXqOYebnuPi2c/jcgj6BZDYIvlaPNrHEptrcRqF5kWnVgQ8z4XHfPJbgG+ihwWJz17FMktuHxNubuawiyjzPD5rzTKdx8e2YYP+F1uRFsfjJwnLvXIcgsd6HIl24RpV1fLrAVwZfxCDPbtoR1xirNfi8F8gmusRZnUbz5ZlaNYP8WFYm3pP1/MNyflgQnPUWvV48pEnPrEuKKdRYwyN3z3H098BaJn6gV7Ee8z6IphfezwO3AxUX/T8Lm33vdfV+Ca8qDgNeLyValwmQlYUhNqRuZJOIsgs4Us8xsHkEFVZ2g+W5LZhF80cZqBcwsWjD80rwB2NPMjitHvAOAkwmyvToE2QxhVtoGuCnsWTkP2B/oFVYkReMZATwPPBhvI2VY30Z3f4vgpOLgcuxf0fWuIbiWd0IJxT4mOOmpXWT6CQRZ32bNylvaf3efRXBNvJ+Z1Uw88j+FzcWHAWfEfJYnAt3NrKQTmKJ+BOYQtJjErj+LYF8/KbqAu/9AUFnfXNxK3X0FcC9Qm+D4FUk6VaBpzsyaA4cTXPNsFw57A/+mdNnBa8CtZtYivMbZFTiWYq7XufsfBJ1Abi9H2F8Ay4D+wKvhOgnj/YigE0+7cNgDqEXYWzWOR4BuZtYuzryE1hfeotGToMl1WsysbDPLiRnK0kHreuBsM7vOzBqG29vbzF4N5w8kqFhet+C2pephc/CjwJ3uvryY9T5C8fuPu38EzAV6JxBr9SL7W42gGfgngmy2XTjsHMZcmhO1gngcuJbgmDvNzGqGmeV/CVo4Hi5m0buAc4DcgglmdpuZdTSzGmaWQ3CysIygkpZKoiZcSVXLrPC9e1cTfLFNcvcP3X1ewUDwxbuXhfdWluCfwFfAKIKmxgeA02NuKYnnOWB7Mzs2Ztq3RWJ7pLiFwy/RFwhu2XgBIPwCPBl4LHY/3P1Xgsol7slAeO30BYLOJpskuL53LLgvdgVwD3CWu0+NmX8jQVNowfBpovvt7l8RZHCHAb+Y2RKCE4hh4fz1QFeC65pjw1j6Are4e7HXZIvb/yL6ANeb2VbheCfb/D7QjjHlhxXZ3zsJPq//FPks5xH0bk6oGdeD26/+TtC7dhHwPVATOMjdFxezTMH/W2yG7sD/wnXMJWjR6OHuqxKJR6SsLPguExERKb9me9wWeaUyd8rdKfl4Iz3KT0REImMZ1LCZOXsqIiISIWWgIiISmVTu9BO1zNlTERGRCCkDFRGRyATPR8kMFVKB1ty+l7r6JtnoicU+I10i0rnDm5UdQpX3wZgTKzuEjHDQNj2SVsupCVdERERKpCZcERGJjG5jERERkRIpAxURkcjoGqiIiIiUSBmoiIhEJpMyUFWgIiISGXUiEhERkRIpAxURkehkUBNu5uypiIhIhJSBiohIZNSJSEREpAwy6WHymXOqICIiEiFloCIiEhndxiIiIiIlUgYqIiKRUSciERGRslAnIhERESmJMlAREYlOBqVlGbSrIiIi0VEGKiIi0dE1UBERESmJKlAREYmOWfRDqTZrR5nZj2Y23cxujDO/npm9Y2bfmtlUMzunvLuqJlwREYlOJaRlZpYNPAF0A+YA48xsqLt/H1PsUuB7dz/WzBoDP5rZS+7+R1m3qwxURETS3X7AdHf/JawQXwV6FinjQB0Lnna/NbAEyCvPRpWBiohIZDwJnYjMrDfQO2ZSf3fvHzPeHJgdMz4H2L/Iah4HhgJzgTrAKe6eX564VIGKiEhKCyvL/iUUiVdre5HxI4FJwGFAa+AjM/vC3VeUNS414YqISHQsCcOWzQG2ixlvQZBpxjoHeMsD04FfgV0S3b1YqkBFRCQ6WRb9sGXjgDZm1srMagCnEjTXxpoFHA5gZtsAbYFfyrOrasIVEZG05u55ZvYPYDiQDTzn7lPN7KJw/lPA3cDzZjaZIK+9wd0XlWe7qkBFRCQ6lfQkIncfBgwrMu2pmN/nAkdEuU014YqIiJSBMlAREYlO5jwKVxWoiIhEqHSdfqoENeGKiIiUgTJQERGJjl5nJiIiIiVRBioiItHJnARUGaiIiEhZKAMt4qk+F3L04e1ZuHgFHbpdX9nhpA135/mHBzNx9DS2yqnBxbeeyo5tW2xWbsHcxfS7/UVWrVhDq7bN+cftp1GtejW+GD6BoS9+BkBOzRqcd92JtGzTjLkzF/DI7QP/XP63xZx0wVH0OKVLhe1bquraZQ8euOM0srKyeOG1kfR9qtA95OTWrcV/HjiXVjs0Yd36DVxy/XNM++k3AC499wjOOqUL7s7UH+dw8XXPsv6Pcr3ZqcqYPHYaLz86GM/Pp3OPA+hxxuGF5rs7Lz/6NpPHTKPGVjU476Ze7BAe68/d/yrffvU9detvzd0DNv/++OCVzxj05Dv0G/pP6uRuXSH7U+HUCzdzDXx9BD3PvL+yw0g7k0b/wLw5i+g36CYuuOEknu3zZtxyL/3nPbqf0oV+g26idp1afPrO1wA0adaAO564hD4Dr+X4c7rxzL9fB6DZDk14YMA1PDDgGu5/7ipq5NRgvy57VNh+paqsLOOhf/6d489+mI5H3MKJf92ftjs1K1Tm2kuP4bvvZ9Pp6Nu58OpneOD20wBouk0uF53dlS5/vYv9j7qN7OwsTjy26JufMlP+xnxefPgtrurTm3+9cANjP/mG32bMK1Rm8phpzJ+ziPtevpmzrjuJF/q+sWneQUd15Oo+vYuuFoAl85cydfxPNNymflL3odJVzsPkK4Uq0CK+/PoHlixbVdlhpJ1xX0yhy1H7YmbsvMcOrF61lqWLCr8lyN2ZOuFnDjh0LwD+cnQHxo2cDEDbPVuxdd1aALTZfQcWL1i22TYmj/+ZbZo3pHHTBsndmTTQYe8d+WXmAmbMXsiGDRt5852vOaZb+0JldtmpGSO++h6An36Zx/YtGtG4UV0AqmVnUzOnBtnZWdTKqcHvcT7vTPTLtFk0ad6IJs0aUq16NfY/vD2TRk0pVGbiqCkceGQHzIzWu7dkzaq1LAuP9bbtWlM7PI6LeuXxIZx08TEpXSFIYlSBSiSWLlxOw21yN403bFyPJQuXFyqzcvlqam1dk+xq2QA0aFKPJQs3fxXfZ++OpV2nzd8y9NXHEzmoSCWRqZpuW5/ffl+yafy3eUtoum3hzGbytNn89ch9Adh371Zs37whzbetz+/zl/HoMx/w/ZcPMn3sIyxfuZZPv5haofGnqmWLltOgSe6m8fqNc1la5DheumhFoTINGueydFHhMkVNHDWF+o3qsf1OzaMMNyW5WeRDqtpiBWpmK81sRXFDCcv1NrPxZjY+b9X0aKOWlONFX11LnNvBSlFmyoTpfPrO15x+yTGFpudtyGPCqKkccNje5Qu0ioj3neJF/hP6PvUeufVq8eV7d3HhWV35duos8jbmk1u3Fj26tWfPLtfT5oCrqF1rK045rlMFRZ7ain6GAFb0w45bpvh1rl/3B+8O/JjjzjuqvOFJitliJyJ3rwNgZv8E5gEDCRohTgfqlLDcpjeI19y+V5yvTkl3w98cxSdDxwLQepftWDx/2aZ5ixcup36jeoXK18mtzZpVa9mYt5HsatksWbCc+mGTIsDM6XPpf98gbux7AXXq1S607MTRP9Bq5xbkNij2kMsoc39fSvOYpuzm2zZgXsznD7By1Touvv65TeNTvujDzNkLObzLHsycvZBFS1YCMHT4BPbfZydeGzy6QmJPZfUb57Ikpjl76cJl5MYco0GZeoXKLFm4jNyGhY/1WAt/W8Si35dwx7kPhutczl3n9+W2p6+kXsO6xS6XttSJKK4j3f0/7r7S3Ve4+5PACckKTFLfkSccvKmDT8cuezDygwm4Oz9NmUmt2jmFKkcIzuR322cnxnz2HQAj3h9Ph85Bh6BF85by0E3Pc+kdvWi2fePNtvXlRxM5UM23m0z47ldat2zCDi0aUb16Niccux/vfTyxUJl6dWpSvXrQXH72qV348usfWblqHXPmLqFj+9bUzKkBwCEH7saP/ze3wvchFbXaZTvmz1nIwrmLyduQx9hPJtLuoMKd1todvAdfDR+Pu/N/U2dQq3bOZpVsrBatm9Fv6D/pM+g2+gy6jfqN63HHf6+umpUnZFQnokRuY9loZqcDrxI0xvUCNiYlqko04LHL6NxpVxrVr8P0sY9zd983GPDa55UdVsprf+CuTBw9jStOuo8aOdW5+JZTN82775pnuPDGk2nQuB6nX3IM/W4fyGv936flzs05LOz9+cb/PmTVijU8++BbAGRnZ3Hfc1cBQRPY5HE/0fuGEyt+x1LUxo35XHvHSwx+4RqysrIY+PoX/PDzXM497RAAnnv5c9ru1IynH7qA/Px8fvh5LpfeEGSj4yf9wuD3xzPq3TvJy9vIt9/P4n+vjKjEvUkd2dWyOePK4+l7bX/y8/M5uPt+NG+1LZ8N+QqAQ3seyF4H7Mp3o6dxY697qbFVdc69qdem5Z+6ayA/TpzOquWrueaEu+h5zpF0OeaAytodSTKL1+Yft6BZS6AfcBBBBfolcKW7z9jSsmrCTb7RE0+v7BCqvM4d4t+aI9H5YIxOkirCQdv0SFpet9NfB0T+fT996FkpmYeWOgMNK8qeyQtFREQkfWyxAjWz6939ATN7jDj9KN398qREJiIi6SeDOhGVJgOdFv4cn8xARESkCsic+rNUt7G8E/4cUFI5M3vM3S+LKjAREZFUFuXD5A+KcF0iIpKOUvjJQVHTo/xERETKQK8zExGR6CgDLZPM+dRERCTjlaoCNbNsM+uzhWL9IohHRETSWVYShhRVqiZcd99oZvuamXkxjy5y9+cjjUxERNJPBjXhJnINdCIwxMxeB1YXTHT3tyKPSkREJMUlUoE2ABYDh8VMc0AVqIiIBDInAU3oWbjnJDMQERGRdFLqy7NmtrOZfWJmU8Lxvczs1uSFJiIi6cazLPIhVSXSv+kZ4CZgA4C7fwecWuISIiKSWcyiH1JUIhVoLXf/usi0vCiDERERSReJdCJaZGatCV9pZmYnAr8nJSoREUlPqZswRi6RCvRSoD+wi5n9BvwKnJGUqERERFJcIr1wfwG6mlltIMvdVyYvLBERSUsp3OknaqWuQM0sFzgTaAlUs/DCrrtfnozAREQkDaVwp5+oJdKEOwwYA0wG8pMTjoiISHpIpALNcferkxaJiIikv8xJQBO6jWWgmV1gZk3NrEHBkLTIREREUlgiGegfQB/gFsJbWcKfO0YdlIiIpCl1IorramAnd1+UrGBERETSRSIV6FRgTbICERGRKkAZaFwbgUlm9hmwvmCibmMREZECnjn1Z0IV6OBwEBERyXiJPIlogJnVAHYOJ/3o7huSE5aIiKQlNeFuzswOAQYAMwju9NnOzM5y95FJiUxERCSFJdKE+xBwhLv/CMELtoFXgH2TEZiIiKQhPcovruoFlSeAu/9kZtWTEJOIiKQrNeHGNd7MngUGhuOnAxOiD0lERCT1JVKBXkzwTtDLCa6BjgSeSEZQIiKSphJ5QGyaS6QCvcjd+wJ9CyaY2RVAv8ijEhERSXGJnCucFWfa2RHFISIiVYFZ9EOK2mIGama9gNOAVmY2NGZWHWBxsgITEZE0pE5EhXwF/A40IriVpcBK4LtkBCUiIpLqtliBuvtMYCbQKfnhiIhIOvMUbnKNWqmvgZrZSjNbEQ7rzGyjma1IZnAiIiKlYWZHmdmPZjbdzG4spswhZjbJzKaa2YjybjORZ+HWKRLIccB+pVl29MTTE4tKEtap/UuVHUKV98U3Z1R2CFVeh0ZtKjsEKa9KuI3FzLIJbqvsBswBxpnZUHf/PqZMLvAf4Ch3n2VmTcq73TLvqrsPBg4rbwAiIiLltB8w3d1/cfc/gFeBnkXKnAa85e6zANx9QXk3msjD5I+PGc0COgBe3gBERKQKqZxeuM2B2THjc4D9i5TZGahuZp8T3EXSz91fKM9GE3mQwrExv+cRvJXlr+XZuIiIVDFJ6ERkZr2B3jGT+rt7/9gicRYrmuBVI3j5yeFATWC0mY1x95/KGlciFWgWcIW7LwMws/oEt7WcW9aNi4iIbElYWfYvocgcYLuY8RbA3DhlFrn7amC1mY0E9gbKXIEmcg10r4LKE8DdlwLty7phERGpgrIs+mHLxgFtzKyVmdUATgWGFikzBOhsZtXMrBZBE++08uxqQhmomdUPK07MrEGCy4uIiETO3fPM7B/AcCAbeM7dp5rZReH8p9x9mpl9QPAAoHzgv+4+pTzbTfSF2l+Z2RsEbcsnA/eUZ+MiIlLFVNJzFNx9GDCsyLSnioz3AfpEtc1E7gN9wczGE9y6YsDxsffYiIiIuJ6FG19YYarSFBGRjKdrmCIiEp0MykAz6N3hIiIi0VEGKiIi0cmgt7GoAhURkehkULtmBu2qiIhIdJSBiohIdDKoCVcZqIiISBkoAxURkejoNhYREREpiTJQERGJTgZloKpARUQkMq5ORCIiIlISZaAiIhKdDErLMmhXRUREoqMMVEREopNB10BVgYqISHQyqBeumnBFRETKQBmoiIhERxmoiIiIlEQZqIiIRCdzElBVoCIiEh1XE66IiIiURBmoiIhEJ4PuA1UGKiIiUgbKQEVEJDoZdA1UFaiIiEQnc+pPNeGKiIiUhTJQERGJTFYGpWUZtKsiIiLRUQYqIiKRyaC7WDKjAnV3nn94MBNHT2OrnBpcfOup7Ni2xWblFsxdTL/bX2TVijW0atucf9x+GtWqV+OL4RMY+uJnAOTUrMF5151IyzbNmDtzAY/cPvDP5X9bzEkXHEWPU7pU2L6lo6f6XMjRh7dn4eIVdOh2fWWHk1bcnRceeZtvR0+jRk4NLrylF62KOZYfv2Mgq1asoeXOLbgkPJbnzpzP0/e8yoyf5nBy7+70OO1QABbPX8qTd7/M8iUrMTMO69mJo07Wcezu3HNPf0aMmEBOzlbcf/8V7L77TpuVu/nmR5ky5WfcoVWrZtx335XUrl2Tjz8eQ79+L5GVZWRnZ3PzzefTocPulbAnkgwZ0YQ7afQPzJuziH6DbuKCG07i2T5vxi330n/eo/spXeg36CZq16nFp+98DUCTZg2444lL6DPwWo4/pxvP/Pt1AJrt0IQHBlzDAwOu4f7nrqJGTg3267JHhe1Xuhr4+gh6nnl/ZYeRlr4dPY15cxbx0Gs3c971J/G/B9+IW+7VJ9/l6FP+Qt/XbqZ2nZp8/u5YAGrXrcWZV/2NHr0OLVQ+Kzub0y/rSZ+Xb+Su/lfw0VtfMufXeUnfn1Q3cuQEZsyYy4cfPs3dd1/KnXc+GbfczTefz9Chj/HOO4/RtGljXnrpXQA6ddqboUMfZciQR7n33su59dbHKjL8SmEW/ZCqMqICHffFFLoctS9mxs577MDqVWtZumhFoTLuztQJP3PAoXsB8JejOzBu5GQA2u7Ziq3r1gKgze47sHjBss22MXn8z2zTvCGNmzZI7s5UAV9+/QNLlq2q7DDS0oRRU+h8VAfMjDZ7tGTNyuKO5ensd0hwLHfp3pHxI6cAUK9+HVrvuj3Z1Qr/6ddvVHdTJluzdg7NdmjC0oXLK2CPUtsnn4zhuOMOw8xo124XVqxYzYIFSzYrt/XWwfeDu7Nu3R8U3MtRu3ZNLKwB1q5dv+n3qszMIh9SVcJNuGZW291XJyOYZFm6cDkNt8ndNN6wcT2WLFxO/UZ1N01buXw1tbauSXa1bAAaNKnHkoUriq6Kz94dS7tOu2w2/auPJ3JQt/bRBy8SY8nCFTRskrtpvEGTXJYWOZZXLV9N7a1z/jyWG9dLqDJc+PsSZv78G6133yGyuNPV/PmL2XbbRpvGt922IfPnL6ZJk81PlG+66RFGjJhA69bbceON526a/tFHo3nooQEsWbKcp5++o0LilopR6gzUzA40s++BaeH43mb2n6RFFiH3zadtdlJTijJTJkzn03e+5vRLjik0PW9DHhNGTeWAw/YuX6AiWxLnYC56nMY73kt7c/u6Net55Jbn+fvlx1Grdk7i8VUx8b874n+Y9913JV988TytW7dg2LBRm6Z369aJDz54iieeuIV+/V5MVqgpI5OacBPJQB8GjgSGArj7t2ZWbC8DM+sN9Aa49aFLOeGso8oTZ8KGvzmKT4YG131a77Idi+cv2zRv8cLl1G9Ur1D5Orm1WbNqLRvzNpJdLZslCwqf1c+cPpf+9w3ixr4XUKde7ULLThz9A612bkFugzrJ2yHJWB++OYrPho4BYMddtyt0CWHJgmXkxjmWV69a9+exHOd4jycvbyOP3PI8Bx2xDx3D5t9M9NJL7zFo0HAA9tyzDfPmLdo0b968+NlngezsbLp378yzz77FCSd0LTSvY8c9mDXrd5YsWU6DBlv+/5DUl1ATrrvPLnL2tbGEsv2B/gCTFr8b75w4qY484WCOPOFgAL758nuGv/klB3Zrz89TZ1Grdk6hyhGCs8rd9tmJMZ99x0Hd2jPi/fF06Bx0CFo0bykP3fQ8l97Ri2bbN95sW19+NJED1XwrSXLECQdzRHgsT/zqez58cxSdurZn+tSZ1Ny6+GP568+/o1PX9owcNo59O5fcuc3deea+12i+QxO6n3pIsnYlLZx+eg9OP70HAJ9/Po4XX3yXHj268O23P1KnTq3NKlB3Z9as39lhh2a4O5999jU77hhcT545cy7bb98UM2Pq1Ols2JBH/fp1N9tmVZLKGWPUEqlAZ5vZgYCbWQ3gcsLm3FTX/sBdmTh6GlecdB81cqpz8S2nbpp33zXPcOGNJ9OgcT1Ov+QY+t0+kNf6v0/LnZtz2LH7A/DG/z5k1Yo1PPvgWwBkZ2dx33NXAbB+3R9MHvcTvW84seJ3LE0NeOwyOnfalUb16zB97OPc3fcNBrz2eWWHlRbaddqVSaOncfXJ91IjpzoX3txr07wHrunPBTeeQv3G9eh18TE8dscLvN5/GDvs3IJDjgmO5WWLV3DreQ+zdvU6srKM9weN5IGXbmD29LmM+mA827Vuyk1nPQjAKRd2p92Bu1XKfqaKv/ylAyNGjKdbt97UrLkV9957xaZ5F1xwJ//612U0blyfG254hNWr1+DutG3birvuugSA4cO/YsiQT6lWrRo5OTV4+OHrU7pTTBQsI7qmBszjXjCJU9CsEdAP6EpwReVD4Ap3X7ylZSsjA800ndq/VNkhVHlffHNGZYdQ5XVo1KayQ8gQOyetFt/5mZGRf9//dEGXlDzrKHUG6u6LgNOTGIuIiKS5Kp5gF1LqCtTMHo0zeTkw3t2HRBeSiIhI6kuktToHaAf8HA57AQ2A88zskcgjExGRtJNl0Q+pKpFORDsBh7l7HoCZPUlwHbQbMDkJsYmISJrJpCbcRDLQ5kDsDZC1gWbuvhFYH2lUIiIiKS6RDPQBYJKZfU7QC7cLcK+Z1QY+TkJsIiKSZjIpA02kF+6zZvY+8HfgB4Lm2znhc3GvS1J8IiIiKSmRXrjnA1cALYBJwAHAaOCwpEQmIiJpp6o/KCJWItdArwA6AjPd/VCgPbAwKVGJiIikuESuga5z93Xh+9m2cvcfzKxt0iITEZG0k0mP8kukAp1jZrnAYOAjM1sKzE1GUCIikp4yqAU3oU5Efwt/vdPMPgPqAR8kJSoREZEUl9DrzAq4+4ioAxERkfSXSRloBrVWi4iIRKdMGaiIiEg8mZSBqgIVEZHIpPLD36OmJlwREUl7ZnaUmf1oZtPN7MYSynU0s41mdmJ5t6kMVEREIlMZTbhmlg08QfB2sDnAODMb6u7fxyn3b2B4FNtVBioiIuluP2C6u//i7n8ArwI945S7DHgTWBDFRlWBiohIZMyiH0qhOTA7ZnxOOC0mLmsO/A14Kqp9VROuiIhExpLQi8jMegO9Yyb1d/f+sUXiLOZFxh8BbnD3jVE98F4VqIiIpLSwsuxfQpE5wHYx4y3Y/FGzHYBXw8qzEdDdzPLcfXBZ41IFKiIikamk+0DHAW3MrBXwG3AqcFpsAXdvVfC7mT0PvFueyhNUgYqISJpz9zwz+wdB79ps4Dl3n2pmF4XzI7vuGUsVqIiIRKaynkTk7sOAYUWmxa043f3sKLapXrgiIiJloAxUREQio2fhioiIlIGehSsiIiIlUgYqIiKRyaQmXGWgIiIiZaAMVEREImMZlJapAhURkcioCVdERERKpAxUREQiE9WbTtKBMlAREZEyUAYqIiKRyaAEVBWoiIhEJ5MqUDXhioiIlIEyUBERiUwmZaAVUoF27vBmRWwmo33xzRmVHUKV13mfFys7hCrv43E6jivCQdvsXNkhVAnKQEVEJDJ6G4uIiIiUSBmoiIhEJpMyUFWgIiISmSzzyg6hwqgJV0REpAyUgYqISGQyqQlXGaiIiEgZKAMVEZHIZFJWpgpUREQio05EIiIiUiJloCIiEhl1IhIREZESKQMVEZHIZFJWpgpUREQioyZcERERKZEyUBERiYzpNhYREREpiTJQERGJjK6BioiISImUgYqISGQyKStTBSoiIpHRs3BFRESkRMpARUQkMupEJCIiIiVSBioiIpHJpKxMFaiIiERGTbgiIiJSImWgIiISGd3GIiIiIiVSBioiIpHJpGugqkBFRCQymdSsmUn7KiIiEhlloCIiEhl1IhIREZESKQMVEZHIZFInImWgIiIiZaAMVEREIpNJGagqUBERiUwmNWtm0r6KiIhEJuMy0K5d9uCBO04jKyuLF14bSd+nhhWan1u3Fv954Fxa7dCEdes3cMn1zzHtp98AuPTcIzjrlC64O1N/nMPF1z3L+j/yKmM3Uo6788Ijb/Pt6GnUyKnBhbf0olXbFpuVWzB3MY/fMZBVK9bQcucWXHL7aVSrXo25M+fz9D2vMuOnOZzcuzs9TjsUgMXzl/Lk3S+zfMlKzIzDenbiqJO7VPTupZ2n+lzI0Ye3Z+HiFXTodn1lh5PyJo+dxsuPDsbz8+nc4wB6nHF4ofnuzsuPvs3kMdOosVUNzrupFzuEx3dxy86a/hsDH3qDdWvW06hpA3rfdgY1a+eQtyGPAQ++zowfZmNZxmmX/41d2u9U4fucLLqNpYrKyjIe+uffOf7sh+l4xC2c+Nf9abtTs0Jlrr30GL77fjadjr6dC69+hgduPw2AptvkctHZXeny17vY/6jbyM7O4sRj96+M3UhJ346exrw5i3jotZs57/qT+N+Db8Qt9+qT73L0KX+h72s3U7tOTT5/dywAtevW4syr/kaPXocWKp+Vnc3pl/Wkz8s3clf/K/jorS+Z8+u8pO9Puhv4+gh6nnl/ZYeRFvI35vPiw29xVZ/e/OuFGxj7yTf8NqPwMTZ5zDTmz1nEfS/fzFnXncQLfd/Y4rLPPzCIEy/swd0Drmefznvy/iufATDinTEA3D3geq7texGvPTGU/Pz8CtzjqsnMjjKzH81supndGGf+6Wb2XTh8ZWZ7l3ebGVWBdth7R36ZuYAZsxeyYcNG3nzna47p1r5QmV12asaIr74H4Kdf5rF9i0Y0blQXgGrZ2dTMqUF2dha1cmrw+4JlFb0LKWvCqCl0PqoDZkabPVqyZuVali5aUaiMuzN1wnT2O2QvALp078j4kVMAqFe/Dq133Z7saoUPyfqN6m7KZGvWzqHZDk1YunB5BexRevvy6x9YsmxVZYeRFn6ZNosmzRvRpFlDqlWvxv6Ht2fSqCmFykwcNYUDjwyO79a7t2TNqrUsW7SixGXnzVrAznu3BmD3DjszYcR3AMydMZ/d9m0DQN36dai1dU1m/DC7Avc4ubIs+mFLzCwbeAI4GtgN6GVmuxUp9ivwF3ffC7gb6F/ufU2ksJnVNLO25d1oZWm6bX1++33JpvHf5i2h6bb1C5WZPG02fz1yXwD23bsV2zdvSPNt6/P7/GU8+swHfP/lg0wf+wjLV67l0y+mVmj8qWzJwhU0bJK7abxBk9zNKrpVy1dTe+scsqtlB2Ua10uoMlz4+xJm/vwbrXffIZKYRQCWLVpOg5hjt37jzY/dpYtWFCrToHEuSxctL3HZ5q2aMmlU8B0x7vNvWRKecG+3UzMmjprKxryNLJy7mBk/zd40ryrISsJQCvsB0939F3f/A3gV6BlbwN2/cvel4egYYPNrTAkqdQVqZscCk4APwvF2Zja0vAFUJItzJuNeuL2+71PvkVuvFl++dxcXntWVb6fOIm9jPrl1a9GjW3v27HI9bQ64itq1tuKU4zpVUORpwDe/7lH0845TBErZ5X3dmvU8csvz/P3y46hVOyfx+ESKUfQ7AMBKcfCalbzsuTeewqdvj+Ku8/uybs16qlUPThw7d9+P+o3r8c/eD/PKY4PZafeWZGdnR7AnGa05EJvGzwmnFec84P3ybjSRTkR3EtTynwO4+yQza1lcYTPrDfQG2KphJ6rXqfzEde7vS2netMGm8ebbNmDe/GWFyqxctY6Lr39u0/iUL/owc/ZCDu+yBzNnL2TRkpUADB0+gf332YnXBo+ukNhT0YdvjuKzocH1nB133Y7FMWfRSxYsI7dRvULl6+TWZvWqdWzM20h2tWyWLFxO/SJl4snL28gjtzzPQUfsQ8ew+VckKvUb5xbKAJcuXEZueNnmzzL1CpVZsnAZuQ3rkbdhY7HLNt1hG67pexEA82Yv4LvRwaWh7GrZ9LrsuE3L3HPxozTZrlG0O1WJknEfaGx9Eurv7rFNsPG2Grc3k5kdSlCBHlzeuBJpws1z91K3t7l7f3fv4O4dUqHyBJjw3a+0btmEHVo0onr1bE44dj/e+3hioTL16tSkenimePapXfjy6x9ZuWodc+YuoWP71tTMqQHAIQfuxo//N7fC9yGVHHHCwdw34FruG3AtHbrsyRcfjMfd+XnKDGpunUP9Il9CZsZu++zE158H14JGDhvHvp33KHEb7s4z971G8x2a0P3UQ5K1K5LBWu2yHfPnLGTh3MXkbchj7CcTaXdQ4eOy3cF78NXw4Pj+v6kzqFU7h9xGdUtcdsXS4GQ7Pz+fd174mEN6HgjA+nV/sH7tegCmjvuR7OwsmrfctgL3OP3E1ifhUPT65Rxgu5jxFsBmX9BmthfwX6Cnuy8ub1yJZKBTzOw0INvM2gCXA1+VN4CKtHFjPtfe8RKDX7iGrKwsBr7+BT/8PJdzTzsEgOde/py2OzXj6YcuID8/nx9+nsulNwTZ6PhJvzD4/fGMevdO8vI28u33s/jfKyMqcW9SS7tOuzJp9DSuPvleauRU58Kbe22a98A1/bngxlOo37gevS4+hsfueIHX+w9jh51bcMgxQU/mZYtXcOt5D7N29Tqysoz3B43kgZduYPb0uYz6YDzbtW7KTWc9CMApF3an3YFF+wdIrAGPXUbnTrvSqH4dpo99nLv7vsGA1z6v7LBSUna1bM648nj6Xtuf/Px8Du6+H81bbctnQ4Kvt0N7HsheB+zKd6OncWOve6mxVXXOvalXicsCjP14Ip++/SUA+3TZk4O77wfAyqWreOjap8kyI7dxPc6/9bRK2Ovkscq5jWUc0MbMWgG/AacChT5YM9seeAv4u7v/FMVGLV4bftyCZrWAW4AjCNLl4cDd7r5uS8vWaXVO5twYVEk+G3diZYdQ5XXe58XKDqHK+3jcGZUdQkY4aJseSXvg3k3jP4n8+/6+DodvMV4z6w48AmQDz7n7PWZ2EYC7P2Vm/wVOAGaGi+S5e4fyxFXqDNTd1xBUoLeUZ4MiIiJRc/dhwLAi056K+f184Pwot1nqCtTMOgA3Ay1jlwvvqREREcmohwskcg30JeA6YDKgx2aIiEhGS6QCXejuaXXfp4iIVKxMehZuIhXoHeFF2E+A9QUT3f2tyKMSERFJcYlUoOcAuwDV+bMJ1wm6BYuIiOiF2sXY2933TFokIiKS9jKpAk2kw9SYOE+3FxERyUiJZKAHA2eZ2a8E10ANcN3GIiIiBTLpsfiJVKBHJS0KERGRNJPIk4hmhm/w7hxO+sLdv01OWCIiko4y6TaWRN4HegXBwxSahMOLZnZZsgITEZH0k2XRD6kqkSbc84D93X01gJn9GxgNPJaMwERERFJZIhWoARtjxjcS/yWmIiKSoVI5Y4xaIhXo/4CxZvZ2OH4c8GzkEYmIiKSBRDoR9TWzzwluZzHgHHefmKzAREQk/WQrA92cmR0ATHX3b8LxOma2v7uPTVp0IiKSVjKpCTeRJxE9CayKGV8dThMREck4CXUicvdNN/i4e76ZJbK8iIhUcboPNL5fzOxyM6seDlcAvyQrMBERkVSWSAV6EXAg8BswB9gf6J2MoEREJD3pQQpxuPsC4NQkxiIiIpI2EumF2xi4AGgZu5y7nxt9WCIiko70Npb4hgBfAB9T+IlEIiIiQGo3uUYtkQq0lrvfkLRIRERE0kgiFei7Ztbd3YclLRoREUlruo0lvisIKtG1ZrbCzFaa2YpkBSYiIpLKEumFWyeZgYiISPrTs3BjmNku7v6Dme0Tb37Bs3FFRETUiaiwqwkemPBQnHkOHBZpRCIiImlgixWou/cOfx5aUjkz6+buH0UVmIiIpJ9MykAT6US0Jf+OcF0iIiIpLcq3qWTQeYeIiMSTSRlolBVo5tz8IyIicWXrPlAREREpSZQZ6IwI1yUiImkok7Ky0twHenxJ8939rfBnieVERESqktJkoMeWMM+BtyKKRURE0pw6EcVw93MqIhAREUl/qkCLYWY9gN2BnIJp7v7PqIMSERFJdaWuQM3sKaAWcCjwX+BE4OvSLPvBmBPLFJyUXodGbSo7hCrv43FnVHYIVV7Xji9WdggZYe2sHklbt25jie9Adz8TWOrudwGdgO2SE5aIiEhqS6QJd234c42ZNQMWA62iD0lERNKVroHG966Z5QJ9gG8IeuD+NxlBiYiIpLpEXqh9d/jrm2b2LpDj7suTE5aIiKQjZaBxmNmZcabh7i9EG5KIiKQrVaDxdYz5PQc4nKApVxWoiIhknESacC+LHTezesDAyCMSEZG0lZ1BGWh5nvu7BtDNhyIikpESuQb6Dn++8zML2A0YlIygREQkPWVl0IMUErkG+mDM73nATHefE3E8IiKSxvQ6szjcfUQyAxEREUkniTThHg/8G2gCWDi4u9dNUmwiIpJmdBtLfA8Ax7r7tGQFIyIiki4SqUDnq/IUEZGSZNJtLIlUoOPN7DVgMLC+YKK7vxV1UCIikp7UCze+ugT3fh4RM80BVaAiIpJxEumFe04yAxERkfSnTkRxmFlj4AKgZexy7n5u9GGJiIiUnpkdBfQDsoH/uvv9ReZbOL87QWvq2e7+TXm2mUgT7hDgC+BjYGN5NioiIlVTZWSgZpYNPAF0A+YA48xsqLt/H1PsaILHz7YB9geeDH+WWSIVaC13v6E8GxMREUmC/YDp7v4LgJm9CvQEYivQnsAL7u7AGDPLNbOm7v57WTeayFOX3jWz7mXdkIiIVH1ZSRhKoTkwO2Z8Tjgt0TIJSaQCvYKgEl1rZivMbKWZrSjPxkVEpGoxS8Zgvc1sfMzQu+hm44RS9H6a0pRJSCK9cOuYWQOC9uOc8mxURESktNy9P9C/hCJzgO1ixlsAc8tQJiGlzkDN7HxgBPABcGf48/bybFxERKoWS8JQCuOANmbWysxqAKcCQ4uUGQqcaYEDgOXluf4JiTfhdiR4jdmhQHtgUXk2LiIiUl7ungf8AxgOTAMGuftUM7vIzC4Kiw0DfgGmA88Al5R3u4n0wl3n7uvMDDPbyt1/MLO25Q1ARESqDqukBym4+zCCSjJ22lMxvztwaZTbTKQCnWNmuQTPwv3IzJZSzvZjERGpWvRC7Tjc/W/hr3ea2WdAPYLroCIiIhknkQx0E3cfEXUgIiKS/iyD3saSSdm2iIhIZMqUgYqIiMSTQS9jUQUqIiLRqaxeuJVBTbgiIiJloAxUREQik0EJqDJQERGRslAGKiIikamMF2pXFmWgIiIiZaAMVEREIpNBCagqUBERiY5uYxEREZESZUQGOnnsNF5+dDCen0/nHgfQ44zDC813d15+9G0mj5lGja1qcN5NvdihbQsAnrv/Vb796nvq1t+auwdcv9m6P3jlMwY9+Q79hv6TOrlbV8j+pAN35557+jNixARycrbi/vuvYPfdd9qs3M03P8qUKT/jDq1aNeO++66kdu2afPzxGPr1e4msLCM7O5ubbz6fDh12r4Q9qVzlOXaLW3bW9N8Y+NAbrFuznkZNG9D7tjOoWTuHvA15DHjwdWb8MBvLMk67/G/s0n7z/zP501N9LuTow9uzcPEKOnTb/PshE2VQAlr1M9D8jfm8+PBbXNWnN/964QbGfvINv82YV6jM5DHTmD9nEfe9fDNnXXcSL/R9Y9O8g47qyNV9esdd95L5S5k6/icablM/qfuQjkaOnMCMGXP58MOnufvuS7nzzifjlrv55vMZOvQx3nnnMZo2bcxLL70LQKdOezN06KMMGfIo9957Obfe+lhFhp8SynPslrTs8w8M4sQLe3D3gOvZp/OevP/KZwCMeGcMAHcPuJ5r+17Ea08MJT8/vwL3OP0MfH0EPc+8v7LDkEqSUAVqZjXT7SXav0ybRZPmjWjSrCHVqldj/8PbM2nUlEJlJo6awoFHdsDMaL17S9asWsuyRSsAaNuuNbXr1oq77lceH8JJFx+TWadcpfTJJ2M47rjDMDPatduFFStWs2DBks3Kbb118Nm6O+vW/UHBh1m7dk0svJiydu36Tb9nkvIcuyUtO2/WAnbeuzUAu3fYmQkjvgNg7oz57LZvGwDq1q9Dra1rMuOH2RW4x+nny69/YMmyVZUdRkqxJAypqtQVqJkdC0wifAeombUzs6FJiisyyxYtp0GT3E3j9RvnsnTh8kJlli5aUahMg8a5LF1UuExRE0dNoX6jemy/U/Mow60y5s9fzLbbNto0vu22DZk/f3Hcsjfd9AgHHXQmv/wyh7///ZhN0z/6aDRHHXURF154F/fee0XSY0415Tl2S1q2eaumTBo1FYBxn3/LkgXLANhup2ZMHDWVjXkbWTh3MTN+mr1pnkhpZVn0Q6pKJAO9E9gPWAbg7pOAlsUVNrPeZjbezMYPGVh579123/zddJtlM3HLFL/O9ev+4N2BH3PceUeVN7wqK85HWmwWed99V/LFF8/TunULhg0btWl6t26d+OCDp3jiiVvo1+/FZIWasspz7Ja07Lk3nsKnb4/irvP7sm7NeqpVzwagc/f9qN+4Hv/s/TCvPDaYnXZvSXZ2dgR7IlI1JdKJKM/dl5e2Kc3d+wP9Ab6c/16lvWG1fuPcQmfRSxcuI7dR3SJl6hUqs2ThMnIb1it2nQt/W8Si35dwx7kPhutczl3n9+W2p6+kXsO6xS5X1b300nsMGjQcgD33bMO8eYs2zZs3bzFNmjQodtns7Gy6d+/Ms8++xQkndC00r2PHPZg163eWLFlOgwbF/79UNeU5dvM2bCx22aY7bMM1fS8CYN7sBXw3+nsAsqtl0+uy4zYtc8/Fj9Jkuz9bEURKI4UTxsglkoFOMbPTgGwza2NmjwFfJSmuyLTaZTvmz1nIwrmLyduQx9hPJtLuoD0KlWl38B58NXw87s7/TZ1Brdo5m31RxWrRuhn9hv6TPoNuo8+g26jfuB53/PfqjK48AU4/vQdDhgQdf7p2PYDBgz/F3Zk06Qfq1Km1WQXq7sycOXfT75999jU77hj0IJ05c+6mLGrq1Ols2JBH/fqZ9fmW59gtadkVS1cCkJ+fzzsvfMwhPQ8EgpaV9WvXAzB13I9kZ2fRvOW2FbjHIuklkQz0MuAWYD3wMjAc+FcygopSdrVszrjyePpe25/8/HwO7r4fzVtty2dDgrr/0J4HstcBu/Ld6Gnc2OteamxVnXNv6rVp+afuGsiPE6ezavlqrjnhLnqecyRdjjmgsnYnbfzlLx0YMWI83br1pmbNrQpdw7zggjv5178uo3Hj+txwwyOsXr0Gd6dt21bcddclAAwf/hVDhnxKtWrVyMmpwcMPX59xHYnKc+wWtyzA2I8n8unbXwKwT5c9Obj7fgCsXLqKh659miwzchvX4/xbT6uEvU4vAx67jM6ddqVR/TpMH/s4d/d9gwGvfV7ZYVUqs0prcKxwFu9ayWaFzLKB4e7edYuF46jMJtxMcdA2bSo7hCrvy/k/V3YIVV7Xjpl3rbsyrJ31StLORv9vxTuRf9+3rntsSp49l6oJ1903AmvMLHMuQImIiJQgkSbcdcBkM/sIWF0w0d0vjzwqERFJS5l0pSWRCvS9cBAREcl4pa5A3X2AmdUAdg4n/ejuG5ITloiIpKMq/3zYGKWuQM3sEGAAMIPgVp/tzOwsdx+ZlMhERERSWCJNuA8BR7j7jwBmtjPwCrBvMgITEZH0o2ug8VUvqDwB3P0nM6uehJhERCRNZVD9mVAFOt7MngUGhuOnAxOiD0lERCT1JVKBXgxcClxOcJIxEvhPMoISEZH0pCbc4sv2c/e+sOnpRFslJSoREZEUl0iP40+AmjHjNYGPow1HRETSWSa9UDuRDDTH3Te9et3dV5lZrSTEJCIiaSqVX4AdtUQy0NVmtk/BiJntC6yNPiQREZHUl0gGeiXwupnNDcebAqdEHpGIiKStDEpAE3qU3zgz2wVoS/AZ/aBH+YmISKYqdROumZ1EcB10CtATeC22SVdERMTMIx9SVSLXQG9z95VmdjBwJMFzcZ9MTlgiIpKOMqkXbiIV6MbwZw/gSXcfAtSIPiQREZHUl0gnot/M7GmgK/BvM9uKzHpzjYiIbEEmPYkokQrwZGA4cJS7LwMaANcVzDSz+tGGJiIikroS6YW7BngrZvx34PeYIp8A6lQkIpLBMigBjbQJNpM+NxERyXCJXAPdktTtaywiIhUikzrGRFmBiohIhlMnorLJoI9NREQyXakzUDNrEGfyypjH+R0eTUgiIpK+MieXSqQJ9xtgO2ApwSeUC/xuZguAC9x9QvThiYiIpKZEmnA/ALq7eyN3bwgcDQwCLgH+k4zgREQkvVgS/qWqRCrQDu4+vGDE3T8Eurj7GGCryCMTEZG0Y5YV+ZCqEmnCXWJmNwCvhuOnAEvNLBvIjzwyERGRFJZI1X4a0AIYDAwBtg+nZRM85k9ERDJe5ryPJZFH+S0CLitm9vRowhEREUkPidzGsjNwLdAydjl3Pyz6sEREJB2lcqefqCVyDfR14Cngv/z5blAREZEYqVWBhs8weI0g+ZsBnOzuS4uU2Q54AdiWoE9Pf3fvt6V1J3INNM/dn3T3r919QsGQwPIiIiIV7UbgE3dvQ/DWsBvjlMkDrnH3XYEDgEvNbLctrTiRCvQdM7vEzJqaWYOCIYHlRUSkikvB21h6AgPC3wcAxxUt4O6/u/s34e8rgWlA8y2tOJEm3LPCn9fFTHNgxwTWISIiUpG2Cd9fjbv/bmZNSipsZi2B9sDYLa04kV64rUpbVkREMlX010DNrDfQO2ZSf3fvHzP/Y4Lrl0XdkuB2tgbeBK509xVbKr/FCtTMDnP3T83s+Hjz3f2tRAIUERFJRFhZ9i9hftfi5pnZfDNrGmafTYEFxZSrTlB5vlTaeq00GehfgE+BY+PMc0AVqIiIACl5G8tQgkuQ94c/hxQtYGYGPAtMc/e+pV2xuXtUQVYpZtY7tolAoqfPOPn0GVcMfc5/WrXh08grla2rH1bmWtnMGhK8+GR7YBZwkrsvMbNmwH/dvbuZHQx8AUzmz0fT3uzuw0pc95YqUDO7uqT5idTW6cTMxrt7h8qOoyrTZ5x8+owrhj7nP6VaBZpMpWnCrRP+bAt0JEiHIWjSHZmMoEREJF2l7ttTorbFCtTd7wIwsw+BfcJ7ZDCzOwmeTiQiIpJxErkPdHvgj5jxPwgejVRV6XpG8ukzTj59xhVDn3Mo6I+TGUrdicjMbiF4bdnbBL1v/wYMcvd7kxeeiIikk9V5IyO/Blq7WpeUrJUT6oVrZvsCB4ejI919YlKiEhGRtJRJFWgiTbgAk4DfC5Yzs+3dfVbUQYmISHpKwftAk6bU3aXM7DJgPvAR8C7wXvgz5ZhZSzM7rbLjADCzv5pZvKf/Y2arKjoeqZrM7HkzO7GE+f8tzdslJGBmd5rZteHv/zSzYp90I5krkQz0CqCtuy9OVjARagmcBrxcURs0s2runld0ursP5c9bfzKKmQ0GtgNygH7u3t/MzgNuAOYCPwPr3f0fZtaY4H2z24eLX+nuX1ZC2FWSu59f2TGkK3e/vbJjKElx3z2VJ3NuY0lkT2cDy5MVSGmY2Zlm9p2ZfWtmA4uedcdkdPcDnc1skpldZWY5ZvY/M5tsZhPN7NCw/NlmNtjM3jGzX83sH2Z2dVhmTMHr2systZl9YGYTzOwLM9slnP68mfU1s8+AfxcT89lm9nj4eyszG21m48zs7iR+VKniXHffF+gAXG5mzYHbCN631w3YJaZsP+Bhd+8InEDw4va0Ex5PE8xsavgAbMxslZndEx63Y8xsm3D682b2qJl9ZWa/FBzLZnaImb0bs87Hzezs8Pfbw+Nnipn1t1J2eTSzz82swxbi2cbM3g6nf2tmB4bTrw63N8XMrgyntTSzH8LMdoqZvWRmXc3sSzP72cz2C8vVNrPnwpgnmlnPcny2tc3svTC2KWZ2ipnNMLN/m9nX4bBTWLaxmb0ZbnecmR0UTr8zjOfz8DO/PGb9t5jZjxY8mLxtzPRN3zPh9u4ys2/C75NdYrb3UTj9aTObaWaNSrsf4fSO4bHwbbgvdazk767Xzewd4MMoP+fysiT8S1WJVKC/AJ+b2U3hH9TVtoWnFEXJzHYneLL+Ye6+N0FGXJwbgS/cvZ27PwxcCuDuewK9gAFmlhOW3YMgW90PuAdY4+7tgdHAmWGZ/sBlYWVwLfCfmG3tDHR192tKsRv9gCfDSmJeKcqnu8vN7FtgDEEm+ndghLsvcfcNFL6PuCvwuJlNIsjY65pZnaIrTANFTxoaArWBMeFxOxK4IKZ8U4KOeccQnPhtyePu3tHd9wBqhsslqrh4HiX4/9kb2AeYakHHwXOA/QlOfC4ws/Zh+Z0Ijum9CE6GTgv35Vrg5rDMLcCn4TF/KNDHzGqXIWaAo4C57r53uP8fhNNXuPt+wOPAI+G0kk7IdgGOJPibv8PMqof7eSrBa6yOJ3hoTHEWufs+wJPhvgLcEe7nPgR3Kmxf3MLx9sPMagCvAVeEn39XYC0lf3d1As5y98OI9nOWUkqkAp1FcP2zBsHTiQqGinIY8Ia7LwJw9yUJLHswMDBc7gdgJkHFB/CZu69094UEGfY74fTJQEsLXm9zIPB6+OX+NMGXXoHX3X1jKeM4CHgl/H1gAvGnHTM7hOBLoFP4hTAR+LGERbLCsu3CoXnBQzvSTNGThjYE90wXZJQTKHz/9GB3z3f374FtSrH+Q81srJlNJvib2L0MMRYXz2EElQLuvtHdlxP87bzt7qvdfRXByyM6h+V/dffJ7p4PTAU+8aBb/+SYdR4B3Bj+7XxO0JxfUuVSkslA1zDj7BzGB3/+Tb1CUKlAySdk77n7+vC7ZAHB59453M814WusSrrsUvACjdjP7mDgVQB3/wBYmuB+tAV+d/dx4TpWhM2yJX13fRTzPRjl51wuZhb5kKoSeR9owROJarv76uSFVCwjuP80Vh7hSYAFn3KNEpYtzvqY3/NjxvMJPp8sYJm7tytm+UQ/i0x5en89YKm7rwmbuQ4AngH+Ymb1gZUEmcHksPyHwD+APgBm1s7dJ1V41OVQ5KRhjZl9TvBFtsH/vF9sI4X/7mKPv4LjdNNxHcoJ159D0PrRwd1nW/A0sBwSV1I8RZXnb6dg+RPcvaSTp1Jx95/CTLE7cJ8FT0eDwn9TBb8XnJCtjV1H+GUcG3fs/pf2b7Ng+dhlS/0tX8x+DC5m+yWtN/a7J7LPWUovkV64nczse2BaOL63mf1nC4tF6RPg5LBJDAuuT84A9g3n9wSqh7+vpHB2PBI4PVxuZ4Izs1IdaOHZ6K9mdlK4vJnZ3mXchy8JmokoiKcK+wCoZmbfAXcTZGS/AfcSvOn9Y+B7/ryufjnQwYJr3N8DF1V8yOUW76ShLGYCu5nZVmZWDzg8nF5QWS4KW0aK7XVbRp8AFwOYWbaZ1SX42znOzGqFTYJ/I3hrRWkNBy4LT3CJaf5NmAVvz1jj7i8CDxI0MwOcEvNzdPh7wQlZwbLttrD6kcDfzKxmmKnGe31jSUYRPGgGMzsCqF9cwWL24wegmZl1DMvUMbNqlP67K7LPufwsCUNqSqQX7iME1w2GArj7t2bWJRlBxePuU83sHmCEmW0kaBK8ARhiZl8T/PEXnJF9B+SFTWnPE5y1PxU2e+UBZ7v7+gSaBk4HnjSzWwkq6VeBb8uwG1cAL5vZFQQvbq2y3H09cHTR6Ra8taJ/+OXwNsEXHWFz2ilFy6eZD4CLwpOGHwlOGhIWZpeDCI7jnwmOddx9mZk9Q5C1zwDGRRF0jCuAgp7SG4GL3X20mT0PfB2W+a+7TzSzlqVc590E3x3fhV/uMyjbdVuAPQmu7eUDGwgq+zeArcxsLEFC0CsseznwRPh/UVARFXtS5u7fmNlrBPe6zySxkwSAu4BXLOgQNILgfvniLkFsth/u/ke47GNmVpPg+mdXSv/dFeXnLKWUyKP8xrr7/mY2Mexkg5l9G17fEikVM3uQ4Ishh6DyvMJLexCKFGFmMwiatBdVchxbARvdPc/MOhF0FmxXmTFVlvUbv47873mr7P1SMg1NJAOdbUG3dregx9jlhM25IqXl7tduuZRI2tkeGGRmWQSdtC7YQvkqLCXruqRIJANtRNA1vCtBU8lwguwhHR6skHRmdg6b31rzpbtfWhnxSGYys7eBVkUm3+DuwysjnkwW9tf4JM6sw6vy9+b6jeOSkIF2TMlaOaGHyYuIiJTkj/zxkVcqNbI6pGQFmkgv3B0teGLPQjNbYGZDzGzHZAYnIiKSqhJ5kMLLwCCChwg0I3iKzCslLiEiIhkmc25jSaQCNXcf6O554fAimfNQABERKQUjK/IhVSXSC/czC17L9SpBxXkK8F74QINEH60nIiKS1hLphftrzGjBQgW5tbu7roeKiGS4DfmTIm+ZrJ7VLiXbcRPJjW8A9nb3VsD/CJ7Ec4K7t1LlKSIimSaRCvRWd19hZgcTvMvxecI3N4iIiIDeB1qcgld29QCecvchFP/2ExERyUBleV3ZloZUlUgF+puZPU3wxoFh4bMfU7d7lIiISBIl0omoFsGb1Ce7+89m1hTY090/3MKiIiKSITb6lMg7EWXbHimZhupRfiIiEplMqkATuQ9URESkRKnc6SdquoYpIiJSBspARUQkQpmTgaoCFRGRyKTybSdRUxOuiIhIGSgDFRGRCGVOXpY5eyoiIhIhZaAiIhKZTLqNRQ9SEBERKQM14YqIiJSBKlAREZEyUAUqIiJSBqpARUREykAVqIiISBmoAhURESmD/wcAN8LwXgotAQAAAABJRU5ErkJggg==\n"},"metadata":{"needs_background":"light"}}]},{"metadata":{},"cell_type":"markdown","source":"# IV. EXPLORATORY DATA ANALYSIS "},{"metadata":{},"cell_type":"markdown","source":"We'll start by writing some plotting functions"},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_dist(feature, binsize):\n \n hist_data = [df[feature]]\n group_labels = [feature]\n colors = ['#41d9b3']\n\n fig = ff.create_distplot(hist_data, group_labels, colors = colors, show_hist = True, bin_size = binsize, curve_type='kde')\n \n fig['layout'].update(title = feature.upper())\n\n py.iplot(fig, filename = 'Distribution_plot')","execution_count":8,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_hist(feature):\n\n fig = px.histogram(df, x=feature)\n fig['layout'].update(title = feature.upper())\n fig.show()","execution_count":9,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## IVa. UNIVARIATE EXPLORATION\n\nLets take a look at the distribution of our continuous variables"},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_dist('age', 0)","execution_count":10,"outputs":[{"output_type":"display_data","data":{"text/html":" \n "},"metadata":{}},{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_dist('annual_income',0)","execution_count":11,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_dist('spending_score',0)","execution_count":12,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"#### We'll use bar and pie plots to visualize categorical variables"},{"metadata":{},"cell_type":"markdown","source":"### GENDER COUNT AND PERCENTAGES"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_gender = df.groupby(['gender'])[['gender']].count()\ndf_gender.rename(columns={'gender':'count'}, inplace=True)\ndf_gender = df_gender.reset_index()\ndf_gender\n\nfig = make_subplots(rows=1, \n cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Gender Count\",\"Gender Percentages\"))\n\nbar_colors=['#c73062','#41d9b3']\npie_colors=['#c73062','#41d9b3']\n\nfig.add_trace(go.Bar(x=df_gender['gender'], \n y=df_gender['count'],\n text=df_gender['count'],\n textposition = 'auto',\n name='Gender Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=df_gender['gender'], \n values=df_gender['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Gender Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":33,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### AGE CATEGORY COUNT AND PERCENTAGES"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_age_cat = df.groupby(['age_cat'])[['age_cat']].count()\ndf_age_cat.rename(columns={'age_cat':'count'}, inplace=True)\ndf_age_cat = df_age_cat.reset_index()\ndf_age_cat.sort_values(by='count', ascending=False, inplace=True)\n\nfig = make_subplots(rows=1, \n cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Age Category Count\",\"Age Category Percentages\"))\n\nbar_colors=['#8fd8ff','#40b1ed', '#0075b3']\npie_colors=['#8fd8ff','#40b1ed', '#0075b3']\n\nfig.add_trace(go.Bar(x=df_age_cat['age_cat'], \n y=df_age_cat['count'],\n text=df_age_cat['count'],\n textposition = 'auto',\n name='Age Cateogry Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=df_age_cat['age_cat'], \n values=df_age_cat['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Age Category Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":32,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### INCOME CLASS COUNT AND PERCENTAGES"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_income = df.groupby(['income_class'])[['income_class']].count()\ndf_income.rename(columns={'income_class':'count'}, inplace=True)\ndf_income = df_income.reset_index()\ndf_income.sort_values(by='count', ascending=False, inplace=True)\n\nfig = make_subplots(rows=1, \n cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Income Class Count\",\"Income Class Percentages\"))\n\nbar_colors=['#29cf42', '#5fe373', '#9cf0a9', '#00ad1a']\npie_colors=['#29cf42', '#5fe373', '#9cf0a9', '#00ad1a']\n\nfig.add_trace(go.Bar(x=df_income['income_class'], \n y=df_income['count'],\n text=df_income['count'],\n textposition = 'auto',\n name='Income Class Count',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=df_income['income_class'], \n values=df_income['count'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Income Class Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":31,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"## IVb. BIVARIATE EXPLORATION"},{"metadata":{},"cell_type":"markdown","source":"### SPENDING SCORES BY GENDER"},{"metadata":{"trusted":true},"cell_type":"code","source":"gender_spend_sum = df.groupby(['gender'])[['spending_score']].sum().reset_index()\ngender_spend_avg = df.groupby(['gender'])[['spending_score']].mean().reset_index()\n\ngender_age_spend = df.groupby(['gender','age_cat'])[['spending_score']].sum().reset_index()\ngender_age_spend.sort_values(by='spending_score', ascending=False, inplace=True)","execution_count":16,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = px.histogram(df, \n x=\"spending_score\", \n color=\"gender\", \n marginal=\"box\", \n hover_data=df.columns,\n nbins = 50,\n color_discrete_sequence=['#41d9b3','#c73062'])\nfig.show()","execution_count":17,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = make_subplots(rows=2, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Spending Score Sums\", \"Spending Score Sum Percentages\",\n \"Spending Score Averages\", \"Spending Score Avg Percentages\"))\n\n\nbar_colors=['#c73062','#41d9b3']\npie_colors=['#c73062','#41d9b3']\n\nfig.add_trace(go.Bar(x=gender_spend_sum['gender'], \n y=gender_spend_sum['spending_score'],\n text=gender_spend_sum['spending_score'],\n textposition = 'auto',\n name='Spending Score Sums',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=gender_spend_avg['gender'], \n y=gender_spend_avg['spending_score'],\n text=gender_spend_avg['spending_score'].round(2),\n textposition = 'auto',\n name='Spending Score Averages',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\nfig.add_trace(go.Pie(labels=gender_spend_sum['gender'], \n values=gender_spend_sum['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Spending Score Sum Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.add_trace(go.Pie(labels=gender_spend_avg['gender'], \n values=gender_spend_avg['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Spending Score Avg Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.update_layout(height=800, showlegend=True)\n\nfig.show()","execution_count":30,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### SPENDING SCORE SUMS AND PERCENTAGES BY GENDER & AGE CATEGORY"},{"metadata":{"trusted":true},"cell_type":"code","source":"f_age_spend = gender_age_spend.loc[gender_age_spend['gender'] == 'Female']\nm_age_spend = gender_age_spend.loc[gender_age_spend['gender'] == 'Male']\n\nfig = make_subplots(rows=2, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Female Spending Score Sums\", \"Female Spending Score Percentages\",\n \"Male Spending Score Sums\", \"Male Spending Score Percentages\"))\n\nf_bar_colors=['#ff4d94','#cc0245', '#912a53']\nm_bar_colors=['#6ecaff','#0687d1', '#0e5680']\nf_pie_colors=['#ff4d94','#cc0245', '#912a53']\nm_pie_colors=['#6ecaff','#0687d1', '#0e5680']\n\nfig.add_trace(go.Bar(x=f_age_spend['age_cat'], \n y=f_age_spend['spending_score'],\n text=f_age_spend['spending_score'],\n textposition = 'auto',\n name='Female Spending Score Sums',\n opacity = 0.8, \n marker=dict(color=f_bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=m_age_spend['age_cat'], \n y=m_age_spend['spending_score'],\n text=m_age_spend['spending_score'],\n textposition = 'auto',\n name='Male Spending Score Sums',\n opacity = 0.8, \n marker=dict(color=m_bar_colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\nfig.add_trace(go.Pie(labels=f_age_spend['age_cat'], \n values=f_age_spend['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Female Spending Score Percent\",\n marker = dict(colors = f_pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\nfig.add_trace(go.Pie(labels=m_age_spend['age_cat'], \n values=m_age_spend['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Male Spending Score Percent\",\n marker = dict(colors = m_pie_colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.update_layout(height=800, showlegend=True)\n\nfig.show()","execution_count":29,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### SPENDING SCORE VS AGE"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = px.scatter(df, x=\"spending_score\", y=\"age\", color='gender')\nfig.show()","execution_count":20,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"spending_y = df[['spending_score']].loc[df['age_cat'] == 'young adult']\nspending_m = df[['spending_score']].loc[df['age_cat'] == 'middle age']\nspending_s = df[['spending_score']].loc[df['age_cat'] == 'senior adult']\n\nyoung = spending_y['spending_score']\nmiddle = spending_m['spending_score']\nsenior = spending_s['spending_score']\n \nhist_data = [young, middle, senior]\n \ngroup_labels = ['young adult', 'middle age', 'senior adult']\ncolors = ['#e8b920','#2aa8a8', '#e8204b']\n\nfig = ff.create_distplot(hist_data, group_labels, colors = colors, show_hist = True, bin_size = 0, curve_type='kde')\n \nfig['layout'].update(title = 'SPENDING SCORE x AGE CATEGORY')\n\nfig.show()\n\n# py.iplot(fig, filename = 'Density plot')","execution_count":21,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### SPENDING SCORE VS ANNUAL INCOME"},{"metadata":{"trusted":true},"cell_type":"code","source":"income_spend_sum = df.groupby(['income_class'])[['spending_score']].sum().reset_index()\nincome_spend_avg = df.groupby(['income_class'])[['spending_score']].mean().reset_index()\nincome_spend_avg","execution_count":22,"outputs":[{"output_type":"execute_result","execution_count":22,"data":{"text/plain":" income_class spending_score\n0 lower middle 50.333333\n1 middle 50.339623\n2 poor 49.656250\n3 upper middle 49.625000","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
income_classspending_score
0lower middle50.333333
1middle50.339623
2poor49.656250
3upper middle49.625000
\n
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = px.scatter(df, x=\"spending_score\", y=\"annual_income\", color='age_cat')\nfig.show()","execution_count":23,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### SPENDING SCORE SUMS & PERCENTAGES BY INCOME CLASS"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = make_subplots(rows=2, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}], \n [{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Spending Score Sums\", \"Spending Score Sum Percentages\",\n \"Spending Score Averages\", \"Spending Score Avg Percentages\"))\n\nbar_colors=['#29cf42', '#5fe373', '#9cf0a9', '#00ad1a']\npie_colors=['#29cf42', '#5fe373', '#9cf0a9', '#00ad1a']\n\nfig.add_trace(go.Bar(x=income_spend_sum['income_class'], \n y=income_spend_sum['spending_score'],\n text=income_spend_sum['spending_score'],\n textposition = 'auto',\n name='Spending Score Sums',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Bar(x=income_spend_avg['income_class'], \n y=income_spend_avg['spending_score'],\n text=income_spend_avg['spending_score'].round(2),\n textposition = 'auto',\n name='Spending Score Averages',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=2, col=1)\n\n\nfig.add_trace(go.Pie(labels=income_spend_sum['income_class'], \n values=income_spend_sum['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Income Class Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\n\nfig.add_trace(go.Pie(labels=income_spend_avg['income_class'], \n values=income_spend_avg['spending_score'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Income Class Percent\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=2, col=2)\n\nfig.update_layout(height=800, showlegend=True)\n\nfig.show()","execution_count":35,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### INCOME X AGE"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = px.scatter(df, x=\"age\", y=\"annual_income\", color='income_class')\nfig.show()","execution_count":25,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"age_income_avg = df.groupby(['age_cat'])[['annual_income']].mean().reset_index()\n\nfig = make_subplots(rows=1, cols=2, \n specs=[[{\"type\": \"xy\"}, {\"type\": \"domain\"}]], \n subplot_titles=(\"Income Averages\", \"Income Percentages\"))\n\n\nbar_colors=['#4c98a1','#2aa8a8', '#006e6e']\npie_colors=['#4c98a1','#2aa8a8', '#006e6e']\n\nfig.add_trace(go.Bar(x=age_income_avg['age_cat'], \n y=age_income_avg['annual_income'],\n text=age_income_avg['annual_income'].round(2),\n textposition = 'auto',\n name='Income Averages',\n opacity = 0.8, \n marker=dict(color=bar_colors, line=dict(color='#000000',width=1))), row=1, col=1)\n\nfig.add_trace(go.Pie(labels=age_income_avg['age_cat'], \n values=age_income_avg['annual_income'],\n textfont=dict(size=15), opacity = 0.8,\n hole = 0.5, \n hoverinfo = \"label+percent+name\",\n domain = dict(x = [.0,.48]),\n name = \"Income Percentages\",\n marker = dict(colors = pie_colors, line = dict(width = 1.5))), \n row=1, col=2)\n\n\n\nfig.update_layout(height=500, showlegend=True)\n\nfig.show()","execution_count":27,"outputs":[{"output_type":"display_data","data":{"text/html":"
"},"metadata":{}}]}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.7.9","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":4}