M2 Data Analyst

Projet intégrateur — PredictRetail Analytics

M2 Data Analyst · 2025-2026 · Projet 4 jours en équipe de 2
✦ Projet intégrateur — Machine Learning × Power BI

PredictRetail Analytics — Prédire les ventes et piloter la performance d'une chaîne de distribution

Rossmann est l'une des plus grandes chaînes pharmaceutiques d'Europe — 3 000 magasins, 40 000 employés, présente dans 7 pays. Vous êtes recrutés comme consultants data : prédire les ventes futures de 1 115 points de vente à l'aide de modèles ML, et construire un dashboard Power BI permettant à la direction de piloter la performance et les prédictions en temps réel.

🤖 Machine Learning 📊 Power BI 🗃️ Kaggle — Rossmann Store Sales
👥 Équipes de 2
📅 4 jours
🏆 100 pts + bonus
🎤 Soutenance 25 min
📦 6 livrables
🔗 Kaggle Competition

📂Dataset — Rossmann Store Sales (Kaggle)

Le dataset provient d'une vraie compétition Kaggle lancée par Rossmann en 2015. Il est suffisamment riche et complexe pour nécessiter du feature engineering avancé, de la gestion de séries temporelles et des techniques de modélisation non triviales.

Fichier principal
train.csv

1 017 209 lignes · Ventes journalières de chaque magasin avec date, clients, promotions, jours fériés.

Fichier test
test.csv

41 088 lignes · Les 6 semaines à prédire. Mêmes colonnes sans les ventes.

Méta-données
store.csv

1 115 lignes · Infos par magasin : type, assortiment, distance concurrence, date ouverture promo.

Colonnes clés et leurs enjeux

ColonneTypeEnjeu analytique
SalesCible (régression)Variable à prédire. Distribution log-normale → transformation conseillée. Présence de 0 quand le magasin est fermé.
CustomersNumériqueFortement corrélé à Sales. À utiliser avec précaution en validation croisée temporelle car non disponible au moment de prédire.
StateHolidayCatégorielle (a/b/c/0)Encodage ordinal ou one-hot selon le modèle. Impact différent selon le type de jour férié.
SchoolHolidayBinaireImpact sur la fréquentation — corrélé aux vacances scolaires régionales.
PromoBinairePromotion du jour. Fort levier sur les ventes. Interaction avec Promo2.
Promo2Binaire + datesProgramme de promotion cyclique — nécessite feature engineering pour extraire si une promo est active.
StoreTypeCatégorielle (a/b/c/d)4 formats de magasin avec comportements très différents. À encoder et analyser séparément.
AssortmentCatégorielle (a/b/c)Niveau d'assortiment produit. Corrélé au type de magasin et au volume de ventes.
CompetitionDistanceNumérique (valeurs manquantes)Distance en mètres du concurrent le plus proche. Nécessite imputation.
CompetitionOpenSinceAnnée + moisFeature engineering : calculer le nombre de mois depuis l'ouverture du concurrent.
⚠️ Pièges classiques sur ce dataset : (1) Ne pas exclure les jours fermés (Sales=0) de l'entraînement sans réflexion — ils constituent un signal réel. (2) Customers est une data leakage potentielle — attention à sa présence dans les features de prédiction. (3) La validation croisée standard (KFold aléatoire) est invalide sur des séries temporelles — utiliser TimeSeriesSplit ou une validation out-of-time.

Téléchargement

# Méthode 1 — Kaggle API (recommandée) pip install kaggle kaggle competitions download -c rossmann-store-sales unzip rossmann-store-sales.zip -d ./data/ # Méthode 2 — Téléchargement manuel # https://www.kaggle.com/competitions/rossmann-store-sales/data # Nécessite un compte Kaggle et l'acceptation des règles de la compétition
J1

EDA, Nettoyage & Feature Engineering

Explorer les données en profondeur, corriger les anomalies et construire les variables qui feront la différence en modélisation.

Python / Pandas / Seaborn
1
Exploration initiale — Comprendre la structure

Charger train.csv, test.csv et store.csv. Merger les datasets. Analyser les types, les distributions, les valeurs manquantes. Produire un rapport de qualité des données.

pandasdescribe()missingno
2
Analyse des séries temporelles — Identifier les patterns

Décomposition saisonnière par type de magasin. Analyse des tendances hebdomadaires, mensuelles et annuelles. Identifier l'impact des promotions et des jours fériés sur les volumes.

statsmodelsseaborn / plotlyseasonal_decompose
3
Feature Engineering — Créer les variables explicatives

Extraction temporelle (DayOfWeek, Month, Year, WeekOfYear, Quarter, IsWeekend). Calcul des features Promo2 (actif ou non selon les mois). Ancienneté du concurrent (CompetitionMonths). Variables de lag (ventes N-7, N-14, N-1 an) et rolling means (7j, 30j, 90j).

