Corrélation dans R: Pearson & Exemple de Spearman avec matrice

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

Il existe deux méthodes principales pour calculer la corrélation entre deux variables.

  • Pearson: corrélation paramétrique
  • Spearman: corrélation non paramétrique

Dans ce tutoriel, vous apprendrez

  • Corrélation de Pearson
  • Corrélation de rang de Spearman
  • Matrice de corrélation
  • Visualiser la matrice de corrélation

Corrélation de Pearson

La méthode de corrélation de Pearson est généralement utilisée comme vérification principale de la relation entre deux variables.

Le coefficient de corrélation,, est une mesure de la force de la relation linéaire 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 relation linéaire se rapproche de 1 ou -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 de rang de Spearman

Une corrélation de rang trie les observations par rang et calcule le niveau de similitude entre le rang. Une corrélation de rang a 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 pour la variable ordinale.

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

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

Dans R, nous pouvons utiliser la fonction cor (). Il faut trois arguments, et la méthode.

cor(x, y, method)

Arguments :

  • x: premier vecteur
  • y: deuxième vecteur
  • method: 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 y a 1519 observations avec dix caractéristiques, parmi lesquelles:

  • wfood: partager les dépenses de partage de nourriture
  • wfuel: partager les dépenses en carburant
  • wcloth: part du budget pour les dépenses vestimentaires
  • walc: partager les dépenses d'alcool
  • wtrans: partager les dépenses de transport
  • wother: part des autres biens dépensés
  • totexp: dépenses totales des ménages en livre
  • revenu revenu net total du ménage
  • age: âge du ménage
  • 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 jetons un œil avec la fonction glimpse () de la bibliothèque dplyr.
  • Trois points sont au-dessus de 500K, nous avons donc décidé de les exclure.
  • Il est courant de convertir une variable monétaire en log. Cela aide à réduire l'impact des valeurs aberrantes et diminue l'asymétrie dans l'ensemble de données.

Production:

## Observations: 1,516## Variables: 10## $ wfood  0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0… ## $ wfuel  0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0… ## $ wcloth  0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0… ## $ walc  0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0… ## $ wtrans  0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0… ## $ wother  0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0… ## $ age  25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2… ## $ log_income  4.867534, 5.010635, 5.438079, 4.605170, 4.605170,… ## $ log_totexp  3.912023, 4.499810, 5.192957, 4.382027, 4.499810,… ## $ children_fac  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 wfood avec les méthodes «pearson» et «spearman».

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

production:

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

Production:

## [1] -0.2501252 

Matrice de corrélation

La corrélation bivariée est un bon début, mais nous pouvons obtenir une image plus large avec une analyse multivariée. Une corrélation avec de nombreuses variables est représentée dans une matrice de corrélation . Une matrice de corrélation est une matrice qui représente la corrélation de paires 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 la variable factorielle. Nous devons nous assurer de supprimer la fonctionnalité catégorielle avant de passer la trame de données à l'intérieur de 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 celle ci-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 codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Explication du code

  • cor (data): affiche la matrice de corrélation
  • round (data, 2): Arrondissez la matrice de corrélation avec deux décimales
  • as.dist (): affiche uniquement la seconde moitié

Production:

## 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 p-value. Nous pouvons télécharger la bibliothèque depuis conda et copier 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 une 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 valeur p. 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 p-values ​​sont stockées dans l'élément appelé P
  • round (mat_2 [["P"]], 3): Arrondissez les éléments avec trois chiffres

Production:

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

Visualiser la matrice de corrélation

Une carte thermique est une autre façon de montrer 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 dans une matrice.

La fonction ggcorr () a beaucoup d'arguments. Nous n'introduirons que 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, par paire et Pearson sont calculés
  • nbreaks : renvoie une plage catégorielle pour la coloration des coefficients. Par défaut, pas de rupture et le dégradé de couleur est continu
  • chiffres : arrondissez le coefficient de corrélation. Par défaut, défini sur 2
  • low : contrôle le niveau inférieur de la coloration
  • mid : contrôle le niveau moyen de la coloration
  • high : contrôle le niveau élevé de la coloration
  • geom : contrôle la forme de l'argument géométrique. Par défaut, "tuile"
  • label : valeur booléenne. Afficher ou non l'étiquette. Par défaut, défini sur «FALSE»

Carte de chaleur 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, avec une couleur chaude indiquant une forte corrélation positive et une couleur froide, une corrélation négative.

library(GGally)ggcorr(data)

Explication du code

  • ggcorr (data): un seul argument est nécessaire, qui est le nom de la trame de données. Les variables de niveau de facteur ne sont pas incluses dans le graphique.

Production:

Ajouter un contrôle à la carte de chaleur

Nous pouvons ajouter plus de contrôles au graphique.

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

Explication du code

  • nbreaks = 6: briser la légende avec 6 rangs.
  • low = "steelblue": utilisez des couleurs plus claires pour une corrélation négative
  • mid = "white": utilisez des couleurs blanches pour la corrélation des plages moyennes
  • high = "darkred": utilisez des couleurs sombres pour une corrélation positive
  • geom = "circle": 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.

Production:

Ajouter une étiquette à la carte de chaleur

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

  • label = TRUE: Ajoutez les valeurs des coefficients de corrélation à l'intérieur de la carte thermique.
  • color = "grey50": Choisissez la couleur, c'est-à-dire le gris
  • label_size = 3: définit la taille de l'étiquette égale à 3

Production:

ggpairs

Enfin, nous introduisons une autre fonction de la bibliothèque GGaly. Ggpair. Il produit un graphique dans un format matriciel. Nous pouvons afficher trois types de calcul dans un même graphique. La matrice est une dimension, avec égal 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 voulons 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é
  • title : 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 graphe à renvoyer. Si continu = "cor", nous demandons à 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.
  • Inférieur : contrôlez les cases sous la diagonale.
  • Mappage : 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 les variables log_totexp, log_income, age et wtrans regroupées selon que le ménage a un enfant ou non.
  • Tracer 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 dépenses de revenus du ménage britannique": Ajouter un titre
  • upper = list (): Contrôle la partie supérieure du graphique. Ie au-dessus de la diagonale
  • continu = wrap ("cor", size = 3)): Calcule le coefficient de corrélation. Nous enveloppons l'argument continu dans la fonction wrap () pour contrôler l'esthétique du graphe (ie size = 3) -lower = list (): Contrôle la partie inférieure du graphe. Ie en dessous de la diagonale.
  • continu = wrap ("smooth", alpha = 0.3, size = 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 1 si le ménage n'a pas d'enfants et 2 sinon

Production:

Analyse bivariée avec ggpair avec regroupement partiel

Le graphique ci-dessous est un peu différent. Nous changeons 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 ne voulons que le calcul empilé par groupe dans la partie supérieure du graphe.

Production:

Résumé

Nous pouvons résumer la fonction 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"]]

Ggally

carte de chaleur

ggcorr(df)

Graphiques multivariés

cf code below

Articles intéressants...