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

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

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

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

💡 30秒で分かる結論

🔖 キーワード索引

操作変数法 2SLS GMM 内生性 関連性条件 排除制約 第一段階 F 値 弱操作変数 linearmodels IV2SLS statsmodels IV2SLS LATE Hausman 内生性検定 RDD DID

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「教育水準 → 県民所得」の効果を推定したいが、 逆因果(所得が高い県は教育水準が高い)が問題。 操作変数として「過去の人口」を使う。
 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')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv 内生変数 X: 大学進学率 操作変数 Z: 過去 10 年前の人口(A1101_lag) 目的変数 Y: 県民所得
📤 実行例: OLS 推定: 係数 = 8.5 IV 推定: 係数 = 12.3 第1段階 F 値: 24.6 (>10 で強い)
💬 読み方: OLS は内生性で過小推定 → IV では大きい値。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

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

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

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定stats.ttest_ind()
回帰stats.linregress()
分布フィッティングstats.norm.fit()

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

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

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

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

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 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 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ 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 エンコーディング)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
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"\nColumn types:\n{df.dtypes}")
    print(f"\nMissing values:\n{df.isnull().sum()}")
    print(f"\nBasic 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 個用意
📤 実行例: Sargan 統計量 = 1.84 自由度 = 2 (操作変数数 - 内生変数数) p 値 = 0.398 → 外生性を棄却せず
💬 読み方: p > 0.05 なら操作変数の外生性を支持。 ただし、 「棄却されない」=「真に外生」とは限らない(検出力の問題)。 構造的な議論で操作変数の妥当性を補強することが必須。

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

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

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

🧮 SSDSE-B-2026 で IV 推定 — 教育年数 → 所得

「平均教育年数 → 一人当たり県民所得」を推定する際、 教育年数は能力・家庭環境などの未観測要因と相関するため内生性を持ちます。 操作変数として「義務教育卒業年齢の地域差」など外生的なものを使う想定で、 ここでは「人口密度」を代理 IV として 2SLS を実演します(教育的サンプル)。

① 2SLS の手順

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「教育水準 → 県民所得」の効果を推定したいが、 逆因果(所得が高い県は教育水準が高い)が問題。 操作変数として「過去の人口」を使う。
 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='utf-8', skiprows=1)
y = df['一人当たり県民所得'].astype(float)
X_endog = df['大学進学率'].astype(float)       # 内生変数
Z = df['人口密度'].astype(float)              # 操作変数(仮)
W = df['高齢化率'].astype(float)              # 外生コントロール

# 第一段階: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: 大学進学率 操作変数 Z: 過去 10 年前の人口(A1101_lag) 目的変数 Y: 県民所得
📤 実行例: OLS 推定: 係数 = 8.5 IV 推定: 係数 = 12.3 第1段階 F 値: 24.6 (>10 で強い)
💬 読み方: OLS は内生性で過小推定 → IV では大きい値。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

② 出力例(仮想数値)

推定大学進学率の係数SE解釈
OLS(バイアスあり)28.45.2能力 ↔ 教育の交絡で過大
IV (2SLS)17.68.7外生変動のみの効果(一致推定)
First-stage F11.4(>10 なので一応セーフ)

🐍 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: F = 2.3 → 標準誤差爆発 強 IV: F = 24.6 → 信頼できる推定
💬 読み方: 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 個用意
📤 実行例: Sargan 統計量 = 1.84 自由度 = 2 (操作変数数 - 内生変数数) p 値 = 0.398 → 外生性を棄却せず
💬 読み方: p > 0.05 なら操作変数の外生性を支持。 ただし、 「棄却されない」=「真に外生」とは限らない(検出力の問題)。 構造的な議論で操作変数の妥当性を補強することが必須。

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

