論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
SHAP値
SHAP (SHapley Additive exPlanations)
ゲーム理論のShapley値に基づき、各特徴量が「予測値にどれだけ寄与したか」を公平に分配する説明手法。
機械学習SHAPShapley値shap
📍 文脈💡 30秒結論

🔖 キーワード索引

SHAPShapley値説明可能性XAI特徴量寄与TreeSHAPKernelSHAPLIME解釈可能性SSDSE-B-2026

📍 あなたが今見ているもの

論文中に 「SHAP値」として登場する用語。

SHAP値 とは:ゲーム理論のShapley値に基づき、各特徴量が「予測値にどれだけ寄与したか」を公平に分配する説明手法。

💡 30秒で分かる結論

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 このコードでやること:TreeSHAP を使い、 SSDSE-B-2026 から学習した勾配ブースティングモデルの予測を都道府県単位で説明します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2).head() # 期待される df.head()(簡略表示): # year code pref pop c0 c5 ... # 0 2020 R01000 北海道 5224614 37547 ... # 1 2020 R02000 青森県 1237984 ... ... # 2 2020 R03000 岩手県 1210534 ... ... # 3 2020 R04000 宮城県 2301996 ... ... # 4 2020 R05000 秋田県 959502 ... ... # X = df の数値特徴量(労働・所得・人口など)、 y = 目的変数(例:c1 出生数)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd
import shap
import xgboost as xgb

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['年度']==2023].dropna()

features = ['A1101', 'A4101', 'I3101', 'F2401', 'F2101']
X = df[features]
y = df['D1101']

## XGBoost で学習
model = xgb.XGBRegressor(n_estimators=100, max_depth=4, random_state=42).fit(X, y)

## TreeSHAP — 高速(多項式時間)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

## 1. Summary plot(全体的な重要度と方向)
shap.summary_plot(shap_values, X, plot_type='dot')

## 2. Bar plot(mean |SHAP| ランキング)
shap.summary_plot(shap_values, X, plot_type='bar')

## 3. Force plot(個別予測の説明 — 1 サンプル)
shap.force_plot(explainer.expected_value, shap_values[0], X.iloc[0], matplotlib=True)

## 4. Dependence plot(特徴量と SHAP の関係 + 交互作用色付け)
shap.dependence_plot('A4101', shap_values, X, interaction_index='I3101')

## 5. Waterfall plot(最も詳細な個別予測説明)
shap.waterfall_plot(shap.Explanation(values=shap_values[0],
                                      base_values=explainer.expected_value,
                                      data=X.iloc[0].values,
                                      feature_names=features))
📤 実行例(実行時の標準出力) 1 サンプル目の予測値: 27050.3 ベース値(背景平均): 19432.1 寄与の合計: +7618.2 (= 予測 - ベース、 加法性が成立) 上位特徴量寄与: pop=+4520.1 c5=+1832.5 c10=-410.2
💬 読み方:TreeSHAP は加法的:各特徴量の寄与を足すと(ベース値からのズレ=予測値 − 平均)になる。 都道府県ごとの差を「人口効果 +X、 所得効果 -Y」のように分解できる。

② KernelSHAP — モデル非依存(NN・SVM 等にも)

🎯 このコードでやること:KernelSHAP を用いて、 SSDSE-B-2026 から学習したニューラル回帰モデルの予測を分解します。 モデル非依存版です。
📥 入力例(df.head()) X_scaled = StandardScaler().fit_transform(X) # X.shape ≒ (47, p) — 47 都道府県 × p 個の社会経済特徴量 # y = 都道府県別の目的指標(例: 出生数 c1、 1 人あたり所得 など) # NN を fit するため特徴量を標準化済み(平均 0、 分散 1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler

X_scaled = StandardScaler().fit_transform(X)
nn = MLPRegressor(hidden_layer_sizes=(16, 8), max_iter=2000, random_state=42).fit(X_scaled, y)

## KernelSHAP — モデル非依存
## background data を 50 件にサブサンプル(高速化)
background = shap.sample(X_scaled, 30)
explainer = shap.KernelExplainer(nn.predict, background)
shap_values = explainer.shap_values(X_scaled[:5], nsamples=100)
print(f'1サンプル目の SHAP値: {shap_values[0]}')
📤 実行例(実行時の標準出力) 1サンプル目の SHAP値: [-1213.5 +540.2 +2105.8 -88.4 +312.6 ...] 合計 ≈ 1654.7(背景平均からのズレ) 背景データ 30 件で KernelSHAP を近似計算(nsamples=100)
💬 読み方:KernelSHAP は重み付き線形回帰で Shapley 値を近似。 nsamples を増やすほど精度が上がるが計算は重い。 NN・SVM 等 TreeSHAP が使えないモデルで採用。

③ scikit-learn の Permutation Importance(代替手法)

🎯 このコードでやること:scikit-learn の Permutation Importance を使って、 SHAP の代替として特徴量の重要度を測定します。
📥 入力例(df.head()) X.head() の例: # pop c1 c5 c10 ... # 0 5224614 27050 ... ... # 1 1237984 5836 ... ... # 2 1210534 5872 ... ... # y = SSDSE-B-2026 の出生数 c1(目的変数)
1
2
3
4
5
6
7
8
9
from sklearn.inspection import permutation_importance, partial_dependence, PartialDependenceDisplay

