論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
内生性
Endogeneity
説明変数が誤差項と相関している問題。OLS推定がバイアスを持つ。操作変数法等で対処。
因果推論内生性endogeneity
📍 文脈💡 30秒結論

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

🍰 まずはやさしく

分析の邪魔になるノイズのようなものです。

計算結果がズレる原因を突き止めるために使います。

スマホの利用時間とテストの点数で起きます。

論文の中でどう使われているかを確認します。

論文中に 「内生性」として登場する用語。

内生性 とは:説明変数が誤差項と相関している問題。OLS推定がバイアスを持つ。操作変数法等で対処。

💡 30秒で分かる結論

🍰 まずはやさしく

データの関係が歪んでいる状態のことです。

正しい原因と結果を知るために使います。

お小遣いと成績の関係を調べる時に起きます。

まずはこの言葉の意味を短くまとめます。

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: 内生性(endogeneity)は説明変数が誤差項と相関する状態。 SSDSE-B-2026 で「教育費 L322108 ~ 消費支出 L3221」の OLS 回帰を行うと、 総消費支出は世帯の所得水準(未観測)で教育費と同時に決まるため、 同時性・欠落変数による内生性が発生する。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 L322101(食料費(二人以上の世帯)) L322102(住居費(二人以上の世帯)) L322108(教育費(二人以上の世帯)) 北海道 74,341 26,730 6,911 東京都 97,776 26,457 24,160 沖縄県 73,453 27,521 6,356 …(全 47 行)
 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()
📥 入力例: data/raw/SSDSE-B-2026.csv X: L3221(消費支出) y: L322108(教育費)
📤 実行例: OLS では消費支出の係数は正で大きく出る(消費が多い県ほど教育費も多い) ただしこの係数は「所得の高さ」が両者を同時に押し上げる分を含む → 純粋な因果効果とは解釈できない
💬 読み方: 本当は「世帯の経済力 → 教育費」の効果を知りたいが、 消費支出は所得と同時決定で誤差項と相関する。 結果として OLS 推定は内生性バイアスを含む。 操作変数法(IV)や固定効果で対処する必要がある。

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🗺️ 概念マップ — 3つの視点で体系を理解する

内生性 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス › 因果推論 › 観察研究 › 内生性

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 内生性 を置き、 そこから IV・重回帰・DiD・最小二乗法・単回帰・Ridge回帰 計 6 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「内生性」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「内生性」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引 — 拡張版

内生性(endogeneity)に関する用語を、 原因のタイプ・解決手法・診断 別に索引化します。

カテゴリキーワード(日本語)キーワード(英語)
原因のタイプ欠落変数バイアス、 同時性バイアス、 測定誤差、 自己選択、 サンプルセレクションomitted variable bias, simultaneity, measurement error, self-selection
解決手法操作変数法、 2段階最小二乗法、 差の差分析、 回帰不連続デザイン、 固定効果IV, 2SLS, DiD, RDD, fixed effects, GMM
診断・検定Hausman検定、 弱操作変数、 過剰識別検定(Sargan)、 Cragg-Donald FHausman test, weak IV, Sargan, Cragg-Donald, J-statistic
因果推論処置効果、 平均処置効果(ATE)、 反実仮想、 ランダム化treatment effect, ATE, counterfactual, randomization
関連概念外生性、 共変量、 交絡変数、 識別、 反応バイアスexogeneity, confounder, identification, response bias
実装ライブラリlinearmodels、 statsmodels、 econtools、 doWhy、 EconMLlinearmodels.iv.IV2SLS, statsmodels, doWhy, EconML

🧮 SSDSE-B での内生性事例 — 教育費と消費水準(実在列で実測)

SSDSE-B-2026 の実在列 教育費 L322108(二人以上の世帯、 円/月)と 消費支出 L3221(同、 円/月)を使い、 2023年度の47都道府県で内生性の問題を考えます。 なお SSDSE-B-2026 には「所得」「県内総生産 (GDP)」の列は存在しないため、 生活水準の代理として消費支出を用います(所得は未観測の欠落変数として登場します)。

① 単純な回帰分析(OLS)の落とし穴

消費支出 (L3221) = β₀ + β₁ × 教育費 (L322108) + ε
2023年度47都道府県で OLS 推定すると β₁ = +3.30(SE 0.70、 R² = 0.33。 実CSVでの実測値)
しかし、 これは因果的な解釈ができない。 なぜなら:
・所得(未観測)が高い県ほど教育費も総消費も多い(欠落変数
・教育費は総消費支出の一部でもあり同時決定される(同時性)
・家計調査ベースの支出には標本誤差が含まれる(測定誤差)

② 操作変数(IV)の候補

IV候補関連性外生性
都道府県の大学数(実在列 E6102)教育費と相関 r = 0.65 ◯(実測)消費全体に直接効果なしと仮定 △
義務教育延長改革(コホート)※SSDSE外の一般例教育年数を強制的に変える ◎結果変数には間接効果のみ ◎
家庭の蔵書数 ※SSDSE外の一般例弱い △直接効果あり懸念 ✕

③ 2SLS の推定結果(実CSVでの実測値)

第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 の外生性(大学数が消費支出に直接効かない)自体も検証不能な仮定である点に注意。

⚠️ 内生性の落とし穴 — 拡張版(実務で本当に困る5+件)

  1. 弱い操作変数(weak IV):第1段階の F 統計量が 10 未満の場合、 操作変数と説明変数の相関が弱すぎて 2SLS 推定量のバイアスが拡大する。 第1段階の F値、 Cragg-Donald F、 Stock-Yogo閾値の確認は必須。 弱IVを使うと OLS よりむしろ大きなバイアスが残り、 信頼区間も歪む。 操作変数の妥当性検証なしに 2SLS の結果を信じない。
  2. 外生性の検証不能性:「IV と誤差項が無相関」という外生性条件は データだけからは検証できない。 過剰識別検定(Sargan/Hansen)はIVが複数あるときのみ部分的に検証できるが、 識別ぎりぎりの場合は理論や制度的知見で正当化する必要がある。 計量経済学の論文ではIVの妥当性を数ページかけて議論することが多い。
  3. 欠落変数バイアスの方向誤認:欠落変数が説明変数と正に相関、 かつ目的変数にも正の効果を持つ場合、 OLSは効果を 過大評価 する。 逆方向なら過小評価。 親の学歴のような重要な欠落変数を考慮せずに「教育のリターン」を推定すると、 政策提言が誤った方向に進む。 因果ダイアグラム(DAG)を描いて整理する習慣を。
  4. サンプルセレクションバイアス:回答者が特定の特性を持つ集団に偏る(survivorship bias、 self-selection)と、 推定結果は母集団に一般化できない。 例えば「就業者の賃金関数」を推定しても、 失業中の人は観測されないため Heckman の2段階推定や逆確率重み付け(IPW)が必要。 サンプルがどうやって集まったかを常に問う姿勢が重要。
  5. 固定効果モデルでの時不変変数の消失:パネルデータで固定効果(FE)を入れると、 個人内で変化しない変数(性別、 出生地など)の係数は識別不能になる。 これらの効果を知りたい場合は random effects(変量効果)や Hausman-Taylor 推定量を検討。 単に FE を入れれば内生性が解決するわけではないことに注意。
  6. 同時方程式バイアス:需要関数と供給関数のように 互いに影響し合う 関係を片方の式だけで OLS 推定すると、 価格の係数が両方の効果を混在して推定してしまう。 連立方程式モデルや 3SLS、 GMM などで対応する。
  7. 因果関係を断定する弱い証拠:観察データのみで因果を主張するのは難しい。 IV、 DiD、 RDD などの自然実験的アプローチがあっても、 「外生性ショック」の妥当性、 共通トレンドの仮定、 局所平均処置効果(LATE)の解釈などに注意。 可能な限り RCT に立ち戻る選択肢を残す。

🐍 Python 実装バリエーション — linearmodels / statsmodels / EconML

以下は内生性への対処を各ライブラリの API で示すコードです。 上の実測事例と同じく、 SSDSE-B-2026 の実在列で「消費支出 (L3221) を教育費 (L322108) で説明し、 操作変数に大学数 (E6102) を使う」という因果構造を扱います(2023年度47都道府県)。 省略変数バイアスを実在列で動かす実演は別掲の「🐍 Python 実装」節も参照してください。

① linearmodels(IV/2SLS の専門ライブラリ)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 E6102(大学数) L3221(消費支出(二人以上の世帯)) L322108(教育費(二人以上の世帯)) 北海道 37 296,888 6,911 東京都 144 341,320 24,160 沖縄県 8 251,222 6,356 …(全 47 行)
 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)
📤 実行例(実測) IV-2SLS Estimation Summary ============================================================================== Dep. Variable: L3221 R-squared: 0.3234 Estimator: IV-2SLS Adj. R-squared: 0.3084 No. Observations: 47 F-statistic: 16.439 Date: Sun, Aug 16 2026 P-value (F-stat) 0.0001 Time: 17:34:30 Distribution: chi2(1) Cov. Estimator: robust …(以下略)

② statsmodels(OLSとの比較用)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 L3221(消費支出(二人以上の世帯)) L322108(教育費(二人以上の世帯)) 北海道 296,888 6,911 東京都 341,320 24,160 沖縄県 251,222 6,356 …(全 47 行)
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推定値(バイアスあり可能性)
📤 実行例(実測) OLS Regression Results ============================================================================== Dep. Variable: L3221 R-squared: 0.331 Model: OLS Adj. R-squared: 0.316 Method: Least Squares F-statistic: 22.27 Date: Sun, 16 Aug 2026 Prob (F-statistic): 2.33e-05 Time: 17:34:32 Log-Likelihood: -531.05 No. Observations: 47 AIC: 1066. Df Residuals: 45 BIC: …(以下略)

③ Hausman検定(内生性の有無を判定)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) L3221(消費支出(二人以上の世帯)) L322108(教育費(二人以上の世帯)) 北海道 5,092,000 296,888 6,911 東京都 14,086,000 341,320 24,160 沖縄県 1,468,000 251,222 6,356 …(全 47 行)
 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を採用
📤 実行例(実測) Model Comparison ================================================ OLS 2SLS ------------------------------------------------ Dep. Variable L322108 L322108 Estimator OLS IV-2SLS No. Observations 564 564 Cov. Est. robust robust R-squared 0.3192 0.8922 Adj. R-squared 0.3180 0.8920 F-statistic 210.75 2325.1 P-value (F-stat) 0.0000 0.0000 ================== ============ ========== const -1.534e+04 …(以下略)

④ EconML(機械学習 × 因果推論)

 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']]))

⑤ doWhy(因果推論パイプライン)

 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 の前提(内生性違反時の崩壊)
OLS は E[ε|X]=0 を仮定。 内生性が存在するとこの前提が崩れ、 推定値はバイアスを持つ。

→ 内生性の検出は「残差診断 → 多重共線性 → OLS 仮定検証」の順で進める。 検出されれば操作変数法 (IV) や Hausman 検定で対処。

✅ 理解度チェック

  1. 内生性の主な原因 3 つを列挙できるか? (ヒント:欠落変数 / 同時方程式 / 測定誤差)
  2. OLS の前提 E[ε|X]=0 が崩れると、 推定値にどのような影響があるか?
  3. 操作変数法 (IV) で使う変数の必要条件 2 つは?
  4. Hausman 検定の帰無仮説は何か?
  5. SSDSE-B の「教育費 (L322108) と消費支出 (L3221)」の分析で内生性が起きる典型シナリオを 1 つ挙げよ。

→ 全項目に答えられれば、 計量経済学の因果推論を実務に応用できる。

🧮 数式に値を入れて手で計算する: 内生性によるバイアス