🎯 解説: IV(操作変数法)は内生性バイアスを解消する手法。 SSDSE-B-2026 で「教育水準 → 県民所得」の効果を推定したいが、 逆因果(所得が高い県は教育水準が高い)が問題。 操作変数として「過去の人口」を使う。
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: 大学進学率 操作変数 Z: 過去 10 年前の人口(A1101_lag) 目的変数 Y: 県民所得
📤 実行例: OLS 推定: 係数 = 8.5 IV 推定: 係数 = 12.3 第1段階 F 値: 24.6 (>10 で強い)
💬 読み方: OLS は内生性で過小推定 → IV では大きい値。 IV が信頼できる条件は (1) 操作変数 Z が X と相関する、 (2) Z が Y に直接影響しない、 (3) Z が誤差項と無相関。 全てを統計的に検証することが望ましい。

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

🎯 解説: 弱操作変数の問題を確認する。 Z が X とほぼ相関しない場合、 IV 推定は標準誤差が膨大になり信頼できない。 第 1 段階の F 統計量 > 10 が一般的な目安。
1
2
3
4
5
from linearmodels.iv import IVGMM
gmm = IVGMM(dependent=y, exog=sm.add_constant(W),
            endog=X_endog, instruments=pd.concat([Z, W], axis=1)).fit()
print(gmm.summary)
print('Sargan J =', gmm.j_stat)  # 過剰識別検定
📥 入力例: data/raw/SSDSE-B-2026.csv 弱い操作変数の例: 単年度の事象(誤差大) 強い操作変数の例: 長期人口トレンド
📤 実行例: 弱 IV: F = 2.3 → 標準誤差爆発 強 IV: F = 24.6 → 信頼できる推定
💬 読み方: F < 10 は弱操作変数の警告ライン(Staiger-Stock 基準)。 F が小さい場合は IV 推定が OLS よりさらに偏る。 操作変数選択は事前に「説得力のある排除制約」を検討してから。

⚠️ 操作変数法の落とし穴 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 を選びましょう。

🔗 関連用語(前提・並列・発展)

📘 前提となる用語

⚖️ 並列で比較する用語

🚀 発展で学ぶ用語

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

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

📍 体系階層のパス

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

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

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

