PAM : le clustering k-médoïdes en R

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.
Obtenez le livre — Practical Guide to Cluster Analysis in R (PDF)

Introduction

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).

Cette leçon fait partie de la série Analyse de clusters en R. PAM est l’une des méthodes de partitionnement, aux côtés des k-means et de CLARA (une variante de PAM pour les grandes données, traitée dans le clustering CLARA). La règle de similarité dont dépend chaque méthode est traitée dans les mesures de distance pour le clustering.

Comment fonctionne PAM

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 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

Packages R requis

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 estime k 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 :

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

fviz_nbclust(df, pam, method = "silhouette")

Average silhouette width plotted against the number of clusters for PAM on the scaled USArrests data, peaking at k equals 2.

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 = 2
pam.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 cluster
pam.res$medoids
               Murder    Assault   UrbanPop       Rape
New Mexico  0.8292944  1.3708088  0.3081225  1.1603196
Nebraska   -0.8008247 -0.8250772 -0.2445636 -0.5052109
# Cluster assignment for the first few states
head(pam.res$clustering)
   Alabama     Alaska    Arizona   Arkansas California   Colorado 
         1          1          1          2          1          1 

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 state
dd <- cbind(USArrests, cluster = pam.res$clustering)
head(dd, n = 3)
        Murder Assault UrbanPop Rape cluster
Alabama   13.2     236       58 21.2       1
Alaska    10.0     263       48 44.5       1
Arizona    8.1     294       80 31.0       1

Visualiser les regroupements

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() :

library(cluster)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
pam.res <- pam(df, 2)

fviz_cluster(
  pam.res,
  palette = "jco",          # colourblind-safe journal palette
  ellipse.type = "t",       # t-distribution concentration ellipse
  repel = TRUE,             # keep state labels from overlapping
  ggtheme = theme_minimal()
)

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

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.

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

\[ TD = \sum_{j=1}^{k} \; \sum_{x_i \in C_j} d(x_i, m_j) . \]

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

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.

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.

Utilisez la fonction pam() du package cluster : mettez vos données à l’échelle, puis appelez pam(df, k)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).

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.

La distance euclidienne par défaut convient à la plupart des données. Si vos données contiennent des valeurs aberrantes, passez à la distance de Manhattanpam(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

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.)

Les colonnes numériques sont iris[, 1:4]. Mettez-les à l’échelle, puis passez la matrice mise à l’échelle à pam() et à fviz_cluster().

library(cluster)
library(factoextra)

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

pam.res <- pam(df, 3)
pam.res$medoids

fviz_cluster(pam.res, palette = "jco",
             ellipse.type = "t", repel = TRUE,
             ggtheme = theme_minimal())

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 ?

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.

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 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.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {PAM : le clustering k-médoïdes en R},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/clustering/k-medoids-pam},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“PAM : le clustering k-médoïdes en R.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/clustering/k-medoids-pam.