- 1 Contexte général et périmètre de l’étude
- 2 Schéma des données
- 3 Présentation de l’entreprise
- 4 Botanic en quelques chiffres
- 5 Présentation de la problèmatique
- 6 Le commencement : L’analyse de la complétude des données
- 7 Regroupement de modalités et nettoyage des valeurs aberrantes
- 8 Création de la vue client
- 9 Vers la construction d’indicateurs clés
- 9.1 Liste des indicateurs construits
- 9.2 Nettoyage des indicateurs
- 9.2.1 Suppression des clients avec un CA négatif
- 9.2.2 Suppression des clients ayant un montant de remise supérieur au CA qu’il génére
- 9.2.3 Suppression des clients ayant une quantité d’articles achetée négative
- 9.2.4 Suppression des clients ayant une marge de sortie négative
- 9.2.5 Suppression des clients ayant un montant de remise négatif
- 9.3 Analyse détaillée des indicateurs
- 10 Création de la variable cible : Client à fort potentiel
- 11 Préparation des données pour modélisation
- 12 Vers la modélisation supervisée
- 13 Performances des deux modèles
- 14 Recommandations marketing en réponse à la problématique
- 15 Auto-critique de notre étude et axes d’amélioration
- 16 Annexe : Ajustement d’un modèle d’apprentissage non supervisée - K-means
N.B : Les résultats de notre analyse nous font penser que les données étudiées proviennent d’une enseigne de distribution de produits pour le jardin et la nature (Botanic) et non Sephora comme présenté au premier semestre. Nous allons donc mener notre étude en estimant que les données proviennent de cette entreprise.
1 Contexte général et périmètre de l’étude
Nous avons à notre disposition, pour cette étude, accès à des données clients et d’achats de l’entreprise Botanic dans un périmètre bien spécifique.
Périmètre :
- 5 tables de bases de données (CLIENT,MAGASIN,ENTETE_TICKET,LIGNE_TICKET,ARTICLE)
- 2 ans de profondeur : 2016 et 2017
- 845876 clients tous encartés
Nous détaillerons davantage, par la suite, le périmètre d’analyse dans la présentantion de l’entreprise.
2 Schéma des données
Comme énoncé précédemment, les données sont réparties en 5 tables :
- CLIENT : Table contenant l’ensemble des informations du client
- MAGASIN : Table contenant les informations de géolocalisation des magasins
- ENTETE_TICKET : Table contenant principalement les montants totaux d’achat pour chaque client
- LIGNE TICKET : Table détaillant pour chaque ticket et pour chaque client, les articles achetés avec pour chacun son montant associé
- ARTICLE : Table référençant l’ensemble des articles proposés par la marque
3 Présentation de l’entreprise
Botanic est une entreprise familiale créée en 1995 en pays de Savoie par des horticulteurs. Elle est le quatrième réseau de jardineries de France après Jardiland,Gamm Vert et Truffaut. Botanic est aujourd’hui en France la seule enseigne spécialiste du jardin à ne proposer que des produits et solutions écologiques pour jardiner au naturel. Depuis 2008, soucieux de la protection de l’environnement et du développement durable, tous les pesticides et autres produits chimiques de synthèse ont été retirés des magasins, idéal pour acquérir de nouveaux clients préoccupés par les impacts sur l’environnement.
L’enseigne possède aujourd’hui 66 magasins en France répartis principalement dans la région de Savoie et dans le Sud de la France. Elle ne réalise pas de chiffre d’affaires avec son site internet qui n’est pas destiné à vendre des produits mais qui est juste une vitrine des promotions et des produits que l’on peut trouver en magasin.
4 Botanic en quelques chiffres
Nous allons voir dans cette partie, quelles sont les caractéristiques du marché et les points faibles de l’enseigne pour proposer une étude en rapport avec ces problématiques. Nous verrons ensuite comment mettre en place des actions concrètes visant à corriger et à améliorer la situation actuelle de l’entreprise.
- Macro :
Aujourd’hui, environ 90% des français possèdent « un espace jardinage »… Mais le marché du jardin ne connaît pas de croissance depuis 10 ans. Contrairement à ses concurrents, Botanic axe principalement son développement sur le développement durable à travers ses 5 univers : jardinerie, animalerie, décoration, marché bio et bien-être.
- Micro :
- Hausse du CA de Botanic de 0,9% en 1 an et une hausse du nombre de clients de 6,3%
- 50% du CA provient de l’univers jardinerie (U1 dans les données), 25% de l’animalerie (U3), 15 % des produits de décoration et mobilier (U2) et 10 % des produits bio (U4)
- Augmentation du panier moyen de 1,29% mais baisse du nombre de tickets et du nombre d’article par ticket d’environ 2%.
- Forte saisonnalité : les mois qui génèrent le plus de CA tous magasins confondus sont les mois de mars, avril, mai et juin (50% du CA annuel). Saisonnalité davantage visible sur le CA_2017 (voir graphe ci-dessous).
Les produits les plus vendus par Botanic sont des produits d’extérieur (plantes, fleurs, etc…) de l’univers jardinerie
- Clientèle :
- Le CA de Botanic est essentiellement constitué d’une clientèle française à 97%
- La clientèle (par CA) est répartie comme suit : Femmes : 55%/ Hommes : 45%
- Le cœur de cible de Botanic est la clientèle âgée de 35 à 65 ans
- La répartition du nombre de « clients VIP » en France est de 13%. Le CA de ces clients représente 43% en 2017, ce qui n’est pas négligeable. 90% de ces clients ont été actifs en 2017
Pour la suite de l’étude, nous allons restreindre le périmètre des données à 1 an. Nous allons nous concentré uniquement sur les clients ayant effectués des achats en 2017.
Quelques complément d’informations en 2017 avant de nous lancer sur la présentation de la problèmatique :
- Le nombre moyen de clients par magasin de rattachement est de 12625. Il oscille entre 1273 et 26935. La plupart des achats des clients sont effectués dans leur magasin de rattachement même si une partie non négligeable est faite ailleurs.
- Le montant total d’un ticket varie entre -4404 et 15355 euros. Avec une moyenne de 58 euros et une médiane de 37.60 euros. La valeur -4404 euros implique soit une erreur de saisie, soit un remboursement d’un achat effectué précédemment.
- Chaque ticket comporte en moyenne 5 à 6 articles différents avec une médiane de 4 articles. La quantité achetée par article est majoritairement égale à 1. Le prix moyen des articles est globalement de 10 euros HT avec une médiane de 5 euros HT. Quelques remises sont offertes sur certains articles avec un montant moyen de 1 euro HT. Par contre la médiane des remises est égale à 0 ce qui veut dire qu’au moins la moitié des articles vendus n’ont pas bénéficié de remise.
5 Présentation de la problèmatique
Etant donné cet état des lieux, il convient de se demander quelles sont les actions à mettre en place pour répondre aux problématiques suivantes : améliorer le chiffre d’affaires, le taux de conversion en magasin, fidéliser davantage les clients VIP et le cœur de cible des clients de la marque.
De fait, nous définissons, pour cette étude, la problématique suivante : Quels sont les clients qui sont susceptibles de rapporter le plus d’argent à Botanic ? Autrement dit, existe-il une population de clients que Botanic n’aurait pas identifié et qu’il serait intéressant de prendre en considération afin de les solliciter pour les faire acheter régulièrement, les faire acheter plus lors d’un passage en magasin, de les faire devenir ambassadeur de la marque ?
Nous appellerons ces clients « clients à fort potentiel »
6 Le commencement : L’analyse de la complétude des données
Pour s’assurer de la qualité des indicateurs que nous allons créer, il est indispensable de passer par l’analyse des valeurs manquantes.
En examinant l’ensemble des données, dataframe par dataframe, les variables du dataframe “client” sont les seules contenant des valeurs manquantes.
na_count <-sapply(client, function(y) sum(length(which(is.na(y)))))## DATEREADHESION DATENAISSANCE CODEINSEE PAYS
## 338060 337974 27421 3
## IDCLIENT CIVILITE MAGASIN DATEDEBUTADHESION
## 0 0 0 0
## DATEFINADHESION VIP
## 0 0
## Il y a 4 colonnes contenant des valeurs manquantes
Remarques :
- Plus d’1/3 des clients n’ont pas renseignés leur date de naissance
- 338060 clients n’ont pas encore réadhéré au programme de fidélité
- 27421 Code Insee clients ne sont pas renseignés
- 3 clients n’ont pas indiqués leur pays de provenance
Ces variables seront utilisées et traitées au moment de la construction de nos indicateurs.
7 Regroupement de modalités et nettoyage des valeurs aberrantes
7.1 La variable CIVILITE
En visualisant les données, nous nous apercevons qu’il existe 3 types de valeurs pour définir un client “Homme” et un client “Femme”.
client$CIVILITE[client$CIVILITE == "Mr" | client$CIVILITE == "monsieur"] <- "MONSIEUR"
client$CIVILITE[client$CIVILITE == "Mme" | client$CIVILITE == "madame"] <- "MADAME"Pour combler cette incohérence, nous avons regroupé ces 3 types de valeurs de civilité en une : “MONSIEUR” pour les hommes et “MADAME” pour les femmes car c’est la modalité représentant le plus d’observation.
Le résultat est le suivant:
Nous constatons que la répartition homme/femme des clients est assez équitable (point vu lors de la présentation de la clientèle de l’entreprise)
7.2 La variable PAYS
## AD AE AF AM AT BE BG BR CA CH
## 3 1 6 1 2 235 3 1 3 17845
## DE DK DZ ES FI FR GA GB GF GM
## 139 4 1 48 2 827365 1 8 1 1
## GR IT JM JP LA LK LU LV MA MC
## 2 83 2 1 1 4 59 1 4 19
## MQ MT NC NL NO PL PT RO RU SE
## 1 1 1 4 2 1 1 1 2 3
## SM SZ TN TR UA US VN ZA NA's
## 1 2 1 1 1 2 1 1 3
3 valeurs manquantes sont apparantes dans cette variable.
La stratégie que nous avons adopté est de remplacer ces valeurs manquantes par la valeur la plus fréquente .
client$PAYS[is.na(client$PAYS)] <- "FR"Nous les avons donc remplacées par la valeur “FR” .
7.3 La variable DATEFINADHESION
## 2016 2017 2018 2019 2020 2085 2086 2087 2089 2090
## 159155 233845 420314 32403 3 1 1 1 3 12
## 2091 2092 2093 2094 2095 2096 2099 2100
## 45 21 10 9 6 1 1 45
La grande majorité des clients (96%) ont une DATEFINADHESION comprise entre 2016 et 2019.
Pour harmoniser les valeurs supérieures à celle, des valeurs de dates aberrantes que nous pensons attribuées au personnel de la marque, nous avons décidé de les remplacer par la valeur apparaissant le plus de fois .
client$DATEFINADHESION[year(client$DATEFINADHESION) > 2019] <- as.POSIXct("2018-12-31")Nous les avons donc remplacer par la date 2018-12-31.
7.4 La variable DATENAISSANCE
En examinant les dates de naissances renseignées par les clients lors de l’inscription à la carte de fidélité, nous nous rendons compte qu’en plus des clients ne renseignant pas ce champ là, 1159 clients ont renseignés des valeurs qui sortent du périmètre de la durée de vie d’une personne.
client$DATENAISSANCE[year(client$DATENAISSANCE) < 1918 & !is.na(client$DATENAISSANCE)] <- NA
client$DATENAISSANCE[year(client$DATENAISSANCE) > 2000 & !is.na(client$DATENAISSANCE)] <- NACependant, pour éviter de supprimer des clients pouvant être à fort potentiel, nous avons décider de retirer ces valeurs aberrantes et de ne pas les renseignées .
7.5 Gestion du format de dates
Au niveau des dates présentes dans les dataframes client et enteteTicket, nous avons dû transformer chacune de celles-ci dans un format de dates approprié.
Nous avons donc opté pour l’utilisation de la fonction parse_date_time du package lubridate permettant de faire de faire apparaitre la notion de date en gardant la notion de time.
to_date<- function(date){
return(parse_date_time(x = date,
orders = c("dmY HMS", "Ymd HMS")))
}
date_func <- function(df){
colnum <- grep("DATE", colnames(df))
df[, (colnum) := lapply(.SD, to_date), .SDcols = colnum]
return(df)
}Cette notion de time pourra nous servir pour faire apparaître des indicateurs d’affluences par la suite.
8 Création de la vue client
Après avoir effectuer ces modifications sur les données permettant d’améliorer la qualité de celles-ci, nous avons créé la vue client nous permettant de faire apparaître les achats de chaque client dans un seul dataframe en joignant chacune des tables par leur clé primaire respective.
#1. Join refArticle with lignesTicket df by CODEARTICLE and IDARTICLE
merge_article_ligneTicket <- merge(refArticle,lignesTicket,by.x = "CODEARTICLE", by.y = "IDARTICLE")
#2. Join enteteTicket with the previous merge df by IDTICKET
merge_enteteTicket_aLigneTicket <- merge(merge_article_ligneTicket,enteteTicket,by = "IDTICKET")
rm(merge_article_ligneTicket)
#3. Join refMagin with the previous merge df by MAG_CODE and CODESOCIETE
merge_refMagasin_ael <- merge(merge_enteteTicket_aLigneTicket,refMagasin, by.x = "MAG_CODE", by.y = "CODESOCIETE")
rm(merge_enteteTicket_aLigneTicket)
#4. Join client with CA_TTC with the previous merge df by IDCLIENT
merge_all <- merge(merge_refMagasin_ael,merge_clientCA_TTC_enteteT,by = "IDCLIENT")
rm(merge_refMagasin_ael)Nous avons pensé à chacune des étapes à supprimer au fur et à mesure les dataframes de transition pour éviter de saturer la mémoire de stockage de nos ordinateurs.
Le dataframe merge_all contient cette vue.
9 Vers la construction d’indicateurs clés
Après avoir effectuer ces modifications sur les données permettant d’améliorer la qualité de celles-ci, il faut transfomer cette somme de renseignements en connaissances : c’est la phase de construction d’indicateurs.
9.1 Liste des indicateurs construits
Les indicateurs clés que nous avons construit après de multiples réfléxions, en cohérence avec notre problèmatique, sont ceux qui vont entrer en ligne de compte dans les modèles pour répondre à celle-ci: qui pour rappel est de définir et retrouver les clients à potentiel.
## 'data.frame': 494504 obs. of 37 variables:
## $ Age : num NA 58 68 78 NA NA NA 77 NA 50 ...
## $ Etranger : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Ancien_Client : num 1 1 1 1 1 1 1 1 1 1 ...
## $ Readherant : num 1 1 1 1 1 1 1 1 1 1 ...
## $ CA_TTC : num 329 200 1626 204 732 ...
## $ CA_HT : num 289 171 1381 186 634 ...
## $ Nb_Ticket_Remb : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Taux_Ticket_Remb : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Marge_Sortie : num 147.1 75.8 617.1 100 271.3 ...
## $ Nb_Remise : int 11 10 37 1 22 5 1 12 27 11 ...
## $ Montant_Remise : num 28.63 21.12 174 4.43 55.8 ...
## $ Nb_Ticket : int 16 8 29 4 10 2 3 19 2 7 ...
## $ Quantite_Article : num 47 15 154 30.7 64.3 ...
## $ Nb_Moyen_Article : num 2.94 1.88 5.31 7.68 6.43 ...
## $ Nb_Moyen_Article_Diff : num 1.88 1.88 3.28 5.25 5.3 3 1.33 1.32 16 3.71 ...
## $ Panier_Moyen : num 20.6 24.9 56.1 51 73.2 ...
## $ Friand_Promo : num 0 0 0 0 0 0 1 0 0 0 ...
## $ Nb_Univers : int 5 3 3 3 3 3 2 3 4 5 ...
## $ Nb_Famille : int 11 8 9 5 11 5 2 6 6 8 ...
## $ Nb_SousFamille : int 17 12 20 11 24 5 3 14 14 15 ...
## $ Nb_Magasin_Achat : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Pct_Remise : num 9 11 11 2 8 13 15 14 7 9 ...
## $ Taux_De_Marque : num 0.447 0.38 0.379 0.49 0.371 ...
## $ Nb_Ticket_Magasin_Rattach: num 16 8 25 4 10 2 3 19 2 7 ...
## $ Pct_Achat_Magasin_Rattach: num 1 1 0.86 1 1 1 1 1 1 1 ...
## $ Mois_CA_Min : num 1 10 11 1 3 5 6 9 9 4 ...
## $ Mois_CA_Max : num 11 11 5 3 11 3 12 10 5 5 ...
## $ JourSemaine_CA_Min : chr "Mercredi" "Mercredi" "Lundi" "Mercredi" ...
## $ JourSemaine_CA_Max : chr "Vendredi" "Lundi" "Mardi" "Samedi" ...
## $ Heure_CA_Min : int 16 17 10 11 13 15 12 9 18 14 ...
## $ Heure_CA_Max : int 11 18 18 16 15 18 18 11 17 11 ...
## $ Client_Meme_Ville : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Client_Meme_Dep : num 1 1 1 1 1 1 1 1 1 1 ...
## $ CIVILITE : Factor w/ 6 levels "MADAME","MONSIEUR",..: 1 1 1 1 2 1 2 1 2 2 ...
## $ VIP : Factor w/ 2 levels "0","1": 1 1 2 1 1 2 1 1 1 1 ...
## $ Annee_Debut_Adhesion : num 2004 2005 2005 2005 2005 ...
## $ Annee_Fin_Adhesion : num 2018 2018 2019 2017 2018 ...
Les indicateurs ClientMemeVille et ClientMemeDep (sous-entendu que le magasin) ont été créé en utilisant des données externes (données INSEE), les correspondances entre les codes insee et les codes postaux.
Pour davantage de détails sur la définition et la construction de ces 37 indicateurs, veuillez vous référez au fichier Excel nommé “Grille_Indicateurs” transmis dans le dossier.
9.2 Nettoyage des indicateurs
Après avoir créer ces indicateurs, nous avons remarqué que certains clients n’entrent pas dans notre périmètre d’analyse.
Nous avons donc décidé de retirer ces clients.
9.2.1 Suppression des clients avec un CA négatif
by_client <- by_client[by_client$CA_TTC > 0,]9.2.2 Suppression des clients ayant un montant de remise supérieur au CA qu’il génére
by_client <- by_client[by_client$CA_TTC > by_client$Montant_Remise,]9.2.3 Suppression des clients ayant une quantité d’articles achetée négative
by_client <- by_client[by_client$Quantite_Article > 0,]9.2.4 Suppression des clients ayant une marge de sortie négative
by_client <- by_client[by_client$MargeSortie > 0,]9.2.5 Suppression des clients ayant un montant de remise négatif
by_client <- by_client[by_client$Montant_Remise > 0,]Après ces modifications, le nombre de clients se réduit, il ne nous en reste plus que 494504 sur 608457 ayant effectué des achats en 2017.
9.3 Analyse détaillée des indicateurs
9.3.1 Exploration des données agrégées par client
Les clients sont majoritairement des femmes (60%). Toujours majoritairement français (98%). Ceux ayant un statut de VIP passe à 20%. Pour l’âge aucun changement, toutes les tranches d’âge sont présentes et coïncident avec la pyramide des âges en France.
Le CA moyen généré par client est de 358 euros avec un CA médian de 231 euros. Les clients ont bénéficié en moyenne d’une remise de 31 euros avec une médiane à 17 euros.
Chaque client a effectué en moyenne 6 achats avec une médiane de 4 achats. Le panier moyen est de 78 euros qui est sensiblement différent du panier médian à 58 euros.
9.3.2 Exploration du CA, Panier moyen et Montant de remise
Dans tout ce qui suit, on va porter notre attention sur les clients qui ont un CA_TTC < 1000.
Ils représentent la grosse majorité des clients.
Il n’y a aucunes différences entre le niveau de consommation entre Monsieur et Madame.
Le CA des clients VIP est nettement supérieur aux autres. En revanche leurs paniers moyens sont globalement similaires car ils ont un nombre de tickets deux fois plus important que la moyenne. Ce qui implique que les clients VIP se rendent beaucoup plus au magasin pour faire des achats que les autres.
Les VIP bénéficient d’un montant de remise plus important que les autres.
Les clients anciens ont un CA supérieur aux autres.
Sinon pas de différence notoire sur les autres critères.
On remarque que le fait de découper une variable numérique en un nombre de classes ayant des effectifs semblables (second graphe) donne plus d’indications que le fait de la découper en classes d’amplitudes égales (premier graphe).
Nous allons donc paufiner l’analyse dans les graphes suivants en adoptant le découpage en classes avec effectifs semblables.
Le pourcentage des clients avec un statut VIP croit de façon continue selon les tranches CA générés par les clients.
Par contre pour le panier moyen on note prèsque une symétrie par rapport à la classe centrale.
Mis à part la première classe, le pourcentage des clients anciens croit de façon continue selon le CA généré mais décroit de façon continue pour le panier moyen.
10 Création de la variable cible : Client à fort potentiel
En analysant statistiquement l’ensemble des indicateurs que nous venons de créer, nous avons dégagé des règles métiers permettant de définir ce qu’est pour la marque un client à fort potentiel.
Nous sommes arrivés à la conclusion qu’un client à fort potentiel doit avoir dans l’année :
- Un CA TTC supérieur ou égale 400€
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.76 123.37 232.38 359.14 440.58 36226.70
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 4.000 6.128 8.000 329.000
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.267 12.000 24.000 42.109 46.853 4472.000
Cela se résume en R de cette manière là:
by_client$Client_With_Potential <- ifelse(by_client$CA_TTC >= 400 & by_client$Nb_Ticket >= 5 & by_client$Quantite_Article >= 40, "Oui", "Non")Si le client respecte cette règle alors le client est considéré comme un client à fort potentiel sinon non.
| Classe | Effectif |
|---|---|
| 0 | 393139 |
| 1 | 101365 |
Par cette règle, on peut voir qu’1/4 des clients sont considérés comme des clients à fort potentiel.
Nous pouvons voir aussi que les clients qui sont considérés comme des clients à fort potentiel sont aussi dans la tranche d’âge 35-65 ans.
Cette base d’exemples créée va être utiliser en entrée par les algorithmes d’apprentissage supervisé que nous allons mettre en place par la suite pour prédire si un client est considéré comme un client à fort potentiel ou non.
11 Préparation des données pour modélisation
11.1 Suppression des indicateurs hautement corrélés
Avant de nous lancer dans la partie modélisation, il est important de supprimer les variables hautement corrélées entre elles pour éviter d’utiliser deux variables ayant une relation élevée entre elles dans les modèles pouvant avoir un impact négative sur les performances des modèles.
Nous voyons, à travers cette matrice des corrélations que les variables CA_TTC , CA_HT et MargeSortie sont hautement corrélés (coefficient de corrélation égale à 1), qu’il existe une dépendance entre elles. Nous avons donc décidé de garder uniquement l’une d’entre elles, celle qui pour nous a le plus de sens de ne pas être retiré, la variable CA_TTC.
De la même manière, on peut voir que les variables Nb_Ticket et Nb_Ticket_Magasin_Rattach ont une dépendance forte (coefficient de corrélation égale à 1). Nous retirons donc l’indicaeur Nb_Ticket_Magasin_Rattach de nos données.
Identique pour les variables Nb_Ticket_Remb et Taux_Ticket_Remb . Nous gardons la variable Taux_Ticket_Remb .
Même si le coefficient de corréaltion entre les variables Nb_Famille et Nb_SousFamille n’est pas égale à 1, il s’en rapproche (0.8), nous décidons donc de garder uniquement le Nb_Famille achété par client.
drops <- c("CA_HT","Marge_Sortie","Nb_Ticket_Remb","Nb_Ticket_Magasin_Rattach","Nb_SousFamille")
by_client <- by_client[ , !(names(by_client) %in% drops)]11.2 Normalisation des variables numériques en variables catégorielles
Au vu du nombre de données que nous analysons, nous avons pensé judicieux de transformer les variables numériques en variables catégorielles pour améliorer le délai d’attente lors de l’exécution des algorithmes de modélisation.
#Manage CA_TTC
by_client$CA_TTC <- ifelse(by_client$CA_TTC <= 100, "moins de 100 euros", ifelse(by_client$CA_TTC > 100 & by_client$CA_TTC <= 300,"entre 100 et 300 euros" , "plus de 300 euros"))
#Manage Taux_De_Marque
by_client$Taux_De_Marque <- ifelse(by_client$Taux_De_Marque <= 0.4, "inferieur a 0.4%","superieur a 0.4%")
#Manage Nb_Remise
by_client$Nb_Remise <- ifelse(by_client$Nb_Remise <= 5, "inferieur a 5 remises", ifelse(by_client$Nb_Remise > 5 & by_client$Nb_Remise <= 10,"entre 5 et 10 remises", "superieur a 10 remises"))
#Manage Montant_Remise
by_client$Montant_Remise <- ifelse(by_client$Montant_Remise <= 10, "moins de 10 euros", ifelse(by_client$Montant_Remise > 10 & by_client$Montant_Remise <= 25, "entre 10 et 25 euros", "plus de 25 euros"))
#Manage Pct_Remise
by_client$Pct_Remise <- ifelse(by_client$Pct_Remise <= 5, "inferieur a 5%", ifelse(by_client$Pct_Remise > 5 & by_client$Pct_Remise <= 10, "entre 5 et 10%", "superieur a 10%"))
#Manage Nb_Ticket
by_client$Nb_Ticket <- ifelse(by_client$Nb_Ticket <= 3, "inferieur a 3 tickets","superieur a 3 tickets")
#Manage Taux_Ticket_Remb
by_client$Taux_Ticket_Remb <- ifelse(by_client$Taux_Ticket_Remb > 0, "superieur à 0","inferieur a 0")
#Manage Quantite_Article
by_client$Quantite_Article <- ifelse(by_client$Quantite_Article <= 15, "inferieur a 15 articles", ifelse(by_client$Quantite_Article > 15 & by_client$Quantite_Article <= 30, "entre 15 et 30 articles", "superieur a 30 articles"))
#Manage Nb_Moyen_Article
by_client$Nb_Moyen_Article <- ifelse(by_client$Nb_Moyen_Article <= 5, "inferieur a 5 articles","superieur a 5 articles")
#Manage Nb_Moyen_Article_Diff
by_client$Nb_Moyen_Article_Diff <- ifelse(by_client$Nb_Moyen_Article_Diff <= 3, "inferieur a 3 articles", ifelse(by_client$Nb_Moyen_Article_Diff > 3 & by_client$Panier_Moyen <= 5, "entre 3 et 5 articles", "plus de 5 articles"))
#Manage Panier_Moyen
by_client$Panier_Moyen <- ifelse(by_client$Panier_Moyen <= 50, "moins de 50 euros", ifelse(by_client$Panier_Moyen > 50 & by_client$Panier_Moyen <= 75, "entre 50 et 75 euros", "plus de 75 euros"))
#Manage Nb_Famille
by_client$Nb_Famille <- ifelse(by_client$Nb_Famille <= 5, "inferieur a 5 familles","superieur a 5 familles")
#Manage Annee_Debut_Adhesion
by_client$Annee_Debut_Adhesion <- ifelse(by_client$Annee_Debut_Adhesion <= 2010, "adhere avant 2010", ifelse(by_client$Annee_Debut_Adhesion > 2010 & by_client$Annee_Debut_Adhesion <= 2015,"adhere entre 2010 et 2015", "adhere après 2015"))Le découpage de ces variables numériques en un nombre de classes ayant une taille d’ efffectifs semblables a été effectué via la fonction quant.cut du package questionr .
11.3 Vérification des valeurs manquantes
Nous vérifions une dernière fois avant de nous lancer dans la modèlisation qu’il n’existe plus de valeurs manquantes dans les indicateurs que nous venons de créer.
## Age Etranger Ancien_Client
## 195186 0 0
## Readherant CA_TTC Taux_Ticket_Remb
## 0 0 0
## Nb_Remise Montant_Remise Nb_Ticket
## 0 0 0
## Quantite_Article Nb_Moyen_Article Nb_Moyen_Article_Diff
## 0 0 0
## Panier_Moyen Friand_Promo Nb_Univers
## 0 0 0
## Nb_Famille Nb_Magasin_Achat Pct_Remise
## 0 0 0
## Taux_De_Marque Mois_CA_Min Mois_CA_Max
## 0 0 0
## JourSemaine_CA_Min JourSemaine_CA_Max Heure_CA_Min
## 0 0 0
## Heure_CA_Max Client_Meme_Ville Client_Meme_Dep
## 0 0 0
## CIVILITE VIP Annee_Debut_Adhesion
## 0 0 0
## Annee_Fin_Adhesion Client_With_Potential
## 0 0
Pour la suite, nous ne prendrons pas en compte l’indicateur Age car elle comprend 40% de valeurs manquantes.
11.4 Echantillonnage (Apprentissage/Test)
Nous avons séparé notre échantillon de données en deux sous-échantillions:
- Un échantillon d’apprentissage : Nos différents modèles s’entraîneront sur cette échantillion
- Un échantillon de test : Cet échantillon nous permettra de tester le pouvoir prédictif de nos modèles
ind <- sample(2, nrow(by_client), replace=T, prob=c(0.7,0.3))
tdata<- by_client[ind==1,] # training = 70%
vdata<- by_client[ind==2,] #test = 30%11.4.1 Echantillon d’apprentissage (70% des données)
| Classe | Effectif |
|---|---|
| 0 | 50755 |
| 1 | 19383 |
11.4.2 Echantillon de test (30% des données)
| Classe | Effectif |
|---|---|
| 0 | 21660 |
| 1 | 8202 |
12 Vers la modélisation supervisée
Au vu des données que nous avons à disposition et de la problématique que nous souhaitons traitée, la prédiction qu’un client détient à fort potentiel ou non, nous avons décidé de commencer par utiliser des algorithmes supervisés. Nous en avons utilisé deux :
- Un algorithme de classification : les arbres de décision
- La regression logistique
Pourquoi en utiliser deux ?
Nous avons décidé de mettre en place ces deux algorithmes pour choisir à la fin le meilleur algorithme nous permettant d’obtenir les meilleurs performances en termes de prédiction.
12.1 La régression logistique en premier lieu
12.1.1 Selection des variables : Stratégie Stepwise
N’ayant aucunes connaissances des variables prédictrices, nous avons décidé de nous orienter vers l’utilisation de la stratégie Stepwise pour nous faire une première idée sur les variables pouvant avoir un impact sur le modèle.
Rappel du fontionnnement de la stratégie Stepwise : Utilisée lorsque la connaissance des variables prédictrices possibles s’avère limitée. La variable la plus significative est injectée en première. La deuxième est injectée conditionnellement à la première et ainsi de suite.
12.1.2 Ajustement du modèle et interprétations des variables
L’ajustement du modèle s’effectue via la méthode glm() en précisisant le paramètre family=binomial(link=‘logit’) (la variable à prédire étant binaire).
Nous allons ajusté le modèle uniquement sur 100000 clients car nous estimons que la totalité de l’information y est contenu.
L’ajustement s’effectue sur l’échantillon de train (tdata). Nous indiquons notre variable cible que nous cherchons à prédire (Client_With_Potential) que nous mettons en corrélation avec l’ensemble des indicateurs créés spécifié dans le code par le symbole “.”.
reglog.tune <- glm(Client_With_Potential ~ . ,family=binomial(link='logit'),data=tdata)12.1.2.1 Analyse des coefficients
En utilisant la fonction summary(), nous obtenons les résultats suivants:
##
## Call:
## glm(formula = Client_With_Potential ~ ., family = binomial(link = "logit"),
## data = tdata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.347 0.000 0.000 0.152 2.791
##
## Coefficients:
## Estimate Std. Error
## (Intercept) -2.421e+01 5.021e+04
## Etranger1 2.151e-01 1.464e-01
## Ancien_Client1 2.015e+01 3.442e+04
## Readherant1 -2.069e+01 2.639e+04
## CA_TTCmoins de 100 euros 5.200e+00 3.705e+02
## CA_TTCplus de 300 euros 2.029e+01 2.199e+02
## Taux_Ticket_Rembsuperieur à 0 6.105e-02 7.793e-01
## Nb_Remiseinferieur a 5 remises -2.897e-01 5.380e-02
## Nb_Remisesuperieur a 10 remises 6.723e-01 4.256e-02
## Montant_Remisemoins de 10 euros -2.748e-01 6.127e-02
## Montant_Remiseplus de 25 euros 2.582e+00 7.928e-02
## Nb_Ticketsuperieur a 3 tickets 1.969e+01 2.173e+02
## Quantite_Articleinferieur a 15 articles 2.960e+00 3.591e+02
## Quantite_Articlesuperieur a 30 articles 2.060e+01 2.737e+02
## Nb_Moyen_Articlesuperieur a 5 articles 6.665e-01 4.555e-02
## Nb_Moyen_Article_Diffplus de 5 articles -3.044e-01 4.693e-02
## Panier_Moyenmoins de 50 euros -6.030e-02 4.137e-02
## Panier_Moyenplus de 75 euros -1.976e-01 4.255e-02
## Friand_Promo1 -1.640e-01 5.726e-02
## Nb_Univers2 2.005e-01 1.717e-01
## Nb_Univers3 5.156e-01 1.659e-01
## Nb_Univers4 9.463e-01 1.666e-01
## Nb_Univers5 1.356e+00 1.697e-01
## Nb_Famillesuperieur a 5 familles 5.179e-01 6.021e-02
## Nb_Magasin_Achat2 2.437e-01 3.667e-02
## Pct_Remiseinferieur a 5% 2.305e+00 7.980e-02
## Pct_Remisesuperieur a 10% -4.919e-01 4.678e-02
## Taux_De_Marquesuperieur a 0.4% -1.222e-01 3.502e-02
## Mois_CA_Min2 -6.014e-02 7.984e-02
## Mois_CA_Min3 -2.739e-01 8.189e-02
## Mois_CA_Min4 -3.136e-01 7.873e-02
## Mois_CA_Min5 -3.156e-01 7.873e-02
## Mois_CA_Min6 -2.311e-01 7.729e-02
## Mois_CA_Min7 -8.023e-02 7.646e-02
## Mois_CA_Min8 -1.317e-02 7.713e-02
## Mois_CA_Min9 -1.006e-01 7.911e-02
## Mois_CA_Min10 -6.592e-02 7.720e-02
## Mois_CA_Min11 -5.930e-02 7.629e-02
## Mois_CA_Min12 -3.350e-01 7.787e-02
## Mois_CA_Max2 9.656e-02 1.234e-01
## Mois_CA_Max3 -4.345e-02 1.058e-01
## Mois_CA_Max4 3.543e-02 1.071e-01
## Mois_CA_Max5 -1.009e-02 1.065e-01
## Mois_CA_Max6 -1.460e-02 1.098e-01
## Mois_CA_Max7 -1.136e-01 1.213e-01
## Mois_CA_Max8 -2.821e-03 1.344e-01
## Mois_CA_Max9 -7.192e-02 1.193e-01
## Mois_CA_Max10 -8.253e-02 1.224e-01
## Mois_CA_Max11 -1.122e-01 1.172e-01
## Mois_CA_Max12 -1.135e-01 1.103e-01
## JourSemaine_CA_MinJeudi -3.963e-03 6.362e-02
## JourSemaine_CA_MinLundi 1.398e-01 6.283e-02
## JourSemaine_CA_MinMardi 5.096e-02 6.421e-02
## JourSemaine_CA_MinMercredi 6.874e-02 6.413e-02
## JourSemaine_CA_MinSamedi -1.247e-01 6.533e-02
## JourSemaine_CA_MinVendredi -2.978e-02 6.536e-02
## JourSemaine_CA_MaxJeudi -2.074e-01 6.289e-02
## JourSemaine_CA_MaxLundi -1.992e-02 6.983e-02
## JourSemaine_CA_MaxMardi -3.428e-02 6.315e-02
## JourSemaine_CA_MaxMercredi -1.849e-01 6.062e-02
## JourSemaine_CA_MaxSamedi -1.117e-01 5.220e-02
## JourSemaine_CA_MaxVendredi -1.874e-01 5.639e-02
## Heure_CA_Min9 -2.133e+01 4.809e+04
## Heure_CA_Min10 -2.145e+01 4.809e+04
## Heure_CA_Min11 -2.161e+01 4.809e+04
## Heure_CA_Min12 -2.146e+01 4.809e+04
## Heure_CA_Min13 -2.130e+01 4.809e+04
## Heure_CA_Min14 -2.136e+01 4.809e+04
## Heure_CA_Min15 -2.161e+01 4.809e+04
## Heure_CA_Min16 -2.166e+01 4.809e+04
## Heure_CA_Min17 -2.164e+01 4.809e+04
## Heure_CA_Min18 -2.150e+01 4.809e+04
## Heure_CA_Min19 -2.158e+01 4.809e+04
## Heure_CA_Min20 -2.161e+01 4.809e+04
## Heure_CA_Max10 5.671e-02 1.240e-01
## Heure_CA_Max11 -8.815e-02 1.212e-01
## Heure_CA_Max12 -2.898e-01 1.271e-01
## Heure_CA_Max13 -3.462e-01 1.426e-01
## Heure_CA_Max14 -1.568e-01 1.292e-01
## Heure_CA_Max15 -2.478e-01 1.210e-01
## Heure_CA_Max16 -2.306e-01 1.204e-01
## Heure_CA_Max17 -1.542e-01 1.207e-01
## Heure_CA_Max18 -7.622e-02 1.222e-01
## Heure_CA_Max19 -1.023e-01 2.185e-01
## Heure_CA_Max20 -2.979e+00 1.235e+00
## Client_Meme_Ville1 1.918e-01 4.295e-02
## Client_Meme_Dep1 1.231e-01 6.780e-02
## CIVILITEMONSIEUR -2.033e-02 3.174e-02
## VIP1 1.620e+00 4.051e-02
## Annee_Debut_Adhesionadhere avant 2010 -2.003e+01 2.639e+04
## Annee_Debut_Adhesionadhere entre 2010 et 2015 -2.007e+01 2.639e+04
## Annee_Fin_Adhesion2017 2.273e+00 2.213e+00
## Annee_Fin_Adhesion2018 2.023e+00 2.213e+00
## Annee_Fin_Adhesion2019 1.284e+00 2.213e+00
## z value Pr(>|z|)
## (Intercept) 0.000 0.999615
## Etranger1 1.470 0.141660
## Ancien_Client1 0.001 0.999533
## Readherant1 -0.001 0.999374
## CA_TTCmoins de 100 euros 0.014 0.988801
## CA_TTCplus de 300 euros 0.092 0.926486
## Taux_Ticket_Rembsuperieur à 0 0.078 0.937555
## Nb_Remiseinferieur a 5 remises -5.385 7.25e-08 ***
## Nb_Remisesuperieur a 10 remises 15.795 < 2e-16 ***
## Montant_Remisemoins de 10 euros -4.486 7.25e-06 ***
## Montant_Remiseplus de 25 euros 32.571 < 2e-16 ***
## Nb_Ticketsuperieur a 3 tickets 0.091 0.927778
## Quantite_Articleinferieur a 15 articles 0.008 0.993424
## Quantite_Articlesuperieur a 30 articles 0.075 0.939997
## Nb_Moyen_Articlesuperieur a 5 articles 14.633 < 2e-16 ***
## Nb_Moyen_Article_Diffplus de 5 articles -6.487 8.76e-11 ***
## Panier_Moyenmoins de 50 euros -1.458 0.144977
## Panier_Moyenplus de 75 euros -4.644 3.41e-06 ***
## Friand_Promo1 -2.864 0.004178 **
## Nb_Univers2 1.168 0.242708
## Nb_Univers3 3.108 0.001884 **
## Nb_Univers4 5.681 1.34e-08 ***
## Nb_Univers5 7.991 1.34e-15 ***
## Nb_Famillesuperieur a 5 familles 8.601 < 2e-16 ***
## Nb_Magasin_Achat2 6.645 3.03e-11 ***
## Pct_Remiseinferieur a 5% 28.882 < 2e-16 ***
## Pct_Remisesuperieur a 10% -10.515 < 2e-16 ***
## Taux_De_Marquesuperieur a 0.4% -3.489 0.000485 ***
## Mois_CA_Min2 -0.753 0.451362
## Mois_CA_Min3 -3.345 0.000822 ***
## Mois_CA_Min4 -3.984 6.78e-05 ***
## Mois_CA_Min5 -4.009 6.10e-05 ***
## Mois_CA_Min6 -2.990 0.002785 **
## Mois_CA_Min7 -1.049 0.294036
## Mois_CA_Min8 -0.171 0.864403
## Mois_CA_Min9 -1.271 0.203621
## Mois_CA_Min10 -0.854 0.393168
## Mois_CA_Min11 -0.777 0.436911
## Mois_CA_Min12 -4.302 1.69e-05 ***
## Mois_CA_Max2 0.783 0.433764
## Mois_CA_Max3 -0.411 0.681260
## Mois_CA_Max4 0.331 0.740708
## Mois_CA_Max5 -0.095 0.924512
## Mois_CA_Max6 -0.133 0.894242
## Mois_CA_Max7 -0.936 0.349176
## Mois_CA_Max8 -0.021 0.983255
## Mois_CA_Max9 -0.603 0.546654
## Mois_CA_Max10 -0.675 0.499976
## Mois_CA_Max11 -0.957 0.338372
## Mois_CA_Max12 -1.029 0.303563
## JourSemaine_CA_MinJeudi -0.062 0.950333
## JourSemaine_CA_MinLundi 2.224 0.026122 *
## JourSemaine_CA_MinMardi 0.794 0.427459
## JourSemaine_CA_MinMercredi 1.072 0.283743
## JourSemaine_CA_MinSamedi -1.909 0.056198 .
## JourSemaine_CA_MinVendredi -0.456 0.648642
## JourSemaine_CA_MaxJeudi -3.297 0.000976 ***
## JourSemaine_CA_MaxLundi -0.285 0.775484
## JourSemaine_CA_MaxMardi -0.543 0.587217
## JourSemaine_CA_MaxMercredi -3.051 0.002284 **
## JourSemaine_CA_MaxSamedi -2.139 0.032420 *
## JourSemaine_CA_MaxVendredi -3.324 0.000888 ***
## Heure_CA_Min9 0.000 0.999646
## Heure_CA_Min10 0.000 0.999644
## Heure_CA_Min11 0.000 0.999642
## Heure_CA_Min12 0.000 0.999644
## Heure_CA_Min13 0.000 0.999647
## Heure_CA_Min14 0.000 0.999646
## Heure_CA_Min15 0.000 0.999641
## Heure_CA_Min16 0.000 0.999641
## Heure_CA_Min17 0.000 0.999641
## Heure_CA_Min18 0.000 0.999643
## Heure_CA_Min19 0.000 0.999642
## Heure_CA_Min20 0.000 0.999642
## Heure_CA_Max10 0.457 0.647387
## Heure_CA_Max11 -0.727 0.467159
## Heure_CA_Max12 -2.280 0.022627 *
## Heure_CA_Max13 -2.427 0.015212 *
## Heure_CA_Max14 -1.213 0.225052
## Heure_CA_Max15 -2.048 0.040597 *
## Heure_CA_Max16 -1.915 0.055532 .
## Heure_CA_Max17 -1.277 0.201429
## Heure_CA_Max18 -0.624 0.532880
## Heure_CA_Max19 -0.468 0.639489
## Heure_CA_Max20 -2.411 0.015905 *
## Client_Meme_Ville1 4.466 7.96e-06 ***
## Client_Meme_Dep1 1.816 0.069399 .
## CIVILITEMONSIEUR -0.640 0.521978
## VIP1 39.984 < 2e-16 ***
## Annee_Debut_Adhesionadhere avant 2010 -0.001 0.999394
## Annee_Debut_Adhesionadhere entre 2010 et 2015 -0.001 0.999393
## Annee_Fin_Adhesion2017 1.027 0.304471
## Annee_Fin_Adhesion2018 0.914 0.360505
## Annee_Fin_Adhesion2019 0.580 0.561715
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 82690 on 70137 degrees of freedom
## Residual deviance: 24545 on 70044 degrees of freedom
## AIC: 24733
##
## Number of Fisher Scoring iterations: 21
On peut voir par exemple, en analysant les p-values (colonne z-value) que les variables Etranger, Ancien_Client, Readherant ou encore le CA_TTC ne sont statistiquement pas significatives. Cela signifie que ces variables ont une très faible association à la détermination d’un client à fort potentiel.
En ce qui concerne les variables statistiquement significatives, la variable Pct_Remise a la plus petite p-value (-10.515) insinuant une forte association entre la part de remise sur le CA du client avec la probabilité d’être considéré comme un client à fort potentiel.
Le coefficient négatif pour ce prédicteur suggère que toutes les autres variables étant égales, le client ayant bénificié d’un pourcentage de remise supérieur à 10% est moins susceptible d’être considéré comme un client à fort potentiel.
A l’inverse, on peut voir par exemple que un client VIP (p-value = 39.984) ayant bénéficié d’un montant de remise supérieur à 25€ (p-value = 32.571) et acheté un nombre moyen d’article supérieur à 5 articles (p-value = 14.633) est plus susceptible de l’être.
12.1.2.2 Analyse de la table de déviance
L’affichage de la table de déviance se fait grâce à la fonction anova()
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: Client_With_Potential
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 70137 82690
## Etranger 1 5 70136 82685 0.0299122 *
## Ancien_Client 1 1 70135 82684 0.3729094
## Readherant 1 1 70134 82683 0.2582085
## CA_TTC 2 37739 70132 44944 < 2.2e-16 ***
## Taux_Ticket_Remb 1 1 70131 44943 0.3297070
## Nb_Remise 2 3524 70129 41420 < 2.2e-16 ***
## Montant_Remise 2 222 70127 41197 < 2.2e-16 ***
## Nb_Ticket 1 4419 70126 36778 < 2.2e-16 ***
## Quantite_Article 2 6530 70124 30248 < 2.2e-16 ***
## Nb_Moyen_Article 1 238 70123 30010 < 2.2e-16 ***
## Nb_Moyen_Article_Diff 1 9 70122 30000 0.0023190 **
## Panier_Moyen 2 12 70120 29988 0.0020488 **
## Friand_Promo 1 252 70119 29736 < 2.2e-16 ***
## Nb_Univers 4 456 70115 29281 < 2.2e-16 ***
## Nb_Famille 1 109 70114 29172 < 2.2e-16 ***
## Nb_Magasin_Achat 1 68 70113 29104 < 2.2e-16 ***
## Pct_Remise 2 2159 70111 26945 < 2.2e-16 ***
## Taux_De_Marque 1 135 70110 26810 < 2.2e-16 ***
## Mois_CA_Min 11 101 70099 26709 < 2.2e-16 ***
## Mois_CA_Max 11 25 70088 26684 0.0082552 **
## JourSemaine_CA_Min 6 32 70082 26652 1.448e-05 ***
## JourSemaine_CA_Max 6 24 70076 26628 0.0004828 ***
## Heure_CA_Min 12 76 70064 26552 2.886e-11 ***
## Heure_CA_Max 11 58 70053 26494 1.972e-08 ***
## Client_Meme_Ville 1 25 70052 26469 6.909e-07 ***
## Client_Meme_Dep 1 2 70051 26467 0.1187243
## CIVILITE 1 4 70050 26463 0.0475487 *
## VIP 1 1741 70049 24721 < 2.2e-16 ***
## Annee_Debut_Adhesion 2 0 70047 24721 0.7844834
## Annee_Fin_Adhesion 3 176 70044 24545 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La différence entre la déviance nulle et la déviance résiduelle montre comment notre modèle se comporte par rapport au modèle nul (un modèle avec seulement l’intercept). En effet, cette variation de vraisemblance entre le modèle parfait et le modèle nul se nomme la déviance résiduelle du modèle nul. Plus cet écart est grand, mieux c’est. En analysant le tableau, nous pouvons voir la baisse de la déviance lors de l’ajout de chaque variable à la fois. Encore une fois, on peut voir qu’à l’ajout de la variable CA_TTC réduit considérablement (divisé par 2 - passage de 82683 à 44944) la déviance résiduelle.
12.2 On enchaine avec les arbres de décision
Après avoir lancé une regression logistique sur les données, nous trouvons intéressant d’interpréter les résultats fournis par un autre modèle supervisé, l’arbre de décision. Nous allons utilisé l’algorithme CART pour cette étude, qui est l’algorithme le plus utilisé, le plus simple pour obtenir des prédictions et les résultats sous forme de règles qui en sort sont facilement interprétable (décision binaire).
12.2.1 Entrainons le modèle !
L’implémentation de l’arbre de classification CART s’effectue via la fonction rpart() provenant du package du même nom.
De la même manière que pour la régression logistique précédemment, l’ajustement du modèle va s’effectuer sur les données d’entrainement (tdata). Petite précision, les échantillons d’apprentissage et de test sont identiques à ceux utilisés dans la régression logistique.
tree <- rpart(Client_With_Potential ~ ., data = tdata, control = rpart.control(cp = 0.0001))À cette étape, nous ne nous soucions pas des performances de l’algorithme. C’est pour cela, que nous ajustons le modèle avec les paramètres par défaut. C’est le paramètre CP (Complexity Parameter) qui est utilisé pour contrôler la taille de l’arbre. Si le coût d’ajout d’une variable est supérieur à la valeur de CP, la croissance de l’arborescence s’arrête.
12.2.2 Recherche de la meilleure profondeur : Pruning
L’idée ici est de limiter le surapprentissage, d’éviter dès le départ que notre algorithme performe de trop. Pour ce faire, nous allons observer les valeurs de CP pour chaque taille d’arbre et choisir celle qui minimise l’erreur relative.
bestcp <- tree$cptable[which.min(tree$cptable[,4]),1]Valeur :
## [1] 0.001031832
Ajustons le modèle avec la valeur de CP optimale récupérée.
tree.pruned <- prune(tree, cp = bestcp)12.2.3 Analyse des variables importantes
Analysons maintenant les variables importantes du modèle nous permettant de faire ressortir les variables qui définissent un client à fort potentiel.
## Overall
## CA_TTC 11971.99974
## Friand_Promo 80.26146
## JourSemaine_CA_Max 10.20277
## JourSemaine_CA_Min 18.40264
## Mois_CA_Min 30.94077
## Montant_Remise 6878.55537
## Nb_Famille 1313.58991
## Nb_Remise 2748.40923
## Nb_Ticket 9893.29674
## Nb_Univers 1053.00028
## Panier_Moyen 160.45133
## Pct_Remise 390.68889
## Quantite_Article 15187.99115
## VIP 10613.77834
## Etranger 0.00000
## Ancien_Client 0.00000
## Readherant 0.00000
## Taux_Ticket_Remb 0.00000
## Nb_Moyen_Article 0.00000
## Nb_Moyen_Article_Diff 0.00000
## Nb_Magasin_Achat 0.00000
## Taux_De_Marque 0.00000
## Mois_CA_Max 0.00000
## Heure_CA_Min 0.00000
## Heure_CA_Max 0.00000
## Client_Meme_Ville 0.00000
## Client_Meme_Dep 0.00000
## CIVILITE 0.00000
## Annee_Debut_Adhesion 0.00000
## Annee_Fin_Adhesion 0.00000
On retrouve dans ce tableau l’overall calculé pour chaque item de variables. Plus l’overall est élevé, plus les variables ont un impact important dans la modélisation.
Comme précédemment dans la régression logistique, nous pouvons voir que les variables Etranger, Ancien_Client, Readherant ont un faible voire aucun impact dans la définition d’un client à fort potentiel.
À l’inverse, les variables Quantite_Article , VIP et contrairement à la regresion logistique la variable CA_TTC ont un impact important.
12.2.4 L’arbre dans toute sa splendeur
Nous retrouvons l’ensemble des règles permettant de définir ce qu’est un client à fort potentiel.
Un client avec un CA_TTC supérieur à 300 euros en ayant effectué plus de 3 achats avec une quantité d’articles achetée supérieur à 30 articles dans l’année à davantage de change d’être considéré comme un client à fort potentiel.
Après avoir analyser et interpréter les résultats de ces deux algorithmes, nous allons étudier leurs performances pour choisir l’algorithme le plus performant pour notre étude.
13 Performances des deux modèles
Après avoir analysé et interprété les différents résultats en sortie des deux approches de modélisation précédentes, nous consacrons cette partie à la comparaison de leurs performances.
13.1 Régression logistique
Dans les étapes ci-dessus, nous avons brièvement évalué l’ajustement du modèle, maintenant nous aimerions voir comment le modèle est en train de prédire notre variable cible sur un nouvel ensemble de données.
Nous appliquons notre modèle sur le dataframe de test avec une limite de décision de 0.5 (valeur par défaut).
13.1.1 Prédiction sur le modèle de test
reglog.results <- predict(reglog.tune,vdata)13.1.2 Calcul de la précision
Nous calculons maintenant la précision de notre modèle appliqué sur les données de test.
## [1] 0.9069469
La précision de notre modèle d’environ 0.91 sur l’ensemble des données de test est un très bon résultat. Cependant,ce résultat est quelque peu dépendant de la division manuelle des données que nous avons faites plus tôt, donc si nous souhaitons davantage un score plus précis, une solution serait d’effectuer une sorte de validation croisée comme k-fold validation.
13.1.3 ROC comme métrique de performances
Comme dernière étape, nous allons visualiser la courbe de ROC et calculer l’AUC (Area Under the Curve) qui sont des mesures de performance typiques pour un classificateur binaire.
La courbe de ROC est généré en affichant les vrais positives rate (TPR) contre les faux positives rate (FPR).
On peut voir que le modèle détient une bonne abilité de prédiction avec une AUC de 0.87.
13.2 Arbre de décision
On effectue le même principe pour l’arbre de décision.
13.2.1 Prédiction sur le modèle de test
cart.pred <- predict(tree.pruned,vdata)13.2.2 Affichage de la matrice de confusion et calcul de la précision
| Pred:0 | Pred:1 | |
|---|---|---|
| Actual:0 | 19429 | 551 |
| Actual:1 | 2231 | 7651 |
Nous remarquons que l’algorithme CART d’arbre de décision classe assez bien les deux classes. Les effectifs qui ont été mal prédits réprésentent uniquement environ 10% des données globales.
En termes de précision, les deux modèles ont donc tous les deux, de grandes capacités de prédiction.
13.2.3 ROC comme métrique de performances
On peut voir que la valeur de l’AUC pour l’arbre de décision CART (0.96) est sensiblement proche de celui de la régression logistique.
14 Recommandations marketing en réponse à la problématique
Pour ces recommandations, nous allons nous baser sur les interprétations des variables effectuées de la Régression Logistique car les performances du modèle d’arbre sont trop élevé. Il doit y avoir surapprentissage.
En fonction des résultats et des analyses en sortie que nous avons à notre disposition, les recommandations vont s’accentuer sur deux axes :
- Recherche de nouveaux futurs clients à fort potentiel
- Fidélisation du coeur de cible actuel de la marque
14.1 Augmenter la clientèle à potentielle chez les 20-35 ans
Cette tranche d’âge étant en sous-effectif (environ 10%) par rapport au reste de la clientèle qui se situe principalement entre 35 et 65 ans, il nous semble intéressant de faire le nécessaire en se basant sur les résultats obtenues (partie pour que ces personnes soit attirés par notre marque et puisse devenir par la suite des clients à fort potentiel.
Quelques exemples possibles :
- Animations sur les réseaux sociaux (Facebook, Pinterest, Twitter) avec des conseils, des animations, des vidéos, des jeux concours et des offres promotions spéciales en fonction du canal (exemple Twitter canal pour les jeunes : bénéficiez « d’un code de réduction de -15% avec le code promo suivant… »)
- Participer à des événements pour sensibiliser les clients à l’agriculture biologique disponible chez Botanic (semaine du jardinage dans les écoles, idem pour les entreprises…)
- Proposition de visite d’espaces aménagés (jardins, appartements ou en magasin) avec les nouveaux produits fraîchement arrivés grâce à la réalité virtuelle – VR
- Services en lignes Chatbot pour venir en aide aux jeunes clients ne sachant pas forcément quoi choisir / Application comme IKEA (visualiser en avance les produits) permet de savoir ce qu’il y a en avance, peut éviter les déplacements en magasin
- Optimiser le site internet pour une clientèle plus jeune (changer l’ergonomie du site) et en faire un site marchand (on peut par exemple imaginer un partenariat avec Amazon Prime car les jeunes aiment être livrés rapidement et gagner du temps.) Idem pour l’application Smartphone
- Ouvrir des magasins en Ile-de-France là où le nombre de jeune est très élevé avec des produits orientés clientèle jeune urbaine (rayon animalerie pour les chats, et plantes d’appartement à développer)
14.2 Fidélisation du coeur de cible actuel
Nous ne pouvons pas délaissé la clientèle actuelle (tranche d’âge 35-65 ans). Il faut continuer à fidéliser davantage les clients à fort potentiel pour éviter qu’il ne le soit plus dans le long termes, tout en faisant en sorte que des clients qui ne le sont pas le deviennent.
Les démarches envisageables:
- Proposer la carte VIP en leur expliquant les intérêts d’une souscription. Proposer la carte gratuite pendant 1 mois après envoi d’un mail ou courrier personnalisé
- Points des clients x2 lors des achats de solutions naturelles ou pendant la période hors mois mars à juin (forte saisonnalité) + Crédit de points fidélité x2 à l’ouverture d’un compte VIP valable pendant 6 mois
- Proposer l’installation de l’application Smartphone qui aura été optimisée pour recevoir le catalogue mensuel, des promotions spéciales, acheter des articles, avoir des conseils sur l’entretien des produits et l’échange personnalisé avec des conseillers, création d’une communauté pour échanger sur les conseils produits
- Améliorer le site internet en y ajoutant des conseils pour les produits référencés avec un moteur de recherche pour trouver facilement les articles. Proposer ensuite avec un algorithme permettant la suggestion de plantes à acheter en rapport avec les pages visitées
- Faire du cross-selling : Bénéficiez de -50% sur l’achat d’un 3eme article issu de l’univers animalerie
- Jeux concours sur Pinterest et sur le site internet proposant de récompenser les plus belles mises en valeur de produits Botanic. 1 an de carte VIP gratuite pour les 3 premiers (les faire participer)
15 Auto-critique de notre étude et axes d’amélioration
Nous ajoutons cette partie à notre rapport car nous pensons qu’il est important de divulguer les “failles” de notre étude pour proposer des axes d’améliorations par la suite pour augmenter davantage la qualité de celle-ci.
Avant d’aller plus loin, un point sur les données à notre disposition. Nous estimons que celles-ci n’ont pas été un obstacle pour nous à l’exploitation après avoir éclairci certains points dans la définition de certains champs.
Attaquons nous maintenant à la partie critique sur la modélisation.
Nous trouvons que la valeur d’aire sous la courbe mettant en avant les performances du modèle est vraiment proche du modèle parfait pour l’arbre de décision. Il doit y avoir du surapprentissage. Pour traiter ce surapprentissage, nous pouvons par exemple, tester un autre algorithme : CHAID qui permet davantage de contrôle sur la taille de l’arbre pour éviter cela.
Nous pouvons aussi utiliser l’algorithme PCA avant de lancer toute modélisation pour réduire le nombre de variables au lieu de le faire manuellement en analysant la corrélation entre les variables.
16 Annexe : Ajustement d’un modèle d’apprentissage non supervisée - K-means
Avant de nous lancer sur la création de la variable cible pour les méthodes supervisés, nous avons tenté d’appliquer l’algorithme de clustering K-means, pour mettre en évidence les classes qui peuvent exister à partir des données.
Cet algorithme s’applique uniquement sur des variables quantitatives. Nous sommes donc limité à ce type de variables.
L’algorithme a été déroulé plusieurs fois. Les graphes ci-dessus représentent 2 lancements avec un nombre de clusters égal à 2 puis à 5.
Aucun paramétrage n’a pu aboutir à la segmentation en groupes globalement distincs. L’application de cet algorithme ne donne aucun résultat satisfaisant.