Objectif du projet :

Contexte : Une société X a envoyé ses données clients ainsi que ses achats sur l’année N-2 (2016) et N-1 (2017). Le but est de sortir un rapport d’étude

Durée : Rapport et programme à retourner pour le 13 janvier 2019 au plus tard.

Les données : Les tables mises à disposition sont structurées de la manière suivante :

Énoncé

1 - Étude globale

1.1 Répartition Adhérant / VIP ….

Constituer un camembert suivant la répartition suivante :

  • VIP : client étant VIP (VIP = 1)

  • NEW_N2 : client ayant adhéré au cours de l’année N-2 (date début adhésion)

  • NEW_N1 : client ayant adhéré au cours de l’année N-1 (date début adhésion)

  • ADHERANT : client toujours en cours d’adhésion (date de fin d’adhésion > 2018/01/01)

  • CHURNER : client ayant churner (date de fin d’adhésion < 2018/01/01)

Note : le critère le plus au-dessus est prioritaire, exemple : un client étant VIP, et ayant adhéré sur l’année N-1 sera compté comme étant VIP

1.2 Comportement du CA GLOBAL par client N-2 vs N-1

Constituer une boite à moustache pour chaque année (N-2 et N-1) comparant le CA TOTAL (TTC) des clients (sommer les achats par client par années)

1.3 Répartition par âge x sexe

Constituer un graphique montrant la répartition par age x sexe sur l’ensemble des clients.

2 - Étude par magasin

2.1 Résultat par magasin (+ 1 ligne Total)

Constituer un tableau (formattable) reprenant les données suivantes :

  • MAGASIN

  • NOMBRE DE CLIENTS RATTACHES AU MAGASIN (avec une color_bar en fonction de la quantité)

  • NOMBRE DE CLIENTS ACTIFS sur N-2

  • NOMBRE DE CLIENTS ACTIFS sur N-1

  • % CLIENT N-2 vs N-1 (couleur police : vert si positif, rouge si négatif)

  • TOTAL_TTC N-2

  • TOTAL_TTC N-1

  • Différence entre N-2 et N-1 (couleur police : vert si positif, rouge si négatif)

  • Indice évolution (icône de satisfaction : positif si le pourcentage de clients actifs évolue et total TTC aussi, négatif si il y a une diminution des 2 indicateurs, moyen si seulement l’un des deux diminue)

Note –> on effectuera un tri sur l’indice d’évolution : les positifs en haut, les négatifs en bas.

2.2 Distance CLIENT <-> MAGASIN

L’objectif est de calculer la distance qui existe entre le magasin et le client.

Les informations disponibles sont :

  • la ville du magasin

  • le code INSEE du client

Il faut télécharger les données GPS des villes et code-insee pour pouvoir calculer la distance :
https://public.opendatasoft.com/explore/dataset/correspondance-code-insee-code-postal

Une fois les données acquises, il faut :

  • lier les données GPS composé de la latitude et de la longitude au client et au magasin.

  • constituer pour chaque client et chaque magasin 2 colonnes : latitude et longitude.

  • créer une fonction qui détermine la distance entre 2 points.

La fonction doit prendre 4 variables en compte : latitude1, longitude1, latitude2, longitude2.
Pour savoir si la fonction est correcte : https://www.lexilogos.com/calcul_distances.htm

Constituer une représentation (tableau ou graphique –> au choix) représentant le nombre de client par distance :

  • 0 à 5km

  • 5 à 10km

  • 10 à 20km

  • 20 à 50km

  • plus de 50km

3 - Etude par univers

3.1 Evolution du CA par univers

Constituer un histogramme N-2 / N-1 affichant l’évolution du CA par univers

3.2 Top par univers

Afficher le top 5 des familles les plus rentable par univers (en fonction de la marge obtenu) (tableau ou graphique -> au choix)


Programmation R

Préambule

La consigne de ce projet était la création et l’utilisation de 3 fichiers :

  • le fichier “Parametres.R”

  • le fichier “Projet.R”

  • le fichier “Projet.Rmd”

Dans le cadre de cette exigence, nous avons mis toutes les constantes et variables du projet dans le fichier “Parametres.R”. Nous avons aussi ajouté dans ce fichier, et comme cela l’a été demandé, les fonctions de chargement des tables.

