Matrice de corrélation de Pearson et Spearman dans R avec exemple

⚡ Résumé intelligent

Les corrélations de Pearson et de Spearman dans R mesurent la force de l'évolution conjointe de deux variables, en utilisant la fonction `cor()` pour une seule paire et une matrice de corrélation pour plusieurs. Ce tutoriel présente également les tests de signification avec `Hmisc` et visualise les résultats avec des cartes thermiques `GGally`.

  • (I.e. Plage de coefficients : Toute corrélation se situe entre -1 et 1, où 0 indique l'absence de relation linéaire et chaque valeur extrême indique une relation parfaite.
  • 📈 Méthode Pearson : Paramétrique, mesure l'association linéaire et suppose des variables continues approximativement normales.
  • (I.e. Méthode Spearman : Non paramétrique, fonctionne sur les rangs et est robuste aux valeurs aberrantes et aux données asymétriques ou ordinales.
  • 🧮 Vue matricielle : cor(df) renvoie tous les coefficients par paires, et as.dist() n'imprime que le triangle inférieur.
  • (I.e. Importance: cor.test() pour une paire, ou rcorr() de Hmisc pour une matrice complète de valeurs p.
  • ???? Visualisation: ggcorr() dessine une carte thermique et ggpairs() construit une matrice complète de distributions et de nuages ​​de points.

Matrice de corrélation dans R

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.

Le coefficient de corrélation, noté r, mesure la force de la linéaire relation entre deux variables x et y. Elle est calculée comme suit :

Matrice de corrélation de Pearson dans R

au

  • Matrice de corrélation de Pearson dans R est l'écart type de x
  • Matrice de corrélation de Pearson dans R est l'écart type de y

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

  • Une valeur de r proche ou égale à 0 implique une relation linéaire faible ou inexistante entre x et y.
  • Plus r se rapproche de 1 ou de -1, plus la relation linéaire est forte.

Vous pouvez tester si r diffère de zéro avec la statistique t ci-dessous, en la comparant à la distribution de Student avec n – 2 degrés de liberté :

Matrice de corrélation de Pearson dans R

Corrélation des rangs de Spearman dans R

La corrélation de rang classe les observations par rang et calcule le degré de similarité entre les rangs. Elle présente l'avantage d'être robuste aux valeurs aberrantes et indépendante de la distribution des données. La corrélation de rang est également le choix approprié pour les variables ordinales.

Le coefficient de corrélation de rang de Spearman, noté rho, varie également de -1 à 1, et les valeurs proches de ces extrémités indiquent une forte corrélation monotone. Il se calcule comme suit :

Corrélation des rangs de Spearman dans R

Le numérateur est la covariance entre les rangs de x et y, et le dénominateur est le produit de leurs écarts-types.

En R, les deux sont calculés avec la fonction cor(), qui prend trois arguments : x, y et 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
  • 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)

Code Explication

  • Nous importons d’abord les données et examinons la fonction glimpse() de la bibliothèque dplyr.
  • Trois ménages déclarent un revenu de 500 ou plus, donc filter(revenu < 500) les supprime et le nombre de lignes passe de 1 519 à 1 516.
  • 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

Avant d'étendre cela à chaque paire de variables, il convient de préciser comment un coefficient unique doit être interprété.

Comment interpréter un coefficient de corrélation

Un coefficient n'est utile que si l'on peut en expliquer la signification. Les intervalles ci-dessous correspondent à la lecture conventionnelle ; le signe se lit indépendamment de l'intensité.

Valeur absolue de r Force de la relation
0.00 à 0.19 ans, qui Très faible ou nul
0.20 à 0.39 ans, qui Faible
0.40 à 0.59 ans, qui Modérée
0.60 à 0.79 ans, qui Forte
0.80 à 1.00 ans, qui Très fort

La valeur de -0.2467 calculée précédemment entre log_income et wfood est donc une faible relation négative : les ménages plus riches consacrent une part légèrement plus petite de leur budget à l'alimentation.

Trois mises en garde s'appliquent à chaque coefficient.

  • La corrélation n’est pas la causalité. Une forte corrélation (r) indique que les deux variables évoluent de concert, jamais qu'une variable est la cause de l'autre. Une troisième variable, non mesurée, influence souvent les deux.
  • Pearson ne voit que des lignes droites. Une relation en forme de U parfaite donne un coefficient de corrélation (r) proche de zéro. Il est toujours conseillé de représenter graphiquement les données avant de se fier à la valeur numérique.
  • La taille compte plus que l'importance. Avec 1 516 observations, un coefficient de 0.06 peut être statistiquement significatif et pourtant pratiquement dénué de sens.

Comment tester la signification de la corrélation avec cor.test()

La fonction `cor()` renvoie le coefficient et rien d'autre. Pour une seule paire, `cor.test()` ajoute la p-valeur et l'intervalle de confiance en un seul appel.

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

Le document comporte quatre parties qui méritent d'être lues.

  1. t et df: la statistique de test et ses degrés de liberté, n – 2.
  2. p-valeur: la probabilité d'observer un coefficient aussi élevé si la corrélation réelle était nulle.
  3. intervalle de confiance à 95 %: l'intervalle plausible pour la corrélation réelle. S'il exclut zéro, la relation est significative à ce niveau.
  4. estimation de l'échantillon: le coefficient lui-même, identique à ce que renvoie cor().

La même fonction exécute les tests basés sur le classement en modifiant un seul argument :

# Spearman rank correlation with a p-value
cor.test(data$log_income, data$wfood, method = "spearman")

# One-sided test: is the correlation greater than zero?
cor.test(data$log_income, data$wfood, alternative = "greater")

Quand utiliser lequel. Utilisez `cor.test()` pour examiner une paire spécifique, car cette fonction fournit l'intervalle de confiance, contrairement à `rcorr()`. Utilisez `rcorr()` de `Hmisc`, présenté ci-dessus, lorsque vous avez besoin des p-valeurs pour une matrice entière. Notez que tester de nombreuses paires augmente le taux de faux positifs ; il est donc conseillé d'ajuster les p-valeurs avec `p.adjust(p_value, method = "BH")` avant de tirer des conclusions d'une grande matrice.

Matrice de corrélation dans R

Une corrélation bivariée est un bon point de départ, mais une analyse multivariée offre une vision plus globale. matrice de corrélation est un tableau carré contenant la corrélation par paires de chaque variable par rapport à toutes les autres.

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.

Il est impossible de calculer une corrélation pour un facteur ; il faut donc supprimer toutes les colonnes catégorielles avant de passer le cadre de données à la fonction 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.

children_fac est exclu car cor() ne peut pas opérer sur un facteur.

# 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

Code Explication

  • cor(données[, 1:9])Calculer la matrice de corrélation sur les neuf colonnes numériques
  • rond(…, 2)Arrondir chaque coefficient à deux décimales
  • as.dist()N'affichez que le triangle inférieur, car la matrice est symétrique.

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

Un coefficient seul ne permet pas de déterminer la fiabilité statistique de la relation. La fonction `rcorr()` de la bibliothèque Hmisc renvoie la p-valeur pour chaque paire. Vous pouvez télécharger cette bibliothèque depuis [lien manquant]. 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

Code Explication

  • 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 de lire une matrice de corrélation. La bibliothèque GGally étend ggplot2 et s'installe depuis le CRAN plutôt que depuis conda :

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)

Code Explication

  • 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")

Code Explication

  • 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")

Code Explication

  • é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

La bibliothèque GGally fournit également la fonction ggpairs(), qui renvoie une matrice de graphiques. Pour k variables sélectionnées, le résultat est une grille ak par k : la diagonale représente la distribution de chaque variable, tandis que les panneaux situés au-dessus et en dessous de la diagonale peuvent chacun contenir un calcul différent. La syntaxe est la suivante :

ggpairs(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érieurContrôlez les cases situées au-dessus de la diagonale du graphique. Vous devez indiquer le type de calculs ou de graphique à renvoyer. Si `continuous = "cor"`, R calculera la corrélation. Notez que l'argument doit être une liste. D'autres arguments sont disponibles ; consultez la documentation. Documentation GGally pour plus d'informations.
  • baisser: Contrôlez les cases situées en dessous de la diagonale.
  • planping: Indique l'esthétique du graphique. Par exemple, nous pouvons calculer le graphique pour différents groupes.

Analyse bivariée avec ggpair avec groupeping

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))

