Imputation moyenne / médiane

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')
cote

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()
variance

Si vous voulez découvrir comment fonctionne la librairie pandas ou bien l’environnement Jupyter, n’hésitez pas à consulter les cours ci-dessous.

GCH anime

Je télécharge mon guide gratuit

Vous recevrez votre guide par email sans aucun engagement de votre part.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.