Projet Transverse

BOUAZZA Khaled - CHOLVY Olivier - DINAR Rayan

2018-06-03

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  36 variables:
##  $ Age                      : num  NA 58 68 78 NA NA NA 77 NA 50 ...
##  $ Etranger                 : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Ancien_Client            : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ Readherant               : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ CA_TTC                   : num  329 200 1626 204 732 ...
##  $ CA_HT                    : num  289 171 1381 186 634 ...
##  $ Nb_Ticket_Remb           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Marge_Sortie             : num  147.1 75.8 617.1 100 271.3 ...
##  $ Nb_Remise                : int  11 10 37 1 22 5 1 12 27 11 ...
##  $ Montant_Remise           : num  28.63 21.12 174 4.43 55.8 ...
##  $ Nb_Ticket                : int  16 8 29 4 10 2 3 19 2 7 ...
##  $ Quantite_Article         : num  47 15 154 30.7 64.3 ...
##  $ Nb_Moyen_Article         : num  2.94 1.88 5.31 7.68 6.43 ...
##  $ Nb_Moyen_Article_Diff    : num  1.88 1.88 3.28 5.25 5.3 3 1.33 1.32 16 3.71 ...
##  $ Panier_Moyen             : num  20.6 24.9 56.1 51 73.2 ...
##  $ Friand_Promo             : num  0 0 0 0 0 0 1 0 0 0 ...
##  $ Nb_Univers               : int  5 3 3 3 3 3 2 3 4 5 ...
##  $ Nb_Famille               : int  11 8 9 5 11 5 2 6 6 8 ...
##  $ Nb_SousFamille           : int  17 12 20 11 24 5 3 14 14 15 ...
##  $ Nb_Magasin_Achat         : int  1 1 2 1 1 1 1 1 1 1 ...
##  $ Pct_Remise               : num  9 11 11 2 8 13 15 14 7 9 ...
##  $ Taux_De_Marque           : num  0.447 0.38 0.379 0.49 0.371 ...
##  $ Nb_Ticket_Magasin_Rattach: num  16 8 25 4 10 2 3 19 2 7 ...
##  $ Pct_Achat_Magasin_Rattach: num  1 1 0.86 1 1 1 1 1 1 1 ...
##  $ Mois_CA_Min              : num  1 10 11 1 3 5 6 9 9 4 ...
##  $ Mois_CA_Max              : num  11 11 5 3 11 3 12 10 5 5 ...
##  $ JourSemaine_CA_Min       : chr  "Mercredi" "Mercredi" "Lundi" "Mercredi" ...
##  $ JourSemaine_CA_Max       : chr  "Vendredi" "Lundi" "Mardi" "Samedi" ...
##  $ Heure_CA_Min             : int  16 17 10 11 13 15 12 9 18 14 ...
##  $ Heure_CA_Max             : int  11 18 18 16 15 18 18 11 17 11 ...
##  $ Client_Meme_Ville        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Client_Meme_Dep          : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ CIVILITE                 : Factor w/ 6 levels "MADAME","MONSIEUR",..: 1 1 1 1 2 1 2 1 2 2 ...
##  $ VIP                      : Factor w/ 2 levels "0","1": 1 1 2 1 1 2 1 1 1 1 ...
##  $ Annee_Debut_Adhesion     : num  2004 2005 2005 2005 2005 ...
##  $ Annee_Fin_Adhesion       : num  2018 2018 2019 2017 2018 ...

Les indicateurs ClientMemeVille et ClientMemeDep (sous-entendu que le magasin) ont été créé en utilisant des données externes (données INSEE), les correspondances entre les codes insee et les codes postaux.

Pour davantage de détails sur la définition et la construction de ces 37 indicateurs, veuillez vous référez au fichier Excel nommé “Grille_Indicateurs” transmis dans le dossier.

9.2 Nettoyage des indicateurs

Après avoir créer ces indicateurs, nous avons remarqué que certains clients n’entrent pas dans notre périmètre d’analyse.

Nous avons donc décidé de retirer ces clients.

9.2.1 Suppression des clients avec un CA négatif

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

9.2.2 Suppression des clients ayant un montant de remise supérieur au CA qu’il génére

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

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

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

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

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

9.2.5 Suppression des clients ayant un montant de remise négatif

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

Après ces modifications, le nombre de clients se réduit, il ne nous en reste plus que 494504 sur 608457 ayant effectué des achats en 2017.

9.3 Analyse détaillée des indicateurs

9.3.1 Exploration des données agrégées par client

Les clients sont majoritairement des femmes (60%). Toujours majoritairement français (98%). Ceux ayant un statut de VIP passe à 20%. Pour l’âge aucun changement, toutes les tranches d’âge sont présentes et coïncident avec la pyramide des âges en France.

Le CA moyen généré par client est de 358 euros avec un CA médian de 231 euros. Les clients ont bénéficié en moyenne d’une remise de 31 euros avec une médiane à 17 euros.

Chaque client a effectué en moyenne 6 achats avec une médiane de 4 achats. Le panier moyen est de 78 euros qui est sensiblement différent du panier médian à 58 euros.

9.3.2 Exploration du CA, Panier moyen et Montant de remise

Dans tout ce qui suit, on va porter notre attention sur les clients qui ont un CA_TTC < 1000.

Ils représentent la grosse majorité des clients.

Il n’y a aucunes différences entre le niveau de consommation entre Monsieur et Madame.

Le CA des clients VIP est nettement supérieur aux autres. En revanche leurs paniers moyens sont globalement similaires car ils ont un nombre de tickets deux fois plus important que la moyenne. Ce qui implique que les clients VIP se rendent beaucoup plus au magasin pour faire des achats que les autres.

Les VIP bénéficient d’un montant de remise plus important que les autres.

Les clients anciens ont un CA supérieur aux autres.

Sinon pas de différence notoire sur les autres critères.

On remarque que le fait de découper une variable numérique en un nombre de classes ayant des effectifs semblables (second graphe) donne plus d’indications que le fait de la découper en classes d’amplitudes égales (premier graphe).

Nous allons donc paufiner l’analyse dans les graphes suivants en adoptant le découpage en classes avec effectifs semblables.

Le pourcentage des clients avec un statut VIP croit de façon continue selon les tranches CA générés par les clients.

Par contre pour le panier moyen on note prèsque une symétrie par rapport à la classe centrale.

Mis à part la première classe, le pourcentage des clients anciens croit de façon continue selon le CA généré mais décroit de façon continue pour le panier moyen.

10 Création de la variable cible : Client à fort potentiel

En analysant statistiquement l’ensemble des indicateurs que nous venons de créer, nous avons dégagé des règles métiers permettant de définir ce qu’est pour la marque un client à fort potentiel.

Nous sommes arrivés à la conclusion qu’un client à fort potentiel doit avoir dans l’année :

  • Un CA TTC supérieur ou égale 400€
  • ##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    ##     0.76   123.37   232.38   359.14   440.58 36226.70
  • 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 393139
1 101365

Par cette règle, on peut voir qu’1/4 des clients sont considérés comme des clients à fort potentiel.

Nous pouvons voir aussi que les clients qui sont considérés comme des clients à fort potentiel sont aussi dans la tranche d’âge 35-65 ans.

Cette base d’exemples créée va être utiliser en entrée par les algorithmes d’apprentissage supervisé que nous allons mettre en place par la suite pour prédire si un client est considéré comme un client à fort potentiel ou non.

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

11.1 Suppression des indicateurs hautement corrélés

Avant de nous lancer dans la partie modélisation, il est important de supprimer les variables hautement corrélées entre elles pour éviter d’utiliser deux variables ayant une relation élevée entre elles dans les modèles pouvant avoir un impact négative sur les performances des modèles.

Nous voyons, à travers cette matrice des corrélations que les variables CA_TTC , CA_HT et MargeSortie sont hautement corrélées (coefficient de corrélation égale à 1), il existe une dépendance entre elles. Nous avons donc décidé de garder uniquement l’une d’entre elles, celle qui pour nous a le plus de sens de ne pas être retiré, la variable CA_TTC.

De la même manière, on peut voir que les variables Nb_Ticket et Nb_Ticket_Magasin_Rattach ont une dépendance forte (coefficient de corrélation égale à 1). Nous retirons donc l’indicaeur Nb_Ticket_Magasin_Rattach de nos données.

Identique pour les variables Nb_Ticket_Remb et Taux_Ticket_Remb . Nous gardons la variable Taux_Ticket_Remb .

Même si le coefficient de corréaltion entre les variables Nb_Famille et Nb_SousFamille n’est pas égale à 1, il s’en rapproche (0.8), nous décidons donc de garder uniquement le Nb_Famille achété par client.

drops <- c("CA_HT","Marge_Sortie","Nb_Ticket_Remb","Nb_Ticket_Magasin_Rattach","Nb_SousFamille")
by_client <- by_client[ , !(names(by_client) %in% drops)]

11.2 Suppression des variables explicatives redondantes à la variable cible

En analysant l’ensemble des indicateurs que nous venons de créer, nous nous sommes rendus compte que plusieurs de ceux-ci ont une redondance avec la définition de notre variables cibles. Nous avons donc décidé de les supprimer dans l’objectif que notre modélisation soit juste.

drops <- c("CA_TTC","Nb_Ticket","Quantite_Article","Nb_Moyen_Article","Nb_Moyen_Article_Diff","Panier_Moyen","Taux_De_Marque")
by_client <- by_client[ , !(names(by_client) %in% drops)]

