Objectif du projet :
Manipuler et analyser de la Data sous R.
Programmer en R
Sortir un rapport en utilisant R-Markdown
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 :
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
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)
Constituer un graphique montrant la répartition par age x sexe sur l’ensemble des clients.
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.
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
Constituer un histogramme N-2 / N-1 affichant l’évolution du CA par univers
Afficher le top 5 des familles les plus rentable par univers (en fonction de la marge obtenu) (tableau ou graphique -> au choix)
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”.
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.
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.
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))
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)
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)
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 |
É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.
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)
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)