---
title: "多次元尺度構成法（MDS）とは？主成分分析との違い、ストレス値の目安とPythonでの実例"
url: "https://www.issoh.co.jp/column/details/6105/"
published: 2025-03-31
updated: 2026-10-26
categories: ["データ分析・GA4"]
publisher: "株式会社一創"
---

# 多次元尺度構成法（MDS）とは？主成分分析との違い、ストレス値の目安とPythonでの実例

多次元尺度構成法（MDS：Multidimensional Scaling。多次元尺度法とも呼びます）は、対象どうしが「どれだけ似ていないか」を並べた非類似度の表から、2次元や3次元の点の配置（布置図）をつくる手法です。近い点ほど似ていて、遠い点ほど異なると地図のように読めます。この記事では、計量MDSと非計量MDSの違い、主成分分析・クラスター分析との使い分け、ストレス値の目安を整理したうえで、ヨーロッパ21都市の道路距離を scikit-learn 1.9.1 とRにかけた実測結果を載せます。

## まとめ：多次元尺度構成法の要点

- 入力は対象×対象の非類似度行列で、出力は距離をなるべく保った低次元の座標です。
- 距離の数値を使う計量MDSと、大小の順序だけを使う非計量MDS（nMDS）があります。アンケートの主観的な類似度なら非計量が基本です。
- 当てはまりはKruskalのStress-1で測り、0.05でgood、0.1でfair、0.2でpoorが目安です。
- 観測×変数の表から軸をつくる主成分分析と違い、MDSは距離しか無いデータでも地図にできます。ユークリッド距離を渡した古典的MDSは主成分分析と同じ座標になります。
- scikit-learn は1.8〜1.10で引数名と既定値が変わっています。古い書き方のコードは警告が出るか、黙って別の計算になります。

以下、定義、データの用意、手法の選び方、実測、実装の順に説明します。

## 多次元尺度構成法の定義と「多次元」の意味

### 非類似度行列から布置図をつくる手法

MDSに渡すのは、n個の対象のあらゆる組について「似ていなさ」を並べたn×nの行列です。対称で、対角（自分自身との距離）は0になります。MDSはこの値の大小をなるべく崩さないように、各対象へ2次元か3次元の座標を割り当てます。予測のための手法ではなく、対象間の構造を人が目で読める形にする探索・可視化の手法です。