11.3 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 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 MontantRemise
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 Nb_Univers
by_client$Nb_Univers <- ifelse(by_client$Nb_Univers <= 3, "inferieur a 3 univers","superieur a 3 univers")

#Manage Nb_Famille
by_client$Nb_Famille <- ifelse(by_client$Nb_Famille <= 5, "inferieur a 5 familles","superieur a 5 familles")

#Manage Annee_Debut_Adhesion
by_client$Annee_Debut_Adhesion <- ifelse(by_client$Annee_Debut_Adhesion <= 2010, "adhere avant 2010", ifelse(by_client$Annee_Debut_Adhesion > 2010 & by_client$Annee_Debut_Adhesion <= 2015,"adhere entre 2010 et 2015", "adhere après 2015"))

Le découpage de ces variables numériques en un nombre de classes ayant une taille d’efffectifs semblables a été effectué via la fonction quant.cut du package questionr .

11.4 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        Nb_Ticket_Remb             Nb_Remise 
##                     0                     0                     0 
##        Montant_Remise          Friand_Promo            Nb_Univers 
##                     0                     0                     0 
##            Nb_Famille      Nb_Magasin_Achat           Mois_CA_Min 
##                     0                     0                     0 
##           Mois_CA_Max    JourSemaine_CA_Min    JourSemaine_CA_Max 
##                     0                     0                     0 
##          Heure_CA_Min          Heure_CA_Max     Client_Meme_Ville 
##                     0                     0                     0 
##       Client_Meme_Dep              CIVILITE                   VIP 
##                     0                     0                     0 
##  Annee_Debut_Adhesion    Annee_Fin_Adhesion Client_With_Potential 
##                     0                     0                     0

Pour la suite, nous ne prendrons pas en compte l’indicateur Age car elle comprend 40% de valeurs manquantes.

11.5 Echantillonnage (Apprentissage/Test)

Nous avons séparé notre échantillon de données en deux sous-échantillions:

  • Un échantillon d’apprentissage : Nos différents modèles s’entraîneront sur cette échantillion
  • Un échantillon de test : Cet échantillon nous permettra de tester le pouvoir prédictif de nos modèles
ind <- sample(2, nrow(by_client), replace=T, prob=c(0.7,0.3))
tdata<- by_client[ind==1,] # training = 70%
vdata<- by_client[ind==2,] #test = 30%

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

Classe Effectif
0 275292
1 70872

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

Classe Effectif
0 117847
1 30493

12 Vers la modélisation supervisée

Au vu des données que nous avons à disposition et de la problématique que nous souhaitons traitée, la prédiction qu’un client détient à fort potentiel ou non, nous avons décidé de commencer par utiliser des algorithmes supervisés. Nous en avons utilisé deux :

  • Un algorithme de classification : les arbres de décision
  • La regression logistique

Pourquoi en utiliser deux ?

Nous avons décidé de mettre en place ces deux algorithmes pour choisir à la fin le meilleur algorithme nous permettant d’obtenir les meilleurs performances en termes de prédiction.

12.1 La régression logistique en premier lieu

12.1.1 Selection des variables : Stratégie Stepwise

N’ayant aucunes connaissances des variables prédictrices, nous avons décidé de nous orienter vers l’utilisation de la stratégie Stepwise pour nous faire une première idée sur les variables pouvant avoir un impact sur le modèle.

Rappel du fontionnnement de la stratégie Stepwise : Utilisée lorsque la connaissance des variables prédictrices possibles s’avère limitée. La variable la plus significative est injectée en première. La deuxième est injectée conditionnellement à la première et ainsi de suite.

12.1.2 Ajustement du modèle et interprétations des variables

L’ajustement du modèle s’effectue via la méthode glm() en précisisant le paramètre family=binomial(link=‘logit’) (la variable à prédire étant binaire).

Nous allons ajuster le modèle sur l’ensemble des clients.

L’ajustement s’effectue sur l’échantillon de train (tdata). Nous indiquons notre variable cible que nous cherchons à prédire (Client_With_Potential) que nous mettons en corrélation avec l’ensemble des indicateurs créés spécifié dans le code par le symbole “.”.

reglog.tune <- glm(Client_With_Potential ~ . ,family=binomial(link='logit'),data=tdata)

12.1.2.1 Analyse des coefficients

En utilisant la fonction summary(), nous obtenons les résultats suivants:

