Exercice 96 / 100

Projet — Nettoyage de données

ConsignePipeline complet de nettoyage de données

📖 Cours

Premier projet : pipeline de nettoyage de données. Objectif : transformer un DataFrame brut (NaN, doublons, types incohérents) en dataset prêt pour l'analyse.

Étapes typiques

1. EXPLORATION df.shape, df.info(), df.head(), df.describe() df.isnull().sum(), df.duplicated().sum()
2. SUPPRESSION DES DOUBLONS df = df.drop_duplicates()
3. TRAITEMENT DES NAN - supprimer : df.dropna(subset=['col_critique']) - remplir : df['col'] = df['col'].fillna(strategie)
4. HARMONISATION DES TYPES df['age'] = df['age'].astype(int) df['date'] = pd.to_datetime(df['date'])
5. STANDARDISATION DES VALEURS df['ville'] = df['ville'].str.strip().str.title()

Stratégies d'imputation par colonne

Numérique continu → médiane (robuste aux outliers) ou moyenneNumérique discret → mode s'il a peu de valeurs (note sur 5, nb d'enfants), sinon médianeCatégoriel → mode ou catégorie 'Inconnu'Selon un groupe → groupby + transform('median')
Remplir un trou ne se fait pas au hasard : une colonne continue prend sa médiane, une colonne discrète son mode si elle a peu de valeurs et sa médiane sinon, une colonne de texte une catégorie « Inconnu », et parfois la médiane de son propre groupe
Remplir un trou ne se fait pas au hasard : une colonne continue prend sa médiane, une colonne discrète son mode si elle a peu de valeurs et sa médiane sinon, une colonne de texte une catégorie « Inconnu », et parfois la médiane de son propre groupe

Documenter le choix d'imputation : il peut influencer fortement les résultats d'analyse.

Exemple complet

import pandas as pdimport numpy as np
np.random.seed(42)n = 100df = pd.DataFrame({ 'nom': [f'User_{i}' for i in range(n)], 'age': np.random.choice([np.nan, *range(18, 65)], n), 'salaire': np.random.choice([np.nan, *range(25000, 80000, 1000)], n), 'dept': np.random.choice(['Tech', 'RH', 'Finance', None], n),})
print('Avant:')print(f' Shape: {df.shape}')print(f' NaN: {df.isnull().sum().sum()}')
# imputationdf['age'] = df['age'].fillna(df['age'].median())df['salaire'] = df['salaire'].fillna(df.groupby('dept')['salaire'].transform('median'))df['salaire'] = df['salaire'].fillna(df['salaire'].median()) # restantdf['dept'] = df['dept'].fillna('Inconnu')
print('Après:')print(f' NaN: {df.isnull().sum().sum()}')print(f' Stats salaire: mean={df["salaire"].mean():.0f}, median={df["salaire"].median():.0f}')

Validation finale

- aucune NaN inattendue- types corrects (dtypes)- valeurs aberrantes traitées- cohérence métier (âge >= 0, etc.)

En production, encapsuler ce pipeline en une fonction (ou un Pipeline sklearn avec ColumnTransformer) pour la réutiliser sur de nouveaux fichiers sans tout réécrire.

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →