INTRODUCTION

Le succès d’une entreprise dépend largement de sa connaissance du comportement de sa clientèle. Dans la plupart des cas, il est impossible de connaître chaque client de façon individuelle. Heureusement, il existe des techniques (Clustering) permettant de classer tous les clients en groupes en fonction de similitudes indentiées (charactéristiques communes).

L’objectif de ce projet est d’appliquer des techniques de clustering pour identifier les segments pertinents pour certaines activités commerciales, comme le déploiement d’une campagne marketing.

L’ensemble de données fait référence aux clients d’un distributeur en gros. Il comprend les dépenses annuelles en unités monétaires (m.u.) pour diverses catégories de produits.

ANALYSE EXPLORATOIRE DES DONNEES

#Importation des données
cust_data <- read.csv("Wholesale_customers_ data.csv")

#Structure des données
glimpse(cust_data)
## Observations: 440
## Variables: 8
## $ Channel          <int> 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, ...
## $ Region           <int> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ...
## $ Fresh            <int> 12669, 7057, 6353, 13265, 22615, 9413, 12126,...
## $ Milk             <int> 9656, 9810, 8808, 1196, 5410, 8259, 3199, 495...
## $ Grocery          <int> 7561, 9568, 7684, 4221, 7198, 5126, 6975, 942...
## $ Frozen           <int> 214, 1762, 2405, 6404, 3915, 666, 480, 1669, ...
## $ Detergents_Paper <int> 2674, 3293, 3516, 507, 1777, 1795, 3140, 3321...
## $ Delicassen       <int> 1338, 1776, 7844, 1788, 5185, 1451, 545, 2566...
#Y a t-il de valeurs manqquantes ?
sum(is.na(cust_data))
## [1] 0

Dans ce jeu de données, il y a 440 observations et 8 variables. il n’y a aucune donnée manquante. Les six dernières variables représentent la vente annuelle, en unité monétaire (u.m), de différents produits (Frais, Lait, etc.). Donc il s’agit bel et bien de variables numériques. Les deux premières variables représentent respectivement le canal et la localisation de l’achat. Donc ces variables sont catégorielles. Vous trouverez ici une description des variables des données de ce projets. L’objectif de ce projet étant d’identifier les segments en fonction des ventes dans différents produits, les variables de localisation et de canal dans les données ne sont pas très utiles.

#Suppression des deux premières colonnes
cust_data <- cust_data[, c(-1, -2)]

#Résumé statistique des données
summary(cust_data)
##      Fresh             Milk          Grocery          Frozen       
##  Min.   :     3   Min.   :   55   Min.   :    3   Min.   :   25.0  
##  1st Qu.:  3128   1st Qu.: 1533   1st Qu.: 2153   1st Qu.:  742.2  
##  Median :  8504   Median : 3627   Median : 4756   Median : 1526.0  
##  Mean   : 12000   Mean   : 5796   Mean   : 7951   Mean   : 3071.9  
##  3rd Qu.: 16934   3rd Qu.: 7190   3rd Qu.:10656   3rd Qu.: 3554.2  
##  Max.   :112151   Max.   :73498   Max.   :92780   Max.   :60869.0  
##  Detergents_Paper    Delicassen     
##  Min.   :    3.0   Min.   :    3.0  
##  1st Qu.:  256.8   1st Qu.:  408.2  
##  Median :  816.5   Median :  965.5  
##  Mean   : 2881.5   Mean   : 1524.9  
##  3rd Qu.: 3922.0   3rd Qu.: 1820.2  
##  Max.   :40827.0   Max.   :47943.0

Le résumé statistique nous montre que l’échelle sur toutes les colonnes est la même donc nous n’avons pas besoin de normaliser les données. Il est important de toujours vérifier l’échelle des différentes variables avant de procéder à la segmentation car la plupart des algorithmes de Clustering se base sur le calcul de la distance entre des points. De ce fait, si les valeurs ne sont pas à la même échelle le calcul sera biaisé et on aura pas un résultat exploitable. De plus il faut vérifier la faisabilité de l’analyse de clustering en calculant la statistique Hopkins.