## 
## Call:
## glm(formula = Client_With_Potential ~ ., family = binomial(link = "logit"), 
##     data = tdata)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.8435  -0.4014  -0.1571  -0.0721   3.4672  
## 
## Coefficients:
##                                                Estimate Std. Error z value
## (Intercept)                                   -11.19021   40.72733  -0.275
## Etranger1                                       0.16872    0.04587   3.678
## Ancien_Client1                                  0.21560    0.02511   8.586
## Readherant1                                    -0.14306    0.02696  -5.305
## Nb_Ticket_Remb1                                 0.51833    0.39871   1.300
## Nb_Ticket_Remb2                                 0.11211    0.91937   0.122
## Nb_Ticket_Remb3                                 7.19149   72.46288   0.099
## Nb_Remiseinferieur a 5 remises                 -0.42022    0.01953 -21.512
## Nb_Remisesuperieur a 10 remises                 1.00115    0.01509  66.340
## Montant_Remisemoins de 10 euros                -0.29009    0.02180 -13.306
## Montant_Remiseplus de 25 euros                  1.26601    0.01442  87.795
## Friand_Promo1                                  -1.19221    0.01881 -63.373
## Nb_Universsuperieur a 3 univers                 1.07495    0.01395  77.068
## Nb_Famillesuperieur a 5 familles                1.25008    0.01868  66.904
## Nb_Magasin_Achat2                               0.46854    0.01415  33.109
## Mois_CA_Min2                                   -0.07757    0.03250  -2.386
## Mois_CA_Min3                                   -0.47738    0.03241 -14.730
## Mois_CA_Min4                                   -0.50307    0.03132 -16.061
## Mois_CA_Min5                                   -0.46597    0.03106 -15.004
## Mois_CA_Min6                                   -0.32543    0.03057 -10.647
## Mois_CA_Min7                                   -0.03641    0.03059  -1.190
## Mois_CA_Min8                                    0.03877    0.03086   1.256
## Mois_CA_Min9                                   -0.11813    0.03099  -3.812
## Mois_CA_Min10                                  -0.08834    0.03053  -2.894
## Mois_CA_Min11                                  -0.24762    0.03004  -8.243
## Mois_CA_Min12                                  -0.52098    0.03030 -17.195
## Mois_CA_Max2                                   -0.15540    0.04459  -3.485
## Mois_CA_Max3                                   -0.40336    0.03848 -10.483
## Mois_CA_Max4                                   -0.22177    0.03857  -5.750
## Mois_CA_Max5                                   -0.23102    0.03863  -5.981
## Mois_CA_Max6                                   -0.41452    0.04000 -10.363
## Mois_CA_Max7                                   -0.17925    0.04426  -4.050
## Mois_CA_Max8                                   -0.18382    0.04802  -3.828
## Mois_CA_Max9                                   -0.28352    0.04347  -6.522
## Mois_CA_Max10                                  -0.16057    0.04408  -3.642
## Mois_CA_Max11                                  -0.18856    0.04249  -4.438
## Mois_CA_Max12                                  -0.40872    0.04039 -10.120
## JourSemaine_CA_MinJeudi                         0.28736    0.02328  12.343
## JourSemaine_CA_MinLundi                         0.35739    0.02311  15.462
## JourSemaine_CA_MinMardi                         0.30389    0.02361  12.871
## JourSemaine_CA_MinMercredi                      0.25555    0.02330  10.968
## JourSemaine_CA_MinSamedi                       -0.14232    0.02353  -6.048
## JourSemaine_CA_MinVendredi                      0.15518    0.02359   6.579
## JourSemaine_CA_MaxJeudi                        -0.36599    0.02371 -15.436
## JourSemaine_CA_MaxLundi                        -0.21196    0.02472  -8.575
## JourSemaine_CA_MaxMardi                        -0.33633    0.02322 -14.484
## JourSemaine_CA_MaxMercredi                     -0.27875    0.02244 -12.422
## JourSemaine_CA_MaxSamedi                       -0.11407    0.01856  -6.145
## JourSemaine_CA_MaxVendredi                     -0.34847    0.02114 -16.480
## Heure_CA_Min9                                  -0.47311    0.84667  -0.559
## Heure_CA_Min10                                 -0.73993    0.84650  -0.874
## Heure_CA_Min11                                 -0.90037    0.84646  -1.064
## Heure_CA_Min12                                 -0.74977    0.84651  -0.886
## Heure_CA_Min13                                 -0.59469    0.84662  -0.702
## Heure_CA_Min14                                 -0.64719    0.84647  -0.765
## Heure_CA_Min15                                 -0.93912    0.84645  -1.109
## Heure_CA_Min16                                 -0.99275    0.84645  -1.173
## Heure_CA_Min17                                 -0.98152    0.84646  -1.160
## Heure_CA_Min18                                 -0.89972    0.84649  -1.063
## Heure_CA_Min19                                 -0.52016    0.84741  -0.614
## Heure_CA_Min20                                 -1.11839    0.91895  -1.217
## Heure_CA_Max9                                   6.01683   40.71936   0.148
## Heure_CA_Max10                                  6.05246   40.71934   0.149
## Heure_CA_Max11                                  5.97418   40.71934   0.147
## Heure_CA_Max12                                  5.84553   40.71934   0.144
## Heure_CA_Max13                                  5.81630   40.71935   0.143
## Heure_CA_Max14                                  5.82953   40.71934   0.143
## Heure_CA_Max15                                  5.87795   40.71934   0.144
## Heure_CA_Max16                                  5.89513   40.71934   0.145
## Heure_CA_Max17                                  5.90064   40.71934   0.145
## Heure_CA_Max18                                  5.99254   40.71934   0.147
## Heure_CA_Max19                                  5.59741   40.71937   0.137
## Heure_CA_Max20                                  5.00021   40.72359   0.123
## Client_Meme_Ville1                              0.29132    0.01621  17.974
## Client_Meme_Dep1                                0.20426    0.02314   8.828
## CIVILITEMONSIEUR                                0.02144    0.01215   1.765
## VIP1                                            2.48569    0.01598 155.593
## Annee_Debut_Adhesionadhere avant 2010           0.29360    0.03535   8.307
## Annee_Debut_Adhesionadhere entre 2010 et 2015   0.19474    0.03151   6.179
## Annee_Fin_Adhesion2017                          2.12131    0.46223   4.589
## Annee_Fin_Adhesion2018                          1.65958    0.46204   3.592
## Annee_Fin_Adhesion2019                          0.87377    0.46278   1.888
##                                               Pr(>|z|)    
## (Intercept)                                   0.783501    
## Etranger1                                     0.000235 ***
## Ancien_Client1                                 < 2e-16 ***
## Readherant1                                   1.12e-07 ***
## Nb_Ticket_Remb1                               0.193598    
## Nb_Ticket_Remb2                               0.902945    
## Nb_Ticket_Remb3                               0.920945    
## Nb_Remiseinferieur a 5 remises                 < 2e-16 ***
## Nb_Remisesuperieur a 10 remises                < 2e-16 ***
## Montant_Remisemoins de 10 euros                < 2e-16 ***
## Montant_Remiseplus de 25 euros                 < 2e-16 ***
## Friand_Promo1                                  < 2e-16 ***
## Nb_Universsuperieur a 3 univers                < 2e-16 ***
## Nb_Famillesuperieur a 5 familles               < 2e-16 ***
## Nb_Magasin_Achat2                              < 2e-16 ***
## Mois_CA_Min2                                  0.017011 *  
## Mois_CA_Min3                                   < 2e-16 ***
## Mois_CA_Min4                                   < 2e-16 ***
## Mois_CA_Min5                                   < 2e-16 ***
## Mois_CA_Min6                                   < 2e-16 ***
## Mois_CA_Min7                                  0.234036    
## Mois_CA_Min8                                  0.209010    
## Mois_CA_Min9                                  0.000138 ***
## Mois_CA_Min10                                 0.003809 ** 
## Mois_CA_Min11                                  < 2e-16 ***
## Mois_CA_Min12                                  < 2e-16 ***
## Mois_CA_Max2                                  0.000492 ***
## Mois_CA_Max3                                   < 2e-16 ***
## Mois_CA_Max4                                  8.94e-09 ***
## Mois_CA_Max5                                  2.22e-09 ***
## Mois_CA_Max6                                   < 2e-16 ***
## Mois_CA_Max7                                  5.12e-05 ***
## Mois_CA_Max8                                  0.000129 ***
## Mois_CA_Max9                                  6.94e-11 ***
## Mois_CA_Max10                                 0.000270 ***
## Mois_CA_Max11                                 9.09e-06 ***
## Mois_CA_Max12                                  < 2e-16 ***
## JourSemaine_CA_MinJeudi                        < 2e-16 ***
## JourSemaine_CA_MinLundi                        < 2e-16 ***
## JourSemaine_CA_MinMardi                        < 2e-16 ***
## JourSemaine_CA_MinMercredi                     < 2e-16 ***
## JourSemaine_CA_MinSamedi                      1.47e-09 ***
## JourSemaine_CA_MinVendredi                    4.74e-11 ***
## JourSemaine_CA_MaxJeudi                        < 2e-16 ***
## JourSemaine_CA_MaxLundi                        < 2e-16 ***
## JourSemaine_CA_MaxMardi                        < 2e-16 ***
## JourSemaine_CA_MaxMercredi                     < 2e-16 ***
## JourSemaine_CA_MaxSamedi                      8.00e-10 ***
## JourSemaine_CA_MaxVendredi                     < 2e-16 ***
## Heure_CA_Min9                                 0.576307    
## Heure_CA_Min10                                0.382059    
## Heure_CA_Min11                                0.287469    
## Heure_CA_Min12                                0.375772    
## Heure_CA_Min13                                0.482411    
## Heure_CA_Min14                                0.444524    
## Heure_CA_Min15                                0.267222    
## Heure_CA_Min16                                0.240856    
## Heure_CA_Min17                                0.246227    
## Heure_CA_Min18                                0.287833    
## Heure_CA_Min19                                0.539331    
## Heure_CA_Min20                                0.223589    
## Heure_CA_Max9                                 0.882530    
## Heure_CA_Max10                                0.881839    
## Heure_CA_Max11                                0.883356    
## Heure_CA_Max12                                0.885851    
## Heure_CA_Max13                                0.886418    
## Heure_CA_Max14                                0.886161    
## Heure_CA_Max15                                0.885222    
## Heure_CA_Max16                                0.884889    
## Heure_CA_Max17                                0.884782    
## Heure_CA_Max18                                0.883000    
## Heure_CA_Max19                                0.890665    
## Heure_CA_Max20                                0.902278    
## Client_Meme_Ville1                             < 2e-16 ***
## Client_Meme_Dep1                               < 2e-16 ***
## CIVILITEMONSIEUR                              0.077640 .  
## VIP1                                           < 2e-16 ***
## Annee_Debut_Adhesionadhere avant 2010          < 2e-16 ***
## Annee_Debut_Adhesionadhere entre 2010 et 2015 6.44e-10 ***
## Annee_Fin_Adhesion2017                        4.45e-06 ***
## Annee_Fin_Adhesion2018                        0.000328 ***
## Annee_Fin_Adhesion2019                        0.059014 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 350939  on 346163  degrees of freedom
## Residual deviance: 184718  on 346082  degrees of freedom
## AIC: 184882
## 
## Number of Fisher Scoring iterations: 8