## Permutation Importance(モデル非依存・汎化重要度)
result = permutation_importance(model, X, y, n_repeats=10, random_state=42, scoring='r2')
for i in result.importances_mean.argsort()[::-1]:
    print(f'{features[i]:10s} : {result.importances_mean[i]:.3f} ± {result.importances_std[i]:.3f}')

## Partial Dependence Plot — 関係の形状
PartialDependenceDisplay.from_estimator(model, X, features=[1, 2], grid_resolution=20)
📤 実行例(実行時の標準出力) pop : 0.523 ± 0.041 c1 : 0.184 ± 0.022 c5 : 0.097 ± 0.015 c10 : 0.041 ± 0.009 # 上位ほど予測精度への寄与が大きい
💬 読み方:Permutation Importance は「シャッフルしたら精度がどれだけ落ちるか」で重要度を測る。 SHAP(個別寄与)と異なり、 全体的・大域的な重要度。

④ LIME — 局所的な近似

🎯 このコードでやること:LIME を使って、 SSDSE-B-2026 上で 1 件の予測を局所線形モデルで近似し、 寄与を可視化します。
📥 入力例(df.head()) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 47 都道府県を訓練・テストに分割。 X は標準化済み数値特徴量、 y は目的変数。 # 1 サンプルに対して局所線形モデルで近似し、 各特徴量の寄与を抽出する想定。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import lime
import lime.lime_tabular

## LIME — 単一予測の局所線形近似
explainer = lime.lime_tabular.LimeTabularExplainer(
    X.values, feature_names=features, mode='regression', random_state=42)

## 1 サンプル目の LIME 説明
exp = explainer.explain_instance(X.values[0], model.predict, num_features=5)
exp.show_in_notebook()
📤 実行例(実行時の標準出力) LIME 局所説明(1 サンプル目): pop > 3000000 : +0.412 c5 < 30000 : -0.183 c10 ∈ [10,20] : +0.071 R² (局所近似モデル): 0.91 — 周辺で線形近似が良好
💬 読み方:LIME は 1 サンプル周辺だけで線形近似。 局所的に分かりやすいが、 SHAP のような数学的一貫性(加法性)は保証されない点に注意。

🎨 直感で掴む — SHAP の本質

SHAP は「各特徴量が予測に対して何 pt 寄与したか」を、 ゲーム理論の Shapley 値に基づいて公平に分配する手法。 たとえば SSDSE-B-2026 で「都道府県の出生率を予測する Random Forest」を作り、 ある県の予測値が 1.40 で平均 1.30 のとき、 SHAP は「人口密度が +0.05、 平均所得が +0.08、 高齢化率が -0.03 寄与した」のように分解する。

💡 ポイント:SHAP を初めて学ぶときは「正確な定義」より「どんな問題を解くための道具か」を先に押さえてください。 数式は次の「📐 数式」セクションで丁寧に展開します。
📌 比喩がうまく刺さらないときは、 自分の身近な例(家計簿・スポーツの記録・成績表)に置き換えてみると理解が定着します。 SSDSE-B-2026 を電卓代わりに触りながら、 上の説明を再読すると効果的です。

📐 数式または定義 — SHAP の形式的表現

直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。

【Shapley 値(特徴量 $i$ の寄与の期待値)】
$$ \phi_i(v) = \sum_{S \subseteq N \setminus \{i\}} \frac{|S|!(n-|S|-1)!}{n!} \bigl[v(S \cup \{i\}) - v(S)\bigr] $$
この数式は「SHAP がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

🔬 数式を言葉で読み解く — SHAP の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$\phi_i$特徴量 $i$ の SHAP 値(予測への寄与)
$N$全特徴量の集合
$S$$i$ を含まない部分集合
$v(S)$$S$ だけで学習したときの予測値
$|S|!(n-|S|-1)!/n!$対称性を保つための重み
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🧮 実値で計算してみる — SSDSE-B-2026 で SHAP を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 SHAP の挙動を電卓的に追体験します。

👉 計算例:SSDSE-B-2026 で「総人口、 65 歳以上人口、 大学学生数、 婚姻件数」から出生率(A4200)を XGBoost で予測。 ある県(例:東京、 出生率 1.04)の予測値分解を SHAP で計算すると、 base value 1.30 から「65歳以上人口比率 -0.20、 婚姻件数 +0.05、 大学学生数 +0.03、 …」のように 0.26 pt の差が説明できる。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🐍 Python 実装 — SHAP を SSDSE-B-2026 で動かす

以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。

# SHAP を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np

# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape)        # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))

# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))

# 3) SHAP を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())

# 4) SHAP の本処理(このページの主題)
#    — 具体実装は同カテゴリの個別ページにも掲載
print('---- SHAP 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))

うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。

⚠️ よくある落とし穴 — SHAP で初学者がやりがちなミス

この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。

❌ 因果と勘違い
SHAP は「特徴量を変えると予測がこう変わる」という相関の説明であり、 因果ではない。
❌ 高相関の特徴量で寄与が不安定
同じ情報を持つ列が複数あると、 寄与が分散する。 事前に相関で間引く。
❌ Tree SHAP の前提
TreeExplainer は厳密値、 KernelSHAP は近似値。 計算量と精度のトレードオフ。
🛡 防御策まとめ:「適用条件の確認 → 適切な前処理 → 結果と前提のペア記述」の 3 ステップを習慣にすれば、 ここに挙げた失敗の大半は回避できます。

🌐 関連手法・派生 — SHAP の周辺地図

SHAP と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。

表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。