2 đ§č Data Wrangling (Nettoyage et PrĂ©paration)
2.1 đ Valeurs Manquantes
đĄ Concept ClĂ© : Le Mythe du Dataset Parfait
Dans lâinvestigation numĂ©rique, le Data Wrangling est le socle de lâintĂ©gritĂ© du verdict. Le premier dĂ©fi est la donnĂ©e manquante (NaN). Avant de âboucher un trouâ, lâenquĂȘteur doit se demander : âPourquoi cet indice a-t-il Ă©tĂ© effacĂ© ?â
2.1.1 đ”ïžââïž MĂ©canismes de lâAbsence
La stratĂ©gie de traitement dĂ©pend de la nature statistique de lâabsence :
MCAR
AlĂ©atoire Pur Lâabsence est un pur hasard.
- Exemple : Une goutte de cafĂ© sur un formulaire rend lâĂąge illisible.
MAR
AlĂ©atoire Conditionnel Lâabsence dĂ©pend dâune autre variable connue.
- Exemple : Un capteur omet le rythme cardiaque uniquement quand le patient dort.
MNAR
Non AlĂ©atoire Lâabsence dĂ©pend de la valeur elle-mĂȘme.
- Exemple : Les hauts revenus refusent de dĂ©clarer leur salaire. Lâabsence est un indice en soi.
2.1.2 đ ïž StratĂ©gies de Traitement
# â Suppression des lignes avec au moins un NaN
df_clean = df.dropna()
# â Suppression d'une colonne trop vide
df_clean = df.drop(columns=['Variable_Inutile'])Verdict : Ă nâutiliser que si le manque est MCAR et reprĂ©sente moins de 5% du total. Risque majeur de perte dâinformation.
# â
Remplissage par la Médiane (Robuste aux outliers)
df['Salaire'] = df['Salaire'].fillna(df['Salaire'].median())
# â
Remplissage par le Mode (Pour le qualitatif)
df['Ville'] = df['Ville'].fillna(df['Ville'].mode()[0])Verdict : Préserve la taille du dataset, mais réduit la variance globale.
from sklearn.impute import IterativeImputer
# đ Utilise l'IA pour "deviner" les valeurs manquantes
imputer = IterativeImputer(max_iter=10, random_state=42)
df_impute = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)Verdict : La mĂ©thode la plus rigoureuse. Utilise les corrĂ©lations entre variables pour estimer lâabsence.
â ïž Danger : Ignorer le MNAR
Si vos donnĂ©es sont MNAR, boucher les trous sans prĂ©caution dĂ©truit lâinformation. Astuce Pro : CrĂ©ez une colonne binaire Salaire_Est_Manquant pour que le modĂšle âsacheâ quâil y a eu une absence suspecte.
đ Astuce Pro : SĂ©ries Temporelles
Pour les flux chronologiques (Bourse, IoT), utilisez la méthode LOCF (Last Observation Carried Forward) : df.fillna(method='ffill').
2.2 đ”ïžââïž Mission 1
Lâinspecteur principal vous a transmis un dossier contenant les donnĂ©es de toutes les personnes prĂ©sentes sur les lieux. Voici comment la base a Ă©tĂ© constituĂ©e :
import pandas as pd
import numpy as np
data = {
'nom': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'age': [25, np.nan, 35, 42, np.nan],
'has_alibi': [True, False, False, True, False]
}
df_suspects = pd.DataFrame(data)Cependant, la base est bruitée. Votre premier objectif : nettoyer les valeurs manquantes et filtrer les suspects qui ont un alibi (colonne has_alibi).
Complétez le code ci-dessous pour démasquer les coupables potentiels.
2.3 đ§č Harmonisation & Correction
Lâenfer des donnĂ©es saisies manuellement
LâhĂ©tĂ©rogĂ©nĂ©itĂ© des formats est un obstacle majeur au traitement algorithmique automatisĂ©. Un algorithme de Machine Learning est dâune bĂȘtise absolue concernant la sĂ©mantique : pour lui, âHommeâ, âhommeâ et âHâ (avec un espace Ă la fin) sont trois catĂ©gories totalement distinctes. LâuniformitĂ© est la rĂšgle dâor pour Ă©viter la dilution de la puissance statistique de votre modĂšle.
Lâharmonisation est une Ă©tape de nettoyage stricte visant Ă unifier le âgrainâ de la donnĂ©e. Elle repose sur deux piliers principaux : le traitement du texte libre et la standardisation temporelle.
2.3.1 đ€ Nettoyage Typographique
Les données issues de formulaires ou de saisies manuelles sont systématiquement polluées par des erreurs typographiques. Les corriger nécessite une approche industrielle.
Les RĂšgles dâOr de la Typographie :
- La Casse UnifiĂ©e : Tout convertir en minuscules (ou majuscules) pour regrouper les variations dâune mĂȘme entitĂ©.
- Le Trim (Ălagage) : Supprimer les espaces invisibles en dĂ©but et fin de chaĂźne.
- Le Remplacement (Regex) : Utiliser les expressions réguliÚres pour supprimer les caractÚres spéciaux indésirables ou extraire des motifs précis.
import pandas as pd
# â Avant : [' Homme', 'homme', 'H', 'Femme ']
df['Genre'] = df['Genre'].str.lower() # Ătape 1 : Tout en minuscules -> [' homme', 'homme', 'h', 'femme ']
df['Genre'] = df['Genre'].str.strip() # Ătape 2 : Enlever les espaces -> ['homme', 'homme', 'h', 'femme']
df['Genre'] = df['Genre'].replace({'h': 'homme', 'f': 'femme'}) # Ătape 3 : Mapping
# â
AprĂšs : ['homme', 'homme', 'homme', 'femme']2.3.2 â±ïž Standardisation Temporelle
Des dates saisies sous des formats multiples (12/04/2026, 2026-04-12, 12 April 26) empĂȘchent toute agrĂ©gation cohĂ©rente et ruinent les modĂšles de sĂ©ries temporelles.
Le Standard Industriel : ISO 8601
Lâimposition du format standard international AAAA-MM-JJ (AnnĂ©e-Mois-Jour) garantit une manipulation sans erreur par toutes les bibliothĂšques logicielles (Python, SQL, Spark).
De plus, il est souvent critique dâextraire des Features (CaractĂ©ristiques) Temporelles Ă partir dâune date (comme le jour de la semaine ou le mois) car lâalgorithme ne âcomprendâ pas une date brute.
# Convertir une colonne hétérogÚne en un objet Datetime standardisé
df['Date_Achat'] = pd.to_datetime(df['Date_Achat'], format='mixed')
# Extraction d'informations temporelles (Feature Engineering de base)
df['Annee'] = df['Date_Achat'].dt.year
df['Mois'] = df['Date_Achat'].dt.month
df['Est_Weekend'] = df['Date_Achat'].dt.dayofweek > 4 # Retourne un booléenValidation de Domaine
Une fois vos donnĂ©es harmonisĂ©es, appliquez toujours une Validation de Domaine. Sâassurer que les donnĂ©es respectent les plages de valeurs logiques propres au mĂ©tier (ex: lâĂąge ne peut pas ĂȘtre de 250 ans, un mois ne peut pas dĂ©passer 12) est la derniĂšre barriĂšre de sĂ©curitĂ© avant la modĂ©lisation.
2.4 đ Transformation et Normalisation
Le problÚme des échelles disparates
Imaginez que vous prĂ©disiez le prix dâune maison avec deux variables : le Nombre de chambres (entre 1 et 5) et le Prix du terrain (entre 10 000 et 1 000 000 âŹ). Pour un algorithme mathĂ©matique (comme un rĂ©seau de neurones), la variable avec les plus grands nombres va âĂ©craserâ lâautre lors du calcul des gradients, la rendant virtuellement invisible. La transformation numĂ©rique ramĂšne tout le monde sur un pied dâĂ©galitĂ©.
Il existe deux grandes approches pour rĂ©soudre ce problĂšme, avec des formules et des cas dâusage trĂšs diffĂ©rents.
2.4.1 đ Normalisation (Min-Max)
La normalisation compresse (ou Ă©tire) les donnĂ©es pour quâelles sâinsĂšrent exactement dans une plage dĂ©finie, gĂ©nĂ©ralement entre 0 et 1.
La mathématique (Formule LaTeX) : X_{norm} = \frac{X - X_{min}}{X_{max} - X_{min}}
- Avantage : Maintient toutes les données dans des limites strictes.
- Le PiĂšge : Comme elle utilise le X_{min} et le X_{max}, elle est extrĂȘmement vulnĂ©rable aux valeurs aberrantes (Outliers). Si une seule maison coĂ»te 1 milliard dâeuros (une erreur de saisie), toutes les autres maisons seront Ă©crasĂ©es autour de 0.001.
2.4.2 đŻ Standardisation (Z-Score)
La standardisation ne fixe pas de limites strictes. Elle décale les données pour que la distribution soit centrée sur une moyenne (\mu) de 0, avec un écart-type (\sigma) de 1.
La mathématique : Z = \frac{X - \mu}{\sigma}
- Avantage : Elle gĂšre globalement mieux les variations naturelles et ne fige pas les donnĂ©es. Elle est indispensable lorsque les donnĂ©es sont collectĂ©es sous des conditions variables (ex: variations dâĂ©clairage pour des images).
- Alternative pour les extrĂȘmes : Sâil y a trop de valeurs aberrantes, on utilise le Robust Scaler. Au lieu de la moyenne, il centre sur la mĂ©diane et divise par lâĂ©cart interquartile (IQR).
2.4.3 â ïž Impact selon lâAlgorithme
Câest ici que lâingĂ©nieur se distingue du dĂ©butant. Faut-il toujours âscalerâ ses donnĂ©es ? Non. Cela dĂ©pend de lâalgorithme choisi.
- đą Indispensable (Distance & Gradients) : Pour les modĂšles basĂ©s sur le calcul de distances gĂ©omĂ©triques (K-Nearest Neighbors, SVM) ou sur la descente de gradient (RĂ©seaux de Neurones, RĂ©gression Logistique). Une variable sur une grande Ă©chelle dominerait les plus petites et ralentirait dramatiquement la convergence.
- đŽ Inutile (ModĂšles basĂ©s sur les Arbres) : Pour les algorithmes dâensemble (Arbres de DĂ©cision, Random Forest, XGBoost, LightGBM). Ces modĂšles divisent les donnĂ©es grĂące Ă des comparaisons de seuils logiques (Si \, X > 10). Les transformations (Z-score ou Min-Max) sont dites monotones : elles prĂ©servent lâordre absolu. Que le seuil soit 10 ou 0.85, la coupure de lâarbre sera mathĂ©matiquement identique.
Focus Deep Learning : Batchnorm et CMN
Pour des architectures IA complexes, on intĂšgre cette mise Ă lâĂ©chelle directement dans le modĂšle. Par exemple, la Batchnorm (Normalisation par lots) stabilise lâapprentissage Ă chaque couche dâun rĂ©seau de neurones. En analyse audio (reconnaissance vocale type LibriSpeech), on utilise la CMN (Cepstral Mean Normalization) pour gommer les distorsions liĂ©es au bruit ambiant.
2.5 đ”ïžââïž Mission 2
Votre instinct Ă©tait bon : Charlie tente de fuir par la mer ! Lâinspecteur principal vient de vous faire parvenir le registre piratĂ© des dĂ©parts maritimes dâaujourdâhui.
Exécutez la cellule ci-dessous pour consulter ce nouveau registre :
import pandas as pd
# Registre des embarquements du jour
donnees_port = {
'passager': ['Alice', 'Bob', 'Charlie', 'Diana', 'Zoe'],
'navire': ['Le Triton', 'L\'Océan', 'La Mouette', 'L\'Océan', 'Le Poséidon'],
'quai': [4, 12, 7, 12, 2]
}
df_embarquements = pd.DataFrame(donnees_port)
print("Registre maritime téléchargé.")
display(df_embarquements)Votre objectif : Croiser (joindre) la liste de vos coupables potentiels avec ce registre maritime pour dĂ©couvrir oĂč se cache Charlie. Indice : Regardez bien le nom des colonnes contenant les noms des individus dans les deux tables !
2.6 đ·ïž Encodage des Variables
La barriĂšre de la langue algorithmique
Le Machine Learning est une discipline purement mathĂ©matique : il calcule des gradients, des distances et des probabilitĂ©s. Par consĂ©quent, il ne peut traiter nativement que des nombres. Si vous lui donnez une colonne âVilleâ avec âParisâ, âLyonâ et âMarseilleâ, il plantera. La conversion des variables catĂ©gorielles (textuelles) en format numĂ©rique est donc une Ă©tape obligatoire.
Lâexpert doit arbitrer entre plusieurs techniques dâencodage selon la nature des catĂ©gories et leur cardinalitĂ© (le nombre de valeurs uniques).
2.6.1 𧟠Méthodes Classiques
- Le Label Encoding (Ătiquettes) : Attribue simplement un nombre entier unique Ă chaque catĂ©gorie (ex: Paris=1, Lyon=2, Marseille=3).
- Le PiĂšge : Cette mĂ©thode introduit un âordre artificielâ (2 est plus grand que 1). Si la variable est nominale (sans ordre), le modĂšle peut dĂ©duire Ă tort que Lyon est supĂ©rieur Ă Paris.
- Quand lâutiliser ? Uniquement pour les variables ordinales (ex: Tailles de vĂȘtement S=1, M=2, L=3).
- Le One-Hot Encoding (Binaire) : Crée une nouvelle colonne binaire (0 ou 1) pour chaque modalité possible de la variable catégorielle.
- LâAvantage : Parfait pour Ă©viter un ordre artificiel sur des variables nominales.
- Le PiĂšge : Si vous avez une variable âCode Postalâ (36 000 valeurs), vous allez crĂ©er 36 000 nouvelles colonnes ! Câest ce quâon appelle le flĂ©au de la dimensionnalitĂ©, qui sature la RAM et provoque du surapprentissage (Overfitting).
2.6.2 đ MĂ©thodes AvancĂ©es
Quand le One-Hot Encoding fait exploser votre mĂ©moire, il faut ruser. Lâindustrie utilise souvent la bibliothĂšque category_encoders pour cela.
- Le Target Encoding (Moyenne Cible) : Substitue une catĂ©gorie par une statistique tirĂ©e de la variable cible (ce quâon cherche Ă prĂ©dire). Par exemple, on remplace âParisâ par le taux de fraude moyen observĂ© Ă Paris sur lâensemble dâentraĂźnement.
- Avantage : Ne crée aucune nouvelle colonne, trÚs performant pour les modÚles basés sur les arbres (XGBoost).
- Danger (Target Leakage) : Risque majeur de âfuite de la cibleâ. Si on calcule la moyenne en incluant la ligne en cours, le modĂšle prend par cĆur le rĂ©sultat au lieu de le prĂ©dire. Il faut appliquer un âlissageâ ou calculer la moyenne en excluant la ligne actuelle (Leave-one-out).
- Le Hashing Encoder (Hachage) : Projette les catĂ©gories dans un espace fini (un nombre dĂ©fini de colonnes, ex: 8 bits) via une fonction de hachage (comme MD5), sans jamais stocker le dictionnaire dâorigine.
- Avantage : Empreinte mĂ©moire minuscule et constante. Accepte de nouvelles catĂ©gories âinconnuesâ en production sans planter.
- InconvĂ©nient : Accepte les âcollisionsâ (deux mots diffĂ©rents peuvent ĂȘtre hachĂ©s dans la mĂȘme colonne), ce qui entraĂźne une lĂ©gĂšre perte dâinformation au profit de la vitesse.
2.6.3 đ» ImplĂ©mentation en Python
import pandas as pd
from category_encoders import TargetEncoder, HashingEncoder
# 1. One-Hot Encoding natif avec Pandas (pour faible cardinalité)
df_onehot = pd.get_dummies(df, columns=['Genre'], drop_first=True)
# 2. Target Encoding (Scikit-learn Contrib)
# On encode la variable "Ville" en fonction de la variable cible "A_Fraude"
target_enc = TargetEncoder(smoothing=10) # Le smoothing évite le Target Leakage
df['Ville_Encoded'] = target_enc.fit_transform(df['Ville'], df['A_Fraude'])
# 3. Hashing Encoder (Pour les trÚs hautes cardinalités comme "ID_Produit")
# On force le résultat sur seulement 8 colonnes (n_components=8)
hash_enc = HashingEncoder(cols=['ID_Produit'], n_components=8)
df_hashed = hash_enc.fit_transform(df)2.7 TP1 : Le Titanic
2.8 đ Conclusion et Transition
Vos donnĂ©es sont maintenant propres et prĂȘtes Ă ĂȘtre analysĂ©es. LâĂ©tape suivante consiste Ă explorer ces donnĂ©es pour en extraire des tendances et des relations.
Câest ce que nous allons voir dans le Chapitre 3 : Analyse Exploratoire des DonnĂ©es (EDA).