#Calcul de la statistique Hopkins
get_clust_tendency(cust_data, graph = FALSE, n = 50, seed = 123)
## $hopkins_stat
## [1] 0.06354846
## 
## $plot
## NULL

La statistique Hopkins est entre 0 et 1. Une valeur de Hopkins plus proche de 1 indique des structures aléatoires dans l’ensemble de données. Ici, la statistique Hopkins est égale à 0,064 donc très proche de 0. Donc il existe des clusters valides dans l’ensemble de nos données.

SEGMENTATION DE CLIENTELE GRACE A L’ALGORITHME DE CLUSTERING K-MEANS

L’algorithme de clustering K-means est un algorithme de partitionnement qui permet de trouver un nombre pré-défini k de sous-groupes (clusters) homogènes dans un grand ensemble de données. Il fait partie de l’apprentissage non supervisé. L’idée basique des méthodes de regroupement (ou de partitionnement) est de définir des clusters de telle sorte sorte que la variation inter-groupe (en anglais, c’est le “total within sum of square”) soit minimisée.

Sauf dans certains cas précis, on ne connait pas d’avance le nombre de clusters. Plusieurs méthodes comme la méthode du coude, la méthode de la silhouette, Méthode statistique des écarts permettent de déterminer le nombre optimal de clusters. Trouver ici des explications claires sur ces méthodes.

Détermination du nombre optimal de clusters

Nous utiliserons trois différentes méthodes pour choisir la valeur de k.

La méthode de statistique d’écart compare le total de la variation intra-groupe pour différentes valeurs de k avec les valeurs attendues dans la distribution de référence nulle des données. L’estimation du nombre optimal de groupes sera une valeur qui maximisera la statistique d’écart (c’est-à-dire qui produit la statistique d’écart la plus grande). Pour cette méthode, on utilise simplement la fonction NbClust().

Avec la méthode du coude (Elbow method), le meilleur k est celui à partir duquel on observe plus d’amélioration sensible de la qualié du modèle (c’est-à-dire le total within sum of square) au fur et à mesure que le k augmente (k = 1 à 10 par exemple). Pour cette valeur k, on observera une coude au niveau de la courbe total within sum of square en fonction de Number of clusters k.

La méthode de la silhouette moyenne mesure à quel point chaque individu (observation) est intégré dans son groupe. Une largeur de silhouette moyenne élevée indique un bon cluster. La méthode de la silhouette moyenne calcule la silhouette moyenne des observations pour différentes valeurs de k. Le nombre optimal de groupes k est celui qui maximise la silhouette moyenne sur une plage de valeurs possibles pour k.

#Calcul du nombe optimal de clusters par la fonction : NbClust()
NbClust(data = cust_data, distance = "euclidean", method = "kmeans")

## *** : The Hubert index is a graphical method of determining the number of clusters.
##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
##                 significant increase of the value of the measure i.e the significant peak in Hubert
##                 index second differences plot. 
## 

## *** : The D index is a graphical method of determining the number of clusters. 
##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
##                 second differences plot) that corresponds to a significant increase of the value of
##                 the measure. 
##  
## ******************************************************************* 
## * Among all indices:                                                
## * 1 proposed 2 as the best number of clusters 
## * 11 proposed 3 as the best number of clusters 
## * 2 proposed 4 as the best number of clusters 
## * 1 proposed 5 as the best number of clusters 
## * 4 proposed 8 as the best number of clusters 
## * 1 proposed 10 as the best number of clusters 
## * 1 proposed 12 as the best number of clusters 
## * 1 proposed 14 as the best number of clusters 
## * 1 proposed 15 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  3 
##  
##  
## *******************************************************************
## $All.index
##         KL       CH Hartigan     CCC     Scott      Marriot       TrCovW
## 2   0.2002 139.3467 213.8768  3.6894  850.0183 1.306955e+60 7.820519e+20
## 3   2.6942 210.1526 104.2839  5.6955 1207.5655 1.304765e+60 2.240733e+20
## 4   1.0783 207.8197  95.4616  3.2062 1595.2669 9.610274e+59 1.752255e+20
## 5   2.3433 213.3661  54.7550  3.7014 1832.3089 8.761683e+59 9.448263e+19
## 6   0.8998 202.6626  55.2290  4.6762 2030.7408 8.036949e+59 7.329863e+19
## 7   0.7423 199.1221  67.4358  6.1912 2228.1542 6.984435e+59 6.343697e+19
## 8  12.5452 206.4132  21.1059  8.9657 2577.5180 4.123648e+59 4.472581e+19
## 9   0.1497 191.6292  42.2033  8.4139 2656.3555 4.362861e+59 4.025367e+19
## 10  3.2703 191.2608  22.1807  9.7579 2832.5330 3.609054e+59 3.307582e+19
## 11  0.6117 182.8059  26.5497  9.7197 3017.8060 2.866211e+59 3.095422e+19
## 12  0.8903 178.4687  27.7134 10.1796 3109.5297 2.769179e+59 2.635593e+19
## 13  1.2817 176.0864  23.5879 10.8531 3278.5027 2.213571e+59 2.767068e+19
## 14  9.8981 172.9287   8.6155 11.3109 3368.3957 2.092837e+59 2.446771e+19
## 15  0.0359 164.0536  48.3885 10.6840 3417.7369 2.147635e+59 2.401787e+19
##          TraceW Friedman   Rubin Cindex     DB Silhouette   Duda Pseudot2
## 2  119558984543  23.8160  2.2783 0.1410 1.4434     0.4560 0.6337 224.2598
## 3   80332413843  26.4792  3.3908 0.1268 1.1175     0.4784 1.2170 -26.9273
## 4   64855545528  31.7989  4.1999 0.1065 1.0629     0.3866 0.9585   5.3233
## 5   53206131318  35.5905  5.1195 0.0924 1.0817     0.3725 1.3944 -44.9731
## 6   47257645388  38.3343  5.7639 0.0997 1.1541     0.3186 1.4368 -27.3624
## 7   41922735726  41.2473  6.4974 0.0908 1.1485     0.3159 2.1220 -80.3708
## 8   36273469993  45.3672  7.5093 0.1033 1.0286     0.3195 1.7861 -51.0527
## 9   34583835238  47.2070  7.8762 0.0977 1.0728     0.3108 1.1325  -9.5946
## 10  31499429426  53.2201  8.6474 0.0967 1.1261     0.2766 1.4466 -29.6358
## 11  29954296529  55.1001  9.0935 0.0920 1.0917     0.2776 2.2725 -27.9981
## 12  28208543911  60.0246  9.6562 0.0866 1.0579     0.2665 1.2820 -16.9388
## 13  26493094146  61.6382 10.2815 0.0970 1.1698     0.2493 2.4068 -47.3447
## 14  25106204367  64.4749 10.8494 0.0969 1.0718     0.2604 2.7999 -69.4272
## 15  24608516850  66.1667 11.0689 0.0977 1.1350     0.2262 3.5971 -30.3241
##      Beale Ratkowsky        Ball Ptbiserial    Frey McClain   Dunn Hubert
## 2   2.2178    0.2920 59779492271     0.4106 -0.0007  0.1641 0.0148      0
## 3  -0.6745    0.3260 26777471281     0.6010  3.3450  0.2588 0.0169      0
## 4   0.1636    0.3289 16213886382     0.5238  1.4382  0.4616 0.0155      0
## 5  -1.0774    0.3025 10641226264     0.4840  3.4153  0.6721 0.0145      0
## 6  -0.9747    0.2937  7876274231     0.4389  1.1288  0.8795 0.0146      0
## 7  -1.9881    0.2801  5988962247     0.4081 -0.1092  1.1064 0.0142      0
## 8  -1.6539    0.2858  4534183749     0.4093  0.9357  1.1024 0.0163      0
## 9  -0.4394    0.2716  3842648360     0.3935  8.0415  1.2351 0.0167      0
## 10 -1.1768    0.2595  3149942943     0.3531  0.6273  1.5827 0.0054      0
## 11 -2.0410    0.2527  2723117866     0.3427  0.5080  1.7139 0.0142      0
## 12 -0.8207    0.2424  2350711993     0.3327  0.9585  1.8470 0.0086      0
## 13 -2.2107    0.2360  2037930319     0.3228  0.5016  1.9785 0.0154      0
## 14 -2.4195    0.2287  1793300312     0.3156 -6.3132  2.0804 0.0095      0
## 15 -2.7065    0.2215  1640567790     0.2843 -0.4692  2.6072 0.0152      0
##    SDindex    Dindex   SDbw
## 2    8e-04 12586.767 1.4125
## 3    7e-04 10492.876 1.3148
## 4    9e-04  9511.550 1.4042
## 5    8e-04  8447.811 1.2716
## 6    1e-03  8117.653 1.3865
## 7    9e-04  7470.396 1.2558
## 8    9e-04  7261.920 1.2275
## 9    8e-04  7020.144 1.1501
## 10   8e-04  6683.115 1.0208
## 11   8e-04  6492.153 0.9631
## 12   8e-04  6233.716 0.8927
## 13   8e-04  6049.322 0.7696
## 14   8e-04  5836.016 0.6135
## 15   9e-04  5725.528 0.5905
## 
## $All.CriticalValues
##    CritValue_Duda CritValue_PseudoT2 Fvalue_Beale
## 2          0.8055            93.6752       0.0388
## 3          0.6721            73.6763       1.0000
## 4          0.6683            61.0529       0.9861
## 5          0.7238            60.6832       1.0000
## 6          0.2445           278.1308       1.0000
## 7          0.6378            86.3332       1.0000
## 8          0.6349            66.7150       1.0000
## 9          0.6319            47.7728       1.0000
## 10         0.7301            35.4937       1.0000
## 11         0.5097            48.0978       1.0000
## 12         0.5992            51.4987       1.0000
## 13         0.6721            39.5217       1.0000
## 14         0.6433            59.8918       1.0000
## 15         0.6222            25.4996       1.0000
## 
## $Best.nc
##                      KL       CH Hartigan     CCC    Scott      Marriot
## Number_clusters  8.0000   5.0000   3.0000 14.0000   4.0000 8.000000e+00
## Value_Index     12.5452 213.3661 109.5928 11.3109 387.7014 3.100001e+59
##                       TrCovW      TraceW Friedman  Rubin  Cindex     DB
## Number_clusters 3.000000e+00           3   10.000  8.000 12.0000 8.0000
## Value_Index     5.579786e+20 23749702385    6.013 -0.645  0.0866 1.0286
##                 Silhouette  Duda PseudoT2   Beale Ratkowsky        Ball
## Number_clusters     3.0000 3.000   3.0000  3.0000    4.0000           3
## Value_Index         0.4784 1.217 -26.9273 -0.6745    0.3289 33002020990
##                 PtBiserial Frey McClain   Dunn Hubert SDindex Dindex
## Number_clusters      3.000    1  2.0000 3.0000      0   3e+00      0
## Value_Index          0.601   NA  0.1641 0.0169      0   7e-04      0
##                    SDbw
## Number_clusters 15.0000
## Value_Index      0.5905
## 
## $Best.partition
##   [1] 3 3 3 3 1 3 3 3 3 2 3 3 1 3 1 3 3 3 3 3 3 3 1 2 1 3 3 3 2 1 3 3 3 1 3
##  [36] 3 1 3 2 1 1 3 3 2 3 2 2 2 3 2 3 3 1 3 1 3 2 3 3 3 3 2 3 3 3 2 3 3 3 3
##  [71] 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 2 2 1 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3
## [106] 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3
## [141] 3 1 1 3 3 2 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 2 3 3 3 3 3 2 3 2 3
## [176] 3 1 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 2 1 3 3 2 3 3 3 2
## [211] 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 3
## [246] 3 3 3 3 3 3 2 3 1 3 1 3 3 1 1 3 3 1 3 3 2 2 3 2 3 3 3 3 1 3 3 1 3 3 3
## [281] 3 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 2 3 3 2 3 1 2 3 3
## [316] 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 2 3 2 3 1 3 3 3 3 3 3 3 2 3 3 3 1 3 2
## [351] 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 1 3 1 3 2
## [386] 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 3 3 1 2 3 3 3 3 3 3 3 3 3 3 2 3
## [421] 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 1 1 2 3 3
#Méthode du coude pour déterminer le meilleur nombre de clusters
elbow_method <- fviz_nbclust(cust_data, FUNcluster = kmeans, method = "wss")
elbow_method

