Comparer des dendrogrammes en R : tanglegrammes, corrélation
Deux méthodes de liaison donnent deux arbres différents — alignez-les avec un tanglegramme, mesurez leur accord avec la corrélation cophénétique et de Baker, et décidez à quel regroupement vous fier
Comparez deux arbres de classification hiérarchique en R avec le package dendextend. Tracez un tanglegramme pour aligner deux dendrogrammes côte à côte et repérer leurs désaccords, lisez le score d’enchevêtrement, puis quantifiez leur similarité avec la corrélation cophénétique et de Baker. Inclut la comparaison simultanée de plusieurs méthodes de liaison à l’aide d’une matrice de corrélation et d’un corrplot.
Date de publication
24 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
L’arbre de regroupement que vous obtenez dépend de la méthode de liaison — les méthodes average et Ward peuvent regrouper différemment les mêmes observations. Avant de vous fier à un dendrogramme, comparez-le à une alternative.
Un tanglegramme trace deux dendrogrammes face à face et relie par une ligne chaque paire d’étiquettes correspondantes — plus les lignes sont nettes, plus les deux arbres s’accordent.
L’enchevêtrement est un nombre unique (de 0 à 1) qui résume à quel point ces lignes sont entremêlées : plus c’est bas, mieux c’est (0 = parfaitement aligné).
Un tanglegramme est visuel et peut induire en erreur — appuyez-le sur un nombre. cor.dendlist() donne la corrélation cophénétique ou de Baker entre les arbres (de −1 à 1 ; proche de 1 = très similaires).
Vous pouvez comparer plusieurs arbres à la fois : construisez un dendlist, obtenez la matrice de corrélation complète et lisez-la sur un corrplot.
Vous avez exécuté une classification hiérarchique, obtenu un dendrogramme et regroupé vos données. Puis un relecteur pose la question évidente : une autre méthode de liaison aurait-elle donné des regroupements différents ? C’est souvent le cas — la liaison average et la méthode de Ward peuvent placer les mêmes observations dans des branches différentes. Donc avant de bâtir un récit sur un seul arbre, vous devriez comparer deux arbres et voir à quel point ils s’accordent réellement.
Cette leçon présente les deux outils que le package dendextend vous offre pour cela :
tanglegram() — une comparaison visuelle, côte à côte, de deux dendrogrammes.
cor.dendlist() — une matrice de corrélation qui transforme « à quel point ces arbres sont-ils similaires ? » en un nombre.
Tout ce qui suit relève du R de base plus dendextend. Nous utilisons les données intégrées USArrests pour que vous puissiez exécuter chaque bloc tel quel.
Les données
Nous utiliserons les données intégrées de R USArrests (nombre d’arrestations pour 100 000 habitants pour Murder, Assault et Rape, plus le pourcentage UrbanPop, pour chaque État américain). Les différentes variables sont sur des échelles très différentes, nous les standardisons donc d’abord avec scale() — exactement comme vous le feriez avant tout regroupement fondé sur les distances.
Un tanglegramme à 50 États serait un mur de lignes illisible. Pour garder les graphiques lisibles, nous prenons un petit sous-ensemble aléatoire de 10 États avec sample(). Le set.seed(123) rend ce sous-ensemble reproductible, de sorte que vos arbres correspondent à ceux ci-dessous.
# Standardize all four variablesdf <-scale(USArrests)# Keep a readable random subset of 10 statesset.seed(123)ss <-sample(1:50, 10)df <- df[ss, ]head(df, 3)
Pour avoir quelque chose à comparer, nous regroupons les mêmes données deux fois avec deux méthodes de liaison différentes — "average" et "ward.D2" — et convertissons chaque résultat de hclust() en dendrogramme avec as.dendrogram(). dendlist() réunit ensuite les deux dendrogrammes dans un seul objet liste que les fonctions de comparaison comprennent.
library(dendextend)# One distance matrix, reused for both treesres.dist <-dist(df, method ="euclidean")# Two hierarchical clusterings with different linkagehc1 <-hclust(res.dist, method ="average")hc2 <-hclust(res.dist, method ="ward.D2")# Turn each into a dendrogramdend1 <-as.dendrogram(hc1)dend2 <-as.dendrogram(hc2)# Hold both in a dendlistdend_list <-dendlist(dend1, dend2)dend_list
[[1]]
'dendrogram' with 2 branches and 10 members total, at height 2.912926
[[2]]
'dendrogram' with 2 branches and 10 members total, at height 5.908419
attr(,"class")
[1] "dendlist"
Les comparer visuellement : le tanglegramme
Un tanglegramme trace les deux dendrogrammes face à face et relie chaque étiquette de gauche à la même étiquette de droite. Les fonctions concernées, toutes issues de dendextend :
untangle() — fait pivoter heuristiquement les branches pour trouver l’agencement avec le moins de lignes croisées (nous utilisons method = "step1side").
tanglegram() — trace les deux arbres alignés avec les lignes de liaison.
entanglement() — note la qualité de l’alignement sur une échelle de 0 à 1, où 1 correspond à un enchevêtrement total et 0 à un alignement parfait, sans croisement. Plus c’est bas, mieux c’est.
Lisez le résultat ainsi : des lignes de liaison droites et horizontales signifient que les deux arbres placent cet État de la même façon ; les lignes croisées marquent les États sur lesquels les deux méthodes sont en désaccord ; et les branches en pointillés sont des sous-arbres qui existent dans un arbre mais pas dans l’autre.
# Align the two trees, then draw them side by sidedendlist(dend1, dend2) %>%untangle(method ="step1side") %>%# find the best-aligned layouttanglegram() # draw the two dendrograms
Mettez maintenant un nombre sur la qualité de leur alignement :
# Alignment quality: lower = better (0 is perfect, 1 is fully tangled)dendlist(dend1, dend2) %>%untangle(method ="step1side") %>%entanglement()
[1] 0
L’enchevêtrement est ici de 0 — ces deux arbres s’alignent parfaitement, sans aucune ligne croisée, donc pour ce sous-ensemble le choix entre la liaison average et celle de Ward ne change quasiment pas le regroupement.
AstucePersonnaliser le tanglegramme
tanglegram() accepte de nombreuses options de style. Quelques-unes bien utiles : désactiver la mise en évidence en pointillés des « branches uniques », supprimer les couleurs par ligne, ou colorer les sous-arbres communs pour faire ressortir la structure partagée.
dendlist(dend1, dend2) %>%untangle(method ="step1side") %>%tanglegram(highlight_distinct_edges =FALSE, # turn off dashed linescommon_subtrees_color_lines =FALSE, # turn off line colourscommon_subtrees_color_branches =TRUE# colour the shared branches )
Avertissement
Un tanglegramme peut flatter deux arbres. Obtenir des lignes de liaison horizontales ne prouve pas que les arbres sont identiques, ni même topologiquement similaires — untangle() est autorisé à faire pivoter les branches pour réduire les croisements. Confirmez toujours une impression visuelle par une corrélation, que nous calculons ensuite.
Mesurer l’accord : corrélation des dendrogrammes
cor.dendlist() calcule une matrice de corrélation entre les arbres d’un dendlist. Elle prend en charge deux mesures, allant toutes deux de −1 à 1, où des valeurs proches de 0 signifient que les arbres ne sont pas statistiquement similaires et des valeurs proches de 1 qu’ils s’accordent fortement :
Corrélation cophénétique — corrèle les distances cophénétiques (la hauteur à laquelle chaque paire d’observations se retrouve pour la première fois dans la même branche). C’est la mesure classique.
Gamma de Baker — une mesure fondée sur les rangs, construite à partir des mêmes hauteurs de fusion ; moins sensible aux distances exactes, davantage à l’ordre dans lequel les observations fusionnent.
L’entrée hors diagonale est le nombre qui vous intéresse — ici environ 0.99 pour les deux mesures. Toutes deux sont très proches de 1, ce qui confirme le tanglegramme : les arbres average et Ward sont presque identiques.
Pour seulement deux arbres, vous pouvez vous passer de la matrice et obtenir directement le coefficient unique :
La matrice prend toute sa valeur lorsque vous comparez plus de deux arbres. Construisez un arbre par méthode de liaison, donnez un nom à chacun dans dendlist(), et cor.dendlist() renvoie la matrice complète des paires. Un corrplot fait alors ressortir d’un coup d’œil les accords (et les désaccords).
# Four trees on the same data, different linkage methodsres.dist <-dist(df, method ="euclidean")dend1 <-as.dendrogram(hclust(res.dist, method ="complete"))dend2 <-as.dendrogram(hclust(res.dist, method ="single"))dend3 <-as.dendrogram(hclust(res.dist, method ="average"))dend4 <-as.dendrogram(hclust(res.dist, method ="centroid"))# Name them so the matrix is readabledend_list <-dendlist("Complete"= dend1, "Single"= dend2,"Average"= dend3, "Centroid"= dend4)# Full pairwise (cophenetic) correlation matrixcors <-cor.dendlist(dend_list)round(cors, 2)
Complete Single Average Centroid
Complete 1.00 0.46 0.45 0.30
Single 0.46 1.00 0.23 0.17
Average 0.45 0.23 1.00 0.31
Centroid 0.30 0.17 0.31 1.00
library(corrplot)corrplot(cors, "pie", "lower")
Lisez le graphique : sur ce petit sous-ensemble, aucune paire de méthodes de liaison ne s’accorde fortement — la corrélation hors diagonale la plus élevée n’est que d’environ 0.46 (complete vs single), et la liaison centroid est la plus isolée de toutes (de 0.17 à 0.31 avec les autres). Autrement dit, les quatre méthodes construisent ici des arbres réellement différents. C’est exactement le type de désaccord que vous voulez faire ressortir avant de vous engager sur un regroupement — sur ces données, le choix de la méthode de liaison compte clairement.
Essayez en direct
Comparez vous-même deux méthodes de liaison. Remplacez "ward.D2" par "complete", "single" ou "centroid", relancez, et observez le tanglegramme et le score d’enchevêtrement changer. Cliquez sur Run.
🟢 Avec un agent IA
Demandez à Prova« compare deux arbres de regroupement sur mes données et dis-moi si le choix de la liaison compte » — elle répond avec du code dendextend que vous pouvez exécuter sur votre propre data frame, trace le tanglegramme et vous lit la corrélation cophénétique. The runtime is the judge.Demander à Prova →
Problèmes courants
Mon tanglegramme est un mur de lignes illisible. Les tanglegrammes ne restent lisibles que pour de petits arbres (environ 10 à 30 étiquettes). Avec plus de 50 observations, les lignes de liaison se chevauchent et deviennent du bruit. Prenez un sous-ensemble aléatoire (comme nous l’avons fait avec sample()), ou comparez plutôt les arbres avec la matrice de corrélation — elle s’adapte à n’importe quelle taille.
Que signifie réellement le nombre d’enchevêtrement ? Il mesure à quel point les lignes de liaison sont croisées après alignement, sur une échelle de 0 à 1 : 0 correspond à un agencement net, sans croisement, et 1 à un enchevêtrement maximal. Plus c’est bas, mieux c’est. Il décrit la qualité de l’agencement visuel, et non la similarité des arbres — pour la similarité, utilisez la corrélation cophénétique ou de Baker.
Cophénétique ou Baker — quelle corrélation rapporter ? Utilisez la cophénétique par défaut ; c’est la norme et elle reflète les hauteurs réelles de fusion. Tournez-vous vers le gamma de Baker lorsque vous vous souciez de l’ordre dans lequel les observations fusionnent plutôt que des distances exactes, ou lorsque quelques grandes distances domineraient la valeur cophénétique. Elles concordent généralement de près (ici, environ 0.99 toutes les deux).
Questions fréquentes
NoteQu’est-ce qu’un tanglegramme ?
Un tanglegramme est un graphique qui place deux dendrogrammes face à face et trace une ligne reliant chaque étiquette correspondante. Il sert à comparer visuellement deux arbres de regroupement : les lignes droites et horizontales marquent les étiquettes que les deux arbres placent de la même façon, les lignes croisées marquent les désaccords, et les branches en pointillés marquent les sous-arbres propres à un seul arbre. En R, tracez-en un avec dendextend::tanglegram().
NoteComment comparer deux dendrogrammes en R ?
Construisez chaque arbre avec hclust(), convertissez-les avec as.dendrogram(), et placez les deux dans un dendlist(). Ensuite, visualisez la comparaison avec tanglegram() et quantifiez-la avec cor.dendlist() (ou cor_cophenetic() pour une seule paire). Le visuel et le nombre, ensemble, vous indiquent si les deux arbres s’accordent réellement.
NoteQu’est-ce que la corrélation cophénétique entre deux dendrogrammes ?
C’est la corrélation entre les distances cophénétiques des deux arbres — la hauteur à laquelle chaque paire d’observations se retrouve pour la première fois dans la même branche. Elle va de −1 à 1 ; proche de 1 signifie que les deux arbres sont très similaires, proche de 0 qu’ils ne sont pas statistiquement similaires. Calculez-la avec cor.dendlist(dend_list, method = "cophenetic") ou cor_cophenetic(dend1, dend2).
L’enchevêtrement va de 0 à 1 et mesure à quel point les lignes de liaison du tanglegramme sont entremêlées après alignement — plus c’est bas, mieux c’est, 0 signifiant un alignement parfait, sans croisement. Il n’y a pas de seuil strict, mais des valeurs proches de 0 (disons, inférieures à 0.1) indiquent que les deux arbres s’alignent proprement. Il mesure la qualité de l’agencement, et non la similarité des arbres.
NoteCophénétique vs Baker — quelle est la différence ?
Les deux mesurent à quel point deux dendrogrammes sont similaires, de −1 à 1. La corrélation cophénétique utilise les hauteurs de fusion réelles (distances cophénétiques). Le gamma de Baker est fondé sur les rangs, construit à partir de l’ordre dans lequel les observations fusionnent, il est donc moins sensible aux distances exactes. Elles concordent généralement ; rapportez la cophénétique par défaut et utilisez Baker quand les rangs comptent davantage que les magnitudes.
Testez vos connaissances
ImportantExercice : accord entre les liaisons complete et single
Sur le sous-ensemble standardisé de 10 États de USArrests, construisez un dendrogramme avec la liaison complete et un avec la liaison single, puis affichez leur corrélation cophénétique. Est-elle supérieure ou inférieure au ~0.99 que nous avons vu pour average vs Ward ?
# Put "complete" in the first hclust() and "single" in the second.
Conceptuel. Un tanglegramme montre toutes les lignes de liaison parfaitement horizontales, et pourtant la corrélation cophénétique entre les deux arbres n’est que de 0.6. Comment est-ce possible ? (Réponse : untangle() fait pivoter les branches pour minimiser les croisements de lignes, donc un tanglegramme à l’air net reflète un bon agencement, pas nécessairement des arbres similaires. La corrélation est la mesure fiable de la similarité — confirmez toujours l’image par un nombre.)
Conceptuel. Vous construisez quatre arbres (complete, single, average, centroid) et la matrice de corrélation montre chaque valeur hors diagonale inférieure à 0.5, avec centroid la plus isolée. Que devez-vous conclure ? (Réponse : Les quatre méthodes de liaison produisent des regroupements nettement différents sur ces données — aucune ne s’accorde fortement. Votre regroupement est très sensible à la méthode de liaison, alors indiquez quelle méthode vous avez utilisée et pourquoi, et ne traitez aucun dendrogramme isolé comme l’unique vraie réponse.)
Conclusion
Un dendrogramme isolé n’est que l’un des plusieurs arbres plausibles pour vos données. dendextend vous permet de le confronter à une alternative : réunissez deux arbres avec dendlist(), alignez-les visuellement avec tanglegram() et son score d’enchevêtrement, puis tranchez la question avec un nombre — la corrélation cophénétique ou de Baker de cor.dendlist(). Étendez cela à plusieurs méthodes de liaison à la fois avec une matrice de corrélation et un corrplot, et vous saurez avant de vous engager si vos regroupements sont robustes au choix de la méthode, ou un artefact de celui-ci.
Vous préférez un livre ? Practical Guide to Cluster Analysis in R est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.
Prouvez que vous savez le faire. Maîtrisez toute la série Analyse de clustering en R — suivez votre parcours, construisez des projets et obtenez un certificat.
@online{2026,
author = {},
title = {Comparer des dendrogrammes en R : tanglegrammes, corrélation},
date = {2026-06-24},
url = {https://www.datanovia.com/learn/machine-learning/clustering/comparing-dendrograms},
langid = {fr}
}