Les jeux de données du monde réel contiennent presque toujours des valeurs manquantes. Dans la plupart des cas, on ne sait pas à l'avance pourquoi elles manquent.

LE RAPPEL
Les trois raisons possibles

Grille de 5 lignes et 5 colonnes avec cinq cases rouges pour les valeurs manquantes, légendée « Données d’origine », et un bonhomme pensif qui demande « Pourquoi ces valeurs sont-elles manquantes ? ».

Il peut y avoir plusieurs raisons à ces valeurs manquantes. On en a déjà parlé en détail dans un shot précédent, voici donc un petit rappel :

  • Missing Completely at Random (MCAR) : la valeur manque complètement au hasard, sans aucun lien avec elle-même ni avec une autre observation.

Grille 5×5 dont six cases hachurées en rouge, réparties au hasard, légendée « Données avec des valeurs manquantes aléatoires ».
  • Missing at Random (MAR) : la valeur manque à cause d'une autre variable observée. Par exemple, on peut constater que le pourcentage de valeurs manquantes varie nettement selon d'autres variables.

Diagramme en barres : le pourcentage de valeurs manquantes est élevé pour la classe 1 et faible pour la classe 2 de la variable A.
  • Missing NOT at Random (MNAR) : le cas le plus délicat. L'absence dépend de la valeur manquante elle-même (par exemple, les plus hauts revenus qui ne déclarent pas leur salaire) ou d'une variable qu'on n'a pas observée.

Deux cas séparés par « OU » : à gauche, l’absence est directement liée à la valeur manquante elle-même ; à droite, elle est liée à des variables non observées.
❝

Identifier la raison des valeurs manquantes peut être extrêmement utile pour la suite : analyse, imputation et modélisation.

Aujourd'hui, voyons comment enrichir ton analyse des valeurs manquantes avec des heatmaps.

LE PROBLÈME
Le tableau de fréquences ne dit pas tout

Imagine un jeu de données de ventes quotidiennes d'un magasin, avec ces informations :

Tableau des ventes quotidiennes du 2 au 8 janvier 2023, avec trois NaN entourés en rouge : les ventes du vendredi et les heures d’ouverture et de fermeture du dimanche.
  • Jour et date

  • Heures d'ouverture et de fermeture du magasin

  • Nombre de clients

  • Ventes totales

  • Solde du compte à l'ouverture et à la fermeture

On voit bien qu'il manque des valeurs, mais on ne sait pas pourquoi.

En EDA, beaucoup de monde calcule la fréquence des valeurs manquantes par colonne, comme ceci :

Résultat de store_df.isna().sum() : 53 valeurs manquantes pour l’heure d’ouverture et pour l’heure de fermeture, 16 pour les ventes, 18 pour les clients, 13 et 15 pour les soldes, aucune pour la date et le jour.

Ce tableau indique simplement le nombre de valeurs manquantes dans chaque colonne. Plus précisément, on apprend que :

  • Deux colonnes ont nettement plus de valeurs manquantes que les autres.

  • Les colonnes de l'heure d'ouverture et de l'heure de fermeture ont exactement le même nombre de valeurs manquantes (53).

C'est tout ce que ce tableau nous apprend.

Le problème de cette approche, c'est qu'elle cache plusieurs détails importants sur les valeurs manquantes :

  • Leur emplacement précis dans le jeu de données.

  • Leur périodicité éventuelle.

  • La corrélation entre les valeurs manquantes de plusieurs colonnes, etc.

…des informations qui peuvent être très utiles pour comprendre la raison des valeurs manquantes.

Autrement dit, ce tableau ressemble plus à des statistiques résumées, qui montrent rarement la vraie image.

Pourquoi ?

On en a déjà parlé dans cette newsletter, par exemple avec les pièges de la corrélation ou ceux des boîtes à moustaches.

LA SOLUTION
La heatmap des valeurs manquantes

Voici comment j'enrichis souvent mon analyse des valeurs manquantes avec des heatmaps.

Compare le tableau de valeurs manquantes vu plus haut avec cette heatmap :

Code sns.heatmap(store_df.isna(), ...) et heatmap obtenue : les heures d’ouverture et de fermeture manquent à intervalles réguliers, chaque dimanche, les autres colonnes ont quelques valeurs manquantes isolées.

Les lignes verticales blanches indiquent l'emplacement des valeurs manquantes dans une colonne donnée. On voit tout de suite que :

  • Les valeurs manquent de façon périodique dans les colonnes de l'heure d'ouverture et de l'heure de fermeture.

  • Les valeurs manquantes sont corrélées entre ces deux colonnes.

  • Les valeurs manquantes des autres colonnes semblent (sans certitude) manquer complètement au hasard.

En creusant l'heure d'ouverture, on découvre que le magasin est toujours fermé le dimanche :

Extrait du jeu de données filtré sur les heures d’ouverture manquantes : toutes les lignes affichent « Sunday » dans la colonne Day name, entourée en rouge. Légende : « Le magasin reste fermé le dimanche ».

On sait maintenant pourquoi les heures d'ouverture et de fermeture manquent dans notre jeu de données. Cette information est précieuse au moment de l'imputation.

Cette situation précise est un cas de « Missing at Random (MAR) ». Comme on l'a vu, l'absence dépend de la valeur d'une autre colonne observée. Maintenant qu'on connaît la raison, on peut utiliser des techniques d'imputation adaptées si besoin.

Pour le MAR en particulier, des techniques comme l'imputation kNN, MissForest, etc. sont très efficaces. On les a vues dans ces shots :

N'est-ce pas bien plus utile qu'une simple analyse de la fréquence des valeurs manquantes ?

❝

À retenir : un tableau de fréquences se contente de compter les valeurs manquantes, alors qu'une heatmap montre où elles se trouvent, leur périodicité et leurs corrélations.

Envie d'aller plus loin ? DataXp t'attend : formations et parcours pour progresser en data science, machine learning et IA.

👉 Et maintenant, à toi de jouer : Quelles autres méthodes connais-tu pour améliorer l'analyse des valeurs manquantes ?

Commentaires

Avatar

ou participer

À lire ensuite

Des shots dans la même veine, à lire entre deux tâches.

Voir tous les shots
caret-right