Matrice de corrélation en R : calcul, visualisation et p-values

Toutes les corrélations par paires d’un coup — rstatix à la manière tidy, base R pour les classiques — en direct dans votre navigateur

Apprenez à calculer et visualiser une matrice de corrélation en R. Utilisez cor_mat() de rstatix pour une matrice tidy avec p-values, base R cor() + Hmisc rcorr() pour la voie classique, réorganisez en table longue, marquez les corrélations significatives, et tracez un corrélogramme avec corrplot — chaque exemple s’exécute en direct dans votre navigateur.

Date de publication

22 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Une matrice de corrélation affiche le coefficient de corrélation pour chaque paire de variables numériques dans un même tableau — le moyen rapide de repérer les relations dans un jeu de données entier.
  • Calculez-la avec cor_mat() de rstatix (tidy, transporte les p-values) ou base R cor() (coefficients seuls) + Hmisc::rcorr() pour les seuils de signification.
  • Transformez la matrice carrée en table longue (cor_gather()), ne gardez qu’un seul triangle, et marquez les corrélations significatives (cor_mark_significant()).
  • Visualisez-la sous forme de corrélogramme avec corrplot() — la couleur et la taille encodent la force et la direction, et les cellules non significatives peuvent être laissées vides.
  • Traduisez la prose seule entre les moteurs : cor(), cor_mat(), rcorr() et corrplot() décrivent tous la même matrice.

Introduction

Un test de corrélation répond à la relation entre deux variables. Une matrice de corrélation passe à l’échelle : elle calcule le coefficient pour chaque paire de variables numériques d’un coup, en renvoyant un tableau carré que vous pouvez parcourir ou tracer pour trouver les relations les plus fortes dans un jeu de données entier.

Cette leçon construit la matrice de deux façons — le workflow tidy rstatix cor_mat() (qui transporte les p-values avec lui) et le classique base R cor() + Hmisc::rcorr() — puis la transforme, la filtre et la visualise sous forme de corrélogramme. Nous utilisons six colonnes numériques du jeu de données intégré mtcars tout au long.

Les données

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
head(mydata, 3)
               mpg disp  hp drat    wt  qsec
Mazda RX4     21.0  160 110 3.90 2.620 16.46
Mazda RX4 Wag 21.0  160 110 3.90 2.875 17.02
Datsun 710    22.8  108  93 3.85 2.320 18.61

Calculer la matrice de corrélation

cor() comme cor_mat() utilisent par défaut la corrélation de Pearson. Pour les coefficients non paramétriques fondés sur les rangs — lorsque la relation est monotone mais non linéaire, ou que les données sont ordinales ou non normales — passez method = "spearman" ou method = "kendall" (cor(mydata, method = "spearman"), cor_mat(method = "spearman")). Le choix reflète celui du test de corrélation : Pearson pour le linéaire, Spearman/Kendall pour les rangs.

Avec rstatix (recommandé)

cor_mat() renvoie une matrice de corrélation tidy — un data frame que vous pouvez enchaîner par pipe, et qui se souvient des p-values pour les étapes ultérieures :

library(rstatix)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
cor.mat <- mydata %>% cor_mat()
cor.mat
# A tibble: 6 × 7
  rowname   mpg  disp    hp   drat    wt   qsec
* <chr>   <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl>
1 mpg      1    -0.85 -0.78  0.68  -0.87  0.42 
2 disp    -0.85  1     0.79 -0.71   0.89 -0.43 
3 hp      -0.78  0.79  1    -0.45   0.66 -0.71 
4 drat     0.68 -0.71 -0.45  1     -0.71  0.091
5 wt      -0.87  0.89  0.66 -0.71   1    -0.17 
6 qsec     0.42 -0.43 -0.71  0.091 -0.17  1    

Vous pouvez vous concentrer sur quelques variables (cor_mat(mpg, hp, wt)) ou en exclure certaines (cor_mat(-mpg, -hp)) — la même grammaire de sélection que dplyr::select().