Nous avons ensuite fait le choix de découper le projet en différentes fonctions indépendantes, de manière à faciliter l’organisation du travail en équipe. 7 fonctions ont été crées, soit 1 fonction par exercice demandé :

  • repartition_adherant_vip_1.1

  • comportement_CA_1.2

  • proportion_sexe_age_1.3

  • resultat_magasin_2.1

  • distance_Client_Magasin_2.2

  • etude_par_univers_3.1

  • top_par_univers_3.2

Dans le même esprit, les fichiers ont été chargées sur GitHub pour favoriser le travail en groupe.

Si vous désirez obtenir des informations supplémentaires sur chacune des fonctionnalités développées dans le code, des commentaires détaillés ont été inclus dans le code source des fichiers “Parametres.R” et “Projet.R”.

Mise en place de l’environnement de travail

Chargement du fichier paramètres qui permet :

  • le chargement des bibliothèques nécessaires à l’exécutuon des scripts R de ce fichier.

  • le chargement des variables des fichiers.

  • le chargement des tables.

1 - Etude globale

Les fonctions permettant de répondre aux problématiques sont chargées dans le fichier “Projet.R”" :

source("Projet.R")
## Chargement de la table Articles... 
## Chargement de la table Magasins... 
## Chargement de la table Clients 
## Chargement de la table Entetes 
## Chargement de la table Lignes... 
## Chargement de la table Insee...

Nous importons le fichier “Parametres.R” dans le fichier “Projet.R”, ce fichier déclare les différents paramètres (bases de données, variables, etc.).

C’est aussi dans ce fichier que les tables sont chargées en mémoire.

1.1 Répartition Adhérant / VIP ….

La fonction qui suit permet de générer un camembert représentant la répartition des clients VIP, adhérents au cours de N-1, adhérant au cours de N-2 et les churner. Il a bien entendu fallu, dans la définition de la fonction, gérer les clients qui appartiennent à deux ensembles.

repartition_adherant_vip_1.1(ANNEE_EN_COURS,convert_date_client(clients))

1.2 Comportement du CA GLOBAL par client N-2 vs N-1

Cette fonction représente deux boites à moustache représentants les CA par clients sur l’année N-1 et N-2. Lors de la définition de cette fonction, il a fallu exclure les valeurs aberrantes qui biaisaient énormément la répartition.

comportement_CA_1.2(ANNEE_EN_COURS,entetes)

1.3 Répartition par âge x sexe

La population étudiée dans cette fonction est l’ensemble des hommes et des femmes dont les ages sont renseignés et sont compris entre 18 et 98 ans. La fonction créé deux graphiques, le premier représentant d’un coté la répartition des femmes par rapport aux femmes et de l’autre coté des hommes par rapport aux hommes. Le second graphique représente les tranches d’age des femmes et les tranches d’age des hommes par rapport à la population totale.

proportion_sexe_age_1.3(clients)

2 - Étude par magasin

2.1 Résultat par magasin (+ 1 ligne Total)

Cette fonction etudie les revenues et le nombre de client des magasins, ainsi que l’evolution entre l’annee 2016 et 2017.

