Positionnement multidimensionnel (MDS) en R

Transformez une matrice de distances en une carte 2-D où les objets similaires se trouvent proches — MDS classique, non métrique et basé sur la corrélation

Un guide pratique du positionnement multidimensionnel (MDS) en R : partez d’une matrice de distances/dissimilarités et trouvez une carte de faible dimension qui la préserve. Calculez le MDS classique (métrique) avec cmdscale(), le MDS non métrique avec MASS::isoMDS() et MASS::sammon(), et un MDS basé sur la corrélation, puis tracez et interprétez chaque carte avec ggpubr::ggscatter(). Appliqué aux données swiss.

Date de publication

24 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Le positionnement multidimensionnel (MDS) prend une matrice de distances / dissimilarités et trouve une carte de faible dimension (en général 2-D) où les distances entre les points correspondent aux dissimilarités d’origine — pour que vous puissiez voir quels objets sont similaires.
  • C’est le cousin de l’ACP, mais il part des distances, et non de la matrice brute des variables — ce qui en fait le bon outil lorsque tout ce dont vous disposez est une matrice de dissimilarités.
  • Le MDS classique (métrique) avec cmdscale() [stats] préserve les valeurs réelles des distances ; on l’appelle aussi analyse en coordonnées principales et il convient le mieux aux données quantitatives.
  • Le MDS non métrique (ordinal) avec MASS::isoMDS() (Kruskal) et MASS::sammon() préserve uniquement l’ordre des rangs des distances — utilisez-le pour des données qualitatives ou ordinales.
  • Tracez n’importe quel résultat de MDS avec ggpubr::ggscatter() — étiquetez les points, colorez selon un groupement, ajoutez des ellipses.
  • Le MDS révèle aussi la structure d’une matrice de corrélation : transformez la corrélation en distance avec 1 - cor et cartographiez-la ; les variables corrélées positivement se retrouvent proches les unes des autres.
Obtenez le livre — Principal Component Methods in R (PDF)

Introduction

Le positionnement multidimensionnel (MDS) est une technique multivariée pour visualiser la similarité (ou la dissimilarité) entre objets. Il prend les distances entre chaque paire d’objets et trouve une configuration de points dans un espace de faible dimension — en général un nuage de points 2-D — où les distances sur la carte reproduisent les distances d’origine aussi fidèlement que possible. Les objets similaires finissent proches les uns des autres ; les objets dissimilaires finissent éloignés.

L’entrée du MDS est une matrice de dissimilarités — les distances par paires entre vos objets. Vous choisissez à l’avance le nombre de dimensions de sortie k (k = 2 donne la carte bidimensionnelle familière). Le MDS renvoie ensuite un placement optimal des points pour ce k.

Si cela ressemble à l’ACP, c’est étroitement lié — mais avec une différence essentielle. L’ACP part des variables et cherche les directions de variance maximale ; le MDS part des distances et cherche à préserver les relations entre les objets. Utilisez le MDS lorsque :

  • vous disposez (ou pouvez calculer) une matrice de distances / dissimilarités et voulez voir la structure des objets ;
  • vos données sont non numériques ou ordinales, où seul le classement des dissimilarités a un sens (MDS non métrique) ;
  • vous voulez visualiser comment les variables sont liées en cartographiant une matrice de corrélation.

Cette leçon fait partie de la série Réduction de dimension. Nous calculons le MDS avec cmdscale() en base-R et MASS (isoMDS, sammon), et traçons chaque carte avec la fonction ggscatter() de ggpubr.

Types d’algorithmes de MDS

Il existe deux grandes familles :

  1. Positionnement multidimensionnel classique (métrique). Préserve aussi fidèlement que possible la métrique des distances d’origine — les distances ajustées sur la carte MDS et les distances d’origine sont à la même échelle. On l’appelle aussi analyse en coordonnées principales (PCoA) et il convient aux données quantitatives. Calculez-le avec cmdscale().

  2. Positionnement multidimensionnel non métrique (ordinal). Ici, la valeur d’une distance importe moins que son rang par rapport aux autres distances. Le MDS ordinal construit des distances ajustées qui partagent le même ordre de rangs que les distances d’origine : si les objets 1 et 5 forment la cinquième paire la plus distante dans l’entrée, ils devraient être la cinquième paire la plus distante sur la carte. Il convient aux données qualitatives / ordinales. Calculez-le avec MASS::isoMDS() (Kruskal) ou MASS::sammon().

