論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
操作変数法
Instrumental Variable (IV)
内生性のある説明変数の「外生的な変動」だけを取り出す操作変数(IV)を使って推定する手法。
因果推論IVIV操作変数2SLS

🔖 キーワード索引 — 完全強化版

🔖 キーワード索引 — 完全強化版

「操作変数法(IV)」を理解するうえで必要なキーワードを 10 件以上提示します。 各チップから対応セクションへ移動できます。

30 秒結論 文脈 直感 数式 記号読み解き 実値計算 Python 実装 落とし穴 関連手法 関連用語 グループ教材 概念マップ

💡 30秒で分かる結論

🍰 まずはやさしく

データの汚れを取り除くフィルターのような手法です。

本当の原因と結果を正しく見つけるために使います。

お小遣いの額が勉強時間にどう影響するかを調べます。

この手法の結論を短くまとめました。

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

📍 学習の3ステップ

  1. 定義を理解する:操作変数法 (IV) とは何か? 外生性・関連性の 2 条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「消費支出(L3221)→ 教育費(L322108)」の効果を推定したいが、 交絡(教育熱心な世帯ほど消費全体も大きい)が問題。 操作変数として総人口(A1101, 都市規模の代理)を教育的な例として使う。
📥 入力例(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
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# SSDSE-B-2026 を読み込み IV 推定用に列を整える
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 2SLS: Y=教育費(L322108), X=消費支出(L3221,内生), Z=総人口(A1101,操作変数)
from linearmodels.iv import IV2SLS
res = IV2SLS(df['L322108'], None, df[['L3221']], df[['A1101']]).fit()
print(res.summary)
print('第 1 段階 F 値:', res.first_stage.diagnostics['f.stat'])
📥 入力例: data/raw/SSDSE-B-2026.csv 内生変数 X: 消費支出(L3221) 操作変数 Z: 総人口(A1101) 結果変数 Y: 教育費(L322108)
📤 実行例(564 行 = 47 都道府県 × 12 年で実測): IV 推定: L3221 の係数 = 0.0434 (標準誤差 0.0009, p < 0.001) 同じ式を OLS で解くと 0.0377 第1段階 F 値: 383.84 (>10 で強い)
💬 読み方: 消費支出が 1 千円増えると教育費は OLS で 37.7 円、 IV で 43.4 円増える。 OLS のほうが小さく、 内生性で過小推定されていたと読める。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

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

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

🎯 SSDSE-B-2026 で挑戦 — IV 分析の題材

SSDSE-B-2026(47 都道府県の社会経済データ)には IV 分析に向く「内生変数 X」「操作変数 Z 候補」「結果変数 Y」が揃う。 以下は IV が威力を発揮する典型問題:

💡 IV 推定でよく使うコマンド集

機能 Python (statsmodels / linearmodels) 補足
2SLS 推定linearmodels.iv.IV2SLS(y, exog, endog, instr).fit()標準的な 2 段階最小二乗
第 1 段階 F 値results.first_stage[0].rsquared / .fvalueF < 10 で弱操作変数
Hausman 検定linearmodels.iv.results.compareOLS vs IV の有意差
Sargan 検定results.sargan過剰識別の妥当性(IV 数 > 内生変数数)
Anderson-Rubin 信頼区間results.anderson_rubin弱 IV に頑健な区間推定
GMM 推定linearmodels.iv.IVGMM(...).fit()過剰識別かつ異分散頑健
LIML 推定linearmodels.iv.IVLIML(...).fit()弱 IV バイアスに頑健

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

操作変数法 (IV) は内生性・因果推論・2SLS・差分の差・Wald 推定など多くの計量経済学概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

💡 30 秒で分かる結論 — 完全強化版

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

🍰 まずはやさしく

分析の精度を上げるための専門的な道具です。

データの中にある複雑な関係を整理するために使います。

地域の消費額と教育費の関係を分析します。

この用語がどのような場面で使われるかを確認します。

論文中に 「操作変数法」として登場する用語。

操作変数法 とは:内生性のある説明変数の「外生的な変動」だけを取り出す操作変数(IV)を使って推定する手法。

📍 文脈ボックス — あなたが今見ているもの(完全強化版)

このセクションは「操作変数法(IV)」を扱う 用語ページ です。 統計データ分析コンペティション(2026)の再現教材における中核用語のひとつで、消費支出 (L3221) → 教育費 (L322108) における操作変数の使用 という観点で SSDSE-B-2026(47 都道府県 × 複数年 × 100 超列)に紐づけられます。

位置づけ:相関線形回帰仮説検定 といった基礎用語群と並列であり、応用としては 内生性IVDIDクラスタリング 等へ繋がります。

🎨 直感で掴む — 完全強化版

🍰 まずはやさしく

データを見るための特別な眼鏡のようなものです。

隠れた影響を分けて、本当の関係を浮かび上がらせます。

都市の大きさが教育費にどう関わるかを考えます。

直感的にイメージしやすい例で仕組みを解説します。

操作変数法(IV) を一言でいえば「消費支出 (L3221) → 教育費 (L322108) における操作変数の使用」。 47 都道府県という小さな母集団でも、 SSDSE-B-2026 の L322108 列に注目すると、 大都市圏と地方の差・人口規模に伴う相対比較など、 様々なパターンが見えてきます。

比喩でいうと、 操作変数法(IV) はデータ分析の「眼鏡」のようなもの。 同じデータでも眼鏡を変えれば、 平均(中心)・分散(ばらつき)・相関(連動)・因果(影響)と、 異なる情報が浮かび上がります。 SSDSE-B-2026 を題材に、 この眼鏡をかけてみるのが本ページの狙いです。

🎨 概念図で押さえる

操作変数法(IV)は内生性のある説明変数を、 関連性のある外生変数で「ろ過」して推定する手法。 第 1 段階回帰の当てはまり・第 2 段階の予測値の散らばりを可視化する 3 枚で直感を補強する。

操作変数の分布ヒストグラム
操作変数 Z の分布。 Z にバラツキがないと IV 推定は弱まる(弱操作変数問題)。
操作変数 Z と内生変数 X の散布図
Z と X の散布図(第 1 段階)。 強い関連があるほど IV 推定の標準誤差は小さくなる。
第 1 段階回帰のフィット
第 1 段階回帰:X を Z に回帰した予測値 X̂ を第 2 段階で使う。

✅ 理解度チェック

  1. 操作変数が満たすべき 2 条件(関連性・外生性)を説明できるか。
  2. 2 段階最小二乗法(2SLS)の手順を簡潔に書けるか。
  3. 「弱操作変数」とは何か、 F 統計量との関係を説明できるか。
  4. 過剰識別検定(Sargan/Hansen)の目的を 1 行で述べられるか。

🎮 触って理解する

2 本のスライダーを動かすと、内生性のある説明変数 X(消費支出の代理)と操作変数 Z から生成したデータで、OLS 推定(偏る)IV / 2SLS 推定(真値に近い) がリアルタイムに変わります。真の因果効果は β = 2.00 に固定。散布図・数値・第 1 段階 F 統計量を見ながら「誤差と無相関な外部変動 Z を借りて因果を測る」感覚を体感してください。

① 内生性の強さ(X と誤差の相関)
② 操作変数の関連強度(第 1 段階の強さ)

※ データ生成は固定シードの疑似乱数で決定論的(n = 70)。真値 β=2、X = 関連強度·Z + 内生性·交絡 + 雑音、誤差 u = 内生性·交絡 + 雑音。OLS は Cov(X,u)≠0 で偏り、IV は Cov(Z,u)=0 を使って β̂_IV = Cov(Z,Y)/Cov(Z,X) で真値へ。関連強度を 0 付近にすると弱操作変数で IV が不安定になります。

💡 直感 — 外生的な変動を「借りて」因果を測る

説明変数 X が誤差項と相関する(内生性がある)と、OLS は「X が原因で Y が動いた分」と「交絡で両方が動いた分」を区別できず偏ります。操作変数 Z は X を動かすが(関連性 Cov(Z,X)≠0)、誤差とは無相関(外生性・除外制約 Cov(Z,u)=0) という性質を持ちます。Z が生む「誤差と無相関な X の変動」だけを取り出し、その変動に対する Y の反応を測ることで、交絡に汚染されない因果効果が復元できます。上のスライダーで内生性を上げると OLS 線だけが真の傾き(β=2)から離れ、IV 線がそこに留まる様子が確認できます。

🕳️ よくある落とし穴

🚀 発展 — 2SLS・LATE・自然実験

操作変数が 1 個・内生変数が 1 個なら上の Wald 比 Cov(Z,Y)/Cov(Z,X) が答えですが、一般には 2 段階最小二乗法(2SLS)で扱います:第 1 段階で X を Z(と外生統制)に回帰して予測値 X̂ を作り、第 2 段階で Y を X̂ に回帰します。X̂ は「Z 由来の外生的変動」のみを含むため内生性が除かれます。実証では、政策導入のタイミングや地理・気候ショックなど、研究者が意図せず割り当てが起きた 自然実験 を Z に用いるのが定石で、差分の差分(DID) や回帰不連続と組み合わせて識別を補強します。関連概念は 交絡線形回帰 も参照。

📐 数式または定義 — 完全強化版

🍰 まずはやさしく

計算式を使って正解を導き出すルールです。

条件を満たす変数(指標)を使って正確に推定します。

消費支出と教育費のデータを数式に当てはめます。

定義や計算に必要な条件について詳しく読みます。

操作変数法(IV) の代表的な定義式は次のとおりです。

$$ \hat{\beta}_{IV} = \frac{\mathrm{Cov}(Z, Y)}{\mathrm{Cov}(Z, X)}, \quad \text{要件: }\mathrm{Cov}(Z, u)=0,\;\mathrm{Cov}(Z, X)\neq 0 $$

ここで使われる記号や演算の意味は次節で言葉に翻訳します。

🔬 数式を言葉で読み解く — 完全強化版

数式の各記号を、日本語の意味に変換します。

🧮 SSDSE-B-2026 で IV 推定 — 消費支出 → 教育費

🧮 SSDSE-B-2026 で IV 推定 — 消費支出 → 教育費

「世帯の消費支出(L3221)→ 教育費(L322108)」を推定する際、 消費支出は世帯の経済力や価値観といった未観測要因と相関するため内生性を持ちます。 操作変数としては本来「地域固有の物価・歴史的要因」など外生的なものが望ましいですが、 ここでは教育的な例として総人口(A1101, 都市規模の代理)を IV に用いて 2SLS を実演します(教育的サンプル)。

① 2SLS の手順

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「消費支出(L3221)→ 教育費(L322108)」の効果を推定したいが、 交絡(教育熱心な世帯ほど消費全体も大きい)が問題。 操作変数として総人口(A1101, 都市規模の代理)を教育的な例として使う。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) L3221(消費支出(二人以上の世帯)) L322108(教育費(二人以上の世帯)) 北海道 5,092,000 1,681,000 296,888 6,911 東京都 14,086,000 3,205,000 341,320 24,160 沖縄県 1,468,000 350,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
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
y = df['L322108'].astype(float)            # 結果 Y: 教育費
X_endog = df['L3221'].astype(float)       # 内生変数 X: 消費支出
Z = df['A1101'].astype(float)              # 操作変数 Z: 総人口(教育的な仮定)
W = df['A1303'].astype(float)              # 外生コントロール: 65歳以上人口