合成データで OLS 推定値と真の係数のずれを計算する。

Step 1: 真のモデル

y = 2x + 3z + ε x と z は相関 (Cov(x,z)=0.5) z を観測できず OLS で y ~ x のみで推定

Step 2: バイアスの公式

bias = β_z · (Cov(x,z)/Var(x)) 真の β_x = 2 Var(x) = 1, Cov(x,z) = 0.5, β_z = 3 bias = 3 × 0.5 / 1 = 1.5 推定 b_x = 2 + 1.5 = 3.5 (50% 過大)

🐍 Python で再現

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}")

📤 実行結果

バイアス: 1.5 推定値: 3.5 真値: 2

💬 手計算 (Step 2) バイアス 1.5 と Python 出力が完全一致。

🔗 隣接手法への橋渡し

内生性は単独の問題ではなく、 因果推論 ・操作変数 ・差分の差分 ・固定効果 ・自然実験を貫く中核的な障害である。 観察データから因果効果を推定するときは必ず内生性の有無を最初に検討する。

内生性は「説明変数と誤差項が相関してしまう状況」で、 上流の研究設計で因果構造を描き、 並列の操作変数・差分の差分・固定効果と組み合わせ、 下流の係数推定が偏らないようにモデル選択を行う必要がある。

🔖 キーワード索引

endogeneity」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「endogeneity」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

内生性交絡変数操作変数法IV 推定2SLS外生性バイアス同時性因果推論

これらのキーワードは「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 バイアスが乗る。

Step 1: 真のモデルと観測する変数

真: L322108 = β1·E1101 + β2·C5401 + ε (β1=2.5, β2=1.8 とする) 観測モデル (省略): L322108 = β1·E1101 + u (u = β2·C5401 + ε) E1101 と C5401 の相関: Cov(E1101, C5401) ≠ 0 → 省略変数バイアス発生

Step 2: バイアスの公式

bias = β2 · (Cov(E1101, C5401) / Var(E1101)) SSDSE-B-2026 (2023年度47都道府県、 標準化後) で Cov(E1101, C5401) = +0.89 (実測。 正、 地価が高い都市部ほど幼稚園が多い) Var(E1101) = 1.0 (標準化後) bias = 1.8 × 0.89 / 1.0 = +1.61 OLS 推定値 = β1 + bias = 2.5 + 1.61 = 4.11

Step 3: 真値からの乖離

真の β1 = 2.5 (仮定) OLS 推定値 = 4.11 乖離 = +64.2% (大きすぎる) → 「学校が 1 増えると教育費が 4.1 上がる」と誤って解釈してしまう (実際は 2.5)

これが内生性 (= 説明変数と誤差項が相関) によるバイアス。 SSDSE-B-2026 のように「県の規模」が裏に隠れていると、 ほぼ全ての OLS で同様のバイアスが乗る。

🐍 Python 実装

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で実行):

真モデル E1101 係数: -0.013 省略 OLS E1101 係数: 0.655 (バイアス込み)

💬 結果の読み方: 省略 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 方向に配置した。

内生性 前提: OLS/DAG 並列: 交絡/選択 発展: IV/2SLS 応用: 県別パネル 対比: 外生変数 統合: DiD/RDD

🔗 隣接手法への橋渡し

「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) / 因果フォレスト

選んだ後の検証ステップ (因果推論固有)

  1. 識別仮定の明示: 操作変数なら「除外制約 (Z は ε と無相関)」「関連性 (Z と X の相関が十分強い)」を明示し、 第 1 段階の F 統計量 ≥ 10 を確認 (弱操作変数の回避)
  2. Hausman 検定: OLS 推定量と 2SLS 推定量を比較し、 内生性が統計的に有意か検定する
  3. 過剰識別検定 (Sargan / Hansen J): 操作変数が複数ある場合、 すべてが本当に外生か検定する
  4. 並行トレンド仮定の検証 (DiD の場合): 処置前期間で処置群と対照群のトレンドが一致しているかを可視化・プラセボ検定で確認
  5. 感度分析: 未観測交絡因子がどの程度強ければ結果が反転するかを評価 (Rosenbaum bounds、 E-value 等)
  6. 結果の経済学的・分野的解釈: 推定された因果効果の符号と大きさが、 既存理論や先行研究と整合的かを必ず検討する