#Méthode de la silhouette moyenne
silhouette_method <- fviz_nbclust(cust_data, FUNcluster = kmeans, method = "silhouette")
silhouette_method

Parmi les trois méthodes, deux nous suggèrent de considérer k = 3. Seule la méthode de la silhouette moyenne nous a donné une valeur du k optimal égale à 2. En appliquant la règle de la majorité (Vive la démocratie :) ), le meilleur nombre de clusters est 3.

Implémentation de l’algorithme K-means avec k = 3

Nous pouvons à présent implémenter l’algorithme k-means à l’ensemble de nos données en considérant 3 comme nombre de clusters.

set.seed(123)
#Exécutation de l'algorithme k-means avec k = 3
kmeans_out <- kmeans(cust_data, centers = 3, nstart = 50)
kmeans_out
## K-means clustering with 3 clusters of sizes 60, 50, 330
## 
## Cluster means:
##      Fresh      Milk   Grocery   Frozen Detergents_Paper Delicassen
## 1 35941.40  6044.450  6288.617 6713.967         1039.667   3049.467
## 2  8000.04 18511.420 27573.900 1996.680        12407.360   2252.020
## 3  8253.47  3824.603  5280.455 2572.661         1773.058   1137.497
## 
## Clustering vector:
##   [1] 3 3 3 3 1 3 3 3 3 2 3 3 1 3 1 3 3 3 3 3 3 3 1 2 1 3 3 3 2 1 3 3 3 1 3
##  [36] 3 1 3 2 1 1 3 3 2 3 2 2 2 3 2 3 3 1 3 1 3 2 3 3 3 3 2 3 3 3 2 3 3 3 3
##  [71] 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 2 2 1 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3
## [106] 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3
## [141] 3 1 1 3 3 2 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 2 3 3 3 3 3 2 3 2 3
## [176] 3 1 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 2 1 3 3 2 3 3 3 2
## [211] 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 3
## [246] 3 3 3 3 3 3 2 3 1 3 1 3 3 1 1 3 3 1 3 3 2 2 3 2 3 3 3 3 1 3 3 1 3 3 3
## [281] 3 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 2 3 3 2 3 1 2 3 3
## [316] 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 2 3 2 3 1 3 3 3 3 3 3 3 2 3 3 3 1 3 2
## [351] 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 1 3 1 3 2
## [386] 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 3 3 1 2 3 3 3 3 3 3 3 3 3 3 2 3
## [421] 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 1 1 2 3 3
## 
## Within cluster sum of squares by cluster:
## [1] 25765310312 26382784678 28184318853
##  (between_SS / total_SS =  49.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"    
## [5] "tot.withinss" "betweenss"    "size"         "iter"        
## [9] "ifault"
# Visualisation des résultats
fviz_cluster(kmeans_out, data = cust_data)

