Skip to content

Instantly share code, notes, and snippets.

@audhiaprilliant
Last active July 2, 2023 23:49
Show Gist options
  • Save audhiaprilliant/06431ac1c84cf613114f546bb55db857 to your computer and use it in GitHub Desktop.
Save audhiaprilliant/06431ac1c84cf613114f546bb55db857 to your computer and use it in GitHub Desktop.
Clustering Algorithm for Categorical Data Type
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# K-Mode Cluster Algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import module"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 720x345.6 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Import module for data manipulation\n",
"import pandas as pd\n",
"\n",
"# Import module for linear algebra\n",
"import numpy as np\n",
"\n",
"# Import module for data visualization\n",
"from plotnine import *\n",
"import plotnine\n",
"\n",
"# Data visualization with matplotlib\n",
"import matplotlib.pyplot as plt\n",
"# Use the theme of ggplot\n",
"plt.style.use('ggplot')\n",
"# Set the figure size of matplotlib\n",
"plt.figure(figsize = (10,4.8))\n",
"\n",
"# Data visualization with seaborn\n",
"import seaborn as sns\n",
"\n",
"# Import module for k-protoype cluster\n",
"from kmodes.kmodes import KModes"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Ignore warnings\n",
"import warnings\n",
"warnings.filterwarnings('ignore', category = FutureWarning)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Format scientific notation from Pandas\n",
"pd.set_option('display.float_format', lambda x: '%.3f' % x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Data source: https://www.kaggle.com/ashydv/bank-customer-clustering-k-modes-clustering"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dimension data: 7043 rows and 21 columns\n"
]
},
{
"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>customerID</th>\n",
" <th>gender</th>\n",
" <th>SeniorCitizen</th>\n",
" <th>Partner</th>\n",
" <th>Dependents</th>\n",
" <th>tenure</th>\n",
" <th>PhoneService</th>\n",
" <th>MultipleLines</th>\n",
" <th>InternetService</th>\n",
" <th>OnlineSecurity</th>\n",
" <th>...</th>\n",
" <th>DeviceProtection</th>\n",
" <th>TechSupport</th>\n",
" <th>StreamingTV</th>\n",
" <th>StreamingMovies</th>\n",
" <th>Contract</th>\n",
" <th>PaperlessBilling</th>\n",
" <th>PaymentMethod</th>\n",
" <th>MonthlyCharges</th>\n",
" <th>TotalCharges</th>\n",
" <th>Churn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7590-VHVEG</td>\n",
" <td>Female</td>\n",
" <td>0</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>1</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>No</td>\n",
" <td>...</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>29.850</td>\n",
" <td>29.85</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5575-GNVDE</td>\n",
" <td>Male</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>34</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>...</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Mailed check</td>\n",
" <td>56.950</td>\n",
" <td>1889.5</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3668-QPYBK</td>\n",
" <td>Male</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>2</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>...</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Mailed check</td>\n",
" <td>53.850</td>\n",
" <td>108.15</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7795-CFOCW</td>\n",
" <td>Male</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>45</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>...</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Bank transfer (automatic)</td>\n",
" <td>42.300</td>\n",
" <td>1840.75</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>9237-HQITU</td>\n",
" <td>Female</td>\n",
" <td>0</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>2</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Fiber optic</td>\n",
" <td>No</td>\n",
" <td>...</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>70.700</td>\n",
" <td>151.65</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" customerID gender SeniorCitizen Partner Dependents tenure PhoneService \\\n",
"0 7590-VHVEG Female 0 Yes No 1 No \n",
"1 5575-GNVDE Male 0 No No 34 Yes \n",
"2 3668-QPYBK Male 0 No No 2 Yes \n",
"3 7795-CFOCW Male 0 No No 45 No \n",
"4 9237-HQITU Female 0 No No 2 Yes \n",
"\n",
" MultipleLines InternetService OnlineSecurity ... DeviceProtection \\\n",
"0 No phone service DSL No ... No \n",
"1 No DSL Yes ... Yes \n",
"2 No DSL Yes ... No \n",
"3 No phone service DSL Yes ... Yes \n",
"4 No Fiber optic No ... No \n",
"\n",
" TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n",
"0 No No No Month-to-month Yes \n",
"1 No No No One year No \n",
"2 No No No Month-to-month Yes \n",
"3 Yes No No One year No \n",
"4 No No No Month-to-month Yes \n",
"\n",
" PaymentMethod MonthlyCharges TotalCharges Churn \n",
"0 Electronic check 29.850 29.85 No \n",
"1 Mailed check 56.950 1889.5 No \n",
"2 Mailed check 53.850 108.15 Yes \n",
"3 Bank transfer (automatic) 42.300 1840.75 No \n",
"4 Electronic check 70.700 151.65 Yes \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('Dimension data: {} rows and {} columns'.format(len(df), len(df.columns)))\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['customerID', 'gender', 'SeniorCitizen', 'Partner', 'Dependents',\n",
" 'tenure', 'PhoneService', 'MultipleLines', 'InternetService',\n",
" 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport',\n",
" 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling',\n",
" 'PaymentMethod', 'MonthlyCharges', 'TotalCharges', 'Churn'],\n",
" dtype='object')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Columns\n",
"Each row represents an employee; each column contains customer's attributes in Telecommunication company. The dataset have the following attributes or features or columns:\n",
"- **CustomerID**: Customer ID\n",
"- **Gender**: Whether the customer is a male or a female\n",
"- **SeniorCitizen**: Whether the customer is a senior citizen or not (1, 0)\n",
"- **Partner**: Whether the customer has a partner or not (Yes, No)\n",
"- **Dependents**: Whether the customer has dependents or not (Yes, No)\n",
"- **Tenure**: Number of months the customer has stayed with the company\n",
"- **PhoneService**: Whether the customer has a phone service or not (Yes, No)\n",
"- **MultipleLines**: Whether the customer has multiple lines or not (Yes, No, No phone service)\n",
"- **InternetService**: Customer’s internet service provider (DSL, Fiber optic, No)\n",
"- **OnlineSecurity**: Whether the customer has online security or not (Yes, No, No internet service)\n",
"- **OnlineBackup**: Whether the customer has online backup or not (Yes, No, No internet service)\n",
"- **DeviceProtection**: Whether the customer has device protection or not (Yes, No, No internet service)\n",
"- **TechSupport**: Whether the customer has tech support or not (Yes, No, No internet service)\n",
"- **StreamingTV**: Whether the customer has streaming TV or not (Yes, No, No internet service)\n",
"- **StreamingMovies**: Whether the customer has streaming movies or not (Yes, No, No internet service)\n",
"- **Contract**: The contract term of the customer (Month-to-month, One year, Two year)\n",
"- **PaperlessBilling**: Whether the customer has paperless billing or not (Yes, No)\n",
"- **PaymentMethod**: The customer’s payment method (Electronic check, Mailed check, Bank transfer (automatic), Credit card (automatic))\n",
"- **MonthlyCharges**: The amount charged to the customer monthly\n",
"- **TotalCharges**: The total amount charged to the customer\n",
"- **Churn**: Whether the customer churned or not (Yes or No)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 7043 entries, 0 to 7042\n",
"Data columns (total 21 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 customerID 7043 non-null object \n",
" 1 gender 7043 non-null object \n",
" 2 SeniorCitizen 7043 non-null int64 \n",
" 3 Partner 7043 non-null object \n",
" 4 Dependents 7043 non-null object \n",
" 5 tenure 7043 non-null int64 \n",
" 6 PhoneService 7043 non-null object \n",
" 7 MultipleLines 7043 non-null object \n",
" 8 InternetService 7043 non-null object \n",
" 9 OnlineSecurity 7043 non-null object \n",
" 10 OnlineBackup 7043 non-null object \n",
" 11 DeviceProtection 7043 non-null object \n",
" 12 TechSupport 7043 non-null object \n",
" 13 StreamingTV 7043 non-null object \n",
" 14 StreamingMovies 7043 non-null object \n",
" 15 Contract 7043 non-null object \n",
" 16 PaperlessBilling 7043 non-null object \n",
" 17 PaymentMethod 7043 non-null object \n",
" 18 MonthlyCharges 7043 non-null float64\n",
" 19 TotalCharges 7043 non-null object \n",
" 20 Churn 7043 non-null object \n",
"dtypes: float64(1), int64(2), object(18)\n",
"memory usage: 1.1+ MB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Replace the columns\n",
"df['SeniorCitizen'] = df['SeniorCitizen'].replace([0, 1], ['No', 'Yes'])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"customerID 7043\n",
"gender 2\n",
"SeniorCitizen 2\n",
"Partner 2\n",
"Dependents 2\n",
"PhoneService 2\n",
"MultipleLines 3\n",
"InternetService 3\n",
"OnlineSecurity 3\n",
"OnlineBackup 3\n",
"DeviceProtection 3\n",
"TechSupport 3\n",
"StreamingTV 3\n",
"StreamingMovies 3\n",
"Contract 3\n",
"PaperlessBilling 2\n",
"PaymentMethod 4\n",
"TotalCharges 6531\n",
"Churn 2\n",
"dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Select the unique value each categorical columns\n",
"df.select_dtypes('object').nunique()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Change the null value to the NaN\n",
"df = df.replace(r'^\\s*$', np.nan, regex = True)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"# Change the column type\n",
"df = df.astype({'TotalCharges': float})"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"customerID 7043\n",
"gender 2\n",
"SeniorCitizen 2\n",
"Partner 2\n",
"Dependents 2\n",
"PhoneService 2\n",
"MultipleLines 3\n",
"InternetService 3\n",
"OnlineSecurity 3\n",
"OnlineBackup 3\n",
"DeviceProtection 3\n",
"TechSupport 3\n",
"StreamingTV 3\n",
"StreamingMovies 3\n",
"Contract 3\n",
"PaperlessBilling 2\n",
"PaymentMethod 4\n",
"Churn 2\n",
"dtype: int64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Select the unique value each categorical columns\n",
"df.select_dtypes('object').nunique()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0508-OOLTO 1\n",
"5201-CBWYG 1\n",
"8242-JSVBO 1\n",
"2346-DJQTB 1\n",
"9313-CDOGY 1\n",
" ..\n",
"0727-IWKVK 1\n",
"4947-DSMXK 1\n",
"1587-FKLZB 1\n",
"2080-CAZNM 1\n",
"5906-DVAPM 1\n",
"Name: customerID, Length: 7043, dtype: int64 \n",
"\n",
"Male 3555\n",
"Female 3488\n",
"Name: gender, dtype: int64 \n",
"\n",
"No 5901\n",
"Yes 1142\n",
"Name: SeniorCitizen, dtype: int64 \n",
"\n",
"No 3641\n",
"Yes 3402\n",
"Name: Partner, dtype: int64 \n",
"\n",
"No 4933\n",
"Yes 2110\n",
"Name: Dependents, dtype: int64 \n",
"\n",
"Yes 6361\n",
"No 682\n",
"Name: PhoneService, dtype: int64 \n",
"\n",
"No 3390\n",
"Yes 2971\n",
"No phone service 682\n",
"Name: MultipleLines, dtype: int64 \n",
"\n",
"Fiber optic 3096\n",
"DSL 2421\n",
"No 1526\n",
"Name: InternetService, dtype: int64 \n",
"\n",
"No 3498\n",
"Yes 2019\n",
"No internet service 1526\n",
"Name: OnlineSecurity, dtype: int64 \n",
"\n",
"No 3088\n",
"Yes 2429\n",
"No internet service 1526\n",
"Name: OnlineBackup, dtype: int64 \n",
"\n",
"No 3095\n",
"Yes 2422\n",
"No internet service 1526\n",
"Name: DeviceProtection, dtype: int64 \n",
"\n",
"No 3473\n",
"Yes 2044\n",
"No internet service 1526\n",
"Name: TechSupport, dtype: int64 \n",
"\n",
"No 2810\n",
"Yes 2707\n",
"No internet service 1526\n",
"Name: StreamingTV, dtype: int64 \n",
"\n",
"No 2785\n",
"Yes 2732\n",
"No internet service 1526\n",
"Name: StreamingMovies, dtype: int64 \n",
"\n",
"Month-to-month 3875\n",
"Two year 1695\n",
"One year 1473\n",
"Name: Contract, dtype: int64 \n",
"\n",
"Yes 4171\n",
"No 2872\n",
"Name: PaperlessBilling, dtype: int64 \n",
"\n",
"Electronic check 2365\n",
"Mailed check 1612\n",
"Bank transfer (automatic) 1544\n",
"Credit card (automatic) 1522\n",
"Name: PaymentMethod, dtype: int64 \n",
"\n",
"No 5174\n",
"Yes 1869\n",
"Name: Churn, dtype: int64 \n",
"\n"
]
}
],
"source": [
"# Summary statistics of numerical variable\n",
"for i in df.select_dtypes('object').columns:\n",
" print(df[i].value_counts(),'\\n')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# Select the categorical columns\n",
"cols = df.select_dtypes('object').columns\n",
"df_cat = df[cols]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customerID</th>\n",
" <th>gender</th>\n",
" <th>SeniorCitizen</th>\n",
" <th>Partner</th>\n",
" <th>Dependents</th>\n",
" <th>PhoneService</th>\n",
" <th>MultipleLines</th>\n",
" <th>InternetService</th>\n",
" <th>OnlineSecurity</th>\n",
" <th>OnlineBackup</th>\n",
" <th>DeviceProtection</th>\n",
" <th>TechSupport</th>\n",
" <th>StreamingTV</th>\n",
" <th>StreamingMovies</th>\n",
" <th>Contract</th>\n",
" <th>PaperlessBilling</th>\n",
" <th>PaymentMethod</th>\n",
" <th>Churn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7590-VHVEG</td>\n",
" <td>Female</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5575-GNVDE</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Mailed check</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3668-QPYBK</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Mailed check</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7795-CFOCW</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Bank transfer (automatic)</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>9237-HQITU</td>\n",
" <td>Female</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Fiber optic</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>Yes</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customerID gender SeniorCitizen Partner Dependents PhoneService \\\n",
"0 7590-VHVEG Female No Yes No No \n",
"1 5575-GNVDE Male No No No Yes \n",
"2 3668-QPYBK Male No No No Yes \n",
"3 7795-CFOCW Male No No No No \n",
"4 9237-HQITU Female No No No Yes \n",
"\n",
" MultipleLines InternetService OnlineSecurity OnlineBackup \\\n",
"0 No phone service DSL No Yes \n",
"1 No DSL Yes No \n",
"2 No DSL Yes Yes \n",
"3 No phone service DSL Yes No \n",
"4 No Fiber optic No No \n",
"\n",
" DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n",
"0 No No No No Month-to-month \n",
"1 Yes No No No One year \n",
"2 No No No No Month-to-month \n",
"3 Yes Yes No No One year \n",
"4 No No No No Month-to-month \n",
"\n",
" PaperlessBilling PaymentMethod Churn \n",
"0 Yes Electronic check No \n",
"1 No Mailed check No \n",
"2 Yes Mailed check Yes \n",
"3 No Bank transfer (automatic) No \n",
"4 Yes Electronic check Yes "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Show the data\n",
"df_cat.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"code_folding": []
},
"outputs": [
{
"data": {
"text/plain": [
"customerID 0\n",
"gender 0\n",
"SeniorCitizen 0\n",
"Partner 0\n",
"Dependents 0\n",
"PhoneService 0\n",
"MultipleLines 0\n",
"InternetService 0\n",
"OnlineSecurity 0\n",
"OnlineBackup 0\n",
"DeviceProtection 0\n",
"TechSupport 0\n",
"StreamingTV 0\n",
"StreamingMovies 0\n",
"Contract 0\n",
"PaperlessBilling 0\n",
"PaymentMethod 0\n",
"Churn 0\n",
"dtype: int64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check missing value\n",
"df_cat.isna().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explanatory data analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### The composition of churn"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Churn</th>\n",
" <th>Total</th>\n",
" <th>Percentage</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Yes</td>\n",
" <td>1869</td>\n",
" <td>0.265</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>No</td>\n",
" <td>5174</td>\n",
" <td>0.735</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Churn Total Percentage\n",
"0 Yes 1869 0.265\n",
"1 No 5174 0.735"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_churn = pd.DataFrame(df_cat['Churn'].value_counts()).reset_index()\n",
"df_churn['Percentage'] = df_churn['Churn'] / df['Churn'].value_counts().sum()\n",
"df_churn.rename(columns = {'index':'Churn', 'Churn':'Total'}, inplace = True)\n",
"df_churn = df_churn.sort_values('Total', ascending = True).reset_index(drop = True)\n",
"df_churn"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Customize colors and other settings\n",
"colors = ['#80797c', '#981220']\n",
"explode = (0.1,0) # Explode 1st slice\n",
"# Create a pie chart\n",
"plt.pie(df_churn['Total'], explode = explode, labels = df_churn['Churn'], \n",
" colors = colors, autopct = '%1.1f%%', shadow = False, startangle = 140)\n",
"# Add title\n",
"plt.title('Pie Chart of Churn Status')\n",
"plt.axis('equal')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### The composition of churn by payment method"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"df_churn_payment = df.groupby(['Churn', 'PaymentMethod']).agg({\n",
" 'customerID': 'count'\n",
" }\n",
").rename(columns = {'customerID': 'Total'}).reset_index().sort_values('Total', ascending = False)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# Replace the categories\n",
"df_churn_payment = df_churn_payment.replace(['Bank transfer (automatic)', 'Credit card (automatic)'], \n",
" ['Bank transfer', 'Credit card'])"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Churn</th>\n",
" <th>PaymentMethod</th>\n",
" <th>Total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>No</td>\n",
" <td>Mailed check</td>\n",
" <td>1304</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>No</td>\n",
" <td>Electronic check</td>\n",
" <td>1294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>No</td>\n",
" <td>Credit card</td>\n",
" <td>1290</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>No</td>\n",
" <td>Bank transfer</td>\n",
" <td>1286</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>1071</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Yes</td>\n",
" <td>Mailed check</td>\n",
" <td>308</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Yes</td>\n",
" <td>Bank transfer</td>\n",
" <td>258</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Yes</td>\n",
" <td>Credit card</td>\n",
" <td>232</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Churn PaymentMethod Total\n",
"3 No Mailed check 1304\n",
"2 No Electronic check 1294\n",
"1 No Credit card 1290\n",
"0 No Bank transfer 1286\n",
"6 Yes Electronic check 1071\n",
"7 Yes Mailed check 308\n",
"4 Yes Bank transfer 258\n",
"5 Yes Credit card 232"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_churn_payment"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 800x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ggplot: (150589190641)>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plotnine.options.figure_size = (8, 4.8)\n",
"(\n",
" ggplot(data = df_churn_payment)+\n",
" geom_bar(aes(x = 'PaymentMethod',\n",
" y = 'Total',\n",
" fill = 'Churn',\n",
" width = 0.5),\n",
" stat = 'identity',\n",
" position = 'fill')+\n",
" labs(title = 'The composition of churn by payment method',\n",
" subtitle = 'Telco Churn Data')+\n",
" xlab('Payment Method')+\n",
" ylab('Frequency')+\n",
" scale_x_discrete(limits = ['Mailed check', 'Electronic check', 'Credit card', 'Bank transfer'])+\n",
" scale_fill_manual(values = ['#80797c','#981220'], labels = ['No', 'Yes'])+\n",
" theme_minimal()\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### The composition of churn by payment contract"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"df_churn_contract = df.groupby(['Churn', 'Contract']).agg({\n",
" 'customerID': 'count'\n",
" }\n",
").rename(columns = {'customerID': 'Total'}).reset_index().sort_values('Total', ascending = False)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"scrolled": true
},
"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>Churn</th>\n",
" <th>Contract</th>\n",
" <th>Total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>2220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Yes</td>\n",
" <td>Month-to-month</td>\n",
" <td>1655</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>No</td>\n",
" <td>Two year</td>\n",
" <td>1647</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>1307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Yes</td>\n",
" <td>One year</td>\n",
" <td>166</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Yes</td>\n",
" <td>Two year</td>\n",
" <td>48</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Churn Contract Total\n",
"0 No Month-to-month 2220\n",
"3 Yes Month-to-month 1655\n",
"2 No Two year 1647\n",
"1 No One year 1307\n",
"4 Yes One year 166\n",
"5 Yes Two year 48"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_churn_contract"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAx0AAAHVCAYAAACUvZZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9A0lEQVR4nO3dd5gkVb3/8fcXWFBJklQWvSAiFxQVRYzXK2ZQOSaMGFbUH5IUE4qBBREwggoiQXFVQC8i4lEUAQEvBryIoiIoggRhyLBLhgHO749TA00zszs7PbU1O/N+Pc88s11Vfepb3X1m+9N1TnWUUpAkSZKktizTdQGSJEmSpjdDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHtARExHoRUSJiz65rURURl0TE6Yux/Z7Nc7hee1VNvoh4UkScEhE3TtZrMCK2aNqaM3iFS15EzIuI0nUdkjSTLNd1AdLSaDHfsLwAuKSlUjSJmjfRDy+lfLnjUiZFRCwHHAesAHwKmA/8pcua1I0mLM8Bji+lnNNpMY0mAJ9TSjm+41IkLQGGDmli3tZ3e2Pg48AZwGF9684HHrokitJi+U+gPzzOAdYDvjzK9p8BPgvc2WZRk2x9YAPgg6WUg7ouRp1aD5hL/QDknC4L6TEX+DZwfMd1SFoCDB3SBJRSjuy9HRFbUEPHv/rXNevXWyKFadxKKYsVHkopdwN3t1ROWx7V/L6x0yomQUSsVEq5pes6ZhIfc0mTyTkd0hIWEa+MiP+LiNsj4pqIOCQiHjbKdo+MiAObuQd3RcTVEXHk4gSYiFipmYtwbrO/GyPirIjYuW+7h0fE/hFxcUTc2ezrexHx+L7t7pubEhGvjYg/Nu1eFhEfbrZZNSIOjYirIuKOiDgtIjbqa2dO086LI2KPnv3+PSJ2HONYnhkRP42IG5p2z4+IT0XE8n3brRYRX4iIfza1LYiI8yJi/77tHjCnoxky93xg3aa2kZ8tmvWjzumIiHUi4hsRcUXzPF0eEYdFxNp92903D6L5+WtzHFdExD4RsezYz+SDHostm8f1puYYz4mInSIieo8P+FVz81s9x7PeaG323G9WRHwgIs6OiFsj4uaI+EtE7DXG9os8lv7Humf5g+Y69T1O2zf7vgM4qFlfos7JeHZEnN7UOL95va41rgfw/n2t2bR1bfM4/jYiXtC3zbnNcT3o+WlekyUiPjPO/c2JiN80z9ttzev9q72v4YhYJiLeFxF/bmq6KSJOjYiXjNLeJc1jsFHTNxZExC0RcUJEPK5nuz2B05qbva+F05v1vf36dVH/Pt0G/LRZPzsivhi1v98Qta9e0DzXo57FXdixjjzHzabv6KnHeTbSNOaZDmnJ2grYGTgUOAJ4EbB9s+69IxtFxGOA3wIrAd8ELgDWAXYAXhoRTy+lXLawHUXEqtThXk8Cfty0cw+wCfBa7n8TtzLwG+AJwFHNfh8H7AhsGRHPLaWc19f8K5r1Xwe+AbwR+ELz5vCdwBXA3sDawAeB4yPiCaWUe/va+RywCnA4ddjSW4CvRcQjSil79hzLlkAGFgBfA64GXg58GnhORLyip+1jgC2aNv9Enc+wAfDChT1e1CFznwDWBD7Qs/z8se4QEesAZwGPaPb3F+ApwHuoj93mpZSr++72XmA29XG7lvpcfBy4mTp8a6Ei4l3Nvi4BvgDcAmxDfT6fAvy/ZtNdgc2btg+jvhZo9jlW27OAn1Nfl6cDezXtbwS8njocZtKOZRHeTz1TcxhwedPmiE2BE6hDc74HbAa8G1gN2HIx9vEL6mtqb2B16vGcFBFblVJOabY5FPgq9TWf++7/buoQvW8uakcR8W3g7cAfgc9TH6/HUR+zPYC7mk3nUV+LvwZ2B1Zu9vOLiHj7KGdS16GGyx8DHwUeD+wC5Ih4UtMvjgNm8eDXQv9r81XU1/4h1NfYSIh9MvC6pp2Lm+VbNPU9ldoXF+dYz2+O8buMPiRV0nRUSvHHH38G/KH+B1yAeWOsX69Zfxuwft+6E6lvOFbsWXY8cMMo265HffP1rXHUdFCzz/ePsm6Znn9/utlut75tnt8sP2VRxwEsD1wF3Asc3NfOrs19XtazbE6z7N/Uidsjyx8C/IE6jGm9Ztmy1Dc6twKP7Wv7iKadtza3Vx2thjEen0uA0/uWnQ5cMsb2ezb7Wq9n2XeaZW/o2/btzfJvjPIauRJYrfe5AM4DhsZR86rN8385sHrP8uWAk5r2/2uUfc4Z5+v4w832+y/iNbNYxzLaY933etpzlLZvBB41yn1K8xw/t2/5Ic26DcdxnPOabXPfca3bvM4uAKLnMb8VyH1trNQ8FyeNY3/bNPv7AbBc37ro2dcLm+1+Aizbs81a1IBwI7BS3+NagDf3tfmxZvlLx/Na6HkehoFNRln/0JEa+5Z/prnf5ot7rD3P5ah/M/3xx5/p9+PwKmnJ+lEp5V99y06mfgr5WLjvDMXWwM+Am5ohIGtGxJrUT53PBF62sJ1ExDLUswb/Ag7sX18eeMbhddRPe7/St82vqEMyXhgRqy3sOEopdwG/p76pOKBv25EhPo/nwQ4upczvaecOYH9q0HhVs/hp1DdF3ymlXNx3/z17jgFqGLoTeFZErD/K/iZN8xi/Gvh7KeWYvtXfBS4CXhtx/5CnxhGllPvmWDTPxS+BtSNipUXs9qXUN7sHllJu6GnjbuobQLj/sZiIt1LfYH+qf0V58FkqGOxYFuXbpZSrxlj3u1LKb/qWndz83nAx9rFf73GVUi6lnu17PPXTfUopC4DvAy+PiNk9930z9bkYz6f0b21+f7h5ru5TGs3NkefuM6WUe3q2uZZ6hu/h1LNQvYZKKd/rWzaRxwLghFLKuf0LSym3j9QYdfjd6s3fo5H9PLNn8/Eeq6QZxtAhLVn9gQPg+ub3Gs3vDal9c1vqsIT+nxcDj1zEftakDjX58xhvFnutD1xYRp9Y/VdqkHhs3/LRjuPGMdaNLF+DB+sfttW7bIOe+gD+1r9hqUPMFlCHblBKGaYOX9sYuCgi/hF1vsVrRxuTP6C1qENfRqurNMtXa356jec1MJYxHwvqcwXNYzFBGwIXlFJuHef2gxzLolywBPY7ntcf1LMoy1KHDo54D3ANdVjTomwI3NiEmoWZyPM7mc/BqI95RCwbER+NiPOBO5r2r6WeGYQ6NG3EeI9V0gzjnA5pybpnIetGPhEf+TDgGOq46ono/3R9URb308cxj6P3E9o+E60p+m4v/E6lfDMifkIdZ/7fwEuAdwH/FxHPb86mTIbFqqvHeF4DE9lnF58gj/dYxqptYf8H3TYJ+x3EfTWXUs6KiD8C20XEvtSzIJsDn2+C7qKMt6aJ1D6Zj8VYj/mXqHNsjqXOw7qGOiR0HepQtd4PMCfr8Zc0zXimQ5p6LqSOWX9oKeWUsX4W0ca11DMMT2mGAS3MRcDjI2KFUdZtQn3z1T+sabI8YSHLLmp+X9hTywM0E+5X7dkWgFLKNaWUeaWU7ahDs74IPIM6GXphFueN+zXUMf2j1RXAE6nPwY396wcw5mNBvWAA9D0Wi+kCYMOIWHGANkZzAw/8NHxEq0PgxmE8r78Rh1DrfRH1LEehTqAfj38Aq0XEuovYbuT5feIo60ae84k+v4OE0rcDZ5RSXt/0q581f4OuGWXb8R6rpBnG0CFNMaWU66lX5nlF/+U7R0TEQodXNUOqjqa+SdpllPv39v3jqG/cd+nb5r+oE1tP7R23P8l2jIiH9+xzBerVru7h/isF/Yk6YfZto7yR2aP5/cPm/g+LvssPN0Od/tjcHO2Nb69bqG+YFvlpbfMYHw9sFBHb9K3eljoM5rhJHsN+clPjTr3zbJqhY59obv5wgPaPBFakXs3pAcYRXhfmH9THaZ2+9j40QJuTYffe42peX9tS3/z3f3P70cBN1H6yLXVi/D/HuZ+RK059cbRhfj2vt+Oa3x/vq2tNYCfqN8r/cpz77DfyfRuL6gOjedDZlOZKZ7uPsu14j3WkponUI2kp5PAqaWragXrJzJMj4ijqFZ3upV5d5xXUy7TOWUQbn6ResebLTXg5nXp1midSv417ZELqF6gTWL8QEU/hgZfMXQC8b5KOaTTXAGdFxBHU4RpvoU4c/8zIpPFSyj0RsQM1hJwVEYc099uKOoTqF9Q3hFDHk/9vRBwPnAtc1xzLe5tj+dEi6jkTeCVwUET8lvpm69RSymif6EK9BOmLge81j/Ffuf+Suf/m/iAwKUopCyJiV+qwuz80j9ut1CsGPRc4vJTy6wF28RXq6+sDEfFU6sUMbqY+ri9l9DMs4/FV6sTrU5vnL1j0WaclYR3glIj4EfXN7w7UK7Ht3B8WSym3Nn1xh2bRuIc+llKObe67LXWY33HU1/BjqY/D5sD8UsqpEfFd6uVkT2vqWol6ydxHAG8vE/+yvvOoz+WOzXdwzAeuKaWcOo77/gDYISKOpV4lbXXqhPEHDcca77E2m58JvDgiPgpcVu9evj/B45M0xRk6pCmolHJFRDwN2I16haQ3Ut+UX0G9rv0ivxeglDI/Ip5DvXb/NtQ36bdRh9DM69nu5uasxh7Aa5p9LaBOkJ1bSlnYhN5BfZT6Znl76nd6XAK8r5TygCtulVJOjIj/pl5VaRfgYc22ewCf65ks/2/qkJctqOHhYdTLuv4Y+GxZxHebAF+mnh3ahhpUlgFewOjDSCilXB4Rz6BeRes11O/IuIZ6Kd+55cHf0TGwZs7KEPWx+xj1ymf/oD4uXxuw7eGIeBn1MsdvpV5OeZg6vO4HA7R7ZkRsSw3CI3MCvkP9no2/D1LzgLakhu651Df3fwK2LaWMdTbhEGrouJ77z0qM19uA/6UGiI83yy6jfgFf75v3OcDZ1HlIn6U+/mcB/6+UctJi7vM+pZTbI+JN1KucfZn6/TW/AsYTOj5EPcvzJuqV9Yao34/yHUb/HpvxHuuO1NfsJ6gXZYB6pTBJ01AUr14naQmLiDnAt4AXlFJO77YaaXwiYiPqm+wDSikf7LoeSVqaOKdDkqTx2ZU6IfvQjuuQpKWOw6skSRpDcyWvrYGNqHN1jiml/KPbqiRp6WPokCRpbGtR5y/cCvyEehUpSdJick6HJEmSpFY5p0OSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRoxhsaGlphaGhoz6GhoRW6rkXqiv1Ash9IbTJ0SLACMLf5Lc1U9gPJfiC1xtAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa1arusCJltKaWdgDvAk4Ec55zd1W5EkSZI0s0270AEMAZ8BXgys2XEtkiRJ0ow37UJHzvk4gJTSphg6JEmSpM5Nu9CxpAwNDa0ArNB1HZoUK4/8Hhoa6rQQqUP2A8l+MO3Mnj37pq5rUGXomLjdgbldFzFVHH7Q17suYTJc3nUBg3jPzjt0XcKMZz/oln2ge9OkD4D9YDqJrgtQZeiYuP2A/bsuYgpZ0HUBYtWuC5D9oGP2ge7ZB7pnP9CUZOiYoNmzZ98J3Nl1HdIITyFrprMPSPYDTV3TLnSklJajHtdywDIppYcA9+Sch7utTJIkSZqZpuOXA34SuB34BPD65t+Hd1qRJEmSNINNuzMdOec9gT27rUKSJEnSiOl4pkOSJEnSFGLokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWLdd1AUur4eHhtYG1u65DGjE8PPy0rmuQumQfkOwH/WbNmvXHrmtQZeiYuO2BuV0XIfU4u+sCpI7ZByT7Qb/ougBVho6JOxTIXRcxhfhHrnubdV2A7Acdsw90zz7QPfuBpiRDxwTNmjXrSuDKruuQRngKWTOdfUCyH2jqciK5JEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVct1XQBASunhwGHAVsBNwD4554NH2W5b4NCeRQE8DHhdzvm4lNIWwKnAbT3b7Jtz3rel0iVJkiQtwpQIHcBB1FpmAxsAp6SUzs85n9a7Uc75KOCokdsppZcD3wNO7Nnsmpzzo9ovWZIkSdJ4dB46UkorAq8Hnppzvhn4U0ppHrAdcNrC7gu8E/ifnPNti9hOkiRJUkc6Dx3AhkDknM/rWXYO8MGF3SmltDqQgC36Vq2RUroKuJN6BmT3nPMNk1ZtY2hoaAVghcluV5qooaGhVbquQeqSfUCyH/SbPXv2TV3XoGoqhI6VqPM4es0HVl7E/d4K/Cvn/LueZX8HNgXOpw7VOhT4NrD1ZBTaZ3dgbgvtShO1oOsCpI7ZByT7Qb/ougBVUyF03AL0p/JVgZsXcb93Akf0Lsg5XwVc1dy8PKW0M3BhSulhLQzB2g/Yf5LbXJr5R657q3ZdgOwHHbMPdM8+0D37gaakqRA6LgBKSmnjnPP5zbJNgXPHukNKaVNgE+C7i2j7XmrCnfSUO3v27DupQ7ikKcFTyJrp7AOS/UBTV+ehI+d8a0rpWGDvlNI7gfWBOcAbFnK37YCfN2c27pNSegFwMXAp8Ejgq8BJOedb26hdkiRJ0qJNlS8H3AkowJXAz4E9cs6nAqSUbkkpPW9kw5TS8sBb6Bta1XgqcAZ1yNbZwHXA29otXZIkSdLCdH6mAyDnPJ962dzR1q3Ud/suYM0xtt0f51lIkiRJU8pUOdMhSZIkaZoydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSq5bruoCl1fDw8NrA2l3XIY0YHh5+Wtc1SF2yD0j2g36zZs36Y9c1qDJ0TNz2wNyui5B6nN11AVLH7AOS/aBfdF2AKkPHxB0K5K6LmEL8I9e9zbouQPaDjtkHumcf6J79QFOSoWOCZs2adSVwZdd1SCM8hayZzj4g2Q80dTmRXJIkSVKrJhw6IuKLEbHRZBYjSZIkafoZ5EzHG4C/RcRvI2K7iFhxsoqSJEmSNH0MEjrWBV4BXA58DbgyIr4REc+ZlMokSZIkTQsTDh2lOrGU8gZgHeBT1CsmnBER50XEhyLiEZNVqCRJkqSl06RMJC+l3FBK+QowBzgD2Aj4AvDviPh2RKw1GfuRJEmStPQZOHRExKoRsUNE/AH4I7AKsBMwG9gBeB7w/UH3I0mSJGnpNOHv6YiIFwLvAl4N3A18D9i+lNL7xUBHRMS/gZ8MUqQkSZKkpdcgZzpOAdYHdgHWLqW8ty9wjLiAGkgkSZKkGSEiXh4RJ0bE9RFxV0RcGhEHR8TjmvWXRMRBXde5pAzyjeRPKaX8dVEblVIuBd45wH4kSZKkpUZEfAb4BPAjYHvgGmA94B3UD+4f21lxHRkkdFwSEWuXUq7sXxERawM3l1JuGaB9SZIkaakSEVtSA8d+pZSP96z6X+A7EbH1EqghgOVLKXe2va/xGmR41TeAvcdYtxdw2ABtS5IkSUujDwNXA3NHW1lKecBc54jYuRl6tSAiju+96mtEzImIEhFr9t3n3IiY13N7XrPs5RHxZ+BOIEXEnhFxS0Q8OSJ+HRG3Ndu9bBKPd1wGCR3/DZwwxrqfAc8foG1JkiRpqRIRywHPBU4ppQyP4y4J2Jp65df3A1sAB05w97OBrwD7A1sC5zTLZwFHAvOA1wDXAT+MiDUmuJ8JGWR41WrAzWOsuxVYogciSZIkdWwN4CHAv8e5fQBpZBhURGwA7BYRy5RS7l3Mfa8GbFlK+b/7Go8AWB74WCnlZ82yi4B/AltRw8gSMciZjn8BLx5j3YuASwZoW5IkSVraRPO7jHP7X/XNuziPembiERPY93W9gaPHvdTJ67WwUi4E7gIePYF9TNigczo+GBG7jYwzi4g1I+IjwAeAwyejQEmSJGkpcR1wB/Af49x+ft/tu5rfD5nAvq8ZY/ntpZS7+pYNT3AfEzbI8KoDgMcB+wH7RcTdPe0dUkr50qDFSZIkSUuLUsrdEfFr4MURMWuc8zoW5o7m9/J9y1cfbfcD7qtVEz7TUaqdgI2ok1/2AnYENmqWS5IkSTPNl4BHAnuMtjIiXrkYbV3e/N645/6bAI+acHUdGeRMBwCllH9SJ6NIkiRJM1op5cSI2Af4ZERsDHyPOvRpXeBtwIbAT8fZ3O+pk9IPiIjdgVWAjwE3THrhLRsodETEssAzqRNRHjQurJTynUHalyRJkpY2pZRPRsTvgPdR5zmvDAwBJ1PnPo+3neGIeA3wdeAHwIXArsBXJ7vmtk04dETE04DjgMdw/0z9XgUwdEiSJGnGKaWcwNjfaUcpZb1Rlh1L3/vqUsrZwDP6Nt2kb5s5Y+xjT2DPUZavNFZdbRnkTMfXqd/T8VLq5b36Z8VLkiRJ0kCh44nAG0opv5ysYiRJkiRNP4N8T8cF1PFpkiRJkjSmQc50fAD4SkT8uZTy98kqSJIkSVra7PXxT7XyPRlz9917tLnTS51BQsdB1GsEnxsRQzz4GxVLKeUpA7QvSZIkaRoYJHSczRT/5kNJkiRJ3Ztw6Bjr0lySJEmS1GuQieT3iWp2RAz8DeeSJEmSppeBQkdEvCwizgTuoH5F+5Ob5YdFxLaTUJ8kSZKkpdyEQ0dEvBn4GXAp9Svee2fWXwS8c7DSJEmSJPWLiNMjYjgiNuhZtlFETNn51oOc6fgU8OVSyhuBb/St+xt9X88uSZIkadLcBHy66yLGa5DQsT71TMdobgVWHaBtSZIkSWM7ENg6IjbtXxERq0TEERFxdURcHhFfjIjll3yJ9xskdFwFbDTGuidTh11JkiRJmnxXAV8F9hll3VeB2cB/As8AXgjsvuRKe7BBQsfRwJ4R8aKeZSUiNgF2A44cqDJJkiRJC/N54FkR8byRBRGxDPBm4KOllPmllCHqMKy3dVQjMNiXA+4JPBE4Gbi+WfZzYC3gp8Bnx9tQSunhwGHAVtTxafvknA8eY9sC3Mb9X0x4Rs55q571O1OT3CrU4V/vyTnfNN5aJEmSpKVBKWVBRHwO2A94d7N4LWB54JKeTS8B1lmixfUZ5MsB7wJeFREvAF4CrAncAJxSSjllMZs7qKllNrABcEpK6fyc82ljbL9Zzvnv/QtTSi8B5jb1/Av4DnW82zsWsx5JkiRpaXAg8H7glc3t64C7gHWBvzTL1gOuWOKV9Rj4y/xKKacBY4WDRUoprQi8Hnhqzvlm4E8ppXnAdhNodw7wrZzzOU3bnwLOSintkHO+baI1SpIkSVNRKeX2iPg0zdyOUso9EfF9YJ+IeCvwMOCTdDz1YcKhIyL+Y1HblFIuG0dTGwKRcz6vZ9k5wAcXcp9TU0rLAn8Adss5/61ZvgkPvKLWucCywOOBP4+jlnEbGhpaAVhhMtuUBjE0NLRK1zVIXbIPSPaDfrNnz54pQ+y/CXwYWKO5/T7gK8AFwD3A96lDsDozyJmOS7h/XsVYlh1HOytR53H0mg+sPMb2WwC/o77h/yhwUkpp42bexkrAgpENc84lpXTTQtoaxO7UoVzSVLFg0ZtI05p9QLIf9ItFb7L0KaVs0Xf7buqH7CO3F1BHAE0Zg4SO14+ybHXgpcDmwCfG2c4t1EnfvVYFbh5t45zzr5p/3gV8MqX0NuA5wIljtLXKWG0NaD9g/xbaXVr5R657fjdO9+wH3bIPdM8+0D37gaakQSaS/3CMVYdHxAHAc4GjxtHUBUBpzlac3yzblDo0ajzu5f4Uey7wFOrlfEkpbUI9pfTPcbY1brNnz74TuHOy25UmagadQpZGZR+Q7AeaugaeSD6GE4BjgB0XtWHO+daU0rHA3imld1K/6XwO8Ib+bVNKT6QOq/oL9VJguwEPpQ63ApgHHJVSOgq4GNgb+B8nkUuSJEndGeTLARfmOcAdi7H9TtT5IVdSv+tjj5zzqQAppVtSSiNfePII6lmMBcBlwLOAl+Wc5wPknE+mBo0Tm7aGgV0GPRhJkiRJEzfI1au+Osri5YGNgf8CvjjetprQMNocEXLOK/X8+zRgo0W0dSD1esWSJEmSpoBBhldtPcqyO4DLqcOqvjFA25IkSZKmiUEmkj92MguRJEmSllZz9917Wl6ed7K0NadDkiRJkoDB5nTssRibl1LK3hPdlyRJkqSl1yBzOj7S3H+F5vbdPe3d2dweUahXlZIkSZKmnUPXeGxpo93tr794WgzbGmR41Quol6XdHlijlLI8sAbw3mb5C0spKzc//d8SLkmSJGmGGORMx0HAF0sph48sKKXcCBwWEbOArwHPGLA+SZIkSUu5Qc50PAX41xjrLgI2GaBtSZIkSdPEIKHjEuC9EfGAcWbN7R2BSwdoW5IkSdI0Mcjwqo8BxwL/jIifANcAj6B+aeC6wDaDlydJkiRpaTfhMx2llB8DmwN/AF4F7NH8/gOwebNekiRJ0iSKiBwRh/Qt2ywiFkTEBl3VtTCDnOmglHIO8KbJKUWSJEnSOGwPnBsRPyil/LK5iNMRwKdKKRd2XNuoJuUbySPiMRHxnIhYcTLakyRJkjS6UsqVwPuBb0TESsDHgQXA7yLijIi4MSLOj4jXjtwnIl4eEedFxM0RMRQRH1+SNQ8UOiLi/0XEFdRJ42cA/9ks/1FEvH8S6pMkSZLUp5RyJPAX4GhgV2B34ETgS8CawBxqKNm4ucs3ge1LKSsDTwROWpL1Tjh0RMSuwIHAkcBWQO9VrE4H3jBIYZIkSZIWanvghcA+wHOBU0opx5dS7iml/B74EfD6Ztth4AkRsUop5cZSyh+WZKGDnOnYBdi7lPJR4JS+df+gOeshSZIkafKVUq4CrgPOBdYDXhUR80d+gDcCazebv456ouDSZgjW85ZkrYNMJF8H+O0Y64YB53dIkiRJS8ZlwPdLKXNGW1lKOQt4dUQsB+wAHAestaSKG+RMx6XAM8ZY90zgggHaliRJkjR+RwJbRcTWEbFcRCwfEc+MiI2bf28bEauWUu4GbgHuWZLFDRI6Dgc+GRHvAlZpls2KiFcAHwEOHbQ4SZIkSYtWSrkceAV1UvnVwJXAfsAKzSZvAy6OiJuAnVnCX3sx4eFVpZQvRsR/AIdxf8D4TfP74FLKwYMWp6XHow49susStO/eXVcgSZKWsFLKej3//gPwojE23XKJFDSGQb8c8H0R8WXgxdRLc90A/LKU8s9JqE2SJEnSNDCh0BERDwGuAd5aSsnUsx2SJEmS9CATmtNRSrkDuBW4a3LLkSRJkjTdDDKR/NvAuyarEEmSJEnT0yBzOm4EnhMRfwF+Th1uVXrWl1LKAYMUJ0mSJGnpN0jo2K/5vTawySjrC2DokCRJkma4xQodEXEe8MZSyl9LKcs0y7YFflZKubGNAiVJkqSpbvvrL46ua5jKFndOx0bAQ0duRMSywHeAx05mUZIkSZKmj0Emko8w1UmSJEka02SEDkmSJEka00RCRxnnMkmSJEma0NWrTouIe/uWnTHKslJKWXWCdUmSJEmaJhY3dOzVShWSJEmSpq3FCh2lFEOHJEmSpMXiRHJJkiRJrRrkG8lntOHh4bWp38YuTQnDw8NP67oGqUv2Acl+0G/WrFl/7LoGVYaOidsemNt1EVKPs7suQOqYfUCyH/Tz++SmCEPHxB0K5K6LmEL8I9e9zbouQPaDjtkHumcf6J79QFOSoWOCZs2adSVwZdd1SCM8hayZzj4g2Q80dTmRXJIkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1Krlui4AIKX0cOAwYCvgJmCfnPPBo2z3LGAv4OnNojOBXXPO/2zWbwGcCtzWc7d9c877tla8JEmSpIWaEqEDOIhay2xgA+CUlNL5OefT+rZbDTgCeANwO7A3kIGNe7a5Juf8qPZLliRJkjQenYeOlNKKwOuBp+acbwb+lFKaB2wHPCB05Jx/3nffLwG7pZTWyDlfv4RKliRJkrQYOg8dwIZA5JzP61l2DvDBcdz3+cBVfYFjjZTSVcCdwInA7jnnGyar2BFDQ0MrACtMdrvSRA0NDa3SdQ1Sl+wDkv2g3+zZs2/qugZVUyF0rESdx9FrPrDywu6UUlqfOixrl57Ffwc2Bc6nDtU6FPg2sPXklPoAuwNzW2hXmqgFXRcgdcw+INkP+kXXBaiaCqHjFqA/la8K3DzWHVJKjwZOBj6bcz5mZHnO+Srgqubm5SmlnYELU0oPyznfNkpTg9gP2H+S21ya+Ueue6t2XYDsBx2zD3TPPtA9+4GmpKkQOi4ASkpp45zz+c2yTYFzR9s4pbQOda7H4TnnAxbR9r3UhDvpKXf27Nl3UodwSVOCp5A109kHJPuBpq7OQ0fO+daU0rHA3imldwLrA3OoV6h6gJTSbOB04Mic82dHWf8C4GLgUuCRwFeBk3LOt7Z2AJIkSZIWqvPQ0dgJOBy4kjq/Y4+c86kAKaVbgK1yzmcA76FeUvcjKaWP9Nz/CTnny4CnAt8BVqfOCzkR+NiSOghJkiRJDzYlQkfOeT71srmjrVup5997Ub8ccKx29sd5FpIkSdKUskzXBUiSJEma3gwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktSq5bouYGk1PDy8NrB213VII4aHh5/WdQ1Sl+wDkv2g36xZs/7YdQ2qDB0Ttz0wt+sipB5nd12A1DH7gGQ/6BddF6DK0DFxhwK56yKmEP/IdW+zrguQ/aBj9oHu2Qe6Zz/QlGTomKBZs2ZdCVzZdR3SCE8ha6azD0j2A01dTiSXJEmS1CpDhyRJkqRWObxKkibJow49susSZrZ99+66AknSGDzTIUmSJKlVhg5JkiRJrTJ0SJIkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQIUmSJKlVhg5JkiRJrTJ0SJIkSWrVcl0XIEmSpodHHXpk1yVo3727rkAalWc6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElq1bSbSJ5SejhwGLAVcBOwT8754E6LkiRJkmaw6Xim4yBqmJoNvBLYO6X0gm5LkiRJkmauaXWmI6W0IvB64Kk555uBP6WU5gHbAad1WZskSZI0U02r0AFsCETO+byeZecAH5zsHQ0NDa0ArDDZ7UoTNTQ0tErXNUhdsg9I9oN+s2fPvqnrGlRNt9CxEnUeR6/5wMot7Gt3YG4L7S6Vtv7rb7ouQbCg6wJmOvtB5+wDHbMPTAn2gweKrgtQNd1Cxy1Af8JfFbi5hX3tB+zfQrta8lYGLgceTTuvFWlpYD+Q7AdSa6Zb6LgAKCmljXPO5zfLNgXOnewdzZ49+07gzsluV0ve0NDQyD9v9jSsZir7gWQ/kNo0ra5elXO+FTiWesWqlVNKTwHmAN/qtDBJkiRpBptWoaOxE1CAK4GfA3vknE/ttiRJkiRp5ppuw6vIOc+nXjZXkiRJ0hQwHc90SJIkSZpCDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1KoopXRdgyRJkqRpzDMdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmtMnRIkiRJapWhQ5IkSVKrDB2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSZIkSa0ydEiSJElqlaFDkiRJUqsMHZIkSZJaZeiQJEmS1CpDhyRJkqRWGTokSZIktcrQoaVWSmmLlNJVXdexpKWULkkpbdl1HZIkSeO1XNcFaHpIKZ0OPB/4r5zzb3qWfwV4H7BDzvmQAdpfD7gYeGjO+Y4B2inAxjnnv0+0jSWpeVy/P8hjp6VfSumtwIeBDYFbgZ8BH8s5X9lpYdISklK6pefmQ4Fh4O7m9r45532XfFWSFoehQ5PpAuAdwG8AUkqzgDcCF3ZZlLQ0Sym9H/gUsB3wC2BN4PPAb1JKT8s5z++wvAlLKc3KOQ93XYeWDjnnlUb+nVI6Ezgk5zyvu4oGl1JaFig553u7rkVaEgwdmkxHAe9LKb0/53w78Ergz8AKIxuklOYAuwOPAM4Gdsw5X9CsuwQ4EHgL8Hjg18C2Oecbgf9tmrgupQSwDXBHc79dgI8DywJfyDl/YbTiUkojbZzdnPH4YM75sJTSy4HPAusC5wPvyzn/31gH2dx3B2BX4DHA94GPAN8AXkwNX2/MOV/UbL8hcDCwGXANsN/If5YppT2BJwE3AG8ArgXem3M+JaW0D/A84FkppS8CP8o5v60p44nN+v7HSdNISmkV4DPA9jnn3Cy+IqX0duBc4APA3KZfvRf4ZfP7DmC3nPNRTTvLA3sBbwZWAk4CdhrtNZNS+iuwd875mJ5lFzTtHZ9SejzwVWBzYAHwpZzzwc12T2/WPaGp4TjgAznnO5v1Bdil+VkbWGUyHifNXCmli4C355x/0ww7/Tnw4pzzL1NKzwOOyDk/PqUUwG7U/rEy9f+UHXPODxqim1L6KfC/OefP9yw7GTgh5/zllNKjgK8AWwB3Ad8EPp1zvjel9Fjq/wWbAgU4udnPjU07lwCHUD+Q2xhYD5hxw4Q1MzmnQ5PpGuC3wKub23OAeSMrU0pbAAdQz4Y8stn2p80ZkRFvae4/G3g49U0VwH83v9fMOa+Ucz5x5Haz7brUkLNPSmmD0YrLOY+0sVnTxmHNG6hjqUFoDep/Hj9PKa22iGPdGngWdbjLK6lv9j4HrE59M7hfc8yzgJ82x/rI5ti/nFJ6fk9br2y2WR34GnBEU+8ngDOAXZt639Zzn7EeJ00vz6YOJflB78Kc8z3Nspf2LN4MGKK+znYBDm1CC9TX41OBZ1CD8l3AQWPs89vAfa+1lNKzgdWAE1JKDwNOATI1NLwc+FhK6SXN5vdQh4GtSe0fL2hq6bUNNUw/cpFHLy3a6dTXGdQQ8K++26c3/34H9cOiLYH/AOYDR4/R5jwe2AfWob5mj04pLUN9/V9I/X/nmcCrgHc1mwf1/4LZ1FCxDrB3X/tvBV5HDd3Xju8wpaWfoUOTbR7wjpTSWsBzgB/1rHsrMC/nfGbO+S7g09Q32s/s2ebAnPO/c863UMPA0xaxv3uBPXLOdzVnJ/5O/YRpvN4I/CLnfELO+e6c8+HAv4FXLOJ+n885z885XwH8Cjgn5/z7nPPdwDE9dT+zOca9mhrPpO8/NOB3OecfN28kvw08JqW05iL2v7iPk5ZOawLXjTEM6cpm/Ygrcs5fa17Hx1H7xobNJ7zbU884XNOchfwU8PqU0mhnu78LvKjpwwBvB77X1PBK4Kqc89dzzsM5538Ah1PPoJBz/lPO+bdNDZcAh1LnevX6bE8d0qBOp4YLqK+1z/Tc3oL7Q8dbgQNyzv/IOd8GfAjYIqX06FHazMDaKaVNe+57Us75GuDp1OD+yZzzHTnnIWB/7u8D/8o5n5RzvjPnfG2zrr8PHNRsd1fzd1+aERxepcn2E+pQoo8Cx+Wc72iGQ0H9xGfkDAU557tTSpc3y0f0nma+jToUZGFu6HtDdt99+iYebpVzPmOU+68DXNK37JKRmhbSxtV9++y/PVL3OsC/+/5juQR4Wc/t/mOmuf91o9Q71n0W9Thp6XQdsOYY8x/W5oGvkf4hGiOvi7WAFYHf9fRFqKHkkcAVvQtzzlenlH4JvDmldAh12N/IGZX1gKemlOb33GVZ6hm5kaGE+1PfmD2M+n/Mn/vqumzsw5UW22nUs3qrA+tTQ/N+zdnqZ1NDM/T9rc8535hSuqlZfnlvgznnu1JK32vuew71Q6K5zer1qH3qxp7+tAz1wypSSo+gDjF8HnUY1zLAzX012wc0Ixk6NKlyzsMppWOADwLP7Vt9BfV0NHDfJLpH0/emZwxlArWM5434FTz4LMF61LMH421jUe0/OqW0bE/wWI/xHTNM4Lg1rfyOOjfiddS5QwA0Qzy2AX44jjauA24HNm3OPozHt6hDDq8Arsw5n90svwz4bc55izHu93Xgr8Bbcs43NZPg39y3jZNmNWlyzpenlK6k/p/zu+bDrN83t69ozkbDg///WY06vGmsv8Xfog4p/D414P+kWX4ZcHnOeb0x7rcfNWg8Oed8fUrpVdQzfr3sA5qRDB1qw2eA43POv+tbfhRwbErpaOAv1MnfNwK/H0eb11L/UD8O+NsAtV3dtDFyydxjgN1TSi+jzst4O3W8788G2Eev31PHDu+eUvo8dejXO4DXLma9moGaN+57AAc2Z91Oog6p+hz1TMIB42jj3pTSocABKaUdc85XNp/GPjvn/OMx7vYT6hulPahD/kb8FPhsSuldwJHUORwbAw/JOZ9F/WT3JuDm5qzHe6mTzaU2nU6dOzS35/ae1L/vI44CPplS+jn1zMYXqJPFH3CWY0TO+Y8ppWuowwe/3wwJBjgLuDal9CnqWb3bqX+jZ+ecf0XtA7cCC1JKs6lznCThnA61oBmvfeooy0+jXj3kaOqk8/8Gth7PZTObMbifAU5LKc1vQsJEzAW+0bTxnubKWW8CvghcT32T9Iqc8w0TbL+/7mHqpPMXUo/5SODDzWMxHl8BUkrpxpTStxe5taadnPP+1Dcu+1AD7F+aVc9djNfpx5r7/TqldDP1wgbPWMg+h6n99InU1+zI8luAlwCJOpzkWuAw7r8K1Yepw7Fupl6U4QET4KWWnEZ9DZ4+xm2o4fmb1KtJXU4N729ZRLvzgCfTE7ybM9ZbUy8i8k/qB2fHUM+GQL1K3JOpffVnwPGLfzjS9BSlOHpDkvRAKaVdgZflnLfquhapCymlV1Mvcb5x17VI04FnOiRJD9Bcand76vcJSDNOSukh1CFb9gFpkhg6JEn3SSm9k3o53rOolw6VZpSU0ouow23v4cGTwCVNkMOrJEmSJLXKMx2SJEmSWmXokCRJktQqQ4ckSZKkVhk6JEmSJLXK0CFJkiSpVYYOSdNeROwZEaXn59qI+GVEPK/r2toSEa+OiB3Hue285nE5c4z1f2vWHzSBOvaMiOeMsrxExIcXt73F2O+HI8LLM0rSFGHokDRT3A48u/nZAVgD+GVEPKnTqtrzamBcoaNxC/DMiFi/d2FEbApsDNw6wTrmAg8KHZKkmcXQIWmmuLeUcmbzcyyQgOWo37wtuBT4M/CWvuVvAX4DXLfEK5IkTRuGDkkzUinlMuob6ccCRMSHIuKsiFgQEddExE8jYsOR7SMiNUOCHt/bTkSsGhG3RcT7mtvzIuLciHhZRPw1Im6PiDMi4rERsXpE/E9E3BQRF0XEG/vriohXRMTvm/tdGxFfj4gVe9Zv0dTx0og4OiJujohLI2K3nm3mAe8AntgzpGzeOB6Wo4E397QTwJua5Q8SERtHxI+bx+zWiDghIh7Xs35keNMXeurYoqeJZSJir4i4OiKui4hv9R5r08YmEXFiRNzSPG4/jogN+rZZJSK+0zwW10bE56mBUpI0RRg6JM1IEbEKsDow1Cx6NHAQ8Crg3dS/j7+NiNWb9ScAVwDb9TX15mbbI3uWrQ18Dtgb2JYabI4Cvg+cC7wOOBs4MiLW7alpGyADfwVeA+wGvBb45iiH8HXggma7E4DPRcSWzbq9gZ8B/+L+IWV7L/pR4XvAxhHxlOb285pj+UH/hs0wrN9SH8M51DMia1GHrK3QbPbs5veBPXX8saeZnYENqAFp76aNT/Xs4zHAGcAjm23eDWwInBERa/W0c0TzOHys2e6JTduSpCnCT4IkzRgRMfI379HAl4BlgWMBSikf6NluWeBk4BpgG+CwUso9EfEtYLuI+GQp5Z5m8+2A40spN/TsajXgv0op5zftzaa+8f5cKWXvZtlZ1EDxauArzVmFLwL/U0p5d08tVwM/jYi9Syl/69nHD0spezbbnAq8sqn1xFLKRRFxLbBuKWXUyeGjKaX8OyJ+TX3z/2dqYPpFKeW6Wt4DzAVuBF5SSrmjqeO3wMXAu4CDSylnNve7bIw6riqlbNv8+8SI2Lw5ho81yz4ALA+8tJRybbOP3wP/BHYC9oyIjamP47tLKUc025wEXDTe45Yktc8zHZJmihWB4ebnYuAFwM6llF8ARMSzIuLkiLgeuBu4DViJ+sn6iG9SP/nfsrnPJsDmPPhMxNBI4Ghc0Pw+ZWRBKWU+NdQ8plm0IbAucExELDfyA/wKKMDT+/ZxUk9b9wJ/p4apQR0NvKk5W7ENYwytAl4K/Bi4u6fWG6lhZfNx7uukvtvn8cBjeB5w6kjgACilXEo9wzJy5bFnAAH8qGebu5vaJElThKFD0kxxO/XN8NOB9YA1SylfA4iI/6C+AV6WOrH8uc221wAPGWmglHIJ9QzIu5pF76JOwP5l377m992+ayHLR9pfs/n9I+4PR8PUq0otw/3hZGH7eAiD+wE1WH26aW+sN+9rArv21TpMvVJVf61jmd93+y5ghZ7bqwFXjXK/q6jDumhqHS6l3Ni3zdXjrEGStAQ4vErSTHFvKeUPY6zbknpW47XNGYiRoVirj7Lt4cDREbEOdfjR15ozDYMaGZ61M/D7UdYPjbJs0pVSro+IXwAfpg71GutSuTdQ55IcPMq6myepnBuo8zn6PYr7H68rgVkRsVpf8BjtfpKkjhg6JAkeSh3CNNyz7A2M/jfyx9RhREdTv+vjW5NUw9+By4H1R87ADGiQMx8HAvcAhyxkm1OATYA/9cxvGc3wAHX8Gtg+ItYopVwP900ufw6wb7PNWdTn7jXUCeUjgfFVE9ynJKkFhg5JglOb39+KiEOBJ1A/6Z/fv2EpZTgivg18BDipufTuwEopJSI+SD2LsiL1LMKt1HkerwA+Xkq5YGFt9DmfOun9zdSJ19c1w8PGU8tJPHi+Rb+51Df8v4iIw6jDmR4FPB84o5TyvZ46XhURZzTH849SynjPhBwAvBM4KSL2oQ5/24t6luNrTa3nRcTxwJcj4iHAJdRJ5suOcx+SpCXAOR2SZrxSyl+pb243A35KvXrTNsCCMe4yMml5tEvZDlLHD4CXAxtRL1+bgQ9R30gv7hyFb1LnZxxIDQd7TladAKWUC6mTuK+nDrH6BfBZ6oT9v/RsuhP1/5qfN3Vsthj7+Dfw39TvU/ku9UzGhcDzeieXU68gloHPA9+hnjU6aCLHJUlqR5RSFr2VJOk+EfFpYEdgnVLKnV3XI0nSVOfwKkkap4j4T+A/gV2oE8gNHJIkjYNnOiRpnCLidOBZwInAtgu5spMkSeph6JAkSZLUKieSS5IkSWqVoUOSJElSqwwdkiRJklpl6JAkSZLUKkOHJEmSpFYZOiRJkiS1ytAhSZIkqVWGDkmSJEmt+v/qhYA7k0s3jAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 800x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ggplot: (150589191590)>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plotnine.options.figure_size = (8, 4.8)\n",
"(\n",
" ggplot(data = df_churn_contract)+\n",
" geom_bar(aes(x = 'Contract',\n",
" y = 'Total',\n",
" fill = 'Churn',\n",
" width = 0.5),\n",
" stat = 'identity',\n",
" position = 'fill')+\n",
" labs(title = 'The composition of churn by contract',\n",
" subtitle = 'Telco Churn Data')+\n",
" xlab('Payment Method')+\n",
" ylab('Frequency')+\n",
" scale_x_discrete(limits = ['Month-to-month', 'One year', 'Two year'])+\n",
" scale_fill_manual(values = ['#80797c','#981220'], labels = ['No', 'Yes'])+\n",
" theme_minimal()\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data pre-processing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Remove unused columns for the next analysis `customerID`"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"#del df_cat['customerID']"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"#print('Dimension data: {} rows and {} columns'.format(len(df_cat), len(df_cat.columns)))\n",
"#df_cat.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cluster analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thanks to https://github.com/aryancodify/Clustering"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"# Convert the dataframe into matrix\n",
"dfMatrix = df_cat.loc[:, df_cat.columns != 'customerID'].to_numpy()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([['Female', 'No', 'Yes', ..., 'Yes', 'Electronic check', 'No'],\n",
" ['Male', 'No', 'No', ..., 'No', 'Mailed check', 'No'],\n",
" ['Male', 'No', 'No', ..., 'Yes', 'Mailed check', 'Yes'],\n",
" ...,\n",
" ['Female', 'No', 'Yes', ..., 'Yes', 'Electronic check', 'No'],\n",
" ['Male', 'Yes', 'Yes', ..., 'Yes', 'Mailed check', 'Yes'],\n",
" ['Male', 'No', 'No', ..., 'Yes', 'Bank transfer (automatic)',\n",
" 'No']], dtype=object)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfMatrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Error of initialization: https://github.com/nicodv/kmodes/blob/master/README.rst#faq"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cluster initiation: 1\n",
"Cluster initiation: 2\n",
"Cluster initiation: 3\n",
"Cluster initiation: 4\n",
"Cluster initiation: 5\n",
"Cluster initiation: 6\n",
"Cluster initiation: 7\n",
"Cluster initiation: 8\n",
"Cluster initiation: 9\n"
]
}
],
"source": [
"# Choosing optimal K\n",
"cost = []\n",
"for cluster in range(1, 10):\n",
" try:\n",
" kmodes = KModes(n_jobs = -1, n_clusters = cluster, init = 'Huang', random_state = 0)\n",
" kmodes.fit_predict(dfMatrix)\n",
" cost.append(kmodes.cost_)\n",
" print('Cluster initiation: {}'.format(cluster))\n",
" except:\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Cluster</th>\n",
" <th>Cost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>54520.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>45026.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>34507.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>33157.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>31005.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>29833.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>7</td>\n",
" <td>29623.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>8</td>\n",
" <td>28234.000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>9</td>\n",
" <td>28001.000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Cluster Cost\n",
"0 1 54520.000\n",
"1 2 45026.000\n",
"2 3 34507.000\n",
"3 4 33157.000\n",
"4 5 31005.000\n",
"5 6 29833.000\n",
"6 7 29623.000\n",
"7 8 28234.000\n",
"8 9 28001.000"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Converting the results into a dataframe and plotting them\n",
"df_cost = pd.DataFrame({'Cluster': range(1, 10), 'Cost': cost})\n",
"df_cost"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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FUGkw7PwjlW3ufuhccciIiIi2Ul9nkVERERE0qTkWUREREQkTUqeRURERETSpD7PIiIiIiJpUsuziIiIiEialDyLiIiIiKRJybOIiIiISJqUPIuIiIiIpEnJs4iIiIhImpQ8i4iIiIikScmziIiIiEialDxLvZLJZP9kMjk2mUz2jzuWfFRWVta5rKxsbFlZWee4Y8lXqsOZpTqcWaq/maX6m1n5Xn+VPEtD+gPnRH+l7XUmPL/64M4c1eHMUh3OLNXfzFL9zay8rr9KnkVERERE0qTkWUREREQkTUqeRURERETSVBR3ANIyZmbA1l26dEl06dKlf/S8QdXV1ZUVFRXT3P2/7j67ncIUERERyStKnnOQmVlpaemtvXv33vewww7rOnDgwMKCgsZ/RKisrOSFF1448OGHH77UzIa7+/R2CldEREQkbyh5zk079u3bd9+ZM2d2LykpSXulo48+uuS+++7jyCOPnAisn7nwRERERPKT+jznoJKSkj8cffTR3ZqTONfae++9qa6uHmRmK2cgNBEREZG8puQ5B3Xp0mW11VdfvUWvXWFhISuttNJSYKU2DktEREQk7yl5zkFmZk31cW5MtG6jFxiKiIiIyIqUPOeRF154gT322IMBAwZgZjz00ENxhyQiIiKSV5Q855GFCxey8cYbc+2118YdioiIiEhe0mgbeWTEiBGMGDEi7jBERERE8pZankVERERE0qTkWUREREQkTUqeRURERETSpORZRERERCRNSp5FRERERNKk0TbyyIIFC/jkk09+fv7555/z1ltv0adPH9ZYY40YIxMRERHJD0qe88i0adMYPnz4z89PPPFEAA455BAmTJgQU1QiIiIi+UPJcx7Zcccdcfe4wxARERHJW0qe20kymewP9G+LbfXp06dXa9YvKCgoPPvss9dLJpNdGym2bu3fZDLZmt1JPXr37l1SUVFBaWnpxslkcmHc8eQp1eEMUh3OONXfDFL9zbicrb/FxcXTmyqj5Ln9HAWc0xYb2nrrramqqmrx+p07d+4+cuTIB9IsfkeLdyQNKioqonfv3gAvxB1LB6A6nAGqw+1G9TcDVH/bTS7WX2uqgJLn9vN/QNAWG5o+ffpRK6+88qiDDjqouLnrLly4kC+++KKyoqJiJ2BxI0XXJaz0BwEftDBUaUBVVVVJRUXFC6WlpdsXFRWp1SMz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\n",
"text/plain": [
"<Figure size 800x480 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ggplot: (150589228192)>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plotnine.options.figure_size = (8, 4.8)\n",
"(\n",
" ggplot(data = df_cost)+\n",
" geom_line(aes(x = 'Cluster',\n",
" y = 'Cost'))+\n",
" geom_point(aes(x = 'Cluster',\n",
" y = 'Cost'))+\n",
" geom_label(aes(x = 'Cluster',\n",
" y = 'Cost',\n",
" label = 'Cluster'),\n",
" size = 10,\n",
" nudge_y = 1000) +\n",
" labs(title = 'Optimal number of cluster with Elbow Method')+\n",
" xlab('Number of Clusters k')+\n",
" ylab('Cost')+\n",
" theme_minimal()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, ..., 1, 1, 2], dtype=uint16)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Fit the cluster\n",
"kmodes = KModes(n_jobs = -1, n_clusters = 3, init = 'Huang', random_state = 0)\n",
"kmodes.fit_predict(dfMatrix)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([['Male', 'No', 'No', 'No', 'Yes', 'No', 'No',\n",
" 'No internet service', 'No internet service',\n",
" 'No internet service', 'No internet service',\n",
" 'No internet service', 'No internet service', 'Two year', 'No',\n",
" 'Mailed check', 'No'],\n",
" ['Male', 'No', 'No', 'No', 'Yes', 'No', 'Fiber optic', 'No', 'No',\n",
" 'No', 'No', 'No', 'No', 'Month-to-month', 'Yes',\n",
" 'Electronic check', 'No'],\n",
" ['Female', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Fiber optic', 'No',\n",
" 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Two year', 'Yes',\n",
" 'Electronic check', 'No']], dtype='<U19')"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Cluster centorid\n",
"kmodes.cluster_centroids_"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the iteration of the clusters created\n",
"kmodes.n_iter_"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"34507.0"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the cost of the clusters created\n",
"kmodes.cost_"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-37-08d1f047d227>:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
"<ipython-input-37-08d1f047d227>:3: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n"
]
}
],
"source": [
"# Add the cluster to the dataframe\n",
"df_cat['Cluster Labels'] = kmodes.labels_\n",
"df_cat['Segment'] = df_cat['Cluster Labels'].map({0:'First', 1:'Second', 2:'Third'})"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-38-1ca94e148e49>:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
"<ipython-input-38-1ca94e148e49>:3: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n"
]
}
],
"source": [
"# Order the cluster\n",
"df_cat['Segment'] = df_cat['Segment'].astype('category')\n",
"df_cat['Segment'] = df_cat['Segment'].cat.reorder_categories(['First', 'Second', 'Third'])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"scrolled": true
},
"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>customerID</th>\n",
" <th>gender</th>\n",
" <th>SeniorCitizen</th>\n",
" <th>Partner</th>\n",
" <th>Dependents</th>\n",
" <th>PhoneService</th>\n",
" <th>MultipleLines</th>\n",
" <th>InternetService</th>\n",
" <th>OnlineSecurity</th>\n",
" <th>OnlineBackup</th>\n",
" <th>DeviceProtection</th>\n",
" <th>TechSupport</th>\n",
" <th>StreamingTV</th>\n",
" <th>StreamingMovies</th>\n",
" <th>Contract</th>\n",
" <th>PaperlessBilling</th>\n",
" <th>PaymentMethod</th>\n",
" <th>Churn</th>\n",
" <th>Cluster Labels</th>\n",
" <th>Segment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7590-VHVEG</td>\n",
" <td>Female</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>No</td>\n",
" <td>1</td>\n",
" <td>Second</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5575-GNVDE</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Mailed check</td>\n",
" <td>No</td>\n",
" <td>1</td>\n",
" <td>Second</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3668-QPYBK</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Mailed check</td>\n",
" <td>Yes</td>\n",
" <td>1</td>\n",
" <td>Second</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7795-CFOCW</td>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No phone service</td>\n",
" <td>DSL</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>One year</td>\n",
" <td>No</td>\n",
" <td>Bank transfer (automatic)</td>\n",
" <td>No</td>\n",
" <td>1</td>\n",
" <td>Second</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>9237-HQITU</td>\n",
" <td>Female</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Fiber optic</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>Yes</td>\n",
" <td>1</td>\n",
" <td>Second</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customerID gender SeniorCitizen Partner Dependents PhoneService \\\n",
"0 7590-VHVEG Female No Yes No No \n",
"1 5575-GNVDE Male No No No Yes \n",
"2 3668-QPYBK Male No No No Yes \n",
"3 7795-CFOCW Male No No No No \n",
"4 9237-HQITU Female No No No Yes \n",
"\n",
" MultipleLines InternetService OnlineSecurity OnlineBackup \\\n",
"0 No phone service DSL No Yes \n",
"1 No DSL Yes No \n",
"2 No DSL Yes Yes \n",
"3 No phone service DSL Yes No \n",
"4 No Fiber optic No No \n",
"\n",
" DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n",
"0 No No No No Month-to-month \n",
"1 Yes No No No One year \n",
"2 No No No No Month-to-month \n",
"3 Yes Yes No No One year \n",
"4 No No No No Month-to-month \n",
"\n",
" PaperlessBilling PaymentMethod Churn Cluster Labels Segment \n",
"0 Yes Electronic check No 1 Second \n",
"1 No Mailed check No 1 Second \n",
"2 Yes Mailed check Yes 1 Second \n",
"3 No Bank transfer (automatic) No 1 Second \n",
"4 Yes Electronic check Yes 1 Second "
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_cat.head()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['customerID', 'gender', 'SeniorCitizen', 'Partner', 'Dependents',\n",
" 'PhoneService', 'MultipleLines', 'InternetService', 'OnlineSecurity',\n",
" 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV',\n",
" 'StreamingMovies', 'Contract', 'PaperlessBilling', 'PaymentMethod',\n",
" 'Churn', 'Cluster Labels', 'Segment'],\n",
" dtype='object')"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_cat.columns"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['gender',\n",
" 'SeniorCitizen',\n",
" 'Partner',\n",
" 'Dependents',\n",
" 'PhoneService',\n",
" 'MultipleLines',\n",
" 'InternetService',\n",
" 'OnlineSecurity',\n",
" 'OnlineBackup',\n",
" 'DeviceProtection',\n",
" 'TechSupport',\n",
" 'StreamingTV',\n",
" 'StreamingMovies',\n",
" 'Contract',\n",
" 'PaperlessBilling',\n",
" 'PaymentMethod',\n",
" 'Churn']"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Columns for centroids\n",
"list_col = ['customerID', 'Cluster Labels', 'Segment']\n",
"cols = [col for col in df_cat if col not in list_col]\n",
"cols"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"index = ['First Cluster', 'Second Cluster', 'Third Cluster']"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"scrolled": true
},
"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>gender</th>\n",
" <th>SeniorCitizen</th>\n",
" <th>Partner</th>\n",
" <th>Dependents</th>\n",
" <th>PhoneService</th>\n",
" <th>MultipleLines</th>\n",
" <th>InternetService</th>\n",
" <th>OnlineSecurity</th>\n",
" <th>OnlineBackup</th>\n",
" <th>DeviceProtection</th>\n",
" <th>TechSupport</th>\n",
" <th>StreamingTV</th>\n",
" <th>StreamingMovies</th>\n",
" <th>Contract</th>\n",
" <th>PaperlessBilling</th>\n",
" <th>PaymentMethod</th>\n",
" <th>Churn</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>First Cluster</th>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No internet service</td>\n",
" <td>No internet service</td>\n",
" <td>No internet service</td>\n",
" <td>No internet service</td>\n",
" <td>No internet service</td>\n",
" <td>No internet service</td>\n",
" <td>Two year</td>\n",
" <td>No</td>\n",
" <td>Mailed check</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Second Cluster</th>\n",
" <td>Male</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Fiber optic</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>No</td>\n",
" <td>Month-to-month</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>No</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Third Cluster</th>\n",
" <td>Female</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Fiber optic</td>\n",
" <td>No</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Yes</td>\n",
" <td>Two year</td>\n",
" <td>Yes</td>\n",
" <td>Electronic check</td>\n",
" <td>No</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" gender SeniorCitizen Partner Dependents PhoneService \\\n",
"First Cluster Male No No No Yes \n",
"Second Cluster Male No No No Yes \n",
"Third Cluster Female No Yes No Yes \n",
"\n",
" MultipleLines InternetService OnlineSecurity \\\n",
"First Cluster No No No internet service \n",
"Second Cluster No Fiber optic No \n",
"Third Cluster Yes Fiber optic No \n",
"\n",
" OnlineBackup DeviceProtection TechSupport \\\n",
"First Cluster No internet service No internet service No internet service \n",
"Second Cluster No No No \n",
"Third Cluster Yes Yes Yes \n",
"\n",
" StreamingTV StreamingMovies Contract \\\n",
"First Cluster No internet service No internet service Two year \n",
"Second Cluster No No Month-to-month \n",
"Third Cluster Yes Yes Two year \n",
"\n",
" PaperlessBilling PaymentMethod Churn \n",
"First Cluster No Mailed check No \n",
"Second Cluster Yes Electronic check No \n",
"Third Cluster Yes Electronic check No "
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(kmodes.cluster_centroids_, columns = cols, index = index)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment