{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Case 21.6 Segmenting Consumers of Bath Soap\n", "\n", "> (c) 2019 Galit Shmueli, Peter C. Bruce, Peter Gedeck \n", ">\n", "> Case study included in\n", ">\n", "> _Data Mining for Business Analytics: Concepts, Techniques, and Applications in Python_ (First Edition) \n", "> Galit Shmueli, Peter C. Bruce, Peter Gedeck, and Nitin R. Patel. 2019." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no display found. Using non-interactive Agg backend\n" ] } ], "source": [ "from pathlib import Path\n", "import numpy as np\n", "import pandas as pd\n", "\n", "from sklearn.cluster import KMeans\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.ensemble import BaggingClassifier\n", "\n", "import matplotlib.pylab as plt\n", "\n", "import dmba\n", "from dmba import classificationSummary, gainsChart\n", "\n", "from IPython.display import display_html\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(600, 46)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Member idSECFEHMTSEXAGEEDUHSCHILDCS...PropCat 6PropCat 7PropCat 8PropCat 9PropCat 10PropCat 11PropCat 12PropCat 13PropCat 14PropCat 15
010100104310144241...0.0000000.0000000.0000000.0000000.00.0000000.0280370.00.1308410.339564
110100203210224421...0.3470480.0268340.0161000.0143110.00.0590340.0000000.00.0805010.000000
210140202310245641...0.1212120.0335500.0108230.0086580.00.0000000.0162340.00.5616880.003247
31014030400040050...0.0000000.0000000.0000000.0000000.00.0000000.0000000.00.6000000.000000
410141904110234431...0.0000000.0000000.0481930.0000000.00.0000000.0000000.00.1445780.000000
\n", "

5 rows × 46 columns

\n", "
" ], "text/plain": [ " Member id SEC FEH MT SEX AGE EDU HS CHILD CS ... PropCat 6 \\\n", "0 1010010 4 3 10 1 4 4 2 4 1 ... 0.000000 \n", "1 1010020 3 2 10 2 2 4 4 2 1 ... 0.347048 \n", "2 1014020 2 3 10 2 4 5 6 4 1 ... 0.121212 \n", "3 1014030 4 0 0 0 4 0 0 5 0 ... 0.000000 \n", "4 1014190 4 1 10 2 3 4 4 3 1 ... 0.000000 \n", "\n", " PropCat 7 PropCat 8 PropCat 9 PropCat 10 PropCat 11 PropCat 12 \\\n", "0 0.000000 0.000000 0.000000 0.0 0.000000 0.028037 \n", "1 0.026834 0.016100 0.014311 0.0 0.059034 0.000000 \n", "2 0.033550 0.010823 0.008658 0.0 0.000000 0.016234 \n", "3 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", "4 0.000000 0.048193 0.000000 0.0 0.000000 0.000000 \n", "\n", " PropCat 13 PropCat 14 PropCat 15 \n", "0 0.0 0.130841 0.339564 \n", "1 0.0 0.080501 0.000000 \n", "2 0.0 0.561688 0.003247 \n", "3 0.0 0.600000 0.000000 \n", "4 0.0 0.144578 0.000000 \n", "\n", "[5 rows x 46 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bathSoap_df = dmba.load_data('BathSoapHousehold.csv')\n", "print(bathSoap_df.shape)\n", "bathSoap_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 1:\n", "Use $k$-means clustering to identify clusters of households based on:\n", "\n", "1. The variables that describe purchase behavior (including brand loyalty)\n", "2. The variables that describe the basis for purchase\n", "3. The variables that describe both purchase behavior and basis of purchase\n", "\n", "Note 1: How should $k$ be chosen? Think about how the clusters would be used. It is likely that the marketing efforts would support two to five different promotional approaches.\n", "\n", "Note 2: How should the percentages of total purchases comprised by various brands be treated? Isn't a customer\n", "who buys all brand A just as loyal as a customer who buys all brand B? What will be the effect on any distance measure of using the brand share variables as is? Consider using a single derived variable.\n", "\n", "We look first at clusters based on purchase behavior, then clusters based on the basis for purchase, then clusters based on both. The complexity of marketing to 5 segments would probably not be supported by clustering just based on purchase behavior, or clustering just based on basis for purchase, so we will look at 2-3 clusters for those variables, and more when we cluster using both sets of variables.\n", "\n", "In choosing 𝑘 , we would seek a 𝑘 that produces clusters that are distinct and separate from one another, in ways (variables) that are translatable into marketing actions. The variables we have been asked to consider are those that relate to purchase behavior (volume and frequency of purchase, brand loyalty), and a separate set that relate to the basis for purchase (response to promotions, pricing, and selling proposition)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Demographic Index(['SEC', 'FEH', 'MT', 'SEX', 'AGE', 'EDU', 'HS', 'CHILD', 'CS',\n", " 'Affluence Index'],\n", " dtype='object')\n", "Purchase Index(['No. of Brands', 'Brand Runs', 'Total Volume', 'No. of Trans', 'Value',\n", " 'Trans / Brand Runs', 'Vol/Tran', 'Avg. Price '],\n", " dtype='object')\n", "Promotion Index(['Pur Vol No Promo - %', 'Pur Vol Promo 6 %', 'Pur Vol Other Promo %'], dtype='object')\n", "Brand Index(['Br. Cd. 57, 144', 'Br. Cd. 55', 'Br. Cd. 272', 'Br. Cd. 286',\n", " 'Br. Cd. 24', 'Br. Cd. 481', 'Br. Cd. 352', 'Br. Cd. 5'],\n", " dtype='object')\n", "Other brand Index(['Others 999'], dtype='object')\n", "Price category Index(['Pr Cat 1', 'Pr Cat 2', 'Pr Cat 3', 'Pr Cat 4'], dtype='object')\n", "Selling property Index(['PropCat 5', 'PropCat 6', 'PropCat 7', 'PropCat 8', 'PropCat 9',\n", " 'PropCat 10', 'PropCat 11', 'PropCat 12', 'PropCat 13', 'PropCat 14',\n", " 'PropCat 15'],\n", " dtype='object')\n" ] } ], "source": [ "# Group columns into sets for further analysis\n", "demographicIndicators = bathSoap_df.columns[1:11]\n", "purchaseIndicator = bathSoap_df.columns[11:19]\n", "withinPromotionIndicator = bathSoap_df.columns[19:22]\n", "brandIndicator = bathSoap_df.columns[22:30]\n", "otherBrandIndicator = bathSoap_df.columns[30:31]\n", "priceCategoryIndicator = bathSoap_df.columns[31:35]\n", "sellingPropertyIndicator = bathSoap_df.columns[35:46]\n", "\n", "print('Demographic', demographicIndicators)\n", "print('Purchase', purchaseIndicator)\n", "print('Promotion', withinPromotionIndicator)\n", "print('Brand', brandIndicator)\n", "print('Other brand', otherBrandIndicator)\n", "print('Price category', priceCategoryIndicator)\n", "print('Selling property', sellingPropertyIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clusters based on \"purchase behavior\"\n", "Note: Some thought is needed about brand loyalty. For brand loyalty indicators, we have data on \n", " \n", "1. percent of purchases devoted to major brands (i.e. is a customer a total devotee of brand A?), `brandIndicator` \n", "2. a catch-all variable for percent of purchases devoted to other smaller brands (to reduce complexity of analysis), and `otherBrandIndicator`\n", "3. a derived variable that indicates the maximum share devoted to any one brand. \n", " \n", "Since CRISA is compiling this data for general marketing use, and not on behalf of one particular brand, we can\n", "say a customer who is fully devoted to brand A is similar to a customer fully devoted to brand B - both\n", "are fully loyal customers in their behavior. But if we include all the brand shares in the clustering, the\n", "analysis will treat those two customers as very different. \n", "\n", "1. Number of different brands: `No. of Brands`\n", "2. Switching between brands: `Brand Runs`\n", "3. Proportion of purchases that go to different brands: We use the information in the `brandIndicator` to determine the maximum proportion a customer spends on one brand (new variable `maxBrandIndicator`)\n", "\n", "We derive the value of `maxBrandIndicator` by taking the maximum of all specific brand indicators." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "bathSoap_df['maxBrandIndicator'] = bathSoap_df[brandIndicator].max(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this analysis, we use all `purchaseIndicator`, `maxBrandIndicator` and `otherBrandIndicator` as a description of the customers purchase behavior" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['No. of Brands', 'Brand Runs', 'Total Volume', 'No. of Trans', 'Value', 'Trans / Brand Runs', 'Vol/Tran', 'Avg. Price ', 'Others 999', 'maxBrandIndicator']\n" ] } ], "source": [ "behaviorIndicator = list(purchaseIndicator) + list(otherBrandIndicator) + ['maxBrandIndicator']\n", "print(behaviorIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Normalizing the data and definition of helper functions" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Normalize the data\n", "bathSoap_df_norm = (bathSoap_df - bathSoap_df.mean())/bathSoap_df.std()\n", "\n", "def clusterSizes(kmeans):\n", " return pd.Series(kmeans.labels_).value_counts().sort_index()\n", "\n", "\n", "def clusterCenters(kmeans, indicator):\n", " return bathSoap_df_norm[indicator].groupby(kmeans.labels_).mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Two clusters" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 317\n", "1 283\n", "dtype: int64\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No. of BrandsBrand RunsTotal VolumeNo. of TransValueTrans / Brand RunsVol/TranAvg. PriceOthers 999maxBrandIndicator
00.4836110.6328650.1582220.5221150.306960-0.261283-0.2853830.2796890.488928-0.588026
1-0.541712-0.708898-0.177232-0.584843-0.3438380.2926740.319669-0.313291-0.5476690.658673
\n", "
" ], "text/plain": [ " No. of Brands Brand Runs Total Volume No. of Trans Value \\\n", "0 0.483611 0.632865 0.158222 0.522115 0.306960 \n", "1 -0.541712 -0.708898 -0.177232 -0.584843 -0.343838 \n", "\n", " Trans / Brand Runs Vol/Tran Avg. Price Others 999 maxBrandIndicator \n", "0 -0.261283 -0.285383 0.279689 0.488928 -0.588026 \n", "1 0.292674 0.319669 -0.313291 -0.547669 0.658673 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clusters = KMeans(n_clusters=2, random_state=1).fit(bathSoap_df_norm[behaviorIndicator])\n", "print(clusterSizes(clusters))\n", "clusterCenters(clusters, behaviorIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment: The two clusters are well-separated on everything, except transaction volume. \n", "- Cluster 0 (n=317) is high activity & value, with low loyalty. \n", "- Cluster 1 (n=283) is the reverse. \n", "\n", "(\"Value\" here is the meaning attached to the variable - total dollar value of purchases, not some broader meaning.)\n", "Note: Due to the randomization element in the k-means process, different runs can produce different\n", "cluster results." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 169\n", "1 255\n", "2 176\n", "dtype: int64\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No. of BrandsBrand RunsTotal VolumeNo. of TransValueTrans / Brand RunsVol/TranAvg. PriceOthers 999maxBrandIndicator
00.9566711.0893360.6140671.0705820.744401-0.255378-0.2025620.1263560.253722-0.476069
1-0.301247-0.224690-0.531892-0.425770-0.453789-0.246577-0.2662040.2328780.611302-0.536321
2-0.482156-0.7204650.180994-0.411120-0.0573150.6024770.580199-0.458739-1.1293231.234190
\n", "
" ], "text/plain": [ " No. of Brands Brand Runs Total Volume No. of Trans Value \\\n", "0 0.956671 1.089336 0.614067 1.070582 0.744401 \n", "1 -0.301247 -0.224690 -0.531892 -0.425770 -0.453789 \n", "2 -0.482156 -0.720465 0.180994 -0.411120 -0.057315 \n", "\n", " Trans / Brand Runs Vol/Tran Avg. Price Others 999 maxBrandIndicator \n", "0 -0.255378 -0.202562 0.126356 0.253722 -0.476069 \n", "1 -0.246577 -0.266204 0.232878 0.611302 -0.536321 \n", "2 0.602477 0.580199 -0.458739 -1.129323 1.234190 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clusters = KMeans(n_clusters=3, random_state=1).fit(bathSoap_df_norm[behaviorIndicator])\n", "print(clusterSizes(clusters))\n", "clusterCenters(clusters, behaviorIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment: \n", "- Cluster 0 (n=166) is not at all loyal, favoring many brands, and of high value.\n", "- Cluster 1 (n=259) is also not very loyal, but may be of the least interest since its customers have the lowest value.\n", "- Cluster 2 (n=175) is highly loyal, favoring main brands and bigger individual purchases, with middling overall value. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clusters based on \"basis for purchase\"\n", "The variables used are: `Pur Vol No Promo - %`, `Pur Vol Promo 6 %`, `Pur Vol Other Promo %`, all price categories, selling propositions 5 and 14 (most people seemed to be responding to one or the other of these promotions/propositions)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Pur Vol No Promo - %', 'Pur Vol Promo 6 %', 'Pur Vol Other Promo %', 'Pr Cat 1', 'Pr Cat 2', 'Pr Cat 3', 'Pr Cat 4', 'PropCat 5', 'PropCat 14']\n" ] } ], "source": [ "purchaseBasisIndicator = list(withinPromotionIndicator) + list(priceCategoryIndicator) \n", "purchaseBasisIndicator.extend(['PropCat 5', 'PropCat 14'])\n", "print(purchaseBasisIndicator)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 523\n", "1 77\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pur Vol No Promo - %Pur Vol Promo 6 %Pur Vol Other Promo %Pr Cat 1Pr Cat 2Pr Cat 3Pr Cat 4PropCat 5PropCat 14
0-0.0302420.059272-0.0263650.1165710.166971-0.3514980.0492710.162794-0.352144
10.205410-0.4025860.179079-0.791774-1.1341012.387450-0.334659-1.1057302.391835
\n", "
" ], "text/plain": [ " Pur Vol No Promo - % Pur Vol Promo 6 % Pur Vol Other Promo % Pr Cat 1 \\\n", "0 -0.030242 0.059272 -0.026365 0.116571 \n", "1 0.205410 -0.402586 0.179079 -0.791774 \n", "\n", " Pr Cat 2 Pr Cat 3 Pr Cat 4 PropCat 5 PropCat 14 \n", "0 0.166971 -0.351498 0.049271 0.162794 -0.352144 \n", "1 -1.134101 2.387450 -0.334659 -1.105730 2.391835 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clusters = KMeans(n_clusters=2, random_state=1).fit(bathSoap_df_norm[purchaseBasisIndicator])\n", "print(clusterSizes(clusters))\n", "clusterCenters(clusters, purchaseBasisIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment: The two clusters are well-separated across most variables. \n", "- Cluster 0 (n=77) is notable for its responsiveness to price category 3 and selling proposition 14 coupled with aversion to price categories 1 and 2, and selling proposition 5.\n", "- Cluster 1 (n=523) shows a less clear profile" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 97\n", "1 429\n", "2 74\n", "dtype: int64\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pur Vol No Promo - %Pur Vol Promo 6 %Pur Vol Other Promo %Pr Cat 1Pr Cat 2Pr Cat 3Pr Cat 4PropCat 5PropCat 14
0-1.7422341.6050760.8185940.334189-0.265602-0.3692250.4583200.002103-0.373063
10.349656-0.287933-0.2084600.0629320.258829-0.336154-0.0429010.195635-0.335935
20.256679-0.4347170.135482-0.802892-1.1523562.432767-0.352060-1.1369082.436529
\n", "
" ], "text/plain": [ " Pur Vol No Promo - % Pur Vol Promo 6 % Pur Vol Other Promo % Pr Cat 1 \\\n", "0 -1.742234 1.605076 0.818594 0.334189 \n", "1 0.349656 -0.287933 -0.208460 0.062932 \n", "2 0.256679 -0.434717 0.135482 -0.802892 \n", "\n", " Pr Cat 2 Pr Cat 3 Pr Cat 4 PropCat 5 PropCat 14 \n", "0 -0.265602 -0.369225 0.458320 0.002103 -0.373063 \n", "1 0.258829 -0.336154 -0.042901 0.195635 -0.335935 \n", "2 -1.152356 2.432767 -0.352060 -1.136908 2.436529 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clusters = KMeans(n_clusters=3, random_state=1).fit(bathSoap_df_norm[purchaseBasisIndicator])\n", "print(clusterSizes(clusters))\n", "clusterCenters(clusters, purchaseBasisIndicator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment: \n", "- Cluster 0 (n=74) has the same profile as cluster 0 in the two cluster case.\n", "- Cluster 1 (n=429) corresponds mainly to cluster 1 in the two cluster case.\n", "- Cluster 2 (n=97) needs promostions, likes price categories 1 and 4, and is not responsive to the two selling propositions. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clusters based on all of the above variables" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 527\n", "1 73\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
No. of Brands0.071443-0.515759
Brand Runs0.106566-0.769322
Total Volume-0.0212060.153087
No. of Trans0.054136-0.390817
Value0.068413-0.493883
Trans / Brand Runs-0.1441001.040286
Vol/Tran-0.0749720.541233
Avg. Price0.180076-1.299999
Others 9990.173881-1.255280
maxBrandIndicator-0.1949491.407373
Pur Vol No Promo - %-0.0275580.198948
Pur Vol Promo 6 %0.057591-0.415757
Pur Vol Other Promo %-0.0286480.206818
Pr Cat 10.110774-0.799701
Pr Cat 20.161535-1.166152
Pr Cat 3-0.3365242.429429
Pr Cat 40.045662-0.329644
PropCat 50.156704-1.131277
PropCat 14-0.3369952.432829
\n", "
" ], "text/plain": [ " 0 1\n", "No. of Brands 0.071443 -0.515759\n", "Brand Runs 0.106566 -0.769322\n", "Total Volume -0.021206 0.153087\n", "No. of Trans 0.054136 -0.390817\n", "Value 0.068413 -0.493883\n", "Trans / Brand Runs -0.144100 1.040286\n", "Vol/Tran -0.074972 0.541233\n", "Avg. Price 0.180076 -1.299999\n", "Others 999 0.173881 -1.255280\n", "maxBrandIndicator -0.194949 1.407373\n", "Pur Vol No Promo - % -0.027558 0.198948\n", "Pur Vol Promo 6 % 0.057591 -0.415757\n", "Pur Vol Other Promo % -0.028648 0.206818\n", "Pr Cat 1 0.110774 -0.799701\n", "Pr Cat 2 0.161535 -1.166152\n", "Pr Cat 3 -0.336524 2.429429\n", "Pr Cat 4 0.045662 -0.329644\n", "PropCat 5 0.156704 -1.131277\n", "PropCat 14 -0.336995 2.432829" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combinedIndicator = behaviorIndicator + purchaseBasisIndicator \n", "clusters = KMeans(n_clusters=2, random_state=1).fit(bathSoap_df_norm[combinedIndicator])\n", "print(clusterSizes(clusters))\n", "clusterCenters(clusters, combinedIndicator).transpose()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment: The two clusters are separated on almost all variables, Value being an important exception. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
SEC2.3719173.424658
FEH2.0474382.054795
MT8.2466797.684932
SEX1.7628081.561644
AGE3.2447822.986301
EDU4.2751422.369863
HS4.1916514.191781
CHILD3.2011393.465753
CS0.9373810.890411
Affluence Index18.1688808.726027
\n", "
" ], "text/plain": [ " 0 1\n", "SEC 2.371917 3.424658\n", "FEH 2.047438 2.054795\n", "MT 8.246679 7.684932\n", "SEX 1.762808 1.561644\n", "AGE 3.244782 2.986301\n", "EDU 4.275142 2.369863\n", "HS 4.191651 4.191781\n", "CHILD 3.201139 3.465753\n", "CS 0.937381 0.890411\n", "Affluence Index 18.168880 8.726027" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def clusterDemographics(kmeans):\n", " return bathSoap_df[demographicIndicators].groupby(kmeans.labels_).mean()\n", "\n", "clusterDemographics(clusters).transpose()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cluster 1 (n=72) is the more loyal, with lower socioeconomic status, educational level, and affluence." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 70\n", "1 252\n", "2 278\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
No. of Brands-0.5838930.177248-0.013647
Brand Runs-0.8005690.416647-0.176098
Total Volume0.083386-0.3076940.257921
No. of Trans-0.4334210.230518-0.099824
Value-0.555616-0.0026530.142308
Trans / Brand Runs1.037226-0.251914-0.032818
Vol/Tran0.513840-0.4961850.320395
Avg. Price-1.3182530.712855-0.314251
Others 999-1.2641360.507151-0.141412
maxBrandIndicator1.421065-0.5371560.129097
Pur Vol No Promo - %0.210216-0.4322230.338867
Pur Vol Promo 6 %-0.4360050.437706-0.286984
Pur Vol Other Promo %0.2142710.152045-0.191778
Pr Cat 1-0.7972260.853929-0.573325
Pr Cat 2-1.220714-0.3517430.626220
Pr Cat 32.495499-0.425507-0.242652
Pr Cat 4-0.336964-0.0845610.161500
PropCat 5-1.142977-0.2170190.484522
PropCat 142.498321-0.425938-0.242972
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
SEC3.4000002.0476192.683453
FEH2.0428571.9166672.169065
MT7.6714297.8174608.633094
SEX1.5428571.7222221.802158
AGE3.0142863.2500003.230216
EDU2.3571434.5158734.039568
HS3.9142863.7460324.665468
CHILD3.5142863.3134923.089928
CS0.8714290.9047620.971223
Affluence Index8.54285720.59920615.910072
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def display_side_by_side(*args):\n", " html_str = ''.join(df.to_html() for df in args)\n", " display_html(html_str.replace('table','table style=\"display:inline\"'),raw=True)\n", "\n", "\n", "combinedIndicator = behaviorIndicator + purchaseBasisIndicator \n", "clusters = KMeans(n_clusters=3, random_state=1).fit(bathSoap_df_norm[combinedIndicator])\n", "print(clusterSizes(clusters))\n", "display_side_by_side(clusterCenters(clusters, combinedIndicator).transpose(),\n", " clusterDemographics(clusters).transpose())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment:\n", "- Cluster 0: (n=72) Highly loyal, low value, highly responsive to price category 3 and selling proposition 14.\n", "- Cluster 1: (n=252) Responsive to price category 2 and selling proposition 5, otherwise somewhat middling.\n", "- Cluster 2: (n=278) Low brand loyalty, responsive to price category 1" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 108\n", "1 70\n", "2 202\n", "3 220\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
No. of Brands-0.414750-0.5838930.831690-0.374254
Brand Runs-0.323453-0.8005690.968608-0.475846
Total Volume-0.6520970.0833860.2960960.021719
No. of Trans-0.428001-0.4334210.822379-0.407077
Value-0.217635-0.5556160.388601-0.073181
Trans / Brand Runs-0.1372901.037226-0.2979630.010955
Vol/Tran-0.4577230.513840-0.3557630.387861
Avg. Price1.362917-1.3182530.057415-0.302341
Others 9990.523047-1.2641360.371432-0.195586
maxBrandIndicator-0.4286611.421065-0.5547020.267594
Pur Vol No Promo - %0.1932740.210216-0.4777230.276870
Pur Vol Promo 6 %-0.186015-0.4360050.585153-0.307232
Pur Vol Other Promo %-0.0805320.2142710.037105-0.062712
Pr Cat 11.650767-0.7972260.042110-0.595378
Pr Cat 2-0.826802-1.2207140.1330180.672159
Pr Cat 3-0.4786542.495499-0.267225-0.313686
Pr Cat 4-0.405680-0.3369640.0957340.218467
PropCat 5-0.372115-1.142977-0.0717080.612190
PropCat 14-0.4721322.498321-0.270314-0.314949
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
SEC1.7870373.4000002.3762382.677273
FEH1.6574072.0428572.2376242.068182
MT6.7037047.6714299.0297038.281818
SEX1.4722221.5428571.9207921.763636
AGE3.1574073.0142863.3267333.200000
EDU4.1574072.3571434.6237623.990909
HS3.0370373.9142864.7029704.377273
CHILD3.5462963.5142863.0396043.168182
CS0.7407410.8714291.0445540.940909
Affluence Index17.9444448.54285720.87128715.727273
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "combinedIndicator = behaviorIndicator + purchaseBasisIndicator \n", "clusters = KMeans(n_clusters=4, random_state=1).fit(bathSoap_df_norm[combinedIndicator])\n", "print(clusterSizes(clusters))\n", "display_side_by_side(clusterCenters(clusters, combinedIndicator).transpose(),\n", " clusterDemographics(clusters).transpose())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment:\n", "- Cluster 0 (n=109) is characterized by low volume, low loyalty, and sensitivity to promotions and price (responsive to cat. 1, unresponsive to 2 and 3), and unmoved by selling proposition. Demographically, it is affluent, of high socio-economic status, and has relatively small family size.\n", "- Cluster 1 (n=201) is distinguished mostly by the purchase behavior variables - it has low brand loyalty together with high value, volume and frequency. The brand switching seems to be intrinsic - this group is not particularly responsive to promotions, pricing or selling propositions. Demographically it is relatively affluent and educated.\n", "- Cluster 2 (n=70) stands out in both groups of variables - it has high loyalty, low value and price per purchase, and very differential response to price (unresponsive to categories 1, 2 and 4, highly responsive to category 3), and selling proposition (unresponsive to #5, highly responsive to #14). Demographically it has low affluence and education.\n", "- Cluster 3 (n=220) is a \"gray\" cluster, it is not characterized by very extreme/distinctive values across all variables, but is responsive to price category 2 and selling proposition 5 (similar to cluster 1 in the 3-cluster analysis). Demographically it is relatively affluent and educated. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 2:\n", "Select what you think is the best segmentation and comment on the characteristics (demographic, brand loyalty, and basis for purchase) of these clusters. (This information would be used to guide the development of advertising and promotional campaigns.)\n", "\n", "There is no single \"right\" approach to clustering; different approaches are feasible depending on\n", "different marketing purposes. CRISA is a marketing agency and owns the data, which it collected at\n", "considerable expense, so it will want to be able to use both the data and the segmentation analysis in\n", "different ways for different clients. Here are just a few possible marketing approaches:\n", "\n", "1. Establishing named customer \"personas,\" corresponding to the cluster segments, for use by a client's sales and marketing teams.\n", "2. Establishing named customer \"personas,\" corresponding to the cluster segments, for use by CRISA in providing marketing services to clients.\n", "3. \"Capture affluent market share\" campaign for a client who wants to target more affluent consumers who are not wedded to their current brand, and secure more brand share. \n", "4. \"Down market\" campaign for a data-poor client to build a \"value\" brand for less affluent consumers, much as Dollar General has done in the U.S. \n", "\n", "note: The difference between #1 and #2 is that #1, being confined to a single client, can use that client's\n", "customer data to refine and do more analysis. #2 would have to rely on the data collected by CRISA." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 3:\n", "Develop a model that classifies the data into these segments. Since this information would most likely be used in targeting direct-mail promotions, it would be useful to select a market segment that would be defined as a _success_ in the classification model.\n", "\n", "This \"down market\" scenario is the one we will explore further to develop a predictive model, and classify people into either \"value conscious\" or not. \"Data poor\" means that the client has, or can get, demographic data on their customers, but not detailed purchase data (particularly involving other brands). So a predictive model is to be built using just demographic data. We will look at the results of clustering into two segments based on CRISA's own detailed purchase data, then classify people into those two segments.\n", "\n", "Recall our characterization of the two segments:\n", "\n", "Comment: The two clusters are separated on almost all variables, Value being an important exception. Cluster 1 (n=72) is the more loyal, with lower socioeconomic status and affluence.\n", "\n", "So our \"success\" category is cluster 1, the less affluent group, lower socioeconomic group, which also turns out to be highly loyal and, as it happens, spends roughly as much as the more affluent group. This is a promising group around which to build a down-market brand strategy.\n", "\n", "To build the model, we will be able to only use demographic information. CRISA will not have the detailed purchase information for its client's customers." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 527\n", "1 73\n", "dtype: int64\n" ] } ], "source": [ "clusters = KMeans(n_clusters=2, random_state=1).fit(bathSoap_df_norm[combinedIndicator])\n", "print(clusterSizes(clusters))\n", "\n", "modelData_df = bathSoap_df[demographicIndicators].copy()\n", "modelData_df = pd.get_dummies(modelData_df, columns=['MT', 'FEH'])\n", "modelData_df['y'] = [1 if label == 1 else 0 for label in clusters.labels_]\n", "\n", "train_df, valid_df = train_test_split(modelData_df, test_size=0.4, random_state=1)\n", "\n", "train_X, train_y = train_df.drop(columns=['y']), train_df['y']\n", "valid_X, valid_y = valid_df.drop(columns=['y']), valid_df['y']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Logistic regression" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix (Accuracy 0.8792)\n", "\n", " Prediction\n", "Actual 0 1\n", " 0 206 2\n", " 1 27 5\n", "Number of customers of interest in validaton set 32\n", "Number of customers of interest in 20% top-ranked 19\n", "Ratio 0.59\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = LogisticRegression(penalty=\"l2\", C=1e42, solver='liblinear')\n", "model.fit(train_X, train_y)\n", "\n", "model_pred = model.predict_proba(valid_X)\n", "result = pd.DataFrame({\n", " 'actual': valid_y,\n", " 'p(0)': [p[0] for p in model_pred],\n", " 'p(1)': [p[1] for p in model_pred],\n", " 'predicted': model.predict(valid_X),\n", "})\n", "result = result.sort_values(by=['p(1)'], ascending=False)\n", "\n", "# confusion matrix\n", "classificationSummary(result.actual, result.predicted)\n", "\n", "ax = gainsChart(result.actual, figsize=[5, 5])\n", "nx = round(valid_df.shape[0] * 0.2)\n", "ny = sum(result.actual[0:nx])\n", "ax.plot([nx, nx,0], [0, ny, ny])\n", "\n", "print('Number of customers of interest in validaton set', valid_y.sum())\n", "print('Number of customers of interest in 20% top-ranked', ny)\n", "print(f'Ratio {ny / valid_y.sum():.2f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Decision tree" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix (Accuracy 0.8792)\n", "\n", " Prediction\n", "Actual 0 1\n", " 0 201 7\n", " 1 22 10\n", "Number of customers of interest in validaton set 32\n", "Number of customers of interest in 20% top-ranked 18\n", "Ratio 0.56\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = DecisionTreeClassifier(max_depth=3, random_state=1)\n", "model.fit(train_X, train_y)\n", "\n", "model_pred = model.predict_proba(valid_X)\n", "result = pd.DataFrame({\n", " 'actual': valid_y,\n", " 'p(0)': [p[0] for p in model_pred],\n", " 'p(1)': [p[1] for p in model_pred],\n", " 'predicted': model.predict(valid_X),\n", "})\n", "result = result.sort_values(by=['p(1)'], ascending=False)\n", "\n", "# confusion matrix\n", "classificationSummary(result.actual, result.predicted)\n", "\n", "ax = gainsChart(result.actual, figsize=[5, 5])\n", "nx = round(valid_df.shape[0] * 0.2)\n", "ny = sum(result.actual[0:nx])\n", "ax.plot([nx, nx,0], [0, ny, ny])\n", "\n", "print('Number of customers of interest in validaton set', valid_y.sum())\n", "print('Number of customers of interest in 20% top-ranked', ny)\n", "print(f'Ratio {ny / valid_y.sum():.2f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random forest classifier" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix (Accuracy 0.8542)\n", "\n", " Prediction\n", "Actual 0 1\n", " 0 200 8\n", " 1 27 5\n", "Number of customers of interest in validaton set 32\n", "Number of customers of interest in 20% top-ranked 19\n", "Ratio 0.59\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAHACAYAAAASizmbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABXB0lEQVR4nO3dd1xV9f8H8Ne97HVBBBkyRHHkLgeRpiwVNHOVpubKskwrRa2vlTNLf1ZalmVZjoYzd04EwVTcmnuAKKgMZV1A5r3n9wdxk1zcy7333PF6Ph738eCec++5b47Ii885nyERBEEAERERqUUqdgFERETGiAFKRESkAQYoERGRBhigREREGmCAEhERaYABSkREpAEGKBERkQYYoERERBqwFLsAXVMqlbh9+zacnJwgkUjELoeIiEQgCAIKCgrg7e0NqVQ7bUeTD9Dbt2/D19dX7DKIiMgApKWlwcfHRyvHMvkAdXJyAlB50mQymcjVEBGRGORyOXx9fVWZoA0mH6BVl21lMhkDlIjIzGnzVh47EREREWmAAUpERKQBBigREZEGGKBEREQaYIASERFpgAFKRESkAQYoERGRBhigREREGmCAEhERaYABSkREpAEGKBERkQYYoERERBpggBIREWnA5FdjISIyRQtjrmD3+Qyxy9AbP1d7/Di8vdhlVMMAJSIyMqUVCnwTdxVKQexK9EdhgN8sA5SIyMjcyi2GUgDsrCyw1MBaZdpyJyMdMhcX2NjaAQDsrC1EruhBDFAiIiNzI+ceAMC/rj06N3YTuRrtu3HjBoaP6INGjRph69atsLOzE7ukh2KAEhEZmbR/AtTX1V7kSrTv+vXrCA0NxfXr1yGVSpGbm2uwAcpeuERERiY1+58WqIkF6PXr1xESEoLr168jMDAQCQkJ8Pb2FrusR2KAEhEZmdR/WqB+dU0nQFNSUhASEoIbN26gcePGiI+PR/369cUu67EYoERERibVxC7hXrt2TRWeTZo0MYrwBBigRERGRRAEVYCayiXc3Nxc5Ofno2nTpti3b59BX7a9HzsREREZkeyiMtwrU0AiAerXMczONepq164d4uLi4OXlBS8vL7HLqTEGKBGREalqfXo728HG0vDGRtbU1atXkZubi44dOwIAnnnmGZErUh8DlIhM3oqDKVj6VwoEwfBms1FXSYUSAODrarytz6tXryIk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IwMeHh7o0qULGjRoADc3t8ceo1WrVrC2tlY9//vvv5GUlAQnJyc4OjrC0dERrq6uKCkpQXJyMrKysnD79m2Eh4c/9HgXL16Er68vfH19VduaN28OFxcXXLx4UbXN398f7u7uD7zP29tbte2/C6aPHDkSp0+fRtOmTfHuu+9iz549NTtRREaEl3CJ9KBFixa4ceMGysvLoVQq4ejoiIqKClRUVMDR0RH+/v44f/78Y4/h4OBQ7XlhYSHatWuH33///YHXuru7QyrVzt/H//3cmnjmmWeQkpKCnTt3Yu/evRg4cCAiIiLwxx9/aKUmIkPAFiiRHuzYsQOnT5+Gp6cnfvvtN5w+fRotW7bEV199hdOnT2PHjh1qH/OZZ57B1atXUa9ePQQGBlZ7ODs7w8nJCQ0aNEBsbOxD3//UU089cG/ywoULyMvLQ/PmzR/5uVXvS09PV207fPjwA6+TyWQYNGgQli5dirVr12LDhg3IyclR+/skMlQMUCI98Pf3h6OjIzIzM9GnTx/4+vri/PnzGDBgAAIDA+Hv76/2MYcOHQo3Nzf06dMHf/31F1JSUhAfH493330XN2/eBFDZi/bLL7/EokWLcPXqVZw8eRLffPMNACAiIgKtWrXC0KFDcfLkSRw9ehTDhw9H165d0b59+0d+bkREBJo0aYIRI0bg77//xl9//YWPPvqo2msWLFiA1atX49KlS7hy5QrWr18PT09PuLi4qP19EhkqBiiRnsTHx6NDhw6wtbXF0aNH4ePjAy8vL42PZ29vj/3798PPzw/9+/fHU089hdGjR6OkpAQymQwAMGLECHz11Vf47rvv0KJFC7zwwgu4evUqgMqZg7Zs2YI6deqgS5cuiIiIQMOGDbF27drHfq5UKsWmTZtQXFyMjh074vXXX8enn35a7TVOTk6YP38+2rdvjw4dOuD69evYsWOH1i4rExkCiSAIgthFEBERGRv+OUhERKQBBigREZEGGKBEREQaYIASERFpgAFKRESkAQYoERGRBhigREREGmCAEhERaYABSkREpAEGKBERkQYYoERERBpggBIREWng/wG9gYR8RyQ1ZgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = RandomForestClassifier(random_state=1, n_estimators=100)\n", "model.fit(train_X, train_y)\n", "\n", "model_pred = model.predict_proba(valid_X)\n", "result = pd.DataFrame({\n", " 'actual': valid_y,\n", " 'p(0)': [p[0] for p in model_pred],\n", " 'p(1)': [p[1] for p in model_pred],\n", " 'predicted': model.predict(valid_X),\n", "})\n", "result = result.sort_values(by=['p(1)'], ascending=False)\n", "\n", "# confusion matrix\n", "classificationSummary(result.actual, result.predicted)\n", "\n", "ax = gainsChart(result.actual, figsize=[5, 5])\n", "nx = round(valid_df.shape[0] * 0.2)\n", "ny = sum(result.actual[0:nx])\n", "ax.plot([nx, nx,0], [0, ny, ny])\n", "\n", "print('Number of customers of interest in validaton set', valid_y.sum())\n", "print('Number of customers of interest in 20% top-ranked', ny)\n", "print(f'Ratio {ny / valid_y.sum():.2f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bagging classifier" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix (Accuracy 0.8542)\n", "\n", " Prediction\n", "Actual 0 1\n", " 0 197 11\n", " 1 24 8\n", "Number of customers of interest in validaton set 32\n", "Number of customers of interest in 20% top-ranked 20\n", "Ratio 0.62\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAHACAYAAAASizmbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABWv0lEQVR4nO3dd3hTZf8G8Dvpnimlm062bFmlgtAFtPAiS0FQGSooggpl/VCZovCiguIL6Isy9AUZAjJklS4EygbZo7XQAh3Qlc60Tc7vj9poZTVp0pOk9+e6el3NSXry7aHl7vOcZ0gEQRBAREREGpGKXQAREZExYoASERFpgQFKRESkBQYoERGRFhigREREWmCAEhERaYEBSkREpAUGKBERkRbMxS5A31QqFe7duwcHBwdIJBKxyyEiIhEIgoCCggJ4eXlBKtVN29HkA/TevXvw8fERuwwiIjIAaWlp8Pb21sm5TD5AHRwcAFReNEdHR5GrISIiMcjlcvj4+KgzQRdMPkCrum0dHR0ZoERE9Zwub+VxEBEREZEWGKBERERaYIASERFpgQFKRESkBQYoERGRFhigREREWmCAEhERaYEBSkREpAUGKBERkRYYoERERFpggBIREWmBAUpERKQFBigREZEWTH43FiIi0o+yChXe33QOKQ+K9P5evs62+O+oznp/H00wQImISCunb+dg36WMOnkvpUqok/fRBAOUiIi0kpZTDAB41tcJU3u30Om572ekw9HJCVbWNgAAG0sznZ5fFxigRESkldvZlQHatpEMPZq56O68t29j1OiBaNKkCXbt2gUbGxudnVuXGKBERKSV1D9boL7Otjo7561btxASEoJbt25BKpUiNzfXYAOUo3CJiEgrVQHqo6MAvXXrFoKDg3Hr1i00bdoUCQkJ8PLy0sm59YEBSkREWqkKUL+GtQ/QlJQUBAcH4/bt22jWrBni4+PRqFGjWp9XnxigRESksfyScuQVlwMAfBrULkD/+OMPdXg2b97cKMITYIASEZEWqkbguthbws6qdsNpcnNzkZ+fjxYtWiAuLs6gu23/joOIiIhIY7q8/9mpUyfExsbC09MTnp6etT5fXWGAEhGRxtT3P7UM0Js3byI3Nxddu3YFAHTs2FFntdUVBigRmbx1R1Ow+rcUCILhrWZjrPJLKu9/ajOF5ebNmwgODkZhYSFiY2PR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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = BaggingClassifier(random_state=1, n_estimators=100)\n", "model.fit(train_X, train_y)\n", "\n", "model_pred = model.predict_proba(valid_X)\n", "result = pd.DataFrame({\n", " 'actual': valid_y,\n", " 'p(0)': [p[0] for p in model_pred],\n", " 'p(1)': [p[1] for p in model_pred],\n", " 'predicted': model.predict(valid_X),\n", "})\n", "result = result.sort_values(by=['p(1)'], ascending=False)\n", "\n", "# confusion matrix\n", "classificationSummary(result.actual, result.predicted)\n", "\n", "ax = gainsChart(result.actual, figsize=[5, 5])\n", "nx = round(valid_df.shape[0] * 0.2)\n", "ny = sum(result.actual[0:nx])\n", "ax.plot([nx, nx,0], [0, ny, ny])\n", "\n", "print('Number of customers of interest in validaton set', valid_y.sum())\n", "print('Number of customers of interest in 20% top-ranked', ny)\n", "print(f'Ratio {ny / valid_y.sum():.2f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summary\n", "The analysis of the varies models favors the boosting model. It has both the highest accuracy and the gains chart shows that more records are correctly assigned for 20% of the ranked validation set." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "Many data mining algorithms are iterative in an mathematical sense - iteration is used to find a good, if\n", "not best, solution. The modeling process itself is also iterative. In initial exploration, we do not seek the\n", "perfect model, merely something to get started. Results are assessed, and we typically continue with a\n", "modified approach.\n", "\n", "Several steps can be explored next to improve predictive performance:\n", "\n", "1. Some of the demographic categorical variables may not have much value being treated as is, as ordered categorical variables. They could be reviewed and turned into binary dummies.\n", "2. Instead of using a two-cluster model, a multi-cluster model could be used in hopes of deriving more distinguishable clusters. The non-success clusters could then be consolidated. For example, cluster #2 in the 4-cluster model is similar to our cluster 1 (\"success\") in the 2-cluster model, only more sharply defined.\n", "3. Demographic predictors could be added to the original clustering process.\n", "4. The clustering process, which includes a randomization component that yields variability in resulting clusters, can be repeated, to ensure that the cluster labels reflect some degree of stability. Repetition should show some clustering results that are consistent across various runs. Choosing for your labels a clustering result that is very inconsistent with the others could mean that you are labeling your market segments according to a chance fluke.\n", "5. In the real world, going beyond the parameters of this case study, CRISA would probably work with the client to add the client's own purchase data to the model to improve it over time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.10.9" } }, "nbformat": 4, "nbformat_minor": 2 }