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.
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 :
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().
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.
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)
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)
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 coordinatesset.seed(123)clust <-as.factor(kmeans(mds, 3)$cluster)mds$groups <- clustggscatter(mds, x ="Dim.1", y ="Dim.2",label =rownames(swiss),color ="groups",palette ="jco",size =1,ellipse =TRUE,ellipse.type ="convex",repel =TRUE)
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() :
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)
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 :
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)
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 - corres.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)
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.
NoteLes mathématiques derrière le MDS classique (optionnel)
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
NoteQu’est-ce que le positionnement multidimensionnel ?
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.
NoteComment calculer un MDS en R ?
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.
NoteQuelle est la différence entre le MDS et l’ACP ?
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.
NoteQuelle est la différence entre le MDS classique et le MDS non métrique ?
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.
NoteComment fonctionne cmdscale() en R ?
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
ImportantExercice : MDS sur les données USArrests
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.
AstuceIndice
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).
AstuceSolution
library(ggpubr)data("USArrests")# Standardize, then classical MDSmds <-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 ?
NoteAfficher la réponse
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.
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.
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.
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).