resultat_magasin_2.1(ANNEE_EN_COURS,clients, magasins, entetes)
Code Magasin Ville Departement Region Nombre Adherent Client Actif N-2 Client Actif N-1 Evolution client Actif Total TTC N-2 Total TTC N-1 Evolution Total TTC Indices ?volutions
ALM LES MILLES 13 Littoral 16499 64506 63753 1.18 4036788.6 4113500.3 76711.73
BEC STRASBOURG 67 Alsace-Est 7977 24752 24104 2.69 1470501.1 1485815.7 15314.61
IAB L’ISLE-D’ABEAU 38 Rhône-Alpes 16885 61213 61028 0.30 3222142.2 3239040.9 16898.72
MAC MACON 71 Centre-Paris 14632 50786 50560 0.45 2798360.5 2821781.5 23421.04
PRI SAINT-PRIEST 69 Rhône-Alpes 26935 88276 87061 1.40 5528750.3 5557473.3 28722.95
SEY SEYSSINS 38 Rhône-Alpes 25967 86419 85093 1.56 4336406.7 4400118.8 63712.10
SUR SURESNES 92 Centre-Paris 23784 68031 65082 4.53 4807772.5 4966887.7 159115.27
VIC VILLECHETIF 10 Alsace-Est 11556 34659 34660 0.00 2114766.5 2133378.8 18612.26
ALB GILLY SUR ISERE 73 Rhône-Alpes 12828 49786 52062 -4.37 2960491.7 3049735.1 89243.44
AVI VILLENEUVE-LES-AVIGNON 30 Littoral 15435 61602 60885 1.18 4065939.6 3951027.6 -114912.03
BAR BARCELONNETTE 4 Littoral 1321 8698 9556 -8.98 455609.3 511120.3 55510.96
BEA BEAUMONT 63 Centre-Paris 20714 104816 100652 4.14 5739924.3 5566069.9 -173854.36
BLA BLAGNAC 31 Littoral 11748 36957 39319 -6.01 2143924.9 2255599.6 111674.74
BRE BRETIGNY-SUR-ORGE 91 Centre-Paris 10106 36081 36517 -1.19 2089464.5 2121890.2 32425.73
BSN CESSON 77 Centre-Paris 10302 31323 25069 24.95 2020922.3 1665792.9 -355129.47
CAG CAGNES SUR MER 6 Littoral 9071 27304 30851 -11.50 1697422.1 1792635.3 95213.19
CLA CLAPIERS 34 Littoral 23744 95925 91995 4.27 5847741.9 5639065.5 -208676.34
CLI CLIRON 8 Alsace-Est 4454 16916 14147 19.57 918075.6 794102.3 -123973.33
DIJ DIJON 21 Alsace-Est 12603 53229 51254 3.85 3043839.4 2900305.7 -143533.69
DUM ANNECY-LE-VIEUX 74 Rhône-Alpes 6761 49418 57434 -13.96 2208888.9 2458296.8 249407.89
ECU ECULLY 69 Rhône-Alpes 15410 70731 72067 -1.85 4112227.4 4274237.6 162010.16
EPN EPINAL 88 Alsace-Est 8800 35579 37657 -5.52 1748055.5 1821401.0 73345.48
FEG FEGERSHEIM 67 Alsace-Est 10561 43402 38864 11.68 2347398.3 2161775.8 -185622.48
FRV FRANCHEVILLE 69 Rhône-Alpes 15377 68003 65846 3.28 3922133.4 3764133.9 -157999.45
GAI GAILLARD 74 Rhône-Alpes 16162 79533 71062 11.92 6143169.4 5666500.7 -476668.69
GAP GAP 5 Littoral 8137 38104 35016 8.82 2080513.5 1926181.0 -154332.51
GEX ST GENIS POUILLY 1 Rhône-Alpes 19278 100696 95973 4.92 7388908.2 6957685.7 -431222.52
HAG HAGUENAU 67 Alsace-Est 4780 15704 15940 -1.48 801071.1 848128.9 47057.79
LAB LABEGE CEDEX 31 Littoral 11058 32501 32207 0.91 2053101.8 2021049.9 -32051.93
MAN MANOSQUE 4 Littoral 11343 47859 42234 13.32 2719688.3 2461591.5 -258096.77
MET METZ-TESSY 74 Rhône-Alpes 17997 84931 81405 4.33 4826410.1 4633844.8 -192565.36
MOB MONTBONNOT-SAINT-MARTIN 38 Rhône-Alpes 18929 107287 113996 -5.89 5977004.8 6384418.0 407413.25
MOU MOUANS-SARTOUX 6 Littoral 24389 99630 91550 8.83 6349088.3 6045145.7 -303942.70
MUL MULHOUSE 68 Alsace-Est 14240 58873 56770 3.70 3332191.2 3172041.5 -160149.65
NEV NEVERS CEDEX 58 Centre-Paris 7007 45514 40696 11.84 1987411.7 1769606.9 -217804.74
OBE OBERNAI 67 Alsace-Est 9709 36875 37036 -0.43 1793099.2 1796715.8 3616.53
ORL ORLEANS 45 Centre-Paris 9891 50723 47273 7.30 2695002.7 2467712.0 -227290.73
PEG PERRIGNY 89 Alsace-Est 11012 39611 38091 3.99 2118864.4 2044230.0 -74634.46
PEP PERPIGNAN 66 Littoral 7609 22484 20991 7.11 1315595.2 1225988.6 -89606.56
POC PONTAULT-COMBAULT 77 Centre-Paris 10182 39035 35200 10.89 2406910.2 2235013.5 -171896.64
PON LE PONTET 84 Littoral 11788 42767 37614 13.70 2577362.9 2363867.9 -213495.03
QUE QUETIGNY 21 Alsace-Est 11699 36220 38195 -5.17 1783723.1 1898024.3 114301.20
RAV LA RAVOIRE 73 Rhône-Alpes 11396 51220 44849 14.21 2625700.9 2302863.8 -322837.11
RMA RUEIL MALMAISON 92 Centre-Paris 6499 17880 43801 -59.18 1108075.4 2656633.9 1548558.51
SAL SALLANCHES 74 Rhône-Alpes 3124 8647 9598 -9.91 605824.6 664168.6 58344.02
SCH SCHWEIGHOUSE-SUR-MODER 67 Alsace-Est 5526 16009 9493 68.64 979934.8 624613.9 -355320.89
SEM FEVES 57 Alsace-Est 10360 33396 30149 10.77 1959365.4 1781800.2 -177565.16
SGL SAINT-GENEST-LERPT 42 Rhône-Alpes 8846 30078 27660 8.74 1575548.2 1450191.3 -125356.85
SJV SAINT-JEAN-DE-VEDAS 34 Littoral 11065 39332 41323 -4.82 2254727.3 2414626.0 159898.68
SLM SARGE LES LE MANS 72 Centre-Paris 7894 28867 28870 -0.01 1366815.6 1431044.6 64228.95
SMA SAINTE MAXIME 83 Littoral 5413 31072 26711 16.33 1741264.0 1490879.7 -250384.26
SMR SAINT-MITRE-LES-REMPARTS 13 Littoral 12532 55126 55939 -1.45 3044483.7 3063414.7 18931.03
SNO SEYNOD 74 Rhône-Alpes 10828 42975 47261 -9.07 2071762.6 2292897.9 221135.30
SSM LA SEYNE-SUR-MER 83 Littoral 23601 119384 127122 -6.09 6413411.9 6842403.0 428991.02
STE LA FOUILLOUSE 42 Rhône-Alpes 12001 41742 37120 12.45 2526952.2 2279578.3 -247373.90
STR SISTERON 4 Littoral 2946 13859 12835 7.98 670530.0 642991.6 -27538.46
THO THONON-LES-BAINS 74 Rhône-Alpes 10549 46151 47380 -2.59 2897265.3 2979304.0 82038.71
VAL VALENCE 26 Rhône-Alpes 16685 53736 47915 12.15 3459987.9 2986765.7 -473222.22
VAR VARENNES VAUZELLES 58 Centre-Paris 12948 62010 54857 13.04 3150352.0 2701641.5 -448710.49
VEN VENELLES 13 Littoral 10544 63672 60504 5.24 3354293.2 3182815.7 -171477.50
VIB VILLEURBANNE 69 Rhône-Alpes 24640 82269 80375 2.36 4402349.5 4323459.0 -78890.47
VIF VILLEFRANCHE-SUR-SAONE 69 Centre-Paris 14180 46934 45177 3.89 2709178.9 2586192.4 -122986.48
VIT VITROLLES 13 Littoral 14673 50140 51701 -3.02 3007212.4 3089915.3 82702.83
VIV VIVIER AU COURT 8 Alsace-Est 3632 18116 19951 -9.20 923415.9 973409.3 49993.39
VLG VILLE-LA-GRAND 74 Rhône-Alpes 22541 81106 76624 5.85 6212516.5 5653657.8 -558858.72
HEI HEILLECOURT 54 Alsace-Est 23500 109590 110123 -0.48 5834749.6 5796841.2 -37908.35
Total France 0 France 844603 3390071 3324104 1.98 193575043.6 196882382.4 -3307338.82

