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).
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

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, AGNESAgglomerative 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, DIANADIvisive 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 data
data("USArrests")

# Standardize: every variable to mean 0, sd 1 (so scales are comparable)
df <- scale(USArrests)

# First 6 rows of the standardized data
head(df, 6)
               Murder   Assault   UrbanPop         Rape
Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
Arizona    0.07163341 1.4788032  0.9989801  1.042878388
Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
California 0.27826823 1.2628144  1.7589234  2.067820292
Colorado   0.02571456 0.3988593  0.8608085  1.864967207
Note

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 matrix
as.matrix(res.dist)[1:6, 1:6]
            Alabama   Alaska  Arizona Arkansas California Colorado
Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000

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 method
res.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 non ward.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 coefficient
methods <- 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.

library(factoextra)

df <- scale(USArrests)
res.hc <- hclust(dist(df), method = "ward.D2")

fviz_dend(res.hc, cex = 0.5)   # cex = label size

Dendrogram of the standardized US Arrests data built with Ward's method. State names are the leaves along the bottom; branches join at increasing heights up the vertical axis, showing how states merge into larger clusters.

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 groups
grp <- cutree(res.hc, k = 4)

# Cluster label of the first 4 states
head(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]
[1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
[5] "North Carolina" "South Carolina" "Tennessee"     

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 groups
          cex = 0.5,                                      # label size
          k_colors = c("#3a86d4", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE,                       # colour labels by group
          rect = TRUE)                                    # box each cluster

The same US Arrests dendrogram cut into four colored clusters, with a rectangle drawn around each group of states to show the four-cluster partition.

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 cluster
             repel = TRUE,              # avoid label overlap
             show.clust.cent = FALSE,
             ggtheme = theme_minimal())

Scatter plot of US states on the first two principal components, with the four hierarchical-clustering groups shown as colored points inside convex frames, and state names labeled.

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 tree
res.coph <- cophenetic(res.hc)

# Correlation with the original distances
cor(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 :

df <- scale(USArrests)
res.dist <- dist(df)

res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
[1] 0.7180382

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 descendanteDIANA (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 structure
res.diana$dc
[1] 0.8530481
# Visualize the tree, cut into 4 groups
fviz_dend(res.diana, cex = 0.5,
          k = 4,
          palette = "jco")

Dendrogram of the US Arrests data built top-down with divisive clustering (DIANA), cut into four colored groups using a journal color palette.

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

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.

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

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

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.

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

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)
df <- scale(USArrests)
res.hc <- hclust(dist(df), method = "complete")
grp <- cutree(res.hc, k = 3)
table(grp)
  1. 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.)

  2. 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 sautward.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

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.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

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.

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

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Classification hiérarchique en R : dendrogrammes, ascendante
    \& descendante},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/clustering/hierarchical-clustering},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Classification hiérarchique en R : dendrogrammes, ascendante & descendante.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/hierarchical-clustering.