On peut voir par exemple, en analysant les p-values (colonne Pr(>|z|)) que les variables Nb_Ticket_Remb, Heure_CA_Min ,Heure_CA_Max ou encore la CIVILITE 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, on peut voir par exemple pour la variable Friand_Promo qu’elle détient un coefficient négative (colonne z value) qui est le plus élevé, équivalent à -63.373, insinuant une forte association entre être un client friand en promotion et 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 une forte attirance pour les promotions est moins susceptible d’être considéré comme un client à fort potentiel.

A l’inverse, on peut voir par exemple que un client VIP (155.593) ayant bénéficié d’un montant de remise supérieur à 25€ (87.795) et acheté des articles dans plus de 3 univers différents (77.068) est plus susceptible de l’être.

12.2 On enchaine avec les arbres de décision

Après avoir lancé une regression logistique sur les données, nous trouvons intéressant d’interpréter les résultats fournis par un autre modèle supervisé, l’arbre de décision. Nous allons utilisé l’algorithme CART pour cette étude, qui est l’algorithme le plus utilisé, le plus simple pour obtenir des prédictions et les résultats sous forme de règles qui en sort sont facilement interprétable (décision binaire).

12.2.1 Entrainons le modèle !

L’implémentation de l’arbre de classification CART s’effectue via la fonction rpart() provenant du package du même nom.

