Classification k-means en R : algorithme, visualisation et interprétation

Partitionnez vos données en k groupes, visualisez les regroupements et lisez le résultat

Un guide pratique de la classification k-means en R : standardisez vos données, exécutez kmeans() avec nstart pour une solution stable, accédez aux affectations de regroupement et aux centres, et visualisez les groupes avec fviz_cluster() de factoextra. Inclut comment choisir k et interpréter la sortie sur un exemple travaillé avec USArrests.

Date de publication

24 juin 2026

Modifié

8 juillet 2026

AstucePoints clés
  • Le k-means partitionne vos données en un nombre prédéfini de groupes (k) en minimisant la variation au sein de chaque regroupement.
  • Standardisez d’abord vos variables (scale()) — le k-means utilise des distances, donc une variable exprimée dans de grandes unités dominerait sinon.
  • Exécutez-le avec kmeans(df, centers = k, nstart = 25) ; nstart = 25 essaie 25 départs aléatoires et conserve le meilleur, ce qui rend le résultat stable.
  • Le résultat contient l’affectation de regroupement de chaque observation, les centres des regroupements (les moyennes) et les tailles des regroupements.
  • Visualisez les groupes avec fviz_cluster() de factoextra — il dessine les regroupements sur les deux premières composantes principales.
  • Choisissez k avec la méthode du coude (fviz_nbclust(..., method = "wss")) ; le coude de la courbe est un bon choix par défaut.
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

La classification k-means (MacQueen, 1967) est l’algorithme d’apprentissage automatique non supervisé le plus utilisé pour partitionner un jeu de données en un ensemble de k groupes (c.-à-d. k regroupements), où k est le nombre de groupes que vous choisissez à l’avance. Il répartit les observations en regroupements de sorte que les objets d’un même regroupement soient aussi semblables que possible (forte similarité intra-classe) et que les objets de regroupements différents soient aussi dissemblables que possible (faible similarité inter-classe). Chaque regroupement est représenté par son centre (le centroïde) — la moyenne des points qui lui sont affectés.

Utilisez-le quand vous voulez découvrir des groupes que vous n’avez pas étiquetés à l’avance : des clients aux habitudes d’achat similaires, des États américains aux profils de criminalité similaires, des patients partageant un même profil de marqueurs. Il est non supervisé — vous n’indiquez pas les groupes à l’algorithme, il les apprend à partir des données.

Cette leçon fait partie de la série Analyse de regroupement en R. Le k-means est l’une des méthodes de partitionnement ; ses proches parents sont PAM / k-medoids (plus robuste aux valeurs aberrantes) et CLARA (pour les grands jeux de données). La règle de similarité dont dépend chaque méthode est traitée dans mesures de distance pour le regroupement.

Les données

Nous utiliserons le jeu de données intégré USArrests : les arrestations pour 100 000 habitants pour Murder, Assault et Rape dans chacun des 50 États américains en 1973, plus le pourcentage de la population vivant en zone urbaine (UrbanPop). Il ne contient que des variables continues, ce qui est exactement ce dont le k-means a besoin (l’algorithme utilise les moyennes des variables).

Parce que les variables sont sur des échelles très différentes (Assault se compte en centaines, Murder est de l’ordre de l’unité), nous les standardisons d’abord avec scale(), de sorte que chacune ait une moyenne de 0 et un écart-type de 1. C’est important : le k-means travaille sur des distances, et sans standardisation la variable de forte amplitude dominerait le regroupement.

data("USArrests")        # Load the built-in data set
df <- scale(USArrests)   # Standardize every variable (mean 0, sd 1)

# View the first 3 rows of the scaled data
head(df, n = 3)
            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
NoteStandardisez toujours avant le k-means

La standardisation rend les variables comparables, de sorte que le regroupement n’est pas dicté par une unité arbitraire. Si vos données comportent des valeurs manquantes, supprimez-les ou imputez-les d’abord (df <- na.omit(df)) — le k-means ne peut pas gérer les NA.

Packages R requis

