Corrélation dans R : matrice de corrélation de Pearson et Spearman

Corrélation bivariée dans R

Une relation bivariée décrit une relation -ou corrélation- entre deux variables dans R. Dans ce didacticiel, nous discuterons du concept de corrélation et montrerons comment il peut être utilisé pour mesurer la relation entre deux variables quelconques dans R.

Corrélation dans la programmation R

Il existe deux méthodes principales pour calculer la corrélation entre deux variables en programmation R :

  • Pearson: Corrélation paramétrique
  • Lancier: Corrélation non paramétrique

Matrice de corrélation de Pearson dans R

La méthode de corrélation de Pearson est généralement utilisée comme contrôle principal de la relation entre deux variables.

Les coefficient de corrélation, , est une mesure de la force du linéaire relation entre deux variables et . Il est calculé comme suit :

Matrice de corrélation de Pearson dans R

avec

  • Matrice de corrélation de Pearson dans R, c'est-à-dire l'écart type de
  • Matrice de corrélation de Pearson dans R, c'est-à-dire l'écart type de

La corrélation est comprise entre -1 et 1.

  • Une valeur proche ou égale à 0 implique peu ou pas de relation linéaire entre et .
  • En revanche, plus la valeur se rapproche de 1 ou de -1, plus la relation linéaire est forte.

Nous pouvons calculer le test t comme suit et vérifier la table de distribution avec un degré de liberté égal à :

Matrice de corrélation de Pearson dans R

Corrélation des rangs de Spearman dans R

Une corrélation de rang trie les observations par rang et calcule le niveau de similarité entre les rangs. Une corrélation de rang présente l’avantage d’être robuste aux valeurs aberrantes et n’est pas liée à la distribution des données. Notez qu'une corrélation de rang convient à la variable ordinale.

La corrélation de rang de Spearman, , est toujours comprise entre -1 et 1, une valeur proche de l'extrémité indiquant une relation forte. Il est calculé comme suit :

Corrélation des rangs de Spearman dans R

avec indiqué les covariances entre le rang et . Le dénominateur calcule les écarts types.

En R, on peut utiliser la fonction cor(). Cela prend trois arguments, et la méthode.

cor(x, y, method)

Arguments:

  • x: Premier vecteur
  • y: Deuxième vecteur
  • méthode: La formule utilisée pour calculer la corrélation. Trois valeurs de chaîne :
    • "pearson"
    • "Kendall"
    • "lancier"

Un argument facultatif peut être ajouté si les vecteurs contiennent une valeur manquante : use = « complete.obs »

Nous utiliserons l'ensemble de données BudgetUK. Cet ensemble de données rend compte de l'allocation budgétaire des ménages britanniques entre 1980 et 1982. Il existe 1519  observations avec dix caractéristiques, parmi lesquelles :

  • nourriture: partager la nourriture partager les dépenses
  • wcarburant: partager les dépenses en carburant
  • tissu: part du budget pour les dépenses vestimentaires
  • Walc : partager les dépenses en alcool
  • wtrans: partager les dépenses de transport
  • wother: part des dépenses en autres biens
  • totex: dépenses totales des ménages en euros
  • revenu: revenu net total du ménage
  • âge: âge du ménage
  • les enfants: Nombre d'enfants

Exemple

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv"
data <-read.csv(PATH)
  filter(income < 500)
  mutate(log_income = log(income),
         log_totexp = log(totexp),
         children_fac = factor(children, order = TRUE, labels = c("No", "Yes")))
  select(-c(X,X.1, children, totexp, income))
glimpse(data)

Explication du code

  • Nous importons d’abord les données et examinons la fonction glimpse() de la bibliothèque dplyr.
  • Trois points sont supérieurs à 500K, nous avons donc décidé de les exclure.
  • C'est une pratique courante de convertir une variable monétaire en log. Cela permet de réduire l’impact des valeurs aberrantes et de diminuer l’asymétrie de l’ensemble de données.

Sortie :

## Observations: 1,516## Variables: 10
## $ wfood        <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0...
## $ wfuel        <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0...
## $ wcloth       <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0...
## $ walc         <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0...
## $ wtrans       <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0...
## $ wother       <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0...
## $ age          <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2...
## $ log_income   <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,...
## $ log_totexp   <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,...
## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...

Nous pouvons calculer le coefficient de corrélation entre les variables de revenu et de nourriture avec les méthodes « Pearson » et « Spearman ».

