L’imputation consiste à remplacer les données manquantes par des estimations statistiques des valeurs manquantes. L’objectif de toute technique d’imputation est de produire un ensemble complet de données qui peut être utilisé pour former des modèles d’apprentissage automatique.
L’imputation moyenne / médiane consiste à remplacer toutes les occurrences de valeurs manquantes (NA) dans une variable par la moyenne (si la variable a une distribution gaussienne) ou la médiane (si la variable a une distribution asymétrique).
Notez ce qui suit :
- Si une variable est normalement distribuée, la moyenne, la médiane et le mode sont approximativement les mêmes. Par conséquent, le remplacement des valeurs manquantes par la moyenne et la médiane sont équivalents. Le remplacement des données manquantes par le mode n’est pas une pratique courante pour les variables numériques.
- Si la variable est faussée, la moyenne est biaisée par les valeurs à l’extrémité de la distribution. Par conséquent, la médiane est une meilleure représentation de la majorité des valeurs de la variable.
- Pour les variables discrètes exprimées sous la forme « int » (pour économiser de la mémoire), la moyenne peut ne pas être un nombre entier, et la variable entière sera donc recalculée sous la forme « float ». Afin d’éviter ce comportement, nous pouvons remplacer NA par la médiane à la place. La médiane sera inévitablement un entier / une valeur discrète également.
Quelles variables puis-je imputer avec l’imputation moyenne / médiane ?
La moyenne et la médiane ne peuvent être calculées que sur des variables numériques, ces méthodes ne conviennent donc qu’aux variables numériques continues et discrètes.
Hypothèses
- Les données sont complètement manquantes au hasard (MCAR)
- Les observations manquantes, ressemblent très probablement à la majorité des observations de la variable (alias, la moyenne / médiane)
Si les données manquent complètement au hasard, il est alors juste de supposer que les valeurs manquantes sont très probablement très proches de la valeur de la moyenne ou de la médiane de la distribution, car elles représentent l’observation la plus fréquente / moyenne.
Avantages
- Facile à mettre en œuvre
- Moyen rapide d’obtenir des ensembles de données complets
- Peut être intégré dans la production (lors du déploiement du modèle)
Limitations
- Distorsion de la distribution initiale des variables
- Distorsion de l’écart initial
- Distorsion de la covariance avec les autres variables de l’ensemble de données
Lorsque l’on remplace NA par la moyenne ou la médiane, la variance de la variable sera faussée si le nombre de NA est important par rapport au nombre total d’observations, ce qui entraîne une sous-estimation de la variance.
En outre, les estimations de la covariance et des corrélations avec d’autres variables de l’ensemble de données peuvent également être affectées. L’imputation de la moyenne / médiane peut modifier les corrélations intrinsèques puisque la valeur moyenne / médiane qui remplace maintenant les données manquantes ne préservera pas nécessairement la relation avec les autres variables.
Quand utiliser l’imputation moyenne / médiane ?
- Les données sont complètement manquantes au hasard
- Pas plus de 5 % de la variable contient des données manquantes
Bien qu’en théorie, les conditions ci-dessus devraient être remplies pour minimiser l’impact de cette technique d’imputation, en pratique, l’imputation moyenne / médiane est très couramment utilisée, même dans les cas où les données ne sont pas MCAR et où il y a beaucoup de valeurs manquantes. La raison en est la simplicité de la technique.
Note finale
Le remplacement de NA par la moyenne / médiane est largement utilisé dans la communauté des sciences des données et dans divers concours de sciences des données.
Généralement, l’imputation de la moyenne / médiane est effectuée en ajoutant une variable binaire « indicateur manquant » pour saisir les observations pour lesquelles les données sont manquantes , couvrant ainsi deux angles : si les données sont complètement manquantes au hasard, cela sera saisi par l’imputation de la moyenne / médiane, et si ce n’est pas le cas, cela sera saisi par la variable supplémentaire « indicateur manquant ». Ces deux méthodes sont extrêmement simples à mettre en œuvre et constituent donc un choix de premier ordre dans les concours de science des données.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# to split the datasets
from sklearn.model_selection import train_test_split
data = pd.read_csv('../exportfeature.csv',parse_dates=['date'],infer_datetime_format=True,dayfirst=True,sep=";",encoding='ANSI')
data.head()
id place rapport date M1 M2 M3 M4 allocation Hippodrome nbPartants idHippodrome nDistance nAllocation idFerrure idJockey nbPartants.1 rPoids idOeillere iCote
0 56005 1 1.3 2016-01-01 3a 3m Da 3a 90000.0 Vincennes 17 Vincennes 2100 95000 0 18 17 0 0 12.0
1 98833 1 2.2 2016-01-01 3a 9Da 5a 4a 70000.0 Vincennes 18 Vincennes 2700 58000 1 30 18 0 0 12.0
2 98834 0 0.0 2016-01-01 1a Da Da 1a 44000.0 Vincennes 12 Vincennes 2850 37000 0 53 10 0 0 9.0
3 98835 1 1.5 2016-01-01 Da 7a 4a 2a 40000.0 Vincennes 11 Vincennes 2200 38000 2 143 13 0 0 4.0
4 98836 0 0.0 2016-01-01 1a 7a 10a 11a 40000.0 Vincennes 16 Vincennes 2700 34000 0 50 17 0 0 8.0
data.isnull().mean()
id 0.000000
place 0.000000
rapport 0.000000
date 0.000000
M1 0.000000
M2 0.000000
M3 0.000000
M4 0.004389
allocation 0.000000
Hippodrome 0.000000
nbPartants 0.000000
idHippodrome 0.000000
nDistance 0.000000
nAllocation 0.000000
idFerrure 0.000000
idJockey 0.000000
nbPartants.1 0.049990
rPoids 0.000000
idOeillere 0.000000
iCote 0.171381
dtype: float64
La seule variable numérique pour laquelle il manque des données est iCote, avec environ 17 % d’observations manquantes.
Imputation
L’imputation doit être faite sur l’ensemble de formation, puis propagée à l’ensemble de test. Cela signifie que la moyenne / médiane à utiliser pour combler les valeurs manquantes à la fois dans le train et dans l’ensemble de test, doit être extraite de l’ensemble d’entrainement uniquement. Et ce, afin d’éviter tout surajustement.
# Création du jeu d'entrainement et de test
X_train, X_test, y_train, y_test = train_test_split(
data[['iCote', 'nDistance']],
data['place'],
test_size=0.3,
random_state=0)
X_train.shape, X_test.shape
((14352, 2), (6152, 2))
# Exploitons les données manquantes dans le jeu d'entrainement
# les pourcentages doivent être assez semblables à ceux
# de l'ensemble des données
X_train.isnull().mean()
iCote 0.171474
nDistance 0.000000
dtype: float64
# faisons une fonction pour remplir les valeurs manquantes avec la moyenne ou la médiane :
# la variable prend le dataframe, la variable, et la valeur de
# moyenne ou médiane
# et renvoie la variable avec le na rempli
def impute_na(df, variable, mean_median):
return df[variable].fillna(mean_median)
# Calcul de la cote médiane
median = X_train.iCote.median()
median
5.0
# Calcul de la cote moyenne
mean = X_train.iCote.mean()
mean
12.392734000504584
# créer une nouvelle variable en remplaçant les valeurs manquantes
# en utilisant la fonction que nous avons créée ci-dessus
# remplacer d'abord par la médiane
X_train['iCote_mediane'] = impute_na(X_train, 'iCote', median)
# puis la moyenne
X_train['iCote_moyenne'] = impute_na(X_train, 'iCote', mean)
# la moyenne contient de nombreuses décimales, donc j'arrondis à 1
# en utilisant la fonction d'arrondi de numpy
X_train['iCote_moyenne'] = np.round(X_train['iCote_moyenne'], 1)
X_train.head(15)
iCote nDistance iCote_mediane iCote_moyenne
2540 3.0 2850 3.0 3.0
19008 5.0 3350 5.0 5.0
7624 34.0 2100 34.0 34.0
2575 4.0 2600 4.0 4.0
852 26.0 2650 26.0 26.0
4855 3.0 2925 3.0 3.0
8154 7.0 2850 7.0 7.0
18928 5.0 3100 5.0 5.0
18286 16.0 2875 16.0 16.0
15712 11.0 2150 11.0 11.0
4842 8.0 2875 8.0 8.0
18034 8.0 2875 8.0 8.0
1215 2.0 2850 2.0 2.0
14732 7.0 2700 7.0 7.0
17160 2.0 2100 2.0 2.0
# on peut voir un changement dans la variance après l'imputation de la moyenne / médiane
# cela est attendu, car le pourcentage de données manquantes est assez
# élevé pour la cote, ~17%.
print('Variance des données de départ: ', X_train['iCote'].var())
print('Variance après imputation de la médianen: ', X_train['iCote_mediane'].var())
print('Variance après imputation de la moyenne: ', X_train['iCote_moyenne'].var())
Variance des données de départ: 461.1000784035024
Variance après imputation de la médianen: 389.79280189048313
Variance après imputation de la moyenne: 382.0277360369466
Comme prévu, la variance est sous-estimée, car maintenant de nombreuses valeurs sont identiques ==> soit la valeur moyenne, soit la valeur médiane.
# on peut voir que la répartition a changé
# avec maintenant plus de valeurs s'accumulant vers la médiane
# ou médiane
fig = plt.figure()
ax = fig.add_subplot(111)
X_train['iCote'].plot(kind='kde', ax=ax)
X_train['iCote_mediane'].plot(kind='kde', ax=ax, color='red')
X_train['iCote_moyenne'].plot(kind='kde', ax=ax, color='green')
lines, labels = ax.get_legend_handles_labels()
ax.legend(lines, labels, loc='best')