手法の起源は心理学の測定論にあります。距離の数値をそのまま使う古典的MDSはTorgersonの[「Multidimensional Scaling: I. Theory and Method」（Psychometrika 17巻4号、1952年）](https://www.cambridge.org/core/journals/psychometrika/article/abs/multidimensional-scaling-i-theory-and-method/5A026426380B7639E7EA6D92D5DF19AB)、順序だけを使う非計量MDSはShepard（1962年）とKruskal（1964年）の論文で形になりました。「多次元尺度法」「多次元尺度構成法」「MDS」は同じ手法を指す訳語の違いです。

### 「多次元」が指すもの

「多次元」は、ものごとを特徴づける観点（次元）が多数あることを指します。日常語の「多次元的に考える」も、価格・品質・デザインのように複数の物差しで同時に見るという意味です。10項目のアンケートで評価された商品は10次元の情報を持ちますが、人が直接見られるのは3次元までです。MDSはこの多次元の関係を「対象どうしの距離」に一度まとめ、2次元の地図へ置き直します。そのため次元削減の手法の一つに数えられます。

## 入力データの用意：類似度アンケートと距離の計算

### 類似度を直接たずねる場合の質問数

「まぐろとサーモンはどのくらい似ていると感じますか」のように対ごとに評定してもらう方法では、質問数は対象数nに対してn(n−1)÷2になります。

| 対象数 | 対の数（質問数） |
| --- | -------- |
| 5   | 10       |
| 10  | 45       |
| 15  | 105      |
| 20  | 190      |

対象が倍になると質問数はおよそ4倍に増えます。10対象でも45問になるので、予備調査で回答時間と途中離脱を確かめ、負担が大きすぎるなら対を回答者ごとに割り振るか、次の項の「属性を評価してもらい距離を計算する」方式に切り替えます。評定は「とても似ている＝1〜全く似ていない＝5」のように、数字が大きいほど似ていない向きにそろえ、回答者の平均を行列に入れます。

### 数値データから距離を計算する場合

価格や機能の評価点のように観測×変数の表がある場合は、対象間の距離を計算して行列にします。単位が違う変数をそのまま混ぜると値の大きい変数が距離を支配するため、先に標準化します。量的な変数ならユークリッド距離、量的と質的が混ざるならGower距離、生物の種の個体数のようにゼロが多い表ならBray-Curtis非類似度がよく使われます。どの距離を選んだかで地図は変わるので、報告には距離の種類を必ず書きます。

## 計量MDSと非計量MDS（nMDS）の違い

MDSは、入力した値をどこまで数値として信用するかで2系統に分かれます。

| 観点      | 計量MDS             | 非計量MDS（nMDS）                |
| ------- | ----------------- | --------------------------- |
| 使う情報    | 距離の数値そのもの         | 距離の大小の順序だけ                  |
| 前提とする尺度 | 間隔尺度・比率尺度         | 順序尺度で足りる                    |
| 代表的な計算  | 固有値分解（古典的）、SMACOF | 単調回帰＋SMACOFなどの反復            |
| 起源      | Torgerson（1952）   | Shepard（1962）、Kruskal（1964） |
| 向くデータ   | 実測の距離、時間、費用       | 5段階評定、順位づけ、主観的類似度           |

計量MDSのうち古典的MDS（Torgersonの方法。生態学では主座標分析＝PCoAとも呼びます）は、距離行列の各要素を二乗し、二重中心化して−1/2を掛けた行列を固有値分解する方法で、ストレスを下げる反復計算は行いません。SMACOFによる計量MDSと非計量MDSは、点を少しずつ動かしてストレスを下げる反復計算です。

非計量MDSが「順序しか使わない」ことは実際に確かめられます。後述の21都市の道路距離を、平方根・対数（log1p）・順位に置き換えても大小の順序は変わりません。この3通りを非計量MDSにかけると、元の距離で得た配置とのProcrustes不一致（回転・拡大・反転をそろえたあとの残差。0なら一致）は0.0010・0.0013・0.0017で、配置はほぼ同じでした（順位変換では同じ距離に平均順位を割り当てています）。同じ置き換えを古典的MDSにかけると0.040・0.213・0.101までずれます。評定値の「1と2の差」と「4と5の差」が同じ重さだと言い切れないアンケートでは、非計量MDSを選ぶ理由がここにあります。

## ストレス値の目安と次元数の決め方

### KruskalのStress-1の基準

当てはまりの指標として広く使われるのがKruskalのStress-1です。布置図上の距離と、元の非類似度の順序を保つように当てはめた値とのずれの二乗和を、布置図上の距離の二乗和で割り、平方根をとったものです。0に近いほど元のデータをよく再現しています。言葉による目安は[Kruskal（1964、Psychometrika 29巻1号）](https://www.cambridge.org/core/journals/psychometrika/article/abs/multidimensional-scaling-by-optimizing-goodness-of-fit-to-a-nonmetric-hypothesis/60D38EAAC9DB3FD765AEDBECEB4F4333)に由来し、[scikit-learn のMDSのリファレンス](https://scikit-learn.org/1.9/modules/generated/sklearn.manifold.MDS.html)にも次の値で載っています。

| Stress-1 | Kruskalの評価       |
| -------- | ---------------- |
| 0.20     | poor（不良）         |
| 0.10     | fair（まずまず）       |
| 0.05     | good（良い）         |
| 0.025    | excellent（非常に良い） |
| 0        | perfect（完全）      |

これは経験則で、対象数が多いほどストレスは高く出やすくなります。また、Rの`MASS::isoMDS`はストレスをパーセントで返す（7.51なら0.0751）ので、ソフトを変えたときは単位を確認してから比べます。

### 次元数の選択とストレスの低下幅

次元を増やせばストレスは基本的に下がるので、「下げ止まる手前」を探します。21都市の道路距離に非計量MDSをかけると、Stress-1は1次元0.241、2次元0.060、3次元0.048、4次元0.039でした。1次元から2次元で4分の1になり、その先はわずかしか下がらないため、2次元を採ります。地理的な距離が2次元の地図でほぼ表せるという常識とも合います。

Rの`isoMDS`で同じことをすると、3次元6.58%に対して4次元7.70%と、次元を増やしたのにストレスが上がりました。初期値から抜け出せず局所解に止まったためです。次元別に比べるときは初期値を複数試すのが前提になります。

## ヨーロッパ21都市の道路距離によるMDSの実測

使ったのはR同梱のデータセット[eurodist](https://github.com/wch/r-source/blob/trunk/src/library/datasets/man/eurodist.Rd)です。アテネ、バルセロナ、パリ、ローマ、ストックホルムなど21都市の道路距離（km）で、210組の値が入っています。座標は与えず、距離だけから地図が戻るかを見ます。計算は2026年10月26日、Python 3.12＋scikit-learn 1.9.1と、DockerのR 4.6.1（MASS 7.3-66）で行いました。

### 古典的MDS：固有値と説明の割合

二重中心化した行列の固有値は、上位2つが19,538,377と11,856,555で、3番目（1,528,844）以降は桁が落ちます。一方で負の固有値が9個（最小−2,251,844）ありました。負の固有値は、この距離行列をユークリッド空間の点間距離として完全には再現できないことを示します。単に2次元では足りないという意味ではありません。Rの`cmdscale`が返す当てはまりの指標GOFは、負の固有値を絶対値で数えた場合0.754、正の固有値だけで割った場合0.868で、Pythonで固有値から計算した値と一致しました。2次元の配置（北が上になるよう2軸目の符号をそろえた値）は次のとおりで、アテネが東の端、ストックホルムが北の端、リスボンとジブラルタルが西の端に並び、地図の形がおおむね戻ります。

| 都市      | 1軸目   | 2軸目   |
| ------- | ----- | ----- |
| アテネ     | 2290  | −1799 |
| ローマ     | 709   | −1109 |
| ストックホルム | 839   | 1837  |
| ハンブルク   | 561   | 773   |
| パリ      | −157  | 211   |
| リスボン    | −1935 | −49   |
| ジブラルタル  | −2048 | −642  |

### 計量・非計量でのストレスの差と局所解

| 方法（2次元）                  | Stress-1 |
| ------------------------ | -------- |
| 古典的MDS（ClassicalMDS）     | 0.089    |
| 計量MDS（SMACOF）            | 0.072    |
| 非計量MDS（scikit-learn）     | 0.060    |
| 非計量MDS（R isoMDS 既定）      | 0.0751   |
| R isoMDS（sklearnの配置を初期値） | 0.0590   |

この実測では非計量MDSが最も低くなりました。ただし計量MDSは入力した距離そのものとのずれを、非計量MDSは順序を保って当てはめ直した値とのずれを測るので、数値の低さだけで手法の優劣は決まりません。scikit-learn の非計量の配置を、RのMASS::Shepardで単調回帰をかけ直してKruskalの式で測ると5.90%で、両者は同じ定義のStress-1です。それでもisoMDSが既定で7.51%にとどまったのは、古典的MDSの解を初期値にして局所解へ落ちたからで、scikit-learn の配置から始め直すと5.90%まで下がりました。

scikit-learn でも同じことが起きます。初期値をランダム、試行回数を1回（1.9からの既定値）にして乱数シードを20通り変えると、4本がStress-1 0.164〜0.235の局所解で止まりました。試行回数を4回にすると20本すべてが0.06前後に収まります。これはこのデータでの結果で、試行を増やせば最良の解に届く保証はありません。実務では`init="classical_mds"`の結果と、`init="random"`で`n_init`を4以上にした結果のストレスを比べ、低い方を採ります。なお`init="classical_mds"`のときは初期値が1通りに決まるため、`n_init`は無視されます。

### 布置図の軸の向きとソフト間の符号の違い

同じ古典的MDSでも、アテネの座標は scikit-learn で（2290、−1799）、Rで（2290、1799）と、2軸目の符号が逆でした。固有ベクトルの符号はどちらでも数学的に正しいためで、Rの[cmdscaleのヘルプ](https://search.r-project.org/R/refmans/stats/html/cmdscale.html)の例も「北を上にするため」2軸目に−1を掛けて描いています。MDSの軸は回転・反転しても同じ解で、軸そのものに意味はありません。読むのは点と点の相対的な近さだけで、軸に「価格」などの名前を付けたいなら、属性データとの相関を別に調べる必要があります。

## PythonとRでの実行方法（2026年10月時点）

### scikit-learn 1.9.1：改名された引数と既定値

scikit-learn のMDSは1.8から1.10にかけて引数が整理されています（[1.8の変更履歴](https://scikit-learn.org/stable/whats%5Fnew/v1.8.html)、1.9.1のリファレンス）。

| 項目               | 変更                      | 版               |
| ---------------- | ----------------------- | --------------- |
| 計量・非計量の切り替え      | metric → metric\_mds    | 1.8（旧名は1.10で廃止） |
| 距離行列を渡す指定        | dissimilarity → metric  | 1.8（旧名は1.10で削除） |
| 試行回数 n\_init の既定 | 4 → 1                   | 1.9             |
| 初期値 init の既定     | random → classical\_mds | 1.10で変更予定       |
| ClassicalMDS クラス | 新設                      | 1.8             |

距離行列から非計量MDSを求める現行の書き方は次のとおりです。

```
import numpy as np
from sklearn.manifold import MDS, ClassicalMDS

# 事前にRで write.csv(as.matrix(eurodist), "eurodist.csv") を実行して保存しておく
D = np.loadtxt("eurodist.csv", delimiter=",", skiprows=1, usecols=range(1, 22))
# D：対象×対象の非類似度行列（対称・対角0。21都市なので21×21）
cmds = ClassicalMDS(n_components=2, metric="precomputed").fit(D)
print(cmds.eigenvalues_)        # 上位2つの固有値

nmds = MDS(
    n_components=2,
    metric="precomputed",       # 距離行列を渡す（1.8で dissimilarity から改名）
    metric_mds=False,           # 非計量MDS（1.8で metric から改名）
    init="classical_mds",       # 古典的MDSで初期化。局所解回避の保証はない
    random_state=0,
).fit(D)
print(nmds.stress_)             # 非計量は既定で Stress-1 を返す
coords = nmds.embedding_        # 布置図の座標
```

古い書き方で特に危ないのは次の3つです。

- `MDS(dissimilarity="precomputed")`は1.9.1でも動きますが、FutureWarningが出て1.10で使えなくなります。
- `metric="precomputed"`を書き忘れると、正方行列を「21行×21列の観測データ」とみなしてユークリッド距離を計算し直します。出るのはUserWarningだけで、Stress-1は0.080と、正しい0.060とは別の答えが返りました。
- 非計量（`metric_mds=False`）では、非類似度が0の組は欠測として扱われます。「同じに見える」2つの対象に0を入れると、その組は計算から外れ、近くに置かれる保証がありません。区別したいなら0ではなく小さな正の値を入れます。

また、計量MDS（`metric_mds=True`）の`stress_`は既定で正規化前の生ストレスです。21都市では約336万という値になり、上の基準表とは比べられません。比べるなら`normalized_stress=True`を指定します。

### R：cmdscale・isoMDS・metaMDS・smacof

```
loc <- cmdscale(eurodist, k = 2, eig = TRUE)
loc$GOF                          # 0.754 0.868

library(MASS)
iso <- isoMDS(eurodist, k = 2)   # 非計量MDS。stress はパーセントで返る
```

古典的MDSは標準の`stats::cmdscale`、非計量MDSは[MASS（7.3-66）](https://cran.r-project.org/web/packages/MASS/refman/MASS.html)の`isoMDS`で足ります。生態学の群集データでは[vegan（2.7-6）](https://cran.r-project.org/web/packages/vegan/refman/vegan.html)の`metaMDS`が定番で、既定は`distance = "bray"`（Bray-Curtis）、`k = 2`、ランダムな初期値から最大20回やり直す`trymax = 20`、データの自動変換`autotransform = TRUE`です。複数回のやり直しが既定で組み込まれているので、上で見た局所解の問題を受けにくい作りです。個人差モデルまで扱うなら smacof（2.1-7）が`mds`や`smacofIndDiff`を提供しています。

## 主成分分析・クラスター分析・コレスポンデンス分析との違い

| 手法         | 入力         | 出力         | 答える問い             |
| ---------- | ---------- | ---------- | ----------------- |
| MDS        | 対象×対象の非類似度 | 対象の座標（地図）  | 何と何が近いか           |
| 主成分分析      | 観測×変数の数値   | 合成軸と得点     | どの変数の組み合わせで差が出るか  |
| クラスター分析    | 距離または観測×変数 | グループ分け、樹形図 | どこで区切れるか          |
| コレスポンデンス分析 | クロス集計表     | 行と列の同時布置   | どの属性がどのブランドと結びつくか |

[主成分分析](/column/details/5995/)との関係は数式で決まっています。観測×変数の表からユークリッド距離を計算して古典的MDSにかけると、主成分得点と同じ座標になります。50件×6変数の乱数データで確かめると、符号をそろえたあとの最大差は2.3×10⁻¹⁴で、計算誤差の範囲でした。したがって数値の表があり、軸の意味（どの変数が効いているか）まで知りたいなら主成分分析か[因子分析](/column/details/5496/)を使い、距離しか無いデータや順序しか信用できないデータのときにMDSを使う、という分担になります。

クラスター分析は同じ距離行列から「グループ」を出し、MDSは「地図」を出します。両者は併用されることが多く、MDSの布置図の上に[デンドログラム](/column/details/10574/)で切ったグループを色分けすると、どこで区切れているかと全体の位置関係を1枚で示せます。ブランド×イメージ語のクロス集計表から知覚マップを描くなら、MDSより[コレスポンデンス分析](/column/details/5888/)の方が直接的です。手法全体の選び方は[多変量解析の手法一覧](/column/details/6163/)にまとめています。

## MDSの用途：ブランドの知覚マップと心理学の個人差分析

### マーケティングの知覚マップ

消費者に競合ブランドの類似度を評定してもらいMDSにかけると、消費者の頭の中のブランドの位置関係が地図になります。近くに並ぶブランドどうしは、その調査の回答者に似ていると認識されています。購買の場面で実際に代替されるかは、購買データなどで別に確かめる必要があります。点の無い領域も、調査に含めたブランドが置かれていない領域というだけで、調査外のブランドや需要の有無はMDSからは分かりません。マーケティング活動全体の設計図に知覚の変化を書き込む[パーセプションフロー・モデル](/column/details/6345/)のような枠組みと組み合わせ、調査で裏を取る段階が別に必要です。布置図を月次の定例で更新する運用にするなら、アンケートや購買データの集計を分析基盤に載せる設計になります（[BIツール導入支援](/service/ai/bi/)）。

### 心理学の類似性判断とINDSCAL

心理学では、色・音・顔などの刺激の類似性判断や対人印象をMDSで地図にし、人が対象をどんな次元で区別しているかを探ります。回答者ごとに評定の重みが違うデータには、Carroll and Changの[INDSCAL（Psychometrika 35巻3号、1970年）](https://www.cambridge.org/core/journals/psychometrika/article/abs/analysis-of-individual-differences-in-multidimensional-scaling-via-an-nway-generalization-of-eckartyoung-decomposition/36B1823CCAD45E66C78F45A1FC5D3D01)があります。全員に共通する布置（共通空間）と、回答者ごとに各次元をどれだけ重く見るかの重みを同時に推定するので、「Aさんは横軸の違いを強く感じ、Bさんは縦軸を強く感じる」という差を保ったまま分析できます。Rでは[smacofのsmacofIndDiff](https://search.r-project.org/CRAN/refmans/smacof/html/smacofIndDiff.html)で`constraint = "indscal"`を指定します。

## 多次元尺度構成法の不採用条件

- 軸の意味を結論にしたいとき。MDSの軸は回転・反転しても同じ解で、上の実測でもソフトによって符号が逆でした。「横軸は価格」と読む根拠はMDSの中にはありません。
- 2次元のStress-1が0.2を超えるとき。poorの水準で、地図の近さを信じられません。次元を増やしても下がらないなら、データがそもそも低次元の地図に乗らないと判断します。
- 3次元を超える配置が必要なとき。4次元以上では「見て分かる」というMDS最大の利点が失われます。
- 対象数が数千を超えるとき。n×nの距離行列が必要で、対象数の二乗でメモリと計算が増えます。大量の点の可視化が目的ならt-SNEやUMAPの方が向きます（こちらは局所の近さを優先し、遠い点どうしの距離は保ちません）。
- 既知のグループへの判別や予測が目的のとき。MDSは探索の手法で、判別分析や回帰の代わりにはなりません。

## よくある質問

### 多次元尺度法と多次元尺度構成法は違う手法ですか？

同じ手法です。英語のMultidimensional Scaling（MDS）の訳語に「多次元尺度法」と「多次元尺度構成法」の2通りがあり、教科書や分野によって使い分けられているだけです。

### 多次元尺度構成法と主成分分析の違いは何ですか？

主成分分析は観測×変数の数値の表から分散の大きい合成軸をつくり、MDSは対象×対象の非類似度から距離を保つ座標をつくります。ユークリッド距離を渡した古典的MDSは主成分分析と同じ座標になりますが、距離しか無いデータや順序しか信用できないデータを扱えるのはMDSだけです。

### ストレス値はいくつ以下なら良いですか？

KruskalのStress-1で、0.2がpoor、0.1がfair、0.05がgood、0.025がexcellentという目安があります。対象数が多いほど高く出やすい経験則なので、次元数を変えたときの下がり方とあわせて判断します。Rの`isoMDS`はパーセントで返すため、7.5なら0.075と読み替えます。

### 非計量多次元尺度構成法（nMDS）をわかりやすく言うと？

「AとBよりAとCの方が似ている」という大小の順序だけを守って地図を描く方法です。距離の数値そのものは使わないので、5段階評定のように数字の間隔が保証されないデータに向きます。21都市の距離を順位に置き換えても、配置はほとんど変わりませんでした。

### 生態学ではPCAとNMDSをどう使い分けますか？

種の個体数の表のようにゼロが多いデータでは、ユークリッド距離を前提とするPCAより、Bray-Curtis非類似度を使うNMDSがよく選ばれます。Bray-Curtisは両方の地点にいない種を「似ている」根拠に数えないためです。Rのveganの`metaMDS`は既定でBray-Curtisと複数回の初期値のやり直しを使います。

## 関連記事

- [主成分分析とは？定義・仕組み・分析手順から導入判断まで実装目線で解説](/column/details/5995/)
- [コレスポンデンス分析とは？やり方・活用事例・主成分分析との違いを実装目線で解説](/column/details/5888/)
- [多変量解析とは？予測と要約で選ぶ手法一覧とビジネスでの使いどころ](/column/details/6163/)
- [因子分析とは？やり方・結果の見方を具体例でわかりやすく解説](/column/details/5496/)
- [デンドログラムとは？階層的クラスタリングの見方とクラスタ数の決め方](/column/details/10574/)

---

出典: [多次元尺度構成法（MDS）とは？主成分分析との違い、ストレス値の目安とPythonでの実例](<https://www.issoh.co.jp/column/details/6105/>)（株式会社一創）