Évidemment, trois clusters sont formés et cela est conforme à notre paramètre k qui a été transmis à l’algorithme. Nous voyons que le premier groupe contient 60 observations, le deuxième groupe contient 50 observations et le troisième groupe contient 330 observations. Chacune des observations de notre ensemble des données est affectée à l’un de ces trois groupes (1, 2 ou 3).

Ce qui est aussi intéressant dans le résultat est que l’algorithme fournit également le centroïde (centre de gravité) de chaque cluster. Le centroïde est représentatif de tous les points d’un cluster particulier. Comme il n’est pas possible d’étudier chacune des observations individuelles affectées à un cluster et de déterminer les caractéristiques commerciales du cluster, le centre de gravité du cluster peut être utilisé comme représentant de tous les points du cluster. Le centre de gravité du cluster nous aide à arriver rapidement à une conclusion en termes de définition du contenu d’un cluster ce qui est très important par exemple en Marketing.

Qualité de la segmentation

En Apprentissage supervisé, on dispose de données étiquettées ce qui permet de comparer les prédictions du modèle aux réelles observations. En apprentissage non-supervisé, comme c’est le cas ici, cette comparaison ne peut se faire car les données ne sont pas étiquettées. Comment mesurer alors la qualité de notre partitionnement ?

L’objectif du clustering est d’obtenir des clusters de bonne qualité. Le clustering est de haute qualité si la distance dans les observations (intra-cluster) d’un cluster donné est minimale et la distance séparant les clusters eux-mêmes (inter-cluster) est maximale. Malheureusement, il n’y aucune valeur seuil (ou valeur de référence) pour dire la distance intra-cluster est minimale ou si la distance inter-cluster est maximale.

