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.
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 :
Nous détaillerons davantage, par la suite, le périmètre d’analyse dans la présentantion de l’entreprise.
Comme énoncé précédemment, les données sont réparties en 5 tables :
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.
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.
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.
Les produits les plus vendus par Botanic sont des produits d’extérieur (plantes, fleurs, etc…) de l’univers jardinerie
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 :
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 »
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 :
Ces variables seront utilisées et traitées au moment de la construction de nos indicateurs.
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)
## 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” .
## 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.
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)] <- NA
Cependant, 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 .
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.
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.
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.
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 : num 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 ...
## $ ClientMemeVille : chr "Non" "Non" "Non" "Non" ...
## $ ClientMemeDep : chr "Oui" "Oui" "Oui" "Oui" ...
## $ 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.
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.
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.
## 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.0 107.5 188.5 239.6 323.9 10231.8
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.76 410.85 697.29 846.24 1068.11 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.
## 1.000 2.000 3.000 4.459 6.000 281.000
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 6.00 10.00 12.93 16.00 329.00
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.50 37.84 57.83 78.19 90.81 6118.50
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.50 36.80 56.80 74.28 89.80 2390.16
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.76 42.09 61.69 94.11 95.20 6118.50
Aucune différence 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 aux autres 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).
Dans tout ce qui suit on adoptera 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.
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.
by_client <- by_client[by_client$CA_TTC > 0,]
by_client <- by_client[by_client$CA_TTC > by_client$Montant_Remise,]
by_client <- by_client[by_client$Quantite_Article > 0,]
by_client <- by_client[by_client$MargeSortie > 0,]
by_client <- by_client[by_client$Montant_Remise > 0,]
Après ces modifications, le nombre de clients se réduit, il ne nous reste plus que 494504 sur
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 :
## 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 | 72415 |
| 1 | 27585 |
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.
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)]
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 .
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 ClientMemeVille ClientMemeDep
## 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.
Nous avons séparé notre échantillon de données en deux sous-échantillions:
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%
| Classe | Effectif |
|---|---|
| 0 | 50384 |
| 1 | 19257 |
| Classe | Effectif |
|---|---|
| 0 | 22031 |
| 1 | 8328 |
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 :
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.
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.
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).
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)
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.1488 0.0000 0.0000 0.1568 2.7771
##
## Coefficients:
## Estimate Std. Error
## (Intercept) -2.586e+01 1.024e+04
## Etranger1 2.087e-01 1.446e-01
## Ancien_Client1 2.084e+01 4.349e+04
## Readherant1 -2.068e+01 3.153e+04
## CA_TTCmoins de 100 euros 5.240e+00 3.717e+02
## CA_TTCplus de 300 euros 2.031e+01 2.212e+02
## Taux_Ticket_Rembsuperieur à 0 2.051e-04 7.936e-01
## Nb_Remiseinferieur a 5 remises -2.958e-01 5.381e-02
## Nb_Remisesuperieur a 10 remises 6.617e-01 4.274e-02
## Montant_Remisemoins de 10 euros -2.678e-01 6.115e-02
## Montant_Remiseplus de 25 euros 2.488e+00 7.819e-02
## Nb_Ticketsuperieur a 3 tickets 1.975e+01 2.191e+02
## Quantite_Articleinferieur a 15 articles 3.001e+00 3.618e+02
## Quantite_Articlesuperieur a 30 articles 2.061e+01 2.753e+02
## Nb_Moyen_Articlesuperieur a 5 articles 6.390e-01 4.562e-02
## Nb_Moyen_Article_Diffplus de 5 articles -2.794e-01 4.694e-02
## Panier_Moyenmoins de 50 euros -1.187e-01 4.144e-02
## Panier_Moyenplus de 75 euros -2.614e-01 4.270e-02
## Friand_Promo1 -1.999e-01 5.761e-02
## Nb_Univers2 -6.691e-03 1.770e-01
## Nb_Univers3 3.933e-01 1.714e-01
## Nb_Univers4 8.494e-01 1.720e-01
## Nb_Univers5 1.263e+00 1.750e-01
## Nb_Famillesuperieur a 5 familles 3.993e-01 6.101e-02
## Nb_Magasin_Achat2 2.606e-01 3.667e-02
## Pct_Remiseinferieur a 5% 2.278e+00 7.866e-02
## Pct_Remisesuperieur a 10% -4.312e-01 4.723e-02
## Taux_De_Marquesuperieur a 0.4% -1.611e-01 3.501e-02
## Mois_CA_Min2 4.610e-02 8.017e-02
## Mois_CA_Min3 -1.518e-01 8.307e-02
## Mois_CA_Min4 -2.074e-01 7.896e-02
## Mois_CA_Min5 -3.131e-01 7.796e-02
## Mois_CA_Min6 -2.319e-01 7.678e-02
## Mois_CA_Min7 -5.687e-03 7.630e-02
## Mois_CA_Min8 4.213e-02 7.713e-02
## Mois_CA_Min9 -6.352e-03 7.877e-02
## Mois_CA_Min10 -8.929e-03 7.732e-02
## Mois_CA_Min11 -5.912e-02 7.561e-02
## Mois_CA_Min12 -3.131e-01 7.751e-02
## Mois_CA_Max2 2.114e-01 1.223e-01
## Mois_CA_Max3 1.421e-01 1.050e-01
## Mois_CA_Max4 1.718e-01 1.060e-01
## Mois_CA_Max5 1.058e-01 1.056e-01
## Mois_CA_Max6 1.221e-01 1.089e-01
## Mois_CA_Max7 1.870e-01 1.215e-01
## Mois_CA_Max8 1.477e-01 1.341e-01
## Mois_CA_Max9 7.886e-02 1.182e-01
## Mois_CA_Max10 1.108e-01 1.204e-01
## Mois_CA_Max11 1.300e-01 1.176e-01
## Mois_CA_Max12 3.866e-02 1.094e-01
## JourSemaine_CA_MinJeudi 2.637e-02 6.359e-02
## JourSemaine_CA_MinLundi 1.196e-01 6.267e-02
## JourSemaine_CA_MinMardi 5.455e-02 6.399e-02
## JourSemaine_CA_MinMercredi 4.364e-02 6.384e-02
## JourSemaine_CA_MinSamedi -1.082e-01 6.499e-02
## JourSemaine_CA_MinVendredi -5.107e-02 6.539e-02
## JourSemaine_CA_MaxJeudi -1.825e-01 6.277e-02
## JourSemaine_CA_MaxLundi 7.640e-03 6.992e-02
## JourSemaine_CA_MaxMardi 3.900e-02 6.340e-02
## JourSemaine_CA_MaxMercredi -1.244e-01 6.066e-02
## JourSemaine_CA_MaxSamedi -5.104e-02 5.216e-02
## JourSemaine_CA_MaxVendredi -1.113e-01 5.664e-02
## Heure_CA_Min9 -1.874e+01 1.024e+04
## Heure_CA_Min10 -1.895e+01 1.024e+04
## Heure_CA_Min11 -1.907e+01 1.024e+04
## Heure_CA_Min12 -1.887e+01 1.024e+04
## Heure_CA_Min13 -1.885e+01 1.024e+04
## Heure_CA_Min14 -1.880e+01 1.024e+04
## Heure_CA_Min15 -1.902e+01 1.024e+04
## Heure_CA_Min16 -1.913e+01 1.024e+04
## Heure_CA_Min17 -1.905e+01 1.024e+04
## Heure_CA_Min18 -1.897e+01 1.024e+04
## Heure_CA_Min19 -1.914e+01 1.024e+04
## Heure_CA_Min20 -1.949e+01 1.024e+04
## Heure_CA_Max10 -1.563e-01 1.268e-01
## Heure_CA_Max11 -2.839e-01 1.240e-01
## Heure_CA_Max12 -3.384e-01 1.302e-01
## Heure_CA_Max13 -4.373e-01 1.454e-01
## Heure_CA_Max14 -2.477e-01 1.329e-01
## Heure_CA_Max15 -3.331e-01 1.240e-01
## Heure_CA_Max16 -3.180e-01 1.238e-01
## Heure_CA_Max17 -2.519e-01 1.241e-01
## Heure_CA_Max18 -2.867e-01 1.251e-01
## Heure_CA_Max19 -1.446e-01 2.219e-01
## Heure_CA_Max20 -2.555e+00 1.396e+00
## ClientMemeVilleOui 2.090e-01 4.322e-02
## ClientMemeDepOui 1.428e-01 6.872e-02
## CIVILITEMONSIEUR -2.561e-02 3.180e-02
## VIP1 1.605e+00 4.060e-02
## Annee_Debut_Adhesionadhere avant 2010 -1.991e+01 3.153e+04
## Annee_Debut_Adhesionadhere entre 2010 et 2015 -1.999e+01 3.153e+04
## Annee_Fin_Adhesion2017 6.869e-01 1.188e+00
## Annee_Fin_Adhesion2018 4.132e-01 1.187e+00
## Annee_Fin_Adhesion2019 -3.009e-01 1.189e+00
## z value Pr(>|z|)
## (Intercept) -0.003 0.99799
## Etranger1 1.443 0.14902
## Ancien_Client1 0.000 0.99962
## Readherant1 -0.001 0.99948
## CA_TTCmoins de 100 euros 0.014 0.98875
## CA_TTCplus de 300 euros 0.092 0.92686
## Taux_Ticket_Rembsuperieur à 0 0.000 0.99979
## Nb_Remiseinferieur a 5 remises -5.498 3.84e-08 ***
## Nb_Remisesuperieur a 10 remises 15.481 < 2e-16 ***
## Montant_Remisemoins de 10 euros -4.379 1.19e-05 ***
## Montant_Remiseplus de 25 euros 31.822 < 2e-16 ***
## Nb_Ticketsuperieur a 3 tickets 0.090 0.92816
## Quantite_Articleinferieur a 15 articles 0.008 0.99338
## Quantite_Articlesuperieur a 30 articles 0.075 0.94033
## Nb_Moyen_Articlesuperieur a 5 articles 14.008 < 2e-16 ***
## Nb_Moyen_Article_Diffplus de 5 articles -5.951 2.66e-09 ***
## Panier_Moyenmoins de 50 euros -2.865 0.00417 **
## Panier_Moyenplus de 75 euros -6.121 9.30e-10 ***
## Friand_Promo1 -3.470 0.00052 ***
## Nb_Univers2 -0.038 0.96984
## Nb_Univers3 2.295 0.02175 *
## Nb_Univers4 4.937 7.92e-07 ***
## Nb_Univers5 7.216 5.36e-13 ***
## Nb_Famillesuperieur a 5 familles 6.546 5.92e-11 ***
## Nb_Magasin_Achat2 7.108 1.18e-12 ***
## Pct_Remiseinferieur a 5% 28.958 < 2e-16 ***
## Pct_Remisesuperieur a 10% -9.130 < 2e-16 ***
## Taux_De_Marquesuperieur a 0.4% -4.600 4.22e-06 ***
## Mois_CA_Min2 0.575 0.56523
## Mois_CA_Min3 -1.828 0.06759 .
## Mois_CA_Min4 -2.627 0.00862 **
## Mois_CA_Min5 -4.016 5.93e-05 ***
## Mois_CA_Min6 -3.021 0.00252 **
## Mois_CA_Min7 -0.075 0.94059
## Mois_CA_Min8 0.546 0.58498
## Mois_CA_Min9 -0.081 0.93572
## Mois_CA_Min10 -0.115 0.90806
## Mois_CA_Min11 -0.782 0.43429
## Mois_CA_Min12 -4.039 5.36e-05 ***
## Mois_CA_Max2 1.728 0.08395 .
## Mois_CA_Max3 1.354 0.17571
## Mois_CA_Max4 1.621 0.10496
## Mois_CA_Max5 1.002 0.31652
## Mois_CA_Max6 1.121 0.26210
## Mois_CA_Max7 1.539 0.12388
## Mois_CA_Max8 1.102 0.27057
## Mois_CA_Max9 0.667 0.50466
## Mois_CA_Max10 0.920 0.35736
## Mois_CA_Max11 1.105 0.26899
## Mois_CA_Max12 0.353 0.72384
## JourSemaine_CA_MinJeudi 0.415 0.67835
## JourSemaine_CA_MinLundi 1.908 0.05638 .
## JourSemaine_CA_MinMardi 0.852 0.39397
## JourSemaine_CA_MinMercredi 0.684 0.49424
## JourSemaine_CA_MinSamedi -1.665 0.09591 .
## JourSemaine_CA_MinVendredi -0.781 0.43476
## JourSemaine_CA_MaxJeudi -2.907 0.00364 **
## JourSemaine_CA_MaxLundi 0.109 0.91298
## JourSemaine_CA_MaxMardi 0.615 0.53840
## JourSemaine_CA_MaxMercredi -2.051 0.04028 *
## JourSemaine_CA_MaxSamedi -0.978 0.32789
## JourSemaine_CA_MaxVendredi -1.965 0.04940 *
## Heure_CA_Min9 -0.002 0.99854
## Heure_CA_Min10 -0.002 0.99852
## Heure_CA_Min11 -0.002 0.99851
## Heure_CA_Min12 -0.002 0.99853
## Heure_CA_Min13 -0.002 0.99853
## Heure_CA_Min14 -0.002 0.99854
## Heure_CA_Min15 -0.002 0.99852
## Heure_CA_Min16 -0.002 0.99851
## Heure_CA_Min17 -0.002 0.99852
## Heure_CA_Min18 -0.002 0.99852
## Heure_CA_Min19 -0.002 0.99851
## Heure_CA_Min20 -0.002 0.99848
## Heure_CA_Max10 -1.233 0.21752
## Heure_CA_Max11 -2.288 0.02212 *
## Heure_CA_Max12 -2.599 0.00934 **
## Heure_CA_Max13 -3.007 0.00264 **
## Heure_CA_Max14 -1.864 0.06237 .
## Heure_CA_Max15 -2.685 0.00725 **
## Heure_CA_Max16 -2.569 0.01019 *
## Heure_CA_Max17 -2.030 0.04232 *
## Heure_CA_Max18 -2.293 0.02187 *
## Heure_CA_Max19 -0.651 0.51476
## Heure_CA_Max20 -1.831 0.06716 .
## ClientMemeVilleOui 4.834 1.33e-06 ***
## ClientMemeDepOui 2.077 0.03776 *
## CIVILITEMONSIEUR -0.805 0.42058
## VIP1 39.539 < 2e-16 ***
## Annee_Debut_Adhesionadhere avant 2010 -0.001 0.99950
## Annee_Debut_Adhesionadhere entre 2010 et 2015 -0.001 0.99949
## Annee_Fin_Adhesion2017 0.578 0.56312
## Annee_Fin_Adhesion2018 0.348 0.72777
## Annee_Fin_Adhesion2019 -0.253 0.80014
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 82125 on 69640 degrees of freedom
## Residual deviance: 24443 on 69547 degrees of freedom
## AIC: 24631
##
## 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 (-9.026) 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.845) ayant bénéficié d’un montant de remise supérieur à 25€ (p-value = 31.861) et acheté un nombre moyen d’article supérieur à 5 articles (p-value = 13.902) est plus susceptible de l’être.
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 69640 82125
## Etranger 1 11 69639 82115 0.001076 **
## Ancien_Client 1 0 69638 82115 0.839765
## Readherant 1 1 69637 82113 0.258182
## CA_TTC 2 37622 69635 44491 < 2.2e-16 ***
## Taux_Ticket_Remb 1 1 69634 44491 0.461744
## Nb_Remise 2 3400 69632 41090 < 2.2e-16 ***
## Montant_Remise 2 205 69630 40885 < 2.2e-16 ***
## Nb_Ticket 1 4373 69629 36513 < 2.2e-16 ***
## Quantite_Article 2 6522 69627 29991 < 2.2e-16 ***
## Nb_Moyen_Article 1 205 69626 29786 < 2.2e-16 ***
## Nb_Moyen_Article_Diff 1 7 69625 29779 0.007808 **
## Panier_Moyen 2 20 69623 29758 4.102e-05 ***
## Friand_Promo 1 249 69622 29510 < 2.2e-16 ***
## Nb_Univers 4 508 69618 29002 < 2.2e-16 ***
## Nb_Famille 1 62 69617 28939 3.189e-15 ***
## Nb_Magasin_Achat 1 82 69616 28857 < 2.2e-16 ***
## Pct_Remise 2 2084 69614 26773 < 2.2e-16 ***
## Taux_De_Marque 1 154 69613 26619 < 2.2e-16 ***
## Mois_CA_Min 11 104 69602 26514 < 2.2e-16 ***
## Mois_CA_Max 11 24 69591 26490 0.012968 *
## JourSemaine_CA_Min 6 28 69585 26462 9.477e-05 ***
## JourSemaine_CA_Max 6 19 69579 26443 0.004063 **
## Heure_CA_Min 12 71 69567 26372 2.141e-10 ***
## Heure_CA_Max 11 28 69556 26344 0.003111 **
## ClientMemeVille 1 29 69555 26315 6.166e-08 ***
## ClientMemeDep 1 3 69554 26312 0.087443 .
## CIVILITE 1 5 69553 26307 0.026264 *
## VIP 1 1693 69552 24614 < 2.2e-16 ***
## Annee_Debut_Adhesion 2 1 69550 24612 0.485312
## Annee_Fin_Adhesion 3 169 69547 24443 < 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 82364 à 44526) la déviance résiduelle.
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).
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.
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.0005712209
Ajustons le modèle avec la valeur de CP optimale récupérée.
tree.pruned <- prune(tree, cp = bestcp)
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 11951.554549
## Friand_Promo 76.408281
## Heure_CA_Max 26.422255
## Heure_CA_Min 45.948096
## JourSemaine_CA_Max 33.233552
## JourSemaine_CA_Min 5.496239
## Mois_CA_Max 24.536690
## Mois_CA_Min 67.400988
## Montant_Remise 6671.729718
## Nb_Famille 1114.005386
## Nb_Magasin_Achat 3.778525
## Nb_Moyen_Article 29.388058
## Nb_Moyen_Article_Diff 7.503985
## Nb_Remise 2651.154040
## Nb_Ticket 9804.167174
## Nb_Univers 1075.456265
## Panier_Moyen 179.128880
## Pct_Remise 482.664500
## Quantite_Article 15072.782985
## Taux_De_Marque 5.121206
## VIP 10524.287707
## Etranger 0.000000
## Ancien_Client 0.000000
## Readherant 0.000000
## Taux_Ticket_Remb 0.000000
## ClientMemeVille 0.000000
## ClientMemeDep 0.000000
## CIVILITE 0.000000
## Annee_Debut_Adhesion 0.000000
## Annee_Fin_Adhesion 0.000000
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.
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.
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.
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).
reglog.results <- predict(reglog.tune,vdata)
Nous calculons maintenant la précision de notre modèle appliqué sur les données de test.
print(paste('Accuracy',1-misClasificError))
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.
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.97. Il se rapproche du modèle “idéal”.
On effectue le même principe pour l’arbre de décision.
cart.pred <- predict(tree.pruned,vdata)
| Pred:0 | Pred:1 | |
|---|---|---|
| Actual:0 | 19793 | 594 |
| Actual:1 | 2238 | 7734 |
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.
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.
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 sont légèrement plus élevées.
En fonction des résultats et des analyses en sortie que nous avons à notre disposition, les recommandations vont s’accentuer sur deux axes :
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 :
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:
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 les valeurs d’aire sous la courbe mettant en avant les performances du modèle sont vraiment proche du modèle parfait. Il doit y avoir du surapprentissage. Pour traiter ce surapprentissage, nous pouvons par exemple, pour les arbres de décision, 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.
Essayons d’appliquer l’algorithme K-Means qui est un algorithme de clustering pour réaliser des analyses non supervisées.
Le but est d’identifier un pattern au sein des données et de regrouper les individus ayant des caractéristiques similaires.
C’est un algorithme qui s’applique sur des variables quantitatives uniquement. Nous allons donc nous limiter à ce type de variables.