見出し画像

それ本当に因果関係ある?〜操作変数法を理解しよう

前回は、「差の差法(DiD)」を使って、施策の導入前後・グループ間の比較から効果を測る方法についてお話ししました。

差の差法は「もし施策がなかったら、処置群と非処置群は同じトレンドを辿ったはず」という平行トレンド仮定を置くことで、時間的な変化を利用して因果効果を推定する強力な手法でしたね。

さて今回は、
因果推論におけるもう一つの強力な手法である「操作変数法(Instrumental Variable Method, IV)」について、
できるだけ直感的に、そしてPythonコードでの実践も交えて解説していきたいと思います!



今回の悩み:「見えない第三の要因」の存在


「教育をたくさん受けた人ほど、将来の賃金は高くなる」

これは、多くの人が「そりゃそうでしょ」と思う関係性ですよね。

実際にデータを取ってきても、教育年数と賃金の間にはハッキリとした正の相関が見られます。

では、この相関関係から「教育が賃金を上げるのだ!」と結論づけて良いのでしょうか?

ここで立ち止まって考えるのが、因果推論の第一歩です。

もしかしたら、教育と賃金の両方に影響を与えている「見えない第三の要因」があるかもしれません。

例えば、「個人の能力の高さ」です。

もともと能力が高い人ほど、
高い教育を受ける傾向があり、
かつ、
能力が高いからこそ仕事でも成果を出して高い賃金を得やすい、
と考えられますよね。



単純比較できない「交絡」という罠


このような、分析したい原因(教育)結果(賃金)の両方に影響を与えてしまう要因を交絡因子(こうらくいんし)と呼びます。

この交絡因子が存在すると、教育そのものの効果と、個人の能力による効果がごちゃ混ぜになってしまい、教育の効果を過大評価してしまう危険性があるのです。

ちなみに、計量経済学の言葉では内生性(ないせいせい)の問題と呼ばれたりします。

内生性とは、
・説明変数(原因として扱う変数)が、
・誤差項(説明できてない要因)と相関してしまっている状態
のことを言います。問題の本質は、その結果として、被説明変数とも相関してしまうように見えることです。



✨ 解決策「操作変数法」の登場


ランダムに「あなたは大卒まで、あなたは高卒まで」と割り振る実験(ランダム化比較実験 RCT=Random Controlled Trial)ができれば良いですが、倫理的にも現実的にも不可能ですよね。

そこで登場するのが操作変数法です。

操作変数法の操作変数とは、このごちゃ混ぜ状態を解消するために、外部から「原因」だけをうまく操作(manipulate)してくれる都合の良い変数のことです。

今回の例で、
経済学の有名な分析で使われた操作変数は、「家の近くに大学があるか?」です。

え、なんで?と思いますよね。

これが操作変数になるためには、以下の大事な条件を満たす必要があります。


✅ 操作変数になるための2つのルール


ルールその1: 関連性 (Relevance)

  • 操作変数は、原因(教育年数)と関連性がある必要があります。

  • 「家の近くに大学がある」と、通学コストや心理的なハードルが下がるため、大学進学率が上がり、教育年数に影響を与えそうですよね。これはOKそうです。

ルールその2:外生性 (Exogeneity) 

  • 操作変数は、結果(賃金)に対して、原因(教育年数)を経由してしか影響を与えないこと。

  • 「家の近くに大学がある」という事実そのものが、教育とは無関係に、直接その人の賃金を上げることはないはずです。例えば、「大学の近くに住んでるから」という理由だけで採用面接で給料が上がる、なんてことは考えにくいですよね。これもOKそうです。

この2つの条件を満たすことで、「個人の能力」という交絡因子とは無関係に、純粋に「大学が近くにあったから」という外的要因によって増えた教育年数が、どれだけ賃金を押し上げたのかを推定できるのです。



🐍 Pythonで実践!コードで見る操作変数法


理論だけだと難しいので、
実際にPythonでコードを動かして、
単純な回帰分析(OLS)と操作変数法(IV)の結果がどう変わるのか見てみましょう!

