Visualiser une matrice de corrélation sous forme de réseau de variables reliées
Data Visualization
Apprenez à tracer un graphe de réseau de corrélation en R avec le paquet corrr — calculez une matrice de corrélation, puis affichez-la comme un réseau où les variables sont des nœuds et les fortes corrélations des arêtes pondérées. Une alternative claire à la heatmap de corrélation.
Transformer une matrice de corrélation en graphe de réseau avec le paquet corrr — les nœuds sont les variables, les arêtes sont les corrélations.
Lire le graphique d’un coup d’œil : arêtes azur = positif, rouge = négatif, plus large/plus foncé = plus fort, et les nœuds regroupés = variables corrélées.
Maîtriser l’encombrement avec min_cor, recolorer les arêtes aux couleurs de votre marque, et vous concentrer sur une seule variable avec focus().
Chaque graphique est produit à partir de vrai code R copiable — vous n’avez besoin que de corrr.
Une heatmap de corrélation répond à la question « quelle est la force de chaque paire ? », une case à la fois. Un graphe de réseau de corrélation répond à une question différente, plus structurelle : « quelles variables évoluent ensemble en groupe ? » Il dispose vos variables sous forme de points et trace une arête pondérée pour chaque corrélation, si bien que les regroupements de variables apparentées se rassemblent littéralement sur la page. C’est le moyen le plus rapide de voir la structure en blocs d’une matrice de corrélation.
Le paquet corrr en fait une opération en deux temps : correlate() pour obtenir un data frame de corrélation bien rangé, puis network_plot() pour le tracer. Nous utiliserons le jeu de données intégré mtcars (32 voitures, 11 mesures numériques) — ses corrélations fortes et bien connues entre moteur et poids en font un réseau exceptionnellement lisible.
Des données à une matrice de corrélation avec correlate()
corrr est l’interface tidy de stats::cor(). Chargez-le et appelez correlate() sur n’importe quel data frame numérique — il renvoie un data frame de corrélation (un tibble avec une colonne term et une colonne par variable), c’est-à-dire ce qu’attend tout autre verbe de corrr.
library(corrr)res_cor <-correlate(mtcars)res_cor
# A tibble: 11 × 12
term mpg cyl disp hp drat wt qsec vs am
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 mpg NA -0.852 -0.848 -0.776 0.681 -0.868 0.419 0.664 0.600
2 cyl -0.852 NA 0.902 0.832 -0.700 0.782 -0.591 -0.811 -0.523
3 disp -0.848 0.902 NA 0.791 -0.710 0.888 -0.434 -0.710 -0.591
4 hp -0.776 0.832 0.791 NA -0.449 0.659 -0.708 -0.723 -0.243
5 drat 0.681 -0.700 -0.710 -0.449 NA -0.712 0.0912 0.440 0.713
6 wt -0.868 0.782 0.888 0.659 -0.712 NA -0.175 -0.555 -0.692
7 qsec 0.419 -0.591 -0.434 -0.708 0.0912 -0.175 NA 0.745 -0.230
8 vs 0.664 -0.811 -0.710 -0.723 0.440 -0.555 0.745 NA 0.168
9 am 0.600 -0.523 -0.591 -0.243 0.713 -0.692 -0.230 0.168 NA
10 gear 0.480 -0.493 -0.556 -0.126 0.700 -0.583 -0.213 0.206 0.794
11 carb -0.551 0.527 0.395 0.750 -0.0908 0.428 -0.656 -0.570 0.0575
# ℹ 2 more variables: gear <dbl>, carb <dbl>
Deux choses à remarquer. La diagonale est vide (NA) — la corrélation d’une variable avec elle-même vaut toujours 1 et n’apporte aucune information, donc corrr la supprime. Et les valeurs manquantes sont gérées pour vous : correlate() utilise par défaut use = "pairwise.complete.obs", si bien que les colonnes contenant des NA contribuent tout de même par chaque paire complète.
Pour un affichage rapide et lisible, passez le résultat dans fashion() — il arrondit, supprime les zéros de tête et aligne les colonnes :
Vous pouvez déjà lire l’histoire dans les chiffres : mpg est fortement négatif avec wt, cyl, disp et hp (les voitures plus lourdes, à plus gros moteur, consomment plus de carburant), tandis que wt, disp et cyl sont fortement positifs entre eux. Le graphe de réseau n’est qu’une façon de voir ce bloc d’un coup d’œil plutôt que de parcourir une grille.
Tracer le réseau de corrélation avec network_plot()
network_plot() prend le data frame de corrélation et en calcule l’agencement. Chaque nœud est une variable ; chaque arête est une corrélation entre les deux variables qu’elle relie. Les positions des nœuds proviennent d’un positionnement multidimensionnel (MDS) des corrélations absolues, de sorte que les variables fortement corrélées (positivement ou négativement) sont rapprochées.
L’unique option que vous solliciterez est min_cor — la corrélation absolue minimale requise pour qu’une arête soit tracée. Commencez à 0.3 pour ne conserver que les liens significatifs :
res_cor |>network_plot(min_cor =0.3)
Voici comment le lire :
La couleur de l’arête = le signe. Les arêtes bleues sont des corrélations positives, les rouges des négatives — la même convention que la plupart des heatmaps de corrélation.
La largeur et l’opacité de l’arête = la force. Les tracés plus larges et plus opaques sont des corrélations plus fortes ; les tracés fins et pâles sont faibles.
La proximité des nœuds = un comportement partagé.wt, disp, cyl et hp se rassemblent d’un côté — le bloc « gros moteur lourd et gourmand ». mpg se situe du côté opposé, relié à ce bloc par de fortes arêtes rouges (négatives), car la consommation de carburant baisse à mesure que ces variables augmentent. Son lien le plus fort est avec le poids (wt, r = -0.87).
Cette seule image encode ce qui exigerait une lecture attentive de toute la matrice.
Maîtriser l’encombrement avec min_cor
À min_cor = 0.3, presque chaque paire franchit la barre, si bien que le graphe est chargé. Relevez le seuil pour ne conserver que les relations les plus fortes et laisser respirer la structure :
res_cor |>network_plot(min_cor =0.7)
Désormais, seules survivent les corrélations d’au moins 0.7 en valeur absolue, et la structure centrale est sans équivoque : le regroupement wt–disp–cyl–hp (avec la paire la plus forte de la matrice, cyl–disp à r = 0.90) domine, mpg s’y accroche par de fortes arêtes négatives, et les variables de transmission am, gear et drat forment leur propre groupe faiblement relié. Régler min_cor est le principal levier pour arbitrer entre exhaustivité et lisibilité.
Recolorer les arêtes aux couleurs de votre marque
network_plot() expose un argument colours : un gradient à trois couleurs c(negative, midpoint, positive). Remplacez-le par l’azur Datanovia pour les liens positifs et un rouge net pour les négatifs, afin que la figure s’accorde au reste de votre rapport :
L’agencement est identique — seule la palette change. Le gradient va du rouge à −1 au blanc à 0 puis à l’azur à +1, si bien qu’un lien positif d’intensité moyenne s’affiche en bleu doux et un lien fort en azur saturé.
Se concentrer sur une seule variable avec focus()
Lorsque vous vous intéressez à une seule réponse — par exemple, ce qui détermine la consommation de carburant — n’examinez pas le réseau entier à l’œil nu. Utilisez focus() de corrr pour ne conserver que les corrélations de cette variable :
res_cor |>focus(mpg) |>fashion()
term mpg
1 cyl -.85
2 disp -.85
3 hp -.78
4 drat .68
5 wt -.87
6 qsec .42
7 vs .66
8 am .60
9 gear .48
10 carb -.55
La sortie classe mpg par rapport à chaque autre variable dans une seule colonne : le poids (wt, -0.87), le nombre de cylindres (cyl, -0.85) et la cylindrée (disp, -0.85) sont les plus déterminants, tous négatifs. C’est le pendant tabulaire du réseau — le graphe vous montre le voisinage, focus() vous donne les chiffres exacts pour un nœud.
Graphe de réseau ou heatmap de corrélation ?
Les deux sont complémentaires, non rivaux — choisissez selon la question :
Le graphe de réseau (cet article) — idéal pour la structure : quelles variables se regroupent, et la forme globale de la matrice. Il passe à l’échelle de nombreuses variables sans devenir un mur de cases.
La heatmap de corrélation / le corrélogramme — idéal pour la consultation : lire la force exacte d’une paire donnée. Pour une heatmap en qualité publication, tournez-vous vers ggcorrplot (réordonner, croix de significativité, triangle inférieur/supérieur) — voyez la leçon pas à pas ggcorrplot en R, ou la leçon Corrélogramme en R pour la même figure avec le paquet corrplot. Pour construire et interpréter la matrice sous-jacente, voyez Matrice de corrélation en R.
En pratique, utilisez le réseau pour repérer les blocs intéressants, puis la heatmap (ou focus()) pour en lire les chiffres.
Foire aux questions
NoteQue fait min_cor dans network_plot() ?
min_cor est la corrélation absolue minimale requise pour qu’une arête soit tracée. À min_cor = 0.3, toute paire avec |r| ≥ 0.3 obtient une arête ; relevez-le vers 0.7–0.8 pour ne conserver que les liens les plus forts et désencombrer le graphe. Il ne filtre que les arêtes — chaque variable apparaît toujours comme un nœud.
NoteQue signifient les couleurs et les largeurs des arêtes ?
La couleur encode le signe de la corrélation (bleu/azur pour positif, rouge pour négatif) et la largeur ainsi que l’opacité en encodent la force — plus large et plus opaque signifie plus fort. Vous pouvez modifier le gradient avec l’argument colours, un vecteur de trois couleurs c(negative, midpoint, positive).
NoteComment correlate() gère-t-il les valeurs manquantes ?
Par défaut, correlate() utilise use = "pairwise.complete.obs", si bien que chaque paire complète d’observations contribue même lorsque d’autres cases de ces lignes valent NA — inutile de supprimer des lignes au préalable. Passez un use = différent (par exemple "complete.obs") ou method = "spearman" si votre analyse l’exige.
NotePourquoi la diagonale de la matrice de corrélation est-elle vide ?
corrr fixe délibérément à NA la corrélation de chaque variable avec elle-même (toujours égale à 1), afin que la diagonale ne domine pas les résumés, les tris ou les graphiques. C’est pourquoi network_plot() ne trace jamais de boucle sur soi-même et pourquoi fashion() affiche une diagonale vide.
NoteFaut-il utiliser un réseau de corrélation ou une heatmap ?
Utilisez un graphe de réseau pour voir la structure — quelles variables se regroupent — surtout avec de nombreuses variables. Utilisez une heatmap/un corrélogramme (par exemple ggcorrplot) pour consulter la force exacte d’une paire précise. Ils répondent à des questions différentes, si bien que de nombreuses analyses utilisent les deux.
Pour aller plus loin dans /learn
Cet article est la recette ciblée. Pour les leçons complètes, sous contrôle de reproductibilité, sur l’analyse de corrélation et la boîte à outils graphique derrière ces figures, voyez :
@online{kassambara2026,
author = {Kassambara, Alboukadel},
title = {Graphe de réseau de corrélation en R avec corrr},
date = {2026-07-08},
url = {https://www.datanovia.com/blog/correlation-network-in-r},
langid = {fr}
}