cor(data$log_income, data$wfood, method = "pearson")

Sortie :

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Sortie :

## [1] -0.2501252

Matrice de corrélation dans R

La corrélation bivariée est un bon début, mais nous pouvons obtenir une image plus large grâce à l’analyse multivariée. Une corrélation avec de nombreuses variables est représentée à l'intérieur d'un matrice de corrélation. Une matrice de corrélation est une matrice qui représente la corrélation par paire de toutes les variables.

La fonction cor() renvoie une matrice de corrélation. La seule différence avec la corrélation bivariée est que nous n'avons pas besoin de spécifier quelles variables. Par défaut, R calcule la corrélation entre toutes les variables.

Notez qu’une corrélation ne peut pas être calculée pour une variable factorielle. Nous devons nous assurer de supprimer la fonctionnalité catégorielle avant de transmettre la trame de données dans cor().

Une matrice de corrélation est symétrique, ce qui signifie que les valeurs au-dessus de la diagonale ont les mêmes valeurs que celles du dessous. Il est plus visuel de montrer la moitié de la matrice.

Nous excluons children_fac car il s'agit d'une variable au niveau du facteur. cor n'effectue pas de corrélation sur une variable catégorielle.

# the last column of data is a factor level. We don't include it in the code
mat_1 <-as.dist(round(cor(data[,1:9]),2))
mat_1

Explication du code

  • cor(données): Afficher la matrice de corrélation
  • tour (données, 2): Arrondir la matrice de corrélation avec deux décimales
  • as.dist(): Affiche la seconde moitié uniquement

Sortie :

##            wfood wfuel wcloth  walc wtrans wother   age log_income
## wfuel       0.11                                                  
## wcloth     -0.33 -0.25                                            
## walc       -0.12 -0.13  -0.09                                     
## wtrans     -0.34 -0.16  -0.19 -0.22                               
## wother     -0.35 -0.14  -0.22 -0.12  -0.29                        
## age         0.02 -0.05   0.04 -0.14   0.03   0.02                 
## log_income -0.25 -0.12   0.10  0.04   0.06   0.13  0.23           
## log_totexp -0.50 -0.36   0.34  0.12   0.15   0.15  0.21       0.49

Niveau de signification

Le niveau de signification est utile dans certaines situations lorsque nous utilisons la méthode Pearson ou Spearman. La fonction rcorr() de la bibliothèque Hmisc calcule pour nous la valeur p. Nous pouvons télécharger la bibliothèque depuis compter et copiez le code pour le coller dans le terminal :

conda install -c r r-hmisc

Le rcorr() nécessite qu'une trame de données soit stockée sous forme de matrice. Nous pouvons convertir nos données en matrice avant de calculer la matrice de corrélation avec la valeur p.

library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])

mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output

L'objet liste mat_2 contient trois éléments :

  • r: Sortie de la matrice de corrélation
  • n: Nombre d'observations
  • P: valeur p

Nous nous intéressons au troisième élément, la p-value. Il est courant d'afficher la matrice de corrélation avec la valeur p au lieu du coefficient de corrélation.

p_value <-round(mat_2[["P"]], 3)
p_value

Explication du code

  • mat_2[["P"]]: Les valeurs p sont stockées dans l'élément appelé P
  • rond(mat_2[[“P”]], 3): Arrondissez les éléments avec trois chiffres

Sortie :

           wfood wfuel wcloth  walc wtrans wother   age log_income log_totexp
wfood         NA 0.000  0.000 0.000  0.000  0.000 0.365      0.000          0
wfuel      0.000    NA  0.000 0.000  0.000  0.000 0.076      0.000          0
wcloth     0.000 0.000     NA 0.001  0.000  0.000 0.160      0.000          0
walc       0.000 0.000  0.001    NA  0.000  0.000 0.000      0.105          0
wtrans     0.000 0.000  0.000 0.000     NA  0.000 0.259      0.020          0
wother     0.000 0.000  0.000 0.000  0.000     NA 0.355      0.000          0
age        0.365 0.076  0.160 0.000  0.259  0.355    NA      0.000          0
log_income 0.000 0.000  0.000 0.105  0.020  0.000 0.000         NA          0
log_totexp 0.000 0.000  0.000 0.000  0.000  0.000 0.000      0.000         NA

Visualisation de la matrice de corrélation dans R

