Appliquer la Winsorization pour limiter les valeurs extrêmes

Lors de l’analyse de données réelles, il est fréquent de rencontrer des valeurs extrêmes (outliers) qui peuvent fausser les statistiques descriptives et les modèles prédictifs. La Winsorization est une méthode robuste permettant de limiter l’impact de ces valeurs extrêmes en les remplaçant par des bornes définies.


Pourquoi gérer les valeurs extrêmes ?

Les outliers peuvent influencer négativement les modèles de machine learning. Par exemple :

Dans certains cas, les outliers sont le reflet de données réelles importantes. Dans d’autres, ils sont dus à des erreurs de saisie ou à des événements anormaux. La Winsorization permet de traiter ces valeurs sans les supprimer, ce qui conserve la structure du jeu de données.


Qu’est-ce que la Winsorization ?

La Winsorization consiste à remplacer les valeurs extrêmes situées au-delà d’un certain quantile par les valeurs des quantiles limites eux-mêmes. Par exemple :

Ce processus rend les données plus robustes aux extrêmes tout en conservant leur forme générale.


Visualisation de la Winsorization

Considérons une distribution avant et après la Winsorization :

Illustration de la Winsorization

On voit que les extrémités de la distribution ont été rabotées, réduisant leur influence sur les mesures globales.


Implémentation en Python

Pour appliquer la Winsorization en Python, on peut utiliser scipy.stats.mstats.winsorize ou l’appliquer manuellement avec numpy et pandas.

Installation de scipy

pip install scipy

Utilisation de scipy

from scipy.stats.mstats import winsorize
import numpy as np

# Exemple de série avec des outliers
data = np.array([10, 12, 14, 15, 16, 18, 1000, 1200])

# Winsorization : remplace les 10% les plus faibles et les 10% les plus élevés
winsorized_data = winsorize(data, limits=[0.1, 0.1])

print("Données originales :", data)
print("Données winsorisées :", winsorized_data)

Dans cet exemple, les 10% inférieurs et supérieurs ont été écrêtés. Cela permet d’atténuer l’effet des valeurs extrêmes sans supprimer d’éléments du tableau.

Winsorization manuelle avec pandas

Voici comment appliquer le même principe à une colonne d’un DataFrame :

import pandas as pd

df = pd.DataFrame({
    'revenu': [1200, 1300, 1500, 1600, 1800, 2200, 30000]
})

# Définir les bornes des quantiles
lower = df['revenu'].quantile(0.05)
upper = df['revenu'].quantile(0.95)

# Appliquer la Winsorization manuellement
df['revenu_winsor'] = df['revenu'].clip(lower, upper)

print(df)

La méthode .clip() remplace toutes les valeurs en dehors des bornes choisies par les bornes elles-mêmes.


Comparaison avant / après

Il est utile de visualiser l’impact de la Winsorization :

import matplotlib.pyplot as plt

plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.hist(df['revenu'], bins=20, color='gray')
plt.title("Données originales")

plt.subplot(1,2,2)
plt.hist(df['revenu_winsor'], bins=20, color='green')
plt.title("Données après Winsorization")

plt.tight_layout()
plt.show()

Ce graphique permet de comparer les distributions et de voir comment les extrêmes sont réduits.


Quand appliquer la Winsorization ?

Voici quelques cas d’usage :

Attention : n’applique pas la Winsorization de manière aveugle. Il est toujours préférable d’explorer les données, de comprendre leur distribution et de justifier le seuil choisi.


Avantages


Limites


Conclusion

La Winsorization est une technique simple mais puissante pour traiter les valeurs extrêmes sans perte d’information. Elle permet de réduire leur impact sur les analyses statistiques et les modèles prédictifs, tout en maintenant une certaine fidélité aux données originales. Elle doit être utilisée de façon judicieuse, après une bonne exploration des données, et peut s’intégrer facilement dans tout pipeline de prétraitement de données en data science.