🧮 補強:内生性の 3 大原因を SSDSE-B-2026 で見抜く

「説明変数 X が誤差項 ε と相関する」内生性は、 抽象的に聞こえますが具体的な原因は 3 つに分類できます。 SSDSE-B-2026(47 都道府県データ)の文脈で、 それぞれをどう識別し、 どう対処するかを整理します。

原因 メカニズム SSDSE-B での例 主な対処
欠落変数バイアス 真に重要な変数がモデルから外れている 「幼稚園数 (E1101) → 教育費 (L322108)」を分析する際、 「地価 (C5401)」を入れないと過大評価 変数追加、 固定効果
逆因果(同時性) Y → X の方向も同時に存在 「一般診療所数 (I5102) ↔ 65歳以上人口 (A1303)」は両方向的になり得る 操作変数法、 DiD
測定誤差 X が真の値ではなく観測値(ノイズあり) 「消費支出 (L3221)」は家計調査の標本平均で、 標本誤差を含む 操作変数法、 SEM

🐍 Hausman 検定 — OLS と IV を比較して内生性を判別

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) 北海道 5,092,000 514,000 東京都 14,086,000 1,513,000 沖縄県 1,468,000 236,000 …(全 47 行)
 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 で内生性あり
📤 実行例(実測) OLS β: 8.9361 IV β : 7.354 Wu-Hausman test of exogeneity H0: All endogenous variables are exogenous Statistic: 24.4267 P-value: 0.0000 Distributed: F(1,43)

📊 各対処法の適用条件

手法必要な条件SSDSE-B での適用可能性
操作変数法 (IV)IV が外生かつ X と相関地理的・歴史的変数を IV にできる
DiD処置と非処置、 前後パネル時系列パネル化が必要
固定効果時間不変な交絡のみパネル化すれば適用可能
RDD処置がスコアで決まる行政区分が境界 → 適用余地
傾向スコア観測される交絡のみ県特性で重み付け可能

💡 判断フロー:(1) 理論的に内生性を疑うべき変数を特定 → (2) Hausman / Wu 検定で統計的に確認 → (3) 利用可能なデータ構造(パネル? 自然実験?)に応じた手法選択 → (4) 結果を OLS と比較し感度分析、 が王道です。

📚 補強2:内生性対処の「因果推論パイプライン」— 5 ステップ

実務で内生性に対処するときは、 単一手法に頼らず 5 段階のパイプライン で取り組むのが定石です。 SSDSE-B-2026 を題材に、 各ステップで何をするかを整理します。

📋 5 ステップ概要

Step 作業 出力物
1因果図(DAG)作成変数間の前提を明示
2内生性源の同定欠落 / 逆因果 / 測定の分類
3手法選択IV / DiD / FE / 傾向スコア
4推定 + 検定Hausman / 弱操作変数検定
5感度分析未観測交絡への耐性

🔬 Step 1:DAG(有向非巡回グラフ)で前提を可視化

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()

🐍 Step 4:弱操作変数検定 — IV が信頼できるか

操作変数法(IV)は「強い操作変数」を前提とします。 弱い IV では推定がかえって悪化するため、 第 1 段階の F 統計量で IV の強さを確認します(経験則:F > 10)。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1301(15歳未満人口) A4101(出生数) 北海道 514,000 24,430 東京都 1,513,000 86,348 沖縄県 236,000 12,549 …(全 47 行)
 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) と極めて強い
📤 実行例(実測) 第 1 段階 F 統計量: 9915.6 F > 10 なら IV は強い(経験則)

🌐 Step 5:感度分析 — Rosenbaum の境界 / E-value