Avec base R

Le cor() de base R ne donne que les coefficients (arrondissez-les pour la lisibilité). Utilisez use = "complete.obs" si vos données comportent des valeurs manquantes :

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res <- cor(mydata)
round(res, 2)
       mpg  disp    hp  drat    wt  qsec
mpg   1.00 -0.85 -0.78  0.68 -0.87  0.42
disp -0.85  1.00  0.79 -0.71  0.89 -0.43
hp   -0.78  0.79  1.00 -0.45  0.66 -0.71
drat  0.68 -0.71 -0.45  1.00 -0.71  0.09
wt   -0.87  0.89  0.66 -0.71  1.00 -0.17
qsec  0.42 -0.43 -0.71  0.09 -0.17  1.00

Les coefficients proches de +1 (p. ex. dispwt) évoluent ensemble ; proches de −1 (p. ex. mpgwt) évoluent en sens opposé ; proches de 0 sont sans relation.

Obtenir les p-values (signification)

cor() seul ne vous dira pas si une corrélation est significative. Deux voies :

library(rstatix)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]

# rstatix: pull the p-value matrix straight from the tidy correlation matrix
mydata %>% cor_mat() %>% cor_get_pval()
# A tibble: 6 × 7
  rowname      mpg     disp           hp      drat       wt       qsec
  <chr>      <dbl>    <dbl>        <dbl>     <dbl>    <dbl>      <dbl>
1 mpg     0        9.38e-10 0.000000179  1.78e-  5 1.29e-10 0.0171    
2 disp    9.38e-10 0        0.0000000714 5.28e-  6 1.22e-11 0.0131    
3 hp      1.79e- 7 7.14e- 8 0            9.99e-  3 4.15e- 5 0.00000577
4 drat    1.78e- 5 5.28e- 6 0.00999      7.44e-232 4.78e- 6 0.62      
5 wt      1.29e-10 1.22e-11 0.0000415    4.78e-  6 0        0.339     
6 qsec    1.71e- 2 1.31e- 2 0.00000577   6.2 e-  1 3.39e- 1 0         

Lisez-la comme la matrice des coefficients : chaque cellule est la p-value de la paire correspondante, et tout ce qui est inférieur à 0,05 signale une corrélation statistiquement significative au seuil de 5 %. La diagonale fait exception — une variable est parfaitement corrélée avec elle-même, donc sa significativité n’est pas définie.

La voie classique en base R est Hmisc::rcorr(), qui renvoie les coefficients ($r), les tailles d’échantillon ($n) et les p-values ($P) dans un même objet :

library(Hmisc)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res2 <- rcorr(as.matrix(mydata))
res2$P                       # the p-value matrix
              mpg         disp           hp         drat           wt
mpg            NA 9.380328e-10 1.787835e-07 1.776240e-05 1.293958e-10
disp 9.380328e-10           NA 7.142679e-08 5.282022e-06 1.222311e-11
hp   1.787835e-07 7.142679e-08           NA 9.988772e-03 4.145827e-05
drat 1.776240e-05 5.282022e-06 9.988772e-03           NA 4.784260e-06
wt   1.293958e-10 1.222311e-11 4.145827e-05 4.784260e-06           NA
qsec 1.708199e-02 1.314404e-02 5.766253e-06 6.195826e-01 3.388683e-01
             qsec
mpg  1.708199e-02
disp 1.314404e-02
hp   5.766253e-06
drat 6.195826e-01
wt   3.388683e-01
qsec           NA

rcorr() laisse la diagonale à NA (la corrélation d’une variable avec elle-même n’est pas testée) — c’est pourquoi, avant de passer la matrice des p-value à corrplot() ci-dessous, on fixe diag(p.mat) <- 0 pour que la diagonale soit considérée comme significative et ne soit pas effacée.

Transformer en table tidy

