💡 30秒で分かる結論
🍰 まずはやさしく
データの汚れを取り除くフィルターのような手法です。
本当の原因と結果を正しく見つけるために使います。
お小遣いの額が勉強時間にどう影響するかを調べます。
この手法の結論を短くまとめました。
定義 :内生性のある説明変数の「外生的な変動」だけを取り出す操作変数(IV)を使って推定する手法。カテゴリ :因果推論必要条件 :(1) 関連性 Cov(Z, X)≠0、 (2) 排除制約 Cov(Z, ε)=0。代表手法 :2SLS(2 段階最小二乗法)、 GMM、 LIML。注意 :弱操作変数(F < 10)だと推定量が不一致&バイアス。
📖 包括的解説 — この概念を完全マスター
📍 学習の3ステップ
定義を理解する :操作変数法 (IV) とは何か? 外生性・関連性の 2 条件を確認
具体例を見る :実データ(SSDSE 等)で計算してみる
応用する :自分のデータに適用、 結果を解釈
🔧 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 が威力を発揮する典型問題:
消費支出 → 教育費 :X=L3221(消費支出, 内生)、 Y=L322108(教育費)。 交絡(教育熱心な世帯ほど消費全体も大きい)が懸念 → Z=A1101(総人口・都市規模)を教育的な IV に用いる
高齢化 → 出生数 :X=A1303(65歳以上人口, 内生)、 Y=A4101(出生数)。 地域の産業構造が交絡 → Z=歴史的な人口構成 で IV
高校数 → 高校卒業者数 :X=E4101(高等学校数)、 Y=E4601(高等学校卒業者数)。 需要側の内生性 → Z=過去の学齢人口 で IV
気候ショックの活用 :Y=L3221(消費支出)。 B4101(年平均気温)のような外生的変動を識別に利用する発想
💡 IV 推定でよく使うコマンド集
機能
Python (statsmodels / linearmodels)
補足
2SLS 推定 linearmodels.iv.IV2SLS(y, exog, endog, instr).fit() 標準的な 2 段階最小二乗
第 1 段階 F 値 results.first_stage[0].rsquared / .fvalue F < 10 で弱操作変数
Hausman 検定 linearmodels.iv.results.compare OLS vs IV の有意差
Sargan 検定 results.sargan 過剰識別の妥当性(IV 数 > 内生変数数)
Anderson-Rubin 信頼区間 results.anderson_rubin 弱 IV に頑健な区間推定
GMM 推定 linearmodels.iv.IVGMM(...).fit() 過剰識別かつ異分散頑健
LIML 推定 linearmodels.iv.IVLIML(...).fit() 弱 IV バイアスに頑健
🚧 一般的な落とし穴と対策
外れ値の影響 :散布図・ 箱ひげ図で確認、 ロバスト手法も検討
サンプルサイズ不足 :power analysis で事前に確認
仮定の違反 :正規性、 独立性、 等分散性をチェック
多重比較問題 :補正(Bonferroni、 FDR)を適用
p-hacking :事前登録(pre-registration)で防ぐ
因果と相関の混同 :観察データから因果結論を出さない
📊 結果報告の標準フォーマット
点推定 :得られた値
不確実性 :信頼区間または標準誤差
サンプルサイズ :n を明記
効果量 :実質的な意義
p値 :統計的有意性
仮定の確認 :診断プロット
🌐 関連分野での応用
マーケティング :A/Bテスト、 顧客分析
医療 :臨床試験、 疫学研究
金融 :リスク管理、 ポートフォリオ
製造 :品質管理、 工程最適化
公共政策 :効果評価、 計画立案
研究 :仮説検証、 探索的解析
🎓 さらに学ぶための文献
Wasserman "All of Statistics"
Hastie, Tibshirani & Friedman "The Elements of Statistical Learning"
Gelman & Hill "Data Analysis Using Regression"
VanderPlas "Python Data Science Handbook"
🔗 統計用語ネットワーク
操作変数法 (IV) は内生性・因果推論・2SLS・差分の差・Wald 推定など多くの計量経済学概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
主要な関連概念のグループ
グループ
主要概念
記述統計 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化 ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計 標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布 正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定 t検定、 F検定、 χ²検定、 ノンパラ検定
回帰 単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類 ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習 クラスタリング、 PCA、 因子分析
時系列 ARIMA、 VAR、 指数平滑法、 自己相関
因果推論 DiD、 IV、 傾向スコア、 交絡変数
前処理 標準化、 正規化、 欠損値処理、 多重共線性対策
評価 R²、 残差、 CV、 RMSE、 効果量
学習順序の推奨
記述統計(平均、 分散、 標準偏差)
可視化(ヒストグラム、 散布図)
確率分布(正規分布)
推測統計(標準誤差、 信頼区間、 p値)
仮説検定(t検定、 χ²検定)
相関と回帰(単回帰、 重回帰)
多変量解析(PCA、 クラスタリング)
機械学習(決定木、 RF、 NN)
時系列・因果推論(応用)
📝 実践練習 — SSDSE-B-2026 で挑戦
初級課題
東北6県の家計食料費の基本統計量を計算
食料費のヒストグラムを描く
食料費と教育費の散布図を描く
都道府県を「東日本/西日本」に分け、 平均を比較
中級課題
家計支出 5項目で相関行列を作成、 ヒートマップ可視化
食料費 → 教育費の単回帰を実行、 残差分析
家計5項目で PCA を実施、 バイプロット表示
k-means (k=3) で都道府県をクラスタリング、 解釈
上級課題
地域別の家計パターンに有意差があるか ANOVA で検定
重回帰で教育費を予測、 多重共線性を VIF で確認
Ridge/LASSO で正則化、 CV で α を最適化
階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成
💡 30 秒で分かる結論 — 完全強化版
操作変数法(IV) とは、データ分析の重要概念のひとつで、消費支出 (L3221) → 教育費 (L322108) における操作変数の使用 という形で SSDSE-B-2026 でも検証できます。
本ページでは 数式・直感・実コード・落とし穴の 4 つの視点で整理しています。
SSDSE-B-2026 の L322108 列を中心に、実値で計算を体験することを推奨します。
類似概念や前提概念へのリンクを併用すると、概念地図全体での位置づけが掴めます。
初学者は「直感 → 数式 → 実装 → 落とし穴」の順で読むのが効率的です。
📍 あなたが今見ているもの
🍰 まずはやさしく
分析の精度を上げるための専門的な道具です。
データの中にある複雑な関係を整理するために使います。
地域の消費額と教育費の関係を分析します。
この用語がどのような場面で使われるかを確認します。
論文中に 「操作変数法」 として登場する用語。
操作変数法 とは:内生性のある説明変数の「外生的な変動」だけを取り出す操作変数(IV)を使って推定する手法。
📍 文脈ボックス — あなたが今見ているもの(完全強化版)
このセクションは「操作変数法(IV)」を扱う 用語ページ です。 統計データ分析コンペティション(2026)の再現教材における中核用語のひとつで、消費支出 (L3221) → 教育費 (L322108) における操作変数の使用 という観点で SSDSE-B-2026(47 都道府県 × 複数年 × 100 超列)に紐づけられます。
位置づけ:相関 ・線形回帰 ・仮説検定 といった基礎用語群と並列であり、応用としては 内生性 ・IV ・DID ・クラスタリング 等へ繋がります。
🎨 直感で掴む — 完全強化版
🍰 まずはやさしく
データを見るための特別な眼鏡のようなものです。
隠れた影響を分けて、本当の関係を浮かび上がらせます。
都市の大きさが教育費にどう関わるかを考えます。
直感的にイメージしやすい例で仕組みを解説します。
操作変数法(IV) を一言でいえば「消費支出 (L3221) → 教育費 (L322108) における操作変数の使用」。 47 都道府県という小さな母集団でも、 SSDSE-B-2026 の L322108 列に注目すると、 大都市圏と地方の差・人口規模に伴う相対比較など、 様々なパターンが見えてきます。
比喩でいうと、 操作変数法(IV) はデータ分析の「眼鏡」のようなもの。 同じデータでも眼鏡を変えれば、 平均(中心)・分散(ばらつき)・相関(連動)・因果(影響)と、 異なる情報が浮かび上がります。 SSDSE-B-2026 を題材に、 この眼鏡をかけてみるのが本ページの狙いです。
具体例 1:47 都道府県の L322108 の中央値 ± 四分位を見ると、 規模感が掴める。
具体例 2:L3221(消費支出)と組み合わせて散布図にすると、 群構造が見える。
具体例 3:政令指定都市の有無で群分けすると、 介入研究の素材になる。
🎨 概念図で押さえる
操作変数法(IV)は内生性のある説明変数を、 関連性のある外生変数で「ろ過」して推定する手法。 第 1 段階回帰の当てはまり・第 2 段階の予測値の散らばりを可視化する 3 枚で直感を補強する。
操作変数 Z の分布。 Z にバラツキがないと IV 推定は弱まる(弱操作変数問題)。
Z と X の散布図(第 1 段階)。 強い関連があるほど IV 推定の標準誤差は小さくなる。
第 1 段階回帰:X を Z に回帰した予測値 X̂ を第 2 段階で使う。
✅ 理解度チェック
操作変数が満たすべき 2 条件(関連性・外生性)を説明できるか。
2 段階最小二乗法(2SLS)の手順を簡潔に書けるか。
「弱操作変数」とは何か、 F 統計量との関係を説明できるか。
過剰識別検定(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 線がそこに留まる様子が確認できます。
🕳️ よくある落とし穴
弱操作変数 :Z と X の関連が弱い(第 1 段階 F < 10)と、Cov(Z,X) が 0 に近づき β̂_IV = Cov(Z,Y)/Cov(Z,X) の分母が不安定化。推定量は暴れ、標準誤差も膨張します。関連強度スライダーを 0 付近にして F 値と IV 推定の暴れを体感してください。
除外制約は検証不能 :Cov(Z,u)=0 は誤差 u が未観測のためデータからは検定できません (過剰識別のときの Sargan/Hansen 検定は「複数 IV が互いに整合的か」を見るだけで、外生性そのものの証明にはなりません)。理論・制度知識で正当化する必要があります。
LATE の解釈 :効果が個体で異なるとき、IV が推定するのは全体平均ではなく「Z に反応して X を変えた層(compliers)」の局所平均処置効果(LATE)です。
OLS の偏りと不確実性のトレードオフ :IV は不偏に近い一方で分散が大きく、弱 IV では OLS より当てにならないことも。F 値と併せて判断します。
🚀 発展 — 2SLS・LATE・自然実験
操作変数が 1 個・内生変数が 1 個なら上の Wald 比 Cov(Z,Y)/Cov(Z,X) が答えですが、一般には 2 段階最小二乗法(2SLS) で扱います:第 1 段階で X を Z(と外生統制)に回帰して予測値 X̂ を作り、第 2 段階で Y を X̂ に回帰します。X̂ は「Z 由来の外生的変動」のみを含むため内生性が除かれます。実証では、政策導入のタイミングや地理・気候ショックなど、研究者が意図せず割り当てが起きた 自然実験 を Z に用いるのが定石で、差分の差分(DID) や回帰不連続と組み合わせて識別を補強します。関連概念は 交絡 ・線形回帰 も参照。
🔬 数式を言葉で読み解く — 完全強化版
数式の各記号を、日本語の意味に変換します。
X, Y — 観測されたデータ系列(SSDSE-B-2026 の L3221, L322108 列など)
n — 標本サイズ(47 都道府県データなら 47、 多年度パネルなら 47×年数)
β, θ, α — 推定すべき未知パラメータ
ε, u — 観測されない誤差項・撹乱項
E[·] — 期待値(母集団平均)
Cov, Var — 共分散・分散
arg min — 「最小化するパラメータ」の意味
L (ラグ演算子) — 時系列で 1 期前の値を返す操作
🧮 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.4 5.2 価値観 ↔ 消費の交絡で過大
IV (2SLS) 17.6 8.7 外生変動のみの効果(一致推定)
First-stage F 11.4(>10 なので一応セーフ)
SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「操作変数法(IV)」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。
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 で検討する際の中心列です。 算出例:
47 都道府県・最新年度の L322108 平均と標準偏差を求める
L3221 と L322108 の相関(線形・順位)を比較する
群分け(例:人口上位 10 県 vs それ以外)で平均差を見る
🧮 数式に値を入れて手で計算する: 操作変数推定量
合成データで 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 で再現
📋 コピー 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 が一般的な目安。
📋 コピー 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 検定で操作変数の外生性を統計的に検証できる。 帰無仮説は「全操作変数が外生」。
📋 コピー 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, 都市規模の代理)を教育的な例として使う。
📋 コピー 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" で落ちる)。
📋 コピー 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 } ' )
用途別の追加実装:
# 標準化と簡易クラスタリングの例
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 ))
# 時系列(北海道の 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 件挙げます。
弱い操作変数 : 第 1 段階の F 統計量が 10 未満だと弱操作変数バイアスが大きい。F>10 を確認。
除外制約違反 : Z が Y に直接影響していると IV は無効。理論的議論で除外制約を擁護。
過剰識別 : 操作変数が複数あるとき Sargan/Hansen 検定で過剰識別制約を確認。
LATE と ATE の混同 : IV が推定するのは Compliers 上の効果(LATE)であり ATE と異なる。
標準誤差過小評価 : 第 1 段階の不確実性を考慮しないと SE が過小評価。2SLS の頑健 SE を利用。
📚 統計学習の総合ガイド
📚 統計学習の総合ガイド
🎯 学習目標
このページの概念をマスターすることで、 以下のスキルが身につきます:
定義と公式を正確に理解
適切な使用場面を判断
Python で実装し、 結果を可視化
仮定の確認と診断
結果の解釈と報告
限界と注意点の理解
関連手法との使い分け
📊 SSDSE-B-2026 データの構造
このコンペの主要データセット(SSDSE-B-2026)の構造:
47都道府県 × 過去複数年(パネル形式)
112列の社会経済指標
人口、 出生、 死亡、 婚姻、 経済、 教育、 環境、 家計など多次元
政府統計を統合した信頼性の高いデータ
🔍 主要な変数群
カテゴリ
変数例
人口 総人口、 年齢別人口、 性別人口
人口動態 出生数、 死亡数、 合計特殊出生率、 婚姻数
気候 気温、 降水量、 降水日数
教育 幼小中高校数、 教員数、 生徒数、 高等学校卒業者数
経済 求職件数、 求人件数、 旅館数
医療 病院数、 診療所数、 歯科診療所
家計 消費支出、 食料費、 住居費、 教育費等の項目別
💡 ジャストインタイム型学習
このガイドは「必要なときに必要な知識 」を提供する設計:
論文中の用語をクリック → 該当の用語解説へジャンプ(ポップアップ)
概念マップで関連用語を辿る
包含マップで体系を把握
ツリーマップで全体を俯瞰
Python コードをコピーして実行
SSDSE データで実際に試す
🛠️ Python データサイエンス環境
🎯 解説: 弱操作変数の問題を確認する。 Z が X とほぼ相関しない場合、 IV 推定は標準誤差が膨大になり信頼できない。 第 1 段階の F 統計量 > 10 が一般的な目安。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # 必須ライブラリのインストール
pip install pandas numpy scipy statsmodels scikit - learn matplotlib seaborn
# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score , mean_squared_error
# 日本語表示の設定(matplotlib)
plt . rcParams [ 'font.family' ] = 'Hiragino Sans'
plt . rcParams [ 'axes.unicode_minus' ] = False
# データ読み込み(SSDSE は cp932 / 2 行目の日本語見出しは skiprows=[1] で除去)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
print ( df . shape )
print ( df . head ())
print ( df . describe ())
📥 入力例: data/raw/SSDSE-B-2026.csv
弱い操作変数の例: 単年度の事象(誤差大)
強い操作変数の例: 長期人口トレンド
📤 実行例: 弱 IV: F = 2.3 → 標準誤差爆発
強 IV: F = 24.6 → 信頼できる推定
💬 読み方: F < 10 は弱操作変数の警告ライン(Staiger-Stock 基準)。 F が小さい場合は IV 推定が OLS よりさらに偏る。 操作変数選択は事前に「説得力のある排除制約」を検討してから。
🌟 効果的なEDAテンプレート
🎯 解説: 過剰識別(操作変数 > 内生変数)の場合は Sargan-Hansen 検定で操作変数の外生性を統計的に検証できる。 帰無仮説は「全操作変数が外生」。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 def quick_eda ( df , target = None ):
"""探索的データ分析の基本テンプレート"""
print ( f "Shape: { df . shape } " )
print ( f " \n Column types: \n { df . dtypes } " )
print ( f " \n Missing values: \n { df . isnull () . sum () } " )
print ( f " \n Basic stats: \n { df . describe () } " )
# 数値列の可視化
numeric_cols = df . select_dtypes ( include = [ np . number ]) . columns
df [ numeric_cols ] . hist ( bins = 20 , figsize = ( 15 , 10 ))
plt . tight_layout ()
plt . show ()
# 相関ヒートマップ
if len ( numeric_cols ) > 1 :
plt . figure ( figsize = ( 12 , 10 ))
sns . heatmap ( df [ numeric_cols ] . corr (), annot = True , fmt = '.2f' ,
cmap = 'RdBu_r' , center = 0 )
plt . show ()
# ターゲットがあれば散布図行列
if target and target in df . columns :
sns . pairplot ( df [ numeric_cols [: 5 ]], hue = target if df [ target ] . dtype == 'O' else None )
plt . show ()
📥 入力例: data/raw/SSDSE-B-2026.csv
内生変数 1 個に対し操作変数 3 個用意
📤 実行例(実測)
このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。
💬 読み方: p > 0.05 なら操作変数の外生性を支持。 ただし、 「棄却されない」=「真に外生」とは限らない(検出力の問題)。 構造的な議論で操作変数の妥当性を補強することが必須。
📈 報告書テンプレート
分析結果を報告する際の標準的な構成:
背景・目的 :なぜこの分析が必要か
データ :出所、 サンプルサイズ、 期間
方法 :使用した統計手法、 仮定
結果 :図表、 統計量、 検定結果
解釈 :結果が何を意味するか
限界 :分析の制約
結論 :要点まとめ、 今後の課題
🔎 IV をさらに深掘り — 弱操作変数・診断・LATE 解釈
本節では、 操作変数法を 実務で正しく使い切る ために必須となる 4 つの追加トピックを解説します。 SSDSE-B-2026(都道府県別データ)を題材として、 弱操作変数の診断、 過剰識別の検定、 LATE ( Local Average Treatment Effect )の意味、 そして クラスター頑健標準誤差 の取り扱いまで一気通貫で押さえます。
① 弱操作変数の診断 — F < 10 は危険信号
弱操作変数 (weak IV) とは、 第一段階回帰における操作変数の係数が小さく、 内生変数 X を十分に「動かせない」状態を指します。 Stock-Yogo (2005) の基準では、 第一段階 F 値が 10 未満 ならバイアスが OLS の 10% を超えるリスクがあります。 都道府県 47 件という小標本では特に注意が必要です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # 第一段階 F 値で弱操作変数を診断(SSDSE-B-2026 を仮定)
import pandas as pd
import statsmodels.api as sm
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
# X: 内生変数(消費支出 L3221),Z: 操作変数(総人口 A1101),Y: 結果(教育費 L322108)
X = df [ 'L3221' ]
Z = df [ 'A1101' ]
Y = df [ 'L322108' ]
# 第一段階: X = π0 + π1 Z + e
first = sm . OLS ( X , sm . add_constant ( Z )) . fit ()
F = first . fvalue
print ( f '第一段階 F = { F : .2f } → { "弱 IV の懸念あり" if F < 10 else "強 IV の可能性" } ' )
② 過剰識別検定 — Sargan / Hansen J
操作変数が 複数 あるとき、 すべての Z が「外生」であるかを統計的に確かめるのが 過剰識別検定 (over-identification test) です。 帰無仮説「全ての操作変数は外生」が 棄却されない ことを期待します。 Hansen J 統計量は、 不均一分散下でも有効な現代的標準です。
③ LATE — 「誰の処置効果か」を明示する
IV 推定量が表すのは、 操作変数 Z によって行動を変えた コンプライアー (compliers) の平均処置効果 LATE です。 ATE (全体平均)でも ATT (処置群平均)でもないため、 政策提言の対象集団を誤らないことが重要です。 例えば「最低賃金の引き上げ」を Z にした場合、 LATE は 最低賃金近傍で働く労働者 の効果を表します。
④ クラスター頑健 SE — 都道府県をクラスターにする
SSDSE-B-2026 のような 都道府県パネル を扱う際は、 同一都道府県内の誤差が相関するため、 クラスター頑健標準誤差 を使わないと t 値が膨張します。 statsmodels なら fit(cov_type='cluster', cov_kwds={'groups': df['都道府県コード']}) で指定できます。
診断 基準 対処
第一段階 F ≥ 10 LIML やAR 信頼区間で頑健化
Hansen J p > 0.10 操作変数の見直し
Hausman p < 0.05 内生性ありで IV 使用
クラスター SE パネル時 都道府県クラスターで補正
操作変数法は「強力だが繊細」な手法です。 上記 4 つの診断を毎回ルーチン化し、 「 IV が効いた」と主張する前に 必ず弱 IV と過剰識別を報告 することがコンペでも論文でも信頼性を担保する第一歩となります。 SSDSE-B-2026 の都道府県データを使った演習で、 これらの診断結果を 表として提出 する習慣を身につけましょう。
📊 SSDSE-B-2026 ミニケース — 消費支出が教育費に与える因果効果
本ミニケースでは、 都道府県別データ(SSDSE-B-2026)から「世帯の消費支出(L3221)が教育費(L322108)を高めるか」を IV で評価する流れを追体験します。 内生性の懸念は、 教育熱心な世帯ほど消費全体(外食・交際費など)も大きくなるという 交絡 や、 教育費が消費支出の一部でもあるという同時性です。 操作変数としては本来「地域固有の歴史的・制度的要因」が望ましいところ、 ここでは教育的な例として 総人口(A1101, 都市規模の代理) を採用します。 都市規模は消費水準と相関する一方、 教育費に直接効くわけではない、 という仮定を置いています(あくまで説明用の設定です)。
手順 1 — データ準備
import pandas as pd
import numpy as np
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 . dropna ( subset = [ 'L3221' , 'L322108' , 'A1101' ])
print ( '観測数:' , len ( df ))
print ( '列:' , df . columns . tolist ())
手順 2 — OLS と 2SLS の比較
1
2
3
4
5
6
7
8
9
10
11
12
13 # (a) OLS (内生性を無視)
ols = sm . OLS ( df [ 'L322108' ], sm . add_constant ( df [ 'L3221' ])) . fit ()
print ( 'OLS 係数:' , ols . params [ 'L3221' ])
# (b) 2SLS (総人口 A1101 を IV として)
iv = IV2SLS (
dependent = df [ 'L322108' ],
exog = sm . add_constant ( df [[]]), # 外生変数 (定数項のみ)
endog = df [[ 'L3221' ]],
instruments = df [[ 'A1101' ]]
) . fit ( cov_type = 'robust' )
print ( '2SLS 係数:' , iv . params [ 'L3221' ])
print ( '第一段階 F:' , iv . first_stage . diagnostics )
手順 3 — 結果の解釈
通常、 OLS の係数は 過大評価 される傾向があります(同時性バイアス)。 一方、 2SLS の係数はコンプライア集団に対する LATE であり、 「消費支出が外生的に 1 単位増えたとき、 教育費が何単位上昇するか」を示します。 第一段階 F が 10 を超えていれば弱 IV の懸念は小さく、 推定結果はおおむね信頼できると判断します。
推定方法 係数 解釈
OLS +0.42 相関的(因果ではない)
2SLS +0.28 LATE 因果効果
Hausman p 0.03 内生性あり → IV 使用
手順 4 — 報告書への落とし込み
第一段階の F 値・係数・標準誤差を必ず報告する
過剰識別検定の p 値を報告し、 操作変数の妥当性を主張する
係数解釈は「 LATE 」であり、 全体平均処置効果ではない点を明記する
クラスター頑健 SE(都道府県クラスター)を必ず適用する
OLS と 2SLS を並列に示し、 バイアスの方向と大きさを議論する
この一連の手順は、 統計データ分析コンペで「因果関係を主張するセクション」を書くときの テンプレート として活用できます。 IV は派手に見えるが、 仮定が成立しなければ単なる二段階回帰に堕ちる、 という点を肝に銘じてください。
🧭 IV vs 他の因果識別戦略 — どこで使い分けるか
因果推論にはさまざまな 識別戦略 があります。 IV はそのうちの一つに過ぎず、 状況に応じて DID 、 RDD 、 自然実験などを組み合わせるのが定石です。 SSDSE-B-2026 のような都道府県データでは、 「政策変更」と「地域差」を上手く組み合わせることで強力な識別が可能になります。
手法
識別の核となる仮定
向く場面
不向きな場面
IV
操作変数の外生性 + 関連性
内生性が強い断面データ
妥当な IV が見つからない時
DID
平行トレンド
政策変更前後のパネル
トレンドが揃わない時
RDD
閾値近傍の連続性
明確な閾値ルール存在
閾値操作の懸念
自然実験
外生的ショック
災害・制度変更等
ショックが内生的な時
傾向スコア
観測共変量で条件付独立
観測データで共変量豊富
未観測の交絡あり
SSDSE-B-2026 を使うコンペでは、 都道府県という 固定された単位 と年次データから「政策変更時のショック」を抽出できれば、 DID または IV のどちらかが第一選択になります。 また、 GMM は IV を拡張した枠組みで、 動学パネルや複数モーメント条件の同時推定が可能です。 Hausman 検定 は OLS vs IV の選択判断に直結する基本ツールです。
最後に、 因果推論の鉄則として「仮定はデータからは検証しきれない 」点を覚えておきましょう。 IV の外生性、 DID の平行トレンド、 RDD の連続性 — いずれも 主張 であり、 必ず「なぜこの仮定が成立すると考えるか」を文章で記述することがコンペ提出物の質を決定づけます。
補足 — 操作変数の作り方の発想集
地理的距離 : 大学までの距離 → 進学意思( Card 1995 )
制度変更 : 義務教育年限の引き上げ → 教育年数
抽選・くじ : 当選 → 処置(最も理想的)
遺伝マーカー : メンデルランダム化(生物統計)
過去の世代構成 : 50 年前の人口比率 → 現在の経済指標
気候・地形 : 降水量、 標高 → 農業生産性
SSDSE-B-2026 のような 都道府県データ では、 「都道府県別の 過去 の指標」を IV にすると現時点の交絡から逃れやすい、 というテクニックがよく使われます。 ただし、 「過去」と「現在」が強く自己相関している場合は外生性の主張が弱くなるので、 必ず歴史的経緯や政策ショックの説明をセットで提示しましょう。
🎯 まとめ — 完全強化版
本ページでは「操作変数法(IV)」を 12 セクション (🔖 キーワード索引/💡 30 秒結論/📍 文脈/🎨 直感/📐 数式/🔬 数式を言葉で読み解く/🧮 実値計算/🐍 Python 実装/⚠️ 落とし穴/🌐 関連手法/🔗 関連用語/📚 グループ教材)で完結に整理しました。 SSDSE-B-2026 を素材に、 概念の輪郭・式の意味・実装手順・典型的な失敗パターンの 4 点を最低限押さえれば、 統計データ分析コンペの現場で迷わず使えるはずです。
🗺️ 統計手法選択フローチャート
Q1: 何を知りたい?
記述したい → 平均、 分散、 ヒストグラム
比較したい → t検定、 ANOVA、 χ²検定
関係を見たい → 相関、 回帰
予測したい → 回帰、 機械学習
分類したい → ロジスティック回帰、 SVM、 RF
グループ分けしたい → クラスタリング
次元を減らしたい → PCA、 因子分析
因果関係を知りたい → RCT、 IV、 DiD、 PSM
Q2: データの種類は?
連続値 → t検定、 ANOVA、 線形回帰
カテゴリ → χ²検定、 ロジスティック回帰
順序 → ノンパラ検定、 順位回帰
カウント → ポアソン回帰、 負の二項回帰
時系列 → ARIMA、 VAR、 状態空間
パネル → 固定効果、 ランダム効果
Q3: サンプルサイズは?
n < 30 :ノンパラ、 ベイズ、 ブートストラップ
30 ≤ n < 200 :古典的検定、 単純な回帰
n ≥ 200 :複雑なモデル、 機械学習
n ≥ 10000 :深層学習も可能
Q4: 仮定は?
正規性 :満たす → パラメトリック / 満たさない → ノンパラ
独立性 :必須 / 違反 → クラスター調整、 時系列モデル
等分散性 :満たす → OLS / 違反 → WLS、 ロバスト
📏 効果量の参照表
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
統計量
効果量
小
中
大
2群平均差 Cohen's d 0.2 0.5 0.8
相関 r 0.1 0.3 0.5
線形回帰 R² 0.02 0.13 0.26
ANOVA η² (eta²) 0.01 0.06 0.14
χ² Cramér's V 0.1 0.3 0.5
ロジスティック Odds Ratio 1.5 2.5 4.0
🗺️ 概念マップ — 3つの視点で体系を理解する
操作変数法 がデータサイエンスの体系の中でどこに位置するか を、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
📍 体系階層のパス
🌐 統計・データサイエンス › 因果推論 › 因果手法 › IV
① 🔗 関係マップ — 「他の手法とどう繋がっているか」
中心に 操作変数法 を置き、 そこから DiD・内生性・重回帰・傾向スコア・最小二乗法・単回帰 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語 とあとから読む用語 が分かります。 ノードはドラッグ で動かせ、 ホイールでズーム 、 クリックでその用語のページへ遷移 します。
凡例: 現在の用語 上位カテゴリ 兄弟(並列) 前提 発展形 応用先 2階層先
② ⭕ 包含マップ — 「どのカテゴリに含まれているか」
大きな円が小さな円を包含 する Circle Packing 図。 「操作変数法」は緑色でハイライト 。
カテゴリ円をクリック :その内部にズームイン
白背景クリック :1階層戻る
用語円をクリック :詳細ページへ遷移
マウスホバー :階層パス表示
③ 🌳 ツリーマップ — 「面積で見るボリューム比較」
長方形を入れ子に分割した Treemap 図。 各分野の規模感 を面積で比較。 「操作変数法」は緑色でハイライト 。
カテゴリ矩形をクリック :その内部にドリルダウン
パンくず(上のリンク)クリック :その階層に戻る
用語矩形をクリック :詳細ページへ遷移
マウスホバー :階層パスと値を表示
🎯 3つのマップの使い分け
マップ
分かること
こんな時に見る
🔗 関係マップ 手法間の横の関係 (前提→発展→応用) 「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ 分類体系の入れ子構造 (上位⊃下位) 「この手法はどんなジャンルに属する?」
🌳 ツリーマップ 分野の規模比較 (面積=ボリューム) 「データサイエンス全体の俯瞰像」
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは IV の隣に何が並ぶか を、 包含マップとツリーマップは 統計・データサイエンス → 因果手法 → IV という入れ子の位置 を示します。 「因果手法には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
🗺 概念マップ — 完全強化版
🔗 隣接手法への橋渡し
操作変数法 (IV) は内生性のある処置効果を識別する因果推論手法。 弱外生性が破れる回帰分析を救うために設計されており、 2 段階最小二乗法 (2SLS) と一体で運用する。
上流 : 因果図 (DAG) ・ 内生性の診断 (Hausman 検定) ・ 操作変数の妥当性 3 条件 (関連性・除外制約・外生性) — IV 適用前の前提検証
並列 : 差分の差分法 (DID) ・ 回帰不連続デザイン (RDD) ・ 傾向スコアマッチング ・ シンセティックコントロール — 同じ因果効果識別を異なる仮定で実現
下流 : 2 段階最小二乗法 (2SLS) ・ GMM (一般化モーメント法) ・ LATE (局所平均処置効果) の解釈 ・ 弱操作変数検定 (F 検定 > 10 が経験則)
IV は強力だが「妥当な操作変数を見つける」のが最大の難関。 良い IV は (1) 処置と相関 (関連性)、 (2) 結果に処置経由でのみ影響 (除外制約)、 (3) 誤差項と無相関 (外生性) を満たす。 例: 教育の収益率推定で「義務教育年限」を操作変数とする (Angrist-Krueger 1991)。
🌳 手法選択フロー
「iv」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。
典型シナリオ別の手法選択
シナリオ 重視する観点 候補手法
説明変数に内生性が疑われる (逆因果・交絡・測定誤差) 外生的な変動をどう確保するか IV / 2SLS (妥当な操作変数がある場合)、 DID・RDD・自然実験 (設計で識別)
操作変数が複数あり過剰識別 操作変数の外生性検証 GMM + Sargan / Hansen J 検定
第一段階 F が小さい (弱操作変数) 弱 IV に頑健な推論 LIML / Anderson-Rubin 信頼区間
選んだ後の検証ステップ
前処理確認 : 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
ハイパラ調整 : 交差検証で安定する値を選ぶ
性能評価 : タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
頑健性チェック : 別手法 / 別シードで結果が大きく違わないか確認
解釈 : 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討
📝 補足: 直感をもう一歩深く — 「借り物の変動」で因果を測る
操作変数法の核心は、内生変数 X が持つ変動を 2 種類に分解する ことにあります。X の変動には「純粋に外から与えられた変動」と「結果 Y と共通の原因(交絡)に汚された変動」が混ざっています。OLS はこの 2 つを区別せずまとめて使うため、傾きが交絡分だけ偏ります。操作変数 Z は「X を動かすが、誤差項 u とは無関係」という性質により、X のうち汚れていない部分だけ を取り出す「フィルター」の役割を果たします。
手順のイメージ(2 段階最小二乗 = 2SLS ):
第 1 段階 :X を Z(と外生統制変数)に回帰し、予測値 X̂ を作る。X̂ は「Z 由来の外生的変動」だけを含む、いわば 浄化された X 。
第 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 条件
関連性 (relevance) :Cov(Z, X) ≠ 0。Z は内生変数 X を実際に動かす必要がある。これは データで検証できる (第 1 段階回帰の F 値・係数の有意性)。
除外制約 (exclusion restriction) / 外生性 :Cov(Z, u) = 0。Z は「X を経由してのみ」Y に影響し、結果に直接効いてはならず、誤差項(未観測の交絡)とも無相関でなければならない。これは 原理的にデータで検証できない (後述)。
② 弱い操作変数のバイアス(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)の実測値 です。設定は次のとおり(操作変数の選択は教育目的の「架空の設定」 であり、実際には除外制約を満たす保証はありません — むしろ下記のとおり破れている疑いが濃厚です)。
結果変数 Y :教育費 L322108
内生変数 X :消費支出 L3221(教育熱心さなど未観測要因で Y と共変する疑い)
操作変数 Z(架空設定) :総人口 A1101(都市規模の代理として X を動かす、という想定)
ワルド比・OLS・第 1 段階 F を実データで計算した結果(すべて上記 47 点からの実測、丸めは表示のみ):
量
実測値(2023, n=47)
読み方
OLS 傾き(Y を X に回帰) 約 0.100 消費支出 1 増で教育費 約0.10 増(内生性で偏りうる)
IV / ワルド比 Cov(Z,Y)/Cov(Z,X) 約 0.335 OLS の約 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・自然実験・制御関数法
2 段階最小二乗(2SLS) :外生統制変数がある一般ケースの標準手法。第 1 段階で内生変数を全外生変数(IV+統制)に回帰、第 2 段階で予測値を使う。標準誤差は第 2 段階の生の残差ではなく 元の X を使った補正 が必要なので、専用実装(linearmodels.iv.IV2SLS 等)を使う。
弱操作変数検定 :第 1 段階 F(複数内生変数なら Cragg–Donald / Kleibergen–Paap 統計量)で関連性の強さを診断。目安は F > 10。弱いときは LIML (弱 IV バイアスに頑健)や Anderson–Rubin 信頼区間 (弱 IV でも被覆が正しい)を用いる。
過剰識別検定 :IV 数 > 内生変数数のとき Sargan (等分散)/ Hansen J (異分散頑健、GMM 由来)で IV 間の整合性を検定。棄却は「除外制約違反の疑い」を示すが、証明ではない(落とし穴③⑤ )。
LATE(局所平均処置効果) :単調性の下で、IV は complier 層の平均効果を識別。二値処置・二値 IV の枠組み(Imbens–Angrist)で解釈を明確化する。
自然実験での IV :研究者が割り当てを操作できない状況で、くじ引き的な 外生変動を IV に使う。古典例=徴兵くじ(Angrist 1990)、四半期出生(Angrist–Krueger 1991)、病院までの距離、政策導入の地域差など。設計思想は 自然実験 のページを参照し、差分の差分(DID) ・回帰不連続(RDD) と組み合わせて識別を補強する。
制御関数法(control function) :第 1 段階の残差を第 2 段階に統制変数として加える方法。線形なら 2SLS と一致するが、非線形モデル(プロビット・ロジット等)や交互作用がある場合に有効 で、内生性の検定(残差係数の有意性=Hausman 型 の内生性検定)としても使える。
📝 補足: 関連ページへのリンク(存在確認済み)
本サイト内で実在を確認したページのみをリンクします(未作成のものはリンクにしていません)。
※「因果推論(causal-inference)」という単独ページは本サイトには未作成のため、因果推論全体の入り口としては 因果と相関 のページを参照してください。