# 第一段階:X = π0 + π1 Z + π2 W + v
first = sm.OLS(X_endog, sm.add_constant(pd.concat([Z, W], axis=1))).fit()
F = first.fvalue   # 弱操作変数の判定
print(f'First-stage F = {F:.2f}')
X_hat = first.fittedvalues

# 第二段階:y = β0 + β1 X̂ + β2 W + u
second = sm.OLS(y, sm.add_constant(pd.concat([X_hat, W], axis=1))).fit()
print(second.summary())
📥 入力例: data/raw/SSDSE-B-2026.csv 内生変数 X: 消費支出(L3221) 操作変数 Z: 総人口(A1101) 結果変数 Y: 教育費(L322108)
📤 実行例(実測): First-stage F = 22.75 第 2 段階の係数: 消費支出(X̂) = 0.3653、 A1303 = -0.0005、 定数項 = -93829.82
💬 読み方: 65歳以上人口 W を統制すると係数は 0.3653 に上がる。 F = 22.75 > 10 なので操作変数は弱くない。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

② 出力例(仮想数値)

推定消費支出の係数SE解釈
OLS(バイアスあり)28.45.2価値観 ↔ 消費の交絡で過大
IV (2SLS)17.68.7外生変動のみの効果(一致推定)
First-stage F11.4(>10 なので一応セーフ)

SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「操作変数法(IV)」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。

1
2
3
4
5
6
7
8
import pandas as pd

# SSDSE-B-2026 を読み込む(cp932 / Shift_JIS)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
print(df.shape)          # (564, 112)
print(df['SSDSE-B-2026'].unique())  # 含まれる年度
latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()
print(latest[['Prefecture', 'L3221', 'L322108']].head())

ここで使う L3221(消費支出)と L322108(教育費)は、 消費支出 → 教育費 の関係を IV で検討する際の中心列です。 算出例:

🧮 数式に値を入れて手で計算する: 操作変数推定量

合成データで IV 推定値 (Wald 推定) を計算する。

Step 1: 群別平均

 処置 (T=1)対照 (T=0)
IV Z=1: Y 平均15
IV Z=0: Y 平均10
IV Z=1: T 平均0.80
IV Z=0: T 平均0.30

Step 2: Wald 推定

IV 推定 = (E[Y|Z=1] - E[Y|Z=0]) / (E[T|Z=1] - E[T|Z=0]) = (15 - 10) / (0.80 - 0.30) = 5 / 0.50 = 10.0

🐍 Python で再現

1
2
3
4
EY1, EY0 = 15, 10
ET1, ET0 = 0.80, 0.30
IV = (EY1 - EY0) / (ET1 - ET0)
print(f"IV 推定: {IV}")