La fonction standard pour le k-means est kmeans() du package de base stats (toujours disponible). Pour dessiner un graphique de regroupements prêt à publier, nous utilisons factoextra :

install.packages("factoextra")
library(factoextra)

Combien de regroupements ? (un aperçu rapide)

Le k-means exige que vous précisiez k au départ, donc la première question naturelle est combien de regroupements les données réclament-elles ? Une réponse simple et populaire est la méthode du coude : exécutez le k-means pour une plage de k, tracez la somme totale des carrés intra-regroupement (wss) en fonction de k, et cherchez le coude (« elbow ») où ajouter un regroupement supplémentaire ne vous apporte plus grand-chose.

fviz_nbclust() de factoextra fait cela en un seul appel :

library(factoextra)
data("USArrests")
df <- scale(USArrests)

fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

Elbow plot of total within-cluster sum of squares versus number of clusters for the scaled USArrests data, with a marked bend at k equals 4.

La variation intra-regroupement chute fortement au début, puis s’aplatit. Le coude le plus net est à k = 4 : au-delà du quatrième regroupement, les groupes supplémentaires apportent peu. Nous classerons les États en 4 regroupements ci-dessous.

C’est la version rapide. Bien choisir k mérite plus d’un seul graphique — la silhouette et les statistiques d’écart (gap) sont souvent en désaccord avec le coude. Voir la leçon dédiée sur le nombre optimal de regroupements pour le traitement complet.

La recette k-means

Le k-means part de k centres choisis au hasard, donc des exécutions différentes peuvent aboutir à des solutions légèrement différentes. Deux réglages rendent le résultat fiable :

  • set.seed() — fixe le générateur de nombres aléatoires de R pour que vous (et votre lecteur) obteniez exactement les mêmes regroupements à chaque fois.
  • nstart = 25 — indique à R d’essayer 25 configurations de départ aléatoires différentes et de conserver celle qui présente la plus faible variation intra-regroupement. La valeur par défaut est nstart = 1 ; augmentez-la toujours (25 ou 50) pour un résultat stable et reproductible.

Avec cela en place, l’appel tient sur une seule ligne — kmeans(data, centers = k, nstart = 25) :

data("USArrests")
df <- scale(USArrests)

# Compute k-means with k = 4, 25 random starts
set.seed(123)
km.res <- kmeans(df, centers = 4, nstart = 25)

Accéder aux résultats

kmeans() renvoie une liste contenant tout ce dont vous avez besoin. Les trois éléments les plus utilisés sont l’affectation de regroupement (le groupe dans lequel chaque État a atterri), les centres des regroupements (le profil moyen de chaque groupe, en unités standardisées) et les tailles des regroupements :

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

# Cluster assignment for the first few states
head(km.res$cluster, 4)
 Alabama   Alaska  Arizona Arkansas 
       3        2        2        3 
# How many observations in each cluster
km.res$size
[1] 16 13  8 13
# Cluster centers (mean of each variable, scaled)
km.res$centers
      Murder    Assault   UrbanPop        Rape
1 -0.4894375 -0.3826001  0.5758298 -0.26165379
2  0.6950701  1.0394414  0.7226370  1.27693964
3  1.4118898  0.8743346 -0.8145211  0.01927104
4 -0.9615407 -1.1066010 -0.9301069 -0.96676331

La liste complète des composants vaut la peine d’être connue :

  • cluster — un vecteur d’entiers (1 à k) donnant le regroupement de chaque observation.
  • centers — une matrice de centres de regroupement (une ligne par regroupement, une colonne par variable).
  • size — le nombre d’observations dans chaque regroupement.
  • totss — la somme totale des carrés (variance totale dans les données).
  • withinss — la somme des carrés intra-regroupement, une valeur par regroupement.
  • tot.withinss — la somme totale des carrés intra-regroupement, sum(withinss) ; la quantité que le k-means minimise.
  • betweenss — la somme des carrés inter-regroupement, totss - tot.withinss.

Pour décrire les regroupements dans les unités originales et interprétables (arrestations pour 100 000, pourcentage urbain), calculez la moyenne de chaque variable par regroupement sur les données non standardisées avec la fonction de base R aggregate() :

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

