Analyse de regroupement (clustering) en R : exemple complet

Des données brutes aux regroupements validés en 5 étapes — standardiser, tester la tendance au regroupement, choisir k, lancer k-means et valider avec la silhouette

Machine Learning

Une analyse de regroupement complète et travaillée en R sur un seul jeu de données (USArrests) : standardiser les variables, vérifier si les données sont seulement regroupables (statistique de Hopkins + VAT), trouver le nombre optimal de regroupements avec la statistique de l’écart, lancer k-means et valider le résultat avec un graphique de silhouette. Chaque étape est expliquée en langage clair, s’exécute comme du vrai code R et renvoie vers sa leçon complète.

Auteur·rice
Date de publication

24 juin 2026

Modifié

24 juin 2026

AstuceCe que vous trouverez ici
  • Le flux de travail complet d’analyse de regroupement de bout en bout sur un seul jeu de données — les pièces que nos leçons modulaires enseignent séparément, enfin orchestrées en un seul endroit.
  • 5 étapes : (1) préparer et standardiser, (2) les données sont-elles seulement regroupables ? (3) combien de regroupements ?
    1. lancer k-means, (5) valider le résultat.
  • Chaque étape expliquée en langage clair, rendue à partir de vrai code R et reliée à sa leçon complète pour que vous puissiez approfondir n’importe quelle pièce.

La plupart des tutoriels de clustering vous donnent kmeans() et un nombre k et s’arrêtent là. Une vraie analyse de regroupement est un pipeline : vous ne vous contentez pas de lancer un algorithme — vous vérifiez que les données valent la peine d’être regroupées, vous laissez les données vous dire combien de groupes chercher, puis vous validez que les regroupements obtenus sont réels. Cet article parcourt tout le pipeline sur un seul jeu de données pour que vous puissiez voir comment les pièces s’emboîtent.

Nous utiliserons le jeu de données intégré USArrests — les taux de crimes violents (meurtre, agression, viol) plus le pourcentage de population urbaine pour chacun des 50 États américains. C’est un jeu de données propre, petit et entièrement numérique, ce qui le rend parfait pour voir clairement chaque étape.

Deux packages font le gros du travail :

install.packages(c("factoextra", "cluster"))

Étape 1 — Préparer et standardiser les données

K-means mesure les distances entre observations, donc les variables sur de plus grandes échelles numériques dominent le résultat. Dans USArrests, Assault atteint les centaines tandis que Murder est à un seul chiffre — laissée telle quelle, l’agression écraserait le clustering. La solution est de standardiser chaque variable à une moyenne de 0 et un écart-type de 1 avec scale(), pour que chacune contribue de manière égale.

# Load the data and standardize every column
data("USArrests")
df <- scale(USArrests)
head(df, 4)
             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

Maintenant les quatre variables sont sur un pied d’égalité. La standardisation est la chose la plus souvent oubliée — et elle ruine discrètement les regroupements.

Pour aller plus loin : le pourquoi et le comment de la distance et de la standardisation se trouvent dans Mesures de distance.

Étape 2 — Les données sont-elles seulement regroupables ?

Voici l’étape que presque tout le monde saute : les algorithmes de clustering renvoient toujours des regroupements, même sur du bruit aléatoire. Avant de faire confiance à un quelconque groupement, vous devriez vous demander si les données ont une véritable structure. C’est la tendance au regroupement, et get_clust_tendency() y répond de deux façons à la fois.

  • La statistique de Hopkins — un nombre entre 0 et 1. Avec factoextra actuel (formule corrigée de Wright), une valeur proche de 1 signifie que les données sont hautement regroupables ; une valeur proche de 0.5 signifie qu’elles sont indiscernables d’un bruit aléatoire uniforme.
  • Un graphique VAT (Visual Assessment of cluster Tendency) — une image de dissimilarité ordonnée. Les vrais regroupements apparaissent sous forme de blocs plus sombres le long de la diagonale.
library(factoextra)
set.seed(123)
res <- get_clust_tendency(df, n = 40, graph = TRUE)