📤 実行結果

IV 推定: 10.0

💬 手計算 (Step 2) 10.0 と Python 出力が完全一致。

🐍 Python 実装バリエーション

A. linearmodels.iv.IV2SLS(業界標準)

🎯 解説: 弱操作変数の問題を確認する。 Z が X とほぼ相関しない場合、 IV 推定は標準誤差が膨大になり信頼できない。 第 1 段階の F 統計量 > 10 が一般的な目安。
1
2
3
4
5
6
7
8
from linearmodels.iv import IV2SLS
mod = IV2SLS(dependent=y,
             exog=sm.add_constant(W),
             endog=X_endog,
             instruments=Z)
res = mod.fit(cov_type='robust')
print(res.summary)
print('First-stage F =', res.first_stage)
📥 入力例: data/raw/SSDSE-B-2026.csv 弱い操作変数の例: 単年度の事象(誤差大) 強い操作変数の例: 長期人口トレンド
📤 実行例(実測) IV-2SLS Estimation Summary ============================================================================== Dep. Variable: L322108 R-squared: -2.5928 Estimator: IV-2SLS Adj. R-squared: -2.6056 No. Observations: 564 F-statistic: 60.657 Date: Sat, Aug 15 2026 P-value (F-stat) 0.0000 Time: 22:00:34 Distribution: chi2(2) Cov. Estimator: robust Parameter Estimates ============================================================================== Parameter Std. Err
💬 読み方: F < 10 は弱操作変数の警告ライン(Staiger-Stock 基準)。 F が小さい場合は IV 推定が OLS よりさらに偏る。 操作変数選択は事前に「説得力のある排除制約」を検討してから。

B. statsmodels.sandbox.regression.gmm.IV2SLS(旧 API)

🎯 解説: 過剰識別(操作変数 > 内生変数)の場合は Sargan-Hansen 検定で操作変数の外生性を統計的に検証できる。 帰無仮説は「全操作変数が外生」。
1
2
3
4
from statsmodels.sandbox.regression.gmm import IV2SLS as SMIV
mod = SMIV(endog=y, exog=sm.add_constant(pd.concat([X_endog, W],axis=1)),
           instrument=sm.add_constant(pd.concat([Z, W],axis=1))).fit()
print(mod.summary())
📥 入力例: data/raw/SSDSE-B-2026.csv 内生変数 1 個に対し操作変数 3 個用意
📤 実行例(実測) IV2SLS Regression Results ============================================================================== Dep. Variable: L322108 R-squared: -2.593 Model: IV2SLS Adj. R-squared: -2.606 Method: Two Stage F-statistic: 22.58 Least Squares Prob (F-statistic): 3.70e-10 Date: Sat, 15 Aug 2026 Time: 22:00:34 No. Observations: 564 Df Residuals: 561 Df Model: 2 ===============================
💬 読み方: p > 0.05 なら操作変数の外生性を支持。 ただし、 「棄却されない」=「真に外生」とは限らない(検出力の問題)。 構造的な議論で操作変数の妥当性を補強することが必須。

