C'est de la data et mon expeRtise afin d'en tirer le maximum

Matrice de plots avec ggpairs de GGally

Lorsqu’on analyse des données, il est classique, lors d’une première étape, d’étudier la distribution de chacune des variables, ainsi que les liens qu’elles peuvent avoir entre elles. De nombreuses fonctions ont été développées pour répondre à ce besoin. Je vous propose, ici, d’explorer ensemble, les possibilités de la fonction `ggpairs()` du package `GGally`, qui est une extension du package `ggplot2`.

La fonction ggpairs

La fonction `ggpairs()` est la fonction principale du package `GGally`. Elle permet de représenter, à l’aide d’une matrice de plots, les distributions de chacune des variables, ainsi que leurs liens, deux à deux.

Anlayse globale

Commençons par un exemple simple, avec le jeu de données `iris` qui contient 4 variables numériques et une variable catégorielle à 3 niveaux :

library(GGally)
ggpairs(iris) 
ggpairs

Lorsque les variables étudiées sont de type numérique, `ggpairs()` utilise :

  • Une courbe de densité pour visualiser la distribution de chacune des variables numériques. Ces courbes sont sur la diagonale qui va de gauche à droite.
  • Le coefficient de corrélation de Pearson, à l’intersection supérieure de deux variables
  • Un scatter plot de ces deux variables, à l’intersection inférieure de deux variables

Lorsqu’une des variables est catégorielle (ici la variable `Species`) `ggpairs()` emploi des boxplots.

Je trouve que cette représentation est très efficace pour se faire une bonne idée des données !

Anlayse par groupe

Mais ce qui est vraiment intéressant, c’est que la fonction `ggpairs()` peut fournir une analyse des liens entre les variables, non plus globalement, mais en distinguant chaque modalité d’une variable catégorielle. Par exemple ici, une analyse des distributions et des liens entre les variables, pour chaque espèce d’iris !

Pour cela, il suffit d’indiquer la variable catégorielle dans l’argument `aes(color=….)` :

ggpairs(iris, aes(color=Species)) 

Et si vous voulez modifier les couleurs, vous pouvez employer les fonctions scale_fill_manual() et scale_colour_manual():

ggpairs(iris, aes(color=Species))+
  scale_colour_manual(values = c("darkorange","purple","cyan4")) +
  scale_fill_manual(values = c("darkorange","purple","cyan4")) 

Autre exemple avec des variables catégorielles

Etudions, à présent, un second exemple, avec un jeu de données contenant plusieurs variables catégorielles :

library(funModeling)
data("heart_disease")

library(tidyverse)
HD2 <- heart_disease %>%
select(age, gender, chest_pain, max_heart_rate, has_heart_disease)


str(HD2)
## 'data.frame': 303 obs. of 5 variables:
## $ age : int 63 67 67 37 41 56 62 57 63 53 ...
## $ gender : Factor w/ 2 levels "female","male": 2 2 2 2 1 2 1 1 2 2 ...
## $ chest_pain : Factor w/ 4 levels "1","2","3","4": 1 4 4 3 2 2 4 4 4 4 ...
## $ max_heart_rate : int 150 108 129 187 172 178 160 163 147 155 ...
## $ has_heart_disease: Factor w/ 2 levels "no","yes": 1 2 2 1 1 1 2 1 2 2 ...
ggpairs(HD2) 
ggpairs(HD2, aes(color=gender)) 

Les distributions des variables numériques sont représentées à l’aide de barplots qui représentent les effectifs de chacune des modalités, en distinguant les groupes lorsque cela est précisé par l’argument `aes(color=gender)` ; par exemple la variable `chest pain`.

Des représentations de type “mosaic plot” sont réalisées pour représenter les distributions des croisements des modalités de deux variables catégorielles ; par exemple le croisement entre `gender` et `has_heart_rate`. Les superficies des rectangles sont proportionnelles aux effectifs .

La table de contingence suivante nous permet de constater que les  femmes atteintes de pathologie cardiaques (has_heart_disease=yes) sont bien sous-représentées dans ces données (n=25).

table(HD2$gender, HD2$has_heart_disease)
## 
##         no yes
## female  72 25
## male    92 114 

Les autres fonctions

J’en ai profité pour explorer un petit peu les autres fonctions du package GGally. Voici celles qui m’ont particulièrement intéressée.

La fonction ggbivariate()

En parcourant les fonctions du package `GGally` j’ai découvert la fonction `ggbivariate()` qui permet plus facilement qu’avec `ggplot2`, de faire des visualisations bivariées à l’aide de barplots de type stack.

Et cerise sur le gâteau, la fonction affiche automatiquement les pourcentages !

ggbivariate(HD2, outcome = "gender", explanatory = "chest_pain") 
description bivariée

Vous pouvez aussi considérer plusieurs variables exploratoires, en même temps :

ggbivariate(HD2, outcome = "gender", explanatory = c("chest_pain", "has_heart_disease"))
 
analyses bivariées multiples

Vous pouvez également modifier les couleurs affichées dans la fonction `scale_fill_brewer()` avec l’argument `type`:

