La corrélation, contrairement à la régression étudie un lien pas une causalité. La corrélation ne demande pas d’identifier une variable dépendante et une variable indépendante. C’est-à-dire que lorsque l’on réalise une corrélation on ne cherche pas à déterminer l’effet d’une variable sur une autre. La corrélation tout ce qu’elle fait (et c’est déjà pas mal) c’est déterminer l’absence ou la présence d’une relation, d’un lien significatif entre 2 variables.
Par exemple, nous pouvons être intéressés à savoir si le nombre de suicides par strangulation aux États-Unis est associé au niveau d’investissement du gouvernement américain dans la recherche. Ces variables peuvent être :
(Pour info, le coefficient de corrélation r entre ces 2 variables est de 0.99 : http://tylervigen.com/spurious-correlations)
Petit point stat : La corrélation est une quantification de la relation entre des variables. Le calcul du coefficient de corrélation repose sur le calcul de la covariance entre les variables. Le coefficient de corrélation est en fait la standardisation de la covariance. Cette standardisation permet d’obtenir une valeur qui variera toujours entre -1 et +1, peu importe l’échelle de mesure des variables mises en relation.
Concrètement tout cela veut dire qu’une corrélation, encore une fois, n’est pas une causalité, on parle bien de covariance. Le calcul de corrélation entre le nombre de suicides par strangulation aux États-Unis et le niveau d’investissement du gouvernement américain dans la recherche ne montre absolument pas que l’un est la cause de l’autre mais que statistiquement il existe une relation entre les variables.
Avant de parler de l’hypothèse nulle (ou H0), nous allons faire un petit détour par la notion de risque d’erreur… On va déjà commencer par éclaircir un point. p, valeur p et p-value c’est exactement la même chose. La seul différence c’est que p est plus simple à écrire ; et qu’accessoirement p-value c’est de l’anglais . Vous pouvez utiliser l’un ou l’autre en fonction de vos envies. Vous voilà libéré d’un poids !
Ok, mais c’est quoi? Le p représente la probabilité du risque d’erreur associé à notre test statistique. C’est en fait la probabilité que le résultat de notre test soit dû au hasard. Le p est très important car c’est en fonction de sa valeur que nous pourrons dire si le résultat de notre test statistique est fiable (représentatif de notre population) ou en réalité dû au hasard ou à une coïncidence. C’est à partir de lui que nous accepterons ou rejeterons l’hypohèse nulle. Par convention en SHS la limite à partir de laquelle nous pouvons considérer notre test comme fiable est fixée à 5%, il s’agit du seuil de significativité. Ce seuil est le risque d’erreur que nous considérons comme acceptable.
Bref l’hypothèse nulle quand nous réalisons une corrélation… Elle est plutôt simple, nous supposons que les variables ne sont pas associées. Donc qu’il n’ y a pas de lien.
Quand le p> 0.05 c’est donc qu’il y a indépendance entre les variables (pas de lien) et que nous acceptons notre hypothèse nulle.
Encore une petite subtilité de la corrélation : il en existe plusieurs types, et heureusement !
Il est très important de faire attention au choix de notre coefficient de corrélation, cela peut vraiment fausser vos résultats. Pas de panique ! Il y a une marche à suivre très simple : le choix se fera en fonction de la distribution de vos données.
Si vous cherchez à étudier une relation linéaire entre 2 variables quantitatives et continues et que par miracle au moins l’une des 2 suit une distribution normale, vous aurez l’immense honneur de pouvoir réaliser un calcul du coefficient de corrélation de Pearson. (Et ô joie ! Vous aurez aussi le droit, si vous en avez envie, de faire une régression linéaire si un ensemble d’autres conditions nécessaires sont réunies.)
Mais si vos données ne suivent pas une loi normale, qu’elles ne sont pas continues… alors il est conseillé de basculer dans l’enfer des tests non paramétriques. Adieu Pearson et bonjour Spearman (ou Kendall) . Mais ne vous inquiétez pas, ça marche très bien ! Simplement, on ne sera pas sur l’étude d’une relation linéaire, mais sur une comparaison des rangs. À dire vrai, d’un point de vue statistique, c’est même une méthode beaucoup plus robuste. (Par contre, ne vous avisez surtout pas de faire une régression linéaire, dans ce cas, cela peut être létal). Ces coefficients vous seront donc très utile dans le cas où l’analyse du nuage de points révèle une forme curviligne dans une relation qui semble mal s’ajuster à une droite.
Les différences entre Kendall et Spearman peuvent alimenter des conversations de statisticiens pendant des heures! A notre échelle ce que l’on peut dire c’est que globalement, dans la plupart des cas ces valeurs seront très proches, et dans l’éventualité d’une divergence, le mieux sera d’interpréter la plus petite valeur pour limiter le risque d’erreur.
Pour être un peu plus rigouereux on peut ajouter que Spearman se lit comme le coefficient de Pearson, en caricaturant on pourrait considérer que s’en est l’adaptation pour les tests non paramétriques. Alors que le coefficient de Kendall se lit comme une probabilité, (précisément, c’est la différence entre la probabilité que les données observées soient dans le même ordre pour les deux variables versus la probabilité que les données observées soient dans des ordres différents pour les deux variables). L’autre distinction qui pourrait nous intéresser ici c’est que dans certaines discipline comme la psychologie, la sociologie… on considère que Spearman s’utilise dans le cas de variables ordinales où la distance “ressentie” entre les classes est la même entre tous les intervalles (par exemple les réponses aux échelles de Likert ; pour savoir ce qu’est une échelle de Likert : https://fr.wikipedia.org/wiki/%C3%89chelle_de_Likert)
Pour être interprété, le coefficient de corrélation doit être significatif (la valeur de p doit être plus petite que 0,05). Si le coefficient est non significatif, on considère alors qu’il est semblable à un coefficient = 0, c’est-à-dire pas de lien.
2 informations importantes sont à analyser :
Pour terminer, et complexifier encore, si votre p est entre 0.05 et 0.1, vous pouvez éventuellement parler d’un effet tendanciel. Mais, quoi qu’il en soit, vos variables n’auront pas de lien significatif d’un point de vue statistique.
Sur R il existe de très nombreux packages pour calculer une corrélation. Vous allez trouver la fonction ‘cor()’ implémentée de base dans R, on trouve aussi le package {Hmisc} et sa fonction ‘rcorr’, ou encore le package {corrr} qui proposent certaines choses intéressantes. À vous d’explorer la très nombreuse documentation et toutes les possibilités.
Mais il est important de noter que les solutions que je viens de citer présentent toutes un problème majeur. Dans le calcul de leurs coefficients et des scores de significativités associés (que ce soit Pearson, Spearman ou Kendall) ces fonctions n’opèrent pas de corrections des p-value. Alors oui, c’est un truc pénible de statisticien mais cela peut radicalement changer les résultats. Après correction, le calcul des corrélations renverra certes moins de coefficients significatifs mais vous aurez la certitude de la justesse des corrélations significative. Ça ne fait pas de mal un peu de rigueur statistique !
Le package que je vais vous présenter propose donc une fonction qui permet d’effectuer un ajustement des p-value. Il s’agit du package {psycho} !
Commençons par charger le jeu de donnée test mtcars et les packages dont nous aurons besoin. Le jeu de donnée mtcars est une base de données fourni avec R qui correspond à une extraction du magazine américain Motor Trend de l’année 74 et qui rassemble des données de 32 modèles de voitures à l’aide de 11 variables allant de la consommation, au nombre de chevaux ou encore au nombre de cylindres.
#Pour charger les packages dans R
# Pour les installer utiliser la fonction install.packages()
library(psycho)
library(funModeling)
# Charger le jeu de données
# Si vous souhaiter davantages d'info sur les données mtcars vous pouvez taper ?mtcars
data(mtcars)
#la fonction str permet de caractériser nos variables et avoir un premier regard
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
#pour visualiser les 10 premières lignes de notre base de données on utilisera la fonction head()
#Pour afficher l'intégralité de votre base de données dans une fenêtre distincte vous pourrez utiliser la fonction View()
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Comme vous pouvez le constater nous n’avons que des variables numériques. C’est indispensable pour calculer notre matrice de corrélation. Cela implique que dans le cas où vous auriez des variables ordinales codées avec du texte il sera nécessaire de recoder les catégories avec des chiffres.
Avant de nous lancer dans le calcul de notre matrice, il nous faut déterminer quel test de corrélation nous allons choisir. Pour ce faire nous devons avant tout étudier la distribution de nos variables. Une première approche rapide consiste à représenter graphiquement la distribution de nos données. C’est une pratique courante en SHS mais attention aucune visualisation graphique ne vaudra jamais un test de normalité. Autant pour les variables ordinales qui ne suivraient pas de loi normale on peut les identifier clairement sur le graphe, il n’y a, en général, pas trop de doute. Mais si vous estimez qu’une variable suivrait une loi normale vous devez le vérifier à l’aide d’un test stat (Kilmogorov-Smirnoff, Shapiro…)
# La fonction plot_num du package {funModeling} permet de produire rapidement pour chacune de nos variables un hsitogramme
plot_num(mtcars)
D’après les sorties graphiques on voit que certaines variables pourraient suivre une loi normale (à vérifier statistiquement!!!), mais les histogrammes montrent également que certaines sont clairement des variables ordinales (catégorielles, c’est à dire avec des classes, par ex : cyl; vs ; am) et ne peuvent absolument pas être considérées comme suivant une loi normale. Ici pour l’exercice, nous utiliserons le coefficient de corrélation de Spearman d’autant qu’il se lit et s’interprète exactement comme le test de Pearson (pour des raisons plus objectives je vous invite à relire la partie Quels types de corrélations?).
C’est parti pour le calcul de corrélation ! Nous utilisons la fonction ‘correlation()’ du package {psycho}.
res_cor<- correlation(mtcars, method = "spearman", adjust = "holm")
#adjust permet de définir la correction à appliquer
#method de choisir le test de correlation à réaliser
Pour plus de simplicité on stocke le résultat dans un objet qui contient toutes les données produites par la fonction ‘correlation()’, qui sont nombreuses!
Pour visualiser notre matrice
summary(res_cor)
## mpg cyl disp hp drat wt qsec
## mpg
## cyl -0.91***
## disp -0.91*** 0.93***
## hp -0.89*** 0.9*** 0.85***
## drat 0.65** -0.68*** -0.68*** -0.52*
## wt -0.89*** 0.86*** 0.9*** 0.77*** -0.75***
## qsec 0.47 -0.57* -0.46 -0.67*** 0.09 -0.23
## vs 0.71*** -0.81*** -0.72*** -0.75*** 0.45 -0.59** 0.79***
## am 0.56* -0.52* -0.62** -0.36 0.69*** -0.74*** -0.2
## gear 0.54* -0.56* -0.59** -0.33 0.74*** -0.68*** -0.15
## carb -0.66** 0.58* 0.54* 0.73*** -0.13 0.5 -0.66**
## vs am gear
## mpg
## cyl
## disp
## hp
## drat
## wt
## qsec
## vs
## am 0.17
## gear 0.28 0.81***
## carb -0.63** -0.06 0.11
Les corrélations significatives sont marquées d’un *, plus les astérisques sont nombreux plus le niveau de significativité est important.
Vous pouvez aller chercher directement la matrice des coefficients ou celle des p-value, si vous souhaitez les visualiser.
# Pour obtenir la matrice des coefficients
res_cor$values$r
## mpg cyl disp hp drat wt
## mpg 1.0000000 -0.9108013 -0.9088824 -0.8946646 0.65145546 -0.8864220
## cyl -0.9108013 1.0000000 0.9276516 0.9017909 -0.67888119 0.8577282
## disp -0.9088824 0.9276516 1.0000000 0.8510426 -0.68359210 0.8977064
## hp -0.8946646 0.9017909 0.8510426 1.0000000 -0.52012499 0.7746767
## drat 0.6514555 -0.6788812 -0.6835921 -0.5201250 1.00000000 -0.7503904
## wt -0.8864220 0.8577282 0.8977064 0.7746767 -0.75039041 1.0000000
## qsec 0.4669358 -0.5723509 -0.4597818 -0.6666060 0.09186863 -0.2254012
## vs 0.7065968 -0.8137890 -0.7236643 -0.7515934 0.44745745 -0.5870162
## am 0.5620057 -0.5220712 -0.6240677 -0.3623276 0.68657079 -0.7377126
## gear 0.5427816 -0.5643105 -0.5944703 -0.3314016 0.74481617 -0.6761284
## carb -0.6574976 0.5800680 0.5397781 0.7333794 -0.12522294 0.4998120
## qsec vs am gear carb
## mpg 0.46693575 0.7065968 0.56200569 0.5427816 -0.65749764
## cyl -0.57235095 -0.8137890 -0.52207118 -0.5643105 0.58006798
## disp -0.45978176 -0.7236643 -0.62406767 -0.5944703 0.53977806
## hp -0.66660602 -0.7515934 -0.36232756 -0.3314016 0.73337937
## drat 0.09186863 0.4474575 0.68657079 0.7448162 -0.12522294
## wt -0.22540120 -0.5870162 -0.73771259 -0.6761284 0.49981205
## qsec 1.00000000 0.7915715 -0.20333211 -0.1481997 -0.65871814
## vs 0.79157148 1.0000000 0.16834512 0.2826617 -0.63369482
## am -0.20333211 0.1683451 1.00000000 0.8076880 -0.06436525
## gear -0.14819967 0.2826617 0.80768800 1.0000000 0.11488698
## carb -0.65871814 -0.6336948 -0.06436525 0.1148870 1.00000000
# Pour obtenir la matrice des p-value
res_cor$values$p
## mpg cyl disp hp drat
## mpg 0.000000e+00 2.532755e-11 3.376278e-11 2.542985e-10 1.506777e-03
## cyl 2.532755e-11 7.444136e-232 1.251493e-12 9.711965e-11 6.413028e-04
## disp 3.376278e-11 1.251493e-12 0.000000e+00 3.191929e-08 5.487206e-04
## hp 2.542985e-10 9.711965e-11 3.191929e-08 2.271770e-236 3.702679e-02
## drat 1.506777e-03 6.413028e-04 5.487206e-04 3.702679e-02 0.000000e+00
## wt 7.289215e-10 1.715595e-08 1.706644e-10 8.401321e-06 3.113210e-05
## qsec 9.878071e-02 1.363083e-02 1.054042e-01 9.626567e-04 1.000000e+00
## vs 2.228922e-04 6.826665e-07 1.059632e-04 2.992620e-05 1.228011e-01
## am 1.631398e-02 3.702679e-02 3.515229e-03 4.571344e-01 5.013804e-04
## gear 2.524494e-02 1.612424e-02 8.336938e-03 6.390322e-01 4.059721e-05
## carb 1.257895e-03 1.153828e-02 2.574377e-02 6.839419e-05 1.000000e+00
## wt qsec vs am gear
## mpg 7.289215e-10 9.878071e-02 2.228922e-04 1.631398e-02 2.524494e-02
## cyl 1.715595e-08 1.363083e-02 6.826665e-07 3.702679e-02 1.612424e-02
## disp 1.706644e-10 1.054042e-01 1.059632e-04 3.515229e-03 8.336938e-03
## hp 8.401321e-06 9.626567e-04 2.992620e-05 4.571344e-01 6.390322e-01
## drat 3.113210e-05 1.000000e+00 1.228011e-01 5.013804e-04 4.059721e-05
## wt 0.000000e+00 1.000000e+00 9.910642e-03 5.669258e-05 6.921078e-04
## qsec 1.000000e+00 0.000000e+00 3.018764e-06 1.000000e+00 1.000000e+00
## vs 9.910642e-03 3.018764e-06 7.444136e-232 1.000000e+00 1.000000e+00
## am 5.669258e-05 1.000000e+00 1.000000e+00 0.000000e+00 1.036828e-06
## gear 6.921078e-04 1.000000e+00 1.000000e+00 1.036828e-06 0.000000e+00
## carb 5.374594e-02 1.245090e-03 2.667282e-03 1.000000e+00 1.000000e+00
## carb
## mpg 1.257895e-03
## cyl 1.153828e-02
## disp 2.574377e-02
## hp 6.839419e-05
## drat 1.000000e+00
## wt 5.374594e-02
## qsec 1.245090e-03
## vs 2.667282e-03
## am 1.000000e+00
## gear 1.000000e+00
## carb 7.444136e-232
Si vous souhaitez récupérer l’ensemble des infos sous la forme d’une base de données, c’est-à-dire avec les données en colonnes, c’est aussi possible très simplement (si vous avez survécu jusque là). La base de données est stocké ici :
res_cor$plot$data
# Pour visualiser les 10 premières lignes
head(res_cor$plot$data)
## Var1 Var2 value pvalue signif coef abs_corr
## 2 hp carb 0.7333794 6.839419e-05 1 0.7333794 7.333794
## 3 wt carb 0.4998120 5.374594e-02 0 0.4998120 4.998120
## 4 cyl carb 0.5800680 1.153828e-02 1 0.5800680 5.800680
## 5 disp carb 0.5397781 2.574377e-02 1 0.5397781 5.397781
## 6 qsec carb -0.6587181 1.245090e-03 1 -0.6587181 6.587181
## 7 vs carb -0.6336948 2.667282e-03 1 -0.6336948 6.336948
Si vous souhaitez exporter ces données :
write.csv(res_cor$plot$data, "data_cor.csv", fileEncoding = "utf8")
Notre objet res_cor contient également une analyse deux à deux de nos variables que vous pouvez obtenir à l’aide de la ligne de commande suivante et qui vous simplifiera la tache dans votre lecture de la matrice et dans vos analyses, notamment utile si vous avez calculé un coefficient de Kendall qui se lit différemment des coefficients de Pearson et Spearman.
print(res_cor$text)
#Pour se faire une idée voici les 5 premières lignes des analyses stockées dans notre objet res_cor$text
head(res_cor$text)
## [1] "Spearman Full correlation (p value correction: holm):\n"
## [2] " - mpg / cyl: Results of the Spearman correlation showed a significant large, and negative association between mpg and cyl (r(30) = -0.91, p < .001***)."
## [3] " - mpg / disp: Results of the Spearman correlation showed a significant large, and negative association between mpg and disp (r(30) = -0.91, p < .001***)."
## [4] " - cyl / disp: Results of the Spearman correlation showed a significant large, and positive association between cyl and disp (r(30) = 0.93, p < .001***)."
## [5] " - mpg / hp: Results of the Spearman correlation showed a significant large, and negative association between mpg and hp (r(30) = -0.89, p < .001***)."
## [6] " - cyl / hp: Results of the Spearman correlation showed a significant large, and positive association between cyl and hp (r(30) = 0.90, p < .001***)."
Enfin, le package {psycho} offre également la possibilité de réaliser un corrélogramme venant représenter notre matrice de corrélation. Les ronds barrés étant les coefficients non significatifs.
plot(res_cor)
Et voilà maintenant vous pouvez réaliser toutes les corrélations que vous souhaitez !
A votre avis, y a-t-il un lien entre le taux de divorce dans l’état du Maine et la consommation de margarine? Ou entre le nombre de personnes qui meurent en tombant dans une piscine et le nombre de films dans lesquels apparait Nicolas Cage? (source : http://tylervigen.com/spurious-correlations)