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_Depart n’est pas un oubli : cela signifie simplement que le client est toujours actif !
  • Dans un questionnaire, l’absence de rĂ©ponse pour la variable Salaire trahit 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 :

  1. 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 None dans une colonne de nombres en Pandas, toute la colonne perd son type numĂ©rique rapide (int/float) et est convertie en type object. Cela dĂ©truit instantanĂ©ment la vectorisation et ralentit vos calculs par 100 !
  2. NaN (Not a Number - IEEE 754) :
    • Signification : La norme standard des flottants pour reprĂ©senter une valeur indĂ©terminĂ©e.
    • MĂ©moire : Physiquement, NaN est un float (float64).
    • ⚠ Le PiĂšge Historique : Comme NaN est 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 client 42 devient soudainement 42.0 !
  3. NaT (Not a Time) :
    • Signification : Le cousin de NaN dĂ©diĂ© exclusivement aux dates et heures.
    • MĂ©moire : Permet de conserver le type temporel optimisĂ© de la colonne tout en marquant les dates absentes.
  4. <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 Int64 ou boolĂ©ens boolean), 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 !

đŸ•”ïžâ€â™‚ïž 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 :

  1. Les Chiffres Sentinelles (0, -1, -999) :
    • Le Danger : Les vieux systĂšmes informatiques ou certains capteurs physiques Ă©crivent souvent -999, -1 ou 0 pour 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 Salaire ou l’Age sans nettoyer ces -999, vos statistiques seront totalement aberrantes, sans que Python ne lĂšve la moindre erreur.
  2. 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 un NaN !
  3. 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Ă© vaut Sommeil.

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) :

  1. 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).
  2. 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 :

  1. La Casse UnifiĂ©e : Tout convertir en minuscules (ou majuscules) pour regrouper les variations d’une mĂȘme entitĂ©.
  2. Le Trim (Élagage) : Supprimer les espaces invisibles en dĂ©but et fin de chaĂźne.
  3. 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éen

2.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 int en 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_Spent reprĂ©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.