🍰 まずはやさしく
分析の邪魔になるノイズのようなものです。
計算結果がズレる原因を突き止めるために使います。
スマホの利用時間とテストの点数で起きます。
論文の中でどう使われているかを確認します。
論文中に 「内生性」として登場する用語。
内生性 とは:説明変数が誤差項と相関している問題。OLS推定がバイアスを持つ。操作変数法等で対処。
🍰 まずはやさしく
データの関係が歪んでいる状態のことです。
正しい原因と結果を知るために使います。
お小遣いと成績の関係を調べる時に起きます。
まずはこの言葉の意味を短くまとめます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 基本パターン import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 基本統計量 df.describe() # 可視化 sns.pairplot(df[['L322101', 'L322108', 'L322102']]) # 食料費・教育費・住居費 plt.show() |
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
内生性 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 因果推論 › 観察研究 › 内生性
中心に 内生性 を置き、 そこから IV・重回帰・DiD・最小二乗法・単回帰・Ridge回帰 計 6 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「内生性」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「内生性」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
内生性(endogeneity)に関する用語を、 原因のタイプ・解決手法・診断 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 原因のタイプ | 欠落変数バイアス、 同時性バイアス、 測定誤差、 自己選択、 サンプルセレクション | omitted variable bias, simultaneity, measurement error, self-selection |
| 解決手法 | 操作変数法、 2段階最小二乗法、 差の差分析、 回帰不連続デザイン、 固定効果 | IV, 2SLS, DiD, RDD, fixed effects, GMM |
| 診断・検定 | Hausman検定、 弱操作変数、 過剰識別検定(Sargan)、 Cragg-Donald F | Hausman test, weak IV, Sargan, Cragg-Donald, J-statistic |
| 因果推論 | 処置効果、 平均処置効果(ATE)、 反実仮想、 ランダム化 | treatment effect, ATE, counterfactual, randomization |
| 関連概念 | 外生性、 共変量、 交絡変数、 識別、 反応バイアス | exogeneity, confounder, identification, response bias |
| 実装ライブラリ | linearmodels、 statsmodels、 econtools、 doWhy、 EconML | linearmodels.iv.IV2SLS, statsmodels, doWhy, EconML |
SSDSE-B-2026 の実在列 教育費 L322108(二人以上の世帯、 円/月)と 消費支出 L3221(同、 円/月)を使い、 2023年度の47都道府県で内生性の問題を考えます。 なお SSDSE-B-2026 には「所得」「県内総生産 (GDP)」の列は存在しないため、 生活水準の代理として消費支出を用います(所得は未観測の欠落変数として登場します)。
消費支出 (L3221) = β₀ + β₁ × 教育費 (L322108) + ε
2023年度47都道府県で OLS 推定すると β₁ = +3.30(SE 0.70、 R² = 0.33。 実CSVでの実測値)
しかし、 これは因果的な解釈ができない。 なぜなら:
・所得(未観測)が高い県ほど教育費も総消費も多い(欠落変数)
・教育費は総消費支出の一部でもあり同時決定される(同時性)
・家計調査ベースの支出には標本誤差が含まれる(測定誤差)
| IV候補 | 関連性 | 外生性 |
|---|---|---|
| 都道府県の大学数(実在列 E6102) | 教育費と相関 r = 0.65 ◯(実測) | 消費全体に直接効果なしと仮定 △ |
| 義務教育延長改革(コホート)※SSDSE外の一般例 | 教育年数を強制的に変える ◎ | 結果変数には間接効果のみ ◎ |
| 家庭の蔵書数 ※SSDSE外の一般例 | 弱い △ | 直接効果あり懸念 ✕ |
第1段階:教育費 ̂ = γ₀ + γ₁ × 大学数 (E6102) + u → 第1段階 F = 33.1(F > 10 で強いIV)
第2段階:消費支出 = β₀ + β₁ × 教育費 ̂ + ε
結果:β₁ = +2.80(SE 0.69。 OLS の +3.30 より小さい)
点推定は OLS の過大評価と整合的な方向に動く。 ただし Wu-Hausman 検定は p = 0.54 で、 n = 47 ではこの差は統計的に有意でない(内生性の存在をデータからは断定できない)。 IV の外生性(大学数が消費支出に直接効かない)自体も検証不能な仮定である点に注意。
以下は内生性への対処を各ライブラリの API で示すコードです。 上の実測事例と同じく、 SSDSE-B-2026 の実在列で「消費支出 (L3221) を教育費 (L322108) で説明し、 操作変数に大学数 (E6102) を使う」という因果構造を扱います(2023年度47都道府県)。 省略変数バイアスを実在列で動かす実演は別掲の「🐍 Python 実装」節も参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd from linearmodels.iv import IV2SLS df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023年度47都道府県 # 消費支出 L3221 = β × 教育費 L322108 + ε IV: 大学数 E6102 y = df['L3221'] exog = pd.DataFrame({'const': 1}, index=df.index) endog = df[['L322108']] instruments = df[['E6102']] mod = IV2SLS(y, exog, endog, instruments).fit() print(mod.summary) print('第1段階F:', mod.first_stage.diagnostics) |
1 2 3 4 5 6 7 8 9 10 | import statsmodels.api as sm import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023年度47都道府県 X = sm.add_constant(df[['L322108']]) # 教育費 y = df['L3221'] # 消費支出 ols = sm.OLS(y, X).fit() print(ols.summary()) # OLS推定値(バイアスあり可能性) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd import statsmodels.api as sm from linearmodels.iv import IV2SLS # ── 比べる 2 つの推定結果を用意する ── # Y=教育費(L322108), X=消費支出(L3221, 内生), Z=総人口(A1101, 操作変数) _d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) _y = _d['L322108'].astype(float) _x = _d[['L3221']].astype(float) _z = _d[['A1101']].astype(float) ols_result = IV2SLS(_y, sm.add_constant(_x), None, None).fit() iv_result = IV2SLS(_y, None, _x, _z).fit() from linearmodels.iv import compare # OLS と 2SLS の結果を比較 print(compare({'OLS': ols_result, '2SLS': iv_result})) # Wu-Hausman統計量 p<0.05 なら内生性あり → IVを採用 |
1 2 3 4 5 6 7 8 9 10 11 | from econml.iv.dml import DMLIV from sklearn.ensemble import RandomForestRegressor est = DMLIV( model_y=RandomForestRegressor(n_estimators=100), model_t=RandomForestRegressor(n_estimators=100), model_t_xwz=RandomForestRegressor(n_estimators=100) ) # Y: 消費支出 L3221, T: 教育費 L322108, Z: 大学数 E6102, X: 総人口 A1101 est.fit(Y=df['L3221'], T=df['L322108'], Z=df['E6102'], X=df[['A1101']]) print('CATE推定:', est.const_marginal_effect(df[['A1101']])) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import dowhy from dowhy import CausalModel model = CausalModel( data=df, treatment='L322108', # 教育費 outcome='L3221', # 消費支出 common_causes=['A1101'], # 総人口 instruments=['E6102'] # 大学数 ) identified = model.identify_effect() estimate = model.estimate_effect(identified, method_name='iv.instrumental_variable') print(estimate) # 反証検証 refute = model.refute_estimate(identified, estimate, method_name='placebo_treatment_refuter') print(refute) |
内生性(説明変数と誤差項の相関)は OLS 推定にバイアスをもたらす。 残差プロット、 多重共線性 (VIF)、 OLS 仮定の図で全体像を直感する。