C. 自前で 2SLS を組む(教育用)

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「消費支出(L3221)→ 教育費(L322108)」の効果を推定したいが、 交絡(教育熱心な世帯ほど消費全体も大きい)が問題。 操作変数として総人口(A1101, 都市規模の代理)を教育的な例として使う。
1
2
3
4
5
6
X1 = sm.add_constant(pd.concat([Z, W], axis=1))
pi = sm.OLS(X_endog, X1).fit()
X_hat = pi.predict(X1)
X2 = sm.add_constant(pd.concat([X_hat, W], axis=1))
beta = sm.OLS(y, X2).fit()
print(beta.params)
📥 入力例: data/raw/SSDSE-B-2026.csv 内生変数 X: 消費支出(L3221) 操作変数 Z: 総人口(A1101) 結果変数 Y: 教育費(L322108)
📤 実行例(実測): const -93829.8218 0 0.3653 A1303 -0.0005
💬 読み方: 手で 2 段階を回しても linearmodels の 2SLS と同じ 0.3653 が出る。 2SLS が「2 回の OLS」であることが確かめられる。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

D. GMM 推定(過剰識別の場合)

🎯 解説: 操作変数を 2 本(総人口 A1101・婚姻件数 A9101)にすると、 操作変数の数 2 > 内生変数の数 1 となり「過剰識別」。 このとき GMM と Sargan-Hansen の J 検定が使える。 外生コントロール W(65歳以上人口 A1303)は exog 側にあり、 linearmodels が自動で操作変数集合に加えるので instruments に重ねて渡してはいけない(同じ列が重複して "do not have full column rank" で落ちる)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from linearmodels.iv import IVGMM
# 操作変数を 2 本(総人口 A1101・婚姻件数 A9101)にすると
# 過剰識別(操作変数 2 > 内生変数 1)になり、Sargan-Hansen の J 検定が使える。
# W は exog 側にあり linearmodels が自動で操作変数に加えるので、ここでは渡さない
# (渡すと同じ列が重複して "do not have full column rank" で落ちる)
Z2 = df[['A1101', 'A9101']].astype(float)
gmm = IVGMM(dependent=y, exog=sm.add_constant(W),
            endog=X_endog, instruments=Z2).fit()
print(gmm.params.round(4))
print('J =', round(gmm.j_stat.stat, 4), ' 自由度 =', gmm.j_stat.df,
      ' p =', round(gmm.j_stat.pval, 4))  # 過剰識別検定
📥 入力例: data/raw/SSDSE-B-2026.csv(47 県 × 12 年 = 564 行) 結果 Y: 教育費 L322108 / 内生 X: 消費支出 L3221 外生 W: 65歳以上人口 A1303 操作変数 Z: 総人口 A1101 + 婚姻件数 A9101(2 本 → 過剰識別)
📤 実行例: const -95218.2717 A1303 -0.0006 L3221 0.3702 Name: parameter, dtype: float64 J = 0.0025 自由度 = 1 p = 0.9597
💬 読み方: L3221 の係数 0.3702 は、 操作変数 1 本の 2SLS(B の 0.3653)とほぼ一致する。 J = 0.0025(自由度 = 操作変数 2 − 内生変数 1 = 1、 p = 0.9597)は「追加した操作変数も誤差項と無相関」という帰無仮説を棄却しない。 ただし「棄却されない」=「真に外生」ではなく(検出力の問題)、 排除制約は構造的な議論で補強する必要がある。

🐍 Python 実装 — 完全強化版

scipy / pandas / scikit-learn / statsmodels を中心とした標準的な実装例です。 まず CSV を読み込み、 次に 操作変数法(IV) の解析を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()

x = df['L322108'].astype(float).values
y = df['L3221'].astype(float).values

# 基本統計量
print('n            =', len(x))
print('mean(x)      =', np.mean(x))
print('std(x)       =', np.std(x, ddof=1))