ggbivariate(HD2, outcome = "gender", explanatory = c("chest_pain", "has_heart_disease"))+
scale_fill_brewer(type="seq")
 
graphiques bivariés
ggbivariate(HD2, outcome = "gender", explanatory = c("chest_pain", "has_heart_disease"))+
scale_fill_brewer(type="qual") 
plot bivariés avec R

Vous trouverez plus de possibilités dans ce document.

Les fonctions ggally_colbar() et ggally_rowbar()

Ces fonctions sont assez similaires à la fonction `ggbivariate()`. Elles permettent de faire des représentations bivariées, mais en contrôlant la position : en colonne ou en ligne.

Ici en colonne:

ggally_colbar(HD2, mapping = aes(x = gender, y = chest_pain)) 
plot stack avec pourcentages
ggally_colbar(HD2, mapping = aes(y = gender, x = chest_pain)) 
plots bivariés en colonne avec ggally

Là, en ligne :

ggally_rowbar(HD2, mapping = aes(x = gender, y = chest_pain)) 
plot bivariés en ligne avec R
ggally_rowbar(HD2, mapping = aes(y = gender, x = chest_pain)) 
graphiques bivariées avec ggally

L’affichage des pourcentages est un vrai plus !

La fonction ggcoef

Cette fonction permet de représenter graphiquement les coefficients des différents paramètres d’un modèle linéaire, ainsi que leur intervalle de confiance.

Cela a surtout du sens dans une situation de régression logistique, car cela permet :

  • d’évaluer facilement si la variable explicative est potentiellement protectrice (odds ratio<1) ou potentiellement un facteur de risque (odds ratio >1 )
  • si cet odds ratio est significativement différent de 1 (c’est le cas si sont intervalle de confiance ne recouvre pas 1) , autrement dit si le lien entre la variable prédictive et la variable réponse (binaire) est significatif,
  • de comparer les odds ratio des différentes variables prédictives.

Pour plus de détails sur ces notions , vous pouvez consulter les deux articles suivants :

Voici un exemple :

reglog <- glm(has_heart_disease~ gender + max_heart_rate + chest_pain, family = binomial, data = HD2)
ggcoef(reglog, exponentiate = TRUE) 
plot des coefficients

L’argument `exponentiate=TRUE` permet de considérer l’exponentiel des coefficients, c’est-à-dire les odds ratio.

Des améliorations visuelles peuvent également être apportées :

ggcoef(reglog, exponentiate = TRUE, color = "blue", size = 5, shape = 18)
 
plot des coefficients avec ggally

Pour vérifier, les odds ratio peuvent être obtenus comme cela :

exp(coef(reglog))

##    (Intercept)     gendermale max_heart_rate    chest_pain2    chest_pain3 
##     28.6322056      4.7584880      0.9646497      0.7271628      0.7733996 
##    chest_pain4 
##      6.2948230 

Et les intervalles de confiance, comme cela :

exp(confint(reglog))
##                    2.5 %      97.5 %
## (Intercept)    2.6278514 330.0899379
## gendermale     2.5010280   9.4204515
## max_heart_rate 0.9500458   0.9786125
## chest_pain2    0.2119426   2.5477382
## chest_pain3    0.2614101   2.4257973
## chest_pain4    2.2678260  19.0046296 

Si vous voulez en savoir plus sur les possibilités du package GGally, vous pouvez consulter sa documentationici .

Au final, que pensez vous de ce package GGally, et surtout de sa fonction ggpairs() ? Est ce que vous la découvrez, ou bien vous aviez déjà l’habitude de l’utiliser ?

Dites le moi en commentaires ! Et si vous employez d’autres fonctions pour explorer vos données, n’hésitez pas à les partager.

En attendant, si cet article vous a plu ou vous a été utile, n’oubliez pas de le partager ! Vous pouvez également soutenir le blog par un don libre sur la page Tipee.

6 réponses

  1. Bonjour Claire,
    J’ai l’habitude d’utiliser le package GGally, mais je ne savais pas toutes ces fonctions sur celle qui affiche les pourcentage (ggbivariate), elle est géniale.
    Vraiment merci

  2. Merci beaucoup Claire,
    Vraiment très impressionnant.
    Je voudrais juste savoir la différence entre les deux corrélations: 0,872 et -0,428 de Ptal length??
    Et est-ce que corr = -0,394 de Max_heart_rate, c’est la corrélation de cette variable avec gender??
    Quand vous parlez l’intersection partie supérieure et inférieure de deux variable ici, est ce que c’est la première colonne de première variable à la deuxième ligne de deuxième variable? Car toutes les variables se trouvent aux colonnes.

    Cordialement.

    1. Bonjour,
      Corr=0.872 est le coefficient de corrélation entre Sepal.Length et Petal.Length.
      Corr=-0.428 est le coefficient de corrélation entre Petal.Length et Sepal.Width.
      Corr=-0.94 est le coefficient de corrélation entre Max heart rate et age.
      L’intersection partie supérieure est la première ligne et 2ème colonne (du premier graph par exemple)
      L’intersection partie inférieure est la deuxième ligne et 1er colonne (du premier graph par exemple)
      Bonne continuation

Laisser un commentaire

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

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

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.