Une matrice carrée devient difficile à lire dès qu’elle grandit. cor_gather() la réduit à une table longue — une ligne par paire, avec le coefficient et la p-value côte à côte (c’est le remplaçant tidy des fonctions auxiliaires faites maison de style flattenCorrMatrix() que vous avez peut-être vues). Extrayez d’abord un seul triangle pour supprimer les doublons et les entrées de la diagonale :

library(rstatix)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
mydata %>%
  cor_mat() %>%
  pull_lower_triangle() %>%
  cor_gather()
   var1 var2    cor        p
1  disp  mpg -0.850 9.38e-10
2    hp  mpg -0.780 1.79e-07
3  drat  mpg  0.680 1.78e-05
4    wt  mpg -0.870 1.29e-10
5  qsec  mpg  0.420 1.71e-02
6    hp disp  0.790 7.14e-08
7  drat disp -0.710 5.28e-06
8    wt disp  0.890 1.22e-11
9  qsec disp -0.430 1.31e-02
10 drat   hp -0.450 9.99e-03
11   wt   hp  0.660 4.15e-05
12 qsec   hp -0.710 5.77e-06
13   wt drat -0.710 4.78e-06
14 qsec drat  0.091 6.20e-01
15 qsec   wt -0.170 3.39e-01

Marquer les corrélations significatives

cor_mark_significant() ajoute des étoiles de signification aux coefficients — le résumé prêt à publier en un seul appel :

library(rstatix)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
mydata %>%
  cor_mat() %>%
  cor_mark_significant()
  rowname       mpg      disp        hp      drat    wt qsec
1     mpg                                                   
2    disp -0.85****                                         
3      hp -0.78****  0.79****                               
4    drat  0.68**** -0.71****   -0.45**                     
5      wt -0.87****  0.89****  0.66**** -0.71****           
6    qsec     0.42*    -0.43* -0.71****     0.091 -0.17     

Les étoiles suivent la convention habituelle : * p<0.05, ** p<0.01, *** p<0.0001.

Visualiser la matrice de corrélation

Corrélogramme avec corrplot (recommandé)

Un corrélogramme transforme la matrice en image : la couleur et la taille encodent le coefficient. Réordonnez par regroupement pour que les variables apparentées soient côte à côte, et n’affichez que le triangle supérieur :

library(corrplot)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res <- cor(mydata)

corrplot(
  res, type = "upper", order = "hclust",
  tl.col = "black", tl.srt = 45,
  col = colorRampPalette(c("#b2182b", "white", "#3a86d4"))(200)
)

An upper-triangle correlogram of six mtcars variables drawn with corrplot, blue circles for positive and red for negative correlations, sized by the strength of the correlation.

Les corrélations positives sont bleues, les négatives rouges ; plus un cercle est grand et foncé, plus la relation est forte. Pour laisser vides les cellules non significatives, passez la matrice de p-value :

library(corrplot)
library(Hmisc)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res <- cor(mydata)
p.mat <- rcorr(as.matrix(mydata))$P      # p-value matrix (Hmisc)
diag(p.mat) <- 0                          # mark the diagonal significant (avoids NA)

corrplot(
  res, p.mat = p.mat, sig.level = 0.05, insig = "blank",
  diag = FALSE, tl.col = "black", tl.srt = 45,
  col = colorRampPalette(c("#b2182b", "white", "#3a86d4"))(200)
)

The same corrplot correlogram with correlations whose p-value exceeds 0.05 left blank, so only the statistically significant relationships are shown.

Matrice de nuages de points

La vue la plus dense en information associe chaque variable à toutes les autres. GGally::ggpairs() trace la distribution de chaque variable sur la diagonale, les nuages de points bivariés en dessous, et le coefficient de corrélation avec les étoiles de significativité au-dessus — toute la matrice en une seule image :

library(GGally)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
ggpairs(mydata) + theme_minimal()

A scatterplot matrix of the six mtcars variables drawn with GGally ggpairs: each variable's density on the diagonal, bivariate scatter plots below the diagonal, and the correlation coefficient with significance stars above the diagonal.

