因果推論 入門ミニ教科書
「相関は因果ではない」── でも、ビジネスでも研究でも欲しいのは **因果効果** です。本ミニ教科書は AI エンジニア・データサイエンティスト向けに、 DAG・傾向スコア・DID・操作変数法 の 4 大手法を 5 章でコンパクトに学べる構成。
相関と因果はどう違うのか
「アイスの売上が上がるとプールの溺死者も増える」── これは相関ですが、アイスを禁じても溺死は減りません。真の原因は気温(交絡因子)であり、アイスと溺死は同じ原因を共有しているだけ。因果推論はこの「一見相関だが因果ではない」を見抜くための学問です。
ポテンシャルアウトカム枠組み
個体 について、処置を受けた場合の結果 と受けなかった場合の結果 を考えます。実際に観測できるのはどちらか一方だけ ── これが因果推論の基本問題(Fundamental Problem of Causal Inference)。
1 人の人について「薬を飲んだ自分」と「飲まなかった自分」を同時には観測できない。だから集団レベルで、似た特性を持つ人どうしを比較するか、何らかの仮定で欠損部分を補う必要がある。
DAG とバックドア基準
因果関係を表すグラフが DAG(有向非巡回グラフ)。ノードは変数、矢印は因果の向き。Pearl らが整備した枠組みで、どの変数を調整すれば交絡を除去できるかを バックドア基準 で判定できます。
3 つの基本構造
- Chain: ─ で条件付けると関連が消える
- Fork: ─ が交絡因子。調整すべし
- Collider: ─ で条件付けると 偽の関連 が生まれる(調整してはいけない)
「とりあえず手元にある変数を全部 control」は危険。Collider を調整すると本来ない関連が生まれる(Berkson のパラドクス)。DAG を書いてから調整変数を選ぶのが正攻法。
傾向スコアマッチング
RCT(無作為化比較試験)が無理な観測データで、処置群と対照群を「似た者同士」で比較する手法。傾向スコア が同じならば、観測共変量に関する分布が揃うことを利用。
手順
- ロジスティック回帰などで を推定
- 処置群の各個体に、似た を持つ対照群個体をマッチング
- マッチ後の群間で結果を比較 → ATT(処置群への平均処置効果)を推定
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import NearestNeighbors
import numpy as np
# X: 共変量, T: 処置(0/1), Y: 結果
ps = LogisticRegression().fit(X, T).predict_proba(X)[:, 1]
treat_idx = np.where(T == 1)[0]
ctrl_idx = np.where(T == 0)[0]
nn = NearestNeighbors(n_neighbors=1).fit(ps[ctrl_idx].reshape(-1, 1))
_, match = nn.kneighbors(ps[treat_idx].reshape(-1, 1))
matched_ctrl = ctrl_idx[match.ravel()]
att = (Y[treat_idx] - Y[matched_ctrl]).mean()
print(f'ATT = {att:.3f}')差分の差分(DID)
ある時点で 政策が片方の地域だけに導入された ような自然実験で使う手法。処置群と対照群、それぞれの 前後差 を取り、さらにその差を取ることで、共通の時間トレンドを除去します。
DID が成立する鍵は『政策がなければ両群は平行に動いていたはず』という仮定。pre 期間のグラフを描いて、本当に平行かを目で確認することが大切。
ニュージャージー州が最賃を引き上げ、隣接ペンシルベニア州は据え置き。両州のファストフード店舗の雇用前後差を比較し『最賃引き上げで雇用は減らない』と主張した古典的論文。
操作変数法(IV)
未観測の交絡があるとき、処置に影響するが結果には直接影響しない外部変数 Z(操作変数) を使って因果効果を識別する手法。
- 関連性: は処置 と相関する
- 外生性: は誤差項と無相関(他経路で に影響しない)
2 段階最小二乗法(2SLS)
- 1 段階目: を に回帰し、予測値 を得る
- 2 段階目: を に回帰 → 係数が因果効果
「生まれ月」を IV に使った有名研究。米国の学校開始年齢ルールにより、生まれ月が義務教育の終わり方を左右し、結果として教育年数に影響。生まれ月自体は賃金には直接無関係 → IV として有効。
次に学ぶこと
- [相関と因果はどう違うか(ブログ)](/blog/causal-inference-introduction)
- 次章: 回帰不連続デザイン(RDD)
- Synthetic Control / DML(Double ML)
- [ベイズ統計](/textbook/grade-pre1) ─ 因果推論との接続
回帰不連続デザイン(RDD)
しきい値で処置の有無が決まる 場面で使える手法。例えば「点数 60 点以上で奨学金が出る」「年収 1000 万円以上で増税」のように、ラニング変数(running variable, X)が cutoff を境に処置 が変わるとき、しきい値の すぐ近く で処置群と対照群を比較すると、ほぼ RCT と同等の因果効果が得られます。
アイデア
59 点と 61 点の学生は能力的にほぼ同じ。違いは『奨学金をもらえるかもらえないか』だけ。だから その近傍での結果の差 が奨学金の因果効果と解釈できます。
Sharp RDD と Fuzzy RDD
- Sharp: cutoff を超えると 100% 処置される(例: 法律で決まったルール)
- Fuzzy: cutoff を超えると処置確率が ジャンプ するが 100% ではない(IV 的に処理)
実装(Python)
狭くすると比較対象が似てくる(バイアス↓)が、サンプルが減る(分散↑)。広くすると逆。Imbens-Kalyanaraman などの最適バンド幅選択アルゴリズムが使われる(rdrobust パッケージ)。
RDD が破綻するとき
- 操作可能性: ラニング変数を被験者がねじ曲げられる(例: 試験で 60 点ぴったりが急増)
- 他の不連続性: cutoff で他の制度も同時に変わる(混淆)
- 密度のジャンプ: McCrary 密度検定で cutoff で人数が不自然に増減してないか確認
米国下院選挙で『現職が次回当選するか』を、現職の前回得票率 50% を cutoff にした RDD で分析。50% を僅かに超えた現職は再選率が急上昇 ── 現職効果(incumbency advantage)を頑健に推定した古典的論文。
学んだこと(全 6 章のまとめ)
- Ch1: 因果は相関ではない(ポテンシャルアウトカム)
- Ch2: DAG とバックドア基準で交絡を見抜く
- Ch3: 傾向スコアマッチングで似た者同士を比較
- Ch4: DID で『時間トレンド』を除去
- Ch5: IV で『未観測交絡』に立ち向かう
- Ch6: RDD でしきい値ジャンプを使う
因果推論は『どの仮定が現実的か』を問い続ける学問。ドメイン知識と組み合わせて、仮定 → 識別 → 推定 → 感度分析 の 4 段階を回しましょう。