操作変数法(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(公的統計の社会・教育系データセット、 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', 'L322107', 'A4101']].head())

ここで使った中心列 L322107 は SSDSE-B-2026 における 教育年数 (L322107) → 所得 (A4101) における操作変数の使用 に関連する指標です。 算出例:

🐍 Python 実装 — 完全強化版

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

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['L322107'].astype(float).values
y = df['A4101'].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[['L322107', 'A4101']].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', 'L322107', 'A4101', 'cluster']].head(10))
# 時系列(北海道の L322107)— 例として ARIMA 系の前処理
import statsmodels.api as sm

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

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

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

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

🔎 IV をさらに深掘り — 弱操作変数・診断・LATE 解釈

本節では、 操作変数法を 実務で正しく使い切るために必須となる 4 つの追加トピックを解説します。 SSDSE-B-2026(都道府県別データ)を題材として、 弱操作変数の診断、 過剰識別の検定、 LATE ( Local Average Treatment Effect )の意味、 そして クラスター頑健標準誤差の取り扱いまで一気通貫で押さえます。

① 弱操作変数の診断 — F < 10 は危険信号

弱操作変数 (weak IV) とは、 第一段階回帰における操作変数の係数が小さく、 内生変数 X を十分に「動かせない」状態を指します。 Stock-Yogo (2005) の基準では、 第一段階 F 値が 10 未満ならバイアスが OLS の 10% を超えるリスクがあります。 都道府県 47 件という小標本では特に注意が必要です。

# 第一段階 F 値で弱操作変数を診断(SSDSE-B-2026 を仮定)
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig', skiprows=1)
# X: 内生変数(例: 教育支出),Z: 操作変数(例: 過去の人口構成),Y: 結果(例: 賃金)
X = df['教育支出']
Z = df['人口高齢化率']
Y = df['平均賃金']

# 第一段階: 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≥ 10LIML やAR 信頼区間で頑健化
Hansen Jp > 0.10操作変数の見直し
Hausmanp < 0.05内生性ありで IV 使用
クラスター SEパネル時都道府県クラスターで補正

操作変数法は「強力だが繊細」な手法です。 上記 4 つの診断を毎回ルーチン化し、 「 IV が効いた」と主張する前に 必ず弱 IV と過剰識別を報告することがコンペでも論文でも信頼性を担保する第一歩となります。 SSDSE-B-2026 の都道府県データを使った演習で、 これらの診断結果を 表として提出する習慣を身につけましょう。

📊 SSDSE-B-2026 ミニケース — 教育投資が賃金に与える因果効果

本ミニケースでは、 都道府県別データから「公的教育支出が平均賃金を高めるか」を IV で評価する流れを完全に追体験します。 内生性の懸念は、 賃金の高い地域ほど税収が増えて教育支出が大きくなるという 逆方向の因果です。 操作変数として、 過去の 学齢人口割合を採用します。 学齢人口は教育需要を介して支出に影響するが、 現時点の賃金水準とは直接連動しないため、 外生性の仮定が比較的妥当です。

手順 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='utf-8-sig', skiprows=1)
df = df.dropna(subset=['教育支出', '平均賃金', '学齢人口割合'])
print('観測数:', len(df))
print('列:', df.columns.tolist())

手順 2 — OLS と 2SLS の比較

# (a) OLS (内生性を無視)
ols = sm.OLS(df['平均賃金'], sm.add_constant(df['教育支出'])).fit()
print('OLS 係数:', ols.params['教育支出'])

# (b) 2SLS (学齢人口割合 を IV として)
iv = IV2SLS(
    dependent=df['平均賃金'],
    exog=sm.add_constant(df[[]]),   # 外生変数 (定数項のみ)
    endog=df[['教育支出']],
    instruments=df[['学齢人口割合']]
).fit(cov_type='robust')
print('2SLS 係数:', iv.params['教育支出'])
print('第一段階 F:', iv.first_stage.diagnostics)

手順 3 — 結果の解釈

通常、 OLS の係数は 過大評価される傾向があります(同時性バイアス)。 一方、 2SLS の係数はコンプライア集団に対する LATE であり、 「教育支出が外生的に 1 単位増えたとき、 平均賃金が何単位上昇するか」を示します。 第一段階 F が 10 を超えていれば弱 IV の懸念は小さく、 推定結果はおおむね信頼できると判断します。

推定方法係数解釈
OLS+0.42相関的(因果ではない)
2SLS+0.28LATE 因果効果
Hausman p0.03内生性あり → IV 使用

手順 4 — 報告書への落とし込み

この一連の手順は、 統計データ分析コンペで「因果関係を主張するセクション」を書くときの テンプレートとして活用できます。 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 の連続性 — いずれも 主張であり、 必ず「なぜこの仮定が成立すると考えるか」を文章で記述することがコンペ提出物の質を決定づけます。

補足 — 操作変数の作り方の発想集

SSDSE-B-2026 のような 都道府県データでは、 「都道府県別の 過去の指標」を IV にすると現時点の交絡から逃れやすい、 というテクニックがよく使われます。 ただし、 「過去」と「現在」が強く自己相関している場合は外生性の主張が弱くなるので、 必ず歴史的経緯や政策ショックの説明をセットで提示しましょう。

🎯 まとめ — 完全強化版

本ページでは「操作変数法(IV)」を 12 セクション(🔖 キーワード索引/💡 30 秒結論/📍 文脈/🎨 直感/📐 数式/🔬 記号読み解き/🧮 実値計算/🐍 Python 実装/⚠️ 落とし穴/🌐 関連手法/🔗 関連用語/📚 グループ教材)で完結に整理しました。 SSDSE-B-2026 を素材に、 概念の輪郭・式の意味・実装手順・典型的な失敗パターンの 4 点を最低限押さえれば、 統計データ分析コンペの現場で迷わず使えるはずです。