pandas datetimelag featuresrolling stats
4
Nettoyage & préparation — Dataset prêt à modéliser

Imputation des valeurs manquantes (CompetitionDistance → médiane par type). Encodage des variables catégorielles. Transformation log de la cible (log1p). Suppression ou traitement des jours fermés. Constitution du jeu de validation out-of-time (6 dernières semaines).

sklearn preprocessingOrdinalEncoderlog1p
💡 Livrable Jour 1 : Notebook Jupyter documenté avec (1) rapport EDA en 10 visualisations clés, (2) dataset nettoyé exporté en df_clean.parquet, (3) feature importance préliminaire via corrélation. Le notebook doit être exécutable de bout en bout sans erreur.
J2

Modélisation ML & Optimisation

Entraîner, comparer et optimiser les modèles de prédiction. La métrique cible est le RMSPE (métrique officielle Kaggle).

Scikit-learn / XGBoost / LightGBM

La métrique officielle — RMSPE

RMSPE (Root Mean Square Percentage Error) est la métrique de la compétition Kaggle Rossmann. Elle pénalise davantage les erreurs relatives que les erreurs absolues — un magasin qui vend 100€ et est prédit à 150€ est plus sévèrement pénalisé qu'un magasin à 10 000€ prédit à 10 500€ (même erreur absolue de 50€).

Formule : RMSPE = √[ (1/n) × Σ((Sales_i - Pred_i) / Sales_i)² ]

Objectif : < 0.12 (top 25% de la compétition). Les meilleures solutions historiques atteignent 0.10.
# Implémentation de la métrique RMSPE def rmspe(y_true, y_pred): """Root Mean Square Percentage Error — exclure les Sales = 0""" mask = y_true != 0 return np.sqrt(np.mean(((y_true[mask] - y_pred[mask]) / y_true[mask]) ** 2)) # Pour XGBoost — custom eval metric (prédictions en espace log) def rmspe_log(y_pred, dtrain): y_true = np.expm1(dtrain.get_label()) y_pred = np.expm1(y_pred) score = rmspe(y_true, y_pred) return 'rmspe', score
1
Baseline — Modèles de référence

Entraîner 2 baselines pour avoir un plancher : (1) Moyenne par store/DayOfWeek, (2) Random Forest avec hyperparamètres par défaut. Calculer le RMSPE sur le set de validation out-of-time.

RandomForestTimeSeriesSplit
2
Modèles gradient boosting — XGBoost et LightGBM

Entraîner XGBoost et LightGBM sur le dataset complet avec les features engineered. Utiliser l'early stopping sur le set de validation. Comparer les performances et les temps d'entraînement.

XGBoostLightGBMearly_stopping
3
Feature Importance & SHAP Values

Analyser quelles features contribuent le plus aux prédictions. Générer les SHAP values pour le meilleur modèle. Identifier si certaines features peuvent être supprimées (simplification).

shapsummary_plotfeature_importance
4
Hyperparameter Tuning & Export des prédictions

Optimiser le meilleur modèle via Optuna (bayesian search) ou GridSearchCV. Générer les prédictions finales sur test.csv. Exporter predictions_final.csv pour Power BI et submission.csv pour Kaggle.

Optunasubmission Kaggleexport Power BI
💡 Livrable Jour 2 : Notebook de modélisation avec tableau comparatif des modèles (RMSPE baseline / RF / XGB / LGB), SHAP summary plot, et predictions_powerbi.csv exporté. Soumission sur Kaggle avec capture d'écran du score public.
J3

Dashboard Power BI — De la donnée à la décision

Construire un dashboard interactif multi-pages permettant à la direction de piloter la performance réelle et les prédictions ML.

Power BI Desktop / DAX / Power Query

Architecture du dashboard — 4 pages

Page synthétique lisible en 30 secondes. La direction veut la situation globale, les alertes et les tendances — pas les détails.

VisuelDonnéesInteraction
4 KPI cardsVentes totales, Nb magasins actifs, RMSPE moyen, Croissance vs période précédenteFiltre date global
Line chartVentes réelles vs prédites sur la période de validation (par semaine)Zoom timeline
Bar chart horizontalTop 10 / Flop 10 magasins par RMSPEDrill-through vers page magasin
Map (carte)Répartition géographique des magasins avec indicateur de performanceSélection région

Analyse granulaire par point de vente. Le responsable régional veut comparer ses magasins et identifier les outliers.

