Mímisbrunnr知恵の泉

← 意思決定分析 一覧

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

📎 前提:多目的問題とパレート最適期待効用と効用関数 | 関連:階層分析法(AHP)

要点(BLUF)

1. なぜ効用に変換するのか

属性は単位がバラバラです。コストは「円」、性能は「点」、快適性は「5段階」——このまま足せません。そこで各属性を、0〜1の部分効用(最悪が0、最良が1)に変換してから重み付けします。これは期待効用と効用関数の効用を、複数の属性に拡張したものです。

総合効用は加法形で書きます。

U(x)=k=1Kwkuk(xk),wk0, kwk=1U(x) = \sum_{k=1}^{K} w_k\, u_k(x_k), \qquad w_k \ge 0,\ \sum_k w_k = 1

uku_k が属性 kk の部分効用、wkw_k がその重み。U(x)U(x) が最大の代替案を選びます。

2. 正規化と加重和

最も単純な部分効用は、線形の正規化(min-max スケーリング) です。利得型(大きいほど良い)と費用型(小さいほど良い)で式が変わります。

uk利得=xkxkminxkmaxxkmin,uk費用=xkmaxxkxkmaxxkminu_k^{\text{利得}} = \frac{x_k - x_k^{\min}}{x_k^{\max} - x_k^{\min}}, \qquad u_k^{\text{費用}} = \frac{x_k^{\max} - x_k}{x_k^{\max} - x_k^{\min}}

車選びの例(A・B・C)を、コスト(費用型)・性能・快適性(利得型)で評価し、重み 0.5 / 0.3 / 0.2 で統合します。

import numpy as np

names = ["A", "B", "C"]
raw = {"A": {"コスト": 300, "性能": 90, "快適性": 70},
       "B": {"コスト": 150, "性能": 70, "快適性": 60},
       "C": {"コスト": 250, "性能": 80, "快適性": 85}}

def normalize(values, benefit=True):
    v = np.array(values, float)
    if benefit:                      # 大きいほど良い
        return (v - v.min()) / (v.max() - v.min())
    else:                            # 小さいほど良い(コスト)
        return (v.max() - v) / (v.max() - v.min())

norm = {
    "コスト":   normalize([raw[a]["コスト"] for a in names], benefit=False),
    "性能":     normalize([raw[a]["性能"] for a in names], benefit=True),
    "快適性":   normalize([raw[a]["快適性"] for a in names], benefit=True),
}
weights = np.array([0.5, 0.3, 0.2])   # コスト・性能・快適性

scores = []
for k, a in enumerate(names):
    u = np.array([norm["コスト"][k], norm["性能"][k], norm["快適性"][k]])
    s = np.dot(weights, u)
    scores.append(s)
    print(f"{a}: 部分効用={np.round(u,3)}  総合スコア={s:.3f}")
print("MAUT 最良案 ->", names[int(np.argmax(scores))])

出力:

A: 部分効用=[0.    1.    0.4  ]  総合スコア=0.380
B: 部分効用=[1.    0.    0.   ]  総合スコア=0.500
C: 部分効用=[0.333 0.5   1.   ]  総合スコア=0.517
MAUT 最良案 -> C

出力の意味:Bは最安なのでコストの部分効用が1(満点)ですが、性能・快適性が最低(0)で総合0.500。Cはどれも中庸〜高めでバランスが良く、総合0.517でわずかに勝ちます。Aは性能満点でもコストが最悪(0)で0.380。**「尖った最安B」より「バランスのCがわずかに上」**という、加重和ならではの折衷的な結論。ただしこの差0.017は僅差で、重みが少し変わればひっくり返ります(重み付けと感度分析で確認)。

3. 加法形が成り立つ条件:相互選好独立性

「各属性の効用を足す」加法形は、いつでも使えるわけではありません。正当化には相互選好独立性(mutual preferential independence) が必要です。ざっくり言うと、ある属性の好み(トレードオフ)が、他の属性の水準に依存しないこと。

独立性が破れると、属性間の相乗・相殺効果を捉える乗法形や、より一般の効用関数が要ります。実務では加法形を第一近似として使い、独立性が怪しい属性は束ねる(1つの複合属性にする)などで対処します。重みと部分効用を分けて書ける加法形の透明さは、合意形成では大きな利点です。

数式の直観的意味:重みは「交換比率」

重み wkw_k は単なる重要度の数字ではなく、属性間の交換比率(トレードオフ率) を表します。正規化された効用空間で、属性 jj の効用を1単位下げる代わりに属性 kk の効用を wj/wkw_j/w_k 単位上げれば、総合効用は不変——これが加重和の等価線(無差別曲線)の傾きです。だから「コストの重み0.5」は「コストの満足を1減らすのを、性能の満足 0.5/0.31.670.5/0.3 \approx 1.67 で埋め合わせる」という意味を持ちます。重みを決めるとは、何と何をどの比率で交換してよいかを宣言すること。この解釈を持つと、次の階層分析法(AHP)が「一対比較でこの交換比率を引き出す手続き」だと見えてきます。

⚠️ よくある誤解

対応シミュレーション

本文のコードで重みベクトルを変えると最良案が入れ替わります。次の重み付けと感度分析では、これを系統的に動かして結論の頑健性を測ります。

関連ノート