# Hopkins statistic — near 1 means clusterable (factoextra's corrected formula)
res$hopkins_stat
[1] 0.9095708
# The VAT plot
res$plot

A VAT ordered dissimilarity image of the scaled US Arrests data, showing a block structure along the diagonal that indicates cluster structure.

La statistique de Hopkins revient proche de 1 (environ 0.91) et l’image VAT montre une structure en blocs le long de la diagonale — les données sont véritablement regroupables. Bonne nouvelle : il est sûr de consacrer des efforts à trouver des regroupements.

Pour aller plus loin : Évaluer la tendance au regroupement explique la statistique de Hopkins et le VAT en détail, y compris comment lire un résultat « sans structure ».

Étape 3 — Combien de regroupements ?

K-means exige que vous vous engagiez sur un nombre de regroupements, k, dès le départ — mais ce sont les données qui devraient en décider, pas vous. Parmi les nombreuses méthodes pour choisir k, la statistique de l’écart est l’une des plus rigoureuses : elle compare la compacité de vos regroupements à ce à quoi vous vous attendriez sur des données aléatoires sans structure, pour chaque k candidat, et vous oriente vers la valeur où le groupement réel dépasse le plus le hasard.

library(cluster)
set.seed(123)
gap_stat <- clusGap(df, FUN = kmeans, nstart = 25, K.max = 10, B = 100)
fviz_gap_stat(gap_stat)

A gap-statistic plot from clusGap over k = 1 to 10; the default rule marks three clusters with a dashed line, while the gap rises to a peak around four.

La ligne en pointillés marque le choix par défaut de la statistique de l’écart (règle à 1 erreur standard) — ici 3 regroupements. Mais l’écart continue de grimper jusqu’à un pic net à 4, que le coude et la silhouette favorisent également sur ces données. Quand les règles divergent d’une unité comme ici, c’est l’interprétation qui l’emporte : nous regrouperons en 4.

Pour aller plus loin : Déterminer le nombre optimal de regroupements couvre la statistique de l’écart aux côtés du coude, de la silhouette et des 30 indices de NbClust() — les trois méthodes incontournables.

Étape 4 — Lancer k-means

Maintenant le clustering proprement dit. K-means partitionne les États en k = 4 groupes en assignant itérativement chaque État au centre de regroupement le plus proche et en recalculant les centres jusqu’à ce qu’ils cessent de bouger. Un argument important : nstart = 25 lance l’algorithme à partir de 25 départs aléatoires et conserve le meilleur — k-means peut tomber sur une mauvaise solution locale, et plusieurs départs rendent le résultat stable et reproductible (avec set.seed()).

set.seed(123)
km.res <- kmeans(df, centers = 4, nstart = 25)

# Which cluster each state landed in (first 8 states)
head(km.res$cluster, 8)
    Alabama      Alaska     Arizona    Arkansas  California    Colorado 
          3           2           2           3           2           2 
Connecticut    Delaware 
          1           1 

Visualisons les quatre groupes. fviz_cluster() trace les États sur les deux premières composantes principales (de sorte que quatre variables numériques se réduisent à une carte 2-D lisible) et dessine une ellipse de concentration autour de chaque regroupement :

fviz_cluster(
  km.res, data = df,
  palette = "jco",          # colorblind-safe journal palette
  ellipse.type = "convex",
  ggtheme = theme_minimal()
)

A factoextra cluster plot of the US Arrests data partitioned into four k-means clusters, each drawn with a colored concentration ellipse and state labels.

Les quatre regroupements se séparent nettement sur la carte — un signe visuel rapide que le groupement est pertinent. Mais « semble séparé » n’est pas une preuve. C’est l’objet de l’étape 5.

Pour aller plus loin : Clustering k-means en R décortique l’algorithme, nstart, les centres de regroupement et comment interpréter les assignations.

Étape 5 — Valider les regroupements (silhouette)

Un regroupement peut sembler net et être pourtant faux. La largeur de silhouette le valide numériquement : pour chaque observation, elle mesure à quel point ce point est proche de son propre regroupement par rapport au regroupement voisin le plus proche, sur une échelle de −1 à 1.

  • Proche de 1 — le point se situe confortablement à l’intérieur de son regroupement (bien regroupé).
  • Proche de 0 — le point est à la frontière entre deux regroupements.
  • En dessous de 0 — le point est probablement dans le mauvais regroupement.
