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.
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 setdf <-scale(USArrests) # Standardize every variable (mean 0, sd 1)# View the first 3 rows of the scaled datahead(df, n =3)
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 :
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 startsset.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 stateshead(km.res$cluster, 4)
Alabama Alaska Arizona Arkansas
3 2 2 3
# How many observations in each clusterkm.res$size
[1] 16 13 8 13
# Cluster centers (mean of each variable, scaled)km.res$centers
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 clusteraggregate(USArrests, by =list(cluster = km.res$cluster), mean)
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 statedd <-cbind(USArrests, cluster = km.res$cluster)head(dd)
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 paletteellipse.type ="euclid", # concentration ellipse around each clusterstar.plot =TRUE, # segments from each centroid to its membersrepel =TRUE, # keep state labels from overlappingggtheme =theme_minimal())
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).
NoteL’algorithme derrière le k-means (optionnel)
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
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) :
Spécifiez k et choisissez k centres initiaux (des points aléatoires parmi les données).
Étape d’affectation — affectez chaque observation à son centroïde le plus proche (la plus petite distance euclidienne).
Étape de mise à jour — recalculez chaque centroïde comme la moyenne des points qui lui sont désormais affectés.
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
NoteComment choisir le nombre de regroupements (k) pour le k-means ?
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.
NoteDois-je standardiser mes données avant le k-means ?
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.
NoteQue fait l’argument nstart dans kmeans() ?
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.
NoteQuelle est la différence entre le k-means et la classification hiérarchique ?
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.
NoteQuand devrais-je utiliser PAM (k-medoids) plutôt que le k-means ?
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
ImportantExercice : regrouper les mesures d’iris
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.)
AstuceIndice
Les colonnes numériques sont iris[, 1:4]. Standardisez-les, puis passez la matrice standardisée à kmeans() et à fviz_cluster().
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 ?
NoteAfficher la réponse
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.
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.
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.
@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}
}