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 đłïž La Typologie du Vide : LâAbsence comme Information
Avant de chercher Ă combler ou supprimer les donnĂ©es manquantes, le premier rĂ©flexe de lâenquĂȘteur doit ĂȘtre de comprendre ce que ce âvideâ cherche Ă lui dire.
đ”ïžââïž Concept ClĂ© : LâAbsence est une Preuve
En Data Science, lâabsence de donnĂ©e est en soi une donnĂ©e. Elle porte en elle une information cruciale. Exemples :
- Dans une table de clients, lâabsence de
Date_De_Departnâest pas un oubli : cela signifie simplement que le client est toujours actif ! - Dans un questionnaire, lâabsence de rĂ©ponse pour la variable
Salairetrahit souvent un refus volontaire de rĂ©pondre liĂ© Ă des revenus trĂšs Ă©levĂ©s ou trĂšs bas (biais de dĂ©sirabilitĂ© sociale). - En mĂ©decine, lâabsence de diagnostic de maladie pulmonaire dans un dossier suggĂšre par dĂ©faut que le patient est en bonne santĂ©.
Comme le disait Sherlock Holmes dans lâenquĂȘte de Silver Blaze, la clĂ© du mystĂšre rĂ©sidait dans le fait que le chien nâaboyait pas pendant la nuit : lâabsence de signal Ă©tait le signal le plus bruyant.
đ» Les ReprĂ©sentations en MĂ©moire
Pour manipuler le vide en Python et Pandas, vous rencontrerez plusieurs visages techniques de lâabsence, chacun ayant ses propres spĂ©cificitĂ©s physiques en RAM :
None(LâObjet Python) :- Signification : Le type vide standard de Python (
NoneType). - MĂ©moire : Câest un pointeur vers un objet gĂ©nĂ©rique en RAM.
- Danger : Si vous insérez
Nonedans une colonne de nombres en Pandas, toute la colonne perd son type numérique rapide (int/float) et est convertie en typeobject. Cela détruit instantanément la vectorisation et ralentit vos calculs par 100 !
- Signification : Le type vide standard de Python (
NaN(Not a Number - IEEE 754) :- Signification : La norme standard des flottants pour représenter une valeur indéterminée.
- Mémoire : Physiquement,
NaNest un float (float64). - â ïž Le PiĂšge Historique : Comme
NaNest un flottant, Pandas (dans ses anciennes versions ou sans typage explicite) convertit automatiquement toute colonne dâentiers contenant une valeur manquante en colonne de floats. Votre identifiant client42devient soudainement42.0!
NaT(Not a Time) :- Signification : Le cousin de
NaNdédié exclusivement aux dates et heures. - Mémoire : Permet de conserver le type temporel optimisé de la colonne tout en marquant les dates absentes.
- Signification : Le cousin de
<NA>(LâAbsence Native Moderne - Arrow/Pandas Extension) :- Signification : Le type vide moderne introduit pour rĂ©soudre les limites historiques de
NaN. - Mémoire : Utilise un Bitmask (masque de bits). La colonne conserve son type primitif exact (ex: entiers
Int64ou boolĂ©ensboolean), tandis quâun tableau de bits invisible en RAM (un masque de 0 et de 1) indique si la valeur de chaque ligne est prĂ©sente ou manquante. Câest lâapproche la plus propre et performante !
- Signification : Le type vide moderne introduit pour résoudre les limites historiques de
đ”ïžââïž Attention : Le Danger des Vides MasquĂ©s (Valeurs Arbitraires)
Les types NaN et <NA> sont faciles à repérer car ils déclenchent les fonctions standard comme df.isna(). Cependant, le véritable cauchemar du Data Scientist réside dans les valeurs manquantes arbitraires ou masquées, qui passent sous le radar des outils de détection automatiques :
- Les Chiffres Sentinelles (
0,-1,-999) :- Le Danger : Les vieux systÚmes informatiques ou certains capteurs physiques écrivent souvent
-999,-1ou0pour signifier âmesure impossibleâ. - Pourquoi câest difficile : Ce sont des nombres tout Ă fait valides pour la machine ! Si vous calculez la moyenne dâune variable comme le
Salaireou lâAgesans nettoyer ces-999, vos statistiques seront totalement aberrantes, sans que Python ne lĂšve la moindre erreur.
- Le Danger : Les vieux systÚmes informatiques ou certains capteurs physiques écrivent souvent
- Les ChaĂźnes Vides (
""ou" ") :- Le Danger : Un utilisateur laisse un champ vide dans un formulaire web, ce qui crée une chaßne de caractÚres de longueur zéro.
- Pourquoi câest difficile : Pour Pandas, une chaĂźne vide ou composĂ©e dâespaces reste du texte valide (
string). Elle nâest pas dĂ©tectĂ©e comme unNaN!
- Les ChaĂźnes de Texte Trompeuses (
"null","NULL","None","N/A","nan","?") :- Le Danger : Lors dâune exportation prĂ©cĂ©dente dâune base de donnĂ©es, les valeurs manquantes ont Ă©tĂ© Ă©crites en texte brut dans le fichier dâĂ©change.
- Pourquoi câest difficile : Pandas interprĂšte ces valeurs comme du vrai texte.
"N/A"nâest pas reconnu comme du vide, câest traitĂ© comme une chaĂźne valide de 3 caractĂšres !
đĄ LâAstuce de lâEnquĂȘteur : Pensez Ă utiliser le paramĂštre na_values=['', ' ', '-999', 'null', 'NULL', '?'] dĂšs la lecture de votre fichier avec pd.read_csv() pour forcer Pandas Ă traduire ces intrus en vĂ©ritables NaN exploitables de maniĂšre prĂ©ventive !
2.1.2 đ”ïžââïž MĂ©canismes de lâAbsence
La stratĂ©gie de traitement dĂ©pend de la nature statistique de lâabsence :
MCAR
Missing Completely At Random
(ComplĂštement au Hasard)
AlĂ©atoire Pur Lâabsence est le fruit dâun pur hasard physique, indĂ©pendant de toutes les autres variables et de la valeur elle-mĂȘme.
- Exemple : Une goutte de cafĂ© sur un formulaire papier rend lâĂąge dâun suspect illisible.
MAR
Missing At Random
(Aléatoire Conditionnel)
AlĂ©atoire Conditionnel Lâabsence dĂ©pend dâune autre variable connue et observĂ©e dans le jeu de donnĂ©es, mais pas de la valeur manquante elle-mĂȘme.
- Exemple : Un capteur omet dâenregistrer le rythme cardiaque uniquement lorsque la variable
ActivitévautSommeil.
MNAR
Missing Not At Random
(Non Aléatoire)
Non AlĂ©atoire Lâabsence dĂ©pend directement de la valeur manquante elle-mĂȘme. Câest le cas le plus complexe et critique.
- Exemple : Les suspects aux revenus trĂšs Ă©levĂ©s refusent systĂ©matiquement de dĂ©clarer leur salaire. Lâabsence est un indice majeur en soi.
2.1.3 đ ïž 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 (Missing Not At Random)
MNAR (Non-AlĂ©atoire) : Lâabsence dâune donnĂ©e est directement corrĂ©lĂ©e Ă la valeur de la donnĂ©e manquante elle-mĂȘme.
- Exemple industriel : Un capteur thermique industriel surchauffe et plante dÚs que la température dépasse 150^\circ\text{C}. Toutes les mesures de surchauffe sont donc manquantes.
- Le Risque : Si vous imputez naĂŻvement ces trous par la tempĂ©rature moyenne (70^\circ\text{C}), vous dissimulez complĂštement les alertes de sĂ©curitĂ©. Votre modĂšle dâIA conclura faussement que la machine est parfaitement stable alors quâelle est en train de fondre !
đ ïž LâArme SecrĂšte en Pratique : La Colonne Indicateur Binaire
Pour prĂ©server lâinformation cruciale portĂ©e par un manque MNAR tout en permettant Ă vos algorithmes de sâentraĂźner sans planter, la meilleure pratique industrielle est de crĂ©er une colonne binaire dâindicateur dâabsence (ex: Salaire_Est_Manquant ou Temp_Est_Manquante) :
- Création du Flag : Vous ajoutez une nouvelle colonne booléenne (0 si la donnée originale est présente, 1 si elle est absente).
- Imputation SĂ©curisĂ©e : Vous âbouchezâ ensuite la colonne originale avec une imputation standard (comme la mĂ©diane) pour Ă©liminer les valeurs nulles.
Pourquoi câest une idĂ©e de gĂ©nie en Machine Learning ?
- PrĂ©servation du Signal : Les modĂšles de Machine Learning modernes (comme les ForĂȘts AlĂ©atoires ou XGBoost) excellent pour dĂ©tecter les interactions. En voyant le flag Ă 1, le modĂšle comprend instantanĂ©ment : âAttention, cette valeur de tempĂ©rature Ă 70^\circ\text{C} est artificielle, il sâagit en rĂ©alitĂ© dâune surchauffe masquĂ©e !â.
- Ajustement des Poids : Lâalgorithme peut apprendre des rĂšgles de dĂ©cision spĂ©cifiques aux cas dâabsence (ex: âSi
Temp_Est_Manquante == 1, alors probabilitĂ© de panne = 99%â). Sans ce flag binaire, lâinformation MNAR est perdue Ă jamais, noyĂ©e dans lâimputation !
đ 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 ', 'nb', 'non communiquĂ©']
df['Genre'] = df['Genre'].str.lower() # Ătape 1 : Tout en minuscules -> [' homme', 'homme', 'h', 'femme ', 'nb', 'non communiquĂ©']
df['Genre'] = df['Genre'].str.strip() # Ătape 2 : Enlever les espaces -> ['homme', 'homme', 'h', 'femme', 'nb', 'non communiquĂ©']
df['Genre'] = df['Genre'].replace({
'h': 'homme',
'f': 'femme',
'nb': 'non-binaire',
'na': 'non-communique'
}) # Ătape 3 : Mapping inclusif et standardisĂ©
# â
AprĂšs : ['homme', 'homme', 'homme', 'femme', 'non-binaire', 'non-communique']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Ă©en2.3.3 đ°ïž Les PiĂšges des UNIX Timestamps & LâĂternel Janvier 1970
En informatique et en Data Engineering, le temps est mesurĂ© Ă partir de lâEpoch UNIX : le 1er Janvier 1970 Ă 00:00:00 UTC. Le temps Ă©coulĂ© est alors stockĂ© sous forme dâun nombre entier reprĂ©sentant les secondes (ou millisecondes) passĂ©es depuis cet instant originel.
Lors de la manipulation de ces UNIX Timestamps, trois piÚges redoutables attendent les développeurs non avertis :
1. LâErreur dâUnitĂ© : Secondes vs Millisecondes
Câest le bug le plus frĂ©quent.
- Les systĂšmes UNIX traditionnels (et Python) comptent le temps en secondes (nombre Ă 10 chiffres, ex:
1716032400\rightarrow 18 Mai 2024). - Les bases de données modernes et JavaScript comptent le temps en millisecondes (nombre à 13 chiffres, ex:
1716032400000).
Le SymptĂŽme :
- Si vous essayez de lire des millisecondes comme si câĂ©taient des secondes dans Pandas sans spĂ©cifier lâunitĂ©, la date sera projetĂ©e dans un futur lointain (au-delĂ de lâan 50 000 !).
- Si vous lisez des secondes comme des millisecondes, le nombre est divisĂ© virtuellement par 1000. Par consĂ©quent, Pandas calculera une date extrĂȘmement proche du 1er Janvier 1970 (ex:
1970-01-20). Si vous observez une avalanche dâĂ©vĂ©nements datant de janvier 1970 dans votre jeu de donnĂ©es, cherchez une erreur de division par 1000 !
# â ERREUR : Pandas suppose par dĂ©faut des nanosecondes ou des secondes
df['Date_Brute'] = pd.to_datetime(df['Timestamp_Java'])
# -> Retourne l'an 56000+ !
# â
RECTIFICATION : Préciser explicitement l'unité de mesure en RAM
df['Date_Propre'] = pd.to_datetime(df['Timestamp_Java'], unit='ms')
# -> Retourne la bonne date contemporaine !2. Le PiĂšge des Valeurs Nulles / 0
Si une transaction nâa pas de date valide et que le systĂšme remplit par dĂ©faut ce champ avec la valeur entiĂšre 0 ou null mal interprĂ©tĂ©, toute conversion temporelle naĂŻve va traduire cette valeur par 1970-01-01 00:00:00. Un bon analyste doit immĂ©diatement suspecter toute date correspondant exactement au premier jour de lâan 1970 comme Ă©tant une valeur manquante dĂ©guisĂ©e !
3. Les Fuseaux Horaires (Timezones)
Une date sans fuseau horaire associĂ© est appelĂ©e date naive (ex: 2026-05-18 13:44:00). Câest une bombe Ă retardement. Si un serveur de collecte est basĂ© Ă Paris (UTC+2) et que votre pipeline de calcul tourne sur un conteneur cloud configurĂ© en UTC, vous aurez un dĂ©calage systĂ©matique de 2 heures. Certaines transactions nocturnes changeront ainsi carrĂ©ment de jour !
đĄ La RĂšgle dâOr : Stockez et traitez toujours vos timestamps en UTC (Timezone-Aware). Convertissez-les en heure locale (ex: Europe/Paris) uniquement au moment de lâaffichage final pour lâutilisateur.
# Standardiser en UTC
df['Date_UTC'] = pd.to_datetime(df['Date_Achat'], utc=True)
# Convertir au fuseau horaire local de l'enquĂȘte
df['Date_Paris'] = df['Date_UTC'].dt.tz_convert('Europe/Paris')đĄïž Concept ClĂ© : Quâest-ce que le Domaine de DĂ©finition ?
La derniĂšre barriĂšre de sĂ©curitĂ© avant dâenvoyer vos donnĂ©es dans un modĂšle dâIA est la Validation de Domaine. Pour comprendre son importance, vous devez savoir distinguer quatre dimensions fondamentales souvent confondues par les dĂ©butants :
â ïž Pourquoi le Type et lâUnitĂ© ne Suffisent Pas ?
Imaginez que vous analysiez les dossiers mĂ©dicaux dâune clinique. Vous rencontrez une ligne avec un Ăąge Ă©gal Ă -45 ou 250 :
- La Nature est respectĂ©e (câest bien un nombre).
- Le Type est respectĂ© (câest bien un entier
inten RAM). - LâUnitĂ© est respectĂ©e (ce sont bien des annĂ©es).
- Le Domaine est violĂ© ! Un Ăąge de -45 ou de 250 ans est physiquement et biologiquement impossible pour un ĂȘtre humain vivant.
Sans validation de domaine, ces intrus passeraient inaperçus, sâinfiltreraient dans vos modĂšles de Machine Learning et fausseraient dramatiquement toutes vos prĂ©dictions (ex: accorder un prĂȘt bancaire Ă un bĂ©bĂ© fictif de -45 ans !).
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).
đ Confrontation Interactive : Normalisation (Min-Max) vs Standardisation (Z-Score)
Manipulez le curseur ci-dessous pour insĂ©rer une valeur extrĂȘme (outlier) dans le jeu de donnĂ©es saines [10, 15, 20, 25]. Observez en temps rĂ©el lâeffet destructeur de tassement sur la Normalisation Min-Max, tandis que la Standardisation Z-Score conserve lâespacement et la structure des donnĂ©es saines :
DĂ©terminez par vous-mĂȘme la sensibilitĂ© de chaque mĂ©thode grĂące au simulateur vectoriel interactif ci-dessous :
đ§Œ Nettoyage Vectoriel
Ajustez la mĂ©thode de dĂ©tection et le seuil de tolĂ©rance pour analyser en temps rĂ©el lâimpact de lâexclusion des valeurs aberrantes sur notre jeu de donnĂ©es.
âïž Z-Score vs IQR : Quelle diffĂ©rence sur le terrain ?
Bien que ces deux mĂ©thodes cherchent Ă identifier ou gĂ©rer les valeurs extrĂȘmes, elles reposent sur des philosophies mathĂ©matiques opposĂ©es :
- Z-Score (Le Centre Statistique) : Il sâappuie sur la Moyenne (\mu) et lâĂcart-type (\sigma).
- Le ProblĂšme : Si une erreur est gigantesque (ex: un salaire saisi Ă 10 000 000 ⏠au lieu de 1 000 âŹ), elle va âtirerâ la moyenne vers elle et gonfler lâĂ©cart-type. Cela dĂ©cale la frontiĂšre de sĂ©curitĂ© et masque dâautres anomalies rĂ©elles.
- Formule : Z = \frac{x - \mu}{\sigma}
- IQR (Le CĆur des DonnĂ©es / Robust) : Il sâappuie sur la MĂ©diane et la BoĂźte Interquartile (Q3 - Q1, qui contient les 50 % des donnĂ©es les plus centrales).
- LâAvantage : LâIQR est robuste aux extrĂȘmes. MĂȘme si vous introduisez une anomalie Ă des milliards de kilomĂštres, la mĂ©diane et la boĂźte interquartile resteront fixes. Le seuil de sĂ©curitĂ© reste parfaitement en place !
đĄ En rĂ©sumĂ© : Utilisez la standardisation classique (Z-Score) pour des distributions symĂ©triques sans anomalies sauvages (courbe de Gauss). Optez pour le Robust Scaler / IQR dĂšs que vos variables sont asymĂ©triques ou polluĂ©es par des erreurs extrĂȘmes.
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 đ·ïž 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.5.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.5.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.
đ SchĂ©ma Interactif : Les MĂ©canismes dâEncodage sur les SĂ©ries CatĂ©gorielles
SĂ©lectionnez le mode dâencodage dans les onglets ci-dessous pour voir comment une sĂ©rie catĂ©gorielle de dĂ©part est physiquement projetĂ©e sous forme de sĂ©rie(s) ou matrice numĂ©rique en sortie :
2.5.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.6 TP1 : Le Titanic (Wrangling)
Dans ce premier Travail Pratique, vous allez mettre en pratique les techniques fondamentales de Data Wrangling sur le cĂ©lĂšbre jeu de donnĂ©es du Spaceship Titanic. Lâobjectif est dâeffectuer un nettoyage complet pour restaurer une base de donnĂ©es corrompue afin de la rendre exploitable pour les Ă©tapes futures.
2.6.1 đŻ Objectifs PĂ©dagogiques
- Audit de Qualité : Explorer un jeu de données brut pour dresser un bilan des anomalies physiques, des doublons et des incohérences de typage.
- Gestion des Valeurs Manquantes : Concevoir et appliquer des stratĂ©gies dâimputation adaptĂ©es (imputation par la mĂ©diane pour lâĂąge, par la valeur par dĂ©faut pour le statut VIP).
- Feature Engineering Initial : Apprendre à combiner et agréger des variables corrélées en créant une nouvelle caractéristique de synthÚse (
Total_Spentreprésentant la somme des dépenses individuelles). - Export Propre : Sauvegarder vos résultats dans un format structuré et standardisé pour garantir la reproductibilité.
2.6.2 đ Fichiers du TP
Vous pouvez explorer lâarborescence des fichiers du TP ci-dessous et tĂ©lĂ©charger directement lâarchive complĂšte de dĂ©part :
2.7 đ Conclusion et Transition
Vos donnĂ©es sont maintenant propres et prĂȘtes Ă ĂȘtre analysĂ©es. LâĂ©tape suivante consiste Ă apprendre Ă les visualiser pour mieux les comprendre et les explorer.
Câest ce que nous allons voir dans le Chapitre 3 : Visualisation des DonnĂ©es.