TRAITEMENT DES VALEURS
MANQUANTES ET ABERRANTES
AVEC PYTHON
Introduction
Le traitement ou nettoyage de données constitue une étape cruciale dans tout projet d'analyse ou de machine
learning. Avant de pouvoir exploiter pleinement les informations contenues dans un jeu de données, il est essentiel
de s'assurer de leur qualité et de leur cohérence. Cette phase inclut la détection et la gestion des valeurs
manquantes et aberrantes, la transformation des variables, ainsi que leur normalisation. Ces opérations
garantissent que les analyses réalisées et les modèles développés reposent sur des données fiables, permettant
ainsi de prendre des décisions éclairées.
Dans ce document nous explorerons deux aspects essentiels du nettoyage de données : la gestion des données
manquantes et l'identification et le traitement des valeurs aberrantes.
Comprendre le problème
Lorsqu'on se retrouve face à des valeurs manquantes ou aberrantes, il est crucial de comprendre
pourquoi ces valeurs manquantes ou aberrantes apparaissent et d'analyser leurs impact c'est-à-dire
vérifier si ces valeurs affectent de manière significative nos analyses ou modèles.
Exemples de problèmes:
1 Valeurs manquantes:
Problèmes de collecte de données, erreurs d’enregistrement, ou encore refus d’informations par les
clients ou les personnes enquêtées.
2 Valeurs aberrantes:
Saisies erronées, erreurs de mesure, ou événements rares mais réels.
Collaboration avec les Métiers
Il est essentiel de consulter les métiers (experts du domaine ou parties prenantes) dans plusieurs
situations lorsqu'on identifie des valeurs manquantes ou aberrantes:
1 Ambiguïté sur l'Origine 2 Impact sur la Prise de Décision
Si les valeurs manquantes ou aberrantes Lorsque ces données influencent des
pourraient être dues à des particularités du indicateurs clés ou des décisions
processus métier, il est important de vérifier stratégiques, consulter les métiers permet de
auprès des experts métier pour comprendre valider si ces valeurs sont réellement des
le contexte. erreurs ou si elles reflètent une réalité
opérationnelle particulière.
3 Validation des Hypothèses 4 Interprétation des Outliers
Avant d'appliquer des méthodes de Certaines valeurs aberrantes peuvent être
suppression, d'imputation ou de des cas réels. Le retour des métiers est
transformation, il est conseillé de discuter indispensable pour décider si ces outliers
avec les métiers afin de s'assurer que le doivent être conservés ou s'ils sont le résultat
traitement choisi ne masque pas une d'erreurs.
information pertinente.
Identifier les Valeurs Manquantes
Les valeurs manquantes, aussi appelées « données manquantes », représentent des informations qui ne
sont pas présentes dans un ensemble de données. Il est crucial de les identifier et de les traiter
correctement afin d'éviter des biais et d'assurer la qualité de l'analyse.
Code python:
# Importation de pandas
import pandas as pd
# Charger le DataFrame depuis un fichier CSV
df = pd.read_csv('votre_fichier.csv')
# Compter les valeurs manquantes par colonne
valeurs_manquantes = [Link]().sum()
# Afficher les valeurs manquantes
print("Valeurs manquantes par colonne :")
print(valeurs_manquantes)
Traitement des Valeurs Manquantes
Méthode Description Cas d'utilisation
Suppression (dropna) Supprimer les lignes ou colonnes Quand la proportion de valeurs
comportant des valeurs manquantes. manquantes est faible et que la
suppression n'introduit pas de biais
significatif dans l'analyse.
Imputation par la Remplacer les valeurs manquantes Lorsque les données manquantes
moyenne/médiane/mode par la moyenne, la médiane ou la sont aléatoires (MCAR) et que la
mode. distribution de la variable est connue.
Imputation par interpolation Remplacer les valeurs manquantes Données chronologiques ou séries
en interpolant entre les valeurs temporelles où la tendance permet
existantes. une interpolation fiable.
Imputation par KNN Utiliser les K plus proches voisins Quand les relations entre variables
pour prédire la valeur manquante. sont complexes.
Imputation par modélisation Prédire la valeur manquante via un Lorsque la variable à imputer est
modèle de machine learning fortement liée à d’autres variables et
(régression, forêts aléatoires, etc.). qu’un modèle prédictif peut capturer
cette relation.
Code python pour les opérations :
Suppression avec Pandas
import pandas as pd
# Charger le DataFrame depuis un fichier CSV
df = pd.read_csv('votre_fichier.csv')
# Supprimer toutes les lignes contenant des valeurs manquantes (proportion faible de valeurs
manquantes)
df_lignes_supprimees = [Link](axis=0)
# Afficher les resultats
print("df après suppression des lignes manquantes :")
print(df_lignes_supprimees.head())
# Supprimer toutes les colonnes avec des valeurs manquantes (trop de valeurs manquantes)
df_colonnes_supprimees = [Link](axis=1)
# Afficher les resultats
print("df après suppression des colonnes avec données manquantes :")
print(df_colonnes_supprimees.head())
Imputation par la moyenne/médiane/mode
import pandas as pd
# Imputation par la moyenne pour une colonne spécifique
df['colonne'] = df['colonne'].fillna(df['colonne'].mean())
print("df après imputation par la moyenne :")
print(df['colonne'].head())
# Imputation par la médiane pour une colonne spécifique (Préférable pour les distributions
asymétriques)
df['colonne'] = df['colonne'].fillna(df['colonne'].median())
print("df après imputation par la médiane :")
print(df['colonne'].head())
# Imputation par le mode pour une colonne catégorielle
df['colonne_categorie'] = df['colonne_categorie'].fillna(df['colonne_categorie'].mode()[0])
print("df après imputation par le mode :")
print(df['colonne_categorie'].head())
# Imputation par les valeurs d'une autre colonne
## Imputer les valeurs manquantes de 'colonne_A' par les valeurs correspondantes de 'colonne_B'
df['colonne_A'] = df['colonne_A'].fillna(df['colonne_B'])
print("df après imputation par 'colonne_B' :")
print(df['colonne_A'].head())
Imputation par interpolation
import pandas as pd
# Imputation par interpolation linéaire (idéal pour les séries temporelles)
df['colonne'] = df['colonne'].interpolate(method='linear')
print("df après interpolation :")
print(df['colonne'].head())
Méthodes Avancées:
Imputation par KNN
import numpy as np
from [Link] import KNNImputer #module pour imputer en se basant sur les voisins proches
# Supposons que nous voulons imputer plusieurs colonnes numériques
colonnes_imputation = ['colonne1', 'colonne2', 'colonne3']
# Initialiser le KNNImputer avec 5 voisins
imputer = KNNImputer(n_neighbors=5)
# Appliquer l'imputation et mettre à jour le DataFrame
df[colonnes_imputation] = imputer.fit_transform(df[colonnes_imputation])
print("df après imputation par KNN :")
print(df[colonnes_imputation].head())
Imputation par modélisation
#Exemple Random Forest
from [Link] import RandomForestRegressor
# Séparer les données sans valeurs manquantes et celles avec valeurs manquantes pour la variable cible
df_complete = df[df['colonne'].notnull()]
df_manquante = df[df['colonne'].isnull()]
# Variables explicatives (exemple)
features = ['feature1', 'feature2', 'feature3']
# Entraîner un modèle de régression sur les données complètes
modele = RandomForestRegressor(random_state=42)
[Link](df_complete[features], df_complete['colonne'])
# Prédire les valeurs manquantes
[Link][df['colonne'].isnull(), 'colonne'] = [Link](df_manquante[features])
print("df après imputation par modélisation :")
print(df['colonne'].head())
Identification et Traitement des Valeurs Aberrantes
Méthode Description Cas d'utilisation
Visualisation (boxplot, scatter plot) Utiliser des graphiques (boxplot, scatter Lorsque l'on souhaite comprendre la
plot) pour repérer visuellement les distribution des données et détecter les
valeurs aberrantes. outliers de manière exploratoire.
Méthode IQR (Interquartile Range) Identifier les outliers comme les valeurs Utile pour des distributions
en dehors de [Q1 - 1.5×IQR, Q3 + asymétriques ou quand on souhaite une
1.5×IQR]. détection robuste des valeurs extrêmes.
Méthode Z-score Calculer le score Z pour chaque Utile pour des distributions normales.
observation et considérer comme
outlier celles dont Z > 3 (ou un seuil
ajustable).
Transformation (logarithmique, Box-Cox) Appliquer une transformation aux Quand les outliers sont réels mais
données pour réduire l'effet des valeurs affectent la modélisation en créant une
extrêmes (ex. log, Box-Cox). asymétrie importante.
Robust Scaling Normaliser les données en utilisant des Lors de la préparation des données pour
estimateurs robustes (médiane, IQR) des modèles sensibles à l'échelle, et
pour réduire l'influence des outliers. quand on souhaite limiter l'impact des
outliers sur le scaling.
Identifier les valeurs aberrantes
Les valeurs aberrantes (ou outliers) sont des observations qui se situent à une distance anormalement
élevée par rapport à la majorité des données d'un ensemble.
Code python:
Statistiques descriptives
# Afficher les statistiques descriptives
print([Link]())
Visualisations graphiques: Boxplot
# Boxplot (visualiser rapidement les outliers)
import [Link] as plt
import seaborn as sns
[Link](figsize=(10, 6))
[Link](x=df['colonne'])
[Link]("Boxplot de la variable")
[Link]("Valeur")
[Link]()
Visualisations graphiques: Scatter plot
# Scatter plot (aide à repérer visuellement des observations qui se démarquent Pour des données multivariées)
import [Link] as plt
import seaborn as sns
[Link](figsize=(10, 6))
[Link](x=df['feature1'], y=df['colonne'])
[Link]("Scatter plot entre feature1 et colonne")
[Link]("Feature1")
[Link]("Colonne")
[Link]()
Méthodes statistiques: Méthode IQR (Interquartile Range)
# Calcul des quartiles et de l'IQR pour une colonne donnée
Q1 = df['colonne'].quantile(0.25)
Q3 = df['colonne'].quantile(0.75)
IQR = Q3 - Q1
# Définir les bornes pour les valeurs acceptables
borne_inf = Q1 - 1.5 * IQR
borne_sup = Q3 + 1.5 * IQR
# Filtrer le DataFrame pour ne conserver que les valeurs non aberrantes
df_sans_outliers = df[(df['colonne'] >= borne_inf) & (df['colonne'] <= borne_sup)]
print("Données après suppression des outliers par IQR :")
print(df_sans_outliers.head())
Méthodes statistiques: Méthode Z-score
from scipy import stats
import numpy as np
# Calculer le Z-score pour chaque valeur de la colonne
z_scores = [Link]([Link](df['colonne']))
# Définir un seuil (généralement 3) pour considérer une valeur comme aberrante
seuil = 3
df_outliers = df[z_scores > seuil]
print("Valeurs aberrantes détectées avec la méthode Z-score :")
print(df_outliers)
# Pour filtrer et garder seulement les valeurs non aberrantes :
df_sans_outliers_z = df[z_scores < seuil]
print("Données après suppression des outliers par Z-score :")
print(df_sans_outliers_z.head())
Traitement des valeurs aberrantes
Code python:
Transformation logarithmique
import numpy as np
# Transformation logarithmique avec log1p (log(1+x)) pour gérer les zéros
df['colonne_log'] = np.log1p(df['colonne'])
print("Premières valeurs après transformation logarithmique :")
print(df[['colonne', 'colonne_log']].head())
Robust Scaling
from [Link] import RobustScaler
#RobustScaler utilise la médiane et l'IQR pour réduire l'influence des outliers lors de la normalisation
# On souhaite normaliser une ou plusieurs colonnes, par exemple 'colonne'
colonnes_a_scaler = ['colonne']
# Initialiser le RobustScaler
scaler = RobustScaler()
# Ajuster et transformer les données
df[colonnes_a_scaler] = scaler.fit_transform(df[colonnes_a_scaler])
print("Premières valeurs après Robust Scaling :")
print(df[colonnes_a_scaler].head())
Transformation Box-Cox
from [Link] import boxcox
import [Link] as plt
# Pour cette transformation, toutes les valeurs doivent être strictement positives
# S'assurer que toutes les valeurs sont positives, sinon ajouter une constante (ici, on ajoute 1)
data = df['colonne'] + 1
# Appliquer la transformation Box-Cox
data_boxcox, lambda_boxcox = boxcox(data)
df['colonne_boxcox'] = data_boxcox
print("Lambda optimal pour Box-Cox :", lambda_boxcox)
print("Premières valeurs après Box-Cox :")
print(df[['colonne', 'colonne_boxcox']].head())
# Comparaison des distributions avant et après transformation
[Link](figsize=(12, 5))
[Link](1, 2, 1)
[Link](df['colonne'], bins=30, color='skyblue', edgecolor='k')
[Link]('Distribution originale')
[Link](1, 2, 2)
[Link](df['colonne_boxcox'], bins=30, color='lightgreen', edgecolor='k')
[Link]('Distribution après Box-Cox')
[Link]()
Mise en garde
Choix pour les valeurs manquantes Choix pour les outliers
• La suppression est simple mais peut entraîner une perte • La méthode IQR est robuste et non paramétrique, idéale
d'information si les valeurs manquantes sont nombreuses. pour des données non normales.
• L'imputation simple (moyenne, médiane, mode) est rapide, • La méthode Z-score est adaptée aux distributions normales.
mais peut introduire un biais si la distribution réelle est
modifiée.
• La transformation ou le robust scaling ne supprime pas les
• Les méthodes avancées (KNN, modélisation) permettent de outliers mais atténuent leur impact, ce qui peut être
conserver la structure des données mais demandent plus préférable si les valeurs extrêmes sont des observations
de temps de calcul. réelles.
Conseils pratiques
• Explorez plusieurs approches et évaluez leurs impacts sur les modèles prédictifs ou les analyses exploratoires.
• Comparez les analyses avant et après traitement pour vous assurer que la méthode choisie préserve les tendances et la
structure des données.
• Documentez et justifiez chaque décision de traitement (suppression ou imputation), surtout si les résultats influencent des
décisions stratégiques.
• Communiquez clairement votre approche aux parties prenantes. Dans un tableau de bord, indiquez par exemple les
pourcentages de données imputées ou supprimées.
Conclusion
En conclusion, un traitement rigoureux des données est la base d'une analyse pertinente et d'une
modélisation efficace. En identifiant et en traitant les valeurs manquantes et aberrantes, en appliquant
des transformations adaptées et en normalisant les données, on optimise la qualité des informations
exploitées. Cette démarche permet non seulement d'améliorer la robustesse des modèles prédictifs,
mais également de renforcer la confiance des parties prenantes dans les décisions basées sur ces
analyses.