# Mean of each ORIGINAL variable, by cluster
aggregate(USArrests, by = list(cluster = km.res$cluster), mean)
  cluster   Murder   Assault UrbanPop     Rape
1       1  5.65625 138.87500 73.87500 18.78125
2       2 10.81538 257.38462 76.00000 33.19231
3       3 13.93750 243.62500 53.75000 21.41250
4       4  3.60000  78.53846 52.07692 12.17692

La lecture de ces lignes raconte l’histoire : un regroupement réunit les États à forte criminalité et forte urbanisation ; un autre les États à faible criminalité ; les autres se situent entre les deux. Pour reporter les étiquettes sur vos données, attachez le vecteur de regroupement comme nouvelle colonne :

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

# Add the cluster label to each state
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
           Murder Assault UrbanPop Rape cluster
Alabama      13.2     236       58 21.2       3
Alaska       10.0     263       48 44.5       2
Arizona       8.1     294       80 31.0       2
Arkansas      8.8     190       50 19.5       3
California    9.0     276       91 40.6       2
Colorado      7.9     204       78 38.7       2

Visualiser les regroupements

C’est toujours une bonne idée de regarder les regroupements — pour vérifier k et pour comparer deux analyses. Mais USArrests a quatre variables, alors lesquelles mettriez-vous sur les axes d’un nuage de points ?

La solution standard est de réduire les dimensions avec l’analyse en composantes principales (ACP) : l’ACP condense les quatre variables en deux nouvelles (les deux premières composantes principales) qui capturent l’essentiel de la variation, et vous tracez les points sur celles-ci. fviz_cluster() fait l’ACP et le tracé pour vous — passez-lui le résultat du k-means et les données :

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

library(factoextra)
fviz_cluster(
  km.res, data = df,
  palette = "jco",            # colourblind-safe journal palette
  ellipse.type = "euclid",    # concentration ellipse around each cluster
  star.plot = TRUE,           # segments from each centroid to its members
  repel = TRUE,               # keep state labels from overlapping
  ggtheme = theme_minimal()
)

Cluster plot of the 50 US states coloured into four k-means clusters on the first two principal components, with concentration ellipses and state labels.

Chaque point est un État, positionné selon ses deux premières composantes principales et coloré selon son regroupement ; les ellipses délimitent chaque groupe et les segments en étoile relient les membres à leur centroïde. Les regroupements se séparent nettement — un signe rassurant que k = 4 décrit bien ces données. Les étiquettes des axes montrent quelle part de la variation chaque composante principale capture (Dim1, Dim2), de sorte que vous pouvez juger la fidélité de l’image en 2 dimensions.

Interpréter le résultat

En rassemblant les pièces, le k-means nous a donné quatre groupes interprétables d’États américains :

  • Le vecteur size vous indique combien d’États sont tombés dans chaque regroupement — surveillez les tout petits regroupements (un ou deux membres), qui signalent souvent des valeurs aberrantes plutôt qu’un vrai groupe.
  • Les centers (ou le tableau aggregate() en unités originales) sont le profil de chaque regroupement : lisez une ligne pour voir s’il s’agit du groupe à forte criminalité, du groupe sûr, ou de quelque chose entre les deux.
  • Le graphique de regroupements confirme que les groupes sont réellement séparés plutôt que des amas qui se chevauchent.
  • tot.withinss est le score de compacité que le k-means a minimisé ; le comparer entre différentes valeurs de k est exactement ce que le graphique du coude faisait ci-dessus.

Le k-means est rapide, simple et s’adapte à de très grands jeux de données. Ses principales limites : vous devez choisir k à l’avance, il est sensible à l’initialisation aléatoire (d’où nstart) et aux valeurs aberrantes, et il suppose des regroupements à peu près sphériques et de tailles égales. Quand ces hypothèses ne tiennent pas, tournez-vous vers PAM / k-medoids (robuste aux valeurs aberrantes) ou la classification hiérarchique (pas de k au départ, formes arbitraires via le lien d’agrégation).