Les fonctions R que vous utiliserez :

  • cmdscale() [stats] — MDS classique (métrique).
  • isoMDS() [MASS] — MDS non métrique de Kruskal.
  • sammon() [MASS] — cartographie non linéaire de Sammon (une variante non métrique).

Les trois prennent un objet de distance comme argument principal, et k fixe le nombre de dimensions de sortie (par défaut k = 2).

Les données

Nous utiliserons le jeu de données intégré swiss : des indicateurs standardisés de fécondité et socio-économiques pour 47 provinces francophones de Suisse (vers 1888), mesurés sur six variables.

data("swiss")
head(swiss)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
Neuveville        76.9        43.5          17        15     5.16
Porrentruy        76.1        35.3           9         7    90.57
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
Neuveville               20.6
Porrentruy               26.6

Chaque ligne est une province — c’est ce que nous voulons positionner sur la carte. Le MDS travaille sur les distances entre les lignes, donc la première étape consiste toujours à calculer une matrice de distances.

NoteLe MDS part d’une matrice de distances

cmdscale(), isoMDS() et sammon() ne prennent pas le data frame brut — ils prennent un objet dist. dist(swiss) calcule les distances euclidiennes par paires entre les 47 provinces. Si vos variables sont sur des échelles différentes, standardisez d’abord (scale()), car la distance euclidienne est sensible à l’échelle ; les indicateurs swiss sont déjà comparables, nous les utilisons donc directement.

MDS classique (métrique)

Le MDS classique est le choix par défaut pour les données quantitatives. cmdscale() prend l’objet de distance et renvoie une matrice de coordonnées de points — une ligne par province, une colonne par dimension demandée (deux par défaut). Nous calculons les distances, exécutons cmdscale(), et organisons le résultat en un data frame avec des colonnes de dimensions nommées :

library(ggpubr)
data("swiss")

# Compute the distance matrix, then classical MDS (2 dimensions)
mds <- cmdscale(dist(swiss))
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

head(mds)
                  Dim.1      Dim.2
Courtelary    37.032433 -17.434879
Delemont     -42.797334 -14.687668
Franches-Mnt -51.081639 -19.274036
Moutier        7.716707  -5.458722
Neuveville    35.032658   5.126097
Porrentruy   -44.161953 -25.922412

Chaque province a maintenant une coordonnée Dim.1 et Dim.2 — sa position sur la carte 2-D. Tracez-les avec ggscatter(), en étiquetant chaque point avec le nom de la province :

library(ggpubr)
data("swiss")

mds <- cmdscale(dist(swiss))
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

ggscatter(mds, x = "Dim.1", y = "Dim.2",
          label = rownames(swiss),
          size = 1,
          repel = TRUE)

Classical MDS map of the 47 swiss provinces plotted on dimensions 1 and 2 with ggscatter, each point labelled with its province name; provinces with similar socio-economic profiles sit close together.

Lisez-la comme n’importe quelle carte de similarité : les provinces proches les unes des autres ont des profils socio-économiques similaires ; les provinces éloignées sont dissimilaires. Les axes eux-mêmes n’ont aucune signification intrinsèque (contrairement aux composantes de l’ACP) — ce qui compte, ce sont les distances relatives entre les points.

Colorer les points par groupe

La carte devient plus informative dès que vous colorez les points selon un groupement. Sans groupe prêt à l’emploi dans swiss, une approche courante consiste à regrouper les coordonnées MDS avec les k-moyennes et à colorer selon le regroupement obtenu. Nous demandons 3 groupes et ajoutons une ellipse d’enveloppe convexe autour de chacun :

library(ggpubr)
data("swiss")

mds <- cmdscale(dist(swiss))
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

# 3 groups via k-means on the MDS coordinates
set.seed(123)
clust <- as.factor(kmeans(mds, 3)$cluster)
mds$groups <- clust

ggscatter(mds, x = "Dim.1", y = "Dim.2",
          label = rownames(swiss),
          color = "groups",
          palette = "jco",
          size = 1,
          ellipse = TRUE,
          ellipse.type = "convex",
          repel = TRUE)

Classical MDS map of the swiss provinces coloured into three k-means clusters using a colourblind-safe journal palette, each cluster wrapped in a convex-hull ellipse.