Une carte thermique est une autre façon d’afficher une matrice de corrélation. La bibliothèque GGally est une extension de ggplot2. Actuellement, il n'est pas disponible dans la bibliothèque conda. Nous pouvons installer directement dans la console.

install.packages("GGally")

Visualisation de la matrice de corrélation

La bibliothèque comprend différentes fonctions pour afficher les statistiques récapitulatives telles que la corrélation et la distribution de toutes les variables d'un matrice.

La fonction ggcorr() contient de nombreux arguments. Nous présenterons uniquement les arguments que nous utiliserons dans le tutoriel :

La fonction ggcorr

ggcorr(df, method = c("pairwise", "pearson"),
  nbreaks = NULL, digits = 2, low = "#3B9AB2",
  mid = "#EEEEEE", high = "#F21A00",
  geom = "tile", label = FALSE,
  label_alpha = FALSE)

Arguments:

  • df: Ensemble de données utilisé
  • méthode: Formule pour calculer la corrélation. Par défaut, les calculs par paires et Pearson sont calculés
  • npauses: Renvoie une plage catégorielle pour la coloration des coefficients. Par défaut, pas de cassure et le dégradé de couleurs est continu
  • chiffres: Arrondissez le coefficient de corrélation. Par défaut, défini sur 2
  • faible: Contrôler le niveau inférieur de la coloration
  • milieu: Contrôler le niveau intermédiaire de la coloration
  • Élevée: Contrôler le niveau élevé de la coloration
  • géom: Contrôle la forme de l'argument géométrique. Par défaut, « tuile »
  • étiquette: valeur booléenne. Afficher ou non l'étiquette. Par défaut, défini sur « FALSE »

Carte thermique de base

Le tracé le plus basique du package est une carte thermique. La légende du graphique montre un dégradé de couleur de – 1 à 1, la couleur chaude indiquant une forte corrélation positive et la couleur froide, une corrélation négative.

library(GGally)
ggcorr(data)

Explication du code

  • ggcorr(données): Un seul argument est nécessaire, qui est le nom du bloc de données. Les variables au niveau des facteurs ne sont pas incluses dans le graphique.

Sortie :

Carte thermique de base

Ajout de contrôle à la carte thermique

Nous pouvons ajouter plus de contrôles au graphique :

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Explication du code

  • npauses=6: brisez la légende avec 6 rangs.
  • bas = « bleu acier »: Utilisez des couleurs plus claires pour une corrélation négative
  • milieu = « blanc » : Utilisez des couleurs blanches pour la corrélation des plages moyennes
  • élevé = « rouge foncé » : Utilisez des couleurs sombres pour une corrélation positive
  • geom = "cercle": Utilisez le cercle comme forme des fenêtres dans la carte thermique. La taille du cercle est proportionnelle à la valeur absolue de la corrélation.

Sortie :

Ajout de contrôle à la carte thermique

Ajout d'une étiquette à la carte thermique

GGally nous permet d'ajouter une étiquette à l'intérieur des fenêtres :

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Explication du code

  • étiquette = VRAI: Ajoutez les valeurs des coefficients de corrélation à l'intérieur de la carte thermique.
  • couleur = « gris50 »: Choisissez la couleur, c'est à dire le gris
  • taille_étiquette = 3: Définissez la taille de l'étiquette sur 3

Sortie :

Ajout d'une étiquette à la carte thermique

La fonction ggpairs

Enfin, nous introduisons une autre fonction de la bibliothèque GGaly. Ggpaire. Il produit un graphique sous forme matricielle. Nous pouvons afficher trois types de calculs dans un même graphique. La matrice est une dimension égale au nombre d’observations. La partie supérieure/inférieure affiche les fenêtres et en diagonale. Nous pouvons contrôler les informations que nous souhaitons afficher dans chaque partie de la matrice. La formule de ggpair est :

ggpair(df, columns = 1: ncol(df), title = NULL,
    upper = list(continuous = "cor"),
    lower = list(continuous = "smooth"),
    mapping = NULL)		

