Cours
La gestion des données manquantes est un problème courant et inhérent à la collecte de données, en particulier avec de grands jeux de données. Les causes sont multiples : informations incomplètes fournies par les participants, non-réponse de personnes refusant de partager des informations, questionnaires mal conçus ou encore suppression de données pour des raisons de confidentialité.
Mal gérées, les données manquantes peuvent biaiser les conclusions de toutes les analyses statistiques menées, et conduire l'entreprise à prendre de mauvaises décisions.
Cet article présente des techniques pour gérer efficacement les valeurs manquantes et leurs implémentations en Python. Nous illustrerons les avantages et limites de chaque méthode afin de vous aider à choisir la plus adaptée à chaque situation.
Identifier les données manquantes
Les données manquantes se présentent sous différents formats. Cette section explique les principaux types de valeurs manquantes et comment les repérer.
Types de données manquantes
On distingue trois grands types de données manquantes : (1) Missing Completely at Random (MCAR), (2) Missing at Random (MAR) et (3) Missing Not at Random (MNAR).
Il est essentiel de bien comprendre chacun d’eux pour choisir la méthode de traitement appropriée.
1) MCAR - Missing completely at random
Ce cas survient lorsque toutes les variables et observations ont la même probabilité d’être manquantes. Imaginez donner à un enfant des Lego de différentes couleurs pour construire une maison. Chaque Lego représente une information, comme la forme ou la couleur. L’enfant peut en perdre certains pendant le jeu. Ces Lego perdus représentent une information manquante, tout comme lorsqu’il ne se souvient plus de la forme ou de la couleur d’une brique. Cette perte est aléatoire et n’affecte pas l’information qu’il détient sur les autres Lego.
2) MAR - Missing at random
Pour MAR, la probabilité qu’une valeur soit manquante est liée à la valeur de la variable elle-même ou à d’autres variables du jeu de données. Autrement dit, toutes les observations et variables n’ont pas la même chance d’être manquantes. Exemple : dans une enquête auprès de la communauté data, les data scientists qui mettent rarement à jour leurs compétences sont plus susceptibles de ne pas connaître les nouveaux algorithmes ou technologies de pointe, et d’ignorer certaines questions. Ici, le caractère manquant dépend de la fréquence de la montée en compétences.
3) MNAR - Missing not at random
MNAR est généralement le scénario le plus complexe. Il s’applique lorsque ni MAR ni MCAR ne conviennent. La probabilité d’être manquant varie alors selon les valeurs d’une même variable, pour des raisons potentiellement inconnues. Exemple : dans une enquête sur les couples mariés, les couples en difficulté pourraient refuser de répondre à certaines questions par gêne.
Méthodes d’identification des données manquantes
Plusieurs méthodes permettent d’identifier les données manquantes dans pandas. Voici les plus courantes.
|
Fonctions |
Descriptions |
|
.isnull() |
Retourne un dataframe pandas dont chaque valeur est un booléen : True si la valeur est manquante, False sinon. |
|
.notnull() |
À l’inverse, les valeurs sont False lorsqu’une valeur NaN ou None est détectée. |
|
.info() |
Génère trois colonnes principales, dont « Non-Null Count » qui indique le nombre de valeurs non manquantes par colonne. |
|
.isna() |
Semblable à isnull et notnull, mais affiche True uniquement quand la valeur manquante est de type NaN. |
Devenez un scientifique ML
Gérer les données manquantes
Il existe plusieurs approches pour traiter les données manquantes. Cette section en couvre quelques-unes, avec leurs avantages et inconvénients.
Pour illustrer le cas d’usage, nous utiliserons les Loan Data disponibles sur DataLab ainsi que le code source présenté dans le tutoriel.
Comme ce jeu de données ne contient pas de valeurs manquantes, nous utiliserons un sous-ensemble (100 lignes) et introduirons manuellement des valeurs manquantes.
import pandas as pd
sample_customer_data = pd.read_csv("data/customer_churn.csv", nrows=100)
sample_customer_data.info()

Échantillon de 100 observations avant l’introduction de valeurs manquantes
Introduisons 50 % de valeurs manquantes dans chaque colonne du dataframe.
import numpy as np
def introduce_nan(x,percentage):
n = int(len(x)*(percentage - x.isna().mean()))
idxs = np.random.choice(len(x), max(n,0), replace=False, p=x.notna()/x.notna().sum())
x.iloc[idxs] = np.nan
L’application de la fonction aux données produit le résultat suivant.
sample_customer_data.apply(introduce_nan, percentage=.5)
sample_customer_data.info()

Échantillon de 100 observations après l’introduction de valeurs manquantes
Ci-dessous, les cinq premières lignes du jeu de données.
sample_customer_data.head()

Cinq premières lignes avec des valeurs nulles
Suppression de données
La fonction dropna() est le moyen le plus simple de supprimer des observations ou des variables contenant des valeurs manquantes. Voici quelques techniques.
1) Supprimer des observations avec des valeurs manquantes
Trois scénarios peuvent se produire lors de la suppression d’observations :
dropna(): supprime toutes les lignes contenant des valeurs manquantes.
drop_na_strategy = sample_customer_data.dropna()
drop_na_strategy.info()

Suppression d’observations avec la fonction dropna() par défaut
On constate que toutes les observations sont supprimées, ce qui peut être très risqué pour la suite de l’analyse.
dropna(how = ‘all’): supprime les lignes où toutes les valeurs de colonnes sont manquantes.
drop_na_all_strategy = sample_customer_data.dropna(how="all")
drop_na_all_strategy.info()
D’après la sortie ci-dessous, aucune observation n’a toutes ses colonnes manquantes.

Suppression d’observations via la stratégie « all »
dropna(thresh = minimum_value): supprime les lignes selon un seuil. Cette stratégie fixe un nombre minimal de valeurs non manquantes pour conserver les lignes.
drop_na_thres_strategy = sample_customer_data.dropna(thresh=0.6)
drop_na_thres_strategy.info()
Avec un seuil à 60 %, le résultat est identique au précédent.

Suppression d’observations avec seuil
2) Supprimer des colonnes avec des valeurs manquantes
Le paramètre axis = 1 indique explicitement que l’on agit sur les colonnes et non sur les lignes.
dropna(axis = 1): supprime toutes les colonnes contenant des valeurs manquantes.
drop_na_cols_strategy = sample_customer_data.dropna(axis=1)
drop_na_cols_strategy.info()
Il ne reste plus aucune colonne : chacune contenait au moins une valeur manquante.

Dataframe vide après dropna() sur les colonnes
Comme beaucoup d’approches, dropna() a des atouts et des limites.
Avantages
- Méthode directe et simple à utiliser.
- Utile lorsque les valeurs manquantes sont sans importance.
Inconvénients
- Peut entraîner une perte d’information, source de biais dans le jeu de données final.
- Inadaptée si les données ne sont pas manquantes complètement au hasard.
- Avec une forte proportion de valeurs manquantes, la taille du jeu de données peut être fortement réduite, ce qui impacte toutes les analyses statistiques.
Imputation par la moyenne/médiane
Ces stratégies de remplacement sont explicites : on remplace les valeurs manquantes d’une colonne par la moyenne ou la médiane des valeurs observées de cette colonne.
La distribution normale est le cas idéal. Malheureusement, ce n’est pas toujours le cas. La médiane est alors utile car elle est moins sensible aux valeurs extrêmes.
En Python, la fonction fillna() de pandas permet d’effectuer ces remplacements.
- Exemple d’imputation par la moyenne.
mean_value = sample_customer_data.mean()
mean_imputation = sample_customer_data.fillna(mean_value)

Résultat de l’imputation par la moyenne
- Exemple d’imputation par la médiane
median_value = sample_customer_data.median()
median_imputation = sample_customer_data.fillna(median_value)
median_imputation.head()

Résultat de l’imputation par la médiane
Avantages
- Simplicité et mise en œuvre rapide.
- L’imputation s’appuie sur l’information existante des données non manquantes, sans besoin de données additionnelles.
- Peut fournir une bonne estimation des valeurs manquantes : la moyenne pour des données proches de la normale, la médiane pour des distributions asymétriques.
Inconvénients
- Inapplicable aux variables catégorielles : réservé aux variables numériques.
- La moyenne est sensible aux valeurs aberrantes et peut mal représenter la tendance centrale. La médiane peut aussi ne pas être représentative selon le contexte.
- Suppose que les données soient MCAR, ce qui n’est pas toujours vrai.
Imputation par échantillon aléatoire
Le principe diffère des méthodes précédentes et nécessite quelques étapes supplémentaires.
- Créer deux sous-ensembles à partir des données d’origine.
- Le premier contient les observations complètes, le second celles avec des valeurs manquantes.
- Sélectionner aléatoirement une observation dans chaque sous-ensemble.
- Remplacer les données manquantes de l’observation incomplète par les valeurs correspondantes de l’observation complète.
- Répéter jusqu’à ce qu’il n’y ait plus de valeurs manquantes.
def random_sample_imputation(df):
cols_with_missing_values = df.columns[df.isna().any()].tolist()
for var in cols_with_missing_values:
# extract a random sample
random_sample_df = df[var].dropna().sample(df[var].isnull().sum(),
random_state=0)
# re-index the randomly extracted sample
random_sample_df.index = df[
df[var].isnull()].index
# replace the NA
df.loc[df[var].isnull(), var] = random_sample_df
return df
df = sample_customer_data.copy()
random_sample_imp_df = random_sample_imputation(sample_customer_data)
random_sample_imp_df.head()

Imputation par échantillon aléatoire
Avantages
- Méthode simple et facile à mettre en œuvre.
- Couvre à la fois les variables numériques et catégorielles.
- Moins de distorsion de la variance et préservation de la distribution initiale, contrairement à la moyenne ou à la médiane.
Inconvénients
- Le caractère aléatoire n’est pas toujours adapté et peut introduire du bruit, menant à des conclusions erronées.
- Comme la moyenne et la médiane, suppose des données MCAR.
Imputation multiple
Il s’agit d’une technique d’imputation multivariée : l’information manquante est comblée en tenant compte des autres variables.
Par exemple, si le revenu d’une personne est manquant, il est incertain de savoir si elle a un crédit immobilier. Pour affiner l’estimation, on considère d’autres caractéristiques : score de crédit, profession, statut de propriétaire, etc.
La Multiple Imputation by Chained Equations (MICE) est l’une des méthodes les plus répandues en imputation multivariée. Pour mieux comprendre MICE, considérons l’ensemble de variables X1, X2, …, Xn, dont certaines ont des valeurs manquantes.
L’algorithme fonctionne ainsi :
- Pour chaque variable, remplacer les valeurs manquantes par une imputation simple (p. ex. la moyenne), servant de « placeholders ».
- Les « placeholders » de la première variable X1 sont régressés via un modèle où X1 est la variable dépendante et les autres sont indépendantes. On répète pour X2 comme dépendante, etc., jusqu’à ce que chaque variable ait joué le rôle de variable dépendante au moins une fois.
- Remplacer ensuite les « placeholders » par les prédictions du modèle de régression.
- Répéter le processus sur un certain nombre de cycles, généralement dix selon Raghunathan et al. 2002, en mettant à jour l’imputation à chaque itération.
- À la fin, les valeurs manquantes sont idéalement remplacées par des prédictions reflétant au mieux les relations observées dans les données.
L’implémentation s’appuie sur la bibliothèque miceforest.
Commencez par installer la bibliothèque avec pip.
pip install miceforest
Puis importez le module ImputationKernel et créez le kernel d’imputation.
from miceforest import ImputationKernel
mice_kernel = ImputationKernel(
data = sample_customer_data,
save_all_iterations = True,
random_state = 2023
)
Exécutez ensuite le kernel sur deux itérations et générez les données imputées.
mice_kernel.mice(2)
mice_imputation = mice_kernel.complete_data()
mice_imputation.head()

Imputation multiple
Avantages
- Très efficace pour traiter des valeurs manquantes sur plusieurs variables et types de données.
- Peut produire de bien meilleurs résultats que l’imputation par la moyenne ou la médiane.
- De nombreux algorithmes (comme K-Nearest Neighbors, Random forest, ou les réseaux de neurones) peuvent servir de moteur de prédiction pour l’imputation multiple.
Inconvénients
- Suppose des données MAR.
- Peut être coûteuse en calcul par rapport à d’autres techniques, surtout avec de grands jeux de données.
- Demande plus d’efforts que les méthodes précédentes.
Parmi toutes les imputations, on peut identifier celles qui se rapprochent le plus de la distribution des données d’origine.
La moyenne (en jaune) et la médiane (en rouge) s’écartent nettement de la distribution originale de la colonne « Charge amount », elles ne sont donc pas idéales ici.
mean_imputation["Charge Amount Mean Imp"] = mean_imputation["Charge Amount"]
median_imputation["Charge Amount Median Imp"] = median_imputation["Charge Amount"]
random_sample_imp_df["Charge Amount Random Imp"] = random_sample_imp_df["Charge Amount"]
Avec les nouvelles colonnes créées pour chaque type d’imputation, nous pouvons tracer les distributions.
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
sample_customer_data["Charge Amount"].plot(kind='kde',color='blue')
mean_imputation["Charge Amount Mean Imp"].plot(kind='kde',color='yellow')
median_imputation["Charge Amount Median Imp"].plot(kind='kde',color='red')

Distribution « Charge Amount » : données originales vs moyenne vs médiane
En traçant l’imputation multiple et l’imputation aléatoire ci-dessous, on observe un recouvrement quasi parfait avec les données originales. Ces imputations sont donc meilleures que la moyenne et la médiane.
random_sample_imp_df["Charge Amount Random Imp"] = random_sample_imp_df["Charge Amount"]
mice_imputation["Charge Amount MICE Imp"] = mice_imputation["Charge Amount"]
mice_imputation["Charge Amount MICE Imp"].plot(kind='kde',color='black')
random_sample_imp_df["Charge Amount Random Imp"].plot(kind='kde',color='purple')
plt.legend()

Distribution « Charge Amount » : original vs moyenne vs médiane vs MICE vs aléatoire
Le cours Handling Missing Data with Imputations in R est une excellente ressource pour approfondir les stratégies de traitement des valeurs manquantes. Il couvre la visualisation et les tests statistiques pour reconnaître les motifs de données manquantes, ainsi que leur imputation via des méthodes statistiques et de machine learning.
Dans le même esprit, le cours Dealing with Missing Data in Python explique comment identifier, analyser, supprimer et imputer des données manquantes en Python.
Bonnes pratiques
Choisir la bonne méthode d’imputation selon le type de données manquantes
Il existe de nombreuses stratégies d’imputation et il ne faut pas les appliquer à l’aveugle. Adopter la bonne approche évite d’introduire des biais et de prendre de mauvaises décisions.
Le tableau suivant indique quelles méthodes privilégier selon le type de données manquantes. La liste n’est pas exhaustive, mais regroupe les plus utilisées.
|
Type de données manquantes |
Méthode d’imputation |
|
Missing Completely At Random |
Moyenne, médiane, mode ou toute autre méthode d’imputation |
|
Missing At Random |
Imputation multiple, imputation par régression |
|
Missing Not At Random |
Substitution par motif, estimation du maximum de vraisemblance |
Évaluer l’impact de l’imputation sur l’analyse globale
Gardez à l’esprit que, quelle que soit la méthode, les données originales ne peuvent pas être « retrouvées ». En revanche, on peut générer des jeux imputés qui se rapprochent au mieux de la réalité.
Voici quelques étapes clés pour l’évaluation.
- Tester plusieurs techniques d’imputation afin d’identifier la plus robuste. Cela aide à repérer les biais et variations entre méthodes.
- Comparer les données imputées finales aux données initiales non imputées pour juger de la fiabilité de la méthode.
- Inclure le processus d’imputation dans toute la chaîne d’analyse, du nettoyage des données jusqu’à la construction de tout modèle de machine learning.
Communiquer les données manquantes et les méthodes d’imputation aux parties prenantes
Des données de qualité sont l’objectif de toute partie prenante et de tout professionnel de la donnée.
L’honnêteté et la transparence sont essentielles lorsqu’on communique sur les données manquantes. Points d’attention :
- Préciser le contexte : MCAR, MAR ou MNAR.
- Expliquer clairement et documenter les méthodes utilisées pour traiter les manquants, en détaillant avantages et limites.
- Présenter les résultats de façon intelligible pour les parties prenantes.
Conclusion
Cet article a expliqué ce que sont les données manquantes et leur impact sur les décisions basées sur les données. Il a présenté plusieurs stratégies pour les traiter, ainsi que leurs forces et faiblesses, afin d’éclairer la prise de décision.
Nous espérons qu’il vous apporte des leviers concrets pour gérer efficacement vos problèmes de données manquantes.
Obtenez une certification en science des données
Validez vos compétences professionnelles de data scientist.

FAQ sur les valeurs manquantes
Qu’est-ce que les données manquantes ?
Les données manquantes signifient que certaines ou toutes les variables du jeu de données comportent des valeurs absentes.
Quels sont les différents types de données manquantes ?
On distingue trois principaux types de données manquantes : Missing Completely at Random (MCAR), Missing At Random (MAR) et Missing Not At Random (MNAR).
Comment gérer les données manquantes ?
Plusieurs approches existent pour traiter les valeurs manquantes : imputation par la moyenne, la médiane, le mode, imputation par échantillon aléatoire et imputation multiple. La liste n’est pas exhaustive et chaque méthode a ses avantages et ses limites.
Pourquoi les données manquantes sont-elles importantes ?
Elles sont cruciales à considérer car elles peuvent dégrader les performances de vos modèles de machine learning et biaiser les conclusions de vos analyses statistiques, menant ainsi l’entreprise à de mauvaises décisions.