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 :
avec
, c'est-à-dire l'écart type de
, 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 à :
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 :
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")
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 :
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 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 :
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 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 :
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 |