sil <- silhouette(km.res$cluster, dist(df))
rownames(sil) <- rownames(USArrests)
fviz_silhouette(sil, palette = "jco", ggtheme = theme_minimal())
  cluster size ave.sil.width
1       1   16          0.34
2       2   13          0.27
3       3    8          0.39
4       4   13          0.37

A silhouette plot of the four k-means clusters of the US Arrests data, with most bars positive and a few short negative bars flagging boundary states.

Le graphique affiche la largeur de silhouette moyenne par regroupement et globale — plus elle est élevée, mieux vos groupes sont séparés. La plupart des barres sont confortablement positives, ce qui indique que la solution à 4 regroupements tient.

Quelques barres plongent en dessous de zéro : ces États sont mal assignés et pourraient mieux convenir à un regroupement voisin. Vous pouvez les lister directement :

neg <- which(sil[, "sil_width"] < 0)
sil[neg, , drop = FALSE]
         cluster neighbor   sil_width
Missouri       2        1 -0.07318144

Chaque ligne montre le regroupement assigné à l’État, son regroupement voisin le plus proche et sa largeur de silhouette (négative) — exactement les États à examiner si vous affinez l’analyse. Une poignée de valeurs négatives est normale ; si la plupart des points étaient négatifs, vous reverriez k ou l’algorithme.

Pour aller plus loin : Statistiques de validation des regroupements couvre la silhouette, l’indice de Dunn et les mesures internes/de stabilité qui confirment qu’un regroupement est réel.

Le flux de travail en un coup d’œil

Voilà tout le pipeline. L’orchestration est la leçon — exécutez ces cinq étapes, dans l’ordre, à chaque fois que vous regroupez :

Étape Question à laquelle elle répond Fonction Leçon complète
1. Préparer et standardiser Les variables sont-elles comparables ? scale() Mesures de distance
2. Regroupabilité Y a-t-il une vraie structure ? get_clust_tendency() Tendance au regroupement
3. k optimal Combien de regroupements ? clusGap() / fviz_gap_stat() Nombre optimal de regroupements
4. Regrouper Dans quel groupe se trouve chaque point ? kmeans() / fviz_cluster() Clustering k-means
5. Valider Les regroupements sont-ils réels ? silhouette() / fviz_silhouette() Statistiques de validation des regroupements

Remplacez kmeans par pam (k-médoïdes, robuste aux valeurs aberrantes) ou utilisez la classification hiérarchique lorsque vous voulez un dendrogramme plutôt qu’une partition plate — les étapes environnantes (standardiser → tester → choisir → valider) restent exactement les mêmes.

Conclusion

Une analyse de regroupement fiable, ce sont cinq étapes disciplinées, pas un seul appel de fonction : standardiser pour que les variables soient comparables, tester la regroupabilité pour ne pas regrouper du bruit, laisser la statistique de l’écart choisir k, lancer k-means et valider avec la silhouette. Sautez les garde-fous — le test de regroupabilité et la validation — et vous risquez de livrer des regroupements qui ne sont que des artefacts. Suivez la boucle et vos groupes voudront dire quelque chose.

Pour aller plus loin

🟢 Avec un agent IA

Demandez à Prova « lance une analyse de regroupement complète sur mes données — standardise, choisis k, k-means, silhouette » — elle répond avec du code que vous pouvez exécuter sur votre propre jeu de données. The runtime is the judge. Demander à Prova →

Cette page vous a-t-elle été utile ?

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

Citation

BibTeX
@online{kassambara2026,
  author = {Kassambara, Alboukadel},
  title = {Analyse de regroupement (clustering) en R : exemple complet},
  date = {2026-06-24},
  url = {https://www.datanovia.com/blog/cluster-analysis-in-r-example},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2026. “Analyse de regroupement (clustering) en R : exemple complet.” June 24. https://www.datanovia.com/blog/cluster-analysis-in-r-example.