De la même manière que pour la régression logistique précédemment, l’ajustement du modèle va s’effectuer sur les données d’entrainement (tdata). Petite précision, les échantillons d’apprentissage et de test sont identiques à ceux utilisés dans la régression logistique.

tree <- rpart(Client_With_Potential ~ ., data = tdata, control = rpart.control(cp = 0.0001))

À cette étape, nous ne nous soucions pas des performances de l’algorithme. C’est pour cela, que nous ajustons le modèle avec les paramètres par défaut. C’est le paramètre CP (Complexity Parameter) qui est utilisé pour contrôler la taille de l’arbre. Si le coût d’ajout d’une variable est supérieur à la valeur de CP, la croissance de l’arborescence s’arrête.

12.2.2 Recherche de la meilleure profondeur : Pruning

L’idée ici est de limiter le surapprentissage, d’éviter dès le départ que notre algorithme performe de trop. Pour ce faire, nous allons observer les valeurs de CP pour chaque taille d’arbre et choisir celle qui minimise l’erreur relative.

bestcp <- tree$cptable[which.min(tree$cptable[,4]),1]

Valeur :

## [1] 0.0001904843

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

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

12.2.3 Analyse des variables importantes

Analysons maintenant les variables importantes du modèle nous permettant de faire ressortir les variables qui définissent un client à fort potentiel.