# 操作変数法(IV) の代表的計算(用途に応じて scipy/statsmodels を切替える)
r, p = stats.pearsonr(x, y)
print(f'Pearson r = {r:.4f}, p = {p:.4g}')
rs, ps = stats.spearmanr(x, y)
print(f'Spearman rho = {rs:.4f}, p = {ps:.4g}')

用途別の追加実装:

1
2
3
4
5
6
7
8
9
# 標準化と簡易クラスタリングの例
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

X = df[['L322108', 'L3221']].astype(float).values
Xs = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Xs)
df['cluster'] = km.labels_
print(df[['Prefecture', 'L322108', 'L3221', 'cluster']].head(10))
1
2
3
4
5
6
7
# 時系列(北海道の L322108)— 例として ARIMA 系の前処理
import statsmodels.api as sm

ts = df.sort_values('SSDSE-B-2026').groupby('SSDSE-B-2026')['L322108'].mean()
print(ts.tail())
res = sm.tsa.stattools.adfuller(ts)
print('ADF stat:', res[0], 'p:', res[1])

⚠️ 操作変数法の落とし穴 7 連発

1. 弱操作変数(weak IV)に気付かない。第一段階 F 値 < 10 の操作変数は、 2SLS 推定量が大きなバイアスを持ち、 信頼区間も誤って狭くなります。 Stock-Yogo 基準(F > 16.38 等)や Anderson-Rubin 検定で弱 IV 耐性のある推論に切り替えましょう。

2. 排除制約(exclusion restriction)を検定で確かめようとする。排除制約は「Z は誤差項 ε と無相関」という仮定で、 ε は観測できないため統計的に検証できません。 経済学的・制度的論拠(自然実験・くじ引き・政策的境界)を文章で説得する以外に方法はないのが本質です。

3. LATE(局所平均処置効果)を ATE と誤読する。2SLS が推定するのは「コンプライア(Z の変化で X が動くサブグループ)の平均処置効果」であって、 母集団全体への効果ではありません。 政策推奨で「全員に同じ効果がある」と書くのは誤りです。

4. クラスタ標準誤差を忘れる。都道府県・学校・企業など階層構造を持つデータでは、 観測値が同一クラスタ内で相関しています。 cov_type='clustered' を必ず指定しないと SE が過小評価され、 偽陽性が増えます。

5. 操作変数の数を増やせば良いと思う(過剰識別)。IV を増やすほど弱 IV になりやすく、 また Sargan/Hansen J 検定が棄却されると識別自体が怪しくなります。 「強い IV を 1 個」が原則で、 追加するなら Anderson-Rubin の耐性推論を主にしましょう。

6. 内生性検定(Durbin-Wu-Hausman)で p > 0.05 なら OLS で良い、 と即断。検定の検出力次第なので、 「内生性が無いと結論付ける」のは強すぎる主張。 経済学的根拠で内生性が疑わしいなら、 IV と OLS の両方を併記する論文構成が安全です。

7. 自然実験を装った操作変数を捏造する。「天気」「距離」「制度変更」を IV として使う論文は多いですが、 これらが別経路で y に影響するなら排除制約が破綻します。 想定される他経路を 5 つは列挙し、 それぞれ反論できる準備をしてから IV を選びましょう。

⚠️ 落とし穴 — 完全強化版

操作変数法(IV) を実務で扱う際に踏みやすい落とし穴を 5 件挙げます。

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

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

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

📍 体系階層のパス

🌐 統計・データサイエンス因果推論因果手法IV

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

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

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

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

大きな円が小さな円を包含する Circle Packing 図。 「操作変数法」は緑色でハイライト

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

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

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

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

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

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは IV隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス因果手法 → IV という入れ子の位置を示します。 「因果手法には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🗺 概念マップ — 完全強化版

🔗 隣接手法への橋渡し

操作変数法 (IV) は内生性のある処置効果を識別する因果推論手法。 弱外生性が破れる回帰分析を救うために設計されており、 2 段階最小二乗法 (2SLS) と一体で運用する。

IV は強力だが「妥当な操作変数を見つける」のが最大の難関。 良い IV は (1) 処置と相関 (関連性)、 (2) 結果に処置経由でのみ影響 (除外制約)、 (3) 誤差項と無相関 (外生性) を満たす。 例: 教育の収益率推定で「義務教育年限」を操作変数とする (Angrist-Krueger 1991)。

