Une alternative robuste aux k-means qui utilise de vrais points de données comme centres de regroupements
Un guide pratique du clustering PAM (k-médoïdes) en R : mettez vos données à l’échelle, estimez le nombre de regroupements, exécutez pam() du package cluster, lisez les médoïdes et les affectations de regroupements, et visualisez les groupes avec fviz_cluster() de factoextra sur un exemple détaillé USArrests — avec une règle claire indiquant quand utiliser PAM plutôt que les k-means.
Date de publication
24 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
PAM (Partitioning Around Medoids) est le clustering k-médoïdes : chaque regroupement est représenté par un véritable point de données — son médoïde — plutôt que par une moyenne calculée.
Parce que les médoïdes sont des observations réelles et centrales, PAM est une alternative robuste aux k-means : il est bien moins sensible au bruit et aux valeurs aberrantes.
Mettez d’abord vos variables à l’échelle (scale()) — comme les k-means, PAM travaille sur des distances, donc une variable à grande unité dominerait sinon.
Exécutez-le avec pam(df, k) du package cluster ; le résultat contient les médoïdes des regroupements et l’affectation de chaque observation à un regroupement.
Choisissez k avec la méthode de la silhouette (fviz_nbclust(df, pam, method = "silhouette")) ; le pic est un bon choix par défaut.
Visualisez les groupes avec fviz_cluster() de factoextra — il dessine les regroupements sur les deux premières composantes principales.
L’algorithme des k-médoïdes partitionne un jeu de données en k groupes, à la manière des k-means — mais avec une différence importante. Dans les k-means, chaque regroupement est résumé par son centre (la moyenne de ses points), une moyenne abstraite qui n’a pas besoin d’être une observation réelle. Dans les k-médoïdes, chaque regroupement est représenté par l’un de ses propres points de données : le médoïde, le membre le plus centralement situé du regroupement.
Un médoïde est l’objet d’un regroupement dont la dissimilarité moyenne à tous les autres membres est la plus faible — l’exemple le plus représentatif du groupe. L’usage des moyennes rend les k-means très sensibles aux valeurs aberrantes : une seule valeur extrême tire la moyenne, et avec elle les frontières du regroupement. PAM évite cela en choisissant des observations réelles et centrales comme centres, ce qui en fait une alternative robuste aux k-means — moins sensible au bruit et aux valeurs aberrantes.
Utilisez PAM lorsque vos données comportent des valeurs aberrantes que vous ne voulez pas supprimer, ou lorsqu’il est utile de pointer vers un membre représentatif réel de chaque regroupement (« cet État est le prototype de son groupe »). Comme les k-means, il exige de choisir k à l’avance. La méthode des k-médoïdes la plus courante est PAM — Partitioning Around Medoids (Kaufman & Rousseeuw, 1990).
PAM recherche k objets représentatifs — les médoïdes — parmi les observations du jeu de données, puis construit les regroupements en affectant chaque observation à son médoïde le plus proche. Il procède en deux phases :
Phase de construction — sélectionner k objets pour servir de médoïdes initiaux, calculer la matrice de dissimilarité, et affecter chaque objet à son médoïde le plus proche.
Phase d’échange — pour chaque médoïde, essayer de l’échanger avec un point non médoïde ; si l’échange abaisse la dissimilarité totale (la somme des distances de chaque objet à son médoïde le plus proche), le conserver. Répéter jusqu’à ce qu’ aucun échange n’améliore le résultat.
La quantité que PAM minimise est la somme des dissimilarités de toutes les observations à leur médoïde le plus proche — l’analogue, côté médoïde, de la somme des carrés intra-regroupement des k-means.
PAM travaille à partir d’une matrice de dissimilarités, et vous pouvez construire cette matrice avec l’une de ces deux métriques :
Distance euclidienne — la racine de la somme des carrés des différences (par défaut).
Distance de Manhattan — la somme des différences absolues.
En pratique, les deux donnent généralement des résultats similaires. Si vos données contiennent des valeurs aberrantes, la distance de Manhattan tend à être plus robuste, tandis que l’euclidienne est davantage influencée par les valeurs inhabituelles. Pour en savoir plus, consultez les mesures de distance pour le clustering.
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). Les quatre variables sont continues, ce dont PAM a besoin.
Parce que les variables sont sur des échelles très différentes (Assault se compte en centaines, Murder reste à un seul chiffre), nous les mettons à l’échelle d’abord avec scale(), pour que chacune ait une moyenne de 0 et un écart-type de 1. PAM regroupe sur des distances, donc sans mise à l’échelle la variable de grande magnitude dominerait :
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)
PAM réside dans le package cluster sous le nom pam(). Pour dessiner un graphique de regroupements prêt à publier, nous ajoutons factoextra :
install.packages(c("cluster", "factoextra"))
library(cluster)library(factoextra)
La fonction que vous appellerez est pam(), dont la forme simplifiée est :
pam(x, k, metric ="euclidean", stand =FALSE)
x — une matrice / un data frame de données numériques (les lignes sont les observations, les colonnes les variables), ou une matrice de dissimilarité (généralement la sortie de daisy() ou dist()).
k — le nombre de regroupements.
metric — la métrique de distance : "euclidean" ou "manhattan".
stand — si TRUE, les colonnes de x sont standardisées avant le calcul des dissimilarités (ignoré quand x est déjà une matrice de dissimilarité). Nous mettons plutôt à l’échelle en amont, donc nous le laissons à FALSE.
Note
La fonction pamk() du package fpc encapsule pam() et estimek pour vous, pour que vous n’ayez pas à choisir vous-même le nombre de regroupements. Nous utilisons pam() ici pour garder le choix de k explicite.
Combien de regroupements ? (un aperçu rapide)
PAM exige que vous spécifiiez k en amont, donc la première question est combien de regroupements les données réclament-elles ? Une bonne réponse pour PAM est la méthode de la silhouette moyenne : exécuter PAM pour une plage de k, tracer la largeur de silhouette moyenne en fonction de k, et retenir le k qui la maximise. Une largeur de silhouette moyenne élevée signifie que les observations se trouvent confortablement à l’intérieur de leur propre regroupement plutôt que près d’un voisin.
fviz_nbclust() de factoextra le fait en un seul appel — passez-lui pam comme fonction de clustering :
La silhouette moyenne est la plus élevée à k = 2, donc nous partitionnerons les États en 2 regroupements ci-dessous.
Ceci est la version rapide. Bien choisir k mérite plus d’un seul graphique — le coude et la statistique d’écart (gap) sont souvent en désaccord avec la silhouette. Consultez la leçon dédiée au nombre optimal de regroupements pour le traitement complet.
La recette PAM
Une fois k choisi, calculer PAM tient en une seule ligne — pam(data, k). Nous passons les données mises à l’échelle et k = 2 :
library(cluster)data("USArrests")df <-scale(USArrests)# Compute PAM with k = 2pam.res <-pam(df, 2)print(pam.res)
Medoids:
ID Murder Assault UrbanPop Rape
New Mexico 31 0.8292944 1.3708088 0.3081225 1.1603196
Nebraska 27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
Clustering vector:
Alabama Alaska Arizona Arkansas California
1 1 1 2 1
Colorado Connecticut Delaware Florida Georgia
1 2 2 1 1
Hawaii Idaho Illinois Indiana Iowa
2 2 1 2 2
Kansas Kentucky Louisiana Maine Maryland
2 2 1 2 1
Massachusetts Michigan Minnesota Mississippi Missouri
2 1 2 1 1
Montana Nebraska Nevada New Hampshire New Jersey
2 2 1 2 2
New Mexico New York North Carolina North Dakota Ohio
1 1 1 2 2
Oklahoma Oregon Pennsylvania Rhode Island South Carolina
2 2 2 2 1
South Dakota Tennessee Texas Utah Vermont
2 1 1 2 2
Virginia Washington West Virginia Wisconsin Wyoming
2 2 2 2 2
Objective function:
build swap
1.441358 1.368969
Available components:
[1] "medoids" "id.med" "clustering" "objective" "isolation"
[6] "clusinfo" "silinfo" "diss" "call" "data"
La sortie affichée montre deux choses que vous utiliserez constamment :
les médoïdes des regroupements — une matrice dont les lignes sont les médoïdes (les États représentatifs) et dont les colonnes sont les variables ; et
le vecteur de clustering — un entier (de 1 à k) pour chaque observation, donnant le regroupement auquel elle a été affectée.
Accéder aux résultats
Un objet pam() stocke tout sous forme de composantes nommées. Les deux que vous solliciterez le plus sont les médoïdes et le vecteur de clustering :
library(cluster)data("USArrests")df <-scale(USArrests)pam.res <-pam(df, 2)# Cluster medoids — the representative state for each clusterpam.res$medoids
Les médoïdes sont des États réels, non des moyennes abstraites — c’est tout l’intérêt des k-médoïdes. Pour reporter les étiquettes de regroupement sur vos données originales (non mises à l’échelle), liez le vecteur de clustering comme nouvelle colonne :
library(cluster)data("USArrests")df <-scale(USArrests)pam.res <-pam(df, 2)# Add the cluster label to each statedd <-cbind(USArrests, cluster = pam.res$clustering)head(dd, n =3)
Il vaut toujours la peine de regarder les regroupements. Mais USArrests a quatre variables, alors quelles deux 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() réalise l’ACP et le tracé pour vous — passez-lui le résultat de pam() :
Chaque point est un État, positionné par ses deux premières composantes principales et coloré selon son regroupement ; les ellipses délimitent chaque groupe. Les deux regroupements se séparent nettement — un signe rassurant que k = 2 décrit bien ces données. Les étiquettes d’axes (Dim1, Dim2) indiquent quelle part de variation chaque composante principale capture, pour que vous puissiez juger de la fidélité de l’image en 2D.
PAM ou k-means ? (l’indice de décision)
PAM et les k-means répondent à la même question — partitionner les données en k groupes — mais diffèrent dans la façon dont ils représentent un regroupement, et cela détermine quand utiliser chacun :
k-means
PAM (k-médoïdes)
Centre du regroupement
la moyenne (un point calculé)
un médoïde (une observation réelle)
Robustesse
sensible aux valeurs aberrantes (les moyennes se déplacent)
robuste — les médoïdes résistent aux valeurs aberrantes
Vitesse / échelle
très rapide, passe à l’échelle des grandes données
plus lent ; O(k(n−k)²) par itération
Idéal pour
des données grandes, propres, à peu près sphériques
des données plus petites avec des valeurs aberrantes, ou quand vous voulez un membre représentatif
La règle courte : optez pour PAM quand vos données comportent des valeurs aberrantes que vous ne voulez pas écarter, ou quand un membre représentatif réel de chaque regroupement est utile. Optez pour les k-means quand les données sont grandes et propres et que vous avez besoin de vitesse. Pour les grandes données avec valeurs aberrantes, utilisez le cousin évolutif de PAM — voir le clustering CLARA.
NoteLe coût que PAM minimise (facultatif)
PAM choisit l’ensemble des k médoïdes \(m_1, \dots, m_k\) qui minimise la dissimilarité totale de chaque observation à son médoïde le plus proche. Si \(C_j\) est le regroupement représenté par le médoïde \(m_j\) et \(d(x_i, m_j)\) est la distance entre l’observation \(x_i\) et ce médoïde, l’objectif est
Ici \(x_i\) est une observation affectée au regroupement \(C_j\) et \(m_j\) est le médoïde de ce regroupement — l’un des véritables points de données. Parce que \(m_j\) doit être un point de données (et non une moyenne calculée), une seule valeur aberrante peut rejoindre un regroupement sans pouvoir en tirer le centre comme elle tire un centroïde de k-means — ce qui est exactement pourquoi PAM est plus robuste. La phase d’échange atteint un minimum en testant de façon répétée si échanger un médoïde contre un non-médoïde abaisse \(TD\), et s’arrête quand aucun échange n’aide plus.
Essayez en direct
Modifiez et exécutez le code ci-dessous dans votre navigateur — aucune installation nécessaire. Essayez de changer k = 2 pour un nombre de regroupements différent, ou de remplacer la métrique par "manhattan" pour un ajustement plus robuste aux valeurs aberrantes, puis ré-exécutez et observez le graphique de regroupements se mettre à jour.
🟢 Avec un agent IA
Vous ne savez pas si vos données ont besoin de PAM ou des k-means ? Demandez à Prova« ai-je des valeurs aberrantes qui devraient me faire préférer les k-médoïdes ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre jeu de données, puis vous aide à lire les médoïdes et le graphique de regroupements. The runtime is the judge.Demander à Prova →
Problèmes courants
Vous avez oublié de mettre à l’échelle, et une variable domine. Si une seule variable de grande magnitude (par ex. Assault) semble piloter chaque regroupement, vous avez sauté scale(). PAM regroupe sur des distances — standardisez d’abord pour que chaque variable contribue équitablement : df <- scale(USArrests) (ou définissez pam(x, k, stand = TRUE)).
pam() est lent ou manque de mémoire sur de grandes données. PAM calcule et stocke une matrice de dissimilarité n × n, qui devient coûteuse pour des milliers d’observations. Pour les grands jeux de données, utilisez clara() — le cousin évolutif de PAM qui échantillonne les données — voir le clustering CLARA.
Les valeurs aberrantes semblent encore fausser le résultat. PAM est déjà robuste, mais vous pouvez aller plus loin en changeant la métrique : pam(df, k, metric = "manhattan"). La distance de Manhattan est moins influencée par les valeurs extrêmes que l’euclidienne.
Vous ne savez pas combien de regroupements demander. Exécutez d’abord le graphique de silhouette (fviz_nbclust(df, pam, method = "silhouette")), ou utilisez fpc::pamk(), qui estime k automatiquement.
Questions fréquentes
NoteQu’est-ce qu’un médoïde en clustering ?
Un médoïde est un véritable point de données qui représente un regroupement — précisément, le membre dont la dissimilarité moyenne à tous les autres membres du regroupement est la plus faible (l’observation la plus centrale). Il s’oppose au centroïde (utilisé par les k-means), qui est la moyenne calculée du regroupement et n’a pas besoin d’être un point de données réel.
NoteQuelle est la différence entre PAM (k-médoïdes) et k-means ?
Les deux partitionnent les données en k groupes, mais les k-means représentent chaque regroupement par sa moyenne (un centroïde), tandis que PAM le représente par un point de données réel et central (un médoïde). Parce que les moyennes sont tirées par les valeurs extrêmes, les k-means sont sensibles aux valeurs aberrantes ; PAM est plus robuste. Les k-means sont plus rapides et passent mieux à l’échelle ; PAM est le choix plus sûr quand vos données comportent des valeurs aberrantes.
NoteComment exécuter le clustering k-médoïdes en R ?
Utilisez la fonction pam() du package cluster : mettez vos données à l’échelle, puis appelez pam(df, k) où k est le nombre de regroupements. Inspectez pam.res$medoids pour les points représentatifs et pam.res$clustering pour les affectations de regroupement, et visualisez avec factoextra::fviz_cluster(pam.res).
NoteComment choisir le nombre de regroupements pour PAM ?
Utilisez la méthode de la silhouette moyenne : fviz_nbclust(df, pam, method = "silhouette") et retenez le k où la courbe atteint son pic. Vous pouvez recouper avec les méthodes du coude et de la statistique d’écart (gap) (voir la leçon nombre optimal de regroupements), ou laisser fpc::pamk() estimer k pour vous.
NoteQuelle métrique de distance utiliser avec pam() ?
La distance euclidienne par défaut convient à la plupart des données. Si vos données contiennent des valeurs aberrantes, passez à la distance de Manhattan — pam(df, k, metric = "manhattan") — qui est moins influencée par les valeurs extrêmes. En pratique, les deux donnent généralement des regroupements similaires.
Testez vos connaissances
ImportantExercice : regrouper les mesures iris avec PAM
Utilisez les quatre mesures numériques du jeu de données intégré iris. Mettez-les à l’échelle, exécutez pam() avec k = 3, affichez les médoïdes, et dessinez le graphique de regroupements. (Supprimez d’abord la colonne non numérique Species.)
AstuceIndice
Les colonnes numériques sont iris[, 1:4]. Mettez-les à l’échelle, puis passez la matrice mise à l’échelle à pam() et à fviz_cluster().
Les trois médoïdes sont trois fleurs réelles, une par regroupement ; setosa se sépare nettement, tandis que versicolor et virginica se chevauchent un peu.
Vérification rapide. Votre jeu de données comporte une poignée de valeurs aberrantes extrêmes que vous ne pouvez pas supprimer, et les k-means continuent à les placer dans leurs propres tout petits regroupements. Vers quelle méthode de partitionnement devriez-vous basculer, et pourquoi cela aide-t-il ?
NoteAfficher la réponse
Basculez vers PAM / k-médoïdes (pam()). Les centres des k-means sont des moyennes, sur lesquelles les valeurs aberrantes pèsent fortement. PAM représente chaque regroupement par un point de données réel et central (un médoïde) et minimise une somme de dissimilarités, de sorte qu’une seule valeur extrême peut rejoindre un regroupement sans en tirer le centre — rendant le résultat bien plus robuste aux valeurs aberrantes.
Conclusion
Vous avez mis les données à l’échelle, choisi k avec la méthode de la silhouette, exécuté pam() du package cluster, lu les médoïdes et les affectations de regroupement, et visualisé les deux groupes avec fviz_cluster(). PAM est la méthode de partitionnement robuste : en représentant chaque regroupement par une observation réelle et centrale, il résiste aux valeurs aberrantes qui faussent les k-means. Quand vos données deviennent trop grandes pour pam(), passez à son cousin évolutif CLARA ; 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 affiché — modifiez n’importe quel bloc et exécutez (Run), et le bac à sable + le quiz se ré-exécutent en direct dans votre navigateur. The runtime is the judge.
Références
Kaufman, L., & Rousseeuw, P. J. (1990). Finding Groups in Data: An Introduction to Cluster Analysis. Wiley.
Comment fonctionne PAM
PAM recherche
kobjets représentatifs — les médoïdes — parmi les observations du jeu de données, puis construit les regroupements en affectant chaque observation à son médoïde le plus proche. Il procède en deux phases :kobjets pour servir de médoïdes initiaux, calculer la matrice de dissimilarité, et affecter chaque objet à son médoïde le plus proche.La quantité que PAM minimise est la somme des dissimilarités de toutes les observations à leur médoïde le plus proche — l’analogue, côté médoïde, de la somme des carrés intra-regroupement des k-means.
PAM travaille à partir d’une matrice de dissimilarités, et vous pouvez construire cette matrice avec l’une de ces deux métriques :
En pratique, les deux donnent généralement des résultats similaires. Si vos données contiennent des valeurs aberrantes, la distance de Manhattan tend à être plus robuste, tandis que l’euclidienne est davantage influencée par les valeurs inhabituelles. Pour en savoir plus, consultez les mesures de distance pour le clustering.