それ本当に因果関係ある?〜操作変数法を理解しよう
前回は、「差の差法(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)は「外部からの操作」を利用して「もしも」を考えるアプローチです。
どちらも非常に奥が深く、そして面白い分析手法です。
ぜひ、覚えておいてくださいね!
いいなと思ったら応援しよう!
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます! 