🌳 手法選択フロー

「iv」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。

典型シナリオ別の手法選択

シナリオ重視する観点候補手法
説明変数に内生性が疑われる (逆因果・交絡・測定誤差)外生的な変動をどう確保するかIV / 2SLS(妥当な操作変数がある場合)、 DID・RDD・自然実験(設計で識別)
操作変数が複数あり過剰識別操作変数の外生性検証GMM + Sargan / Hansen J 検定
第一段階 F が小さい (弱操作変数)弱 IV に頑健な推論LIML / Anderson-Rubin 信頼区間

選んだ後の検証ステップ

  1. 前処理確認: 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
  2. ハイパラ調整: 交差検証で安定する値を選ぶ
  3. 性能評価: タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
  4. 頑健性チェック: 別手法 / 別シードで結果が大きく違わないか確認
  5. 解釈: 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討

📝 補足: 直感をもう一歩深く — 「借り物の変動」で因果を測る

操作変数法の核心は、内生変数 X が持つ変動を 2 種類に分解する ことにあります。X の変動には「純粋に外から与えられた変動」と「結果 Y と共通の原因(交絡)に汚された変動」が混ざっています。OLS はこの 2 つを区別せずまとめて使うため、傾きが交絡分だけ偏ります。操作変数 Z は「X を動かすが、誤差項 u とは無関係」という性質により、X のうち汚れていない部分だけを取り出す「フィルター」の役割を果たします。

手順のイメージ(2 段階最小二乗 = 2SLS):

  1. 第 1 段階:X を Z(と外生統制変数)に回帰し、予測値 X̂ を作る。X̂ は「Z 由来の外生的変動」だけを含む、いわば 浄化された X
  2. 第 2 段階:Y を X̂ に回帰する。汚れが除かれているので、得られる傾きは交絡に汚染されない因果効果に近づく。

操作変数が 1 個・内生変数が 1 個の最も単純なケースでは、この 2 段階の結果は ワルド比 β̂IV = Cov(Z, Y) / Cov(Z, X) という 1 本の式に一致します(数式セクション参照)。分子は「Z を動かしたとき Y がどれだけ動くか(誘導形)」、分母は「Z を動かしたとき X がどれだけ動くか(第 1 段階)」。Z の影響が Y と X の両方を通っても、Z→X→Y の経路しかないので、割り算で X→Y の効果だけが残る、という理屈です。ページ上部の 🎮 触って理解する のスライダーで、内生性を上げると赤い OLS 線だけが真値 β=2 から離れ、緑の IV 線が留まる挙動を確かめてください。

📝 補足: 落とし穴を深掘り(重要)— IV は万能ではない

操作変数法は強力ですが、成立条件が厳しく、誤用すると OLS より悪い結論を導きます。特に重要な論点を整理します。

① 操作変数の 2 条件

② 弱い操作変数のバイアス(F < 10)

関連性が「ゼロでない」だけでは不十分で、十分に強い必要があります。Cov(Z, X) が小さいとワルド比の分母が 0 に近づき、推定量は暴れ、標準誤差は膨張します。加えて、弱い操作変数では IV 推定量が OLS の偏りの方向に引き戻される有限標本バイアスを持ち、信頼区間の被覆も崩れます。経験則として 第 1 段階 F < 10 なら弱操作変数を疑い、弱 IV に頑健な手法(LIML、Anderson-Rubin 信頼区間)へ切り替えます(Staiger–Stock の目安。近年は Lee ら 2022 のように、より厳しい閾値を推奨する議論もある)。

③ 除外制約は検証不能

Cov(Z, u) = 0 は、u が 未観測であるため データから直接検定できません。過剰識別検定(Sargan / Hansen J)は「複数の IV が互いに整合的か」を見るだけで、外生性そのものの証明にはなりません(すべての IV が同じ方向に外生性を破っていれば検定は通ってしまう)。除外制約は最終的に 制度・理論・分野知識で正当化するしかない、という点が IV 分析の最大の難所です。

④ 局所平均処置効果(LATE)の解釈

