Déterminer le nombre optimal de regroupements en R
Choisir k avec le coude, la silhouette, la statistique d’écart (gap) et un vote majoritaire de 30 indices
Choisissez le bon nombre de regroupements (k) pour le k-means, le PAM et la classification hiérarchique en R. Utilisez les méthodes du coude, de la silhouette moyenne et de la statistique d’écart (gap) avec fviz_nbclust() de factoextra, puis départagez les égalités avec la règle de majorité des 30 indices de NbClust.
Date de publication
24 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Les méthodes de partitionnement comme le k-means et le PAM exigent que vous fixiez le nombre de regroupements kavant de les exécuter — bien choisir k a donc son importance.
La méthode du coude trace la somme des carrés intra-regroupement (WSS) en fonction de k ; le coude marque un k raisonnable.
La méthode de la silhouette moyenne retient le k qui maximise la séparation des regroupements.
La statistique d’écart (gap) compare votre regroupement à des données aléatoires et formalise l’heuristique du coude.
Lorsque les trois méthodes divergent, exécutez NbClust() — 30 indices votent, et vous retenez la majorité.
Vous voulez exécuter un k-means sur des fiches clients, des profils d’expression génique ou — comme ici — des statistiques de criminalité par État américain. Tout algorithme de partitionnement (k-means, PAM / k-medoids, CLARA) pose d’emblée la même question : combien de regroupements, k ? Trompez-vous, et les groupes n’ont plus aucun sens.
Il n’y a pas de réponse unique — le k optimal est en partie subjectif et dépend de la mesure de distance et de la méthode que vous utilisez. Une astuce rapide consiste à inspecter à l’œil un dendrogramme de classification hiérarchique et à compter les branches, mais cela aussi reste subjectif. Cette leçon vous donne quelque chose de plus solide : trois méthodes directes que vous pouvez tracer, ainsi qu’un vote majoritaire de 30 indices pour départager les égalités.
Les méthodes se répartissent en deux familles :
Méthodes directes — optimisent un critère tel que la somme des carrés intra-regroupement (la méthode du coude) ou la largeur de silhouette moyenne (la méthode de la silhouette).
Méthodes de tests statistiques — comparent votre regroupement à une distribution de référence nulle. La statistique d’écart (gap) en est l’exemple classique.
Au-delà de ces trois, plus de trente autres indices ont été publiés pour choisir k. Nous les calculerons tous d’un coup avec NbClust() et les laisserons voter.
Les données
Nous utiliserons USArrests — arrestations pour 100 000 habitants pour agression, meurtre et viol, plus le pourcentage de population urbaine, à travers les 50 États américains. Les variables sont sur des échelles différentes, nous les standardisons donc d’abord pour les rendre comparables (c’est la même préparation que dans chaque leçon de regroupement).
library(factoextra)# Standardize the data (mean 0, sd 1 per column)df <-scale(USArrests)head(df)
Chaque exécution de regroupement ci-dessous part de ce df standardisé.
Méthode du coude
L’idée derrière le regroupement par partitionnement est de définir des groupes de façon à ce que la somme totale des carrés intra-regroupement (WSS) — une mesure de la compacité des regroupements — soit aussi petite que possible. Ajouter davantage de regroupements réduit toujours la WSS, mais à un certain point le gain devient marginal.
La méthode du coude exploite ce fait : tracez la WSS totale en fonction de k, et cherchez le virage (le « coude ») où la courbe s’aplatit. Ce point d’inflexion est votre k candidat.
La recette :
Exécutez le regroupement (p. ex. k-means) pour une plage de k, disons de 1 à 10.
Pour chaque k, enregistrez la WSS totale.
Tracez la WSS en fonction de k.
L’emplacement du virage donne le nombre de regroupements suggéré.
fviz_nbclust() fait tout cela en un seul appel — passez-lui les données, la fonction de regroupement (kmeans) et method = "wss" :
La courbe chute fortement de k = 1 à k = 4, puis s’aplatit — la ligne en pointillés marque le virage. Le coude suggère 4 regroupements. Le hic : le virage se lit à l’œil et est parfois ambigu, ce qui explique précisément pourquoi nous le recoupons avec les méthodes de la silhouette et de l’écart (gap).
Méthode de la silhouette moyenne
La largeur de silhouette mesure à quel point chaque observation se situe bien dans son propre regroupement par rapport au regroupement voisin le plus proche (nous l’abordons en détail dans statistiques de validation de regroupement). Une largeur de silhouette moyenne élevée signifie un regroupement net et bien séparé.
Ainsi, au lieu d’un virage, vous cherchez ici un pic : calculez la silhouette moyenne sur une plage de k, et retenez le k qui la maximise.
La recette reprend celle de la méthode du coude — il suffit de changer de critère :
Exécutez le regroupement pour k = 1 à 10.
Pour chaque k, calculez la largeur de silhouette moyenne.
Tracez-la en fonction de k.
Le maximum donne le nombre de regroupements suggéré.
Le pic se situe à k = 2 — la méthode de la silhouette suggère 2 regroupements. Notez que cela contredit le 4 du coude : la silhouette privilégie des groupes moins nombreux et mieux séparés, le coude privilégie la compacité. Le désaccord est normal et c’est pourquoi nous poursuivons.
Méthode de la statistique d’écart (gap)
La statistique d’écart (gap) (Tibshirani, Walther & Hastie, 2001) transforme l’heuristique du coude en une procédure statistique en bonne et due forme, et s’applique à toute méthode de regroupement. Elle compare la variation totale intra-regroupement de vos données à la variation attendue sous une distribution de référence nulle (points aléatoires répartis uniformément). Le k optimal est celui où votre regroupement est le plus éloigné de l’aléatoire — le plus grand écart.
La recette :
Regroupez les données observées pour k = 1, …, kmax, en enregistrant la variation intra-regroupement \(W_k\).
Générez B jeux de données de référence aléatoires, regroupez chacun de la même façon, et enregistrez leur variation intra-regroupement \(W_{kb}\).
L’écart est la déviation (logarithmique) de la variation observée par rapport à sa valeur attendue sous l’hypothèse nulle.
Choisissez le plus petit k dont l’écart est à moins d’un écart-type de l’écart à k + 1.
fviz_nbclust() calcule la statistique d’écart (gap) via cluster::clusGap() en coulisses lorsque vous passez method = "gap_stat". Nous fixons une graine pour la reproductibilité et gardons nboot petit pour que l’exemple s’exécute vite (utilisez nboot = 500 pour de vraies analyses) :
library(factoextra)df <-scale(USArrests)# nboot = 50 keeps it fast; use nboot = 500 for your analysis.set.seed(123)fviz_nbclust(df, kmeans, nstart =25, method ="gap_stat", nboot =50) +labs(subtitle ="Gap statistic method")
La ligne en pointillés marque le k choisi — la statistique d’écart (gap) suggère 4 regroupements. Là où le coude et la silhouette ne décrivent qu’une propriété globale du regroupement, la statistique d’écart (gap) ajoute un véritable test « est-ce mieux que l’aléatoire ? », ce qui en fait souvent l’arbitre parmi les trois méthodes directes.
NoteLes mathématiques derrière la statistique d’écart (gap)
Pour chaque k, l’écart compare la dispersion intra-regroupement observée \(W_k\) à sa valeur attendue sous B échantillons de référence uniformes :
Un grand écart signifie que le vrai regroupement est bien plus resserré que l’aléatoire. Pour éviter de surcompter les regroupements, vous ne prenez pas simplement le maximum — vous choisissez le plus petit k dont l’écart est à moins d’une erreur standard \(s_{k+1}\) du suivant :
\[
Gap(k) \geq Gap(k+1) - s_{k+1}
\]
Utiliser B = 500 échantillons de référence donne des résultats stables ; un B plus petit (comme le 50 ci-dessus) convient pour un aperçu rapide mais reste plus bruité.
Lire ensemble les trois méthodes directes
Jusqu’ici, les trois méthodes disent :
Méthode
Critère
k suggéré
Coude
somme des carrés intra-regroupement (virage)
4
Silhouette
largeur de silhouette moyenne (pic)
2
Statistique d’écart (gap)
écart vs. référence aléatoire (max)
4
Deux sur trois pointent vers k = 4, donc 4 est un choix défendable pour USArrests. Mais deux sur trois est exactement le genre de jugement que vous préféreriez ne pas trancher à la main. C’est là qu’intervient le vote des 30 indices.
Le consensus des 30 indices : NbClust()
Le package NbClust (Charrad et al., 2014) calcule environ 30 indices différents pour choisir k — chacun une règle publiée — et propose le meilleur nombre de regroupements par règle de majorité. Au lieu de scruter un seul graphique, vous laissez trente critères voter.
Les arguments clés :
data — votre matrice (standardisée).
distance — la mesure de dissimilarité : "euclidean", "manhattan", …
min.nc / max.nc — le plus petit et le plus grand k à considérer.
method — la méthode de regroupement : "kmeans", ou pour la classification hiérarchique l’une de "ward.D2", "complete", "average", "single", …
Exécutez-le sur les données standardisées pour k = 2 à 10 avec le k-means. NbClust() est verbeux et un peu lent — il affiche un commentaire en continu et produit deux graphiques de diagnostic — nous faisons donc taire le bavardage et masquons ses graphiques de base, en ne gardant que le résumé factoextra propre qui suit :
Visualisez maintenant le vote avec fviz_nbclust() — passez-lui le résultat de NbClust et il dessine un diagramme en barres du nombre d’indices ayant recommandé chaque k :
library(factoextra)fviz_nbclust(nb)
Among all indices:
===================
* 2 proposed 0 as the best number of clusters
* 11 proposed 2 as the best number of clusters
* 2 proposed 3 as the best number of clusters
* 1 proposed 4 as the best number of clusters
* 1 proposed 5 as the best number of clusters
* 7 proposed 6 as the best number of clusters
* 1 proposed 9 as the best number of clusters
* 1 proposed 10 as the best number of clusters
Conclusion
=========================
* According to the majority rule, the best number of clusters is 2 .
Lecture des barres : une poignée d’indices proposent 2 regroupements, plusieurs proposent 4, quelques-uns se dispersent ailleurs. Selon la règle de majorité, le meilleur nombre de regroupements est 2 pour USArrests — le k le plus voté. (Vos comptes exacts peuvent varier légèrement avec la graine et la version de R/des packages, mais le choix de tête est robuste.)
Une recommandation pratique
Mettez tout cela ensemble :
Exécutez plusieurs méthodes, pas une seule. Le coude, la silhouette et l’écart (gap) saisissent chacun une facette différente d’un « bon regroupement » ; la statistique d’écart (gap) est la plus rigoureuse des trois.
Utilisez NbClust() pour départager les égalités. Quand les méthodes directes divergent (ici, 4 contre 2), le vote majoritaire des 30 indices est votre consensus.
Laissez le domaine trancher le choix final. Les méthodes le réduisent à une liste restreinte (ici, 2 ou 4). Choisissez celui qui donne des regroupements que vous pouvez interpréter — puis validez-les avec les statistiques de silhouette et de Dunn.
Les graphiques ci-dessus ont été rendus au moment de la compilation. Vous voulez l’essayer sur votre propre k ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (sans installation). Cette cellule utilise les méthodes légères du coude + de la silhouette ; NbClust() est plus lourd et s’exécute de préférence en local.
🟢 Avec un agent IA
Demandez à Prova« combien de regroupements mon jeu de données comporte-t-il, et quelle méthode dois-je privilégier ? » — elle répond avec du code fviz_nbclust() et NbClust() que vous pouvez exécuter sur vos propres données, puis vous aide à lire les graphiques du coude, de la silhouette et de l’écart (gap). The runtime is the judge.Demandez à Prova →
Problèmes courants
Les trois méthodes divergent (p. ex. le coude dit 4, la silhouette dit 2). C’est normal — chacune optimise un critère différent. Ne forcez pas l’une à l’emporter : exécutez NbClust() pour le vote majoritaire des 30 indices, et laissez l’interprétabilité trancher entre les valeurs retenues.
NbClust() est lent ou inonde la console. Il calcule ~30 indices et affiche un commentaire en continu plus deux graphiques de base. Réglez les options de bloc results = "hide" et fig.show = "hide" pour les supprimer, puis visualisez proprement le résultat avec fviz_nbclust(nb). Sur de grands jeux de données il peut être véritablement lent — sous-échantillonnez, ou tenez-vous-en aux trois méthodes de fviz_nbclust().
La statistique d’écart (gap) choisit k = 1. C’est la statistique d’écart (gap) qui vous indique que les données n’ont peut-être aucune vraie structure de regroupement — elles ne valent pas mieux que l’aléatoire. Avant de faire confiance à un quelconque k, évaluez la tendance au regroupement (statistique de Hopkins / VAT) ; regrouper des données sans groupes produit des regroupements qui ne signifient rien.
Le coude n’a pas de virage net. Les coudes ambigus sont fréquents. Repliez-vous sur la silhouette (un pic est plus facile à lire qu’un virage) et la statistique d’écart (gap), puis confirmez avec NbClust().
Questions fréquentes
NoteCombien de regroupements dois-je utiliser pour le k-means en R ?
Il n’y a pas de réponse unique — exécutez plusieurs méthodes et prenez le consensus. Utilisez fviz_nbclust(df, kmeans, method = "wss") pour le coude, "silhouette" pour le pic, et "gap_stat" pour la statistique d’écart (gap), puis départagez les égalités avec le vote majoritaire des 30 indices de NbClust(). Enfin, choisissez le k dont vous pouvez réellement interpréter les regroupements.
NoteQuelle est la différence entre les méthodes du coude et de la silhouette ?
La méthode du coude trace la somme des carrés intra-regroupement en fonction de k et cherche le virage où ajouter des regroupements cesse d’aider — elle privilégie les regroupements compacts. La méthode de la silhouette retient le k qui maximise la largeur de silhouette moyenne — elle privilégie les regroupements bien séparés. Elles divergent souvent (la silhouette tend à en suggérer moins) ; quand c’est le cas, utilisez la statistique d’écart (gap) ou NbClust().
NoteQu’est-ce que la statistique d’écart (gap) et comment la calculer en R ?
La statistique d’écart (gap) compare la variation intra-regroupement de votre regroupement à celle de données de « référence » aléatoires uniformes ; le meilleur k donne le plus grand écart (votre structure est la plus éloignée de l’aléatoire). Calculez-la avec fviz_nbclust(df, kmeans, method = "gap_stat", nboot = 500) — elle appelle cluster::clusGap() en interne. Elle formalise l’heuristique du coude, ce qui en fait souvent la plus fiable des trois méthodes directes.
NoteQue fait NbClust, et pourquoi diverge-t-il de la méthode du coude ?
NbClust() calcule environ 30 indices publiés pour choisir k en un seul appel et recommande le choix majoritaire — un arbitre intégré. Il peut diverger d’une méthode unique (comme le coude) parce qu’aucun indice n’est universellement le meilleur ; le vote majoritaire est plus robuste que n’importe quel critère isolé. Visualisez le vote avec fviz_nbclust(nb).
NotePourquoi la statistique d’écart (gap) suggère-t-elle un seul regroupement ?
Une statistique d’écart (gap) de k = 1 signifie généralement que vos données n’ont aucune vraie structure de regroupement — elles sont statistiquement indiscernables de points aléatoires. Avant de regrouper, évaluez la tendance au regroupement avec la statistique de Hopkins ou un graphique VAT ; si les données ne sont pas regroupables, tout k que vous choisirez produira des groupes dénués de sens.
Testez vos connaissances
ImportantExercice : trouver k avec la méthode de la silhouette
Complétez le code pour qu’il trace la largeur de silhouette moyenne en fonction du nombre de regroupements pour le k-means sur les données USArrests standardisées, et lisez le k suggéré.
# The method argument is a string: "wss", "silhouette", or "gap_stat".# For the silhouette method, use "silhouette" — the suggested k is the peak.
library(factoextra)
df <- scale(USArrests)
fviz_nbclust(df, kmeans, method = "silhouette")
# The curve peaks at k = 2 → the silhouette method suggests 2 clusters.
library(factoextra)df <-scale(USArrests)fviz_nbclust(df, kmeans, method ="silhouette")# The curve peaks at k = 2 → the silhouette method suggests 2 clusters.
NoteVérification rapide : quelle affirmation est correcte ?
La méthode du coude est toujours d’accord avec la méthode de la silhouette.
La statistique d’écart (gap) compare votre regroupement à une distribution de référence aléatoire.
NbClust() renvoie un seul indice, et non un vote.
AstuceAfficher la réponse
L’affirmation 2 est correcte. La statistique d’écart (gap) compare la variation intra-regroupement de vos données à celle de données aléatoires uniformes et retient le k au plus grand écart. L’affirmation 1 est fausse — le coude et la silhouette divergent souvent (ici, 4 contre 2). L’affirmation 3 est fausse — NbClust() calcule ~30 indices et recommande le choix majoritaire.
Conclusion
Vous avez estimé le nombre optimal de regroupements pour USArrests de trois façons avec fviz_nbclust() — le coude (k = 4), la silhouette moyenne (k = 2) et la statistique d’écart (gap) (k = 4) — puis réglé le désaccord avec le vote majoritaire des 30 indices de NbClust() (k = 2). Le flux de travail pratique : exécutez plusieurs méthodes, prenez le consensus, et laissez l’interprétabilité trancher le choix final. Une fois k choisi, vous êtes prêt à exécuter le regroupement et à le valider.
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 = {Déterminer le nombre optimal de regroupements en R},
date = {2026-06-24},
url = {https://www.datanovia.com/learn/machine-learning/clustering/optimal-clusters},
langid = {fr}
}