Les trois regroupements marquent des provinces aux profils de fécondité / socio-économiques globalement similaires. (Les k-moyennes partent de centres aléatoires, donc set.seed() rend le groupement reproductible.)

MDS non métrique

Lorsque la métrique des distances n’a pas de sens — seul leur ordre de rangs en a — passez au MDS non métrique. Deux fonctions de MASS l’implémentent.

MDS non métrique de Kruskal — isoMDS()

isoMDS() renvoie une liste ; les coordonnées se trouvent dans son élément $points. Le flux de travail reproduit le cas classique — matrice de distances en entrée, coordonnées en sortie — puis nous traçons avec ggscatter() :

library(ggpubr)
library(MASS)
data("swiss")

# Kruskal's non-metric MDS
mds <- isoMDS(dist(swiss))$points
initial  value 5.463800 
iter   5 value 4.499103
iter   5 value 4.495335
iter   5 value 4.492669
final  value 4.492669 
converged
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

ggscatter(mds, x = "Dim.1", y = "Dim.2",
          label = rownames(swiss),
          size = 1,
          repel = TRUE)

Kruskal non-metric MDS map of the swiss provinces from MASS isoMDS, plotted on two dimensions with ggscatter and labelled by province; the layout is close to the classical MDS map up to orientation.

isoMDS() affiche le stress au fil de ses itérations — un stress final plus faible signifie que la carte reproduit mieux l’ordre des rangs des distances. La carte obtenue ressemble beaucoup à la carte classique ici, car swiss est réellement quantitatif ; la différence apparaît lorsque seuls les rangs sont fiables.

Cartographie non linéaire de Sammon — sammon()

sammon() est une autre variante non métrique. Elle utilise un critère de stress qui pondère plus fortement les petites distances, donc elle préserve particulièrement bien la structure locale (les voisins proches). Même schéma — les coordonnées vivent dans $points :

library(ggpubr)
library(MASS)
data("swiss")

# Sammon's non-linear mapping
mds <- sammon(dist(swiss))$points
Initial stress        : 0.01959
stress after   0 iters: 0.01959
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

ggscatter(mds, x = "Dim.1", y = "Dim.2",
          label = rownames(swiss),
          size = 1,
          repel = TRUE)

Sammon non-linear mapping of the swiss provinces from MASS sammon, plotted on two dimensions with ggscatter and labelled by province; local neighbourhoods of similar provinces are preserved.

Visualiser une matrice de corrélation avec le MDS

Le MDS n’est pas réservé aux observations — il peut révéler une structure cachée dans une matrice de corrélation en cartographiant les variables. L’astuce : une corrélation mesure une similarité, mais le MDS a besoin d’une dissimilarité. Convertissez l’une en l’autre avec 1 - cor, pour que les variables fortement corrélées positivement deviennent proches.

Ici, nous cartographions les variables de mtcars, en utilisant la corrélation de Spearman :

library(ggpubr)
data("mtcars")

# Spearman correlation, then turn it into a distance: 1 - cor
res.cor <- cor(mtcars, method = "spearman")
mds.cor  <- cmdscale(1 - res.cor)
mds.cor  <- as.data.frame(mds.cor)
colnames(mds.cor) <- c("Dim.1", "Dim.2")

ggscatter(mds.cor, x = "Dim.1", y = "Dim.2",
          size = 1,
          label = colnames(res.cor),
          repel = TRUE)

MDS map of the mtcars variables built from a Spearman correlation matrix turned into distances with one minus correlation; positively correlated variables such as cyl, disp and hp cluster together, opposite mpg and drat.

Les variables corrélées positivement se trouvent proches les unes des autres du même côté du graphique ; les variables qui corrèlent négativement se retrouvent sur des côtés opposés. Ainsi cyl, disp, hp et wt se regroupent (voitures lourdes et puissantes), à l’opposé de mpg et drat — exactement la redondance à laquelle on s’attend.

MDS vs ACP