Pour mesurer la qualité du clustering, on peut calculer le coefficient de Silhouette pour chacun des trois groupes. L’indice Silhouette est calculé en utilisant la distance intra-cluster moyenne, a, et la distance moyenne du cluster le plus proche, b, pour chacune des observations participant à l’exercice de clustering. Pour une observation, l’indice Silhouette est donné par la formule : (b - a)/max(a, b).

#Calcul de l'indice Silhouette
si <- silhouette(kmeans_out$cluster, dist(cust_data, "euclidean"))

summary(si)
## Silhouette of 440 units in 3 clusters from silhouette.default(x = kmeans_out$cluster, dist = dist(cust_data,  from     "euclidean")) :
##  Cluster sizes and average silhouette widths:
##        60        50       330 
## 0.2524346 0.1800059 0.5646307 
## Individual silhouette widths:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.1544  0.3338  0.5320  0.4784  0.6743  0.7329

La largeur de silhouette moyenne de chaque cluster est positive et plus proche de 1 plutôt que de -1. Donc, on peut dire que ce clustering est de bonne qualité.

Interprétation des clusters formés pour l’entreprise

Il ne s’agit pas de faire du clustering et de s’en arrêter là ! Le data scientist doit pouvoir comprendre ce que chacun de ces clusters formés signifie pour l’entreprise.

#Centre de gravité de chaque cluster
centroide <- kmeans_out$centers
centroide
##      Fresh      Milk   Grocery   Frozen Detergents_Paper Delicassen
## 1 35941.40  6044.450  6288.617 6713.967         1039.667   3049.467
## 2  8000.04 18511.420 27573.900 1996.680        12407.360   2252.020
## 3  8253.47  3824.603  5280.455 2572.661         1773.058   1137.497
#Dépense moyenne effectuée par les clients pour chaque groupe
for (i in 1:3) {
  print(sum(centroide[i, ]))
}
## [1] 59077.57
## [1] 70741.42
## [1] 22841.74

En ayant les caractériques de chaque centre de gravité, nous pouvons tirer des informations pour chacun des groupes qui permettront d’avoir une campagne marketing efficace.

  • Le groupe 3 est le moins dépensier (22841,74 u.m) avec la majorité des dépenses allouées à la catégorie “Frais” ;

  • Le groupe 2 est le plus dépensier (70741,42 u.m) avec la majorité des dépenses allouées à la catégorie “Epicerie” ;

  • Le groupe 1 est dépensier moyen (59077,57 u.m) avec la majorité des dépenses allouées à la catégorie “Frais”.

Si par exemple, l’objectif est de faire dépenser davantage les clients, l’entreprise peut déployer une campagne marketing auprès des clients du groupe 2 dont les dépenses pour chaque catégorie de produits sont inférieures à celles du centroïde du groupe 2.

L’exploitation des résultats d’un clustering déppend des objectifs business fixés au départ par l’entreprise.

CONCLUSION

Le clustering est une technique d’apprentissage automatique non-supervisé. L’algorithme K-means est l’algorithme de clustering le plus populaire. Tout exercice de clustering doit commencer d’abord par la vérification de l’existence de groupes similaires distincts dans un ensemble des données. S’il n’y a aucune structuration dans les données (données purement aléatoires), il est donc inutile d’implémenter un algorithme de clustering. La vérification est faite par le calcul statistique Hopkins. Ensuite, nous avons déterminé le nombre optimal de clusters (k) à utiliser dans l’implémentation de l’algorithme K-means. Enfin, après avoir implémenter le K-means, nous avons mesuré la qualité du partitionnement puis tiré des informations utiles à l’entreprise dans le déployement de sa campagne marketing.

Trouvez ici un très bon document pour en appendre davantage sur le clustering dans R.