Code Explication

  • 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).
  • planping = aes(couleur = enfant_fac)Divisez chaque panel selon children_fac, le facteur ordonné étant étiqueté « Non » pour les ménages sans enfants et « Oui » pour les ménages avec enfants.

Sortie :

Analyse bivariée avec ggpair avec groupeping

Analyse bivariée avec ggpair avec groupe partielping

Le graphique ci-dessous est légèrement différent. Nous modifions la position de la carte.ping à 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))
)

Code Explication

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

Sortie :

Analyse bivariée avec ggpair avec groupe partielping

Corrélation dans R : Points clés et référence des fonctions

  • 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.
  • Le coefficient de corrélation de rang de Spearman varie de -1 à 1, et les valeurs proches de chaque extrémité indiquent une forte relation monotone.
  • Une matrice de corrélation est un tableau carré contenant la corrélation par paire de chaque variable.
  • La valeur p indique si une corrélation observée est statistiquement différente de zéro.

Chaque fonction de corrélation utilisée dans ce tutoriel est répertoriée 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)
GGally Matrice de tracé multivariée -
ggpairs(df, columns = c("x1", "x2"))

FAQ

Utilisez le coefficient de Spearman lorsque la relation est monotone mais non linéaire, en présence de valeurs aberrantes ou lorsqu'une variable est ordinale. Le coefficient de Pearson suppose une relation linéaire et des données continues suivant approximativement une loi normale.

Le coefficient tau de Kendall comptabilise les paires concordantes et discordantes plutôt que de classer les différences. Il est plus robuste que le coefficient de Spearman sur les petits échantillons comportant de nombreux ex æquo, bien que son calcul soit plus lent sur les grands ensembles de données.

Non. La corrélation mesure uniquement la covariation. Une variable confondante peut influencer les deux séries, et le sens de tout effet réel ne peut être établi à partir du seul coefficient.

Les matrices de corrélation révèlent les caractéristiques redondantes avant l'entraînement, car deux prédicteurs fortement corrélés n'apportent que peu d'informations et déstabilisent les modèles linéaires. Les équipes d'IA les utilisent également pour détecter les fuites de données de la variable cible.

Oui. Les assistants IA peuvent résumer les paires qui dépassent un seuil, suggérer les caractéristiques redondantes à supprimer et expliquer les couleurs des cartes thermiques. Vérifiez chaque affirmation à l'aide de vos propres résultats de cor.test() avant d'agir.

Résumez cet article avec :