Auteur·rice

Karl Sondeji

Date de publication

16 janvier 2026

Code source

Introduction

Imaginez les fiches de caisse d’une boutique en ligne avec des centaines de milliers de lignes, parfois incomplètes ou incohérentes (annulations mélangées aux ventes, prix aberrants). Sans traitement, impossible de répondre sereinement à des questions simples comme, quel est le chiffre d’affaires par pays ? Quels clients achètent le plus ?

J’ai conçu un pipeline automatisé qui prend ce fichier brut, le nettoie, l’enrichit (ajout d’informations tels que les segments clients, les catégories supposées des produits, etc.) et le stocke dans un format adapté à l’analyse à grande échelle. Le tout est reproductible (même commande, même résultat) et contrôlé : si les données ne passent pas les règles de qualité, le traitement s’arrête plutôt que de publier des chiffres faux.

C’est pourquoi j’ai industrialisé la chaîne « données brutes → données prêtes pour le reporting », avec des gains mesurables sur la fiabilité et la vitesse des requêtes.

Le dépôt GitHub contient le code, les notebooks et les instructions d’exécution.

Le contexte métier

Qui ? Une boutique en ligne britannique (jeu de données public Online Retail, période fin 2010 – début 2011).

Le constat : environ 500 000 lignes de transactions, avec des problèmes classiques pour une plateforme de retail en ligne :

  • informations manquantes (client, prix, quantité)
  • annulations mélangées aux vraies transactions
  • valeurs aberrantes (quantités ou prix incohérents)
  • structure peu adaptée aux indicateurs métier (CA, segmentation)

Les objectifs :

Objectif Pourquoi
Fiabiliser le CA et les segments clients Décisions commerciales basées sur des chiffres cohérents
Garantir la qualité à chaque chargement Éviter de propager des erreurs dans les tableaux de bord
Accélérer les requêtes d’analyse Moins d’attente pour les équipes métier ou data
Permettre l’évolution des données Historique, corrections et mises à jour automatisées

Ce que j’ai livré

Deux compléments qui se répondent :

  1. Un pipeline Python exécutable en une commande pour l’industrialisation et l’intégration continue.
  2. Un notebook pour explorer, documenter et démontrer (profilage, contraintes, comparaison de performances). > Databricks: directement prêt à être exécuté depuis Databricks

Le schéma du traitement des données suit les principes du “Medallion architecture” (bronze → silver → gold), une structure standard en data engineering :

flowchart LR
  A["Fichier CSV brut"] --> B["Bronze<br/>copie archivée"]
  B --> C["Silver<br/>données nettoyées"]
  C --> D["Gold<br/>données enrichies"]
  D --> E["Analyses<br/>CA, benchmarks"]
  • Bronze : on conserve une copie fidèle des données sources (traçabilité).
  • Silver : on applique les règles de nettoyage (annulations, valeurs manquantes, formats).
  • Gold : on ajoute des colonnes utiles au métier (montant de commande, segment d’achat, continent, catégorie produit, etc.).

Technologies clés : PySpark (traitement distribué), Delta Lake (stockage fiable avec historique et contrôles), tests automatisés sur le nettoyage et la qualité.

Résultats concrets

Indicateur Ce que ça signifie
~8 839 lignes d’annulation retirées Les ventes « annulées » ne faussent plus le CA
Temps de requête : ~2,45 s → ~0,90–1,55 s Requêtes nettement plus rapides grâce au partitionnement (données rangées par pays / continent)
~355 281 lignes intégrées via MERGE Mise à jour incrémentale possible sans tout réécrire
Écart de CA entre versions (8,2 M£ vs 7,7 M£) Normal car le périmètre plus strict après nettoyage et enrichissement

Les chiffres de temps varient selon la machine, l’ordre de grandeur reste cependant représentatif. Pour le détail du partitionnement, voir aussi la note de méthode associée.

Comment le pipeline fonctionne

Le programme enchaîne dix étapes dans un ordre fixe et chaque étape a un rôle métier clair.

Étape Ce qui se passe Rôle technique
1 Le programme commence par lire la configuration (où sont les fichiers, quel environnement, local ou cloud) afin de déterminer l’environnement adapté à l’utilisateur get_config() -> cherche l’environnement
2 Une fois l’environnement défini on lance Spark et active Delta Lake pour lire/écrire les tables. create_spark_session() -> crée une session Spark
3 Charge le CSV des transactions tel qu’exporté (importation des ventes brutes). read_raw_csv() -> importation du CSV
4 On sauvegarde une copie immuable des données sources (archivage du fichier original). write_delta → copie dans dossier bronze
5 On nettoie les données, retire les annulations, lignes incomplètes, formats incohérents. clean_transactions() → nettoie
6 Vérification que les données nettoyées respectent les règles (checking avant publication) sinon, arrêt avec erreur explicite run_checks(..., scope="cleaning") -> checking du nettoyage
7 Publication de la couche silver avec des données fiables pour l’analyse de base. write_delta → silver
8 Enrichissementdes données, ajout des montants des commandes, segments clients, création de la variable continents et des catégories de produits. enrich_transactions() -> complète les données
9 Re-checking et publication dans le dossier gold (même logique de qualité sur la couche finale). run_checks(..., scope="enriched") puis write_delta → gold
10 Analyse (optionnel), calcule le CA par pays / catégorie et compare les temps avec ou sans partitionnement. run_analytics() si --analytics