2.2 Distance CLIENT <-> MAGASIN

Cette partie du projet a été divisée en 7 étapes distinctes.

Étape 1 : Construction et préparation de la “TABLE_DE_TRAVAIL”

Cette table est une version aménagée et simplifiée de la table de correspondance de l’INSEE. Elle récupère uniquement les 4 colonnes qui nous intéressent : CODEINSEE, Code Postal, Commune et geo_point_2d.

Étape 2 : Phase de traitement des données et rétablissement de la cohérence des données.

Cette phase permet de rétablir la cohérence entre les tables “TABLE_DE_TRAVAIL, MAGASINS et CLIENTS

Par exemple :

  • On retire tous les tirets “-” dans les nom des villes afin de ramener de la cohérence dans le champ VILLE de la “TABLE DE TRAVAIL” issue du fichier CODE INSEE et celui de la table “MAGASINS”.

  • On remplace tous les “ST” par “SAINT”, toujours pour amener de la cohérence entre les villes de la “TABLE DE TRAVAIL” issues du fichier CODE INSEE et celle listées dans la table “MAGASINS”.

  • On retire le mot “CEDEX” trouvé dans certains noms de villes.

Étape 3 : Jointure entre les tables “MAGASINS” et “TABLE DE TRAVAIL” avec mise en forme de la table nouvellement créé.

