Menu

La corrélation en R : cor(), cor.test() et matrices de corrélation

Mesure comment deux variables évoluent ensemble avec cor(), teste si la relation est réelle avec cor.test(), et balaie plusieurs variables d'un coup avec une matrice de corrélation.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Corrélation entre deux variables : cor()

La corrélation demande : quand une variable monte, l'autre tend-elle à monter aussi (positive), à descendre (négative), ou à faire sa vie (proche de zéro) ? En R, ça tient en un appel :

La réponse est environ −0,87 : les voitures plus lourdes consomment davantage, et la relation est forte. Ce seul nombre est le coefficient de corrélation de Pearson, universellement noté r.

Lire r

Le coefficient tombe toujours entre −1 et +1. Le signe donne la direction ; la magnitude donne la force :

|r|Lecture typique
0,0 – 0,2négligeable
0,2 – 0,4faible
0,4 – 0,6modérée
0,6 – 0,8forte
0,8 – 1,0très forte

Traite ces plages comme des points de départ de discussion, pas comme une loi - en physique un r de 0,6 est décevant, en psychologie c'est le sommet d'une carrière. Deux propriétés à intégrer : r n'a pas d'unité (corréler le poids en tonnes avec le mpg donne le même r que le poids en kilogrammes avec le mpg, parce que r est calculé sur des valeurs standardisées), et r ne mesure que l'association linéaire - une relation en U parfaite peut avoir un r ≈ 0.

Et la phrase qu'il faut dire : corrélation n'est pas causalité. Les ventes de glaces et les décès par noyade corrèlent fortement au fil des mois de l'année - non parce que la glace noie les gens, mais parce que l'été entraîne les deux. Une corrélation te dit que deux variables évoluent ensemble ; elle est muette sur le pourquoi. Peut-être que x cause y, peut-être que y cause x, peut-être qu'une troisième chose (la saison, ici) cause les deux. Trancher entre ces options demande des expériences ou un raisonnement causal soigneux, pas un r plus grand.

Spearman et Kendall : quand Pearson est le mauvais outil

Pearson travaille sur les valeurs brutes, ce qui le rend sensible aux valeurs aberrantes et aveugle aux relations courbes. L'argument method bascule vers des alternatives fondées sur les rangs :

Spearman remplace chaque valeur par son rang puis calcule Pearson sur les rangs. Comme y augmente toujours quand x augmente, tous les rangs s'alignent et Spearman rapporte exactement 1 - la taille de la valeur aberrante cesse de compter, seule sa position importe. Passe à Spearman quand les données sont ordinales (échelles d'enquête), fortement asymétriques, ou quand la relation est monotone sans être droite. Kendall répond à une question similaire à partir des paires concordantes/discordantes ; il est plus robuste sur de petits échantillons mais plus lent, et Spearman est le choix par défaut courant.

La matrice de corrélation

Pour balayer les relations entre de nombreuses variables d'un coup, donne plusieurs colonnes numériques à cor() :

Chaque variable contre chaque autre, avec des 1 sur la diagonale (tout corrèle parfaitement avec soi-même) et une image miroir de part et d'autre. Arrondir à deux décimales compte plus qu'il n'y paraît - la matrice non arrondie est un mur de chiffres, et l'intérêt d'une matrice est de la balayer du regard. Ici le balayage montre que mpg corrèle négativement avec les trois autres (les voitures plus lourdes, plus puissantes, à plus grosse cylindrée consomment plus) tandis que wt, hp et disp sont tous fortement positifs entre eux - un amas de variables « grosse voiture » qui comptera quand tu arriveras à la régression linéaire et à ses maux de tête de multicolinéarité.

Valeurs manquantes : l'argument use

Avec des données manquantes, le comportement par défaut de cor() est de renvoyer NA plutôt que de deviner :

  • use = "complete.obs" supprime toute ligne contenant un NA, puis calcule toute la matrice à partir des survivantes. Cohérent, mais dispendieux - un wt manquant retire aussi cette ligne de la paire mpghp.
  • use = "pairwise.complete.obs" calcule chaque cellule à partir de toutes les lignes où cette paire est présente. Ça conserve plus de données, mais des cellules différentes reposent sur des sous-ensembles différents, ce qui peut très occasionnellement produire une matrice qui n'est pas cohérente en interne.

Pour deux ou trois NA égarés, l'un ou l'autre convient ; dis simplement lequel tu as utilisé.

Est-ce significatif ? cor.test()