Le k-means minimise la somme totale des carrés intra-regroupement. Pour un regroupement \(C_k\) de centroïde \(\mu_k\) (la moyenne de ses points), la variation intra-regroupement est

\[ W(C_k) = \sum_{x_i \in C_k} (x_i - \mu_k)^2 , \]

et la quantité que l’algorithme fait baisser sur l’ensemble des regroupements est

\[ tot.withinss = \sum_{k=1}^{K} W(C_k) = \sum_{k=1}^{K} \sum_{x_i \in C_k} (x_i - \mu_k)^2 . \]

Ici \(x_i\) est un point de données affecté au regroupement \(C_k\) et \(\mu_k\) est la moyenne de ce regroupement. L’algorithme standard Hartigan–Wong (Hartigan & Wong, 1979) atteint un minimum en itérant deux étapes jusqu’à ce que les affectations cessent de changer (l’idée de Lloyd) :

  1. Spécifiez k et choisissez k centres initiaux (des points aléatoires parmi les données).
  2. Étape d’affectation — affectez chaque observation à son centroïde le plus proche (la plus petite distance euclidienne).
  3. Étape de mise à jour — recalculez chaque centroïde comme la moyenne des points qui lui sont désormais affectés.
  4. Itérez les étapes 2–3 jusqu’à ce qu’aucune observation ne change de regroupement (convergence) ou que le nombre maximal d’itérations soit atteint.

Parce que le résultat dépend des centres de départ, l’algorithme ne garantit qu’un minimum local — ce qui est précisément pourquoi nstart > 1 (essayer plusieurs départs, garder le meilleur) compte.

Essayez en direct

Modifiez et exécutez le code ci-dessous dans votre navigateur — aucune installation nécessaire. Essayez de remplacer centers = 4 par un k différent, ou de substituer un autre jeu de données numérique, puis réexécutez et observez le graphique de regroupements se mettre à jour.

🟢 Avec un agent IA

Bloqué sur vos propres données ? Demandez à Prova « combien de regroupements mes données comptent-elles, et quels sont-ils ? » — elle répond avec du code R que vous pouvez exécuter sur votre jeu de données, puis vous aide à lire le graphique de regroupements et à décider de k. The runtime is the judge. Demandez à Prova →

Problèmes courants

  • Vous avez oublié de standardiser, et une variable domine. Si une seule variable de forte amplitude (p. ex. Assault) semble piloter chaque regroupement, vous avez sauté scale(). Le k-means regroupe sur des distances brutes — standardisez d’abord pour que chaque variable contribue équitablement : df <- scale(USArrests).
  • Les regroupements changent à chaque exécution. C’est l’initialisation aléatoire. Fixez une graine (set.seed(123)) pour la reproductibilité et augmentez nstart (p. ex. nstart = 25) pour que R conserve le meilleur de nombreux départs au lieu d’une seule exécution chanceuse ou malchanceuse.
  • Quelques points extrêmes forment leur propre regroupement. Le k-means est sensible aux valeurs aberrantes parce que les centroïdes sont des moyennes. Inspectez les petits regroupements ; s’il s’agit de valeurs aberrantes, envisagez PAM / k-medoids, qui utilise de vrais points de données (les medoids) comme centres et est bien plus robuste.
  • Les regroupements semblent étirés ou imbriqués, pas ronds. Le k-means suppose des regroupements à peu près sphériques et de taille égale. Pour des formes allongées ou arbitraires, essayez la classification hiérarchique ou une méthode basée sur la densité.

Questions fréquentes

Il n’y a pas de réponse unique — k est un choix de modélisation. Le guide le plus rapide est la méthode du coude (fviz_nbclust(df, kmeans, method = "wss")) : choisissez le k au coude de la courbe. Recoupez-le avec les méthodes de la silhouette et de la statistique d’écart (gap), qui suggèrent souvent une valeur différente. Voir la leçon nombre optimal de regroupements pour les trois.

