Supprimer ou traiter les valeurs aberrantes détectées
Introduction
Une fois les valeurs aberrantes détectées à l’aide du Z-score (par exemple, avec un seuil de |Z| > 3), il est important de décider de leur sort. Faut-il les supprimer ? Les corriger ? Les conserver avec des ajustements ? Cette étape dépend fortement du contexte métier, de la taille de l’échantillon et de la nature de l’analyse à mener.
Supprimer les valeurs aberrantes
La suppression est la méthode la plus directe. Elle est adaptée lorsque :
- Les valeurs aberrantes représentent une petite portion des données (par exemple < 5%).
- Les données supprimées ne sont pas critiques (pas de perte d’information essentielle).
- On souhaite utiliser des algorithmes sensibles aux outliers (comme les régressions linéaires classiques).
Exemple en Python :
import pandas as pd
from scipy.stats import zscore
df = pd.DataFrame({"valeurs": [10, 12, 14, 13, 11, 100]})
df["zscore"] = zscore(df["valeurs"])
# Supprimer les valeurs dont le Z-score est supérieur à 3 en valeur absolue
df_filtré = df[df["zscore"].abs() <= 3]
print(df_filtré)
Remplacer les valeurs aberrantes
Plutôt que de supprimer les outliers, on peut choisir de les remplacer par une valeur plus représentative. Cela permet de conserver la taille du jeu de données tout en réduisant l’impact des extrêmes.
Méthode : remplacer par la médiane
La médiane est robuste aux extrêmes et constitue une bonne alternative. Cette approche est utile si vous voulez garder un nombre d’observations constant sans fausser la distribution centrale.
mediane = df["valeurs"].median()
df.loc[df["zscore"].abs() > 3, "valeurs"] = mediane
Méthode : remplacer par des valeurs limites
On peut plafonner les valeurs aberrantes en les ramenant à une borne raisonnable (winsorization).
seuil = 3
moyenne = df["valeurs"].mean()
ecart_type = df["valeurs"].std()
borne_inf = moyenne - seuil * ecart_type
borne_sup = moyenne + seuil * ecart_type
df["valeurs_clippées"] = df["valeurs"].clip(lower=borne_inf, upper=borne_sup)
Méthode : remplacement par des interpolations
Si les données sont temporelles ou ordonnées, on peut interpoler les valeurs aberrantes à partir des points voisins.
df.loc[df["zscore"].abs() > 3, "valeurs"] = None
df["valeurs"] = df["valeurs"].interpolate()
Conseils pratiques
- Ne traitez pas les outliers automatiquement : toujours analyser leur nature.
- Documentez toute transformation faite sur les données (auditabilité).
- Conservez les valeurs brutes dans une copie du dataset pour référence ou réversibilité.
Conclusion
Traiter les outliers détectés par le Z-score est une étape délicate. La méthode choisie (suppression, remplacement par médiane, bornes ou interpolation) doit dépendre du contexte métier, de la distribution des données et de l’objectif d’analyse. Il est souvent recommandé de tester plusieurs approches et de comparer les résultats pour choisir la plus pertinente.