→ 内生性の検出は「残差診断 → 多重共線性 → OLS 仮定検証」の順で進める。 検出されれば操作変数法 (IV) や Hausman 検定で対処。
→ 全項目に答えられれば、 計量経済学の因果推論を実務に応用できる。
合成データで OLS 推定値と真の係数のずれを計算する。
1 2 3 4 5 6 7 8 9 | beta_x_true = 2 beta_z = 3 cov_xz = 0.5 var_x = 1.0 bias = beta_z * cov_xz / var_x estimated = beta_x_true + bias print(f"バイアス: {bias}") print(f"推定値: {estimated}") print(f"真値: {beta_x_true}") |
💬 手計算 (Step 2) バイアス 1.5 と Python 出力が完全一致。
内生性は単独の問題ではなく、 因果推論 ・操作変数 ・差分の差分 ・固定効果 ・自然実験を貫く中核的な障害である。 観察データから因果効果を推定するときは必ず内生性の有無を最初に検討する。
内生性は「説明変数と誤差項が相関してしまう状況」で、 上流の研究設計で因果構造を描き、 並列の操作変数・差分の差分・固定効果と組み合わせ、 下流の係数推定が偏らないようにモデル選択を行う必要がある。
「endogeneity」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「endogeneity」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「endogeneity の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
内生性 (Cov(X, ε) ≠ 0) を扱う際の追加チェック:
SSDSE-B-2026 の都道府県データで内生性が現れる典型例: (1) 「学校数 X → 教育費 Y」を回帰すると、 「県の所得・人口規模」が両者に影響する欠落変数となり、 X の係数が膨らむ。 (2) 「地価 X → 人口 Y」では、 人口が地価を押し上げる逆因果が同時に発生する。 (3) 行政区分の変更や調査方式の違いから測定誤差が混入することもある。
このページでは内生性を「OLS の前提 E[ε|X] = 0 が崩れた状態」と定義し、 検出 (Hausman) と除去 (IV/DID/RDD/FE) の両面から扱う。
🍰 まずはやさしく
隠れた原因が潜んでいるイメージです。
直感的に間違いに気づくために使います。
部活の練習量と試合結果の間に潜んでいます。
なぜ計算がズレるのかを感覚で理解します。
「賃金 = α + β × 教育年数 + ε」を OLS で推定すると、 教育年数の係数 β が真の効果より大きく出る。 これは ε に「もともとの能力」が入っており、 能力が高い人は教育年数も長いという相関が生まれているため。 結果として β = 真の教育効果 + 能力からの混入バイアス となる。
これを SSDSE-B-2026 の実在列で例えれば、 「県の大学数 (E6102) X → 消費支出 (L3221) Y」を OLS 推定すると、 「県の人口規模・都市化度」といった未観測の第三因子が ε に潜み、 X の係数を歪める。 内生性を直感で捉える 3 つの問: (a) X を決めるとき Y も同時に決まらないか、 (b) X と Y を両方動かす第三因子はないか、 (c) X の観測値に誤差はないか。
具体例として、 SSDSE-B-2026 のデータを使い、 endogeneity を実際に動かすイメージを次節以降で示す。 数式 → 値代入 → 手計算 → Python 実装 の流れで、 抽象と具体を行き来しながら理解を深める。
🍰 まずはやさしく
数式で表したデータのズレのことです。
正確なルールを定義するために使います。
買い物への支出と家計の状況で考えます。
数式を使って正しく定義する方法を学びます。
endogeneity の定義や代表的な数式を以下に示す。 数式の各記号の意味は次節で言葉に翻訳する。
endogeneity は文脈に応じて複数の定式化があるが、 教育目的では最も基本的な形を抑えることが重要。 具体的な値での計算例は後続セクションを参照。
$$\text{endogeneity}: f(\mathbf{X}, \boldsymbol{\theta}) \to y$$
記号の対応はこうです。 内生性は $\mathrm{Cov}(x, \varepsilon) \ne 0$、 つまり説明変数 $x$ と誤差項 $\varepsilon$ が相関している状態を指します。 $\varepsilon$ は「モデルに入れなかったすべての要因」の受け皿なので、 $x$ と $\varepsilon$ が相関するとは「$x$ と関係する何かを、説明変数に入れ忘れている」という意味です。 このとき OLS 推定量 $\hat{\beta}$ は $\beta + \mathrm{Cov}(x,\varepsilon)/\mathrm{Var}(x)$ に収束し、 サンプルをいくら増やしても真の値からずれたままになります(不偏でも一致でもない)。 操作変数 $z$ に求められるのは $\mathrm{Cov}(z, x) \ne 0$(関連性)かつ $\mathrm{Cov}(z, \varepsilon) = 0$(外生性)の 2 条件で、 後者はデータから検証できないため、 分野知識による正当化が必要です。
前節の数式に含まれる記号を、 日本語の意味に翻訳する。
endogeneity の数式は、 これらの記号を組み合わせて「データから未知量を推定する」あるいは「データの構造を要約する」プロセスを記述している。
SSDSE-B-2026 で「教育費 (L322108) は幼稚園数 (E1101) と相関するか」を OLS で見るとき、 内生性 (省略変数バイアス) がどう生じるかを実値で計算する。 真のモデルは「教育費 ~ 幼稚園数 + 地価 (C5401)」だが、 地価を省略すると OLS バイアスが乗る。
これが内生性 (= 説明変数と誤差項が相関) によるバイアス。 SSDSE-B-2026 のように「県の規模」が裏に隠れていると、 ほぼ全ての OLS で同様のバイアスが乗る。
SSDSE-B-2026 で「省略変数バイアスを実演」する Python コード。 真モデル (L322108 ~ E1101 + C5401) と OLS バイアス付き (L322108 ~ E1101 のみ) を比較する。
🎯 このコードでやること: SSDSE-B-2026 で 2 つの回帰を回し、 「真モデル」と「省略 OLS」の β1 を比較。 省略変数バイアスを定量化する。
📥 入力データ: SSDSE-B-2026 の E1101 (幼稚園数), C5401 (地価), L322108 (教育費)。 47 都道府県。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023] # 2023年度47都道府県
# 標準化
for c in ['E1101', 'C5401', 'L322108']:
df[c] = (df[c] - df[c].mean()) / df[c].std()
# 真モデル (両方を入れる)
m_true = sm.OLS(df['L322108'], sm.add_constant(df[['E1101','C5401']])).fit()
# 省略 OLS (C5401 を入れない)
m_omit = sm.OLS(df['L322108'], sm.add_constant(df[['E1101']])).fit()
print(f"真モデル E1101 係数: {m_true.params['E1101']:.3f}")
print(f"省略 OLS E1101 係数: {m_omit.params['E1101']:.3f} (バイアス込み)")
|
📤 実行結果 (実CSVで実行):
💬 結果の読み方: 省略 OLS では幼稚園数の係数が 0.655 と大きな正に見えるが、 地価 C5401 を制御すると -0.013 とほぼゼロ。 つまり見かけの効果はほぼ全てが省略変数バイアスである。 E1101 (幼稚園数) と C5401 (地価) の相関は r = 0.89 (実測) と強く、 地価を省くと幼稚園数が「地価 (都市化) 経由の効果」を丸ごと拾ってしまう。 バイアス公式どおり 0.655 = -0.013 + 0.749 × 0.892 が実データで成立する (0.749 は真モデルの C5401 係数)。 IV (Instrumental Variable) や fixed-effect で対処するのが定石。
endogeneity を実務で使う際に頻発する誤用・落とし穴を列挙する。 多くは「前提の確認不足」「結果の過信」「他手法との比較不足」が原因で、 事前にチェックリスト化することで回避できる。
内生性 (endogeneity, Cov(x,ε)≠0) を中心に、 前提 (OLS の外生性仮定・DAG)・並列 (交絡バイアス・選択バイアス)・発展 (IV/2SLS)・応用 (SSDSE-B-2026 県別パネル分析)・対比 (外生変数 Cov(x,ε)=0 のケース)・統合 (DiD/RDD/固定効果) を 6 方向に配置した。
「endogeneity」を中心に、 隣接する手法・概念との関係を以下に整理する。 単独の手法理解にとどまらず、 分析パイプライン全体での位置付けを把握することで、 適切な前段・後段・代替手法を選べる。
| 隣接手法 | 関係 | 接続のポイント |
|---|---|---|
| 上位概念 | 上位 / 一般化 | 「endogeneity」と組み合わせる/比較する場面で参照 |
| 下位概念 | 下位 / 特殊化 | 「endogeneity」と組み合わせる/比較する場面で参照 |
| 対比手法 | 並列 / 対比 | 「endogeneity」と組み合わせる/比較する場面で参照 |
| 前段処理 | 前段 (前処理) | 「endogeneity」と組み合わせる/比較する場面で参照 |
| 後段処理 | 後段 (後処理) | 「endogeneity」と組み合わせる/比較する場面で参照 |
| 評価手法 | 評価 / 比較 | 「endogeneity」と組み合わせる/比較する場面で参照 |
内生性 (endogeneity) への対処手法は、 (1) 内生性の原因(欠落変数 / 逆因果 / 測定誤差)、 (2) データの形(クロスセクション / パネル / 自然実験)、 (3) 識別仮定の妥当性 の 3 軸で決まる。 以下に典型シナリオと対応する因果推論手法の組合せを示す。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| 欠落変数バイアスが疑われる (重要な交絡因子が観測できない) | 外生的な操作変数 / パネルデータの個体内変動 | 操作変数法 (2SLS) / 固定効果モデル |
| 逆因果 / 同時性 (Y → X も成立する) | 処置前後の差分 / ラグ変数の利用 | 差分の差分法 (DiD) / 動学パネル GMM |
| 測定誤差が無視できない (X が誤差込みの観測値) | 真値の代理変数 / 反復測定 | 操作変数法 / 構造方程式モデル (SEM) |
| 準実験的セッティング (閾値・自然実験あり) | 処置割当が外生的な閾値・くじ | 回帰不連続デザイン (RDD) / マッチング法 |
| パネルデータあり (個体 × 時点で観測) | 時間不変の異質性を吸収 | 固定効果モデル / Within 推定 |
| 高次元の交絡を機械学習で制御したい | 交絡因子を非線形に柔軟にコントロール | Double Machine Learning (DML) / 因果フォレスト |
「説明変数 X が誤差項 ε と相関する」内生性は、 抽象的に聞こえますが具体的な原因は 3 つに分類できます。 SSDSE-B-2026(47 都道府県データ)の文脈で、 それぞれをどう識別し、 どう対処するかを整理します。
| 原因 | メカニズム | SSDSE-B での例 | 主な対処 |
|---|---|---|---|
| 欠落変数バイアス | 真に重要な変数がモデルから外れている | 「幼稚園数 (E1101) → 教育費 (L322108)」を分析する際、 「地価 (C5401)」を入れないと過大評価 | 変数追加、 固定効果 |
| 逆因果(同時性) | Y → X の方向も同時に存在 | 「一般診療所数 (I5102) ↔ 65歳以上人口 (A1303)」は両方向的になり得る | 操作変数法、 DiD |
| 測定誤差 | X が真の値ではなく観測値(ノイズあり) | 「消費支出 (L3221)」は家計調査の標本平均で、 標本誤差を含む | 操作変数法、 SEM |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd from linearmodels.iv import IV2SLS df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023年度47都道府県 # A1301=15歳未満人口, A1101=総人口, A4101=出生数, A1303=65歳以上人口 # OLS import statsmodels.api as sm X_ols = sm.add_constant(df[['A1301']]) ols = sm.OLS(df['A1101'], X_ols).fit() # IV:操作変数として 出生数 (A4101) を使う想定 iv_model = IV2SLS.from_formula( 'A1101 ~ 1 + [A1301 ~ A4101] + A1303', data=df ).fit() print('OLS β:', round(ols.params['A1301'], 4)) print('IV β :', round(iv_model.params['A1301'], 4)) # 両者が大きく異なれば内生性の疑い大 print(iv_model.wu_hausman()) # p 値 < 0.05 で内生性あり |
| 手法 | 必要な条件 | SSDSE-B での適用可能性 |
|---|---|---|
| 操作変数法 (IV) | IV が外生かつ X と相関 | 地理的・歴史的変数を IV にできる |
| DiD | 処置と非処置、 前後パネル | 時系列パネル化が必要 |
| 固定効果 | 時間不変な交絡のみ | パネル化すれば適用可能 |
| RDD | 処置がスコアで決まる | 行政区分が境界 → 適用余地 |
| 傾向スコア | 観測される交絡のみ | 県特性で重み付け可能 |
💡 判断フロー:(1) 理論的に内生性を疑うべき変数を特定 → (2) Hausman / Wu 検定で統計的に確認 → (3) 利用可能なデータ構造(パネル? 自然実験?)に応じた手法選択 → (4) 結果を OLS と比較し感度分析、 が王道です。
実務で内生性に対処するときは、 単一手法に頼らず 5 段階のパイプライン で取り組むのが定石です。 SSDSE-B-2026 を題材に、 各ステップで何をするかを整理します。
| Step | 作業 | 出力物 |
|---|---|---|
| 1 | 因果図(DAG)作成 | 変数間の前提を明示 |
| 2 | 内生性源の同定 | 欠落 / 逆因果 / 測定の分類 |
| 3 | 手法選択 | IV / DiD / FE / 傾向スコア |
| 4 | 推定 + 検定 | Hausman / 弱操作変数検定 |
| 5 | 感度分析 | 未観測交絡への耐性 |
SSDSE-B-2026 で「教育費 (L322108) X が消費支出 (L3221) Y に与える効果」を検証する場合、 仮定する因果関係を DAG で描いておくと、 後続の手法選択が機械的に決まります(高齢化率は A1303/A1101 から、 地価水準は C5401 から作れる実在列ベースの変数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 例:DAG を networkx で可視化 import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() edges = [ ('教育費', '消費支出'), # 主要因果 (L322108 → L3221) ('高齢化率', '教育費'), # 交絡 (A1303/A1101) ('高齢化率', '消費支出'), # 交絡 ('地価水準', '教育費'), # 交絡 (C5401) ('地価水準', '消費支出'), ] G.add_edges_from(edges) pos = nx.spring_layout(G, seed=1) nx.draw(G, pos, with_labels=True, node_color='#FFCDD2', node_size=2400, font_size=11) plt.title('DAG: 教育費と消費支出の因果') plt.show() |
操作変数法(IV)は「強い操作変数」を前提とします。 弱い IV では推定がかえって悪化するため、 第 1 段階の F 統計量で IV の強さを確認します(経験則:F > 10)。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd, statsmodels.api as sm df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023年度47都道府県 # 第 1 段階:内生変数 A1301 (15歳未満人口) を IV A4101 (出生数) で回帰 first_stage = sm.OLS(df['A1301'], sm.add_constant(df[['A4101']])).fit() F_stat = first_stage.fvalue print(f'第 1 段階 F 統計量: {F_stat:.1f}') print('F > 10 なら IV は強い(経験則)') # 2023年度47都道府県の実測では F = 9915.6 (r = 0.998) と極めて強い |
観測されない交絡が結果を反転させるには「どれくらい強い必要があるか」を計算するのが感度分析です。 E-value(VanderWeele & Ding, 2017)は「観察された関連を説明するために必要な未観測交絡の強さ」を 1 つの数字で要約します。
1 2 3 4 5 | # 簡易 E-value 計算(リスク比 RR の場合) RR = 2.5 # 推定された処置効果 E_value = RR + (RR * (RR - 1)) ** 0.5 print(f'E-value: {E_value:.2f}') # 解釈:未観測交絡が処置・結果と E-value 倍以上関連していないと結果は説明できない |
💡 論文への教訓:因果推論の論文は「手法が正しい」だけでなく「前提が明示されている」が査読の通過点。 DAG と感度分析を併記するだけで査読者の信頼が上がります。
内生性(endogeneity)は、 計量経済学が「観測データから因果関係を読み取る」ために闘ってきた最大の難題の一つです。 その歴史を概観すると、 現代の因果推論手法が「なぜそうあるか」が見えてきます。
| 年 | 手法・出来事 | 代表的論文・人物 |
|---|---|---|
| 1928 | Wright が操作変数法 (IV) を提唱 | Philip Wright |
| 1944 | Haavelmo が「確率的アプローチ」を確立 | Trygve Haavelmo (1989 ノーベル賞) |
| 1958 | 2SLS の体系化 | Theil, Basmann |
| 1978 | Hausman 検定の登場 | Jerry Hausman |
| 1994 | Card & Krueger の DiD 古典 | 最低賃金研究 |
| 2000s | 「クレディビリティ革命」 | Angrist, Imbens, Pischke |
| 2021 | 自然実験の方法でノーベル賞 | Card, Angrist, Imbens |
内生性に対処する手法は大きく 4 つの系統に分かれます。 それぞれの強み・弱みを整理しておくと、 実データに直面したときの選択肢がクリアになります。
| 系統 | 代表手法 | 必要なデータ構造 | 主な仮定 |
|---|---|---|---|
| 操作変数 | IV, 2SLS, LIML, GMM | 外生な IV 変数 | 関連性と除外制約 |
| 準実験 | DiD, RDD, 合成統制法 | 処置タイミング, 閾値 | 共通トレンド等 |
| パネル | 固定効果, ランダム効果 | パネルデータ | 時間不変交絡のみ |
| マッチング | 傾向スコア, NN マッチング | 処置と対照群 | 条件付き独立性 |
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 | import pandas as pd import statsmodels.api as sm from linearmodels.iv import IV2SLS df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # A1101=総人口, A1301=15歳未満人口, A4101=出生数, A1303=65歳以上人口 # 1. ナイーブ OLS X1 = sm.add_constant(df[['A1301']]) ols = sm.OLS(df['A1101'], X1).fit() print(f'OLS: β = {ols.params["A1301"]:.4f}') # 2. 制御変数追加(観測される交絡を補正) X2 = sm.add_constant(df[['A1301', 'A1303']]) ols2 = sm.OLS(df['A1101'], X2).fit() print(f'OLS + 制御: β = {ols2.params["A1301"]:.4f}') # 3. 操作変数法(出生数 A4101 を IV と仮定) iv = IV2SLS.from_formula( 'A1101 ~ 1 + [A1301 ~ A4101] + A1303', data=df ).fit() print(f'IV (2SLS): β = {iv.params["A1301"]:.4f}') # 3 手法で β がどう変わるか比較 # 大きく変わるなら内生性の疑い濃厚 |
2000 年代以降、 IV の最大の問題は「弱い操作変数」であることが明らかになりました。 関連性が弱い IV を使うと、 OLS バイアスを直す前にもっと大きな 2SLS バイアス が生じます。 Stock-Yogo (2005) の表で、 必要な第 1 段階 F 統計量を確認するのが標準的です。
| IV の数 | Stock-Yogo 臨界値(10% バイアス) |
|---|---|
| 1 | 16.4 |
| 2 | 19.9 |
| 3 | 22.3 |
💡 論文掲載時の必須項目:(1) 第 1 段階の F 統計量、 (2) 過識別検定(Sargan / Hansen J)、 (3) Hausman 検定、 (4) 感度分析(E-value 等)。 これらを併記してはじめて、 査読を通る因果推論論文になります。
「内生性 = OLS にバイアス」を抽象的に言うだけでなく、 SSDSE-B-2026 + ノイズ混入で実際に観察してみましょう。 真のパラメータが既知の状況を作り、 OLS と IV の推定がどれくらいズレるかを比較します。
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 | import pandas as pd, numpy as np import statsmodels.api as sm df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # A1301=15歳未満人口, A4101=出生数 # SSDSE データから X, IV を取り、 内生性を人工的に混入 np.random.seed(0) n = len(df) true_beta = 2.0 # 説明変数 X が誤差 ε と相関する形を作る eps = np.random.normal(0, 1, n) X_endo = df['A1301'].values / 1e5 + 0.7 * eps # 内生 y = true_beta * X_endo + eps # ε との相関がバイアス源 # 操作変数(外生):出生数 A4101 Z = df['A4101'].values / 1e5 # OLS ols_beta = np.linalg.lstsq(X_endo.reshape(-1, 1), y, rcond=None)[0][0] # 2SLS X_hat = np.polyval(np.polyfit(Z, X_endo, 1), Z) iv_beta = np.linalg.lstsq(X_hat.reshape(-1, 1), y, rcond=None)[0][0] print(f'真の β: {true_beta:.4f}') print(f'OLS β: {ols_beta:.4f} (バイアス {ols_beta - true_beta:+.4f})') print(f'IV (2SLS): {iv_beta:.4f} (バイアス {iv_beta - true_beta:+.4f})') # OLS は ε との相関でバイアス、 IV は外生な Z で補正 |
このように、 真のパラメータが既知のシミュレーションで OLS のバイアスの大きさを目で確認できます。 実データでは真の β が分からないため、 IV や DiD などの手法で「内生性を補正したら OLS とどれくらい違うか」を確認するのが定石です。
💡 教訓:内生性に気づかないまま OLS を使うと、 真の β から系統的に外れた結果を信じてしまいます。 シミュレーションで「バイアスはこんなに大きい」を体感しておくと、 実データでも警戒できます。
内生性とは「説明変数 X が誤差項 ε と相関してしまう」問題です。その源泉は大きく 3 つ——交絡変数・逆因果(同時性)・測定誤差。下のパネルで源泉を切り替え、強さを動かすと、OLS の推定係数が真値 β = 2.000 からどうバイアスするかが散布図と数値でリアルタイムに変わります。さらに操作変数(IV / 2SLS)を適用すると、外生な情報だけで真値へ戻る様子を対比できます。「内生性があると OLS は因果を測れない」を手で体感してください。
💡 図の上を左右にタップ/ドラッグしても「内生性の強さ」を動かせます(タッチ対応)
内生性は「あるか/ないか」だけでなく、どちら向きにどれだけずれるか(符号と大きさ)まで読めると実務で効きます。ここでは既出の各節(3 大原因の分類表・落とし穴拡張版・シミュレーション)と重複しない角度として、(1) 除外変数バイアスの符号の決まり方、(2) 測定誤差による希薄化の縮小率、(3) 統制変数を足すとかえって悪化するケース、の 3 点だけを圧縮して補足します。
重要な変数 U をモデルから落とすと、OLS 係数は真値 β からずれます。その向きは、ⓐ U が Y に与える効果 δ の符号と、ⓑ 落とした U と説明変数 X の相関 Corr(X, U) の符号、この2 つの符号の積で決まります。下表がそのまま「頭の中の早見表」になります。
| Corr(X, U) > 0 (X と U が同じ向き) |
Corr(X, U) < 0 (X と U が逆向き) |
|
|---|---|---|
| δ > 0(U は Y を押し上げる) | 上向きバイアス → 過大評価 | 下向きバイアス → 過小評価 |
| δ < 0(U は Y を押し下げる) | 下向きバイアス → 過小評価 | 上向きバイアス → 過大評価 |
実務メモ:符号すら誤るのはこのため。たとえば「勉強時間 → 成績」で地頭 U を落とすと(δ>0・Corr>0 なので)効果を過大評価し、政策提言が過剰投資に傾きます。真値の符号が知りたいだけでも、まず落とした変数の向きを DAG で書き出すのが先決です。
古典的測定誤差(観測 X = 真値 X* + 無相関の雑音 u)では、OLS 係数は次の縮小率 λ だけ縮みます。
plim β̂ = β · λ, λ = Var(X*) / ( Var(X*) + Var(u) ), 0 < λ < 1
λ は信頼性比。雑音が大きいほど λ は 0 に近づき、係数は符号を変えずに 0 方向へ縮小(希薄化)します=過小評価。架空の数値例:真値 β=2.0、Var(X*)=4、Var(u)=1 なら λ=4/5=0.8 で plim β̂=1.6。雑音が真値と同じ大きさ(Var(u)=4)になると λ=0.5 で β̂=1.0 まで縮みます。ここで要注意なのは、誤差が Y 側だけにあるなら OLS は不偏だという点——「誤差の入る場所(X か Y か)」で結論が変わるので、測定誤差=希薄化と短絡しないこと。多変量では、綺麗に測れた変数の係数まで巻き添えで歪む点も見落とされがちです。
「バイアスが心配だから説明変数を増やそう」は常に正しくはありません。次の 3 種は、統制するとむしろ内生性(X と ε の相関)を新たに生む「悪い統制(bad control)」です。
選択バイアスも本質は同じ:標本に入るか否か(選択指標)が X と結果の両方に依存するとき、「観測できた人だけ」に絞ること自体がコライダーの条件付けになり、X と ε を相関させます。だから選択バイアスは内生性の一種として扱え、対処も同系統になります(選択バイアス/Heckman 2 段階/逆確率重み付け IPW)。
原因の見立てが付いたら、処方箋は原因ごとに変わります。下表は「原因 → 第一選択の対処 → 用語集ページ」の対応です(リンクは実在ページのみ。専用ページが無い手法はテキスト表記)。
| 内生性の原因 | 第一選択の処方箋 | 関連ページ |
|---|---|---|
| 交絡(観測できない第三変数 U) | パネル固定効果/操作変数法/傾向スコア | 交絡・固定効果・パネルデータ・操作変数法 |
| 逆因果・同時性(Y→X も同時に存在) | 操作変数法/自然実験/連立方程式(3SLS・GMM) | 逆因果・同時性・操作変数法・自然実験 |
| 測定誤差(X を測り損なう→希薄化) | 操作変数法/信頼性補正/SEM | 測定誤差・操作変数法 |
| 選択バイアス(標本の集まり方が結果に依存) | Heckman 2 段階/逆確率重み付け(IPW) | 選択バイアス |
| 政策・制度の断絶を利用したい | 差分の差分(DID)/回帰不連続(RDD) | DID・RDD・自然実験 |
| そもそも内生性の有無を検定したい | Hausman 検定(OLS と IV の一致性を比較) | ハウスマン検定 |
制御関数法(control function)は、非線形モデルへ 2SLS の発想を一般化した手法です。第 1 段階で内生変数を外生変数・操作変数に回帰し、その残差を第 2 段階に説明変数として追加することで内生性を吸収します(本用語集に専用ページはありません)。線形なら 2SLS と一致し、プロビット等の非線形モデルでは制御関数法が使い分けの中心になります。
関連ページ一覧:操作変数法/ハウスマン検定/交絡/逆因果/同時性/測定誤差/選択バイアス/固定効果/パネルデータ/自然実験/DID/RDD。
ここまでの追補は横断(1 時点 47 県)で「統制を足すと係数が動く」ことを見せました。この節は角度を変え、同じ県を複数年追いかけるパネルで プールド OLS と固定効果(FE)で係数がどれだけ動くかを実測で示します。固定効果は固定効果・パネルデータの核心で、交絡(交絡)対策の第一選択の一つです。
内生性とは要するに「説明変数 X が誤差項 ε と相関している」状態でした。県データでは、その ε の中身の大部分は時間を通じてほぼ変わらない県固有の体質——物価水準・都市化度・産業構成・人口規模など——です。これらは観測しにくく、しかも X(例:教育費)とも Y(例:消費支出)とも相関するので、横断 OLS の傾きは「本当に X が Y を動かした分」に「体質の相乗り分」が混ざった合成物になります。
ここで効くのが変動の 2 分解です。パネルの全変動は「県どうしの差(群間 between)」と「同じ県の年による揺れ(群内 within)」に割れます。プールド OLS は両方を混ぜて使いますが、固定効果(within 推定)は各変数を県平均で引き算(デミーン)して群間差を丸ごと捨て、同じ県の中の時間変動だけで傾きを測ります。時間不変の体質は引き算で消えるので、そのぶんの内生性が落ちる——これが FE で係数が動く理由です。
SSDSE-B-2026 の47 都道府県 × 12 年(2012〜2023、計 564 標本)で、教育費 (L322108) が消費支出 (L3221) をどれだけ動かすかを同じ式で推定し、群間を捨てる前後を比べます。
| 推定法 | 使う変動 | 教育費の係数 | 読み方 |
|---|---|---|---|
| プールド OLS(全 564 点を 1 本の回帰) | 群間+群内(混合) | 3.517(相関 0.565) | 県の体質を含んだ合成傾き |
| 県固定効果(within・県平均でデミーン) | 群内のみ | 2.018 | 時間不変の県体質を除いた傾き |
| 二元固定効果(県+年でデミーン) | 群内かつ年共通ショックも除去 | 2.151 | 景気など全国一律の年効果も除いた傾き |
係数が動いたからといって FE 後が真値とは限りません。既出の①符号の反転・②希薄化・③悪い統制(コライダー)に加え、パネル特有の落とし穴を 3 つ挙げます。
プールド OLS・固定効果(within)・変量効果(between も使う)は、同じデータのどの変動を信じるかの選択です。「時間不変の交絡が疑わしいなら FE、そうでなく効率を取りたいなら変量効果」——このFE と変量効果の一致性を検定するのがハウスマン検定で、両者の係数差(今回なら 3.52 と 2.02 の乖離)が偶然の範囲かを問います。乖離が大きく有意なら「変量効果は内生性で汚れている=FE を採れ」という含意です。時間可変の交絡や逆因果が残るなら、FE を土台に操作変数法・DID・RDDを重ねるのが定石です。要点は「係数が動いた=どれかが正しい」ではなく、動いた方向と幅から誤差項に何が隠れているかを逆算すること。パネルは、その隠れた体質を見える化する道具です。
※ 数値は SSDSE-B-2026(cp932・2 行目の単位行を除外、47 県 × 2012〜2023 年)の実測。プールド OLS/within(県平均デミーン)/二元 FE(県+年デミーン)の傾きを最小二乗で算出。因果効果の確定ではなく、推定法で係数が動くことの実演です。