Les coefficients les plus grands (et le plus d’étoiles) au-dessus de la diagonale marquent les relations les plus fortes et les plus significatives, et le nuage de points en dessous permet de juger d’un coup d’œil la linéarité que Pearson suppose avant de vous fier au coefficient. psych::pairs.panels() et PerformanceAnalytics::chart.Correlation() tracent la même disposition distribution-sur-la-diagonale / nuage de points / coefficient en graphiques de base.

Autres vues rapides

rstatix::cor_plot() est un wrapper tidy autour de corrplot() qui prend directement un résultat cor_mat() — plus besoin de redescendre au cor() de base :

library(rstatix)

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
mydata %>% cor_mat() %>% cor_plot()

A correlogram of the six mtcars variables produced directly from a rstatix cor_mat() result with cor_plot().

Base R fournit aussi heatmap() pour une grille de couleurs regroupée :

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res <- cor(mydata)
col <- colorRampPalette(c("#b2182b", "white", "#3a86d4"))(20)
heatmap(res, col = col, symm = TRUE)

A clustered heatmap of the mtcars correlation matrix, red for negative and blue for positive correlations, with a dendrogram on the margins.

Et symnum() remplace les coefficients par des symboles pour une vue textuelle compacte :

mydata <- mtcars[, c("mpg", "disp", "hp", "drat", "wt", "qsec")]
res <- cor(mydata)
symnum(res, abbr.colnames = FALSE)
     mpg disp hp drat wt qsec
mpg  1                       
disp +   1                   
hp   ,   ,    1              
drat ,   ,    .  1           
wt   +   +    ,  ,    1      
qsec .   .    ,          1   
attr(,"legend")
[1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

La légende indique les seuils : un blanc pour |r|<0.3, . à B pour des corrélations progressivement plus fortes. Pour une personnalisation poussée du corrélogramme (ordonnancement, méthodes mixtes, gestion de la non-signification), voir la leçon dédiée au corrélogramme.

Essayez en direct

Construisez et tracez une matrice de corrélation sur un autre ensemble de colonnes de mtcars — ajoutez carb et gear, ou changez la palette. Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « construis une matrice de corrélation de mes colonnes numériques et montre-moi lesquelles sont significatives » — elle répond avec du code rstatix que vous pouvez exécuter sur vos propres données, puis vous aide à lire le corrélogramme. The runtime is the judge. Demander à Prova →

Problèmes courants

cor() provoque une erreur sur un data frame avec des colonnes texte. Une matrice de corrélation a besoin d’une entrée numérique — sélectionnez d’abord uniquement les colonnes numériques (mydata[, sapply(mydata, is.numeric)]) ou avec dplyr::select().

La matrice est remplie de NA. Les valeurs manquantes se propagent. Ajoutez use = "complete.obs" à cor() (suppression cas par cas) ou nettoyez les données avant le calcul.

corrplot ne peut pas laisser vides les cellules non significatives. corrplot() a besoin d’une matrice de p-value via p.mat = ; cor() n’en produit pas — obtenez-la avec ggpubr::cor_pmat(), rstatix::cor_mat() |> cor_get_pval(), ou Hmisc::rcorr()$P.

Questions fréquentes

Utilisez cor() de base R pour les coefficients — cor(mydata) sur un data frame numérique — ou mydata %>% cor_mat() de rstatix pour une matrice tidy qui transporte aussi les p-values. Arrondissez la sortie de base R avec round(cor(mydata), 2) pour la lisibilité.

cor() de base ne renvoie que les coefficients. Utilisez Hmisc::rcorr(as.matrix(mydata)) (son élément $P est la matrice de p-value), ggpubr::cor_pmat(mydata), ou rstatix cor_mat() %>% cor_get_pval(). Pour combiner coefficients et signification dans un même tableau, utilisez rstatix::cor_mark_significant().

Un corrélogramme est une représentation graphique d’une matrice de corrélation où la couleur — et, avec corrplot, la taille des cercles — encode la corrélation de chaque paire, ce qui permet de repérer les relations les plus fortes et les plus significatives d’un coup d’œil au lieu de lire un tableau de chiffres. corrplot::corrplot() est l’outil standard ; rstatix::cor_plot() est un wrapper tidy qui en trace un directement à partir d’un résultat de cor_mat().

La façon la plus populaire est un corrélogramme avec corrplot::corrplot(cor(mydata), type = "upper") — la couleur et la taille des cercles encodent les corrélations. Les autres options sont rstatix::cor_plot() (un wrapper tidy), heatmap() de base, et symnum() pour une vue symbolique compacte.

Un test de corrélation évalue la relation entre deux variables précises (coefficient + p-value + intervalle de confiance). Une matrice de corrélation calcule le coefficient pour chaque paire de variables numériques d’un coup, donnant un tableau carré que vous parcourez ou tracez pour comparer de nombreuses relations.

Ajoutez l’argument method : cor(mydata, method = "spearman") en base R, ou mydata %>% cor_mat(method = "spearman") avec rstatix (utilisez "kendall" pour le tau de Kendall). Spearman et Kendall travaillent sur les rangs, ils capturent donc les relations monotones et sont robustes aux données non normales ou ordinales — le même choix paramétrique-vs-rangs que pour le test de corrélation à deux variables.

Passez order = "hclust" à corrplot() pour réordonner les variables par classification hiérarchique, afin que les variables fortement apparentées soient côte à côte. Pour la forme tabulaire, rstatix::cor_reorder() réordonne un résultat cor_mat() de la même manière.

Testez vos connaissances

  1. Exécutez-le. Dans la cellule en direct, calculez une matrice de corrélation de mpg, wt, hp et qsec, puis marquez les corrélations significatives. Quelle paire est la plus forte ?
  2. Conceptuel. Votre corrélogramme affiche un cercle bleu intense entre deux variables, mais en laissant vide selon sig.level = 0.05 cette cellule reste vide. Comment un coefficient élevé peut-il être non significatif ?

Remplissez les quatre blancs avec mpg, wt, hp, qsec. La corrélation la plus forte a le coefficient le plus proche de ±1 et le plus d’étoiles. Pour la question 2, pensez à la taille d’échantillon — la signification dépend à la fois du coefficient et du nombre d’observations dont vous disposez.

library(rstatix)
mtcars %>%
  select(mpg, wt, hp, qsec) %>%
  cor_mat() %>%
  cor_mark_significant()
#> mpg–wt is the strongest (r ≈ -0.87, ***).

Pour la question 2 : la signification dépend de la taille d’échantillon, pas seulement du coefficient. Avec peu d’observations, même un r élevé peut avoir une p-value supérieure à 0.05 (l’intervalle de confiance est large), de sorte que corrplot le laisse vide. Collectez plus de données, ou rapportez le coefficient avec son intervalle plutôt que de vous fier à la seule étoile.

Conclusion

Vous savez désormais calculer une matrice de corrélation en R à la façon tidy de rstatix (cor_mat(), avec p-values, transformation et marques de signification) et à la façon classique de base (cor() + Hmisc::rcorr()), puis la transformer en corrélogramme avec corrplot() qui met en évidence les relations les plus fortes et significatives.

Cela boucle la boucle sur le test de corrélation : testez une paire, puis parcourez-les toutes. Ensuite, revisitez l’hypothèse derrière Pearson dans la leçon sur le test de normalité.

Leçons connexes

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Corrélation en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Chaque résultat de cette page a été produit par le code montré, exécuté au moment du build contre un environnement R figé — modifiez n’importe quel bloc et faites Run pour le reproduire vous-même.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Matrice de corrélation en R : calcul, visualisation et
    p-values},
  date = {2026-06-22},
  url = {https://www.datanovia.com/learn/biostatistics/correlation/correlation-matrix-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Matrice de corrélation en R : calcul, visualisation et p-values.” 2026. June 22. https://www.datanovia.com/learn/biostatistics/correlation/correlation-matrix-in-r.