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