Visualisation des données manquantes

Dans cet article, je vais vous présenter quelques fonctions particulièrement intéressantes pour visualiser et explorer les données manquantes présentes dans un data frame, en termes de quantité (nombre ou pourcentage), de localisation, ou encore de distribution parmi les variables.

Les data

Dans cet article, je vais vous présenter quelques fonctions particulièrement intéressantes pour visualiser et explorer les données manquantes présentes dans un data frame, en termes de quantité (nombre ou pourcentage), de localisation, ou encore de distribution parmi les variables.

library(datasets)
data("airquality")

str(airquality)

'data.frame': 153 obs. of 6 variables:
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
$ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
$ Month : int 5 5 5 5 5 5 5 5 5 5 ...
$ Day : int 1 2 3 4 5 6 7 8 9 10 ... 

Explorer le nombre de données manquantes

La fonction summary()

La première fonction que nous pouvons employer est la fonction `summary()`, qui renvoie, pour chaque variable, le nombre de données manquantes (NA dans R).
summary(airquality)
     Ozone           Solar.R           Wind       
 Min.   :  1.00   Min.   :  7.0   Min.   : 1.700  
 1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400  
 Median : 31.50   Median :205.0   Median : 9.700  
 Mean   : 42.13   Mean   :185.9   Mean   : 9.958  
 3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500  
 Max.   :168.00   Max.   :334.0   Max.   :20.700  
 NA's   :37       NA's   :7                       
      Temp           Month            Day      
 Min.   :56.00   Min.   :5.000   Min.   : 1.0  
 1st Qu.:72.00   1st Qu.:6.000   1st Qu.: 8.0  
 Median :79.00   Median :7.000   Median :16.0  
 Mean   :77.88   Mean   :6.993   Mean   :15.8  
 3rd Qu.:85.00   3rd Qu.:8.000   3rd Qu.:23.0  
 Max.   :97.00   Max.   :9.000   Max.   :31.0 
Nous pouvons voir que le jeu de données aiquality comporte :
  • 37 NA au niveau de la variable `Ozone`
  • 7 NA au niveau de la variable ` Solar.R`

La fonction df_status()

Une autre fonction, également très utile, pour connaître le nombre de données manquantes et le pourcentage correspondant, pour chaque variable, est
 la fonction `df_status()`, du package `funModeling`:

library(funModeling)

df_status(airquality)
  variable q_zeros p_zeros q_na  p_na q_inf p_inf
1    Ozone       0       0   37 24.18     0     0
2  Solar.R       0       0    7  4.58     0     0
3     Wind       0       0    0  0.00     0     0
4     Temp       0       0    0  0.00     0     0
5    Month       0       0    0  0.00     0     0
6      Day       0       0    0  0.00     0     0
     type unique
1 integer     67
2 integer    117
3 numeric     31
4 integer     40
5 integer      5
6 integer     31 

Nous pouvons voir que les 37 données manquantes au niveau de la variable `Ozone` correspondent à 24.18% des valeurs de cette variable `Ozone`. De même, les 7 NA  de la variable `Solar.R` correspondent à 4.58%.

La fonction gg_miss_var()

La fonction gg_miss_var() du package naniarpermet d’obtenir un graphique synthétique avec le nombre de données manquantes (ou le pourcentage) pour chaque variable :

library(naniar)
gg_miss_var(airquality) 

Pour obtenir les pourcentages correspondants, il suffit d’employer l’argument show_pct = TRUE:

gg_miss_var(airquality,show_pct = TRUE) 

Visualiser la position des données manquantes

La fonction vis_dat()

Pour cela, nous pouvons employer les fonctions vis_dat() du package visdat:

library(visdat)
vis_dat(airquality) 

Pour obtenir les positions précises nous pouvons employer les fonction which() et is.na(), comme ceci :

which(is.na(airquality$Ozone))
 [1]   5  10  25  26  27  32  33  34  35  36  37  39
[13]  42  43  45  46  52  53  54  55  56  57  58  59
[25]  60  61  65  72  75  83  84 102 103 107 115 119
[37] 150

which(is.na(airquality$Solar.R))
[1]  5  6 11 27 96 97 98 

Ces positions sont cohérentes avec celles représentées sur le plot, précédemment.

La fonction vis_mis()

Un autre plot, peut également être réalisé avec la fonction vis_miss(), qui permet de connaître à la fois la position des données manquantes et le pourcentage qu’elles représentent :

visdat::vis_miss(airquality) 

Explorer les relations entre les NA

La fonction gg_miss_upset()

Le package `naniar` dispose d’une fonction particulièrement intéressante pour étudier les relations entre les NA des différentes variables : la fonction `gg_miss_upset()`.

Cette fonction permet de réaliser un graphique qui illustre le nombre de NA partagées par plusieurs variables

naniar::gg_miss_upset(airquality)
 

Par exemple, ici, nous pouvons voir que parmi les 37 observations qui ne disposent pas de données pour la variable Ozone, autrement dit qui sont de données manquantes, deux le sont aussi pour la variable Solar.R.

La couche geom_miss_point()

Les NA peuvent également être visualiser avec la couche geom_miss_point() du package ggplot2.
ggplot(airquality, aes(y = Ozone, x = Solar.R))+
    geom_point(width=0.1, height=0.1) +
    geom_miss_point() 

A gauche, en rouge, nous pouvons voir la représentation des 7 NA  de la variable `Solar.R`. Et en bas, également, en rouge, la représentation des 37 données manquantes de la variable `Ozone`. Les deux données dans l’angle inférieur gauche sont les deux NA, conjointement présentes dans les variables `Solar.R`et `Ozone`.

Pour aller plus loin

Vous trouverez plus d’informations sur les packages visdat et naniar ici, et là.

Et vous, quelles fonctions employez vous pour explorer les NA de vos jeux de données?  Partagez les en commentaire ?

Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏

Image par GraphicMama-team de Pixabay

10 Responses

  1. Bonjour
    Merci pour ce blog très bien fait et bien utile. Après ce papier sur la visualisation des données manquantes, pourriez-vous nous expliquer les différentes possibilités de remplacer les valeurs manquantes, en particulier dans le cas des variables qualitatives ?
    Merci à vous, et avec mon soutien

  2. Vous nous donnez d’excellents cours à travers ce grand logiciel R, et mieux, vous nous encouragez à en faire notre quotidien.

  3. Bonjour. Merci pour l’article! J’avais justement un problème de données manquantes!
    Est-ce que l’image de l’article (le Monsieur à la loupe) est libre d’utilisation, s’il-vous-plaît?

  4. Merci d’aborder le sujet. Cependant j’ai du mal a comprendre comment conclure a partir de ces graphs si il s’agit de donnee manquante de type MCAR , MAR ou MNAR? Que nous apprend le dernier graph avec la fonction geom_miss_ point?

    1. Bonjour,

      je connais mal le sujet des MCAR, MAR et MNAR, je ne sais donc pas si les graph permettent de conclure définitivement sur le type de données manquantes.
      POur ce qui du graph geom_miss_point, il permet néanmoins d’appréhender la distribution des données manquantes (en termes de valeurs de la seconde variable). Par exemple, on voit que les valeurs Solar. R des 36 données qui ont une valeur manquante pour l’ozone, sont globalement assez bien réparties. Elles ne correspondent pas à un groupe de valeurs spécifiques (hautes ou basses par exemple).
      J’espère que cela vous aide.
      Bonne continuation

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.