効果が個体ごとに異なる(異質性がある)とき、IV が推定するのは母集団全体の平均効果(ATE)ではなく、「Z の変化に反応して X を変えた層(compliers)」に限った局所平均処置効果(LATE)です(Imbens–Angrist 1994、単調性の仮定のもと)。別の操作変数を使えば別の complier 集団の効果になるため、「どの IV を使ったか」で推定対象そのものが変わりうる点に注意します。

⑤ 過剰識別検定と複数 IV の扱い

内生変数の数より操作変数が多い(過剰識別)とき、各 IV から得られる推定が整合的かを Sargan(等分散前提)/ Hansen J(異分散頑健) で検定できます。棄却されれば「どれかの IV が除外制約を破っている」示唆ですが、③の通り どの IV が悪いかは特定できず、外生性の証明にもならない。複数 IV を機械的に投入すると弱 IV バイアスも悪化しうるため、「弱くても妥当な 1 本」を優先する判断が重要です。

⑥ IV は万能ではない — バイアスと分散のトレードオフ

IV は内生性の偏りを減らす代わりに 分散が大きくなります。操作変数が弱い・除外制約が疑わしい場合、IV の結論は OLS より不安定で当てにならないことも珍しくありません。「内生性が心配だから機械的に IV」ではなく、F 値・除外制約の妥当性・LATE の解釈可能性をそろえて判断すべきです。関連する内生性の源泉は 逆因果同時性測定誤差選択バイアス のページも参照。

📝 補足: SSDSE-B-2026 実データで 2SLS を回す(弱操作変数の実例)

実測値で 2SLS を体験します。データは SSDSE-B-2026 の 2023 年・47 都道府県(n=47)の実測値です。設定は次のとおり(操作変数の選択は教育目的の「架空の設定」であり、実際には除外制約を満たす保証はありません — むしろ下記のとおり破れている疑いが濃厚です)。

ワルド比・OLS・第 1 段階 F を実データで計算した結果(すべて上記 47 点からの実測、丸めは表示のみ):

実測値(2023, n=47) 読み方
OLS 傾き(Y を X に回帰)約 0.100消費支出 1 増で教育費 約0.10 増(内生性で偏りうる)
IV / ワルド比 Cov(Z,Y)/Cov(Z,X)約 0.335OLS の約 3 倍。だが下記 F を見て判断すべき
第 1 段階 F 値(X を Z に回帰)約 5.60< 10 → 弱操作変数。この IV 推定は信用できない
corr(Z, X)(第 1 段階の相関)約 0.333(R² 約 0.111)関連はあるが弱い

教訓:この実例は「IV の値が OLS と大きく違うから面白い」のではなく、第 1 段階 F ≒ 5.6 < 10 なので弱操作変数であり、0.335 という IV 推定を鵜呑みにしてはいけない、という 落とし穴② の実演です。さらに総人口 A1101 は、人口規模を通じて教育費に 消費支出を経由しない 直接経路を持ちうる(除外制約違反の疑い)ため、たとえ F が十分でも因果解釈は困難です。実データで「IV を出すこと」より「その IV が妥当かを検証すること」が本質だと分かります。下は同じ手順を再現するコード(結果は上表の実測値)。

📥 入力例(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
# SSDSE-B-2026: 2023年・47都道府県で 2SLS(操作変数は架空の設定)
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df[df.columns[0]] == 2023]          # 47都道府県
Y, X, Z = d['L322108'], d['L3221'], d['A1101']  # 教育費, 消費支出(内生), 総人口(IV)
cov = lambda a, b: np.cov(a, b)[0, 1]
b_ols = cov(X, Y) / X.var()              # OLS 傾き ≒ 0.100
b_iv  = cov(Z, Y) / cov(Z, X)            # IV/ワルド比 ≒ 0.335
# 第1段階 F(X を Z に回帰)
s1 = cov(Z, X) / Z.var(); n = len(X)
resid = X - (X.mean() - s1*Z.mean() + s1*Z)
se = ((resid**2).sum()/(n-2) / ((Z-Z.mean())**2).sum())**0.5
print(b_ols, b_iv, (s1/se)**2)            # ≒ 0.100, 0.335, F≒5.60 (<10=弱IV)
📤 実行例(実測) 0.10037651137085671 0.33504381577048464 5.595239590263921

📝 補足: 発展 — 2SLS・弱 IV 検定・過剰識別・LATE・自然実験・制御関数法