##                           Overall
## Ancien_Client          764.399147
## Annee_Debut_Adhesion  1583.911062
## Annee_Fin_Adhesion     970.282584
## CIVILITE                 3.834017
## Client_Meme_Dep         88.571026
## Client_Meme_Ville      118.720004
## Etranger                74.925238
## Friand_Promo          4678.396237
## Heure_CA_Max            98.848688
## Heure_CA_Min           331.836814
## JourSemaine_CA_Max     292.311400
## JourSemaine_CA_Min     495.702225
## Mois_CA_Max            243.040176
## Mois_CA_Min           1305.204958
## Montant_Remise       30128.705455
## Nb_Famille           34783.386638
## Nb_Magasin_Achat      1221.592749
## Nb_Remise            33267.821745
## Nb_Univers           29139.044958
## Readherant             458.097928
## VIP                  30065.625539
## Nb_Ticket_Remb           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 Nb_Ticket_Remb et CIVILITE ont un faible voire aucun impact dans la définition d’un client à fort potentiel.

À l’inverse, les variables Nb_Famille (34783.38), Nb_Remise (33267.82) et VIP (30065.62) ont un impact important. Les variables importantes dans ce modèle sont quasi-identiques à celles de la régression logistique.

12.2.4 L’arbre dans toute sa splendeur

L’arbre affiché ci-dessous est le meilleur arbre après élagage que nous pouvons construire pour éviter le sur-apprentissage.

Nous retrouvons l’ensemble des règles permettant de définir ce qu’est un client à fort potentiel.

L’arbre étant trop grand, il nous est difficile de détailler les règles que l’on peut dégager.

Pour les détailler, nous avons donc limiter la hauteur de l’arbre en choissisant une valeur de CP plus élevé mais qui maximize donc l’erreur relative.

tree <- rpart(Client_With_Potential ~ ., data = tdata, control = rpart.control(cp = 0.004))

Un client VIP ayant un nombre de remises supérieur à 10 à davantage de chance d’être considéré comme un client à fort potentiel.

De la même manière, on peut voir qu’un client non VIP a plus de chance d’être considéré comme un client à fort potentiel s’il bénéficie d’un montant remise supérieur à 25 euros, qu’il achète des produits dans plus de 3 univers avec un nombre de remise supérieur à 10 et si il a adhéré à l’entreprise avant 2015 compris.

Après avoir analyser et interpréter les résultats de ces deux algorithmes, nous allons étudier leurs performances pour choisir l’algorithme le plus performant pour notre étude.

13 Performances des deux modèles

Après avoir analysé et interprété les différents résultats en sortie des deux approches de modélisation précédentes, nous consacrons cette partie à la comparaison de leurs performances.

13.1 Régression logistique

Dans les étapes ci-dessus, nous avons brièvement évalué l’ajustement du modèle, maintenant nous aimerions voir comment le modèle est en train de prédire notre variable cible sur un nouvel ensemble de données.

Nous appliquons notre modèle sur le dataframe de test avec une limite de décision de 0.5 (valeur par défaut).

13.1.1 Prédiction sur le modèle de test

reglog.results <- predict(reglog.tune,vdata)

13.1.2 Calcul de la précision

Nous calculons maintenant la précision de notre modèle appliqué sur les données de test.

## [1] 0.8767696

La précision de notre modèle d’environ 0.87 sur l’ensemble des données de test est un très bon résultat. Cependant,ce résultat est quelque peu dépendant de la division manuelle des données que nous avons faites plus tôt, donc si nous souhaitons davantage un score plus précis, une solution serait d’effectuer une sorte de validation croisée comme k-fold validation.

13.1.3 ROC comme métrique de performances

Comme dernière étape, nous allons visualiser la courbe de ROC et calculer l’AUC (Area Under the Curve) qui sont des mesures de performance typiques pour un classificateur binaire.

La courbe de ROC est généré en affichant les vrais positives rate (TPR) contre les faux positives rate (FPR).

On peut voir que le modèle détient une bonne abilité de prédiction avec une AUC de 0.74.

13.2 Arbre de décision

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

13.2.1 Prédiction sur le modèle de test

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

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

Pred:0 Pred:1
Actual:0 111652 11380
Actual:1 6195 19113

D’après la matrice de confusion nous avons 19113 clients à fort potentiel qui ont bien été prédit et 11380 qui ne le sont pas mais qui ont été prédit comme client à fort potentiel.

Nous remarquons que l’algorithme CART d’arbre de décision classe assez bien les deux classes avec un recall de 75%.

En termes de précision, les deux modèles ont donc tous les deux, de grandes capacités de prédiction.

13.2.3 ROC comme métrique de performances

On peut voir que la valeur de l’AUC pour l’arbre de décision CART (0.87) est supérieur à celui de la régression logistique.

14 Recommandations marketing en réponse à la problématique

Pour ces recommandations, nous allons nous baser sur les interprétations des variables effectuées de l’arbre de décision CART car les performances du modèle d’arbre sont plus élevé.

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

