Projet Transverse

BOUAZZA Khaled - CHOLVY Olivier - DINAR Rayan

2018-05-18

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.

  1. 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.

  1. 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)] <- 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 .

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           : 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.

10 Statistiques descriptives

10.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.

10.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.

##     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.

11 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.

11.1 Suppression des clients avec un CA négatif

by_client <- by_client[by_client$CA_TTC > 0,]

11.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,]

11.3 Suppression des clients ayant une quantité d’articles achetée négative

by_client <- by_client[by_client$Quantite_Article > 0,]

11.4 Suppression des clients ayant une marge de sortie négative

by_client <- by_client[by_client$MargeSortie > 0,]

11.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 reste plus que 494504 sur

12 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
  • Effectué au moins 5 achats
  • ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##   1.000   2.000   4.000   6.128   8.000 329.000
  • Acheté une quantité d’articles supérieur à 40
  • ##     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.

13 Préparation des données pour modélisation

13.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)]

13.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 .

13.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       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.

13.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%

13.4.1 Echantillon d’apprentissage (70% des données)

Classe Effectif
0 50384
1 19257

13.4.2 Echantillon de test (30% des données)

Classe Effectif
0 22031
1 8328

14 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.

14.1 La régression logistique en premier lieu

14.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.

14.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).

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)

14.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.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.

14.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                                  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.

15 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).

15.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.

15.2 Recherche de la meilleure taille : 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.0005712209

Ajustons le modèle avec la valeur de CP optimale récupérée.

tree.pruned <- prune(tree, cp = bestcp)

15.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                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.

16 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.

16.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).

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”.

16.2 Arbre de décision

On effectue le même principe pour l’arbre de décision.

16.2.1 Prédiction sur le modèle de test

cart.pred <-  predict(tree.pruned,vdata)

16.2.2 Affichage de la matrice de confusion et calcul de la précision

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.

16.2.3 Plot graphique ROC

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.

17 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 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 :

  1. Recherche de nouveaux futurs clients à fort potentiel
  2. Fidélisation du coeur de cible actuel de la marque

17.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’espace aménagé (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)

17.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)

18 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 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.

19 Clustering : K-Means

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.