Calcul des corrélation deux à deux (corrélation par paires ou pairwise correlations )

on utlise la corrélation si on tout non données sont variables quantitaives. Nous voulons voir le lien qui existe entre les variables de notre base deux à deux. On s’intéresse aussi à ces corrélations deux à deux (ou par paires) lorsqu’on souhaiteconstruire un modèle prédictif, car de nombreux algorithmes de Machine Learningsont plus performants lorsque les prédicteurs ne sont pas fortement corrélés.

Nous vous présenterons les principales fonctions qu’on utilisent lorsqu’on peuvent étudier les corrélations deux à deux. Pour les illustrer, nous utiliserons le jeu de données mtcars qui appartient au package datasets (chargé par défaut) en lui retirant les variables am et vs qui sont des variables catégorielles.

`

# importation de la base 
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.1.8
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
mtcars2 <- mtcars %>%
select(-vs, -am)
head(mtcars2)
##                    mpg cyl disp  hp drat    wt  qsec gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22    3    1

Obtenir la matrice de corrélation deux à deux : fonction cor()

Une façon toute simple d‘obtenir les coefficients de corrélation de Pearson pour toutesles paires de variables, est d’utiliser la fonction cor() du package stats, chargé par défaut.

cor(mtcars2)
##             mpg        cyl       disp         hp        drat         wt
## mpg   1.0000000 -0.8521620 -0.8475514 -0.7761684  0.68117191 -0.8676594
## cyl  -0.8521620  1.0000000  0.9020329  0.8324475 -0.69993811  0.7824958
## disp -0.8475514  0.9020329  1.0000000  0.7909486 -0.71021393  0.8879799
## hp   -0.7761684  0.8324475  0.7909486  1.0000000 -0.44875912  0.6587479
## drat  0.6811719 -0.6999381 -0.7102139 -0.4487591  1.00000000 -0.7124406
## wt   -0.8676594  0.7824958  0.8879799  0.6587479 -0.71244065  1.0000000
## qsec  0.4186840 -0.5912421 -0.4336979 -0.7082234  0.09120476 -0.1747159
## gear  0.4802848 -0.4926866 -0.5555692 -0.1257043  0.69961013 -0.5832870
## carb -0.5509251  0.5269883  0.3949769  0.7498125 -0.09078980  0.4276059
##             qsec       gear       carb
## mpg   0.41868403  0.4802848 -0.5509251
## cyl  -0.59124207 -0.4926866  0.5269883
## disp -0.43369788 -0.5555692  0.3949769
## hp   -0.70822339 -0.1257043  0.7498125
## drat  0.09120476  0.6996101 -0.0907898
## wt   -0.17471588 -0.5832870  0.4276059
## qsec  1.00000000 -0.2126822 -0.6562492
## gear -0.21268223  1.0000000  0.2740728
## carb -0.65624923  0.2740728  1.0000000

Mais comme vous pouvez le voir, la matrice de corrélation deux à deux obtenue n’est pas très facile à interpréter.

Utilisation du package corrplot

Pour obtenir des représentations plus synthétiques et plus visuelles, j’utilise la fonction corrplot(), du package corrplot.

library(corrplot)
## corrplot 0.92 loaded
M <- cor(mtcars2)
corrplot(M, method = "number", type="upper")

Pour améliorer encore la visualisation, on peut aussi colorier la case en fonction du coefficient de corrélation.

col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
corrplot(M, method="color", col=col(200),
             type="upper",
             addCoef.col = "black")

On peut encore obtenir une permutation des lignes et des colonnes avec l’argument order=”hclust” afinn peut encore obtenir une permutation des lignes et des colonnes avec l’argument.

corrplot(M, method="color", col=col(200) ,
             type="upper",
             addCoef.col = "black", order="hclust")

Il est également possible de passer en blanc les cases correspondant à des corrélations non significatives. Pour cela, on utilise dans un premier temps la fonction cor.mtest(), qu’il faut copier coller dans la console.

cor.mtest <- function(mat, ...) {
        mat <- as.matrix(mat)
        n <- ncol(mat)
        p.mat<- matrix(NA, n, n)
        diag(p.mat) <- 0
        for (i in 1:(n - 1)) {
            for (j in (i + 1):n) {
                tmp <- cor.test(mat[, i], mat[, j], ...)
                p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
            }
        }
colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
      p.mat
    }

Appliquée sur le jeu de données, cette fonction produit en sortie, non plus une matrice de corrélation deux à deux, mais une matrice de p-values de tests d’égalité à 0 des coefficient de personne

p.mat <- cor.mtest(mtcars2)
p.mat
##               mpg          cyl         disp           hp         drat
## mpg  0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
## cyl  6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09 8.244636e-06
## disp 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08 5.282022e-06
## hp   1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00 9.988772e-03
## drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e+00
## wt   1.293959e-10 1.217567e-07 1.222320e-11 4.145827e-05 4.784260e-06
## qsec 1.708199e-02 3.660533e-04 1.314404e-02 5.766253e-06 6.195826e-01
## gear 5.400948e-03 4.173297e-03 9.635921e-04 4.930119e-01 8.360110e-06
## carb 1.084446e-03 1.942340e-03 2.526789e-02 7.827810e-07 6.211834e-01
##                wt         qsec         gear         carb
## mpg  1.293959e-10 1.708199e-02 5.400948e-03 1.084446e-03
## cyl  1.217567e-07 3.660533e-04 4.173297e-03 1.942340e-03
## disp 1.222320e-11 1.314404e-02 9.635921e-04 2.526789e-02
## hp   4.145827e-05 5.766253e-06 4.930119e-01 7.827810e-07
## drat 4.784260e-06 6.195826e-01 8.360110e-06 6.211834e-01
## wt   0.000000e+00 3.388683e-01 4.586601e-04 1.463861e-02
## qsec 3.388683e-01 0.000000e+00 2.425344e-01 4.536949e-05
## gear 4.586601e-04 2.425344e-01 0.000000e+00 1.290291e-01
## carb 1.463861e-02 4.536949e-05 1.290291e-01 0.000000e+00

Cette matrice est ensuite utilisée en argument de p.mat. Le seuil de significativité

corrplot(M, method="color", col=col(200),  
             type="upper", order="hclust",
             addCoef.col = "black", # Ajout du coefficient de corrélation
             tl.col="black", tl.srt=45, #Rotation des etiquettes de textes
             # Combiner avec le niveau de significativité
             p.mat = p.mat, sig.level = 0.05, insig = "blank",
             # Cacher les coefficients de corrélation sur la diagonale
             diag=FALSE
             )