Classification hiérarchique en R : dendrogrammes, ascendante & descendante
Construisez un arbre de regroupements imbriqués avec hclust(), agnes() et diana() — comparez les méthodes de saut avec le coefficient d’agglomération, lisez le dendrogramme et découpez-le en groupes
Classification hiérarchique en R, étape par étape. Calculez la matrice de distances, construisez l’arbre de regroupement avec hclust() et agnes(), comparez les méthodes de saut (complet, moyen, simple, Ward) avec le coefficient d’agglomération, tracez un dendrogramme prêt à publier avec fviz_dend(), découpez-le en groupes avec cutree(), et vérifiez l’ajustement avec la corrélation cophénétique. Inclut la classification descendante (DIANA) et quand utiliser chacune.
Date de publication
24 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
La classification hiérarchique construit un arbre de regroupements imbriqués (un dendrogramme) — et, contrairement à k-means, vous ne spécifiez pas à l’avance le nombre de regroupements : vous le lisez sur l’arbre ensuite.
L’approche ascendante (de bas en haut, AGNES) part de chaque observation comme son propre regroupement et fusionne la paire la plus proche à chaque étape ; l’approche descendante (de haut en bas, DIANA) part d’un seul grand regroupement et le divise.
Le résultat dépend de deux choix : la distance entre observations (dist()) et la règle de saut pour la distance entre regroupements — complet, moyen, simple, ou Ward (ward.D2).
Utilisez le coefficient d’agglomération de agnes() pour comparer objectivement les méthodes de saut — plus il est élevé, plus la structure de regroupement est forte (Ward l’emporte généralement).
Tracez l’arbre avec fviz_dend(), découpez-le en groupes avec cutree(), et vérifiez l’ajustement avec la corrélation cophénétique (au-dessus de 0.75, c’est bon).
Supposez que vous disposez de statistiques criminelles pour les 50 États américains et que vous voulez trouver des groupes d’États qui se comportent de façon similaire — sans décider d’emblée combien de groupes existent. La classification hiérarchique (aussi appelée analyse de classification hiérarchique, ou HCA) est conçue exactement pour cela. Au lieu de forcer les données dans un nombre fixe de regroupements comme le fait k-means, elle produit un arbre — un dendrogramme — qui montre comment les observations fusionnent en regroupements à chaque niveau de similarité. Vous découpez alors l’arbre là où le regroupement a du sens.
C’est la méthode de choix lorsque :
vous ne savez pas combien de regroupements attendre (l’arbre vous montre la structure à chaque échelle),
vous voulez une carte visuelle et interprétable de la façon dont les observations se rapportent, ou
vos données sont de petite à moyenne taille (la matrice de distances grandit vite — la classification hiérarchique n’est pas faite pour des millions de lignes ; utilisez k-means ou CLARA dans ce cas).
La classification hiérarchique se décline en deux variantes :
Ascendante (de bas en haut, AGNES — Agglomerative Nesting) : chaque observation commence comme son propre regroupement ; à chaque étape, les deux regroupements les plus similaires sont fusionnés, jusqu’à ce qu’il ne reste qu’un grand regroupement. Bonne pour trouver de petits regroupements.
Descendante (de haut en bas, DIANA — DIvisive ANAlysis) : tout commence dans un seul regroupement, qui est divisé encore et encore jusqu’à ce que chaque observation se retrouve seule. Bonne pour trouver de grands regroupements.
Nous nous concentrons sur la classification ascendante (le cas courant), puis traitons la descendante à la fin. Les quatre étapes sont toujours les mêmes : préparer les données → calculer une matrice de distances → relier en un arbre → découper l’arbre en groupes.
Les données
Nous utilisons le jeu de données intégré USArrests de R — arrestations pour 100 000 habitants pour Murder, Assault et Rape, plus le pourcentage UrbanPop, pour chaque État américain. Les variables sont sur des échelles très différentes, alors nous les standardisons d’abord avec scale() (scores z) : sinon Assault (centaines) dominerait Murder (chiffres à un seul chiffre) uniquement à cause de ses unités.
# Load the datadata("USArrests")# Standardize: every variable to mean 0, sd 1 (so scales are comparable)df <-scale(USArrests)# First 6 rows of the standardized datahead(df, 6)
Standardiser avant de classifier est presque toujours le bon choix lorsque les variables sont mesurées dans différentes unités. La leçon mesures de distance couvre en détail quand (et comment) standardiser.
Étape 1 — la matrice de distances
Chaque méthode de classification a besoin d’une règle pour savoir à quel point deux observations sont éloignées. La fonction de base dist() calcule cela pour chaque paire de lignes. Par défaut, elle utilise la distance euclidienne ; vous pouvez changer avec method = ("manhattan", "maximum", …) — voir la leçon mesures de distance.
df <-scale(USArrests)# Dissimilarity matrix (Euclidean distance between every pair of states)res.dist <-dist(df, method ="euclidean")# Peek at the first 6×6 corner of the matrixas.matrix(res.dist)[1:6, 1:6]
Lisez la matrice comme un tableau des distances kilométriques : la cellule à la ligne i, colonne j est la distance entre l’État i et l’État j. La diagonale est nulle (la distance de chaque État à lui-même), et la matrice est symétrique.
Étape 2 — classification ascendante avec hclust()
La fonction de base hclust() prend la matrice de distances et relie les observations en un arbre. L’argument clé est method =, la règle de saut — comment mesurer la distance entre deux regroupements (et pas seulement deux points) :
df <-scale(USArrests)res.dist <-dist(df, method ="euclidean")# Build the hierarchical tree using Ward's methodres.hc <-hclust(d = res.dist, method ="ward.D2")
Quelle méthode de saut ?
Le saut est le choix qui modifie le plus la forme de l’arbre. Les règles courantes :
Saut complet (maximum) — distance entre regroupements = la plus grande distance par paires. Tend à produire des regroupements compacts et serrés.
Saut simple (minimum) — la plus petite distance par paires. Tend à produire des regroupements longs et filandreux « en chaîne » (une seule valeur aberrante peut étirer un regroupement).
Saut moyen — la moyenne de toutes les distances par paires. Un compromis.
Saut par centroïde — distance entre les deux centroïdes des regroupements (vecteurs moyens).
Variance minimale de Ward (ward.D2) — à chaque étape, fusionne la paire qui augmente le moins la variance intra-regroupement totale. Produit des regroupements équilibrés, de tailles à peu près égales et compacts.
Astuce
Le saut complet et la méthode de Ward sont les choix par défaut habituels — ils donnent des regroupements compacts et interprétables. Le saut simple est rarement ce que vous voulez pour grouper (il enchaîne), mais il est bon pour repérer les valeurs aberrantes. Nous utilisons ward.D2 ici. (Utilisez ward.D2, et nonward.D — voir Problèmes fréquents.)
Comparer objectivement les méthodes de saut : le coefficient d’agglomération
Au lieu d’évaluer les arbres à l’œil, vous pouvez comparer les méthodes de saut avec un seul nombre. La fonction agnes() (du package cluster) réalise la classification ascendante et rapporte le coefficient d’agglomération (AC) — une mesure de la force de la structure de regroupement, entre 0 et 1. Des valeurs plus proches de 1 signifient une structure plus forte et plus nette.agnes() réalise aussi le scale() + dist() + saut en un seul appel.
library(cluster)# Try four linkage methods and grab each agglomerative coefficientmethods <-c(average ="average", single ="single",complete ="complete", ward ="ward")ac <-sapply(methods, function(m) {agnes(USArrests, stand =TRUE, metric ="euclidean", method = m)$ac})round(ac, 3)
average single complete ward
0.738 0.634 0.854 0.934
La méthode de Ward donne le coefficient d’agglomération le plus élevé — la structure de regroupement la plus forte — c’est pourquoi nous l’utilisons. C’est une façon rapide et défendable de choisir une méthode de saut plutôt que de deviner.
Étape 3 — le dendrogramme
L’arbre se lit mieux sous forme de dendrogramme. Le plot(res.hc) de base fonctionne, mais fviz_dend() (dans factoextra) en trace un bien plus propre, prêt à publier.
Comment le lire. Chaque feuille au bas est un État. En remontant, les États similaires se rejoignent en branches, et les branches fusionnent en branches plus grandes. La hauteur à laquelle deux éléments se rejoignent (l’axe vertical) est leur dissimilarité — la distance cophénétique. Plus deux éléments fusionnent bas, plus ils sont similaires.
Avertissement
Jugez la similarité par la hauteur de fusion, et non par la position horizontale. Deux feuilles qui se trouvent côte à côte le long du bas peuvent ne se rejoindre qu’à un niveau élevé — elles ne sont pas nécessairement similaires. Seule la hauteur à laquelle leurs branches fusionnent en premier vous indique leur proximité.
Étape 4 — découper l’arbre en groupes
Un dendrogramme à lui seul ne vous dit pas combien de regroupements il y a. Vous décidez, en découpant l’arbre à une hauteur — chaque branche que la coupe traverse devient un regroupement. cutree() fait cela, soit par un nombre cible de groupes (k =), soit par une hauteur de coupe (h =). Il renvoie le numéro de regroupement de chaque observation.
df <-scale(USArrests)res.hc <-hclust(dist(df), method ="ward.D2")# Cut the tree into 4 groupsgrp <-cutree(res.hc, k =4)# Cluster label of the first 4 stateshead(grp, 4)
Alabama Alaska Arizona Arkansas
1 2 2 3
# How many states in each cluster?table(grp)
grp
1 2 3 4
7 12 19 12
# Which states are in cluster 1?rownames(df)[grp ==1]
Tracez la coupe sur le dendrogramme — fviz_dend() colore les branches par groupe et encadre chaque regroupement :
library(factoextra)df <-scale(USArrests)res.hc <-hclust(dist(df), method ="ward.D2")fviz_dend(res.hc, k =4, # cut into 4 groupscex =0.5, # label sizek_colors =c("#3a86d4", "#00AFBB", "#E7B800", "#FC4E07"),color_labels_by_k =TRUE, # colour labels by grouprect =TRUE) # box each cluster
Vous pouvez aussi visualiser les regroupements sous forme de nuage de points. fviz_cluster() projette les États sur leurs deux premières composantes principales et trace un cadre autour de chaque groupe — une vue plus claire de la séparation que l’arbre :
library(factoextra)df <-scale(USArrests)res.hc <-hclust(dist(df), method ="ward.D2")grp <-cutree(res.hc, k =4)fviz_cluster(list(data = df, cluster = grp),palette =c("#3a86d4", "#00AFBB", "#E7B800", "#FC4E07"),ellipse.type ="convex", # frame around each clusterrepel =TRUE, # avoid label overlapshow.clust.cent =FALSE,ggtheme =theme_minimal())
Vérifier l’arbre de regroupement : la corrélation cophénétique
Avec quelle fidélité l’arbre reflète-t-il les distances originales ? Calculez les distances cophénétiques — les hauteurs auxquelles les paires fusionnent dans l’arbre — et corrélez-les avec les distances dist() originales. Plus c’est proche de 1, mieux l’arbre préserve les distances réelles ; au-dessus de 0.75, c’est considéré comme bon.
df <-scale(USArrests)res.dist <-dist(df)res.hc <-hclust(res.dist, method ="ward.D2")# Cophenetic distances from the treeres.coph <-cophenetic(res.hc)# Correlation with the original distancescor(res.dist, res.coph)
[1] 0.6975266
L’arbre de Ward préserve raisonnablement les distances. Le saut moyen obtient souvent un meilleur score sur cette statistique particulière (l’une des raisons de sa popularité) — comparez :
Le saut moyen donne ici une corrélation cophénétique plus élevée — il représente les distances brutes un peu plus fidèlement. Cela n’en fait pas pour autant le « meilleur » choix d’emblée : il se fait au détriment des groupes compacts et équilibrés que donne Ward (et du coefficient d’agglomération plus élevé de Ward). Choisissez le saut qui correspond à votre objectif, et pas seulement à un seul nombre — voir le repère de décision ci-dessous.
Classification descendante (DIANA)
La classification descendante — DIANA (DIvisive ANAlysis) — est la classification ascendante exécutée en sens inverse. Elle part de toutes les observations dans un seul regroupement et, à chaque étape, sépare le regroupement le plus hétérogène, jusqu’à ce que chaque observation soit seule. Là où l’ascendante est de bas en haut, la descendante est de haut en bas ; là où l’ascendante est bonne pour trouver de petits regroupements, la descendante est bonne pour trouver de grands regroupements.
La fonction diana() (dans cluster) la calcule et, comme agnes(), réalise le scale() + dist() + l’ algorithme en un seul appel. Elle renvoie un coefficient de division (analogue au coefficient d’agglomération) mesurant la force de la structure.
library(cluster)library(factoextra)# Divisive clustering (standardizes internally)res.diana <-diana(USArrests, stand =TRUE)# Divisive coefficient: strength of the clustering structureres.diana$dc
[1] 0.8530481
# Visualize the tree, cut into 4 groupsfviz_dend(res.diana, cex =0.5,k =4,palette ="jco")
Vous lisez, découpez et vérifiez un arbre DIANA exactement comme un arbre ascendant (cutree(), fviz_dend(), cophenetic()). En pratique, la classification ascendante est bien plus souvent utilisée, mais DIANA est une alternative utile lorsque vous attendez quelques grands groupes plutôt que beaucoup de petits.
Quel saut quand
Vous voulez…
Utilisez
Des groupes compacts, équilibrés, de tailles à peu près égales (un choix par défaut sûr)
Ward (ward.D2)
Des regroupements serrés et compacts ; sensibles aux points les plus éloignés
Complet
Un compromis ; meilleure corrélation cophénétique
Moyen
Détecter les valeurs aberrantes / l’enchaînement (rarement pour grouper)
Simple
Quelques grands groupes, de haut en bas
Descendante (diana())
Confirmez votre choix avec le coefficient d’agglomération (agnes()$ac) et la corrélation cophénétique (cor(dist, cophenetic(hc))) — ne choisissez pas à l’œil seulement.
Essayez en direct
Classifiez vous-même les États USArrests. Changez k pour découper l’arbre en un nombre différent de groupes, ou remplacez "ward.D2" par "complete" ou "average" et observez le dendrogramme changer. Cliquez sur Run.
🟢 Avec un agent IA
Demandez à Prova« lance une classification hiérarchique sur mes données et dis-moi combien de regroupements conserver » — elle répond avec du code R que vous pouvez exécuter sur votre propre data frame, puis vous aide à lire le dendrogramme, choisir la coupe, et vérifier la corrélation cophénétique. The runtime is the judge.Demander à Prova →
Problèmes fréquents
ward.D ou ward.D2 — lequel ? Utilisez ward.D2. Le "ward.D" original n’implémente pas correctement le critère de Ward, sauf si votre entrée correspond à des distances euclidiennes au carré ; "ward.D2" met les distances au carré en interne et donne le véritable résultat de Ward. Optez pour ward.D2 sauf si vous avez une raison spécifique de ne pas le faire.
J’ai oublié de standardiser et une variable domine. Si vos variables sont sur des échelles différentes (par ex. des dollars face à des comptages), la variable de plus grande magnitude pilotera les distances et les regroupements refléteront pour l’essentiel cette seule colonne. Standardisez d’abord avec scale() (ou agnes(..., stand = TRUE)).
Comment savoir où découper l’arbre ? Il n’y a pas de règle unique, mais cherchez un grand écart vertical — découpez juste en dessous d’une hauteur où les branches sautent loin vers le haut (de grands sauts signifient que des regroupements très différents sont forcés à se rejoindre). Pour un choix rigoureux, utilisez les méthodes du nombre optimal de regroupements (coude, silhouette, statistique de l’écart) et passez ce k à cutree().
Mon arbre à saut simple ressemble à une longue chaîne. C’est le comportement d’« enchaînement » bien connu du saut simple — il relie les regroupements par leur unique paire la plus proche. Passez au saut complet ou à Ward pour des groupes compacts.
Questions fréquentes
NoteQuelle est la différence entre la classification hiérarchique et k-means ?
k-means exige que vous choisissiez le nombre de regroupements (k) à l’avance et renvoie une partition plate en exactement ce nombre de groupes ; il passe à l’échelle sur de grandes données. La classification hiérarchique construit un arbre entier (dendrogramme) de regroupements imbriqués et vous laisse choisir le nombre ensuite en découpant l’arbre — mais la matrice de distances le rend peu pratique pour de très grands jeux de données. Utilisez la classification hiérarchique pour explorer la structure et k-means pour passer à l’échelle.
NoteQuelle méthode de saut utiliser pour la classification hiérarchique ?
La méthode de Ward (ward.D2) et le saut complet sont les choix par défaut habituels — ils donnent des regroupements compacts et équilibrés. Le saut moyen est un compromis qui maximise souvent la corrélation cophénétique. Le saut simple enchaîne et est surtout utile pour repérer les valeurs aberrantes. Comparez-les objectivement avec le coefficient d’agglomération de agnes() (plus proche de 1 = structure plus forte).
NoteComment découper un dendrogramme en regroupements en R ?
Utilisez cutree() sur la sortie de hclust() : cutree(res.hc, k = 4) découpe en 4 groupes, ou cutree(res.hc, h = 5) découpe à la hauteur 5. Il renvoie le numéro de regroupement de chaque observation. Pour tracer la coupe, passez k = et rect = TRUE à fviz_dend().
NoteQuelle est la différence entre la classification ascendante et descendante ?
La classification ascendante (AGNES) est de bas en haut : chaque observation commence seule et les regroupements les plus proches fusionnent étape par étape. La classification descendante (DIANA) est de haut en bas : tout commence dans un seul regroupement qui est divisé de façon répétée. L’ascendante est meilleure pour trouver de petits regroupements et est de loin la plus courante ; la descendante est meilleure pour trouver quelques grands regroupements.
NoteComment vérifier si mon dendrogramme est de bonne qualité ?
Calculez la corrélation cophénétique : cor(res.dist, cophenetic(res.hc)). Elle compare les hauteurs de fusion dans l’arbre aux distances par paires originales — plus c’est proche de 1, mieux c’est, et au-dessus de 0.75, c’est considéré comme bon. La méthode du saut moyen obtient souvent le meilleur score sur cette mesure.
Testez vos connaissances
ImportantExercice : classifier avec le saut complet
Construisez une classification hiérarchique des données USArrests standardisées avec le saut complet, découpez-la en 3 groupes, et affichez combien d’États tombent dans chacun.
# method = "complete" inside hclust(), and k = 3 inside cutree()
df <-scale(USArrests)res.hc <-hclust(dist(df), method ="complete")grp <-cutree(res.hc, k =3)table(grp)
Conceptuel. Dans un dendrogramme, deux États se trouvent juste l’un à côté de l’autre le long de l’axe du bas mais leurs branches ne se rejoignent que tout en haut. Sont-ils similaires ? (Réponse : Non — la similarité se lit à partir de la hauteur à laquelle les branches fusionnent, et non de la position horizontale. Une hauteur de fusion élevée signifie qu’ils sont dissemblables.)
Conceptuel. Vous comparez quatre méthodes de saut avec agnes() et Ward a le coefficient d’agglomération le plus élevé tandis que le moyen a la corrélation cophénétique la plus élevée. Lequel choisissez-vous ? (Réponse : Il n’y a pas de « bon » choix unique — Ward donne la structure la plus forte et la plus compacte ; le moyen reproduit les distances brutes le plus fidèlement. Choisissez selon votre objectif, et confirmez la coupe avec les méthodes du nombre optimal de regroupements.)
Conclusion
La classification hiérarchique vous donne un arbre de groupes imbriqués au lieu d’une partition fixe : calculez une matrice de distances avec dist(), reliez-la en un arbre avec hclust() (ou agnes()), choisissez une méthode de saut — ward.D2 est un solide choix par défaut, confirmé par le coefficient d’agglomération — tracez-le avec fviz_dend(), et découpez-le en groupes avec cutree(). Vérifiez l’ajustement avec la corrélation cophénétique, et optez pour la classification descendante (diana()) lorsque vous attendez quelques grands groupes. Le nombre de regroupements est une décision que vous prenez à partir de l’arbre, idéalement étayée par les méthodes formelles des leçons suivantes.
Leçons connexes
Approfondir :mesures de distance — la règle de similarité dont dépend chaque méthode de saut, et comment la choisir ; k-means — l’alternative par partitionnement lorsque vous connaissez déjà k et devez passer à l’échelle ; nombre optimal de regroupements — coude, silhouette et statistique de l’écart pour choisir où découper ; visualiser les dendrogrammes — zoom, sous-arbres et arbres plus jolis avec dendextend ; comparer les dendrogrammes — tanglegrams et corrélation entre deux arbres.
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.