Le MDS et l’ACP sont mathématiquement proches — en fait, le MDS classique sur des distances euclidiennes donne la même configuration que l’ACP (à une réflexion/rotation près). La différence tient à ce sur quoi ils se concentrent :

  • L’ACP concerne les dimensions : elle travaille sur la covariance/corrélation des variables et cherche les directions de variance maximale, donnant des composantes interprétables (saturations, un cercle de corrélation). Utilisez-la lorsque vous avez la matrice numérique brute et voulez interpréter les axes.
  • Le MDS concerne les relations entre objets : il travaille sur une matrice de distances et cherche à préserver ces distances sur une carte de faible dimension. Utilisez-le lorsque tout ce dont vous disposez est une matrice de dissimilarités, ou lorsque vos données sont ordinales/qualitatives (MDS non métrique).

Donc : même famille, point d’entrée différent. Vous voulez la structure des variables et des axes interprétables ? Tournez-vous vers l’ACP. Vous avez des distances (ou seulement des rangs) et voulez cartographier les objets ? Tournez-vous vers le MDS.

Le MDS classique récupère les coordonnées des points à partir d’une matrice de distances par une décomposition propre — c’est pourquoi il coïncide avec l’ACP sur des distances euclidiennes.

Partez de la matrice des distances au carré \(D^{(2)}\) (entrées \(d_{ij}^2\)). Double-centrez-la avec la matrice de centrage \(J = I - \tfrac{1}{n}\mathbf{1}\mathbf{1}^{\top}\) pour obtenir

\[ B = -\tfrac{1}{2}\, J\, D^{(2)}\, J . \]

\(B\) est la matrice des produits scalaires des coordonnées centrées (inconnues). Sa décomposition propre \(B = V \Lambda V^{\top}\), en conservant les \(k\) plus grandes valeurs propres positives, donne les coordonnées

\[ X_k = V_k\, \Lambda_k^{1/2}, \]

la configuration en \(k\) dimensions. Les valeurs propres \(\lambda_1 \ge \lambda_2 \ge \dots\) jouent le rôle que jouent les variances en ACP — des valeurs propres plus grandes signifient que ces axes portent davantage de la structure de distance d’origine, donc les deux premières suffisent en général pour une carte lisible.

Essayez en direct

Exécutez le MDS dans votre navigateur — sans installation. Essayez une autre distance (par ex. dist(swiss, method = "manhattan")), demandez k = 3 dimensions, ou remplacez swiss par un autre jeu de données numérique, puis relancez et observez la carte changer.

🟢 Avec un agent IA

Vous avez votre propre matrice de distances ou table de données ? Demandez à Prova « calcule un MDS sur mes données, choisis entre métrique et non métrique, et dis-moi quels objets se regroupent. » — elle répond avec du code R que vous pouvez exécuter sur vos propres données, puis vous aide à lire la carte. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Vous avez passé un data frame au lieu d’une distance. cmdscale(), isoMDS() et sammon() attendent un objet dist, et non la table brute. Enveloppez d’abord vos données dans dist() : cmdscale(dist(swiss)).
  • Une variable domine la carte. La distance euclidienne est sensible à l’échelle, donc une variable à grande échelle écrase les autres. Standardisez d’abord avec scale() avant dist() lorsque vos variables utilisent des unités différentes.
  • Vous ne savez pas s’il faut utiliser un MDS métrique ou non métrique. Utilisez le MDS classique/métrique (cmdscale) pour des données réellement quantitatives où les valeurs de distance ont un sens ; utilisez le MDS non métrique (isoMDS / sammon) lorsque seul l’ordre des rangs des dissimilarités est fiable (données ordinales ou qualitatives).
  • Vous vous attendiez à ce que les axes signifient quelque chose. Contrairement aux composantes de l’ACP, les dimensions du MDS n’ont aucune interprétation intrinsèque et la carte peut être librement pivotée ou réfléchie. Lisez les distances entre les points, et non les valeurs des axes ou le signe d’un point.

Questions fréquentes

Le positionnement multidimensionnel (MDS) est une technique qui prend une matrice de distances / dissimilarités entre objets et trouve une carte de faible dimension (en général 2-D) où les distances entre les points reproduisent les dissimilarités d’origine aussi fidèlement que possible. Les objets similaires finissent proches les uns des autres, de sorte que vous pouvez voir la structure de données en haute dimension ou ne comportant que des distances.

Pour le MDS classique (métrique), calculez une matrice de distances et passez-la à cmdscale() : cmdscale(dist(swiss)). Pour le MDS non métrique, utilisez MASS::isoMDS(dist(swiss)) ou MASS::sammon(dist(swiss)) et prenez l’élément $points. Tracez n’importe quel résultat avec ggpubr::ggscatter(), en étiquetant les points par nom de ligne.