14.1 Augmenter la clientèle à potentielle chez les 20-35 ans

Cette tranche d’âge étant en sous-effectif (environ 10%) par rapport au reste de la clientèle qui se situe principalement entre 35 et 65 ans, il nous semble intéressant de faire le nécessaire en se basant sur les résultats obtenues pour que ces personnes soit attirés par notre marque et puisse devenir par la suite des clients à fort potentiel.

Pour résumer, l’objectif est de faire en sorte de leur faire découvrir la marque et effectuer le nécessaire pour qu’il puisse devenir des VIPs à court terme.

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… »). Effectuer cela 1 à 2 fois par semaine pour que ces clients puissent être favorable à l’achat d’une carte VIP par la suite et donc bénéficier davantage de remises
  • Participer à des événements pour sensibiliser les clients à l’agriculture biologique disponible chez Botanic (semaine du jardinage dans les écoles, idem pour les entreprises…)
  • Proposition de visite d’espaces aménagés (jardins, appartements ou en magasin) avec les nouveaux produits fraîchement arrivés grâce à la réalité virtuelle – VR
  • Services en lignes Chatbot pour venir en aide aux jeunes clients ne sachant pas forcément quoi choisir / Application comme IKEA (visualiser en avance les produits) permet de savoir ce qu’il y a en avance, peut éviter les déplacements en magasin
  • Optimiser le site internet pour une clientèle plus jeune (changer l’ergonomie du site) et en faire un site marchand (on peut par exemple imaginer un partenariat avec Amazon Prime car les jeunes aiment être livrés rapidement et gagner du temps.) Un site Internet bien conçu favorise davantage l’achat. Idem pour l’application Smartphone
  • Ouvrir des magasins en Ile-de-France là où le nombre de jeune est très élevé avec des produits orientés clientèle jeune urbaine (rayon animalerie pour les chats, et plantes d’appartement à développer)

14.2 Fidélisation du coeur de cible actuel

Nous ne pouvons pas délaissé la clientèle actuelle (tranche d’âge 35-65 ans). Il faut continuer à fidéliser davantage les clients à fort potentiel pour éviter qu’il ne le soit plus dans le long termes, tout en faisant en sorte que des clients qui ne le sont pas le deviennent.

Pour résumer, l’objectif ici est de faire en sorte de diminuer légérement (de 10% maximum) le prix permettant d’accèder au niveau VIP par l’achat de la carte, pour ceux qui ne le sont pas, pour faire en sorte de montrer au client que l’on a confiance en lui et qu’il puisse derrière bénéficié de nombreuses remises pour le pousser à effectuer plus d’achats.

Pour ceux qui sont VIP, nous allons faire en sorte de proposer davantage de remises.

Les démarches envisageables:

  • Diminuer de 10% le prix d’accès à la carte VIP
  • Expliquer les intérêts d’avoir une carte VIP à tous les clients n’étant pas VIP par l’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’achat d’une carte VIP, accessible 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 pour les 3 premiers (les faire participer)

15 Auto-critique de notre étude et axes d’amélioration

Nous ajoutons cette partie à notre rapport car nous pensons qu’il est important de divulguer les “failles” de notre étude pour proposer des axes d’améliorations par la suite pour augmenter davantage la qualité de celle-ci.

Avant d’aller plus loin, un point sur les données à notre disposition. Nous estimons que celles-ci n’ont pas été un obstacle pour nous à l’exploitation après avoir éclairci certains points dans la définition de certains champs.

Attaquons nous maintenant à la partie critique sur la modélisation.

Nous sommes dubitatifs sur la taille de l’arbre de décision élagué que nous n’avons pas pu analysé. Il faudrait par la suite modéliser l’arbre de décision CHAID qui permet davantage de contrôle sur la taille de l’arbre et les comparer.

Nous pouvons aussi utiliser l’algorithme PCA avant de lancer toute modélisation pour réduire le nombre de variables au lieu de le faire manuellement en analysant la corrélation entre les variables.

16 Annexe : Ajustement d’un modèle d’apprentissage non supervisée - K-means

Avant de nous lancer sur la création de la variable cible pour les méthodes supervisés, nous avons tenté d’appliquer l’algorithme de clustering K-means, pour mettre en évidence les classes qui peuvent exister à partir des données.

Cet algorithme s’applique uniquement sur des variables quantitatives. Nous sommes donc limité à ce type de variables.

L’algorithme a été déroulé plusieurs fois. Les graphes ci-dessus représentent 2 lancements avec un nombre de clusters égal à 2 puis à 5.

Aucun paramétrage n’a pu aboutir à la segmentation en groupes globalement distincts. L’application de cet algorithme ne donne aucun résultat satisfaisant.