Comme mentionné ci-dessus, l’imputation moyenne / médiane déforme la distribution initiale de la variable iCote. La variable transformée présente plus de valeurs autour des valeurs moyennes / médianes.
Est-ce important ?
Cela dépend du modèle d’apprentissage machine que vous voulez construire. Les modèles linéaires supposent que les variables sont normalement distribuées. L’imputation de la moyenne / médiane peut déformer la distribution normale originale si le pourcentage de données manquantes est élevé. Par conséquent, la variable finale imputée ne sera plus normalement distribuée, ce qui peut affecter les performances du modèle linéaire.
# nous avons également dit que l'imputation moyenne / médiane peut affecter la relation
# avec les autres variables de l'ensemble de données, regardons
X_train[['nDistance', 'iCote', 'iCote_mediane', 'iCote_moyenne']].cov()
nDistance iCote iCote_mediane iCote_moyenne
nDistance 110483.276632 325.904157 419.400945 269.869232
iCote 325.904157 461.100078 461.100078 461.100078
iCote_mediane 419.400945 461.100078 389.792802 382.020097
iCote_moyenne 269.869232 461.100078 382.020097 382.027736
Nous voyons en effet que la covariance entre la cote et l’allocation est modifiée après l’imputation moyenne / médiane.
# Enfin, j'ai mentionné que l'imputation moyenne / médiane peut conduire
# à des observations qui sont normales, pour ressembler à des observations aberrantes
# ou en d'autres termes, l'imputation de la moyenne / médiane peut entraîner une augmentation
# dans le nombre apparent de valeurs aberrantes
# Découvrons-le en utilisant un boxplot
X_train[['iCote', 'iCote_mediane', 'iCote_moyenne']].boxplot()


Je télécharge mon guide gratuit
Thank you!
You have successfully joined our subscriber list.
Vous recevrez votre guide par email sans aucun engagement de votre part.