Les deux réduisent la dimensionnalité, mais l’ACP part des variables (elle maximise la variance expliquée et donne des composantes interprétables), tandis que le MDS part d’une matrice de distances (il préserve les relations entre les objets). Sur des distances euclidiennes, le MDS classique donne la même configuration que l’ACP — ce sont la même famille, abordée par des côtés différents.

Le MDS classique (métrique) (cmdscale) préserve les valeurs réelles des distances et convient le mieux aux données quantitatives — on l’appelle aussi analyse en coordonnées principales. Le MDS non métrique (ordinal) (isoMDS, sammon) préserve uniquement l’ordre des rangs des distances, ce qui en fait le bon choix pour des données qualitatives ou ordinales où les distances exactes n’ont pas de sens.

cmdscale() réalise un MDS classique : donnez-lui un objet dist et il renvoie une matrice de coordonnées (une ligne par objet, k colonnes, par défaut k = 2). En interne, il double-centre la matrice des distances au carré et en calcule la décomposition propre, donc des valeurs propres plus grandes signifient des axes qui portent davantage de la structure de distance. Organisez la sortie avec as.data.frame() et renommez les colonnes avant de tracer.

Testez vos connaissances

Exécutez un MDS classique sur le jeu de données intégré USArrests (50 États américains, quatre variables de criminalité/urbanisation). Standardisez d’abord les variables, calculez la carte 2-D, puis tracez-la avec ggscatter(), en étiquetant chaque point avec le nom de l’État.

Standardisez avec scale(), puis cmdscale(dist(...)). Convertissez le résultat avec as.data.frame(), renommez les colonnes en Dim.1 / Dim.2, et étiquetez avec rownames(USArrests).

library(ggpubr)
data("USArrests")

# Standardize, then classical MDS
mds <- cmdscale(dist(scale(USArrests)))
mds <- as.data.frame(mds)
colnames(mds) <- c("Dim.1", "Dim.2")

ggscatter(mds, x = "Dim.1", y = "Dim.2",
          label = rownames(USArrests),
          size = 1,
          repel = TRUE)

Les États aux profils de criminalité/urbanisation similaires se trouvent proches les uns des autres sur la carte.

Vérification rapide. Vous calculez un MDS et remarquez que toute la carte est inversée en miroir par rapport à celle d’un collègue. Est-ce un bug ?

Non. Le MDS préserve uniquement les distances entre les points, donc la configuration peut être librement pivotée ou réfléchie sans que cela change sa signification — exactement comme le signe arbitraire d’une composante d’ACP. Lisez les distances relatives, et non l’orientation ou le signe d’un axe.

Conclusion

Vous avez calculé le positionnement multidimensionnel de trois manières : le MDS classique (métrique) avec cmdscale(), le MDS non métrique avec MASS::isoMDS() et MASS::sammon(), et un MDS basé sur la corrélation qui a transformé 1 - cor en distances pour cartographier les variables. Chacun part d’une matrice de distances et donne une carte 2-D où les objets similaires se trouvent proches les uns des autres, tracée avec ggpubr::ggscatter(). Le MDS est le membre orienté-distance de la boîte à outils de réduction de dimension — tournez-vous vers lui quand vous avez des dissimilarités plutôt qu’une matrice numérique propre, et tournez-vous vers l’ACP quand vous voulez des axes interprétables.

Leçons connexes

Vous préférez un livre ? Principal Component Methods 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 Réduction de dimension 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 lancez Run, et le bac à sable + l’exercice se réexécutent en direct dans votre navigateur. The runtime is the judge.

Références

  • Cox, T. F., & Cox, M. A. A. (2001). Multidimensional Scaling, 2nd ed. Chapman & Hall/CRC.
  • Kruskal, J. B. (1964). Multidimensional scaling by optimizing goodness of fit to a nonmetric hypothesis. Psychometrika, 29(1), 1–27.
  • Sammon, J. W. (1969). A nonlinear mapping for data structure analysis. IEEE Transactions on Computers, C-18(5), 401–409.
  • Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S, 4th ed. Springer (le paquet MASS).

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Positionnement multidimensionnel (MDS) en R},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/dimension-reduction/multidimensional-scaling},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Positionnement multidimensionnel (MDS) en R.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/dimension-reduction/multidimensional-scaling.