On crée une nouvelle table “jointureGeoMagasins” avec jointure (left join) entre la table MAGASINS et la “TABLE DE TRAVAIL”. Cette nouvelle table est ensuite mise en forme. Cette mise en forme inclut le renommage de certaines colonnes et l’ajout des informations manquantes de localisation dans la table MAGASINS pour la ville “LES MILLES” qui n’est pas répertoriée dans le tableau de l’INSEE.

Étape 4 : Jointure entre les tables “CLIENTS” et “TABLE DE TRAVAIL” avec mise en forme de la table nouvellement créé.

On crée une table “jointureGeoClients”" avec jointure (left join encore une fois) entre la table CLIENTS et la TABLE DE TRAVAIL, elle est ensuite mise en forme.

Étape 5 : Jointure entre les tables “jointureGeoMagasins” et “jointureGeoClients”.

Cette jointure finale “jointureGeoMagasinsClients” va permettre d’effectuer le calcul de la distance entre chacun des clients de l’enseigne et le magasin dans lequel ils sont inscrits.

Étape 6 : Calcul de la distance.

Pour le calcul de la distance entre 2 points géographiques, on a créé la fonction distanceGeo((lat1, lon1, lat2, lon2). Cette fonction utilise la FORMULE DE HAVERSINE en l’état. Elle renvoie exactement les mêmes valeurs que celles retournées sur le site LEXILOGOS.

Étape 7 : Affichage du résultat au format tableau

Une fois la distance calculée pour chaque client, et après que l’affectation des modalités aux distances D1 à D6 ait été effectuée, nous affichons les résultats de la table “jointureGeoMagasinsClients” dans une figure au format tableau, en utilisant la library formattable.

distance_Client_Magasin_2.2(insee, magasins, clients)
DISTANCE CLIENTS POURCENTAGE DE CLIENTS
D1 - 0 à 5km 291072 34.41
D2 - 5 à 10km 232610 27.50
D3 - 10 à 20km 160853 19.02
D4 - 20 à 50km 96896 11.46
D5 - plus de 50km 29224 3.45
D6 - inconnue 35221 4.16
TOTAL 845876 100.00

Nous avons remarqué que sur l’ensemble des 845876 individus de la base clients, 9598 d’entre eux (soit un peu plus de 1%) ont renseigné une adresse postale se trouvant à plus de 200 kilomètres de leur lieu d’achat. Il y a de fortes chances pour que le client ait transmis le code postal de sa ville natale ou bien le client était de passage.

Par exemple, le client pour lequel on obtient la distance la plus élevée (9393,7602 km) a transmis le code postal de Saint-Andrée sur île de la Réunion. Ça au moins le mérite de nous faire voyager ! 😁

En bref, nous avons décidé pour cette étude, de conserver ces 9508 clients à l’intérieur de la modalité “D5 - plus de 50 km” dans la mesure où il est impossible de savoir si il s’agit réellement de l’adresse réelle du client ou pas… Lors d’une présentation de ce rapport aux responsables de l’enseigne, il sera nécessaire de leur transmettre cette information.

3 - Etude par univers

3.1 Evolution du CA par univers

Cette fonction permet d’afficher un histogramme presentant le CA par univers produit et par année d’achat.

Concernant le périmètre des données, nous privilegions des jointures internes entre les tables, permettant de determiner si l’unification des données engendre une perte de volumetrie.

Le constat d’analyse est le suivant :

  • Un article vendu de la table “ligne” n’est pas référencé dans la table “article”. Nous avons donc fait le choix de rajouter ce dernier afin de ne pas perdre l’information lors de l’agrégation des données (cette article a été nommé “unknown dans la table article”)

  • Tous les articles n’ayant pas été vendus (à savoir non présent dans la table ligne) sont exclus de l’analyse.

etude_par_univers_3.1(articles,lignes,entetes)

3.2 Top 5 des familles les plus rentable par univers

Cette fonction permet d’afficher un graphe representant un top 5 des familles les plus rentable par univers.

Concernant le périmètre des données, nous privilégions d’afficher tous les articles, même si ces derniers n’ont pas générés de marge.

Le constat d’analyse est le suivant :

  • Certains articles n’ont pas été vendus (à savoir non présent dans la table ligne)

  • La marge a été forcée à 0 pour tous ces articles non vendus.

top_par_univers_3.2(articles,lignes)