VisuelDonnéesDAX clé
Slicer Store / StoreType / AssortmentFiltres hiérarchiques
Scatter plotVentes réelles vs prédites par magasin (1 point = 1 store)AVERAGEX()
Heatmap matricielleVentes par DayOfWeek × Month (saisonnalité)CALCULATE(SUM(), FILTER())
Waterfall chartImpact des promotions sur les ventes (avec vs sans Promo)DIVIDE()
Table détailLignes par magasin : réel / prédit / écart / erreur %Conditional formatting sur erreur

Page dédiée à l'équipe data. Transparence sur le modèle : où prédit-il bien ? Où se trompe-t-il ? Pourquoi ?

VisuelDonnéesDAX clé
Distribution histogrammeDistribution de l'erreur relative (Error_Pct) par tranchesPERCENTILE.INC()
Box plot (R visual)Dispersion des erreurs par StoreType et AssortmentR script intégré
Bar chart groupéRMSPE par segment : StoreType / Promo / SchoolHolidayRMSPE_Custom mesure DAX
Line chart dual axisErreur de prédiction dans le temps — détection de driftRolling window DAX
// Mesure DAX — RMSPE personnalisé RMSPE_Validation = VAR SumSquaredPct = SUMX( FILTER(predictions, predictions[Sales_Actual] > 0), (([Sales_Actual] - [Sales_Predicted]) / [Sales_Actual]) ^ 2 ) VAR N = COUNTROWS(FILTER(predictions, predictions[Sales_Actual] > 0)) RETURN SQRT(DIVIDE(SumSquaredPct, N))

Les prédictions sur les 6 semaines futures (test.csv). Alertes automatiques si un magasin est prédit en forte baisse. Aide à la planification des ressources.

  • Calendrier des prédictions avec code couleur (seuil de ventes)
  • Alertes automatiques (conditional formatting + icônes) sur les baisses > 20%
  • Tableau export des prédictions par magasin et par semaine
  • Bouton de drill-through vers la fiche magasin pour les alertes
💡 Livrable Jour 3 : Fichier PredictRetail_Dashboard.pbix avec les 4 pages, les relations entre tables correctement configurées, et au minimum 2 mesures DAX avancées. Le dashboard doit fonctionner sans connexion live (données embarquées).
J4

Finalisation, Insights & Soutenance

Consolider les résultats, rédiger les recommandations business et défendre le projet devant le jury.

Rapport · Slides · Soutenance 25 min
1
Rapport technique — Documentation du projet

Synthèse de l'approche EDA, des choix de feature engineering justifiés, du processus de sélection de modèle et des limites identifiées. Maximum 8 pages.

rapport PDFRMSPE comparatif
2
Insights business — "Et alors ?"

Traduire les résultats techniques en recommandations actionnables pour la direction Rossmann : quels types de magasins sous-performent, quand la promo est-elle vraiment efficace, quels magasins nécessitent une attention prioritaire.

storytellingrecommandations
3
Préparation de la soutenance

15 slides maximum. Structure : contexte & données (2) → EDA insights clés (3) → Modélisation résultats (4) → Dashboard live (4) → Recommandations (2). Démonstration live du dashboard Power BI obligatoire.

slides 15 maxdémo live

🏆Livrables et Notation

📓 Notebooks Python (Jour 1 + Jour 2)
30 pts
Qualité et profondeur de l'EDA (10 visuels min., insights réels)
/ 8 pts
Feature engineering — pertinence et originalité des variables créées
/ 7 pts
RMSPE obtenu et justesse du processus de validation (split temporel)
/ 7 pts
SHAP analysis et explication des prédictions
/ 5 pts
Lisibilité du code, documentation, structure du notebook
/ 3 pts
📊 Dashboard Power BI (Jour 3)
35 pts
Connexion et modélisation des données (relations, types, Power Query)
/ 6 pts
Qualité et pertinence des mesures DAX (min. 3 mesures avancées)
/ 8 pts
Pertinence des visualisations par rapport aux questions business
/ 8 pts
Interactivité (filtres croisés, drill-through, slicers, tooltips)
/ 6 pts
Design, lisibilité et cohérence graphique des 4 pages
/ 5 pts
Intégration des prédictions ML dans le dashboard
/ 2 pts
🎤 Soutenance orale (Jour 4)
25 pts
Clarté de la narration et structure de la présentation
/ 6 pts
Démonstration live du dashboard Power BI
/ 6 pts
Qualité des insights business (au-delà des métriques techniques)
/ 6 pts
Réponses aux questions techniques du jury (posées individuellement)
/ 7 pts
📄 Rapport technique (Jour 4)
10 pts
Justification des choix de modélisation et des features
/ 5 pts
Analyse critique des limites et pistes d'amélioration
/ 3 pts
Recommandations business actionnables
/ 2 pts

Bonus et pénalités

