1. Typologie et traitement des données manquantes (Missing Values)

Les données réelles ne sont jamais parfaites. Donald Rubin a établi une classification essentielle pour traiter scientifiquement les données manquantes :

  • MCAR (Missing Completely At Random) : L’absence d’une valeur est totalement indépendante des autres variables et de la valeur elle-même.
  • MAR (Missing At Random) : L’absence dépend d’une autre variable observée dans le jeu de données.
  • MNAR (Missing Not At Random) : L’absence dépend directement de la variable non observée (ex. personnes à très hauts revenus refusant d’indiquer leur salaire).

2. Stratégies d’imputation modernes

La suppression pure et simple de lignes (dropna()) entraîne une perte substantielle d’information. On privilégiera des méthodes d’imputation adaptées :

from sklearn.impute import SimpleImputer, KNNImputer

# Imputation par la médiane pour variables numériques asymétriques
imputer_num = SimpleImputer(strategy='median')
df['salaire_estime'] = imputer_num.fit_transform(df[['salaire_estime']])

# Imputation par k-plus proches voisins (KNN) pour préserver les corrélations
knn_imputer = KNNImputer(n_neighbors=5)
features_imputed = knn_imputer.fit_transform(df[['age', 'anciennete', 'montant_achat']])

3. Encodage des variables qualitatives et catégorielles

Les modèles mathématiques requièrent des tenseurs numériques. Le choix de l’encodage dépend de la nature ordinale ou nominale de la variable :

  • Encodage ordinal : pour des catégories hiérarchisées (ex. niveau d’études, tranche tarifaire).
  • One-Hot Encoding (OHE) : pour des variables nominales non ordonnées (ex. cantons suisses : GE, VD, VS, BE), évitant d’introduire une relation d’ordre factice.

4. Mise à l’échelle (Feature Scaling) : Normalisation vs Standardisation

De nombreux algorithmes sont sensibles à l’échelle des grandeurs physiques. Deux approches majeures dominent :

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# Standardisation Z-score (Moyenne 0, Variance 1)
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['age', 'revenu']])

# Normalisation Min-Max dans l'intervalle [0, 1]
minmax = MinMaxScaler()
df_norm = minmax.fit_transform(df[['age', 'revenu']])