À retenir : le pipeline ne se contente pas de transformer les données, il vérifie qu’elles sont exploitables avant de les exposer aux analyses. En cas de problème, une erreur DataQualityError bloque la suite plutôt que de livrer des résultats trompeurs.

Détail des règles de nettoyage

  • Suppression des lignes sans client, prix, quantité ou numéro de facture
  • Exclusion des annulations (factures dont le numéro commence par C / c)
  • Exclusion d’une facture aberrante identifiée (541431)
  • Conserve uniquement les transactions avec un code produit à 5 caractères (règle de labase de données initiales)
  • Harmonisation des types (quantité entière, prix décimal, date au format horodaté)

Détail de l’enrichissement

  • Calcul du montant de ligne (quantité × prix unitaire)
  • Segmentation des achats, taille de boutique, continent, catégorie produit dérivée de la description

Contrôles qualité

Chaque passage silver / gold produit un rapport (passed, contraintes, violations). Si une règle échoue, le traitement s’arrête. Ce comportement permet de protéger les indicateurs en aval, car on est certain que les données qui arrivent à l’utilisateur final ont passé les tests (ont le comportement attendu).

Les données en entrée

Une ligne = un article sur une facture (quantité, prix, date, client, pays). Principales colonnes :

Colonne Signification Point d’attention
InvoiceNo Numéro de facture Préfixe C = annulation
StockCode Référence produit 5 caractères en sortie silver
Description Libellé produit Base pour les catégories de produits
Quantity / UnitPrice Quantité et prix Contrôlés après nettoyage
InvoiceDate Date et heure d’achat
CustomerID Identifiant client Souvent vide en brut
Country Pays de livraison Forte part Royaume-Uni

Pour les profils techniques

Prérequis

  • Python 3.10+ (testé avec 3.11)
  • JDK 11 ou 17 — JAVA_HOME doit pointer vers le dossier JDK sans wildcard (ex. éviter jdk-17.*)
  • Fichier data/raw/Online_Retail.csvUCI Online Retail

Dépendances principales :

python-dotenv
pyspark==3.5.3
delta-spark==3.2.1
pyyaml
pytest

Pour le notebook : ydata-profiling, pyngrok (optionnel).

Installation et lancement

# 1. Cloner le dépôt et installer les dépendances
pip install -r requirements.txt

# 2. Copier la configuration d’environnement (optionnel)
cp .env.example .env

# 3. Placer le CSV (ou adapter config/dev.yaml)
#    data/raw/Online_Retail.csv

# 4. Lancer le pipeline
python -m src.main

# Avec analyses et benchmark partitionné / non partitionné
python -m src.main --analytics

# Environnement prod (chemins S3 dans config/prod.yaml)
python -m src.main --env prod

Tests

python -m pytest tests/test_cleaning.py tests/test_quality.py -q

Le premier lancement peut être lent (démarrage JVM Spark).

Exécution depuis un Notebook

A. Google Colab

  1. Ouvrir Online_retail_pipeline.ipynb et exécuter les cellules dans l’ordre.
  2. Adapter le chemin CSV si besoin (historiquement /Data_OR/Online_Retail.csv).

B. Databricks

  1. Aller dans le dossier notebooks -> Ouvrir Run pipeline.ipynb -> exécuter les cellules dans l’ordre.

Livrables

1. Notebook (Online_retail_pipeline.ipynb)

Phase Contenu
Compréhension Schéma, statistiques, profils YData Profiling, explorations
Nettoyage (phase1) Même logique métier que cleaning.py + table Delta
Enrichissement (phase2phase3) Traitement des descriptions, catégorisation
Organisation Delta Contraintes CHECK sur phase3 / phase4
Performance Table partitionnée, plans d’exécution, mesures de temps
Historique MERGE, DESCRIBE HISTORY, VERSION AS OF

2. Pipeline Python (src/)

Composant Contenu
Ingestion Lecture CSV typée, écriture Delta bronze / silver / gold
Nettoyage Règles métier alignées sur le notebook
Qualité Contrôles automatisés avec rapport et arrêt en cas d’échec
Enrichissement Colonnes analytiques pour la couche gold
Analytics Agrégations CA & benchmark partitionné vs non partitionné
Retour au sommet