+4 pts
Soumission Kaggle avec RMSPE < 0.12 (top 25% historique de la compétition) — capture d'écran du leaderboard obligatoire
+3 pts
Stacking ou blending de modèles (XGB + LGB + régression linéaire pondérée) avec justification de la stratégie
+3 pts
Actualisation automatique du dashboard Power BI via un script Python + planification (Power Automate ou script bat)
+2 pts
Analyse de segmentation — clustering des magasins (KMeans ou DBSCAN) intégré comme feature dans le modèle ET comme dimension dans Power BI
−5 pts
Validation croisée KFold aléatoire utilisée à la place d'un split temporel — erreur méthodologique grave sur données temporelles
−4 pts
Utilisation de Customers comme feature dans le modèle de prédiction — data leakage évident
−3 pts
Dashboard Power BI sans aucune mesure DAX calculée (utilisation exclusive des agrégations automatiques)
−3 pts
Aucune connexion entre les prédictions ML et le dashboard Power BI — les deux livrables sont indépendants

Barème de conversion

17–20
85–100 pts
14–16
70–84 pts
11–13
55–69 pts
8–10
40–54 pts
0–7
< 40 pts

🎤Questions Potentielles en Soutenance

Les questions techniques sont posées individuellement à chaque membre. Les deux membres doivent maîtriser l'ensemble du projet.

🤖 Machine Learning
  • Pourquoi un KFold aléatoire serait-il invalide sur ce dataset ? Comment avez-vous construit votre set de validation ?
  • Expliquez votre choix de transformer Sales en log1p. Qu'est-ce que ça change dans l'optimisation du modèle ?
  • Quelles sont les 3 features les plus importantes selon vos SHAP values ? Est-ce cohérent avec votre EDA ?
  • Comment avez-vous traité le problème du data leakage lié à Customers ?
  • Quel est votre RMSPE sur le set de validation ? Que signifie concrètement ce chiffre pour Rossmann ?
📊 Power BI
  • Expliquez la mesure DAX que vous avez créée pour calculer le RMSPE. Pourquoi ne pas utiliser une agrégation standard ?
  • Comment avez-vous structuré le modèle de données (relations entre tables) ? Pourquoi ce schéma ?
  • Quelle est la différence entre une mesure DAX et une colonne calculée dans votre contexte ? Quand avez-vous choisi l'un plutôt que l'autre ?
  • Si un directeur régional veut voir l'évolution des prédictions pour un seul magasin sur les 6 prochaines semaines, comment navigue-t-il dans votre dashboard ?
🔗 Lien ML × Power BI
  • Comment avez-vous fait le lien entre les outputs du modèle ML et le dashboard Power BI ? Format, structure, jointures ?
  • Si le modèle est ré-entraîné chaque semaine avec de nouvelles données, comment le dashboard devrait-il être mis à jour ?
  • Votre modèle prédit moins bien sur certains types de magasins — est-ce visible dans le dashboard ? Comment aideriez-vous la direction à interpréter ces écarts ?
  • Quelles sont selon vous les 2 principales limites de votre approche, et comment les amélioreriez-vous avec plus de temps ?

📦 Récapitulatif des 6 livrables à remettre

📓 Notebook EDA

01_EDA.ipynb — Analyse exploratoire avec 10 visuels, rapport qualité données, dataset nettoyé exporté.

📓 Notebook Modélisation

02_Modeling.ipynb — Pipeline ML, comparaison modèles, SHAP values, prédictions exportées.

📊 Dashboard Power BI

PredictRetail.pbix — 4 pages, DAX avancé, prédictions ML intégrées, interactivité complète.

📄 Rapport technique

Rapport.pdf — 8 pages max. Choix méthodologiques, résultats, limites, recommandations.

🎯 Slides soutenance

Slides.pdf — 15 slides max. Narrative business + technique. Démo dashboard en live.

🗃️ Fichiers exports

exports/df_clean.parquet, predictions_powerbi.csv, submission_kaggle.csv.

Format de dépôt : dossier ZIP nommé PredictRetail_[NomEquipe].zip · Délai : avant le début des soutenances le Jour 4 · Notebooks exécutables de bout en bout (kernel restart + run all)

Ce qu'on évalue — En résumé

Rigueur MLValidation temporelle correcte · Feature engineering documenté · Pas de data leakage · RMSPE interprété
Maîtrise Power BIModèle de données propre · DAX avancé · Interactivité pertinente · Lien avec les prédictions ML
Vision businessInsights au-delà des métriques · Recommandations actionnables · Narration claire pour un non-technicien
Cohérence globaleML et Power BI sont connectés · Les insights EDA informent les features · Le dashboard répond aux questions business posées

Dataset : Rossmann Store Sales · Kaggle · 1 017 209 lignes · 1 115 magasins · RMSPE objectif : < 0.12