Googleコラボで実装します。

準備:ライブラリのインストール

まずは、分析に必要なライブラリをインストールします。

! pip install pandas statsmodels linearmodels


分析コード

使うのは、まさに今回の例にピッタリな、
経済学者D. Cardの有名なデータセットです。

  • 目的: 教育 (educ) が賃金 (lwage) に与える影響を測る

  • 操作変数: 家の近くに4年制大学があるか (nearc4)

Python

import pandas as pd
import statsmodels.api as sm
from linearmodels.iv import IV2SLS

# --- 1. データの準備 ---
# CardのデータセットをWebから直接読み込む
url = "https://raw.githubusercontent.com/scunning1975/mixtape/master/card.dta"
df = pd.read_stata(url)

# 勤続年数の二乗項と定数項を追加
df['expersq'] = df['exper']**2
df = sm.add_const(df)

# --- 2. 比較のための単純な回帰分析 (OLS) ---
# このモデルは「能力」によるバイアスを含んでいる可能性がある
dependent = df['lwage']
exog_ols = df[['const', 'educ', 'exper', 'expersq', 'black', 'smsa']]
ols_model = sm.OLS(dependent, exog_ols).fit()
ols_educ_coef = ols_model.params['educ']

print(f"--- モデル1: 単純な回帰分析(OLS)の結果 ---")
print(f"教育年数(educ)の係数: {ols_educ_coef:.4f} (約7.5%)\n")


# --- 3. 操作変数法による分析 (IV) ---
# コントロール変数(外生変数)
exog_iv = df[['const', 'exper', 'expersq', 'black', 'smsa']]
# 内生変数(原因)
endog = df['educ']
# 操作変数
instrument = df['nearc4']

# IVモデルの実行
iv_model = IV2SLS(dependent, exog_iv, endog, instrument).fit(cov_type='robust')
iv_educ_coef = iv_model.params['educ']

print(f"--- モデル2: 操作変数法(IV)の結果 ---")
print(f"教育年-数(educ)の係数: {iv_educ_coef:.4f} (約13.3%)\n")


結果の比較と解釈

分析手法教育年数 (educ) の係数意味合い単純な回帰分析 (OLS)0.0751 (約7.5%)能力などの影響が混ざっており、教育の効果を過大(あるいは過小)評価している可能性が高い。操作変数法 (IV)0.1333 (約13.3%)「大学が近くにある」という外的要因で教育を受けた人々に限定した、より因果関係に近い局所的な効果 (LATE)

コードを実行すると、結果がハッキリと変わるのが分かりますね!

OLSの結果(7.5%)は、能力バイアスの影響を含んだ、いわば「見せかけの相関」に近いものです。

一方でIVの結果(13.3%)は、「もし大学が近くになければ進学しなかったが、近くにあったから進学した」という人々の教育リターンを捉えた、より因果関係に近い推定値と解釈できます。

このように、操作変数法を使うことで、単純な分析では見えなかった、より本質的な効果に迫ることができるのです。



まとめ


というわけで、今回は「操作変数法」について、理論からPythonでの実践までを解説しました。

  • どんな時に使う?

    • 分析したい原因と結果の裏に、観測できない交絡因子(内生性)が存在し、単純比較では効果を正しく測れない時。

  • 何が嬉しい?

    • ランダム化比較試験(RCT)ができない状況でも、「都合の良い外部の要因」を見つけることで、交絡の影響を取り除き、因果関係に迫ることができる

  • 一番のハードルは?

    • 妥当な操作変数を見つけること。特に2つ目の条件である「外生性」は、統計的に証明することが難しく、「本当にその仮定は正しいの?」という深い洞察が常に求められます。

差分の差分法(DID)が時間変化を利用して「もしも」の世界を考えるのに対し、操作変数法(IV)は「外部からの操作」を利用して「もしも」を考えるアプローチです。

どちらも非常に奥が深く、そして面白い分析手法です。
ぜひ、覚えておいてくださいね!

いいなと思ったら応援しよう!

Non よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!