Presque toujours, oui. Le k-means regroupe sur la distance euclidienne, donc une variable mesurée dans de grandes unités dominerait le résultat. Standardisez d’abord avec scale() (moyenne 0, sd 1) sauf si vos variables sont déjà sur la même échelle, comparable.

nstart est le nombre de configurations de départ aléatoires que R essaie. Le k-means ne trouve qu’un optimum local qui dépend de ses centres de départ, donc nstart = 25 l’exécute 25 fois et conserve la solution présentant la plus faible variation intra-regroupement. La valeur par défaut est 1 ; la porter à 25 ou 50 donne un résultat bien plus stable.

Le k-means exige que vous fixiez k à l’avance, est rapide et fonctionne bien pour de grands jeux de données avec des regroupements à peu près sphériques. La classification hiérarchique construit un arbre complet (dendrogramme) de groupes imbriqués, vous laisse choisir le nombre de regroupements après avoir vu l’arbre, et gère des formes de regroupement arbitraires — mais elle s’adapte mal aux très grands jeux de données. Voir la classification hiérarchique.

Utilisez PAM / k-medoids quand vos données comportent des valeurs aberrantes. Les centroïdes du k-means sont des moyennes, sur lesquelles les valeurs aberrantes tirent fortement ; PAM représente chaque regroupement par un vrai point de données (un medoid) et minimise une somme de dissimilarités, ce qui le rend bien plus robuste.

Testez vos connaissances

Utilisez les quatre mesures numériques du jeu de données intégré iris. Standardisez-les, exécutez le k-means avec k = 3 et nstart = 25, affichez les tailles de regroupement, et dessinez le graphique de regroupements. (Supprimez d’abord la colonne non numérique Species.)

Les colonnes numériques sont iris[, 1:4]. Standardisez-les, puis passez la matrice standardisée à kmeans() et à fviz_cluster().

library(factoextra)

# Numeric measurements only, scaled
df <- scale(iris[, 1:4])

set.seed(123)
km <- kmeans(df, centers = 3, nstart = 25)
km$size

fviz_cluster(km, data = df, palette = "jco",
             ellipse.type = "euclid", repel = TRUE,
             ggtheme = theme_minimal())

Les trois regroupements retrouvent assez bien les espèces d’iris — setosa se sépare nettement, tandis que versicolor et virginica se chevauchent un peu.

Vérification rapide. Votre collègue exécute kmeans(df, centers = 4) deux fois et obtient deux solutions de regroupement différentes. Quelle est la correction d’une ligne, et pourquoi fonctionne-t-elle ?

Ajoutez set.seed() pour la reproductibilité et nstart = 25. Le k-means part de centres aléatoires et n’atteint qu’un optimum local, donc des départs différents donnent des solutions différentes ; nstart = 25 essaie 25 départs et conserve le meilleur, et set.seed() rend les départs aléatoires répétables.

Conclusion

Vous avez standardisé les données, choisi k avec la méthode du coude, exécuté kmeans() avec nstart = 25 pour une solution stable, lu les affectations de regroupement, les centres et les tailles, et visualisé les quatre groupes avec fviz_cluster(). Le k-means est la méthode de partitionnement rapide et incontournable ; quand ses hypothèses sont mises à mal — valeurs aberrantes ou regroupements non sphériques — passez à PAM / k-medoids ou la classification hiérarchique. Pour fixer k rigoureusement, poursuivez avec le nombre optimal de regroupements.

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
Note

Cette leçon est reproductible : chaque figure a été produite par le code montré — modifiez n’importe quel bloc et exécutez-le, et le bac à sable + le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.

Références

  • MacQueen, J. (1967). Quelques méthodes pour la classification et l’analyse d’observations multivariées. Proceedings of the Fifth Berkeley Symposium on Mathematical Statistics and Probability.
  • Hartigan, J. A., & Wong, M. A. (1979). Algorithm AS 136: A K-Means Clustering Algorithm. Journal of the Royal Statistical Society, Series C (Applied Statistics), 28(1), 100–108.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Classification k-means en R : algorithme, visualisation et
    interprétation},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/clustering/kmeans},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Classification k-means en R : algorithme, visualisation et interprétation.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/kmeans.