Mímisbrunnr知恵の泉

← 意思決定分析 一覧

🎓 レベル:標準 | 重要度:B(推奨)

📎 前提:多属性効用理論(MAUT) | 関連:重み付けと感度分析・線形代数(固有値・固有ベクトル)

要点(BLUF)

1. 一対比較:絶対値でなく相対で聞く

人は「コストの重要度は0.5」と直接答えるのは苦手ですが、「コストは性能より何倍重要か?」という2つずつの比較なら答えやすい。AHPはこの一対比較を全ペアで集め、整合的な重みに変換します。

比較は Saaty の9段階尺度(1=同等, 3=やや重要, 5=重要, 7=かなり, 9=極めて重要)で行い、nn 個の基準について n×nn\times n一対比較行列 AA を作ります。要素 aija_{ij} は「基準 ii は基準 jj の何倍重要か」、対角は1、aji=1/aija_{ji} = 1/a_{ij}(相反性)です。

A=(1351/3121/51/21)(コスト・性能・快適性)A = \begin{pmatrix} 1 & 3 & 5 \\ 1/3 & 1 & 2 \\ 1/5 & 1/2 & 1 \end{pmatrix} \quad (\text{コスト・性能・快適性})

この例は「コストは性能の3倍・快適性の5倍重要、性能は快適性の2倍重要」という判断を表します。

2. 主固有ベクトルで重みを求める

もし判断が完全に整合的なら aij=wi/wja_{ij} = w_i / w_j と書けて、Aw=nwA\mathbf{w} = n\mathbf{w}(固有値 nn)が成り立ちます。現実の判断は多少ブレるので、最大固有値 λmax\lambda_{\max} に対応する主固有ベクトルを重みとして採用します。

Aw=λmaxw,w を正規化 (kwk=1)A\mathbf{w} = \lambda_{\max}\mathbf{w}, \qquad \mathbf{w} \ \text{を正規化}\ \left(\textstyle\sum_k w_k = 1\right)
import numpy as np

A = np.array([
    [1,   3,   5],
    [1/3, 1,   2],
    [1/5, 1/2, 1],
])

eigvals, eigvecs = np.linalg.eig(A)
idx = np.argmax(eigvals.real)          # 最大固有値の位置
lam_max = eigvals.real[idx]
w = eigvecs[:, idx].real
w = w / w.sum()                        # 正規化して重みに

print("AHP 重み(コスト・性能・快適性):", np.round(w, 4))
print(f"lambda_max = {lam_max:.4f}")

出力:

AHP 重み(コスト・性能・快適性): [0.6483 0.2297 0.122 ]
lambda_max = 3.0037

出力の意味:一対比較から、コスト0.648・性能0.230・快適性0.122という重みが出ました。「コストは性能の約2.8倍重視」という結果は、入力した「コストは性能の3倍」とおおむね整合します。λmax=3.0037\lambda_{\max} = 3.0037 が基準数 n=3n=3 にとても近い——この近さが、判断の一貫性の指標になります。

3. 整合比 CR:判断の一貫性チェック

人の判断は完全に整合的ではありません。「AはBの2倍、BはCの2倍」なら整合性からAはCの4倍のはずですが、「AはCの3倍」と答えるズレが起きます。このズレを測るのが整合度指標 CI整合比 CR です。

CI=λmaxnn1,CR=CIRI\mathrm{CI} = \frac{\lambda_{\max} - n}{n - 1}, \qquad \mathrm{CR} = \frac{\mathrm{CI}}{\mathrm{RI}}

RI(ランダム整合性指標)はランダムな行列のCIの期待値で、n=3n=3 なら 0.58。CR<0.1\mathrm{CR} < 0.1 なら「判断は十分一貫している」と見なします。

import numpy as np

A = np.array([[1, 3, 5], [1/3, 1, 2], [1/5, 1/2, 1]])
lam_max = np.max(np.linalg.eigvals(A).real)
n = A.shape[0]

CI = (lam_max - n) / (n - 1)
RI = 0.58                       # n=3 のランダム整合性指標
CR = CI / RI
print(f"lambda_max = {lam_max:.4f}, CI = {CI:.4f}, CR = {CR:.4f}")
print("整合性:", "OK(CR < 0.1)" if CR < 0.1 else "要見直し(CR >= 0.1)")

出力:

lambda_max = 3.0037, CI = 0.0018, CR = 0.0032
整合性: OK(CR < 0.1)

出力の意味:CR=0.0032 で、しきい値0.1を大きく下回ります。この一対比較は非常に一貫しているので、得られた重みは信頼してよい、という判定です。もし CR が0.1を超えたら、矛盾した比較(どれが食い違っているか)を見直して入力し直します。CRは「あなたの判断、つじつまが合っていますか?」を機械的にチェックする安全弁です。

数式の直観的意味:なぜ固有ベクトルが重みか

整合的な行列なら aij=wi/wja_{ij} = w_i/w_j で、行列 AA はランク1(A=wwA = \mathbf{w}\mathbf{w}^{-\top} の形)になり、唯一の非ゼロ固有値が nn、その固有ベクトルが w\mathbf{w} です。判断にブレが入ると AA はランク1から少しずれ、λmax\lambda_{\max}nn より少し大きくなる。λmaxn\lambda_{\max} - n のはみ出しが、まさに非整合の大きさで、これをCIが拾います。主固有ベクトルは「ブレた比較データに最もよく合う wi/wjw_i/w_j 構造」を最小二乗的に取り出したもの——ペアごとの相対判断を、全体として整合する1本の重みベクトルに丸める操作です。これで得た重みを多属性効用理論(MAUT)の加重和に差し込めば、AHPとMAUTが連結します。

⚠️ よくある誤解

対応シミュレーション

本文のコードで一対比較行列の値を変えると、重みとCRが変わります。わざと矛盾した比較(例:a13a_{13} を整合値から大きくずらす)を入れると、CRが0.1を超えて警告が出ることを確認できます。

関連ノート