Arguments:

  • df: Ensemble de données utilisé
  • colonnes: Sélectionnez les colonnes pour dessiner le tracé
  • titre : Inclure un titre
  • supérieur: Contrôlez les cases au-dessus de la diagonale du tracé. Besoin de fournir le type de calculs ou de graphique à renvoyer. Si continu = « cor », on demande à R de calculer la corrélation. Notez que l'argument doit être une liste. D'autres arguments peuvent être utilisés, voir la [vignette](« http://ggobi.github.io/ggally/#custom_functions ») pour plus d'informations.
  • Coût en adjuvantation plus élevé.: Contrôlez les cases situées en dessous de la diagonale.
  • Cartographie: Indique l'esthétique du graphique. Par exemple, nous pouvons calculer le graphique pour différents groupes.

Analyse bivariée avec ggpair avec regroupement

Le graphique suivant trace trois informations :

  • La matrice de corrélation entre log_totextp, log_treatment, age et wtrans variable regroupée selon que le ménage a un enfant ou non.
  • Tracez la distribution de chaque variable par groupe
  • Afficher le nuage de points avec la tendance par groupe
library(ggplot2)
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor",
        size = 3)),
    lower = list(continuous = wrap("smooth",
        alpha = 0.3,
        size = 0.1)),
    mapping = aes(color = children_fac))

Explication du code

  • colonnes = c("log_totexp", "log_ Income", "age", "wtrans"): Choisissez les variables à afficher dans le graphique
  • title = « Analyse bivariée des revenus dépensés par les ménages britanniques »: Ajouter un titre
  • supérieur = liste(): Contrôle la partie supérieure du graphique. C'est à dire au-dessus de la diagonale
  • continu = wrap("cor", taille = 3)): Calculez le coefficient de corrélation. Nous enveloppons l'argument continu à l'intérieur de la fonction wrap() pour contrôler l'esthétique du graphique (c'est-à-dire taille = 3) -lower = list() : Contrôle la partie inférieure du graphique. C'est-à-dire en dessous de la diagonale.
  • continu = wrap ("lisse", alpha = 0.3, taille = 0.1): Ajoutez un nuage de points avec une tendance linéaire. Nous enveloppons l'argument continu dans la fonction wrap() pour contrôler l'esthétique du graphique (c'est-à-dire size=0.1, alpha=0.3).
  • mapping = aes(color = children_fac): Nous voulons que chaque partie du graphique soit empilée par la variable children_fac, qui est une variable catégorielle prenant la valeur de 1 si le ménage n'a pas d'enfants et de 2 sinon

Sortie :

Analyse bivariée avec ggpair avec regroupement

Analyse bivariée avec ggpair avec regroupement partiel

Le graphique ci-dessous est un peu différent. Nous modifions la position du mappage à l'intérieur de l'argument supérieur.

ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"),
    title = "Bivariate analysis of revenue expenditure by the British household",
    upper = list(continuous = wrap("cor",
            size = 3),
        mapping = aes(color = children_fac)),
    lower = list(
        continuous = wrap("smooth",
            alpha = 0.3,
            size = 0.1))
)

Explication du code

  • Exactement le même code que l'exemple précédent sauf pour :
  • mapping = aes(color = children_fac) : Déplacez la liste dans upper = list(). Nous voulons uniquement que le calcul soit empilé par groupe dans la partie supérieure du graphique.

Sortie :

Analyse bivariée avec ggpair avec regroupement partiel

Résumé

  • Une relation bivariée décrit une relation -ou corrélation- entre deux variables dans R.
  • Il existe deux méthodes principales pour calculer la corrélation entre deux variables dans Programmation R: Pearson et Spearman.
  • La méthode de corrélation de Pearson est généralement utilisée comme contrôle principal de la relation entre deux variables.
  • Une corrélation de rang trie les observations par rang et calcule le niveau de similarité entre les rangs.
  • La corrélation de rang de Spearman, , est toujours comprise entre -1 et 1, une valeur proche de l'extrémité indiquant une relation forte.
  • Une matrice de corrélation est une matrice qui représente la corrélation par paire de toutes les variables.
  • Le niveau de signification est utile dans certaines situations lorsque nous utilisons la méthode Pearson ou Spearman.

Nous pouvons résumer toutes les fonctions de corrélation dans R dans le tableau ci-dessous :

Bibliothèque Objectif Méthode Code
Base corrélation bivariée Pearson
cor(dfx2, method = "pearson")
Base corrélation bivariée Lancier
cor(dfx2, method = "spearman")
Base Corrélation multivariée Pearson
cor(df, method = "pearson")
Base Corrélation multivariée Lancier
cor(df, method = "spearman")
Hmisc Valeur P
rcorr(as.matrix(data[,1:9]))[["P"]]
Ggalement carte thermique
ggcorr(df)
Parcelles multivariées
cf code below