cor() donne un nombre mais aucune idée de savoir si ça pourrait être du bruit. cor.test() réalise le test d'hypothèse :

Parcours la sortie bloc par bloc :

  • t = −9.56, df = 30 - la statistique de test. L'hypothèse nulle est que la corrélation vraie est nulle ; le r observé est converti en une statistique t à n − 2 degrés de liberté (32 voitures − 2).
  • p-value = 1.29e-10 - si la corrélation vraie était nulle, la probabilité de voir un r aussi éloigné de zéro dans un échantillon de 32 serait d'environ 0,0000000001. C'est une preuve écrasante que l'association est réelle - mais souviens-toi, la p-valeur dit si r diffère de zéro, pas si la relation est grande ou causale.
  • 95 percent confidence interval: −0.93 to −0.74 - la plage plausible pour la corrélation vraie. Souvent plus utile que la p-valeur : même l'extrémité optimiste de cet intervalle est une forte corrélation négative.
  • sample estimates: cor = −0.87 - le même nombre que t'a donné cor().

Les petits échantillons méritent ici un respect supplémentaire : avec n = 10, des corrélations de ±0,5 apparaissent par chance de façon inquiétamment fréquente, et l'intervalle de confiance large te le dira. Rapporte l'intervalle, pas seulement la p-valeur.

Le voir : trace toujours

Un coefficient de corrélation comprime toute une relation en un seul nombre, et la compression peut masquer une courbure, des amas, ou un seul point qui fait tout le travail. Avant de faire confiance à un r, regarde le nuage de points :

plot(mtcars$wt, mtcars$mpg)              # one pair
pairs(mtcars[, c("mpg", "wt", "hp", "disp")])  # every pair in the matrix

pairs() dessine une grille de nuages de points correspondant à ta matrice de corrélation - le moyen le plus rapide de vérifier que les nombres veulent bien dire ce que tu crois. Pour des graphiques de matrice façon carte de chaleur soignés, le package corrplot (install.packages("corrplot"), puis corrplot(cor(m))) est l'outil standard.

Ce que tu retiens

  • cor(x, y) donne le r de Pearson : le signe est la direction, la magnitude la force, toujours dans [−1, 1], sans unité.
  • La corrélation mesure la co-évolution linéaire et ne dit rien de la causalité - une troisième variable tapie est toujours une candidate.
  • method = "spearman" pour les rangs : données ordinales, valeurs aberrantes, relations monotones mais courbes.
  • cor(df) sur des colonnes numériques donne la matrice ; arrondis-la avec round(, 2), et fais attention à l'argument use = quand des données manquent.
  • cor.test(x, y) ajoute la p-valeur et un intervalle de confiance - rapporte l'intervalle.
  • Regarde toujours le nuage de points avant de croire le nombre.

Prochaine étape : quand la question passe de « évoluent-elles ensemble ? » à « la moyenne de ce groupe diffère-t-elle de celle de l'autre ? » - le test t.

Questions fréquentes

Comment calculer une corrélation en R ?

cor(x, y) renvoie le coefficient de corrélation de Pearson entre deux vecteurs numériques. Passe plutôt un data frame de colonnes numériques - cor(df) - pour obtenir la matrice de corrélation complète. Pour une p-valeur et un intervalle de confiance, utilise cor.test(x, y).

Comment obtenir la p-valeur d'une corrélation en R ?

cor() seul n'en donne pas - utilise cor.test(x, y). Sa sortie contient la statistique t, les degrés de liberté, la p-valeur pour l'hypothèse nulle d'une corrélation vraie nulle, un intervalle de confiance à 95 % et le coefficient estimé.

Quelle est la différence entre les corrélations de Pearson et de Spearman ?

Pearson (par défaut) mesure l'association linéaire sur les valeurs brutes. Spearman classe d'abord les valeurs par rang, il mesure donc si la relation est constamment croissante ou décroissante (monotone), et il est bien moins sensible aux valeurs aberrantes. Utilise cor(x, y, method = "spearman") pour des données ordinales, asymétriques, ou des relations courbes mais monotones.

Comment gérer les valeurs NA dans cor() ?

Par défaut, cor() renvoie NA si une valeur manque. Passe use = "complete.obs" pour supprimer d'abord les lignes contenant une valeur manquante, ou use = "pairwise.complete.obs" dans une matrice pour utiliser, pour chaque paire de variables, toutes les lignes où les deux sont présentes.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER