2541 lines
2.6 MiB
Plaintext
2541 lines
2.6 MiB
Plaintext
|
{
|
|||
|
"cells": [
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "b9181d5d",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.022276,
|
|||
|
"end_time": "2022-08-28T13:50:03.958617",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:03.936341",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# Section of the Notebook"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "72dd993b",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021173,
|
|||
|
"end_time": "2022-08-28T13:50:04.002367",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:03.981194",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"1) **Choice of Metrics** \n",
|
|||
|
"2) **Library import & Dataset** \n",
|
|||
|
"3.1) **Feature generation** \n",
|
|||
|
"3.2) **Data cleaning** \n",
|
|||
|
"3.3) **Data scaling (Normalization | Standardization)** \n",
|
|||
|
"4) **Dimensionality reduction** \n",
|
|||
|
"5) **Clustering** \n",
|
|||
|
"6) **Business Recommendations** "
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "25ec315a",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021734,
|
|||
|
"end_time": "2022-08-28T13:50:04.045639",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:04.023905",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Selection of Metrics"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "99948a3c",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021363,
|
|||
|
"end_time": "2022-08-28T13:50:04.088385",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:04.067022",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"There are various metrics for clustering, for example:\n",
|
|||
|
"* Silhouette coefficient \n",
|
|||
|
"* Calinski-Harabasz Index \n",
|
|||
|
"* Davies-Bouldin Index"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "900f1f40",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021263,
|
|||
|
"end_time": "2022-08-28T13:50:04.131480",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:04.110217",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "2f870b78",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021887,
|
|||
|
"end_time": "2022-08-28T13:50:04.174852",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:04.152965",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Importing Libraries and Dataset"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 5,
|
|||
|
"id": "36d8e078",
|
|||
|
"metadata": {},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"^C\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"!conda install seaborn"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 7,
|
|||
|
"id": "1fbdee6d",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:04.222093Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:04.220859Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.209795Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.208214Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 3.016161,
|
|||
|
"end_time": "2022-08-28T13:50:07.212927",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:04.196766",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"import numpy as np\n",
|
|||
|
"import pandas as pd \n",
|
|||
|
"import matplotlib.pyplot as plt\n",
|
|||
|
"import seaborn as sns\n",
|
|||
|
"import plotly.express as px\n",
|
|||
|
"import sklearn\n",
|
|||
|
"from sklearn.preprocessing import MinMaxScaler\n",
|
|||
|
"from sklearn.metrics import silhouette_score\n",
|
|||
|
"from sklearn.metrics import silhouette_samples\n",
|
|||
|
"from sklearn.decomposition import PCA\n",
|
|||
|
"from sklearn.cluster import KMeans, AgglomerativeClustering, SpectralClustering, DBSCAN\n",
|
|||
|
"from datetime import datetime\n",
|
|||
|
"import warnings\n",
|
|||
|
"import sys\n",
|
|||
|
"import os"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 22,
|
|||
|
"id": "db39198d",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.260113Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.259192Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.297684Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.296601Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.065015,
|
|||
|
"end_time": "2022-08-28T13:50:07.300452",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.235437",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"df = pd.read_csv('marketing_campaign.csv')"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 39,
|
|||
|
"id": "d4a47db8",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.347340Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.346437Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.387384Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.385894Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.068972,
|
|||
|
"end_time": "2022-08-28T13:50:07.391082",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.322110",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"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>ID</th>\n",
|
|||
|
" <th>Year_Birth</th>\n",
|
|||
|
" <th>Education</th>\n",
|
|||
|
" <th>Marital_Status</th>\n",
|
|||
|
" <th>Income</th>\n",
|
|||
|
" <th>Kidhome</th>\n",
|
|||
|
" <th>Teenhome</th>\n",
|
|||
|
" <th>Dt_Customer</th>\n",
|
|||
|
" <th>Recency</th>\n",
|
|||
|
" <th>MntWines</th>\n",
|
|||
|
" <th>...</th>\n",
|
|||
|
" <th>AcceptedCmp3</th>\n",
|
|||
|
" <th>AcceptedCmp4</th>\n",
|
|||
|
" <th>AcceptedCmp5</th>\n",
|
|||
|
" <th>AcceptedCmp1</th>\n",
|
|||
|
" <th>AcceptedCmp2</th>\n",
|
|||
|
" <th>Complain</th>\n",
|
|||
|
" <th>Z_CostContact</th>\n",
|
|||
|
" <th>Z_Revenue</th>\n",
|
|||
|
" <th>Response</th>\n",
|
|||
|
" <th>Age</th>\n",
|
|||
|
" </tr>\n",
|
|||
|
" </thead>\n",
|
|||
|
" <tbody>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>0</th>\n",
|
|||
|
" <td>5524</td>\n",
|
|||
|
" <td>1957</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Single</td>\n",
|
|||
|
" <td>58138.0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>4/9/2012</td>\n",
|
|||
|
" <td>58</td>\n",
|
|||
|
" <td>635</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>65</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>1</th>\n",
|
|||
|
" <td>2174</td>\n",
|
|||
|
" <td>1954</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Single</td>\n",
|
|||
|
" <td>46344.0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>8/3/2014</td>\n",
|
|||
|
" <td>38</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>68</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>2</th>\n",
|
|||
|
" <td>4141</td>\n",
|
|||
|
" <td>1965</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Together</td>\n",
|
|||
|
" <td>71613.0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>21-08-2013</td>\n",
|
|||
|
" <td>26</td>\n",
|
|||
|
" <td>426</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>57</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>3</th>\n",
|
|||
|
" <td>6182</td>\n",
|
|||
|
" <td>1984</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Together</td>\n",
|
|||
|
" <td>26646.0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>10/2/2014</td>\n",
|
|||
|
" <td>26</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>38</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>4</th>\n",
|
|||
|
" <td>5324</td>\n",
|
|||
|
" <td>1981</td>\n",
|
|||
|
" <td>PhD</td>\n",
|
|||
|
" <td>Married</td>\n",
|
|||
|
" <td>58293.0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>19-01-2014</td>\n",
|
|||
|
" <td>94</td>\n",
|
|||
|
" <td>173</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>41</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>...</th>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>95</th>\n",
|
|||
|
" <td>7516</td>\n",
|
|||
|
" <td>1983</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Married</td>\n",
|
|||
|
" <td>30096.0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>22-05-2014</td>\n",
|
|||
|
" <td>30</td>\n",
|
|||
|
" <td>5</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>39</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>96</th>\n",
|
|||
|
" <td>7247</td>\n",
|
|||
|
" <td>1960</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Widow</td>\n",
|
|||
|
" <td>47916.0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>22-11-2012</td>\n",
|
|||
|
" <td>72</td>\n",
|
|||
|
" <td>505</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>62</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>97</th>\n",
|
|||
|
" <td>11100</td>\n",
|
|||
|
" <td>1972</td>\n",
|
|||
|
" <td>Graduation</td>\n",
|
|||
|
" <td>Divorced</td>\n",
|
|||
|
" <td>51813.0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>11/4/2013</td>\n",
|
|||
|
" <td>37</td>\n",
|
|||
|
" <td>51</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>50</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>98</th>\n",
|
|||
|
" <td>4646</td>\n",
|
|||
|
" <td>1951</td>\n",
|
|||
|
" <td>2n Cycle</td>\n",
|
|||
|
" <td>Married</td>\n",
|
|||
|
" <td>78497.0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>1/12/2013</td>\n",
|
|||
|
" <td>44</td>\n",
|
|||
|
" <td>207</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>1</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>71</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" <tr>\n",
|
|||
|
" <th>99</th>\n",
|
|||
|
" <td>3037</td>\n",
|
|||
|
" <td>1983</td>\n",
|
|||
|
" <td>PhD</td>\n",
|
|||
|
" <td>Married</td>\n",
|
|||
|
" <td>50150.0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>20-06-2013</td>\n",
|
|||
|
" <td>32</td>\n",
|
|||
|
" <td>135</td>\n",
|
|||
|
" <td>...</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>3</td>\n",
|
|||
|
" <td>11</td>\n",
|
|||
|
" <td>0</td>\n",
|
|||
|
" <td>39</td>\n",
|
|||
|
" </tr>\n",
|
|||
|
" </tbody>\n",
|
|||
|
"</table>\n",
|
|||
|
"<p>100 rows × 30 columns</p>\n",
|
|||
|
"</div>"
|
|||
|
],
|
|||
|
"text/plain": [
|
|||
|
" ID Year_Birth Education Marital_Status Income Kidhome Teenhome \\\n",
|
|||
|
"0 5524 1957 Graduation Single 58138.0 0 0 \n",
|
|||
|
"1 2174 1954 Graduation Single 46344.0 1 1 \n",
|
|||
|
"2 4141 1965 Graduation Together 71613.0 0 0 \n",
|
|||
|
"3 6182 1984 Graduation Together 26646.0 1 0 \n",
|
|||
|
"4 5324 1981 PhD Married 58293.0 1 0 \n",
|
|||
|
".. ... ... ... ... ... ... ... \n",
|
|||
|
"95 7516 1983 Graduation Married 30096.0 1 0 \n",
|
|||
|
"96 7247 1960 Graduation Widow 47916.0 0 1 \n",
|
|||
|
"97 11100 1972 Graduation Divorced 51813.0 1 1 \n",
|
|||
|
"98 4646 1951 2n Cycle Married 78497.0 0 0 \n",
|
|||
|
"99 3037 1983 PhD Married 50150.0 0 0 \n",
|
|||
|
"\n",
|
|||
|
" Dt_Customer Recency MntWines ... AcceptedCmp3 AcceptedCmp4 \\\n",
|
|||
|
"0 4/9/2012 58 635 ... 0 0 \n",
|
|||
|
"1 8/3/2014 38 11 ... 0 0 \n",
|
|||
|
"2 21-08-2013 26 426 ... 0 0 \n",
|
|||
|
"3 10/2/2014 26 11 ... 0 0 \n",
|
|||
|
"4 19-01-2014 94 173 ... 0 0 \n",
|
|||
|
".. ... ... ... ... ... ... \n",
|
|||
|
"95 22-05-2014 30 5 ... 0 0 \n",
|
|||
|
"96 22-11-2012 72 505 ... 0 1 \n",
|
|||
|
"97 11/4/2013 37 51 ... 0 0 \n",
|
|||
|
"98 1/12/2013 44 207 ... 0 0 \n",
|
|||
|
"99 20-06-2013 32 135 ... 0 0 \n",
|
|||
|
"\n",
|
|||
|
" AcceptedCmp5 AcceptedCmp1 AcceptedCmp2 Complain Z_CostContact \\\n",
|
|||
|
"0 0 0 0 0 3 \n",
|
|||
|
"1 0 0 0 0 3 \n",
|
|||
|
"2 0 0 0 0 3 \n",
|
|||
|
"3 0 0 0 0 3 \n",
|
|||
|
"4 0 0 0 0 3 \n",
|
|||
|
".. ... ... ... ... ... \n",
|
|||
|
"95 0 0 0 0 3 \n",
|
|||
|
"96 0 0 0 0 3 \n",
|
|||
|
"97 0 0 0 0 3 \n",
|
|||
|
"98 0 1 0 0 3 \n",
|
|||
|
"99 0 0 0 0 3 \n",
|
|||
|
"\n",
|
|||
|
" Z_Revenue Response Age \n",
|
|||
|
"0 11 1 65 \n",
|
|||
|
"1 11 0 68 \n",
|
|||
|
"2 11 0 57 \n",
|
|||
|
"3 11 0 38 \n",
|
|||
|
"4 11 0 41 \n",
|
|||
|
".. ... ... ... \n",
|
|||
|
"95 11 0 39 \n",
|
|||
|
"96 11 0 62 \n",
|
|||
|
"97 11 0 50 \n",
|
|||
|
"98 11 0 71 \n",
|
|||
|
"99 11 0 39 \n",
|
|||
|
"\n",
|
|||
|
"[100 rows x 30 columns]"
|
|||
|
]
|
|||
|
},
|
|||
|
"execution_count": 39,
|
|||
|
"metadata": {},
|
|||
|
"output_type": "execute_result"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"df.head(100)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "c9694fd0",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021969,
|
|||
|
"end_time": "2022-08-28T13:50:07.434882",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.412913",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# Features:\n",
|
|||
|
"______________________________________________________________________________________________________________\n",
|
|||
|
"### People\n",
|
|||
|
"\n",
|
|||
|
"* ID: Customer's unique identifier \n",
|
|||
|
"* Year_Birth: Customer's birth year \n",
|
|||
|
"* Education: Customer's education level \n",
|
|||
|
"* Marital_Status: Customer's marital status \n",
|
|||
|
"* Income: Customer's yearly household income \n",
|
|||
|
"* Kidhome: Number of children in customer's household \n",
|
|||
|
"* Teenhome: Number of teenagers in customer's household \n",
|
|||
|
"* Dt_Customer: Date of customer's enrollment with the company \n",
|
|||
|
"* Recency: Number of days since customer's last purchase \n",
|
|||
|
"* Complain: 1 if the customer complained in the last 2 years, 0 otherwise \n",
|
|||
|
"\n",
|
|||
|
"### Products\n",
|
|||
|
"\n",
|
|||
|
"* MntWines: Amount spent on wine in last 2 years\n",
|
|||
|
"* MntFruits: Amount spent on fruits in last 2 years\n",
|
|||
|
"* MntMeatProducts: Amount spent on meat in last 2 years\n",
|
|||
|
"* MntFishProducts: Amount spent on fish in last 2 years\n",
|
|||
|
"* MntSweetProducts: Amount spent on sweets in last 2 years\n",
|
|||
|
"* MntGoldProds: Amount spent on gold in last 2 years\n",
|
|||
|
"\n",
|
|||
|
"### Promotion\n",
|
|||
|
"\n",
|
|||
|
"* NumDealsPurchases: Number of purchases made with a discount\n",
|
|||
|
"* AcceptedCmp1: 1 if customer accepted the offer in the 1st campaign, 0 otherwise\n",
|
|||
|
"* AcceptedCmp2: 1 if customer accepted the offer in the 2nd campaign, 0 otherwise\n",
|
|||
|
"* AcceptedCmp3: 1 if customer accepted the offer in the 3rd campaign, 0 otherwise\n",
|
|||
|
"* AcceptedCmp4: 1 if customer accepted the offer in the 4th campaign, 0 otherwise\n",
|
|||
|
"* AcceptedCmp5: 1 if customer accepted the offer in the 5th campaign, 0 otherwise\n",
|
|||
|
"* Response: 1 if customer accepted the offer in the last campaign, 0 otherwise\n",
|
|||
|
"\n",
|
|||
|
"### Place\n",
|
|||
|
"\n",
|
|||
|
"* NumWebPurchases: Number of purchases made through the company’s website\n",
|
|||
|
"* NumCatalogPurchases: Number of purchases made using a catalogue\n",
|
|||
|
"* NumStorePurchases: Number of purchases made directly in stores\n",
|
|||
|
"* NumWebVisitsMonth: Number of visits to company’s website in the last month\n",
|
|||
|
"______________________________________________________________________________________________________________\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 25,
|
|||
|
"id": "f0dbda9a",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.482194Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.480839Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.511325Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.509843Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.057434,
|
|||
|
"end_time": "2022-08-28T13:50:07.514712",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.457278",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"<class 'pandas.core.frame.DataFrame'>\n",
|
|||
|
"RangeIndex: 2240 entries, 0 to 2239\n",
|
|||
|
"Data columns (total 29 columns):\n",
|
|||
|
" # Column Non-Null Count Dtype \n",
|
|||
|
"--- ------ -------------- ----- \n",
|
|||
|
" 0 ID 2240 non-null int64 \n",
|
|||
|
" 1 Year_Birth 2240 non-null int64 \n",
|
|||
|
" 2 Education 2240 non-null object \n",
|
|||
|
" 3 Marital_Status 2240 non-null object \n",
|
|||
|
" 4 Income 2216 non-null float64\n",
|
|||
|
" 5 Kidhome 2240 non-null int64 \n",
|
|||
|
" 6 Teenhome 2240 non-null int64 \n",
|
|||
|
" 7 Dt_Customer 2240 non-null object \n",
|
|||
|
" 8 Recency 2240 non-null int64 \n",
|
|||
|
" 9 MntWines 2240 non-null int64 \n",
|
|||
|
" 10 MntFruits 2240 non-null int64 \n",
|
|||
|
" 11 MntMeatProducts 2240 non-null int64 \n",
|
|||
|
" 12 MntFishProducts 2240 non-null int64 \n",
|
|||
|
" 13 MntSweetProducts 2240 non-null int64 \n",
|
|||
|
" 14 MntGoldProds 2240 non-null int64 \n",
|
|||
|
" 15 NumDealsPurchases 2240 non-null int64 \n",
|
|||
|
" 16 NumWebPurchases 2240 non-null int64 \n",
|
|||
|
" 17 NumCatalogPurchases 2240 non-null int64 \n",
|
|||
|
" 18 NumStorePurchases 2240 non-null int64 \n",
|
|||
|
" 19 NumWebVisitsMonth 2240 non-null int64 \n",
|
|||
|
" 20 AcceptedCmp3 2240 non-null int64 \n",
|
|||
|
" 21 AcceptedCmp4 2240 non-null int64 \n",
|
|||
|
" 22 AcceptedCmp5 2240 non-null int64 \n",
|
|||
|
" 23 AcceptedCmp1 2240 non-null int64 \n",
|
|||
|
" 24 AcceptedCmp2 2240 non-null int64 \n",
|
|||
|
" 25 Complain 2240 non-null int64 \n",
|
|||
|
" 26 Z_CostContact 2240 non-null int64 \n",
|
|||
|
" 27 Z_Revenue 2240 non-null int64 \n",
|
|||
|
" 28 Response 2240 non-null int64 \n",
|
|||
|
"dtypes: float64(1), int64(25), object(3)\n",
|
|||
|
"memory usage: 507.6+ KB\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"df.info()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 26,
|
|||
|
"id": "f7586411",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.561859Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.561390Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.567743Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.566238Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.03321,
|
|||
|
"end_time": "2022-08-28T13:50:07.570611",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.537401",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Size of Dataset: (2240, 29)\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"print(f'Size of Dataset: {df.shape}')"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 29,
|
|||
|
"id": "f264ddf4",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.617293Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.616780Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.621925Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.620972Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.031732,
|
|||
|
"end_time": "2022-08-28T13:50:07.624479",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.592747",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"# warnings are ignored.\n",
|
|||
|
"warnings.filterwarnings('ignore') "
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "c2c96568",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"### Optimize the memory usage (optional)\n",
|
|||
|
"\n",
|
|||
|
"* The dataframe entirely can be heavy of memory as it conists of all the dataset along with datatypes that can be reduced to fit with approriate data types."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 7,
|
|||
|
"id": "d9a8233c",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.672093Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.671209Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.685753Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.684290Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.041657,
|
|||
|
"end_time": "2022-08-28T13:50:07.688614",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.646957",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"def reduce_mem_usage(df: pd.DataFrame) -> pd.DataFrame:\n",
|
|||
|
" \"\"\"Iterate through all the columns of a dataframe and modify the data type\n",
|
|||
|
" to reduce memory usage\"\"\"\n",
|
|||
|
" \n",
|
|||
|
" start_mem = df.memory_usage().sum() / 1024**2\n",
|
|||
|
" print('Memory usage of DataFrame is {:.2f} MB'.format(start_mem))\n",
|
|||
|
" \n",
|
|||
|
" for col in df.columns:\n",
|
|||
|
" col_type = df[col].dtype\n",
|
|||
|
" \n",
|
|||
|
" if col_type != object:\n",
|
|||
|
" c_min = df[col].min()\n",
|
|||
|
" c_max = df[col].max()\n",
|
|||
|
" if str(col_type)[:3] == 'int':\n",
|
|||
|
" if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n",
|
|||
|
" df[col] = df[col].astype(np.int8)\n",
|
|||
|
" elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n",
|
|||
|
" df[col] = df[col].astype(np.int16)\n",
|
|||
|
" elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n",
|
|||
|
" df[col] = df[col].astype(np.int32)\n",
|
|||
|
" elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n",
|
|||
|
" df[col] = df[col].astype(np.int64) \n",
|
|||
|
" else:\n",
|
|||
|
" if c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n",
|
|||
|
" df[col] = df[col].astype(np.float32)\n",
|
|||
|
" else:\n",
|
|||
|
" df[col] = df[col].astype(np.float64)\n",
|
|||
|
" else:\n",
|
|||
|
" df[col] = df[col].astype('category')\n",
|
|||
|
"\n",
|
|||
|
" end_mem = df.memory_usage().sum() / 1024**2\n",
|
|||
|
" print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n",
|
|||
|
" print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n",
|
|||
|
" \n",
|
|||
|
" return df"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 8,
|
|||
|
"id": "dddb9771",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.736125Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.735629Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.767871Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.765951Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.059641,
|
|||
|
"end_time": "2022-08-28T13:50:07.770647",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.711006",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"Memory usage of DataFrame is 0.50 MB\n",
|
|||
|
"Memory usage after optimization is: 0.11 MB\n",
|
|||
|
"Decreased by 78.0%\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"df = reduce_mem_usage(df)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "d8c840c5",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.022941,
|
|||
|
"end_time": "2022-08-28T13:50:07.816120",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.793179",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## 3.1) Feature generation"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 37,
|
|||
|
"id": "66231ffd",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.866854Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.865910Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.875389Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.874066Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.038343,
|
|||
|
"end_time": "2022-08-28T13:50:07.878640",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.840297",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"# Age of the Customer\n",
|
|||
|
"df['Age'] = datetime.now().year - df['Year_Birth'] "
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 38,
|
|||
|
"id": "6d70dd7b",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:07.927656Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:07.927187Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:07.955447Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:07.954213Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.056185,
|
|||
|
"end_time": "2022-08-28T13:50:07.958468",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.902283",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"ename": "ValueError",
|
|||
|
"evalue": "time data '4/9/2012' does not match format '%d-%m-%Y' (match)",
|
|||
|
"output_type": "error",
|
|||
|
"traceback": [
|
|||
|
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
|||
|
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:510\u001b[0m, in \u001b[0;36m_to_datetime_with_format\u001b[1;34m(arg, orig_arg, name, tz, fmt, exact, errors, infer_datetime_format)\u001b[0m\n\u001b[0;32m 509\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 510\u001b[0m values, tz \u001b[38;5;241m=\u001b[39m \u001b[43mconversion\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdatetime_to_datetime64\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 511\u001b[0m dta \u001b[38;5;241m=\u001b[39m DatetimeArray(values, dtype\u001b[38;5;241m=\u001b[39mtz_to_dtype(tz))\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\_libs\\tslibs\\conversion.pyx:360\u001b[0m, in \u001b[0;36mpandas._libs.tslibs.conversion.datetime_to_datetime64\u001b[1;34m()\u001b[0m\n",
|
|||
|
"\u001b[1;31mTypeError\u001b[0m: Unrecognized value type: <class 'str'>",
|
|||
|
"\nDuring handling of the above exception, another exception occurred:\n",
|
|||
|
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
|
|||
|
"Input \u001b[1;32mIn [38]\u001b[0m, in \u001b[0;36m<cell line: 6>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m current_year \u001b[38;5;241m=\u001b[39m datetime\u001b[38;5;241m.\u001b[39mnow()\u001b[38;5;241m.\u001b[39myear\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m current_year \u001b[38;5;241m-\u001b[39m registration_year\n\u001b[1;32m----> 6\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mYears_Since_Registration\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43mget_different_year\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
|
|||
|
"Input \u001b[1;32mIn [38]\u001b[0m, in \u001b[0;36mget_different_year\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_different_year\u001b[39m():\n\u001b[1;32m----> 2\u001b[0m registration_year \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_datetime\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mDt_Customer\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;132;43;01m%d\u001b[39;49;00m\u001b[38;5;124;43m-\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mm-\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mY\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m x: x\u001b[38;5;241m.\u001b[39myear)\n\u001b[0;32m 3\u001b[0m current_year \u001b[38;5;241m=\u001b[39m datetime\u001b[38;5;241m.\u001b[39mnow()\u001b[38;5;241m.\u001b[39myear\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m current_year \u001b[38;5;241m-\u001b[39m registration_year\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:1051\u001b[0m, in \u001b[0;36mto_datetime\u001b[1;34m(arg, errors, dayfirst, yearfirst, utc, format, exact, unit, infer_datetime_format, origin, cache)\u001b[0m\n\u001b[0;32m 1049\u001b[0m result \u001b[38;5;241m=\u001b[39m arg\u001b[38;5;241m.\u001b[39mmap(cache_array)\n\u001b[0;32m 1050\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1051\u001b[0m values \u001b[38;5;241m=\u001b[39m \u001b[43mconvert_listlike\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_values\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1052\u001b[0m result \u001b[38;5;241m=\u001b[39m arg\u001b[38;5;241m.\u001b[39m_constructor(values, index\u001b[38;5;241m=\u001b[39marg\u001b[38;5;241m.\u001b[39mindex, name\u001b[38;5;241m=\u001b[39marg\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m 1053\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(arg, (ABCDataFrame, abc\u001b[38;5;241m.\u001b[39mMutableMapping)):\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:394\u001b[0m, in \u001b[0;36m_convert_listlike_datetimes\u001b[1;34m(arg, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)\u001b[0m\n\u001b[0;32m 391\u001b[0m \u001b[38;5;28mformat\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 393\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mformat\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 394\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43m_to_datetime_with_format\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 395\u001b[0m \u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morig_arg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexact\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minfer_datetime_format\u001b[49m\n\u001b[0;32m 396\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 397\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m res \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 398\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:514\u001b[0m, in \u001b[0;36m_to_datetime_with_format\u001b[1;34m(arg, orig_arg, name, tz, fmt, exact, errors, infer_datetime_format)\u001b[0m\n\u001b[0;32m 512\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m DatetimeIndex\u001b[38;5;241m.\u001b[39m_simple_new(dta, name\u001b[38;5;241m=\u001b[39mname)\n\u001b[0;32m 513\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m):\n\u001b[1;32m--> 514\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:501\u001b[0m, in \u001b[0;36m_to_datetime_with_format\u001b[1;34m(arg, orig_arg, name, tz, fmt, exact, errors, infer_datetime_format)\u001b[0m\n\u001b[0;32m 498\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _box_as_indexlike(result, utc\u001b[38;5;241m=\u001b[39mutc, name\u001b[38;5;241m=\u001b[39mname)\n\u001b[0;32m 500\u001b[0m \u001b[38;5;66;03m# fallback\u001b[39;00m\n\u001b[1;32m--> 501\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43m_array_strptime_with_fallback\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 502\u001b[0m \u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfmt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexact\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minfer_datetime_format\u001b[49m\n\u001b[0;32m 503\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n\u001b[0;32m 506\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m 507\u001b[0m \u001b[38;5;66;03m# Fallback to try to convert datetime objects if timezone-aware\u001b[39;00m\n\u001b[0;32m 508\u001b[0m \u001b[38;5;66;03m# datetime objects are found without passing `utc=True`\u001b[39;00m\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\tools\\datetimes.py:437\u001b[0m, in \u001b[0;36m_array_strptime_with_fallback\u001b[1;34m(arg, name, tz, fmt, exact, errors, infer_datetime_format)\u001b[0m\n\u001b[0;32m 434\u001b[0m utc \u001b[38;5;241m=\u001b[39m tz \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutc\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 436\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 437\u001b[0m result, timezones \u001b[38;5;241m=\u001b[39m \u001b[43marray_strptime\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfmt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexact\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexact\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 438\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mZ\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m fmt \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mz\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m fmt:\n\u001b[0;32m 439\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _return_parsed_timezone_results(result, timezones, tz, name)\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\_libs\\tslibs\\strptime.pyx:150\u001b[0m, in \u001b[0;36mpandas._libs.tslibs.strptime.array_strptime\u001b[1;34m()\u001b[0m\n",
|
|||
|
"\u001b[1;31mValueError\u001b[0m: time data '4/9/2012' does not match format '%d-%m-%Y' (match)"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"def get_different_year():\n",
|
|||
|
" registration_year = pd.to_datetime(df['Dt_Customer'], format='%d-%m-%Y').apply(lambda x: x.year)\n",
|
|||
|
" current_year = datetime.now().year\n",
|
|||
|
" return current_year - registration_year\n",
|
|||
|
"\n",
|
|||
|
"df['Years_Since_Registration'] = get_different_year()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 11,
|
|||
|
"id": "1add1b3f",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.005426Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.004545Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:08.016059Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:08.015005Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.037797,
|
|||
|
"end_time": "2022-08-28T13:50:08.018592",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:07.980795",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"df[\"Education\"] = df[\"Education\"].replace({\"Basic\": 0, \"Graduation\": 1, \"2n Cycle\": 2, \"Master\": 2, \"PhD\": 3})\n",
|
|||
|
"# Encoded in numbers in order"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 12,
|
|||
|
"id": "1e356ea5",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.066519Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.065713Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:08.081091Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:08.079966Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.043231,
|
|||
|
"end_time": "2022-08-28T13:50:08.083904",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.040673",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"df['Marital_Status'] = df[\"Marital_Status\"].replace({\"Married\":\"Partner\", \"Together\":\"Partner\", \"Absurd\":\"Alone\",\n",
|
|||
|
" \"Widow\":\"Alone\", \"YOLO\":\"Alone\", \"Divorced\":\"Alone\", \"Single\":\"Alone\"})\n",
|
|||
|
"\n",
|
|||
|
"step_2 = df['Marital_Status'].replace({'Alone': 1, 'Partner': 2})\n",
|
|||
|
"\n",
|
|||
|
"df[\"Family_Size\"] = step_2 + df['Kidhome'] + df['Teenhome'] # Total number of people in the family\n",
|
|||
|
"\n",
|
|||
|
"df = pd.concat([df, pd.get_dummies(df['Marital_Status'])], axis=1) # Separate features for Alone and Partner"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 13,
|
|||
|
"id": "ac685e10",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.131079Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.130324Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:08.139672Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:08.138374Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.036065,
|
|||
|
"end_time": "2022-08-28T13:50:08.142371",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.106306",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"mnt_cols = ['MntWines', 'MntFruits', 'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts', 'MntGoldProds']\n",
|
|||
|
"df['Sum_Mnt'] = df[mnt_cols].sum(axis=1) # Total amount spent on products"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 14,
|
|||
|
"id": "bf8e3514",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.190191Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.189415Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:08.198065Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:08.197120Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.035303,
|
|||
|
"end_time": "2022-08-28T13:50:08.200563",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.165260",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"accepted_cmp_cols = ['AcceptedCmp1', 'AcceptedCmp2', 'AcceptedCmp3', 'AcceptedCmp4', 'AcceptedCmp5',\n",
|
|||
|
" 'Response']\n",
|
|||
|
"df['Num_Accepted_Cmp'] = df[accepted_cmp_cols].sum(axis=1) \n",
|
|||
|
"# Number of companies in which the client accepted the offer"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 15,
|
|||
|
"id": "bdf8dac4",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.247275Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.246531Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:08.255458Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:08.254344Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.035527,
|
|||
|
"end_time": "2022-08-28T13:50:08.258183",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.222656",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"total_purchases = ['NumWebPurchases', 'NumCatalogPurchases', 'NumStorePurchases']\n",
|
|||
|
"df['Num_Total_Purchases'] = df[total_purchases].sum(axis=1) # Total number of purchases"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "d8ef8896",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.0219,
|
|||
|
"end_time": "2022-08-28T13:50:08.302246",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.280346",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# Let's look at EDA:\n",
|
|||
|
"______________________________________________________________________________________________________________"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "40e210cd",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.021869,
|
|||
|
"end_time": "2022-08-28T13:50:08.346271",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.324402",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## First, let's look at the correlation matrix:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 16,
|
|||
|
"id": "94fe9d5c",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:08.393693Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:08.392815Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:10.957802Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:10.956231Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 2.594148,
|
|||
|
"end_time": "2022-08-28T13:50:10.962906",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:08.368758",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAOeCAYAAAC5xniSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzdd3hUZfrG8e8TEgiSBAgpSlkVUAFBUcEVEAQBCyKgggruKrquda2rrr03BERhUcSGBQvgqiyigihFQSkK0lXA34aWQkhIAiQweX9/zEmYFCBIhpnR+3Ndc2XOOc85554zR3d98uY95pxDRERERERERERERCJPVKgDiIiIiIiIiIiIiMhvowaviIiIiIiIiIiISIRSg1dEREREREREREQkQqnBKyIiIiIiIiIiIhKh1OAVERERERERERERiVBq8IqIiIiIiIiIiIhEKDV4RURERKRamdlgM3Nm1jUIxz7KO/bD1X3s3yszm2lmv4Y6h4iIiIgEhxq8IiIiImHIzA4zs1vNbI6ZZZvZLjNLN7OpXgM1OtQZg8Vr4j5sZm1DnSVcmFlb75ocFeosIiIiIhJefrf/YSAiIiISqcysOfAJcCzwBfAUkAWkAD2A14FWwF2hyhhkRwEPAb8Ci8tt+z+gNrD7kCYKvbb4r8lM/NflQJwFWPXGEREREZFwoQaviIiISBgxs9rAFKApcJFz7j/lSoaYWXugfTWeM945l3eg20LBOeeAnaHOEe7MrAZQyzm33TlXFOo8IiIiIhI8mqJBREREJLxcDRwHDK+kuQuAc26Bc+6FwHVm1s/MvjGzAjPL9973Lb+vmf3qzcl6kpl9bma5wI/etpne9qZmNsnMsoFtAfseYWYvmtn/zKzIzDaa2VgzS9nfhzKzeDN73My+M7MsMys0s1/M7GkzOyygbjDwlbf4ujffrjOzmd72SufgNbNoM/uXma0ws51mtsXMPjSzNuXqSvc3s95mtsCr32RmQ6s69YV3jHFmdqaZzTOz7Wa23sz+5W2vb2avmlmGt22KmTUsd4yGZjbczBab2VYvxwrvc9QIqHsY/6htgK8Crsm4kmvmLfcwswfMbA3+JvjF3vYyc/B63/1OM5tuZhawvoaZzfbytq7KdRARERGR0NMIXhEREZHw0t/7ObaqO5jZDcBoYBXwqLd6MPCRmV3rnCt/rD8BXwITgQ+AuIBtccAs4BvgPvzTQmBmfwLmATWBV4E1QHPgeqCbmbVzzuXuI2Yj/M3rD4B38E+xcAb+aSZOAs726mYDTwL3etdgjrc+fT+XYTz+huZ04EXgcOBGYJ6ZdXbO/VCuvhdwAzAGeA3oC9wBbPXOXxUnAed7Od/0zv+0me0ErsA/lcLD+K/TzV5Nj4D9TwAuBD7Efz1jgHOAp/GP4L7Wq/sPcARwjZdtpbd+Tbk8w7xjvIy/Mb+6stDOuR/M7C7geeBu/FOAgH8KiM7Adc65ZVW8BiIiIiISYub/KzcRERERCQdmtgWIds7VrWJ9fSAN2Ayc7Jzb5q1PAH7A36Bt4pzL8db/ChwJ/N0590q5Y83E33R9wjl3f7ltHwMdvHOsD1jfDvgWeNw597C3bjD+EafdnHMzvXU18c+wsKvccR8D7gf+7Jyb763rin8U75XOuXHl6o8C1gGPBJyvJzANmABc6k3jgJmdCCwC5jnnOpfbfztwvHPuV2+9AUuBBs65Iyq71uVyOMABHZxz3wV8xv8DUoF/O+duDqh/FrgNaOGcW+2tqw3sdOX+D7mZvQUMAho75zbt7ZoG1Jds+wk4yTm3vdz2mcBRzrmjyq3/GH+juzMQC8wAPnTO9UdEREREIoamaBAREREJLwnAgcx52xOoA4wsae4CeO9H4h+R26PcPtns+ZP/ygwLXDCzukBvYDKw08ySSl74R6n+gv9BXnvlnCsqae560ynU9/b/wiv58z4/5b5d4P18IrBZ6pxbAvwXON3Mksvt81FJc9erdfibyoebWRxVM6+kuesdowiYj/+BZiPL1ZaMRD4moH5HQDO6ppkletfkc/z/P71dFXOUeLF8c3c/rsT/i4F3gbfx/6Lg6gM8p4iIiIiEmKZoEBEREQkv24D4A6g/2vu5vJJtJeuallu/xjnn28vxMktG+wY4Dn/D8W/eqzJr95OzZCqJ64DjqTjQoP7+9t+Ho4Fi9kxdEGg50M+ryQxYX1neLd7PBkB+Fc5b2TG2ej/X7WV9g5IV3ny/dwOX45/Gwcrtc6DX5KcDKXbOZZvZlfintQA4vZLvXkRERETCnBq8IiIiIuFlGdDFzJo65/bbNP2N9jXKs7JtJY3Ht4E39rLfjn2d0MxuB4bjn0phJLARKMI/N+84Dv1flu2twQ0VG60HfIx9NNADj/0scBPwPvAEkAHsAk4GhnDg1+RARu+W6BPwvi3+uZdFREREJIKowSsiIiISXj4AuuD/U/l7q1Bf0gQ+Hv8cqoFalav5rX7BP99sTefcF/sr3ou/4p/O4VznXHHJSjM7p5LaA31IxFr8zdCWwI/ltpVcg/IjasPBX4HZzrlLA1eaWfNKaqv9wRlm1gd/g/l1/COIh5nZbOfc0uo+l4iIiIgEj+bgFREREQkvrwCrgTvMrG9lBWZ2ijfdAfj/vL4AuMnM4gNq4vE37/LZ8yf4v4lzbgswFbjQzE6rJI9VMsdteT78TcrSEawBUxSUVzI9QmIVI37k/bzHe1hayfFb4x+h+rVzLrOyHUPMR7nRwmZWB//D2Mo70GuyT2bWCHgN/7QW/wAuwz8K+z3v4W8iIiIiEiE0gldEREQkjDjntptZb+AT4CMzm4a/QbsFSAa6AWcDz3j1OWZ2FzAa+M7MxnmHGox/VOa1zrncaoh2PfA1MNvM3gR+wD9YoCnQF3gTeHgf+08CngI+NbP/4H+Y3CD8UxKUtwL/g+ZuMLPtQA6Q4Zz7srIDO+emm9kE4FKgvplNAQ4HbgR2Ajcf0Cc9dCYB15rZ+/gfNpcKXMWeuYADLcA/z/B9ZlYff1N/XeBD3qrKzKKA8fgfzneJ92C27Wb2N+A/wHPAtQf+cUREREQkFNTgFREREQkzzrlfzOwk/E22i4D7gDggG1gIXAG8E1D/gpltAu4EHvJWLwEucM59VE2Z0szsFOBf+Bu6f8HfPE0D/gtM2M8hhuIfrfo34HlgM/65Z1/H39ANPNcOM7sUeBx/s7EWMAuotMHruQz4Hn9jezj+Bugs4IEwnnLgdvyN7IvxX9M0YCz+Zm6ZqTCcc/8zs6vwX/8XgRj88yEfcIMXuB84A7gh8No45z40sxfwN9anOec++A3HFhEREZFDzJyr9um8REREREREREREROQQ0By8IiIiIiIiIiIiIhFKDV4RERERERERERGRCKUGr4iIiIiIiIiIiEiEUoNXREREREREREREJEKpwSsiIiIiIiIiIiISoaJDHUAihgt1ABERERERERGR3xkLdYBw9PPpZ4dlH+qYrz8Py+9LI3hFREREREREREREIpQavCIiIiIiIiIiIiIRSg1eERERERERERERkQilBq+IiIiIiIiIiIhIhFKDV0RERERERERERCRCRYc6gIiIiIiIiIiIiEgp05jUA6GrJSIiIiIiIiIiIhKh1OD9nTCzfmbmzKxFqLOIiIiIiIiIiIjIoaEG7+/HQOBr76eIiIiIiIiIiEhkMgvPV5hSg/d3wMzigNOBvwGXeuuizOwFM1tlZtPNbKqZ9fe2nWJms8xskZl9bmZHhDC+iIiIiIiIiIiI/EZq8P4+9AU+c879BGwxs1OAC4GjgFbAX4EOAGYWA4wC+jvnTgFeA54IRWgRERERERERERE5ONGhDiDVYiDwvPf+PW85GpjonCsGNpvZV97244DWwHTzDy2vAWw6tHFFRERERERERESkOqjBG+HMLBE4E2hjZg5/w9YBH+5tF2C5c65DFY59DXANwEsvvcQ111xTPaFFRERERERERESkWmiKhsjXH3jLOXekc+4o51wTYB2QDVzkzcWbCnT16lcDyWZWOmWDmR1f2YGdc2Odc+2cc+3U3BUREREREREREQk/GsEb+QYCQ8q
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x1008 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {
|
|||
|
"needs_background": "light"
|
|||
|
},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"to_corr = ['Age', 'Income', 'Kidhome', 'Teenhome', 'Recency', 'Complain', \n",
|
|||
|
" 'MntWines', 'MntFruits', 'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts', \n",
|
|||
|
" 'MntGoldProds', 'NumDealsPurchases', 'AcceptedCmp1', 'AcceptedCmp2', 'AcceptedCmp3', \n",
|
|||
|
" 'AcceptedCmp4', 'AcceptedCmp5', 'Response', 'NumWebPurchases', 'NumCatalogPurchases', \n",
|
|||
|
" 'NumStorePurchases', 'NumWebVisitsMonth', 'Years_Since_Registration', 'Family_Size',\n",
|
|||
|
" 'Sum_Mnt', 'Num_Accepted_Cmp', 'Num_Total_Purchases', 'Alone', 'Partner']\n",
|
|||
|
"\n",
|
|||
|
"cmap = sns.diverging_palette(220, 10, as_cmap=True)\n",
|
|||
|
"matrix = np.triu(df[to_corr].corr())\n",
|
|||
|
"plt.figure(figsize=(25, 14))\n",
|
|||
|
"plt.title('Correlation matrix', fontsize=18)\n",
|
|||
|
"sns.heatmap(df[to_corr].corr(), annot=True,\n",
|
|||
|
" fmt='.1f', vmin=-0.4, center=0, cmap=cmap, mask=matrix)\n",
|
|||
|
"\n",
|
|||
|
"plt.show()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "90faf051",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.026543,
|
|||
|
"end_time": "2022-08-28T13:50:11.019982",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:10.993439",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Next, look at the distributions of quantitative variables:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 17,
|
|||
|
"id": "2116d718",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:11.074918Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:11.074100Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:23.869035Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:23.867626Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 12.833249,
|
|||
|
"end_time": "2022-08-28T13:50:23.878991",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:11.045742",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIAAAAQmCAYAAABI7cSpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzddZhc1fnA8e8Zn1l332STbNyIkKABglOkuBUpBVq8tEX6o6WU0iLFtRR3Lw7BXWLEdbPJutu4n98fM9lk2SRswlqS9/M882TmXDuzczJz73vfc47SWiOEEEIIIYQQQgghdl2Gga6AEEIIIYQQQgghhOhbEgASQgghhBBCCCGE2MVJAEgIIYQQQgghhBBiFycBICGEEEIIIYQQQohdnASAhBBCCCGEEEIIIXZxEgCKO/zwwzUgD3n05WOHSNuURz88doi0TXn0w2OHSNuURz88doi0TXn0w2OHSNuURz88xCAgAaC45ubmga6CEFskbVMMVtI2xWAlbVMMVtI2xWAlbVOI3YMEgIQQQgghhBBCCCF2cRIAEkIIIYQQQgghhNjFSQBICNHnolFNY4efdk9woKsidnHhSJSGDh9Or7Q1IXrC4w/R0OEjEAoPdFVEL3P5Yp9tKBwd6KoI0afa3AEanX60lmFmhPgppoGugBBi11bf7uPVeVW8Nq+KtAQzlx06ir1KszCbJP4seld1q5cXvtnAO4tryUu1cflho5k2LAOjQQ101YQYlJZXt3PfB2tYUdvBXiMyOf/AEQzPSRroaole8MOGVu6es5r1TW4OGpvDOfsPZ0hmwkBXS4he5Q+G+XJ1E/d/uAZPIMypew3hmCmFZCXbBrpqQgxacgUmhOgzWmveWFDN01+txxMIU93q4+oXF7GytmOgqyZ2MaFwlCe/LOeVeVX4ghHKGz1c+exC1ta7BrpqQgxKNa1efv/MQn6oaCMQivLZykauf3UpHZI9t9Nb3+TmimcWsKrWSSAU5b3Fddz1/iq8AcnyEruW5TUd/OWVJdR3+HH5w/z303V8uKx+oKslxKAmASAhRJ9pcQd4fUF1lzKtYXWdc4BqJHZVTa4A7y6q7VIWiWo2NLkHqEZCDG6VLV6cvlCXsrIGF7VtvgGqkegtFU0eAqGu3b6+XdtMg9M/QDUSom8sXN/Wrex/86u6fbcJITaRAFAvanL6OfHuL4hEpf+pEABWk5HsZGu38hSHZQBqI3ZlNrOB9ITu7SrBKj2dhdiSBKuxW5nJqLBbupeLnYtjC59tgtWEVbpei11MZlL3c8y8VDsWo7R1IbZG/nf0ovs/XEN1q4/1csdZCACS7GYuOmRklzFYijMcjC1IGcBaiV1ReqKVK48c06VsXEEyI/NkPBMhtqQkK5EjJuV3KTv/wBEUpjsGqEait5TmJjFzRGaXsksPG0l+mny2YtcypSSN7JRNQSCTUXHurGHYJJAtxFbJrdFetLbeRV6qjeXVHYyQQRSFAGDq0HT+e94M1jW6cFhMjM5PpkAuMEQf2Kc0k4fP25P1TW5S7BZG5yeTk2If6GoJMSgl2c1ceuhIDhmfS6PTT0G6gzF5yZjkzvlOLy3Byv8dO45VtU5aPQGKMxIYnZc80NUSotcNyUzkvrOns6bWiT8cYUROMqPkxo8Q2yQBoF7U4g4wY0QmS6vaOXZqIQA3v7Wcdk+Qm0/dY4BrJ8TAMBkNjC1MYWyhZP2IvmUxG5lYnMbE4rSBrooQO4X0RCt7j8wa6GqIPpCVbJOZkMRuoTgjgeIMmeFOiJ6S2zy9JByJ4vKHGVeQwqr4DEdlDS4+X9nI9+taaPPIrBpCCCGEEEIIIYQYGBIA6iVtniCJNhNFGQ4qW7yEwlHeXFDNXiMyGZ6dyNKq9oGuohBCCCGEEEIIIXZTEgDqJS3uAKkOCxaTkawkK+VNbj5Z0cDUknSGZiWwpLL7NIVCCCGEEEIIIYQQ/UECQL2k2RUgxW4GoCgjgUc/LcNqMpCbaiczyUZtm2+AayiEEEIIIYQQQojdlQSAekmzK0BSPAB04NgcvlzdxOHx6VVT7GaaXIGBrJ4QQgghhBBCCCF2YzILWC9x+kI4LEYACtMdXHfceHJSYrMvpDgstEgASAghhBBCCCGEEANEMoB6idsfxmY2dr7OTbWjlAIgxWGmxR1Aaz1Q1RNCCCGEEEIIIcRurE8DQEqpVKXUK0qpVUqplUqpvZRS6UqpD5VSa+P/psXXVUqpe5RSZUqpJUqpKZvt5+z4+muVUmdvVj5VKbU0vs09Kh5x2dox+pI7EMZmMW5xmc1sxKAUnkC4r6shhBBCCCGEEEII0U1fZwDdDbyvtR4NTAJWAtcAH2utS4GP468BjgBK448LgAchFswBrgdmAHsC128W0HkQOH+z7Q6Pl2/tGH3G5QthN285AASQmiDjAAkhhBBCCCGEEGJg9FkASCmVAuwPPAqgtQ5qrduBY4En46s9CRwXf34s8JSO+Q5IVUrlAYcBH2qtW7XWbcCHwOHxZcla6+90rG/VUz/a15aO0We2lQEEkGKXcYCEEEIIIYQQQggxMPoyA6gEaAIeV0r9oJR6RCmVAORorevi69QDOfHnBUDVZttXx8u2VV69hXK2cYw+4/GHt5kBlGA14fSH+roaQgghhBBCCCGEEN30ZQDIBEwBHtRa7wF4+FFXrHjmTp+OjLytYyilLlBKzVdKzW9qavpZx/H8RAaQzWLE7ZMxgETP9GbbFKI3SdsUg5W0TTFYSdsUg5W0TSF2P30ZAKoGqrXW38dfv0IsINQQ775F/N/G+PIaoGiz7QvjZdsqL9xCOds4Rhda64e11tO01tOysrJ26E1u5A5sOwPIZjbg8ksASPRMb7ZNIXqTtE0xWEnbFIOVtE0xWEnbFGL302cBIK11PVCllBoVL5oNrADeBDbO5HU28Eb8+ZvAWfHZwGYCHfFuXHOAQ5VSafHBnw8F5sSXOZVSM+Ozf531o31t6Rh9xhsIY99WBpDZiEu6gAkhhBBCCCGEEGIAmPp4/5cCzyqlLEA5cC6xoNNLSqnzgArg5Pi67wJHAmWAN74uWutWpdSNwLz4en/XWrfGn18EPAHYgffiD4Cbt3KMPqG1xhuMYNtGBpDdYsLlkwCQEEIIIYQQQggh+l+fBoC01ouAaVtYNHsL62rg4q3s5zHgsS2UzwfGb6G8ZUvH6CuBcBSjUpiMW0+ocliM1LX7+qtKQgghhBBCCCGEEJ36cgyg3YbHH8Zu3Xr2D4DdYpQxgIQQQgghhBBCCDEgJADUCzzBbQ8ADbEuYG4ZA0gIIYQQQgghhBADQAJAvcAXjGAxbftP6bAYcQckA0gIIYQQQgghhBD9TwJAvcD3EwNAA9gsRjzSBUwIIYQQQgghhBADQAJAvcAf6lkGkIwBJIQQQgghhBBCiIEgAaBe4A2GfzIAZDUZCYQixCY7E0IIIYQQQgghhOg/EgDqBf5gBKtp213ADAaF2WggEIr2U62EEEIIIYQQQgghYiQA1At6Mgg0gMVswBeK9EONhBBCCCGEEEIIITaRAFAv6GkAyGoy4AtKAEgIIYQQQgghhBD9SwJAvcAXimA29iAAZI6NAySEEEIIIYQQQgjRnyQA1Au8gTAWcw8zgCQAJIQQQgghhBBCiH4mAaBe4O3BINAAFukCJoQQQgghhBBCiAEgAaBe4AuGsfZoDCAjfskAEkIIIYQQQgghRD+TAFAv6Okg0GbJABJCCCGEEEIIIcQA6NMAkFJqg1JqqVJqkVJqfrwsXSn1oVJqbfzftHi5Ukrdo5QqU0otUUpN2Ww/Z8fXX6uUOnuz8qnx/ZfFt1XbOkZf8QUjWM096wImGUBCCCGEEEIIIYTob/2RAXSg1nqy1npa/PU1wMda61Lg4/hrgCOA0vjjAuBBiAVzgOuBGcCewPWbBXQeBM7fbLvDf+IYfcIX6lkGkMVowBcM92VVhBBCCCGEEEIIIboZiC5gxwJPxp8/CRy3WflTOuY7IFUplQccBnyotW7VWrcBHwKHx5cla62/01pr4Kkf7WtLx+gTvmCkR2MAxTKAon1ZFSGEEEIIIYQQQohu+joApIE
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1159.38x1080 with 42 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {
|
|||
|
"needs_background": "light"
|
|||
|
},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"to_plot = ['Income', 'Recency', 'Age', 'Years_Since_Registration', 'Sum_Mnt',\n",
|
|||
|
" 'Num_Total_Purchases', 'Marital_Status']\n",
|
|||
|
"sns.pairplot(df[to_plot], hue='Marital_Status', palette='Set1')\n",
|
|||
|
"plt.show()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "301760a7",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.037934,
|
|||
|
"end_time": "2022-08-28T13:50:23.956788",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:23.918854",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## 3.2) Data cleaning"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "becb2250",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.0365,
|
|||
|
"end_time": "2022-08-28T13:50:24.030576",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:23.994076",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Remove gaps in the data:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 18,
|
|||
|
"id": "e85427d0",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.107029Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.106545Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:24.119539Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:24.118496Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.053881,
|
|||
|
"end_time": "2022-08-28T13:50:24.121797",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.067916",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"scrolled": true,
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"text/plain": [
|
|||
|
"ID 0\n",
|
|||
|
"Year_Birth 0\n",
|
|||
|
"Education 0\n",
|
|||
|
"Marital_Status 0\n",
|
|||
|
"Income 24\n",
|
|||
|
"Kidhome 0\n",
|
|||
|
"Teenhome 0\n",
|
|||
|
"Dt_Customer 0\n",
|
|||
|
"Recency 0\n",
|
|||
|
"MntWines 0\n",
|
|||
|
"MntFruits 0\n",
|
|||
|
"MntMeatProducts 0\n",
|
|||
|
"MntFishProducts 0\n",
|
|||
|
"MntSweetProducts 0\n",
|
|||
|
"MntGoldProds 0\n",
|
|||
|
"NumDealsPurchases 0\n",
|
|||
|
"NumWebPurchases 0\n",
|
|||
|
"NumCatalogPurchases 0\n",
|
|||
|
"NumStorePurchases 0\n",
|
|||
|
"NumWebVisitsMonth 0\n",
|
|||
|
"AcceptedCmp3 0\n",
|
|||
|
"AcceptedCmp4 0\n",
|
|||
|
"AcceptedCmp5 0\n",
|
|||
|
"AcceptedCmp1 0\n",
|
|||
|
"AcceptedCmp2 0\n",
|
|||
|
"Complain 0\n",
|
|||
|
"Z_CostContact 0\n",
|
|||
|
"Z_Revenue 0\n",
|
|||
|
"Response 0\n",
|
|||
|
"Age 0\n",
|
|||
|
"Years_Since_Registration 0\n",
|
|||
|
"Family_Size 0\n",
|
|||
|
"Alone 0\n",
|
|||
|
"Partner 0\n",
|
|||
|
"Sum_Mnt 0\n",
|
|||
|
"Num_Accepted_Cmp 0\n",
|
|||
|
"Num_Total_Purchases 0\n",
|
|||
|
"dtype: int64"
|
|||
|
]
|
|||
|
},
|
|||
|
"execution_count": 18,
|
|||
|
"metadata": {},
|
|||
|
"output_type": "execute_result"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"df.isna().sum()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 19,
|
|||
|
"id": "5a689bb4",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.197184Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.195980Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:24.205508Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:24.204269Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.051032,
|
|||
|
"end_time": "2022-08-28T13:50:24.208553",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.157521",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"df.dropna(inplace=True) # Removed objects with gaps in income"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "cc804158",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.036219,
|
|||
|
"end_time": "2022-08-28T13:50:24.280612",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.244393",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Remove outliers in the data:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 20,
|
|||
|
"id": "21982d02",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.357434Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.356548Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:24.370733Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:24.369666Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.05638,
|
|||
|
"end_time": "2022-08-28T13:50:24.373367",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.316987",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"def remove_outliers(data: pd.DataFrame, column: str) -> pd.Series:\n",
|
|||
|
" q3, q1 = np.nanpercentile(data[column], [75, 25])\n",
|
|||
|
" iqr = q3 - q1\n",
|
|||
|
" upper_bound = q3 + 1.5 * iqr\n",
|
|||
|
" lower_bound = q1 - 1.5 * iqr\n",
|
|||
|
" data = data[(data[column] > lower_bound) & (data[column] < upper_bound)]\n",
|
|||
|
"\n",
|
|||
|
" return data\n",
|
|||
|
"\n",
|
|||
|
"df = remove_outliers(df, 'Age')\n",
|
|||
|
"df = remove_outliers(df, 'Income')"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "bdddf64e",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.035761,
|
|||
|
"end_time": "2022-08-28T13:50:24.445017",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.409256",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## Remove unnecessary features:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 21,
|
|||
|
"id": "fe757220",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.518855Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.518398Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:24.526627Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:24.525500Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.048269,
|
|||
|
"end_time": "2022-08-28T13:50:24.529075",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.480806",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"df.drop(['Year_Birth', 'ID', 'Z_CostContact', 'Z_Revenue', 'Dt_Customer', 'Marital_Status'], axis=1, inplace=True)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "2a8eda0c",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.03541,
|
|||
|
"end_time": "2022-08-28T13:50:24.600872",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.565462",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## 3.3) Data scaling (Normalization | Standardization)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 40,
|
|||
|
"id": "95d6b516",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.748441Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.747424Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:24.760373Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:24.759307Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.055109,
|
|||
|
"end_time": "2022-08-28T13:50:24.763522",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.708413",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"ename": "ValueError",
|
|||
|
"evalue": "could not convert string to float: 'Graduation'",
|
|||
|
"output_type": "error",
|
|||
|
"traceback": [
|
|||
|
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
|||
|
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
|
|||
|
"Input \u001b[1;32mIn [40]\u001b[0m, in \u001b[0;36m<cell line: 6>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m mms \u001b[38;5;241m=\u001b[39m MinMaxScaler()\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(data\u001b[38;5;241m=\u001b[39mmms\u001b[38;5;241m.\u001b[39mfit_transform(df), columns\u001b[38;5;241m=\u001b[39mdf\u001b[38;5;241m.\u001b[39mcolumns)\n\u001b[1;32m----> 6\u001b[0m df_scaled \u001b[38;5;241m=\u001b[39m \u001b[43mscaling_func\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m# to ensure\u001b[39;00m\n\u001b[0;32m 8\u001b[0m df_scaled\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mindex\n",
|
|||
|
"Input \u001b[1;32mIn [40]\u001b[0m, in \u001b[0;36mscaling_func\u001b[1;34m(df)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mscaling_func\u001b[39m(df: pd\u001b[38;5;241m.\u001b[39mDataFrame) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 2\u001b[0m mms \u001b[38;5;241m=\u001b[39m MinMaxScaler()\n\u001b[1;32m----> 3\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(data\u001b[38;5;241m=\u001b[39m\u001b[43mmms\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m)\u001b[49m, columns\u001b[38;5;241m=\u001b[39mdf\u001b[38;5;241m.\u001b[39mcolumns)\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\sklearn\\base.py:867\u001b[0m, in \u001b[0;36mTransformerMixin.fit_transform\u001b[1;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[0;32m 863\u001b[0m \u001b[38;5;66;03m# non-optimized default implementation; override when a better\u001b[39;00m\n\u001b[0;32m 864\u001b[0m \u001b[38;5;66;03m# method is possible for a given clustering algorithm\u001b[39;00m\n\u001b[0;32m 865\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 866\u001b[0m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[1;32m--> 867\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\u001b[38;5;241m.\u001b[39mtransform(X)\n\u001b[0;32m 868\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 869\u001b[0m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[0;32m 870\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X, y, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mfit_params)\u001b[38;5;241m.\u001b[39mtransform(X)\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\sklearn\\preprocessing\\_data.py:420\u001b[0m, in \u001b[0;36mMinMaxScaler.fit\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 418\u001b[0m \u001b[38;5;66;03m# Reset internal state before fitting\u001b[39;00m\n\u001b[0;32m 419\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset()\n\u001b[1;32m--> 420\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpartial_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m)\u001b[49m\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\sklearn\\preprocessing\\_data.py:457\u001b[0m, in \u001b[0;36mMinMaxScaler.partial_fit\u001b[1;34m(self, X, y)\u001b[0m\n\u001b[0;32m 451\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[0;32m 452\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMinMaxScaler does not support sparse input. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 453\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConsider using MaxAbsScaler instead.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 454\u001b[0m )\n\u001b[0;32m 456\u001b[0m first_pass \u001b[38;5;241m=\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mn_samples_seen_\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m--> 457\u001b[0m X \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfirst_pass\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mFLOAT_DTYPES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_all_finite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mallow-nan\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 462\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 464\u001b[0m data_min \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mnanmin(X, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n\u001b[0;32m 465\u001b[0m data_max \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mnanmax(X, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\sklearn\\base.py:577\u001b[0m, in \u001b[0;36mBaseEstimator._validate_data\u001b[1;34m(self, X, y, reset, validate_separately, **check_params)\u001b[0m\n\u001b[0;32m 575\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mValidation should be done on X, y or both.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 576\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[1;32m--> 577\u001b[0m X \u001b[38;5;241m=\u001b[39m check_array(X, input_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mX\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcheck_params)\n\u001b[0;32m 578\u001b[0m out \u001b[38;5;241m=\u001b[39m X\n\u001b[0;32m 579\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:856\u001b[0m, in \u001b[0;36mcheck_array\u001b[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[0;32m 854\u001b[0m array \u001b[38;5;241m=\u001b[39m array\u001b[38;5;241m.\u001b[39mastype(dtype, casting\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124munsafe\u001b[39m\u001b[38;5;124m\"\u001b[39m, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 855\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 856\u001b[0m array \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43masarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 857\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ComplexWarning \u001b[38;5;28;01mas\u001b[39;00m complex_warning:\n\u001b[0;32m 858\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 859\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mComplex data not supported\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(array)\n\u001b[0;32m 860\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcomplex_warning\u001b[39;00m\n",
|
|||
|
"File \u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\generic.py:2064\u001b[0m, in \u001b[0;36mNDFrame.__array__\u001b[1;34m(self, dtype)\u001b[0m\n\u001b[0;32m 2063\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__array__\u001b[39m(\u001b[38;5;28mself\u001b[39m, dtype: npt\u001b[38;5;241m.\u001b[39mDTypeLike \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m np\u001b[38;5;241m.\u001b[39mndarray:\n\u001b[1;32m-> 2064\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43masarray\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_values\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m)\u001b[49m\n",
|
|||
|
"\u001b[1;31mValueError\u001b[0m: could not convert string to float: 'Graduation'"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"def scaling_func(df: pd.DataFrame) -> None:\n",
|
|||
|
" mms = MinMaxScaler()\n",
|
|||
|
" return pd.DataFrame(data=mms.fit_transform(df), columns=df.columns)\n",
|
|||
|
"\n",
|
|||
|
"\n",
|
|||
|
"df_scaled = scaling_func(df)\n",
|
|||
|
"# to ensure\n",
|
|||
|
"df_scaled.index = df.index "
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "238ce006",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.036003,
|
|||
|
"end_time": "2022-08-28T13:50:24.835891",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.799888",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## 4) Dimensionality reduction"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 41,
|
|||
|
"id": "6c8a817f",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:24.986241Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:24.985289Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:50:25.127909Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:50:25.126448Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.189403,
|
|||
|
"end_time": "2022-08-28T13:50:25.134659",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:24.945256",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"ename": "NameError",
|
|||
|
"evalue": "name 'df_scaled' is not defined",
|
|||
|
"output_type": "error",
|
|||
|
"traceback": [
|
|||
|
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
|||
|
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
|
|||
|
"Input \u001b[1;32mIn [41]\u001b[0m, in \u001b[0;36m<cell line: 7>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m data\n\u001b[0;32m 6\u001b[0m \u001b[38;5;66;03m# df: scaling + dimensionality reduction\u001b[39;00m\n\u001b[1;32m----> 7\u001b[0m df_transform \u001b[38;5;241m=\u001b[39m dim_reduction(\u001b[43mdf_scaled\u001b[49m) \n\u001b[0;32m 8\u001b[0m df_transform\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m=\u001b[39m df_scaled\u001b[38;5;241m.\u001b[39mindex\n",
|
|||
|
"\u001b[1;31mNameError\u001b[0m: name 'df_scaled' is not defined"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"def dim_reduction(data: pd.DataFrame) -> pd.DataFrame:\n",
|
|||
|
" n_components = 8\n",
|
|||
|
" pca = PCA(n_components=n_components, random_state=42)\n",
|
|||
|
" data = pd.DataFrame(pca.fit_transform(data), columns =([f'PC{i}' for i in range(1, n_components + 1)]))\n",
|
|||
|
" return data\n",
|
|||
|
"\n",
|
|||
|
"# df: scaling + dimensionality reduction\n",
|
|||
|
"df_transform = dim_reduction(df_scaled) \n",
|
|||
|
"df_transform.index = df_scaled.index "
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "811f7208",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.036946,
|
|||
|
"end_time": "2022-08-28T13:50:25.291626",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:25.254680",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"<div style=\"padding:25px;color:white;margin:0;font-size:250%;text-align:center;display:fill;border-radius:10px;background-color:#298f50;overflow:hidden;font-weight:500;font-family:magra\">5) Clustering</div>"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "35bdc8bd",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.03694,
|
|||
|
"end_time": "2022-08-28T13:50:25.439167",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:25.402227",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"In this work, the following clustering algorithms will be used: (https://scikit-learn.org/stable/modules/clustering.html)\n",
|
|||
|
"* K-means ++ \n",
|
|||
|
"* Aglomerative clustering\n",
|
|||
|
"* Spectral clustering\n",
|
|||
|
"\n",
|
|||
|
"\n",
|
|||
|
"It is noteworthy that in these algorithms it is necessary to pre-specify the number of clusters. \n",
|
|||
|
"We assume that the minimum number of clusters is two, the maximum number of clusters is eight. Based on this, for different cases of the number of clusters, we will build models. \n",
|
|||
|
"If the metric is maximum for models with a large number of clusters, then we will iteratively increase the maximum number of clusters and build new models.\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 24,
|
|||
|
"id": "7f355417",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:50:25.515926Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:50:25.515437Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:52:29.397837Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:52:29.396253Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 123.925892,
|
|||
|
"end_time": "2022-08-28T13:52:29.401999",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:50:25.476107",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {
|
|||
|
"needs_background": "light"
|
|||
|
},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABaoAAAFWCAYAAACIBqoWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABznklEQVR4nO3de3zO9f/H8ee1zbAxG+Z8PmzEZg6FEIbIob70JYcIhSQdEKlMqSiUNCVKySFZhBxCckoKOR9ytuQ8h4kNO12/P/z2+W5ts2vbteuza3vcb7fd2OfzuT6f1/W+rm3vz/N6f94fi9VqtQoAAAAAAAAAAJO4mF0AAAAAAAAAACBvI6gGAAAAAAAAAJiKoBoAAAAAAAAAYCqCagAAAAAAAACAqQiqAQAAAAAAAACmIqgGAAAAAAAAAJiKoBpwUqGhofL395e/v7/ZpWS7M2fOGM/1+++/d8gxb9++rebNm6tmzZo6depUhh4bHBwsf39/vfrqq9lUXdpeffVV+fv7Kzg4ON1tt23bZrTrtm3bHFAd/i0uLk7BwcGqWbOmDh8+bHY5AIA8rnfv3vL391fv3r2NZYl9hdDQUEn0HzLDkf325cuXq23btqpdu7b8/f01e/bsbD9mUv/uB6fVjz9w4IC6d++uoKAg+fv767nnnpMk/f3333r66adVv359+fv767HHHnNo/WbIS+d1iQ4fPqyaNWsqODhYcXFxNj/OjPPCpDJynpcXX9ec5uTJk6pZs6aaN2+uO3fumF0ObERQDeRAMTExmj17tp544gnVr19fgYGBevjhh/Xaa6/pxIkT2X58szsA/+bu7q46deqoTp06Klq0qEOOOXfuXF24cEEtW7ZU5cqVHXJMeyhfvrzq1KmjmjVrGssyEl6bKfE9l7Tjd/jwYTVu3Fj+/v5q166dLl68mOwE2d/fX8uXL0+2n+nTpydbf+bMGUc/FZu5ubmpT58+SkhI0AcffGB2OQCAXCo2NlYzZ85U+/btFRQUpHr16ql169YaPHiw9u3bZ2xXtWpV1alTR1WrVjWx2qxJK0hy1oA9I8HYlStXNHr0aIWHh6tw4cKqU6eOSpQo4YAq05ZWP/7111/X7t27ZbVaFRAQYPS3J0yYoC1btuj27dtG2J4T/fsDnJwqp53XJfrggw+UkJCgPn36yM3NzexybFazZk3VqVNH5cuXN5aZOUjJVkl//yV9Hyxbtkz33Xef/P39NXToUMXGxiYL2O+77z6dO3cu2b769etnrM/p55dVqlRRy5YtdeHCBc2ZM8fscmAj5/mNAOQR169fV9++fXXo0CFJkoeHhypWrKgLFy5o8eLF8vPzc9qTh5iYGLm7u2f4cSVKlFBYWFg2VJS6+Ph4zZ8/X5KcZhSH1WpVfHy8hgwZoiFDhphdjl3s379fzzzzjCIjI+Xn56fZs2erWLFiCg8PT7bd3Llz1alTJ0l3RygvWLDAhGozr2PHjnr//fe1efNmhYeHq1KlSmaXBADIZSZNmqSvv/5aklSxYkXlz59f586d0/r169WmTRsFBgZKkt58800Tq0RWhYeHKzY2VtLd17xp06ZZ3mdm+++J0urHHz9+XJL01FNPadiwYSmWt2vXzi4f4sfFxcnV1VUWiyXL+8L/ZOV9cerUKW3evFmurq5GHz6nS3y+n3zyidml2E1YWJjGjh2rhIQE43zk3x8axMfH65tvvtGIESMkSSdOnNDWrVvNKDfTHn30Uf3888+aP3++nn76abm4MF43p+MVAnKYcePGGSF1//79tX37di1fvlw7duzQwoULVaNGjTQfm9rlmqldcrRv3z7169dPDRs2VO3atdW8eXMNHDhQ+/fv1/fff69WrVoZ244ePTrFPleuXKlu3bopKChIQUFB6tOnj3bu3GmsT/qJbVhYmHr37q2AgAB98803qdZ9+fJlvfLKK2ratKlq166txo0bq2fPnlq2bJmk1EcCJI4STu0rUUREhF5//XU1a9ZMtWvXVsuWLTV58mTFxMTc8zXYvn27zp8/Lzc3Nz300EPG8rNnz+qZZ55R8+bNFRgYqMDAQHXs2FGzZ8+W1Wq95z6PHTumnj17KiAgQO3atdNPP/2U6qfvkZGRGjdunFq0aKFatWqpcePGGjZsmE6fPm1sk/Q13bRpk9q3b69atWrp2LFjKUZPBwcHa8mSJUb9aY0kunjxooYMGaKgoCAFBwfru+++M9YlfT0XLVqk3r17KzAwUF27dtWJEyf066+/qmPHjqpbt64GDBigiIiIVB+bkdFLO3fuVN++fRUZGalatWppzpw5KlasWIrt8uXLp7179xqjwdauXauLFy8qX758qe533759GjRokB544AHVrl1bnTp10uLFi5Nt8/7776tDhw5q0KCBatWqpaZNm2rUqFG6dOlSqq/B77//rs6dOyswMFCdO3fWnj17jO3Se29LUvHixY2AIOlyAADsZeXKlZKk5557TmvXrtXy5cv1xx9/aOHChcbfICn1vuS93Kv/IEnnzp3TyJEj1aRJE9WqVUvNmjXTmDFjdOXKFWOb1K78+v7771O9MmrLli3q06eP6tWrp4CAAHXt2lXr16+X9L/+4tmzZyVJS5YsSTbqtU+fPsZ++vTpk6wPZrVaNX/+fD366KMKDAxU/fr19eyzzxqhaVqS9gd+++03PfbYYwoICNCjjz6qP/74I932W7x4sbp06aLAwEAFBQWpW7du+vHHH9N9PmnV0rNnT+P7p59+Oln/648//jCm1Khdu7batm2r6dOnG8G29L+Roa+88oree+89NWzYUN26dUuz/mPHjqlHjx5G/3bdunUptvl3Pz6xb5g43cOMGTOM18Lf319//fWXJGnFihXJXqObN29qwoQJCg4OVu3atdW0aVOFhITon3/+MY6V9L30/fffG9veuHFDUsbOYb7//nsNGjRIderUSfbeTtwm0bRp02waWbpq1Sr16NFDdevWVZ06ddSxY8dU2yuRM5zXRUdH66233lKLFi0UEBCghg0bqmvXrvrqq6/u2RaJ/d3AwMBk/fvNmzerZ8+eaty4sWrXrq169eqpZ8+e2rRp0z33J0nr1q1T27ZtFRAQoF69emnTpk2pjiA+evSonn/+eaO9goOD9f777ysqKirVtp85c6aaNm2qJk2aSEo+ejojP6O7du3S448/rjp16qQ4X0j6um7ZskWPPPKI6tSpoxdffFE3b97U7Nmz1bRpUzVs2FBvv/12sqlSMju9yNy5cxUSEqKEhAR16dJFkyZNSnVke758+fTdd9/p9u3bkmSMSk7rXCu991N0dLSee+45BQcHKygoSLVr19bDDz+sqVOnJjtHT/oazJ8/X8HBwapbt64GDRqU7FzzXu//RA899JBcXV11/vx5p7qaJi8jqAZykBs3bmj16tWSpBo1amjkyJHJ/ggEBQWpUaNGWTpGQkKCBg4cqK1bt8rV1VXVq1dXXFycNm3apJMnT6po0aLJpo1InEoicRT3l19+qWHDhmnv3r3y9fWVt7e3tm3bpqeeekq7d+9Ocbxx48bp2LFjKl++fJqfXr711lv64YcfFBUVJT8/PxUsWFC7d+/W9u3b03weiXUlfiW2U/78+SVJ165d0xNPPKFFixbp5s2bqlKliiIiIvT555/rhRdeuGcbJf4Bq1q1qgoWLGgsv3r1qn755RdjXaFChXTs2DFNmDAhzRBeku7cuaMBAwZo586dSkhIkIuLi0aMGJHsj2zidol/jC9duqRKlSopKirK+IN/4cKFFPseMmSI7ty5k+ZlnTVr1pSPj4+kux2KxPYqVKhQsu3GjBmjP//8U66urjp79qxCQkJSnWbmrbfe0qVLl5SQkGCEvkOGDFF8fLxu3bqlzZs367333kuzLWxx8OBBPfPMM7p586aCgoL09ddfG8/h39q2bSvpbmcr6b+Jy5PatWuXevbsqY0bN8rNzU0VK1bU0aNH9dprr+nLL780tvvll1908eJFlS5dWhUqVNDly5e1dOlSY+7EfxswYIBu3bql+Ph4HTp0SMOGDTM6kLa+twMCAiSJzhMAIFskJCRIkrZu3ar
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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X76c5Hvw77//ql27dvL391e7du20a9cu63oPa9uSVLBgQWtIEH85AAC2snz5cknS66+/rtWrV2vp0qX677//NH/+fOvfICnpvmRKUuo/SNL58+c1ZMgQ1a9fX1WrVlXDhg01fPhwXb161bpOUleALVy4MMkrpP766y91795dNWvWlJ+fnzp06KB169ZJ+l9/8dy5c5KkRYsWJRj92r17d+t2unfvnqAPZjabNWfOHD3zzDPy9/dXrVq19Nprr1mD0+TE7w/8888/evbZZ+Xn56dnnnlG//3330OP34IFC9S+fXv5+/srICBAHTt21O+///7Q15NcLV26dLH+/MorryTof/3333/W6TWqVaumFi1aaNKkSdZwW/rfCNF3331Xn3/+uerUqaOOHTsmW//Ro0fVuXNna/92zZo1idZ5sB9v6Rtapn6YPHmy9b3w9fXVqVOnJEnLli1L8B7dvn1bo0ePVmBgoKpVq6YGDRooKChIN2/etO4rfltauHChdd1bt25JSts5zMKFC9W3b19Vr149Qdu2rGMxceLEVI0wXbFihTp37qwaNWqoevXqatOmTZLHy8IRzusiIyP18ccfq3HjxvLz81OdOnXUoUMH/fDDDykeC0t/19/fP0H/ftOmTerSpYvq1aunatWqqWbNmurSpYs2btyY4vYkac2aNWrRooX8/PzUtWtXbdy4McmRxEeOHNEbb7xhPV6BgYH64osvFBERkeSxnzJliho0aKD69etLSjiKOi2/ozt27NDzzz+v6tWrJzpfiP++/vXXX3r66adVvXp1vf3227p9+7ZmzpypBg0aqE6dOvrkk08STJuS3qlGZs+eraCgIMXFxal9+/YaO3ZskiPcs2XLpl9++UV3796VJOvo5OTOtR7WniIjI/X6668rMDBQAQEBqlatmp566ilNmDAhwTl6/Pdgzpw5CgwMVI0aNdS3b98E55optX+LJ598Uq6urrpw4YJDXVWT1RFWA5nIrVu3tHLlSklSpUqVNGTIkAR/CAICAlS3bt1H2kdcXJz69OmjzZs3y9XVVRUrVlRMTIw2btyoEydOKH/+/AmmkLBMK2EZzT1jxgwNHDhQu3fvlre3tzw9PbVlyxa9/PLL2rlzZ6L9jRw5UkePHlXJkiWT/Rbz448/1m+//aaIiAj5+PgoZ86c2rlzp7Zu3Zrs67DUZfnPcpyyZ88uSbp+/bpefPFF/frrr7p9+7bKlSunsLAwTZ06VW+99VaKx8jyR6x8+fLKmTOndfm1a9f0559/Wh/LnTu3jh49qtGjRycbxEvSvXv31Lt3b23fvl1xcXFycXHR4MGDE/yhtaxn+YN8+fJllSlTRhEREdY/+hcvXky07f79++vevXvJXuJZuXJleXl5SbrfqbAcr9y5cydYb/jw4Tp48KBcXV117tw5BQUFJTnlzMcff6zLly8rLi7OGvz2799fsbGxunPnjjZt2qTPP/882WORGvv379err76q27dvKyAgQD/++KP1NTyoRYsWku53uOL/37I8vh07dqhLly7asGGD3NzcVLp0aR05ckTvv/++ZsyYYV3vzz//1KVLl1S0aFGVKlVKV65c0eLFi61zKT6od+/eunPnjmJjY3XgwAENHDjQ2olMbdv28/OTJDpQAIAMERcXJ0navHmz1q1bp7CwMJl
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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6sqVK4m2wd9//60WLVooICBALVq00J49eyzrpfTalqSCBQtagoBHlwMAkBlWrFghSXr77be1Zs0aLVu2TP/8848WLFhg+fyREu9HJie5voMkXbhwQQMGDNAzzzyjKlWqqG7duho8eLCuXbtmWSexs7cWLVqU6NlNmzdvVseOHVWtWjX5+/urVatWWrdunaT/9RXPnz8vSVq8eHG80asdO3a0bKdjx47x+l9ms1lz5szRSy+9pICAAFWvXl1vvfWWJRhNyqN9gb/++ksvv/yy/P399dJLL+mff/5J8fn75Zdf1LJlSwUEBCgoKEitW7fWb7/9luLjSaqWdu3aWX5/44034vW9/vnnH8v0F35+fmrcuLEmTpxoCa+l/43wfP/99/Xll1+qZs2aat26dZL1Hzt2TG3btrX0bdeuXZtgncf78HH9wripGSZNmmRpC19fX50+fVqStHz58nhtdOfOHY0YMULBwcHy8/NTnTp1NGTIEN26dcuyr0dfS4sWLbKse/v2bUlpO35ZtGiRunfvrsDAwHiv7bh14kyYMCFVI0RXrlyptm3bqmrVqgoMDFTz5s0Tfb7iOMIxXWRkpD799FPVr19f/v7+qlmzplq1aqUff/wx2ecirq8bEBAQr2+/adMmtWvXTrVr15afn5+qVaumdu3aaePGjcluT5LWrl2rxo0by9/fX+3bt9fGjRsTHQl89OhR9erVy/J8BQcH66uvvlJERESiz/3kyZNVp04dPfPMM5Lij4JOy3t0165deuWVVxQYGJjgWOHRdt28ebNeeOEFBQYGqnfv3rpz545mzJihOnXqqGbNmvrss8/iTWuS3qlAZs2apSFDhig2NlYtW7bUqFGjEh2h7uLiop9//ln37t2TJMvo4qSOs1J6PUVGRurtt99WcHCwgoKC5Ofnp+eff15jx46Nd3z+aBvMmTNHwcHBqlq1qrp37x7vODO513+cZ599Vs7Ozrp48aJDnRWT1RFGA3bm9u3bWrVqlSSpYsWKGjBgQLw/9kFBQapVq1aG9hEbG6tu3bpp69atcnZ2VoUKFfTgwQNt3LhRJ0+eVP78+eNN8RA37UPcaOzp06erb9++2rt3r7y9veXp6alt27bp9ddf1+7duxPsb9iwYTp27JhKliyZ5DeRn376qX799VdFRETIx8dHuXPn1u7du7V9+/YkH0dcXXH/4p6nnDlzSpJu3LihV199VQsXLtSdO3dUtmxZhYWFacqUKXr33XeTfY7iPqjKlSun3LlzW5Zfv35df/75p+W2PHny6NixYxoxYkSSQbsk3b9/X2+++aZ27typ2NhYOTk5qX///vE+TOPWi/vQvXLlikqXLq2IiAjLB/ulS5cSbLtnz566f/9+kqdhVqpUSV5eXpIedhzinq88efLEW2/w4ME6fPiwnJ2ddf78eQ0ZMiTRKWE+/fRTXblyRbGxsZZgt2fPnoqJidHdu3e1adMmffnll0k+F6lx8OBBde3aVXfu3FFQUJB++ukny2N4XOPGjSU97FQ9+n/c8kft2rVL7dq104YNG5QjRw6VKlVKR48e1Ycffqjp06db1vvzzz91+fJlFS1aVE888YSuXr2qJUuWWOYzfNybb76pu3fvKiYmRocOHVLfvn0tHcXUvrb9/f0liU4SACDTxcbGSpK2bt2qdevWKSw
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABb0AAAH5CAYAAAClPpO8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACYQ0lEQVR4nOzdd3iT9frH8U+S7t2km7JaoIwCLUOGrSwngooKCiqKC1w/N6LHcZyIop7jPMqRAyioqCgyVQQUUBChjLJpmR1AF9C98vujNFA2Epq2eb+u61xHnzxN7qfNndZPvrm/BqvVahUAAAAAAAAAAA2A0dEFAAAAAAAAAABgL4TeAAAAAAAAAIAGg9AbAAAAAAAAANBgEHoDAAAAAAAAABoMQm8AAAAAAAAAQINB6A0AAAAAAAAAaDAIvQEAwDlbsWKFYmJiFBMToxUrVji6nNOaMWOGrda9e/c6upxz9t5779nqr0tKS0v1zDPPqGfPnrb6Dh06VGuPf7Ln4Km+V5MmTVLfvn3Vtm1bxcTEaMGCBZKkWbNm6YorrlBsbKxiYmI0adKkWqu/oRszZoxiYmLUt29fR5dyWqd6bpyrutqnF9LmzZvVpk0b9e3bV+Xl5bbj9NWFt2zZMsXExOiGG26Q1Wp1dDkAANRJhN4AAECSdNttt9lCmzZt2ig+Pl6XX365Hn/8cf311181zvXx8VHHjh3VsWNH+fj4nPVj9O3bVzExMRozZoy9y7fVf9ttt9U4bjabbbW6ubnZ/XGd1bRp0/Ttt98qOztbLVq0UMeOHWUymRxaU1hYmO1nXW3Tpk0aO3as0tLSFBwcrI4dO8rf31/Z2dl6+umntXPnTvn6+qpjx44KCQlxYPUnV9/ftKnLTvXcqGv27t1rew7MmDHD0eXYvPXWW6qsrNTw4cPl4uIiSbXeV9Xfl2N/p2zevFk9evRQTEyMrrzySu3bt++CPb6jXHzxxWrdurWSk5M1b948R5cDAECd5OLoAgAAQN3i6uqqtm3bav/+/dq9e7d27dqlOXPm6JFHHtGoUaMkSe3atdP06dMdXGmV0tLS04bZvXv3Vu/evWuvICexfft2SVJwcLDmzJljl/s808/yTAYPHqzBgwfXOLZt2zbbP0+aNEnNmzeXJK1atUplZWWSpDfffFMJCQl/+3GrnW/9ODfn+/0+1XPDWZzP92/Hjh367bffZDKZNHDgQNvxnTt3OrSv1q9fr7vvvlt5eXlq1aqVJk2aJIvFct411EXXXHONNm/erClTpqh///6OLgcAgDqHld4AAKCGkJAQTZ8+XYsXL9acOXMUExMjq9Wqd955xzZG4mSjJbKysvTkk08qISFBsbGx6tGjh4YNG6aZM2faViqmpaVJkr777rsTRgH89ddfuuuuu9S5c2fFxsbqiiuu0EcffWQLUKSjK8WffPJJvf766+rWrZuGDBmimJgY/fnnn5KkP//8s8bK2FOtlP3ll180bNgwxcfHq3379rrmmms0bdq0Gh8Vr/66N998Uy+99JK6deumHj166JVXXqnxcf7jXXXVVYqJidFLL71kO1ZaWqqLLrpIMTEx+uijjyRJ48aN09VXX60uXbqoXbt2SkhI0FNPPaX9+/ef9md0slXtpxqvMGfOHA0ZMkRxcXGKi4vT8OHDtWrVKtvtFRUVeuedd3TZZZepQ4cO6tq1q6699lqNHz/+lI/ft29fff3115KkAwcO1BhjUVFRoYkTJ+rqq69WbGysOnXqpOHDh+uPP/6wff2xz5/p06frtttuU/v27TVt2rRTPuYXX3yh3r17q2PHjho1atRJV28e/z0YM2aMnnzySdvtV155pW1V6LBhw2zH77rrrhrP5XXr1mnkyJG66KKLFBsbq4EDB+rbb7+t8VjVjzNu3DiNGTNGnTt31qOPPipJys/P19ixY9W3b1/FxsYqISFBzz//fI3xL8eO/5g3b56uvPJKxcXF6ZZbblFqaqrtnKefftr2Nf369VNMTIzee++9k36Pjl0RPHHiRD3xxBOKj49XYmKiPvzww5Oed+zK4eM/iXHseZ9++qkefPBBdezYUQMGDNBff/2ljRs36sYbb1RcXJyGDh1qq/t4CxYs0JVXXqn27dtr6NChNcJmSVq6dKmGDx+uTp06qX379ho8eLAWLlx40nonTJig+++/Xx07dtSbb7550seTpK1bt+rBBx9Ut27dFBsbq759+2rcuHEqKCiwfW9P9tw43Wr6uXPnaujQoYqPj7d9H043DuVs+3TdunUaMWKErdZevXrp3nvv1fr16zVjxgz169fPdu7TTz99wn2eqcdP12+FhYV68cUX1bt3b7Vv317dunXT4MGD9b///e+U1yVJM2fOlCR16NDBFiq/9957p+2r83mNPxurVq3SHXfcoby8PLVr105Tpkyx1Xbs74GffvpJ119/vTp06KARI0Zo//79mjVrlvr166cuXbro8ccfV35+vu1+rVarpk6dqmuuuUYdOnRQ586dNWrUKNsbf5KUlpamu+++W7169VKHDh3UoUMHDRgwQJMmTarxO6X6+kaPHq13331XCQkJ6tq1q5544okaj/nbb7/p5ptvVteuXdWhQwf17dtXDzzwgPbs2WM7p0+fPpKkpKQk7d69+6y+RwAAOBNCbwAAcErR0dF6/fXXbf/+5ZdfnvLcF198UT/88IMKCgrUqlUreXp6KikpSX/++afc3NzUsWNHubq6SpICAwNrjKFYsWKFbr/9di1dulRGo1GNGjXSzp079a9//UtPPfXUCY81b948ff755woJCZGXl5c6duwob29vSZK3t/cZx5nMnDlT999/v1atWiVPT08FBwdry5YtevHFF/X222+fcP7kyZM1Z84cubu7KycnR5999tlpxwwMGjRIkvTjjz+qoqJCUlWwd/DgQRmNRl133XWSpCVLlmjfvn0KDw9XkyZNlJWVpe+//17333//Ke/7XEycOFGPPfaY1q5dq+DgYAUEBNi+10lJSZKqxpT85z//UVpampo1ayaz2azU1FT9+OOPp7zfNm3aKDAwUFLVJwM6duyoNm3aSJKef/55jRs3Ttu3b1d4eLhcXV21YsUK3Xnnnfr1119PuK+XXnpJ27ZtU+PGjWU0nvxP019//VX//Oc/lZGRIQ8PD23fvl0vvPDCGa+/cePGaty4cY26O3bsqMaNGys6Otp2PDo62jaqZ/Xq1Ro2bJgWL14sFxcXNW3aVFu3btUzzzyjiRMnnvAYn332mebPn6+IiAi5ubmptLRUw4cP16RJk7R//35FRUWpoKBAX331le64444aAZ8k7du3T08++aQMBoOKi4v1119/6Zlnnjlt/WFhYWe89rffflvLly+Xu7u79u/fr3//+99atmzZGb/uVP71r39p06ZNMhqN2rZtm/7v//5Pd955pw4fPqzy8nKtXr3aVvexDhw4oMcff1wmk0mVlZVavXq17r33XpWUlEiS5s+fr7vvvlsrVqyQr6+vwsPDtW7dOt1///2aP3/+Cff373//WytWrFCTJk1sIzWOl5KSoptuukk///yzSktL1aRJE2VkZGjixIm66667VFlZecrv7aleMyZOnKhHH31Uq1evlsFgUJMmTZSWlqZNmzb9nW+nTWVlpe699179/vvvMplMatmypcrLy/Xrr78qNTVVZrPZ1ltS1XOiY8eOtufv2fT4sY7vt3fffVfTpk1TVlaWWrRoIV9fX23cuPGkvXqs6jcZY2NjbcfCwsJO2Vfn+xp/Jhs2bNDdd9+t/Px8xcXFafLkybbXqOM9+eSTKioqUmlpqX7//XfdfvvteuaZZ+Ti4qLDhw9r9uzZmjBhgu38V155RS+99JK2bNmiyMhIeXh4aNGiRbr55pttIXROTo6WLFliu24fHx9t27ZNY8eOPembeXPnztWkSZPk7u6uQ4cOadasWbbHzMnJ0f3336+kpCR5e3urefPmKigo0IIFC2q82de8eXP5+vpKUp3fWwMAAEcg9AYAAKfVtm1bW6C8devWU563c+dOSdILL7ygGTNmaOHChVq2bJluu+022+rx6tmuvXv31vT
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x576 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABbkAAAH5CAYAAACs1TPGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACUb0lEQVR4nOzdeViU9f7/8dc9M+zboKAiCLjiArgvpW1aarapRZlWJ21Ts8U6mfUrO+d8PbanpWlZ2aqVllnuZracstwTd80CFRdAwA1lmZnfH8gkCoo6MMA8H9fVFdz3Pfe8b2Y+A77mM++P4XA4HAIAAAAAAAAAoBoyubsAAAAAAAAAAAAuFCE3AAAAAAAAAKDaIuQGAAAAAAAAAFRbhNwAAAAAAAAAgGqLkBsAAAAAAAAAUG0RcgMAAAAAAAAAqi1CbgAAqqE777xTcXFxuvPOO53b4uLiFBcXp4kTJ0qSVqxY4dy2YsUKd5UKF8jPz9fTTz+tSy+91PmYHj58uNLuv7Tn0sSJE53bTvXBBx+oe/fuatmypeLi4rR06VJJ0ty5c9WrVy/Fx8crLi5OH3zwQaXVX9ONHj1acXFx6t69u7tLOauynhvnq6znXk22detWtWjRQt27d1dhYWG5b7dnzx7nz2r27NkVWGHpunfvrri4OI0ePfqcx3ri41rV/Pnnn2rRooWuuOIK5eXlubscAADOCyE3AABVSEFBgaZOnao+ffqoTZs2ateuna6++moNGzZMycnJzuMaN26s1q1bq3Hjxm6s9uKUFX4Qzp9pxowZ+vLLL3Xw4EE1adJErVu3ltlsdmtN9erVU+vWrdW6dWvnti1btuj5559XWlqawsPD1bp1a4WEhOjgwYN66qmnlJKSoqCgILVu3Vp16tRxY/Wlmz17tvO5t2fPHneXU6OU9dyoatwdCpfl1Vdfld1u11133SWLxeLucsqtRYsWat26tRo0aODcdj7Bt7uc+nvo1OfB119/7XyT5qGHHlJBQUGJcL5ly5bau3dviXMNHjzYub+qvxHVqFEjXXXVVdq/f78++ugjd5cDAMB5qT5/IQEA4AFefvllffjhh5KkmJgY+fj4aO/evVq2bJmuueYaJSYmSpL+9a9/ubFKnK/8/Hx5e3tf8O3/+OMPSVJ4eLjmz59fJWpKSkpSUlJSiW07duxwfv3BBx+oYcOGkqQ1a9aooKBAUtFzvFu3bhd8v8Uutn6cn4v9eZf13PAUF/Pz++uvv/TTTz/JbDbrhhtucHFlFaP4et988013l+IyM2fO1HPPPSe73a7rr79eL7744hlvONhsNs2YMUP//Oc/JUk7d+7U8uXL3VHuBbvxxhv13Xffafr06brnnntkMjEvDgBQPfAbCwCAKqQ4wBw+fLiWLFmiuXPnavXq1fr888+dAbdUeruSszlw4IAefPBBtWnTRt27d9esWbNK7N+7d69GjRqlrl27qlWrVrrsssv07LPP6uDBg85jSmuJUNbM159//ll33XWX2rVrp4SEBCUlJWnZsmWS/p4pmZaWJkn66quvSrRaueuuu5znueuuu0rM+HM4HJo+fbpuvPFGJSYmqn379ho6dKgzBC5LZmamnnjiCXXr1k3x8fG65JJLNHDgQH399dfOY44ePaqXXnpJ11xzjeLj49WpUyfdfffdysnJkVQUXkybNk3XXXed4uPj1a5dO91111369ddfnec4dfbfzJkzdeeddyohIUEzZsyQVBRWjRw5Updcconi4+PVs2dPvfvuu7Lb7WXWfurjlZGRUeIxcEVNpfn000915ZVXqnXr1ho6dKgOHDhwxjGntxYYPXq0nnjiCef+3r17Ox+7gQMHOrffc889JWbpJycn64EHHlCnTp0UHx+vG264QV9++WWJ+yq+nxdffFGjR49W+/btNXLkSOfj9vzzz6t79+6Kj49Xt27dNGbMmBLtXE597i5cuFC9e/dWmzZtNGjQIP3555/OY5566innbXr06FGi/c/pTp3xO23aNP3zn/9U27Ztddlll2ny5MmlHnfqjNDTZ7Oeetx7772nESNGqHXr1rr++uu1evVqbd68WbfccovatGmj22+/3Vn36ZYuXarevXsrISFBt99+e4lwWTr72Dy9jnfeeUfDhw9X69at9fLLL5d6f5K0fft2jRgxQp07d1Z8fLy6d++uF198UceOHXP+bEt7bpxttvyCBQt0++23q23bts6fw9nam5T2mlha+4vk5GQNHjzYWesVV1yh+++/Xxs2bNDs2bPVo0cP57FPPfXUGeecP3++br31VrVp00Zt2rTRXXfdpTVr1jj3n2285ebm6t///reuvPJKJSQkqHPnzkpKStL7779f5nVJcr5OJSYmqnbt2s7tP/30kwYOHOh8PWnXrp0GDhyoH3/88aznk4qeJ7169VJCQoIGDRqkH3/8sdTn6bke29N/9lOnTlW3bt3UtWtXSSWf52d77T/d2rVrdfPNN6t169bq16+ffv/9d+e+Ux/Xn3/+Wddee61at26tRx55REePHtUHH3ygbt26qXPnzvq///u/Eu1dLrQlyscff6wxY8bIbrerf//+evnll0udUe/l5aVZs2bpxIkTkuScDe3l5VXqec/1fMrNzdXw4cPVvXt3tWnTxvl74/XXX1d+fr7zuFMfg+nTp6t79+5q27atHnjgAWVkZDiPO9vzv9jll18us9msffv28WkqAEC1QsgNAEAVUhx2Ll++XMuWLVNGRoYMw1CbNm3UpEmTCz7vs88+qy1btshsNistLU1jxozRzp07JUkHDx7Ubbfdpq+//lqHDx9WbGyssrOzNXPmTA0cOLBEmFEeixYt0r333qsVK1YoKChIERERSk5O1vDhw7Vo0SJ5e3urdevWzn/0h4aGOtte1KtXr0QLluK2LMUfdR87dqz+85//aNu2bYqKipKvr6++//57DRgwQLt37y6zpn//+9/65ptvdOzYMTVr1kx+fn5at26dVq5cKalo1uFdd92l9957T7t27VJYWJhCQ0O1YsUKHT16VJI0ZswYvfjii/rjjz8UEREhLy8vrVixQkOGDCk1VPrPf/6jHTt2qEGDBjKZTEpNTdWtt96qBQsWqLCwUI0aNdLu3bv18ssv67///W+Ztbdo0UKhoaGSioKS1q1bq0WLFi6pqTQ//vij/vWvf2nfvn3y9fXVH3/8oeeee67M+oo1aNCgREuCU9sUlPaYBgYGau3atRo4cKB++OEHWSwWxcTEaPv27Xr66ac1bdq0M+7j448/1qJFi1S/fn15e3s7H7cPPvhA6enpatSokY4dO6bPP/9cd999t3P2eLEDBw7oiSeekGEYOnHihFavXq2nn376rPXXq1fvnNf+2muv6bfffpOPj4/S09P1+uuv65dffjnn7coyYcIEbdmyRSaTSTt27NDDDz+sIUOG6MiRIyosLNTatWuddZ8qIyNDjz/+uMxms+x2u9auXav777/f2Vv3XGPzdK+//rpWrFih6OjoMltk7Ny5U7fddpu+/fZb5efnKzo6Wvv27dO0adN0zz33yG63l/mzLWtm87Rp0zRy5EitXbtWhmEoOjpaaWlp2rJly4X8OJ3sdrvuv/9+LV++XGazWU2bNlVhYaF+/PFH/fnnn6pVq5ZzbElFz4lT20JNmzZNjz32mNavX6/w8HBZrVatWLFC//jHP7Ru3boz7u/08fbGG29oxowZyszMVJMmTRQUFKTNmzefM5Qufp2Kj48vsX3Hjh1KTk5WQECAmjZtKofDoTVr1mj48OHaunVrmefbtm2bHn74YaWkpMhisejgwYN69NFHzziuPI/tqdatW6cJEyYoJCREwcHBZ5zvbK/9pxsyZIiOHTumwsJCbd68WY899lipvcgffvhhORwOnThxQosWLdJtt92m8ePHy9fXVzk5Ofrkk08uuu3M559/rrFjx8rhcGjgwIEaN25cma+fvXr1Uk5OjubOnasjR47om2++UXBwsLp06XLGseV5Pp04cULfffed8vLyFBsbq9q1ays1NVWTJ0/W+PHjzzjnunXr9OKLL8rLy0u5ubn64Ycf9MILL0g
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x576 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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AtStWzeFhoZq+/btat++verUqaOBAwdaTSmQ0VFI69at082bN+Xm5qaHH35YklIcxbF792517txZ/v7+6ty5s3bv3p3iN7O2LpeS3bt3G5eJ1q5dW61bt9bMmTONkzxL+/r5+Wns2LGaOnWq6tevr+DgYM2fP1/Xrl3TSy+9pKCgILVu3VobN260Wv/p06c1atQoNWrUSLVr11arVq301VdfKTExMdn6X331Vb3//vtq2LChunfvLkn64IMP1K5dOz3yyCOqVauWgoODNW7cOF2+fFnSve2kb9++xrr69u1rtb3dv/1ZRklMnjzZ+J3Y2Fg1aNBAfn5+mjlzpvHYZ599ZlwC3LBhQ40ZM0YXL140fm/79u1GEP3www9rzZo1WrNmjTZt2qTt27fr2WefTbXdU7qcLKV9QExMjCZNmqTHH39c/v7+atiwobp166ZvvvlG0r1v6v/66y9J9z7T968zs+2f1mXrixcv1uDBgxUYGJjs82TZtmzZLv39/eXj46Pbt29rzZo1qbYZAKRn5cqVkqRhw4Zp7dq1Wr58uXbv3q0FCxYYQbSU8StK0uo/SNL58+c1duxYNW7cWLVq1VKTJk301ltv6erVq8YyKV3Bldqlxdu2bVPfvn1Vt25d+fv7q1u3bsbx1XKsCA8PlyQtWbLEat+a1jHRbDZr3rx56tixowICAlSvXj0NGTLECEZTk7RP9scff6hTp07y9/dXx44dtXv37nTbb9GiReratasCAgIUFBSk7t27GyO00no/qdXSq1cv4+fnn3/eqv+VkX5NSse9lJw4cULPPPOM0b9dv359smXuP4ZbjpeWK9++/PJL42/h5+enM2fOSJJWrFhh9Te6deuWpkyZopCQEONqqwkTJujGjRvGayXdlhYvXmwse/PmTUkZO4dJ7VhuWcbi008/tekKxFWrVumZZ55RnTp1FBgYqPbt26fYXhaucF6XXl8sNZZzvICAABUvXtx4fMuWLerVq5fRN6tbt6569eql33//Pc31SdL69evVunVr+fv7q3fv3vr9999THBF+/PhxjRgxwmivkJAQffDBB4qOjk6x7WfNmqXg4GA1btxYknX/OSOf0X/++UdPPfWUAgMD1aVLF6uRq0n/rtu2bdOTTz6pwMBAjRw5Urdu3dLcuXMVHByshg0b6p133rG6ajSjU2BY2qJy5coqWLCg4uLitGLFimTL/fTTT3r88ccVGBiowYMHa9myZSme09m6XErS2v9J1vuOOXPmaMSIEcZnZ/fu3Tp8+LCefvppBQUF6ZlnnrEK2aW0jxf3r3/27NkaNmyYAgMDNXXqVMXExGjYsGEKCQlRUFCQca4wbdo0I0vo06ePcb4jyWp7u3+/d+nSJdWsWVN+fn5avXq18TsHDhwwlrN87mzJMD777DMjiO7QoYP++OMPLV++XH/++adWrFihRx99NNV2t/WYe/r0aQ0fPlyPPfaYsc/t16+ftm7datN+MDPtn1KGkHRb//PPP9WlSxcFBAQk+zxJtm+XlgFve/bsscpbshphNJzu5s2bxs6pRo0aGjt2rPLly2c8HxQUlOaOxRaJiYkaNGiQduzYITc3N1WvXl3x8fH6/fffderUKRUrVsxqigfLtA+W0dhff/21Ro8erX379snHx0deXl7auXOnnnvuOe3Zsyf
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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a7169dSrVy8FBwdr586d6tKlixo0aKBhw4ZZTSmQ3lFImzZt0q1bt+Tu7q77779fkmyO4ti3b5+6d+8uf39/de/eXfv27bP5zay9y9myb98+4zLRunXrqn379po1a5ZxkmdpXz8/P40dO1ZTp05VkyZN1LJlSy1ZskQ3btzQCy+8oICAALVv315btmyxWv+5c+f08ssvq3nz5qpbt64effRRzZ07VwkJCcnW/+qrr+rDDz9Us2bN1Lt3b0nSRx99pM6dO6tx48aqU6eOWrZsqddee01Xr16VlLifDBo0yFjXoEGDrPa3e/c/yyiJiRMnGr8TExOjpk2bys/PT7NmzTIemzlzpnEJcLNmzTRmzBhdvnzZ+L2dO3caQfT999+vDRs2aMOGDdq6dat27typJ598MsV2t3U5ma3PgOjoaL377rtq06aN/P391axZM/Xq1Uvz58+XlPhN/Z49eyQlvqfvXWdm2z+1y9ZXrFih4cOHq379+sneT5Z9y5790t/fXz4+Prp9+7Y2bNiQYpsBQFrWrVsnSXruuee0ceNGrVmzRvv27dPSpUuNIFpK/xUlqfUfJOnixYsaO3asWrRooTp16qhVq1Z6++23df36dWMZW1dwpXRp8Y4dOzRo0CA1bNhQ/v7+6tWrl3F8tRwrQkNDJUkrV660+mxN7ZhoNpu1aNEidevWTfXq1VOjRo307LPPGsFoSpL2yf744w899thj8vf3V7du3bRv374022/58uXq2bOn6tWrp4CAAPXu3dsYoZXa60mplv79+xv/fuqpp6z6X+np19g67tly+vRp9evXz+jfbt68Odky9x7DLcdLy5VvX331lfG38PPz0z///CNJWrt2rdXfKDIyUpMnT1ZgYKBxtdX48eP133//GdtKui+tWLHCWPbWrVuS0ncOk9Kx3LKMxRdffGHXFYhBQUHq16+fGjRooPr166tLly4228siJ5zXpdUXS4nlHK9evXoqWbKk8fj27dvVv39/o2/WsGFD9e/fX7/99luq65OkzZs3q3379vL399eAAQP022+/2RwRfurUKY0aNcpor8DAQH300UeKioqy2fZz5sxRy5Yt1aJFC0nW/ef0vEcPHDigxx9/XPXr11ePHj2sRq4m/bvu2LFDHTt2VP369fXiiy8qMjJSCxYsUMuWLdWsWTO99957VleNpncKDEtbVK1aVYUKFVJsbKzWrl2bbLkffvhBbdq0Uf369TV8+HCtXr3a5jmdvcvZktrnn2T92TFv3jyNGjXKeO/s27dPx48f1xNPPKGAgAD169fPKmSXUj9e3Lv+r7/+Ws8995zq16+vqVOnKjo6Ws8995wCAwMVEBBgnCtMnz7dyBIGDhxonO9Istrf7v3cu3LlimrXri0/Pz+tX7/e+J0jR44Yy1ned/ZkGDNnzjSC6K5du+qPP/7QmjVr9Oeff2rt2rV64IEHUmx3e4+5586d08iRI/Xggw8an7mDBw/W77//btfnYGba31aGkHRf//PPP9WjRw/Vq1cv2ftJsn+/tAx4O3jwoFXektUIo+Fyt27dMj6catWqpbFjxyp//vzG8wEBAal+sNgjISFBzzzzjHbt2iV3d3fVrFlTcXFx+u2333T27FmVKFHCaooHy7QPltHY33zzjUaPHq1Dhw7Jx8dH3t7e2r17t/7
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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a9ZUx44ddeLECW3atElt27ZVUFCQ+vbt6zClQGpHIf3222+6du2aPD09df/990tSkqM4duzYoSeffFIBAQF68skntWPHjiR/mXV2uaTs2LHDPE20Ro0aatmypSZPnmwe5Nnb19/fX0OHDtXYsWP1wAMPqFGjRpo7d66uXLmil19+WbVq1VLLli21bt06h/WfOnVKr776qho0aKAaNWro0Ucf1TfffKP4+PhE63/99df18ccfq379+urUqZMk6ZNPPlGbNm1Ut25dVa9eXY0aNdKwYcN08eJFSbffJz179jTX1bNnT4f3253vP/soiVGjRpmPiY6OVr169eTv76/Jkyebt02aNMk8Bbh+/foaMmSIzp8/bz5u06ZNZhB9//33a9WqVVq1apXWr1+vTZs26Zlnnkm23ZM6nSypfUBUVJRGjhyppk2bKiAgQPXr11fHjh01Y8YMSbd/qd+2bZuk25/pO9d5r+2f0mnrv/zyi/r166fAwMBEnyf7e8uZ92VAQICKFi2qGzduaNWqVcm2GQDczbJlyyRJL774olavXq0lS5Zox44dmjdvnhlES6k/oySl/oMknT17VkOHDlXDhg1VvXp1NW7cWO+8844uX75sLpPUGVzJnVq8ceNG9ezZU7Vr11ZAQIA6duxofr/avytCQ0MlSQsXLnTYt6b0nWgYhmbPnq3HH39cNWvWVJ06dfTCCy+YwWhyEvbJ/vrrLz3xxBMKCAjQ448/rh07dty1/RYsWKAOHTqoZs2aqlWrljp16mSO0Erp+SRXS7du3cy/n332WYf+V2r6NUl97yXl2LFj6tq1q9m/XbNmTaJl7vwOt39f2s98+/rrr83Xwt/fX//8848kaenSpQ6v0fXr1zV69GgFBwebZ1uNGDFC//33n7mthO+lX375xVz22rVrklJ3DJPcd7l9Gbsvv/zSqTMQly9frq5duyooKEiBgYFq27Ztku1l5w7HdXfriyXHfoxXs2ZNFS5c2Lx9w4YN6tatm9k3q127trp166Y//vgjxfVJ0po1a9SyZUsFBASoe/fu+uOPP5IcEX706FENHDjQbK/g4GB98sknioyMTLLtp06dqkaNGqlhw4aSHPvPqfmM7tq1S0899ZQCAwPVvn17h5GrCV/XjRs36rHHHlNgYKBeeeUVXb9+XTNnzlSjRo1Uv359vf/++w5njaZ2Cgx7W1SsWFF58+ZVTEyMli5dmmi5H3/8UU2bNlVgYKD69eunxYsXJ3lM5+xySUlp/yc57jumT5+ugQMHmp+dHTt26ODBg3r66adVq1Ytde3a1SFkl1L+vrhz/dOmTdOLL76owMBAjR07VlFRUXrxxRcVHBysWrVqmccK48ePN7OEHj16mMc7khzeb3fu9y5cuKBq1arJ399fK1euNB+zb98+czn7586ZDGPSpElmEN2uXTv99ddfWrJkibZs2aKlS5fqwQcfTLbdnf3OPXXqlAYMGKCHHnrI3Of26tVLf/75p1P7wXtp/6QyhITv9S1btqh9+/aqWbNmos+T5Pz70j7gbffu3Q55S0YjjIblrl27Zu6cqlatqqFDhypnzpzm/bVq1Upxx+KM+Ph4Pf/889q8ebM8PT1VpUoVxcbG6o8//tDJkydVqFAhhyke7NM+2Edjf/vttxo8eLD27NmjokWLysfHR1u
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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6aKTJ09q27Ztatu2rWrWrKkBAwYkmFIgraOQfv/9d92+fVuurq569NFHJSnJURy7d+9Wx44d5efnp44dO2r37t1JfjNr7XJJ2b17t3GaaI0aNdSiRQvNnDnTOMiztK+vr69GjBih8ePHq06dOmrYsKEWL16s69ev67XXXlNgYKBatGihjRs3Jlj/6dOn9eabb6p+/fqqUaOGnn76aX399deKi4tLtP633npLn376qerVq6euXbtKkj777DO1adNGjz32mKpXr66GDRtq5MiRunLliqQH20mfPn2MdfXp0yfB9vbw9mcZJTF27FjjMVFRUapbt658fX01c+ZM47bp06cbpwDXq1dPw4YN06VLl4zHbdu2zQiiH330Ua1bt07r1q3Tpk2btG3bNj333HPJtntSp5Ml9RkQGRmpDz/8UE2aNJGfn5/q1aunLl26aN68eZIefFO/c+dOSQ/e0w+vM6Ptn9Jp6z///LMGDRqkgICARO8ny7ZlzXbp5+cnLy8v3b17V+vWrUu2zQAgNatXr5Ykvfzyy/rtt9+0cuVK7d69W0uWLDGCaCntZ5Sk1H+QpAsXLmjEiBFq0KCBqlevrkaNGmnUqFG6du2asUxSZ3Ald2rx1q1b1adPH9WqVUt+fn7q0qWLsX+17CtCQ0MlScuWLUvw2ZrSPtFsNmvhwoVq3769/P39Vbt2bb300ktGMJqc+H2yv/76Sx06dJCfn5/at2+v3bt3p9p+S5cuVefOneXv76/AwEB17drVGKGV0utJrpaePXsav7/wwgsJ+l9p6dcktd9LyvHjx9WjRw+jf7t+/fpEyzy8D7fsLy1nvs2aNcv4W/j6+urMmTOSpFWrViX4G925c0fjxo1TUFCQcbbV6NGjdevWLeO54m9LP//8s7Hs7du3JaXtGCa5fbllGYtp06ZZdQbimjVr1KNHD9WsWVMBAQFq27Ztku1lkRWO61LriyXHcozn7++vokWLGrdv2bJFPXv2NPpmtWrVUs+ePbV58+YU1ydJ69evV4sWLeTn56devXpp8+bNSY4I/++///TKK68Y7RUUFKTPPvtMERERSbb97Nmz1bBhQzVo0EBSwv5zWt6je/bs0TPPPKOAgAB16tQpwcjV+H/XrVu3qlWrVgoICNDrr7+uO3fuaP78+WrYsKHq1aunjz76KMFZo2mdAsPSFt7e3sqfP7+io6O1atWqRMv98MMPatKkiQICAjRo0CCtWLEiyWM6a5dLSkqff1LCz465c+fqlVdeMd47u3fv1pEjR/Tss88qMDBQPXr0SBCySynvLx5e/5w5c/Tyyy8rICBA48ePV2RkpF5++WUFBQUpMDDQOFaYPHmykSX07t3bON6RlGB7e/hz7/Lly6pWrZp8fX21du1a4zEHDx40lrO876zJMKZPn24E0e3atdNff/2llStX6u+//9aqVav0+OOPJ9vu1u5zT58+rSFDhuiJJ54wPnP79u2rP//806rPwYy0f1IZQvxt/e+//1anTp3k7++f6P0kWb9dWga87d27N0He4miE0XC627dvGx9OVatW1YgRI5Q7d27j/sDAwBQ/WKwRFxengQMHavv27XJ1dVWVKlUUExOjzZs369SpUypSpEiCKR4s0z5YRmN/8803Gjp0qPbv3y8vLy95eHhox44dev7557V3795
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABbkAAAH5CAYAAACs1TPGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACkuklEQVR4nOzdeViU9f7G8XvYZZNVATdcABFwKzVTM/clc0vLNk/7YrZpWXrKlmPZotlim5V1KisrU3NXcik1Nc1UQEFRXHBjVZEd5veHP+eIgqIOPMC8X9fVdeXwMHPPMJ9B7/nO9zGZzWazAAAAAAAAAACohuyMDgAAAAAAAAAAwJWi5AYAAAAAAAAAVFuU3AAAAAAAAACAaouSGwAAAAAAAABQbVFyAwAAAAAAAACqLUpuAAAAAAAAAEC1RckNAKgW7r77boWFhenuu++2XBYWFqawsDB98MEHkqSNGzdaLtu4caNRUWEF+fn5mjBhgq6//nrLz/TkyZOVdvulPZc++OADy2Xn+uqrr9S9e3e1aNFCYWFhio6OliQtWLBAffr0UWRkpMLCwvTVV19VWv6a7vnnn1dYWJi6d+9udJSLKuu5cbnKeu7VZLt27VJ4eLi6d++uwsLCcn/foUOHLI/VL7/8UoEJS9e9e3eFhYXp+eefv+SxtvhzLY0tPg5GP0/P+uWXXyw5Dh06ZFiOy1UZf99bt26dwsLCdMstt8hsNlfIbQAArIuSGwBgqIKCAs2YMUP9+/dX69at1bZtW/Xs2VOPPvqotm/fbjmuadOmatWqlZo2bWpg2qtTVvlBOX+h7777TnPmzFFaWpqaNWumVq1ayd7e3tBMAQEBatWqlVq1amW5bOfOnZo8ebKSk5Pl7++vVq1aqXbt2kpLS9P48eOVlJQkDw8PtWrVSnXq1DEwfemqa8FRHZT13KhqqkrZdr6pU6equLhYI0eOlIODg9Fxyi08PFytWrVSgwYNLJddTvFdFfTr18/ynHjiiSeMjlOtlVXgOzk5WX6f+Pj4VMhtFxcX6+eff9bdd9+t9u3bKzIyUt27d9eYMWP0zz//VMhtnu/8xQjW4u7ubnn83N3drXrdZ3Xq1EnNmzdXTEyMlixZUiG3AQCwrurzN0YAQI309ttv67///a8kqVGjRnJ2dtbhw4e1cuVK9erVSy1btpQkvfzyywamxOXKz8+Xk5PTFX//nj17JEn+/v5atGhRlcg0fPhwDR8+vMRlu3fvtvz/V199pcaNG0uStmzZooKCAklnnuOdO3e+4ts962rz4/Jc7eNd1nPDVlzN47dv3z79/vvvsre3180332zlZBXj7P398MMPjY5yVbZu3aq9e/da/rxy5UplZGTI29vbwFRVizVei+vUqaMff/zRSokulJ+fr0cffVRr166VJDk7O6tx48ZKSUnRokWL5Ovrq9atW1fY7Vek/Px8RUREVOjjd9bAgQO1a9cuff311+rfv3+F3x4A4OqwkhsAYKizBeaoUaO0fPlyLViwQJs3b9bs2bMtBbdU+nYlF3Ps2DE99thjat26tbp3766ffvqpxNcPHz6scePGqVOnToqIiFCXLl304osvKi0tzXJMaVsilLXyde3atRo5cqTatm2rqKgoDR8+XCtXrpT0v5WSycnJkqS5c+eWWN00cuRIy/WMHDmyxIo/s9msWbNmaeDAgWrZsqWuueYaPfLII5YSuCypqal69tln1blzZ0VGRqpjx4664447NH/+fMsxWVlZeuutt9SrVy9FRkaqffv2uueee5SZmSlJKioq0syZM3XTTTcpMjJSbdu21ciRI/Xnn39aruPcVeg//vij7r77bkVFRem7776TdKasevrpp9WxY0dFRkaqd+/e+vzzz1VcXFxm9nN/XikpKSV+BtbIVJrvv/9eN954o1q1aqVHHnlEx44du+CY81fkPf/883r22WctX+/bt6/lZ3fHHXdYLr///vtLrNLfvn27Hn74YcvKuptvvllz5swpcVtnb+fNN9/U888/r2uuuUZPP/205ec2efJkde/eXZGRkercubMmTpxYYjuXc5+7S5YsUd++fdW6dWvdeeedlgLr+eef1/jx4y3f06NHj4uuuDt3xe/MmTP1zDPPqE2bNurSpYs++uijUo87d2Xw+atZzz3uiy++0OjRo9WqVSsNGDBAmzdvVlxcnIYNG6bWrVvr9ttvL1G8nSs6Olp9+/ZVVFSUbr/99hLlsnTx2Tw/x2effaZRo0apVatWevvtt0u9PUlKSEjQ6NGj1aFDB8vqyDfffFOnT5+2PLalPTcutlp+8eLFuv3229WmTRvL43Cx7U1Ke00sbdXo9u3bde+991qydu3aVQ899JB27NihX375RT169LAcO378+Auuc9GiRbr11lvVunVrtW7dWiNHjtSWLVssX7/YvGVnZ+uVV17RjTfeqKioKHXo0EHDhw/Xl19+Web9kmR5nWrZsqV8fX0tl//++++64447LK8nbdu21R133KE1a9Zc9PqkM8+TPn36KCoqSnfeeafWrFlT6vP0Uj/b8x/7GTNmqHPnzurUqZOkks/zi732n+/vv//WLbfcolatWmnIkCElVtqe+3Ndu3at+vXrp1atWunJJ59UVlaWvvrqK3Xu3FkdOnTQf/7znxLbu1zuViBnH4vGjRvLzc1NBQUFWrhw4QXH/fDDD5bXzIcffljz588v9RNJ5T2uNHPmzNHQoUPVsmVLtW7dWrfeemuJFbVX+xpyNa8N2dnZGjVqlLp3767WrVtbfr+99957ys/Pl3TmeTJ9+nTL9Z37fDv/dfLYsWMKDw9XWFiYli5davmeHTt2WI47O3cpKSn697//rS5duigyMlLdunXTlClTLLcrSR9++KGl4L755pv1559/asGCBdqwYYMWLlyo6667rszHvbx/99m3b58ee+wxXX/99ZbfRffcc4/++OMPy+vCWdOnT7/gOq/m8b/UlmIbNmzQkCFD1LJlywvmSSr/87Jbt26Szrz5c+DAgTIfMwBA1UDJDQAw1Nmyc/369Vq5cqVSUlJkMpnUunVrNWvW7Iqv98UXX9TOnTtlb2+v5ORkTZw4UYmJiZKktLQ03XbbbZo/f75Onjyp4OBgZWRk6Mcff9Qdd9xRoswoj6VLl+qBBx7Qxo0b5eHhocDAQG3fvl2jRo3S0qVLLR9LdnR0lCR5e3tbPmYbEBBQYguWs9uynP2o+6RJk/Tqq68qPj5e9evXl4uLi1atWqURI0bo4MGDZWZ65ZVX9Ouvv+r06dMKDQ1VrVq1tHXrVm3atEnSmZVQI0eO1BdffKEDBw7Iz89P3t7e2rhxo7KysiRJEydO1Jtvvqk9e/YoMDBQjo6O2rhxo+67775SS6VXX31Vu3fvVoMGDWRnZ6f9+/fr1ltv1eLFi1VYWKgmTZro4MGDevvtt/Xaa6+VmT08PNyyatDR0VGtWrVSeHi4VTKVZs2aNXr55Zd15MgRubi4aM+ePXrppZfKzHdWgwYNSmxJcO42BaX9TN3d3fX333/rjjvu0OrVq+Xg4KBGjRopISFBEyZM0MyZMy+4jW+++UZLly5VUFCQnJycLD+3r776SsePH1eTJk10+vRpzZ49W/fcc49l9fhZx44d07PPPiuTyaTc3Fxt3rxZEyZMuGj+gICAS973d955Rxs2bJCzs7OOHz+u9957T+vWrbvk95Xl3Xff1c6dO2VnZ6fdu3friSee0H333adTp06psLBQf//9tyX3uVJSUjR27FjZ29uruLhYf//9tx566CHl5eVJuvRsnu+9997Txo0b1bBhwzK3yEhMTNRtt92mFStWKD8/Xw0bNtSRI0c0c+ZM3X///SouLi7zsS1r9efMmTP19NNP6++//5bJZFLDhg2VnJysnTt3XsnDaVFcXKyHHnpI69evl729vUJCQlRYWKg1a9Zo79698vHxscyWdOY5ce62UDNnztSYMWO0bds2+fv7y8vLSxs3btS//vUvbd269YLbO3/e3n//fX333XdKTU1Vs2bN5OHhobi4uEuW0mdfpyIjI0tcvnv3bm3fvl1ubm4KCQmR2WzWli1
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x576 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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nm/cuKFBgwbJ19dXfn5++umnn4zbYu5Py6/I3t7e6tixoy5cuKDdu3erdevWql69uvr16xdraoTk/tp98eJFnTx5UpI0b948/frrr9q0aZP+/vtvffvtt7GCaMvjTZkyRR9++KFq166tWrVqacKECbH2bXh4uGbOnGmcqlq3bl0NHz5c169fj7XtEydO6I033jDeD02aNNGMGTOM2i1mzJgRq21jtvXKlSvl5+enatWq6d69e1q9erX+97//qW7duqpatapq166tV199Ndbos/js3r3bCKKrVKmiTZs2adOmTdq+fbt2796tHj16JHjf+E4ni++9ExYWpvHjx6tx48by8vJS3bp11bFjR33//fdG++7fv1/S4/fCk4958eJFvf3223rmmWdUrVo1NWvWTPPmzVN0dLRRi+W1/c477+jTTz9V3bp11alTp1j7L77TvVeuXKkBAwbIx8cnzutQkg4ePKh27drJy8tL7dq108GDB+MdWeDl5SV3d3c9ePBAmzZtSrTNASAzWL9+vSTpjTfe0ObNm7V27VodPHhQy5cvN4JoKeVnxiTWf5Ckq1evauTIkapfv76qVq2qhg0basyYMbp165axTnxncCV0ivSuXbvUq1cv1ahRQ15eXurYsaO2bdsm6f++8wICAiRJq1ativUd0atXL+NxevXqFasPZjabtWTJErVt21be3t6qWbOmXn/9dSMYTUjMPtlff/2ll156SV5eXmrbtq0OHjyYZPv98ssv6tChg7y9veXr66tOnToZI80Sez4J1dKtWzfj71dffTVW/+vgwYPG9BfVqlVT8+bNNWvWLCO8lhL//o7PuXPn1LVrV6N/u2XLljjrPNkXsXzvW6ZmmD17trEvPD09denSJUnSunXrYu2j+/fva9KkSUZ/q0GDBho7dqzu3r1rbCuxvpmUsmOYhPokSfUPE7JhwwZ17dpV1atXl4+Pj1q3bh1ve1k4wnFdUn3KhFiO8by9vVWgQAFj+c6dO9WtWzejj1mjRg1169ZNO3bsSPTxJGnLli1q3ry5vLy81L17d+3YsSPeEeFnz57V4MGDjfby8/PTZ599ptDQ0Hjbfs6cOWrQoIHq168vKfYo6JS8Rw8dOqSXX35ZPj4+at++fawRuDH3665du/Tiiy/Kx8dHQ4YM0f3797VgwQI1aNBAdevW1UcffRRrWpPkTkWxc+dOI4jesWOHVq1ape3bt2vPnj16//33jfWefA+89tpr8vb2VqNGjbRs2bJYj5ncY+2EXvtJfS4n9nn02WefqVWrVqpVq5aqVq2qBg0a6N1331VgYGCi7TBz5kwjiG7Tpo3++usvrV27Vnv37tW6detUr169BO+b3O+qixcvatCgQXr22WeNz6revXvrzz//TNbnR2Lfc1Lsz9S5c+fqjTfekI+PjyZPnhzvsXfM18jevXvVvn17eXt7x3kdStKPP/6oxo0by8fHRwMGDNCaNWviPZZv0qSJJOnw4cOxcoqMiDAamcK9e/e0ceNGSVKlSpU0cuRIZcuWzbjd19c30Q/I5IiOjlb//v21Z88eOTk5qWLFioqMjNSOHTv077//Kn/+/LGmeLBM+2AZjf3dd99p2LBhOnr0qNzd3eXq6qp9+/bplVde0eHDh+Nsb8KECTp37pxKliypLFnifyuPHz9ev/7
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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K1euaMiQIfLz85O/v79++ukn4764+9PyLbKPj4+6du2qU6dOafv27Wrfvr1q166tl156Kd7UCNZ+233mzBkdPnxYkjR37lz98ssvWr9+vfbs2aOvv/46XhBtWd/kyZP13nvvqX79+qpXr57Gjx8fb99GRERoxowZxqmqDRs21IgRI3T58uV42z506JBeeeUV4/XQsmVLffnll0btFl9++WW8to3b1suWLZO/v79q1aqlO3fuaMWKFXr22WfVsGFD1axZU/Xr19cLL7wQb/RZYrZv324E0Y888ojWr1+v9evXa/Pmzdq+fbuee+65JP82sdPJEnvthIeH6/3331eLFi3k7e2thg0bqmvXrvr222+N9t21a5ek2NfCw+s8c+aM3njjDTVu3Fi1atXSk08+qblz5yomJsaoxfLcfvPNN/Xxxx+rYcOG6tatW7z9l9jp3suWLdOgQYPk6+ub4HkoSf/88486deokb29vderUSf/880+iIwu8vb3l4eGhe/fuaf369cm2OQDkBGvWrJEkvfLKK/rtt9+0atUq/fPPP1qyZIkRREupPzMmuf6DJF28eFGjRo1SkyZNVLNmTTVr1kxjx47V9evXjWUSO4MrqVOkt23bpr59+6pOnTry9vZW165dtWnTJkn/+8wLDg6WJC1fvjzeZ0Tfvn2N9fTt2zdeH8xsNmvhwoXq2LGjfHx8VLduXb388stGMJqUuH2yv/76S08//bS8vb3VsWNH/fPPPym2388//6wuXbrIx8dHfn5+6tatmzHSLLnHk1QtvXr1Mn5/4YUX4vW//vnnH2P6i1q1aql169aaOXOmEV5LyX9+J+bEiRPq2bOn0b/dsGFDgmUe7otYPvctUzPMmjXL2BdeXl46e/asJGn16tXx9tHdu3c1ceJEo7/VtGlTBQQE6Pbt28a2kuubSak7hkmqT5JS/zApa9euVc+ePVW7dm35+vqqffv2ibaXRVY4rkupT5kUyzGej4+PihYtaty+detW9erVy+hj1qlTR7169dKWLVuSXZ8kbdiwQa1bt5a3t7d69+6tLVu2JDoi/Pjx4xo6dKjRXv7+/vrkk08UFhaWaNvPnj1bTZs2VZMmTSTFHwWdmtfov//+q2eeeUa+vr7q3LlzvBG4cffrtm3b9NRTT8nX11evv/667t69q/nz56tp06Zq2LChPvjgg3jTmlg7FcXWrVuNIHrLli1avny5Nm/erB07duidd94xlnv4NfDiiy/Kx8dHzZs31+LFi+Ot09pj7aSe+ym9Lyf3fvTJJ5+oXbt2qlevnmrWrKmmTZvqrbfe0tWrV5NthxkzZhhBdIcOHfTXX39p1apV+vvvv7V69Wo1atQoyb+19rPqzJkzGjJkiB599FHjvapfv376888/rXr/SO5zTor/njpnzhy98sor8vX11aRJkxI99o77HPn777/VuXNn+fj4JHgeStKPP/6oFi1ayNfXV4MGDdLKlSsTPZZv2bKlJGnv3r3xcorsiDAaOcKdO3e0bt06SVL16tU1atQo5cmTx7jfz88v2TdIa8TExGjgwIHasWOHnJycVK1aNUVFRWnLli06ffq0ihQpEm+KB8u0D5bR2N98842GDx+u/fv3y8PDQ25ubtq5c6eef/557d27N8H2xo8frxMnTqhcuXLKlSvxl/L777+
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x360 with 2 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABbkAAAH5CAYAAACs1TPGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACooElEQVR4nOzdd3hU1dbH8d9k0nslFUiAJEAKhK6AKCjVAijFxlWuHeyK5V5BvYgNBbtifVVEkKZUEUEUURANJaGX0BJIpyQhdd4/QoYEEggwyaR8P8/jYzhnnzPrzMyeSdasWdtgMplMAgAAAAAAAACgHrKxdgAAAAAAAAAAAFwsktwAAAAAAAAAgHqLJDcAAAAAAAAAoN4iyQ0AAAAAAAAAqLdIcgMAAAAAAAAA6i2S3AAAAAAAAACAeoskNwAAp9x+++2KjIzU7bffbt4WGRmpyMhIvfPOO5KktWvXmretXbvWWqHCAgoKCvTss8/q8ssvNz+mx44dq7Xbr+y59M4775i3lffFF1+od+/eatu2rSIjI7V8+XJJ0oIFC9SvXz9FR0crMjJSX3zxRa3F39A9/fTTioyMVO/eva0dyjlV9dy4UFU99xqybdu2qU2bNurdu7eKioqqfdzBgwfN99XcuXNrMMLK9e7dW5GRkXr66afPO7YxPq51yaXc/3PnzjUfe/DgwRqIrmbUxu9Jv//+uyIjI3XjjTfKZDLVyG0AAOofktwAgAavsLBQ06ZN08CBA9W+fXt16NBBV199te6//35t2rTJPK5ly5Zq166dWrZsacVoL01VyQ+S82f75ptvNGfOHGVkZKhVq1Zq166djEajVWMKCAhQu3bt1K5dO/O2rVu36uWXX9ahQ4fk5+endu3aycPDQxkZGXrmmWeUlJQkNzc3tWvXTk2aNLFi9JWrr4ma+qCq50ZdY+2kcFXeeOMNlZSUaNSoUbK1tbV2ONXWpk0btWvXTk2bNjVvu5DEtzUlJibqvvvuU48ePRQdHa3LL79cw4YN0+TJk60WkzXeH0tKSjR79mzdfvvt6tKli6Kjo9W7d2899thj2rBhQ63EcOaH+Jbi6upqfh9zdXW16LnLdO/eXa1bt1ZCQoKWLFlSI7cBAKh/6s9vcwAAXKTXX39d//d//ydJat68uRwcHJScnKwVK1bommuuUWxsrCTp+eeft2KUuFAFBQWyt7e/6ON37dolSfLz89OiRYvqREzDhg3TsGHDKmzbuXOn+ecvvvhCYWFhkqS///5bhYWFkkqf4z169Ljo2y1zqfHjwlzq/V3Vc6OxuJT7b+/evfr1119lNBp13XXXWTiymlF2ve+99561Q7kohw4d0r/+9S8dP35cLi4uCg8PV3Z2thITE5WRkaEnnnjC2iFWy6XO24KCAt1///1avXq1JMnBwUFhYWFKS0vTokWL5OPjo/bt21so2tpVUFCgqKgozZo1q8Zv6/rrr9e2bdv05ZdfauDAgTV+ewCAuo9KbgBAg1eWwHzggQe0bNkyLViwQOvXr9fMmTPNCW6p8nYl53LkyBGNGTNG7du3V+/evfXdd99V2J+cnKxx48ape/fuioqKUs+ePfXcc88pIyPDPKaylghVVb6uXr1ao0aNUocOHRQTE6Nhw4ZpxYoVkk5XSh46dEiSNG/evApVWqNGjTKfZ9SoURUq/kwmk6ZPn67rr79esbGx6tixo+677z5zErgq6enpevLJJ80VeZdddpluueUWff/99+YxJ06c0GuvvaZrrrlG0dHR6tKli+644w5lZ2dLkoqLi/XZZ59p0KBBio6OVocOHTRq1Cj98ccf5nOUr7KbNWuWbr/9dsXExOibb76RVJqsevTRR3XZZZcpOjpaffv21SeffKKSkpIqYy//eKWlpVV4DCwRU2VmzJihK6+8Uu3atdN9992nI0eOnDXmzK+2P/3003ryySfN+/v3729+7G655Rbz9n//+98VqhA3bdqke++911wheN1112nOnDkVbqvsdl599VU9/fTT6tixox599FHz4/byyy+rd+/eio6OVo8ePTR+/PgK7VzKP3eXLFmi/v37q3379rr11lu1Z88e85hnnnnGfEyfPn3OWTlYvuL3s88+0xNPPKG4uDj17NlT77//fqXjylcGn1nNWn7cp59+qrFjx6pdu3a69tprtX79em3ZskU33XST2rdvr5tvvtkc95mWL1+u/v37KyYmRjfffHOF5LJ07rl5Zhwff/yxHnjgAbVr106vv/56pbcnSTt27NDYsWPVtWtXc5Xnq6++qpycHPN9W9lz41zV8osXL9bNN9+suLg48/1wrvYmlb0mVtZ+YdOmTbrzzjvNsfbq1Uv33HOPNm/erLlz56pPnz7msc8888xZ51y0aJGGDx+u9u3bq3379ho1apT+/vtv8/5zzbfc3Fy98MILuvLKKxUTE6OuXbtq2LBh+vzzz6u8Lknm16nY2Fj5+PiYt//666+65ZZbzK8nHTp00C233KJVq1ad83xS6fOkX79+iomJ0a233qpVq1ZV+jw932N75n0/bdo09ejRQ927d5dU8Xl+rtf+M/3zzz+68cYb1a5dOw0ZMqRCxXD5x3X16tUaMGCA2rVrp4cfflgnTpzQF198oR49eqhr16763//+V6G9S3Vbcvz666/mBPeqVas0b948rVy5UmvWrNGzzz5rHlf+8Z47d67uuusuxcbGqlevXpoxY0aFc6alpek///mPevbsqejoaF111VWaPHmyCgoKKoyr6rl/vvfHsvv6ySef1CuvvKKuXbtq+PDhkqRXX31VgwYNUqdOnRQVFaUePXroqaeeUmpq6jnvh/fee8+c4L7uuuv0xx9/aMGCBfrzzz+1cOFCdevWrcpjq/s7w969ezVmzBhdfvnl5tfwO+64Q7/99pv5/i3z7rvvnnXOS3lNO18rrj///FNDhgxRbGzsWc9DSfr222/N75X33nuvvv/++0or7a+66ipJUnx8vPbv33/O+xwA0DiQ5AYANHhlyc41a9ZoxYoVSktLk8FgUPv27dWqVauLPu9zzz2nrVu3ymg06tChQxo/frx2794tScrIyNCIESP0/fff69ixYwoNDVVWVpZmzZqlW265pUIyozqWLl2qu+66S2vXrpWbm5sCAwO1adMmPfDAA1q6dKns7e3Vrl072dnZSZK8vLzMXxcOCAio0IKlrC1L2VfdJ06cqBdffFHbt29XSEiIHB0dtXLlSo0cOVIHDhyoMqYXXnhBP/zwg3JychQRESEnJyfFx8dr3bp1kkorukaNGqVPP/1U+/fvl6+vr7y8vLR27VqdOHFCkjR+/Hi9+uqr2rVrlwIDA2VnZ6e1a9dq9OjRlSaVXnzxRe3cuVNNmzaVjY2N9u3bp+HDh2vx4sUqKipSixYtdODAAb3++ut66aWXqoy9TZs28vLykiTZ2dmpXbt2atOmjUViqsyqVav0/PPPKyUlRY6Ojtq1a5cmTJhQZXxlmjZtWqElQfk2BZU9pq6urvrnn390yy236JdffpGtra2aN2+uHTt26Nlnn9Vnn3121m189dVXWrp0qYKCgmRvb29+3L744gulpqaqRYsWysnJ0cyZM3XHHXeYq8fLHDlyRE8++aQMBoNOnjyp9evXmxNWVcUfEBBw3mt/88039eeff8rBwUGpqal666239Pvvv5/3uKpMnTpVW7dulY2NjXbu3KmHHnpIo0eP1vHjx1VUVKR//vmnQqKtTFpamh5//HEZjUaVlJTon3/+0T333KP8/HxJ55+bZ3rrrbe0du1aNWvWrMoWGbt379aIESP0008/qaCgQM2aNVNKSoo+++wz/fvf/1ZJSUmV921VFaafffaZHn30Uf3zzz8yGAxq1qyZDh06pK1bt17M3WlWUlKie+65R2vWrJHRaFR4eLiKioq0atUq7dmzR97e3ua5JZU+J8q3hfrss8/02GOPaePGjfLz85Onp6fWrl2rf/3rX4qPjz/r9s6cb2+//ba++eYbpaenq1WrVnJzc9OWLVvOm5Que52Kjo6usH3nzp3atGmTudLYZDLp77//1gMPPKBt27ZVeb7t27f
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x576 with 1 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"****************************************************************************************************************\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"class Clustering:\n",
|
|||
|
" algorithms = ['KMeans', 'AgglomerativeClustering', 'SpectralClustering']\n",
|
|||
|
" min_n_clusters = 2\n",
|
|||
|
" max_n_clusters = 8\n",
|
|||
|
" # Model distortions for different hyperparameters(n_clusters) \n",
|
|||
|
" kmeans_distortions = [] \n",
|
|||
|
" \n",
|
|||
|
" @staticmethod\n",
|
|||
|
" def sse_plot(): \n",
|
|||
|
" \"\"\"Graphs for the SSE values (KMeans)\"\"\"\n",
|
|||
|
" plt.figure(figsize=(25, 8))\n",
|
|||
|
" sns.set_style(\"darkgrid\")\n",
|
|||
|
" plt.title('Distortion values for different number of clusters (for Kmeans)', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.xlabel('Clusters', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.ylabel('SSE',fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.xticks(fontsize=14)\n",
|
|||
|
" plt.yticks(fontsize=14)\n",
|
|||
|
" plt.plot(list(range(Clustering.min_n_clusters, Clustering.max_n_clusters + 1)), Clustering.kmeans_distortions, marker='o')\n",
|
|||
|
" plt.show()\n",
|
|||
|
" \n",
|
|||
|
" \n",
|
|||
|
" @staticmethod\n",
|
|||
|
" def silhouette_result(metrics_score:list, algorithm: str):\n",
|
|||
|
" plt.figure(figsize=(25, 8))\n",
|
|||
|
" sns.set_style(\"darkgrid\")\n",
|
|||
|
" plt.title(f'Silhouette score for different number of clusters (algorithm: {algorithm})', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.xlabel('Clusters', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.ylabel('Silhouette', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.xticks(fontsize=14)\n",
|
|||
|
" plt.yticks(fontsize=14)\n",
|
|||
|
" plt.plot(list(range(Clustering.min_n_clusters, Clustering.max_n_clusters + 1)), metrics_score, marker='o')\n",
|
|||
|
" plt.show()\n",
|
|||
|
" print('*' * 112)\n",
|
|||
|
" \n",
|
|||
|
" \n",
|
|||
|
" def make_models(self, data_old: pd.DataFrame, data_modified: pd.DataFrame): \n",
|
|||
|
" \"\"\"Method for creating models\"\"\"\n",
|
|||
|
" for algorithm in Clustering.algorithms: \n",
|
|||
|
" # metrics: silhouette score\n",
|
|||
|
" metrics = [] \n",
|
|||
|
" for n_clusters in range(Clustering.min_n_clusters, Clustering.max_n_clusters + 1): \n",
|
|||
|
" if algorithm == 'AgglomerativeClustering':\n",
|
|||
|
" ac = AgglomerativeClustering(n_clusters=n_clusters,\n",
|
|||
|
" linkage='complete')\n",
|
|||
|
" pred = ac.fit_predict(df_transform)\n",
|
|||
|
" labels = pd.DataFrame(pred, columns =['Labels'], index=df.index)\n",
|
|||
|
" metrics.append(silhouette_score(df_transform, labels))\n",
|
|||
|
" Clustering.object_plot(labels, pred, algorithm)\n",
|
|||
|
" \n",
|
|||
|
" if algorithm == 'SpectralClustering':\n",
|
|||
|
" sc = SpectralClustering(n_clusters=n_clusters)\n",
|
|||
|
" pred = sc.fit_predict(df_transform)\n",
|
|||
|
" labels = pd.DataFrame(pred, columns =['Labels'], index=df.index)\n",
|
|||
|
" metrics.append(silhouette_score(df_transform, labels))\n",
|
|||
|
" Clustering.object_plot(labels, pred, algorithm)\n",
|
|||
|
" \n",
|
|||
|
" if algorithm == 'KMeans': \n",
|
|||
|
" kmeans = KMeans(n_clusters=n_clusters, \n",
|
|||
|
" init=\"k-means++\", \n",
|
|||
|
" n_init=10,\n",
|
|||
|
" max_iter=280, \n",
|
|||
|
" random_state=42)\n",
|
|||
|
" pred = kmeans.fit_predict(df_transform) \n",
|
|||
|
" labels = pd.DataFrame(pred, columns=['Labels'], index=df.index)\n",
|
|||
|
" metrics.append(silhouette_score(df_transform, labels))\n",
|
|||
|
" Clustering.kmeans_distortions.append(kmeans.inertia_) \n",
|
|||
|
" Clustering.object_plot(labels, pred, algorithm)\n",
|
|||
|
" \n",
|
|||
|
" if algorithm == 'KMeans':\n",
|
|||
|
" Clustering.sse_plot()\n",
|
|||
|
" print('*' * 112)\n",
|
|||
|
" \n",
|
|||
|
" Clustering.silhouette_result(metrics, algorithm)\n",
|
|||
|
" \n",
|
|||
|
" \n",
|
|||
|
" @staticmethod\n",
|
|||
|
" def object_plot(labs: pd.DataFrame, predict:np.array, algorithm:str):\n",
|
|||
|
" \"\"\"Graphs of the number of objects in a cluster and the silhouette coefficient\"\"\"\n",
|
|||
|
" cluster_group = labs.groupby('Labels').size()\n",
|
|||
|
" plt.figure(figsize=(25, 5))\n",
|
|||
|
" plt.subplot(1, 2, 1)\n",
|
|||
|
" sns.set_style(\"darkgrid\")\n",
|
|||
|
" plt.title(f'Cluster size (algorithm: {algorithm})', fontsize=14, fontweight='bold')\n",
|
|||
|
" sns.barplot(x=cluster_group.values, y=list(map(str, cluster_group.index)))\n",
|
|||
|
" plt.xlabel('Number of objects', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.ylabel('Сlusters', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.xticks(fontsize=14)\n",
|
|||
|
" plt.yticks(fontsize=14)\n",
|
|||
|
" \n",
|
|||
|
" plt.subplot(1, 2, 2) \n",
|
|||
|
" cluster_labels = np.unique(predict)\n",
|
|||
|
" silhouette_vals = silhouette_samples(df_transform, predict, metric='euclidean')\n",
|
|||
|
" y_ax_lower, y_ax_upper = 0, 0\n",
|
|||
|
" yticks = []\n",
|
|||
|
" for i, с in enumerate(cluster_labels):\n",
|
|||
|
" c_silhouette_vals = silhouette_vals[predict == с]\n",
|
|||
|
" c_silhouette_vals.sort()\n",
|
|||
|
" y_ax_upper += len(c_silhouette_vals)\n",
|
|||
|
" plt.barh(range(y_ax_lower, y_ax_upper),\n",
|
|||
|
" c_silhouette_vals,\n",
|
|||
|
" height = 1,\n",
|
|||
|
" edgecolor='none')\n",
|
|||
|
"\n",
|
|||
|
" yticks.append((y_ax_lower + y_ax_upper) / 2)\n",
|
|||
|
" y_ax_lower += len(c_silhouette_vals) \n",
|
|||
|
" silhouette_avg = np.mean(silhouette_vals)\n",
|
|||
|
" plt.axvline(silhouette_avg, color=\"red\", linestyle=\"--\")\n",
|
|||
|
" sns.set_style(\"darkgrid\")\n",
|
|||
|
" plt.title(f'Silhouette plot for different clusters (algorithm: {algorithm})', fontsize=14, fontweight='bold') \n",
|
|||
|
" val = float(''.join([i for i in str(silhouette_avg)][0:5]))\n",
|
|||
|
" plt.xlabel(f'Silhouette = {val}', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.ylabel('Clusters', fontsize=14, fontweight='bold')\n",
|
|||
|
" plt.yticks(yticks, cluster_labels, fontsize=14)\n",
|
|||
|
" plt.show()\n",
|
|||
|
" print('*' * 112)\n",
|
|||
|
" \n",
|
|||
|
"\n",
|
|||
|
"clustering = Clustering()\n",
|
|||
|
"clustering.make_models(df, df_transform)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "6234c083",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.058793,
|
|||
|
"end_time": "2022-08-28T13:52:29.521183",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:29.462390",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# What can we say from these graphs: \n",
|
|||
|
"* Good metric results for Agglomerative and Spectral Clustering algorithms \n",
|
|||
|
"* Best Model: AgglomerativeClustering(n_clusters=3)."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "a0db62cd",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.056866,
|
|||
|
"end_time": "2022-08-28T13:52:29.635184",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:29.578318",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# Now let's build graphs of the main characteristics for features int | float for the best models (since we got object labels)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 25,
|
|||
|
"id": "10d77a73",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:52:29.756771Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:52:29.756257Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:52:29.939735Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:52:29.938377Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.247759,
|
|||
|
"end_time": "2022-08-28T13:52:29.942709",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:29.694950",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"best_model = AgglomerativeClustering(n_clusters=3)\n",
|
|||
|
"labels = pd.DataFrame(best_model.fit_predict(df_transform), columns=['Clusters'], index=df.index)\n",
|
|||
|
"df = pd.concat([df, labels], axis=1)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 26,
|
|||
|
"id": "c474828f",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:52:30.058532Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:52:30.057754Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:52:30.065701Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:52:30.064655Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 0.070059,
|
|||
|
"end_time": "2022-08-28T13:52:30.068513",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:29.998454",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"object_cols = ['Education', 'Kidhome', 'Teenhome', 'Family_Size', 'Alone', 'Partner']\n",
|
|||
|
"num_cols = ['Income', 'Recency', 'MntWines',\n",
|
|||
|
" 'MntFruits', 'MntMeatProducts', 'MntFishProducts',\n",
|
|||
|
" 'MntSweetProducts', 'MntGoldProds', 'NumDealsPurchases',\n",
|
|||
|
" 'NumWebPurchases', 'NumCatalogPurchases','NumStorePurchases',\n",
|
|||
|
" 'NumWebVisitsMonth', 'Age', 'Years_Since_Registration',\n",
|
|||
|
" 'Sum_Mnt', 'Num_Accepted_Cmp', 'Num_Total_Purchases']"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 27,
|
|||
|
"id": "4e349f89",
|
|||
|
"metadata": {
|
|||
|
"execution": {
|
|||
|
"iopub.execute_input": "2022-08-28T13:52:30.193718Z",
|
|||
|
"iopub.status.busy": "2022-08-28T13:52:30.193231Z",
|
|||
|
"iopub.status.idle": "2022-08-28T13:52:44.046400Z",
|
|||
|
"shell.execute_reply": "2022-08-28T13:52:44.044829Z"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"duration": 13.91993,
|
|||
|
"end_time": "2022-08-28T13:52:44.049878",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:30.129948",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x2160 with 18 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x2160 with 18 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABa0AAAJRCAYAAABGN5tKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACy5UlEQVR4nOzde1iUdf7/8dc4CCIHjzCjRpbmoSjRbcvQTTcMcSNXNKlN0zTLDiophZnnTNFNS0rbNrbNtPPqN7GyzQMmumonXXXXtNZcS10ZXAQRldNw//7w52yE4ogzzIHn47q8Lrnnnvt+3zPDvOZ+c8/nYzIMwxAAAAAAAAAAAF6ggacLAAAAAAAAAADgHJrWAAAAAAAAAACvQdMaAAAAAAAAAOA1aFoDAAAAAAAAALwGTWsAAAAAAAAAgNegaQ0AAAAAAAAA8BoBni7AlSorK2W3G54uAwDgYQ0bmj1dAlyIfAcAkO3+h3wHANSU737VtLbbDRUWnvZ0GQAAD4uICPN0CXAh8h0AQLb7H/IdAFBTvjM8CAAAAAAAAADAa9C0BgAAAAAAAAB4DZrWAAAAAAAAAACv4VdjWgMALo3dXqGCgmOqqCjzdCm1EhAQqGbNImQ2E2cAAJzjy/lOtgMAUJ0vZ7tUu3znkwAA1GMFBcfUqFFjhYRYZTKZPF3OJTEMQ6dOFamg4Jhatmzl6XIAAPAavprvZDsAAOfnq9ku1T7fGR4EAOqxiooyhYSE+1zoSZLJZFJISLjP/qUZAAB38dV8J9sBADg/X812qfb5XudNa7vdrqSkJD388MOSpEOHDik5OVnx8fEaP368ysrOHkBZWZnGjx+v+Ph4JScn6/Dhw3VdKgDUC74Yeuf4cu0AALiTr2akr9YNAIC7+XJG1qb2Om9aL1u2TO3bt3f8vGDBAo0YMULr1q1TeHi4VqxYIUlavny5wsPDtW7dOo0YMUILFiyo61IBoF7Kz/+vZsx4WnffPUAPPHCfnnwyRT/++IOGDbu7Vtv75JOP9N//HnNxlQAA4FKQ7wAA+B9/zvc6bVrn5uZq48aNGjx4sKSzY5p8/vnnSkhIkCQNHDhQ2dnZkqQNGzZo4MCBkqSEhARt27ZNhmHUZbkAUO8YhqHJk9PUrduN+stfVun119/Sww+PVUHB8VpvszahV1FRUev9AQCAqsh3AAD8j7/ne51OxJienq60tDSdOnVKklRQUKDw8HAFBJwtw2q1ymazSZJsNptatTo7OHdAQIDCwsJUUFCg5s2bX3D7ZrNJTZs2dvNRwBUqZSiooftffqXlFWog3/36BOBuNptJZvP//n759ddfqmHDAN111//+Ktu5c2cdPfofmUxn1129+kPt3fuNnnxykiTpiSdSNHTocMXEdFN6+izt2/eNJJPuvPO3slis+vbbvZo1a5qCgoKUmfmGDh48oBdffEFnzpxW06ZNNXXqM2rZMkKPPfaQOnToqN27dyo+vp8sFqtefz1TDRo0UGhoqF555c/nPQaTifd+eK/mTRrKHNjI02VIkuxlJTp+otzTZQDwgB07vlZAQICSkgY7lnXo0FFHj/7H8fMnn3ykffu+UWrqU5KkiRPH63e/u08xMd00b96z2rfvG5lMJiUm/laRkRZ9++1ePfPMVAUFNdKrr76uf//731q8eKFOnz6b75Mnz1TLli01duxodejQSbt379TttyfIYrFqyZJMNWhgVmhoqF5++U91/njAd4WGN1JwUENPl6EzpeUqLirxdBkA6jl/z/c6a1p/9tlnat68ua6//np98cUXbtmH3W6osPC0W7YN14qICNONacvcvp/t84fr2LGTbt8P4KsMw5DdXun4ef/+/erYsXOVZZJkt1c61q2sNKrdz26v1L59+5SXZ9OyZe9Lkk6ePKmwsDAtX/6exo4dr86dr1NFRYWef/45zZ37vJo1a6bs7LV65ZXFmjx5hgzDUFlZuV577U1J0vDh9+j55xcpIiJSJ0+erFbTT4/h5+/9ERFhLnl8gMtlDmykH2fd4OkyJElXTv+HJJrWQH104MD36tSpc63u+69/fadjx/L05pt/kfS/fP+///tLlXzPyJhfJd8zM1/W5MkzJEnl5eX685//l+8vvLDYke/ApQgOalgn55EXs33+cBWLpjUAz/L3fK+zpvWOHTu0YcMGbdq0SaWlpSouLtacOXNUVFSkiooKBQQEKDc3VxaLRZJksVh09OhRWa1WVVRU6OTJk2rWrFldlQsAuEStW7fRf/5zRAsXPqfY2F/p5ptvqbbOjz8e1IED32vChDGSpMpKu1q0aOm4vU+feMf/b7ghRnPmzFRcXLx6977N/QcAAACqId8BAPA/vpDvdda0fuKJJ/TEE09Ikr744gu9/vrrev7555WSkqI1a9YoMTFRK1euVFxcnCQpLi5OK1euVLdu3bRmzRrdcsstPj1LJgD4gquvbqeNG7NrXMdsNquy8n9zDJSWlkmSwsPD9cYb7+rLL7dp1ar/04YN6xx/gT3HMM7u49VXl5x328HBwY7/p6VN1p49/9S2bX/TqFHD9Oc/v6kmTZrW8sgAAKi/yHcAAPyPv+d7nU7EeD5paWlasmSJ4uPjVVhYqOTkZEnS4MGDVVhYqPj4eC1ZskRPPvmkhysFAP934403qaysTKtWfeBYtn//v5SXZ3P8bLW21v7936myslI2W6727t0jSSosLJRhVOrXv+6jhx56VN99960kqXHjEJ0+fXb4jiuvbKvCwgL985+7JZ2dsOHAge/PW8uRI4cVHX29HnzwETVt2qxKDQAAwHnkOwAA/sff871OJ2I8p3v37urevbskKSoqSitWrKi2TlBQkF566aW6Lg1+xqgodfvYtkxsBX9iMpk0d+4Cvfji83r77aUKDAxSq1atlJLyhGOdLl1i1KpVa913X7Latr1aHTt2kiQdO5anuXOfcfwV9+GHz36F6I477tT8+emOiRxmz/69MjIWqLi4WHa7XXfffa/atWtfrZaXX35Rhw//KMMwdOONN+uaazrWwSMAAID/Id8BAPA//p7vJsMwjIuv5hvKy+1MxOgj6nIiRndPgHXl9H8w2SN8Vm7uD7Ja23q6jMtyvmNgIsa6VVRUpKlTp+q7776TyWRSenq6rr76ak2YMEFHjhxRmzZtlJGRoSZNmsgwDM2ZM0c5OTlq1KiR5s2bp+jo6Bq378v5HhER5lUTMZJXQP3g6/lOttcPtcn3ujqPvJjt84eTqQDqlK9nu3Tp+e7x4UEAAIBvmzNnjm699VZ9+umnWrVqldq3b6/MzEzFxsZq7dq1io2NVWZmpiRp06ZNOnjwoNauXatnn31WM2fO9GzxAADgvOx2u5KSkvTwww9Lkg4dOqTk5GTFx8dr/PjxKis7Oy5qWVmZxo8fr/j4eCUnJ+vw4cOeLBsA4CdoWgMAgFo7efKkvvrqKw0ePFiSFBgYqPDwcGVnZyspKUmSlJSUpPXr10uSY7nJZFLXrl1VVFSkvLw8T5UPAAAuYNmyZWrf/n9fAV+wYIFGjBihdevWKTw83DHM5/LlyxUeHq5169ZpxIgRWrBggadKBgD4EY+MaQ0AAPzD4cOH1bx5cz399NPat2+foqOjNWXKFOXn5ysyMlKSFBERofz8fEmSzWaT1Wp13N9qtcpmsznWPR+z2aSmTRu790DqCR5HoH6w2Uwym333+iSTifd9T8vNzdXGjRv1yCOP6I033pBhGPr888/1/PPPS5IGDhyoxYsXa8iQIdqwYYPGjh0rSUpISNCsWbNkGIZMJpMnDwEA4ONoWgMAgFqrqKjQN998o2nTpikmJkazZ892DAVyjslkuqwTV7vd8Okxrb2Jrz6OAC6NYRiy2ys9XUatGUb1931vez/1d+np6UpLS9OpU6ckSQUFBQoPD1dAwNkWwrk/Oktn/yDdqlUrSVJAQIDCwsJUUFCg5s2be6Z4AIBfoGkNAABqzWq1ymq1KiYmRpLUr18/ZWZmqkWLFsrLy1NkZKTy8vIcJ64Wi0W5ubmO++fm5spisXikdgAAUN1nn32m5s2b6/rrr9cXX3zhtv34+jepfLl2AL7
|
|||
|
"text/plain": [
|
|||
|
"<Figure size 1800x720 with 6 Axes>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"def graph_builder():\n",
|
|||
|
" \"\"\"Graphs of the main characteristics for features int | float for the best models.\n",
|
|||
|
" The best model was chosen based on the results of the graphs\"\"\"\n",
|
|||
|
" def boxplot():\n",
|
|||
|
" n_cols = len(num_cols)\n",
|
|||
|
" rows = n_cols // 3 \n",
|
|||
|
" _, axes = plt.subplots(ncols=3, nrows=rows, figsize=(25, 5 * rows))\n",
|
|||
|
" plt.subplots_adjust(wspace=0.3, hspace=0.4)\n",
|
|||
|
" for num, col in enumerate(num_cols):\n",
|
|||
|
" b = sns.boxplot(\n",
|
|||
|
" data=df,\n",
|
|||
|
" y=col,\n",
|
|||
|
" x=\"Clusters\",\n",
|
|||
|
" palette=\"Paired\",\n",
|
|||
|
" ax=axes.reshape(-1)[num])\n",
|
|||
|
" b.set_xlabel('Clusters', fontsize=14)\n",
|
|||
|
" b.set_ylabel(f'{df[col].name}', fontsize=14)\n",
|
|||
|
" sns.set_style('darkgrid')\n",
|
|||
|
" \n",
|
|||
|
" def histplot(): \n",
|
|||
|
" n_cols = len(num_cols)\n",
|
|||
|
" rows = n_cols // 3\n",
|
|||
|
" _, axes = plt.subplots(ncols=3, nrows=rows, figsize=(25, 5 * rows))\n",
|
|||
|
" plt.subplots_adjust(wspace=0.3, hspace=0.4)\n",
|
|||
|
" for num, col in enumerate(num_cols):\n",
|
|||
|
" h = sns.histplot(\n",
|
|||
|
" data=df,\n",
|
|||
|
" x=col,\n",
|
|||
|
" hue=\"Clusters\",\n",
|
|||
|
" multiple=\"stack\",\n",
|
|||
|
" kde=True,\n",
|
|||
|
" palette=\"Paired\",\n",
|
|||
|
" ax=axes.reshape(-1)[num])\n",
|
|||
|
" \n",
|
|||
|
" h.set_xlabel(f'{df[col].name}', fontsize=14)\n",
|
|||
|
" h.set_ylabel('Count', fontsize=14)\n",
|
|||
|
" sns.set_style('darkgrid')\n",
|
|||
|
" \n",
|
|||
|
" def barplot():\n",
|
|||
|
" n_cols = len(object_cols)\n",
|
|||
|
" rows = n_cols // 3 + n_cols % 3\n",
|
|||
|
" size_cluster = df.groupby(\"Clusters\").count().iloc[:, 0]\n",
|
|||
|
" _, axes = plt.subplots(ncols=3, nrows=rows, figsize=(25, 5 * rows))\n",
|
|||
|
" plt.subplots_adjust(wspace=0.3, hspace=0.4) \n",
|
|||
|
" for num, col in enumerate(object_cols):\n",
|
|||
|
" data = (df.groupby([\"Clusters\"])[col].value_counts().unstack(fill_value=0).T)\n",
|
|||
|
" data = pd.DataFrame(data.unstack())\n",
|
|||
|
" data.columns = [\"Number of objects\"]\n",
|
|||
|
" data = data.reset_index()\n",
|
|||
|
" b= sns.barplot(\n",
|
|||
|
" data=data,\n",
|
|||
|
" x=data[col],\n",
|
|||
|
" hue=data.Clusters,\n",
|
|||
|
" y=data['Number of objects'],\n",
|
|||
|
" ax=axes.reshape(-1)[num])\n",
|
|||
|
" b.set_xlabel(f'{data[col].name}', fontsize=14)\n",
|
|||
|
" b.set_ylabel('Number of objects', fontsize=14)\n",
|
|||
|
" sns.set_style('darkgrid')\n",
|
|||
|
" \n",
|
|||
|
" boxplot()\n",
|
|||
|
" histplot()\n",
|
|||
|
" barplot()\n",
|
|||
|
" \n",
|
|||
|
"graph_builder()"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "bae4e70e",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.068264,
|
|||
|
"end_time": "2022-08-28T13:52:44.191676",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:44.123412",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"## 6) Business Recommendations"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"id": "3804fd18",
|
|||
|
"metadata": {
|
|||
|
"papermill": {
|
|||
|
"duration": 0.066646,
|
|||
|
"end_time": "2022-08-28T13:52:44.325998",
|
|||
|
"exception": false,
|
|||
|
"start_time": "2022-08-28T13:52:44.259352",
|
|||
|
"status": "completed"
|
|||
|
},
|
|||
|
"tags": []
|
|||
|
},
|
|||
|
"source": [
|
|||
|
"# As a result of cluster analysis, we received three groups of buyers (clusters):\n",
|
|||
|
"# 0 cluster:\n",
|
|||
|
"* Middle income people (average income equals 50000)\n",
|
|||
|
"* Average age is 52 years\n",
|
|||
|
"* Have an education (Graduation, 2n Cycle, Master, PhD)\n",
|
|||
|
"* People without family, people with families with and without children\n",
|
|||
|
"* Quite often buy wines, but they also often buy meat\n",
|
|||
|
"* Most often make purchases on the web\n",
|
|||
|
"* The average number of purchases is 13\n",
|
|||
|
"\n",
|
|||
|
"# 1 cluster:\n",
|
|||
|
"* High income people (average income equals 70000)\n",
|
|||
|
"* Average age is 55 years\n",
|
|||
|
"* Have an education (Graduation, 2n Cycle, Master, PhD)\n",
|
|||
|
"* Have a family with children (Teenhome)\n",
|
|||
|
"* Quite often buy wines, but they also often buy meat\n",
|
|||
|
"* Most often make purchases in the stores themselves\n",
|
|||
|
"* Most often make purchases (compared to other clusters)\n",
|
|||
|
"\n",
|
|||
|
"# 2 cluster:\n",
|
|||
|
"* Average income equals 38000 \n",
|
|||
|
"* Average age is 49 years\n",
|
|||
|
"* Have an education (Graduation, 2n Cycle, Master, PhD)\n",
|
|||
|
"* People with families with and without children\n",
|
|||
|
"* A low number of purchases and, accordingly, spend little money on purchases "
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"metadata": {
|
|||
|
"kernelspec": {
|
|||
|
"display_name": "Python 3 (ipykernel)",
|
|||
|
"language": "python",
|
|||
|
"name": "python3"
|
|||
|
},
|
|||
|
"language_info": {
|
|||
|
"codemirror_mode": {
|
|||
|
"name": "ipython",
|
|||
|
"version": 3
|
|||
|
},
|
|||
|
"file_extension": ".py",
|
|||
|
"mimetype": "text/x-python",
|
|||
|
"name": "python",
|
|||
|
"nbconvert_exporter": "python",
|
|||
|
"pygments_lexer": "ipython3",
|
|||
|
"version": "3.9.12"
|
|||
|
},
|
|||
|
"papermill": {
|
|||
|
"default_parameters": {},
|
|||
|
"duration": 172.940742,
|
|||
|
"end_time": "2022-08-28T13:52:46.152462",
|
|||
|
"environment_variables": {},
|
|||
|
"exception": null,
|
|||
|
"input_path": "__notebook__.ipynb",
|
|||
|
"output_path": "__notebook__.ipynb",
|
|||
|
"parameters": {},
|
|||
|
"start_time": "2022-08-28T13:49:53.211720",
|
|||
|
"version": "2.3.4"
|
|||
|
}
|
|||
|
},
|
|||
|
"nbformat": 4,
|
|||
|
"nbformat_minor": 5
|
|||
|
}
|