C’est quoi une corrélation ?

Pour la dernière fois : ce n’est pas une régression !!!

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 :

  1. associées positivement (coeff de corrélation > 0) : plus les investissements dans la recherche augmentent, plus le nombre de suicides par strangulation augmente;
  2. associées négativement (coeff de corrélation < 0 ) : plus les investissements dans la recherche augmentent, plus le nombre de suicides par strangulation diminue;
  3. non associées (coeff de corrélation = 0 ou proche de 0) : le niveau d’investissement dans la recherche n’a aucune influence sur le nombre de suicides par strangulation.

(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.

Hypothèse nulle, ça sert toujours !

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.

Quels types de corrélations?

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)

On peut revenir un peu sur l’interprétation ?

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 :

  • Le sens de la relation : Un coefficient de 1 indique une corrélation positive parfaite entre les deux variables. À l’inverse, un coefficient de - 1 indique une corrélation négative parfaite : lorsque la variable x augmente, la variable y diminue dans la même proportion. Un coefficient de 0 indique qu’il n’y a aucune relation entre les deux variables. Ainsi, la variation de l’une n’est aucunement associée à la variation de l’autre.
  • La force de la relation : Plus la valeur du coefficient est proche de + 1 ou de - 1, plus les deux variables sont associées fortement. Au contraire, plus le coefficient est près de 0, moins les variables partagent de covariance et donc, moins l’association est forte. Par convention, dans certaines disciplines des SHS on utilise ces bornes pour juger de la force d’une corrélation (Cohen, 1988) :
    • Autour de 0.10 : effet de petite taille (corrélation faible),
    • Autour de 0.30 : effet de taille moyenne (corrélation moyenne),
    • Plus de 0.50 : effet de grande taille (corrélation forte).

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.

Come get some correlation !

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)