観測されない交絡が結果を反転させるには「どれくらい強い必要があるか」を計算するのが感度分析です。 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 倍以上関連していないと結果は説明できない
📤 実行例(実測) E-value: 4.44

💡 パイプライン全体のチェックリスト

  1. DAG を描けるか?(描けないなら因果分析を諦める方が誠実)
  2. 内生性源を 3 分類のどれか特定できたか?
  3. 選んだ手法の前提条件はデータが満たすか?
  4. 統計的検定で内生性 / IV の強さを確認したか?
  5. 感度分析で結論の頑健性を確認したか?

💡 論文への教訓:因果推論の論文は「手法が正しい」だけでなく「前提が明示されている」が査読の通過点。 DAG と感度分析を併記するだけで査読者の信頼が上がります。

📚 補強3:内生性研究の歴史と関連手法マップ

内生性(endogeneity)は、 計量経済学が「観測データから因果関係を読み取る」ために闘ってきた最大の難題の一つです。 その歴史を概観すると、 現代の因果推論手法が「なぜそうあるか」が見えてきます。

🕰 計量経済学が築いた階段

手法・出来事 代表的論文・人物
1928Wright が操作変数法 (IV) を提唱Philip Wright
1944Haavelmo が「確率的アプローチ」を確立Trygve Haavelmo (1989 ノーベル賞)
19582SLS の体系化Theil, Basmann
1978Hausman 検定の登場Jerry Hausman
1994Card & Krueger の DiD 古典最低賃金研究
2000s「クレディビリティ革命」Angrist, Imbens, Pischke
2021自然実験の方法でノーベル賞Card, Angrist, Imbens

🌐 関連手法の全体マップ

内生性に対処する手法は大きく 4 つの系統に分かれます。 それぞれの強み・弱みを整理しておくと、 実データに直面したときの選択肢がクリアになります。

系統 代表手法 必要なデータ構造 主な仮定
操作変数 IV, 2SLS, LIML, GMM 外生な IV 変数 関連性と除外制約
準実験 DiD, RDD, 合成統制法 処置タイミング, 閾値 共通トレンド等
パネル 固定効果, ランダム効果 パネルデータ 時間不変交絡のみ
マッチング 傾向スコア, NN マッチング 処置と対照群 条件付き独立性

🐍 統合実装:4 手法を SSDSE-B-2026 で並べる

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) 北海道 5,092,000 514,000 1,681,000 東京都 14,086,000 1,513,000 3,205,000 沖縄県 1,468,000 236,000 350,000 …(全 47 行)
 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 手法で β がどう変わるか比較
# 大きく変わるなら内生性の疑い濃厚
📤 実行例(実測) OLS: β = 8.9361 OLS + 制御: β = 6.6078 IV (2SLS): β = 7.3540

📐 「弱い操作変数」問題

2000 年代以降、 IV の最大の問題は「弱い操作変数」であることが明らかになりました。 関連性が弱い IV を使うと、 OLS バイアスを直す前にもっと大きな 2SLS バイアス が生じます。 Stock-Yogo (2005) の表で、 必要な第 1 段階 F 統計量を確認するのが標準的です。

IV の数Stock-Yogo 臨界値(10% バイアス)
116.4
219.9
322.3

💡 論文掲載時の必須項目:(1) 第 1 段階の F 統計量、 (2) 過識別検定(Sargan / Hansen J)、 (3) Hausman 検定、 (4) 感度分析(E-value 等)。 これらを併記してはじめて、 査読を通る因果推論論文になります。

🧪 補強4:内生性のシミュレーション実演 — バイアスを目で見る

「内生性 = OLS にバイアス」を抽象的に言うだけでなく、 SSDSE-B-2026 + ノイズ混入で実際に観察してみましょう。 真のパラメータが既知の状況を作り、 OLS と IV の推定がどれくらいズレるかを比較します。

🐍 擬似実験コード

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1301(15歳未満人口) A4101(出生数) 北海道 514,000 24,430 東京都 1,513,000 86,348 沖縄県 236,000 12,549 …(全 47 行)
 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 で補正
📤 実行例(実測) 真の β: 2.0000 OLS β: 2.0808 (バイアス +0.0808) IV (2SLS): 2.0378 (バイアス +0.0378)

このように、 真のパラメータが既知のシミュレーションで OLS のバイアスの大きさを目で確認できます。 実データでは真の β が分からないため、 IV や DiD などの手法で「内生性を補正したら OLS とどれくらい違うか」を確認するのが定石です。

💡 教訓:内生性に気づかないまま OLS を使うと、 真の β から系統的に外れた結果を信じてしまいます。 シミュレーションで「バイアスはこんなに大きい」を体感しておくと、 実データでも警戒できます。

🎮 触って理解する

内生性とは「説明変数 X が誤差項 ε と相関してしまう」問題です。その源泉は大きく 3 つ——交絡変数逆因果(同時性)測定誤差。下のパネルで源泉を切り替え、強さを動かすと、OLS の推定係数が真値 β = 2.000 からどうバイアスするかが散布図と数値でリアルタイムに変わります。さらに操作変数(IV / 2SLS)を適用すると、外生な情報だけで真値へ戻る様子を対比できます。「内生性があると OLS は因果を測れない」を手で体感してください。

0 = 内生性なし(OLS は正しい) → 右へ動かすほど X と ε の相関が強くなる
左端まで下げると「弱い操作変数」。関連がごく弱いと IV 推定も真値からずれ始めます(特に測定誤差モードで顕著)

💡 図の上を左右にタップ/ドラッグしても「内生性の強さ」を動かせます(タッチ対応)

🧭 直感・落とし穴・発展

直感:OLS は「X が動いたぶんの Y の変化」をすべて X の効果だと解釈します。ところが X が誤差項 ε(= X 以外で Y を動かす一切の要因)と相関していると、ε 由来の Y の動きまで X の係数に混ぜ込んでしまう。だから推定値は真値 β から系統的にズレ、サンプルを増やしても消えません(バイアスであって分散ではない)。数式では OLS 係数 = β + Cov(X, ε) / Var(X)。第 2 項がまさにバイアスです。
よくある落とし穴:
発展:内生性への代表的な処方箋——

🧭 追補:内生性を「符号」で読む — 除外変数バイアスの向き・希薄化・統制のパラドックス

内生性は「あるか/ないか」だけでなく、どちら向きにどれだけずれるか(符号と大きさ)まで読めると実務で効きます。ここでは既出の各節(3 大原因の分類表・落とし穴拡張版・シミュレーション)と重複しない角度として、(1) 除外変数バイアスの符号の決まり方、(2) 測定誤差による希薄化の縮小率、(3) 統制変数を足すとかえって悪化するケース、の 3 点だけを圧縮して補足します。

① 除外変数バイアスは「2 つの符号の掛け算」で向きが決まる

重要な変数 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 で書き出すのが先決です。

② 測定誤差は係数を「必ず 0 方向へ」縮める(希薄化の縮小率)

古典的測定誤差(観測 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)。

📊 SSDSE-B-2026 実測(2023年度・47都道府県):教育費 (L322108) で消費支出 (L3221) を説明する単回帰の係数は 3.298(R²=0.331)。ここに総人口 (A1101) を統制として足すと係数は 3.515 へ動きます(R²=0.333)。相関は Corr(教育費, 消費支出)=0.575、Corr(教育費, 人口)=0.639。統制を 1 本足すだけで係数が動く事実は確認できますが、どちらが真値に近いかはデータだけでは判定できません。上の①〜③の枠組み(DAG)で「その統制が裏口を閉じるのか、コライダーを開くのか」を先に決めることが不可欠です。

🧭 深掘り:パネルで「係数が動く」——群間(between)と群内(within)の分解で内生性を体感する

ここまでの追補は横断(1 時点 47 県)で「統制を足すと係数が動く」ことを見せました。この節は角度を変え、同じ県を複数年追いかけるパネルプールド OLS と固定効果(FE)で係数がどれだけ動くかを実測で示します。固定効果は固定効果パネルデータの核心で、交絡(交絡)対策の第一選択の一つです。

① 直感:誤差項に「県ごとの体質」が隠れている

内生性とは要するに「説明変数 X が誤差項 ε と相関している」状態でした。県データでは、その ε の中身の大部分は時間を通じてほぼ変わらない県固有の体質——物価水準・都市化度・産業構成・人口規模など——です。これらは観測しにくく、しかも X(例:教育費)とも Y(例:消費支出)とも相関するので、横断 OLS の傾きは「本当に X が Y を動かした分」に「体質の相乗り分」が混ざった合成物になります。

ここで効くのが変動の 2 分解です。パネルの全変動は「県どうしの差(群間 between)」と「同じ県の年による揺れ群内 within)」に割れます。プールド OLS は両方を混ぜて使いますが、固定効果(within 推定)は各変数を県平均で引き算(デミーン)して群間差を丸ごと捨て、同じ県の中の時間変動だけで傾きを測ります。時間不変の体質は引き算で消えるので、そのぶんの内生性が落ちる——これが FE で係数が動く理由です。

② 実測:プールド OLS 3.52 → 固定効果 2.02(教育費 → 消費支出)

SSDSE-B-2026 の47 都道府県 × 12 年(2012〜2023、計 564 標本)で、教育費 (L322108) が消費支出 (L3221) をどれだけ動かすかを同じ式で推定し、群間を捨てる前後を比べます。

推定法 使う変動 教育費の係数 読み方
プールド OLS(全 564 点を 1 本の回帰) 群間+群内(混合) 3.517(相関 0.565) 県の体質を含んだ合成傾き
県固定効果(within・県平均でデミーン) 群内のみ 2.018 時間不変の県体質を除いた傾き
二元固定効果(県+年でデミーン) 群内かつ年共通ショックも除去 2.151 景気など全国一律の年効果も除いた傾き
📊 SSDSE-B-2026 実測:時間不変の県体質を落とすだけで係数は 3.52 → 2.02 と約 43% も縮みました。差の 約 1.5 ぶんが、横断 OLS では「教育費の効果」に化けて混入していた県体質の相乗りです。二元固定効果でも 2.15 とほぼ同水準で、群間を捨てた 2.0 前後が「同じ県の中で見た」より素直な傾きだと分かります。ただしこれは因果の確定ではありません——後述のとおり FE でも残る内生性があります。

③ 落とし穴:固定効果は「万能の内生性除去装置」ではない

係数が動いたからといって FE 後が真値とは限りません。既出の①符号の反転・②希薄化・③悪い統制(コライダー)に加え、パネル特有の落とし穴を 3 つ挙げます。

④ 発展:between/within の使い分けと「どちらを信じるか」

プールド OLS・固定効果(within)・変量効果(between も使う)は、同じデータのどの変動を信じるかの選択です。「時間不変の交絡が疑わしいなら FE、そうでなく効率を取りたいなら変量効果」——このFE と変量効果の一致性を検定するのがハウスマン検定で、両者の係数差(今回なら 3.52 と 2.02 の乖離)が偶然の範囲かを問います。乖離が大きく有意なら「変量効果は内生性で汚れている=FE を採れ」という含意です。時間可変の交絡や逆因果が残るなら、FE を土台に操作変数法DIDRDDを重ねるのが定石です。要点は「係数が動いた=どれかが正しい」ではなく、動いた方向と幅から誤差項に何が隠れているかを逆算すること。パネルは、その隠れた体質を見える化する道具です。

※ 数値は SSDSE-B-2026(cp932・2 行目の単位行を除外、47 県 × 2012〜2023 年)の実測。プールド OLS/within(県平均デミーン)/二元 FE(県+年デミーン)の傾きを最小二乗で算出。因果効果の確定ではなく、推定法で係数が動くことの実演です。