論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
Hausman検定
Hausman Test
パネルデータで「固定効果(FE)とランダム効果(RE)のどちらを使うべきか」を判定する検定。
パネル分析Hausmanハウスマン検定

🔖 キーワード索引

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

hausman統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「hausman の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

分析方法を選ぶための判定基準です。

どちらの手法が正しいか決めるために使います。

部活の成績を年度ごとに比べる時に役立ちます。

この章では結論の出し方を学びます。

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

📍 学習の3ステップ

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

🔧 Python実装パターン

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 24,430 296,888 東京都 14,086,000 3,205,000 86,348 341,320 沖縄県 1,468,000 350,000 12,549 251,222 …(全 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
# ハウスマン検定:固定効果(FE) vs 変量効果(RE) を選ぶ
import pandas as pd
import numpy as np
from linearmodels.panel import PanelOLS, RandomEffects
from scipy.stats import chi2

# SSDSE-B-2026 を県×年度パネルとして読み込む(cp932・2行目の単位行を除外)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'})
df['aging'] = df['A1303'] / df['A1101'] * 100    # 高齢化率(65歳以上人口/総人口)
df['birth'] = df['A4101'] / df['A1101'] * 1000   # 出生率(人口千人当たり)
df['spend'] = df['L3221'] / 1000                 # 消費支出(千円)
panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna()

# FE と RE を両方推定する
fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects', panel).fit()
re = RandomEffects.from_formula('birth ~ 1 + aging + spend', panel).fit()

# ハウスマン統計量 H = (b_FE - b_RE)'(V_FE - V_RE)^-1 (b_FE - b_RE) ~ chi2(k)
cols = ['aging', 'spend']
b_diff = fe.params[cols] - re.params[cols]
v_diff = fe.cov.loc[cols, cols] - re.cov.loc[cols, cols]
H = float(b_diff.values @ np.linalg.inv(v_diff.values) @ b_diff.values)
p = 1 - chi2.cdf(H, df=len(cols))
print(f'Hausman H = {H:.2f}, df={len(cols)}, p = {p:.4f}')
print('→ FE を採用' if p < 0.05 else '→ RE で可(より効率的)')

📤 実行例(SSDSE-B-2026 実データ, 47 県 × 12 年 = 564 観測):

Hausman H = 162.88, df=2, p = 0.0000 → FE を採用

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

このページの上にある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 法で都道府県を分類、 デンドログラム作成

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

🍰 まずはやさしく

データの分析で使われる道具です。

適切な計算方法を選ぶために使います。

県ごとの人口の変化を調べる時に便利です。

実際の調査でどう使われるかを見ていきましょう。

論文中に 「Hausman検定」として登場する用語。

Hausman検定 とは:パネルデータで「固定効果(FE)とランダム効果(RE)のどちらを使うべきか」を判定する検定。

📍 日本のパネルデータ研究での Hausman 使用例

日本における代表的な経済・社会学パネル調査と、 そこで Hausman 検定がどう使われているかをまとめる。

調査名N × T代表的な分析テーマ典型的 Hausman 結果
SSDSE-B (47 都道府県)47 × 12人口・経済・労働FE 採用 (本ページ例)
JHPS/KHPS (慶應)≈4000 × 15家計・消費・労働供給論文の 7 割で FE
JLPS-M (東大)≈3000 × 12若年層キャリア・結婚教育リターンで FE
JSTAR (高齢者)≈8000 × 6健康・引退・年金健康効果で FE
RIETI 企業 DB数万社 × 20+生産性・R&D企業効果でほぼ FE

SSDSE は教育用パネルとして手頃な規模で、 Hausman の手計算を学ぶ最良の素材。 実務では JHPS や JLPS のような個人レベルパネルで動学的・非線形モデルへ拡張するのが普通。

🔬 数式を言葉で読み解く — N と T のバランス

$$ \text{検出力} \propto \sqrt{N \cdot T} \cdot \frac{|\Delta\beta|}{\sigma_\Delta} $$

SSDSE (NT=564) は中規模で、 効果が中程度以上なら検出できる。 N が大きいほど Hausman は鋭敏になり、 小さな内生性も検出してしまうので注意。

🎨 Hausman 検定を直感で掴む — Fixed Effects か Random Effects か

🍰 まずはやさしく

計算方法の「使い分け」を決めるルールです。

データの個性が結果に影響するかを調べます。

地域ごとの歴史や気候などの個性を考えます。

直感的にどういう仕組みか解説します。

パネルデータ(同じ個体を複数時点で観測した縦断データ)を回帰するとき、固定効果モデル (Fixed Effects, FE)変量効果モデル (Random Effects, RE) のどちらを使うべきか —— その判定に使うのが Hausman 検定(Wu–Hausman 検定)。 1978 年に Jerry Hausman が提案した。

直感的には: 「個体ごとの未観測ヘテロジニティ $\alpha_i$ が説明変数 $X_{it}$ と相関しているか?」 を問う。 相関していれば RE は不偏でなくなり、 FE しか使えない。 相関していなければ RE がより効率的(小さな分散)。

例え話: 47 都道府県の出生率や消費支出を 10 年以上追跡したパネル(SSDSE-B)。 各県には「気候・歴史・産業構造」など観測できない個性 $\alpha_i$ がある。 「北海道だから人口が少ない」のように $\alpha_i$ が説明変数(地理条件など)と相関するなら、 RE は偽の関係を拾ってしまう。 FE は $\alpha_i$ を「県固定の切片」として吸収するので頑健だが、 県間の差異(時不変の変数)は推定できない。

🧩 FE と RE の違いを 1 枚絵で

観点Fixed Effects (FE)Random Effects (RE)
$\alpha_i$ の扱い固定パラメータ(推定対象)確率変数 $\alpha_i \sim N(0, \sigma_\alpha^2)$
$\mathrm{Cov}(\alpha_i, X_{it})$任意(相関しててもよい)= 0 を仮定(厳格)
時不変変数推定不可(吸収されて消える)推定可
効率性RE より分散大仮定成立なら最小分散
不偏性常に一致 (consistent)$\mathrm{Cov}(\alpha_i, X_{it}) \neq 0$ なら不偏でない
Hausman 判定$H_0$ 棄却で FE$H_0$ 採択で RE

パネルデータ分析の 最初の選択肢 として、 Hausman は必ず通る関門。 経済学・労働経済・公衆衛生・政策評価ではほぼ全ての論文が報告する。

🎨 概念図で押さえる

Hausman 検定は固定効果モデルとランダム効果モデルの推定値の差を比較する。 差を視覚化する 3 枚の概念図でイメージを補強する。

ヒストグラム:固定効果とランダム効果の係数推定値分布
2 モデルの係数推定値のブートストラップ分布のイメージ。 ズレが大きいほど Hausman 統計量は大きくなる。
散布図:固定効果係数 vs ランダム効果係数
2 モデルの係数を 1 つずつ点でプロット。 45 度線から離れるほどモデル選択の影響が大きい。
回帰:パネルデータの単純回帰参考図
参考:パネルデータでの単純回帰。 個体効果を無視するとバイアスが出る典型例。

✅ 理解度チェック

  1. Hausman 検定の帰無仮説と対立仮説をそれぞれ説明できるか。
  2. 固定効果モデルとランダム効果モデルの違いを 2 行で書けるか。
  3. Hausman 統計量が大きいときに採用すべきモデルはどちらか、 理由とともに答えられるか。
  4. 有意水準 5% で p=0.02 が出たときの結論を述べられるか。

🎮 触って理解する — 相関を動かして FE と RE を選ぶ

ハウスマン検定の核心は「2 つの推定量(FE と RE)が食い違うかどうか」で仮定を検定する点にある。 下のスライダーで 個体効果 $\alpha_i$ と説明変数 $X_{it}$ の相関 を強めていくと、 変量効果 (RE) の推定値がじわじわ真値からズレていき、 固定効果 (FE) との差が広がって、 ついにハウスマン統計量 $H$ が臨界値を超えて RE が棄却される —— その一部始終をリアルタイムで体感できる。

ミニパネル(個体数 $N$ × 時点 $T=5$、 真の傾き $\beta=1$)をブラウザ内で毎回その場で回帰し、 FE(within 推定)と RE(GLS 変換)を計算している。 数式は本ページの定義どおりだが、 描画を滑らかにするため乱数は固定シードで生成し、 分散成分は素朴な推定量を使う 近似デモ。 傾向を掴むためのもので、 論文用の厳密値ではない。


左(ρ=0:RE の仮定が成立)→ 右(ρ=0.9:内生性が強く RE が偏る)。 図の上をドラッグ/スワイプしても動く。

N を増やすと検定が鋭敏になり、 ごく僅かな相関でも棄却されやすくなる(落とし穴 2 を体感)。
パネル散布図(色=個体)。 緑=FE(個体内の傾き)橙=RE(個体間も混ぜた傾き)。 相関が強まると個体クラスタが斜めに並び、 橙線だけが立ち上がる=RE のバイアス。
χ²(1) 分布上の H。 赤の縦線=H灰の破線=5% 臨界値 3.84、 塗り部分の面積=p 値。 H が右へ抜けると RE 棄却。
β̂FE(常に一致)= β̂RE(効率的だが要仮定)= 差 |β̂FE−β̂RE| =
H 統計量 = (df=1) p 値 =

🧭 直感 — 「一致するか」で仮定を検定する

FE と RE は帰無仮説($\mathrm{Cov}(\alpha_i,X_{it})=0$)が正しければどちらも同じ真値に近づく。 唯一の違いは効率性(RE の方が分散が小さい)だけ。 ところが仮定が破れると、 RE だけが偏り、 FE との差が開く。 ハウスマンは「2 つの推定値がズレていないか」を、 差の大きさをその不確実性で割って測る —— 差が誤差の範囲なら $H$ は小さく(p 大=RE でよい)、 差が誤差を超えれば $H$ は大きい(p 小=FE を採る)。 スライダーで ρ を上げると橙線(RE)が緑線(FE)から離れ、 それに連動して赤い縦線(H)が右へ滑っていく様子がまさにこの原理。

🕳️ よくある落とし穴 — 「非有意 = RE 採用」ではない

🚀 発展 — 過剰識別検定・頑健版・中間解

📐 Hausman 統計量の定義

🍰 まずはやさしく

2つの計算結果の差を比べる式です。

どちらの手法がより正確か判定します。

スマホの利用時間と成績の関係などを考えます。

数式を使って詳しく定義を確認しましょう。

$\hat\beta_{FE}$ を固定効果推定値、 $\hat\beta_{RE}$ を変量効果推定値とすると、 Hausman 統計量は次式で定義される。

$$ H = (\hat\beta_{FE} - \hat\beta_{RE})^\top \, \left[ \mathrm{Var}(\hat\beta_{FE}) - \mathrm{Var}(\hat\beta_{RE}) \right]^{-1} \, (\hat\beta_{FE} - \hat\beta_{RE}) $$

帰無仮説 $H_0: \mathrm{Cov}(\alpha_i, X_{it}) = 0$(→ RE が不偏)のもとで、 $H \sim \chi^2_k$ ($k$ は時変説明変数の次元)。

🔬 数式を言葉で読み解く

判定ルール:

🔬 もう一度: 数式を言葉で読み解く — V_diff の正定値性とロバスト版

古典的 Hausman の弱点は「$V_{FE} - V_{RE}$ が必ずしも正定値でない」こと(小標本や誤特定で頻繁に起こる)。 これを回避するのが Mundlak (1978)Wooldridge (2010) による「ロバスト Hausman」。

Mundlak 検定: RE モデルに「各個体の説明変数の時系列平均 $\bar{X}_i$」を追加して、 その係数 $\gamma$ が 0 か検定する。 すなわち

$$ y_{it} = \beta X_{it} + \gamma \bar X_i + \alpha_i + \varepsilon_{it} $$

$H_0: \gamma = 0$ ⇔ $\mathrm{Cov}(\alpha_i, X_{it}) = 0$ という同値性が成り立つ。 これなら通常の Wald 検定で済み、 行列の正定値性に悩まされない。

🎯 このコードでやること: Mundlak 流の代替検定を statsmodels で実装。 $\bar X_i$ を追加した RE モデルで F 検定。

📥 入力: 上記 SSDSE パネル df

 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.formula.api as smf

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'})
df['aging'] = df['A1303'] / df['A1101'] * 100
df['birth'] = df['A4101'] / df['A1101'] * 1000
df['spend'] = df['L3221'] / 1000
df = df[['pref', 'year', 'birth', 'aging', 'spend']].dropna()

# 個体平均を追加
df['aging_bar'] = df.groupby('pref')['aging'].transform('mean')
df['spend_bar'] = df.groupby('pref')['spend'].transform('mean')

# Mundlak augmented RE
m = smf.mixedlm('birth ~ aging + spend + aging_bar + spend_bar', df, groups=df['pref']).fit()
print(m.summary().tables[1])

# Wald: H0: aging_bar = spend_bar = 0
from scipy.stats import chi2
import numpy as np
b = m.params[['aging_bar', 'spend_bar']].values
V = m.cov_params().loc[['aging_bar', 'spend_bar'], ['aging_bar', 'spend_bar']].values
W = float(b @ np.linalg.inv(V) @ b)
p = 1 - chi2.cdf(W, df=2)
print(f'Mundlak Wald W = {W:.2f}, df=2, p = {p:.4f}')

📤 実行例:

Coef. Std.Err. z P>|z| Intercept 16.629 1.634 10.17 0.000 aging -0.354 0.008 -45.58 0.000 spend -0.003 0.001 -2.23 0.026 aging_bar +0.160 0.031 5.26 0.000 spend_bar -0.011 0.005 -2.43 0.015 Mundlak Wald W = 38.06, df=2, p = 0.0000

💬 aging_bar の係数が有意(p < 0.001)→ 高齢化率は個体未観測効果と相関している。 Mundlak Wald (W = 38.06) は古典 Hausman と同じく FE を支持し、 V_diff の正定値性に依存しないので信頼できる。

🧮 SSDSE-B-2026 で Hausman 検定を実演

「都道府県 × 年度」のパネル構造を擬似的に構築し、 高齢化率と消費支出が出生率に与える影響を、 FE モデルと RE モデルの両方で推定して比較します(SSDSE-B-2026 の 2012–2023 年 × 47 都道府県パネル)。

① データ準備

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 24,430 296,888 東京都 14,086,000 3,205,000 86,348 341,320 沖縄県 1,468,000 350,000 12,549 251,222 …(全 47 行)
1
2
3
4
5
6
7
8
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'})
df['aging'] = df['A1303'] / df['A1101'] * 100     # 高齢化率
df['birth'] = df['A4101'] / df['A1101'] * 1000    # 出生率(千人当たり)
df['spend'] = df['L3221'] / 1000                  # 消費支出(千円)
panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna()
print(panel.head())
📤 実行例(実測) birth aging spend pref year 北海道 2023 4.797722 33.012569 296.888 2022 5.137549 32.801556 277.737 2021 5.549296 32.529423 268.396 2020 5.650752 31.849683 301.683 2019 5.898460 31.812132 294.682

② FE モデル と RE モデルを推定

1
2
3
4
5
6
7
from linearmodels.panel import PanelOLS, RandomEffects
fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects',
                           data=panel).fit()
re = RandomEffects.from_formula('birth ~ 1 + aging + spend',
                                data=panel).fit()
print(fe)
print(re)
📤 実行例(実測) PanelOLS Estimation Summary ================================================================================ Dep. Variable: birth R-squared: 0.8017 Estimator: PanelOLS R-squared (Between): -5.4882 No. Observations: 564 R-squared (Within): 0.8017 Date: Sun, Aug 16 2026 R-squared (Overall): -5.4186 Time: 18:07:59 Log-likelihood -185.29 Cov. Estimator: Unadjusted F-statistic: …(以下略)

③ Hausman 検定統計量を手計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from linearmodels.panel import PanelOLS, RandomEffects  # ← このコードは linearmodels が必要
import numpy as np
from scipy import stats

cols = ['aging', 'spend']
b_fe = fe.params[cols].values
b_re = re.params[cols].values
V_fe = fe.cov.loc[cols, cols].values
V_re = re.cov.loc[cols, cols].values
diff = b_fe - b_re
H = diff @ np.linalg.inv(V_fe - V_re) @ diff
p = 1 - stats.chi2.cdf(H, df=len(diff))
print(f'Hausman H = {H:.2f}, p = {p:.4f}')
📤 実行例(実測) Hausman H = 162.88, p = 0.0000

④ 計算結果の解釈表(実データ)

指標FE 推定値RE 推定値
aging−0.3538−0.3424−0.0113
spend−0.00251−0.00342+0.00091
Hausman H162.88p = 0.0000

H が大きく p < 0.05 なので「個体効果と説明変数は無相関」という帰無仮説は棄却。 RE モデルは不一致推定量となるため、 FE モデルを採用するのが妥当です。

SSDSE-B-2026 は 年度 × 都道府県 の縦断データ(パネル)として読み込める。 ここでは「出生率 (A4101/A1101×1000) を被説明変数とし、 高齢化率 (A1303/A1101×100) と消費支出 (L3221) を説明変数」というモデルで FE/RE 比較を行う。 47 県 × 12 年 = 564 観測。

📥 入力データ (SSDSE-B-2026 抜粋):

SSDSE-B-2026 ヘッダ(実データ) 年度 Code 都道府県 ... A1101(総人口) A1303(65歳以上) A4101(出生数) L3221(消費支出) 2023 R01000 北海道 ... 5092000 1681000 24430 296888 2022 R01000 北海道 ... 5140000 1686000 26407 277737 2021 R01000 北海道 ... 5183000 1686000 28762 268396 ... (47 県 × 12 年 = 564) 2012 R47000 沖縄県 ... 1411000 250000 17074 227981

🐍 Python: FE/RE 推定と Hausman 検定 (linearmodels)

🎯 このコードでやること: SSDSE-B-2026 から県 × 年度のパネルを構築し、 linearmodels.PanelOLS で FE、 RandomEffects で RE を推定、 Hausman 統計量を計算する。

📥 入力: 上記 SSDSE-B-2026 抜粋(年度・都道府県・A1101・A1303・A4101・L3221 列)

 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
29
30
31
32
import pandas as pd
import numpy as np
from linearmodels.panel import PanelOLS, RandomEffects

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'})

# パネル設定 (entity = 都道府県、 time = 年度)
df['aging'] = df['A1303'] / df['A1101'] * 100   # 高齢化率
df['birth'] = df['A4101'] / df['A1101'] * 1000  # 出生率(千人当たり)
df['spend'] = df['L3221'] / 1000                # 消費支出(千円)
panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna()

print('observations:', len(panel))
print('entities (都道府県):', panel.index.get_level_values(0).nunique())
print('time (年度):', panel.index.get_level_values(1).nunique())

# Fixed Effects (EntityEffects)
fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects', data=panel).fit()
print('FE coef aging:', fe.params['aging'], 'spend:', fe.params['spend'])

# Random Effects
re = RandomEffects.from_formula('birth ~ 1 + aging + spend', data=panel).fit()
print('RE coef aging:', re.params['aging'], 'spend:', re.params['spend'])

# Hausman 統計量を手計算
b_diff = fe.params[['aging', 'spend']] - re.params[['aging', 'spend']]
v_diff = fe.cov.loc[['aging', 'spend'], ['aging', 'spend']] - re.cov.loc[['aging', 'spend'], ['aging', 'spend']]
H = float(b_diff.values @ np.linalg.inv(v_diff.values) @ b_diff.values)
from scipy.stats import chi2
p = 1 - chi2.cdf(H, df=2)
print(f'Hausman H = {H:.2f}, df=2, p = {p:.4f}')

📤 実行例:

observations: 564 entities (都道府県): 47 time (年度): 12 FE coef aging: -0.3538 spend: -0.00251 RE coef aging: -0.3424 spend: -0.00342 Hausman H = 162.88, df=2, p = 0.0000

💬 H = 162.88 は $\chi^2_{2, 0.95}=5.99$ を大きく超え、 p ≈ 0 で帰無仮説を強く棄却。 → FE を採用すべき。 高齢化率・消費支出とも FE と RE で係数が有意に食い違っており、 個体未観測効果との相関による偏りが直接見えている。

🧮 Hausman を完全に説明するための補足計算 — 補助統計量 5 種

論文で Hausman の結論を補強するために、 並行して報告すべき補助統計量を 5 種挙げる。

統計量意味SSDSE 例の値合格基準
F (Pooled vs FE)個体効果有意性F = 39.3, p < 0.001p < 0.05
Breusch-Pagan LMRE 必要性LM = 1238.0, p < 0.001p < 0.05
Hausman HFE vs REH = 162.9, p < 0.001p < 0.05 → FE
Mundlak Waldロバスト版 HausmanW = 38.1, p < 0.001p < 0.05 → FE
Wooldridge AR(1) 検定系列相関F = 570.0, p < 0.001p < 0.05 → クラスタ SE

🔬 数式を言葉で読み解く — Breusch-Pagan LM

$$ LM = \frac{NT}{2(T-1)} \left[ \frac{\sum_i (\sum_t \hat e_{it})^2}{\sum_i \sum_t \hat e_{it}^2} - 1 \right]^2 $$

F 検定と BP-LM の両方を Hausman の前にやる、 というのが Baltagi (2021) の標準フロー。

🧮 数式に値を入れて手で計算する: Hausman 検定

合成データで Fixed Effect と Random Effect モデルの係数差から H 統計量を計算する。

Step 1: 係数推定値

変数β_FEβ_RE
X12.52.00.5
X21.21.00.2

分散差 (FE-RE) の対角: [0.01, 0.005]

Step 2: H 統計量 (簡略)

H = (β_FE - β_RE)' [Var_FE - Var_RE]⁻¹ (β_FE - β_RE) 対角近似: H ≈ 0.5²/0.01 + 0.2²/0.005 = 25 + 8 = 33 df=2, χ²(0.05, 2) = 5.99 H=33 > 5.99 → RE 棄却、 FE を採用

🐍 Python で再現

1
2
3
4
5
6
7
8
import numpy as np
from scipy import stats
diff = np.array([0.5, 0.2])
var_diff = np.diag([0.01, 0.005])
H = diff @ np.linalg.inv(var_diff) @ diff
p = 1 - stats.chi2.cdf(H, df=2)
print(f"H = {H:.2f}")
print(f"p = {p:.4f}")

📤 実行結果

H = 33.00 p = 0.0000

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

🐍 Python 実装バリエーション(linearmodels / statsmodels / scipy.stats)

A. linearmodels の compare(最短コード)

1
2
from linearmodels.panel import compare
print(compare({'FE': fe, 'RE': re}))
📤 実行例(実測) Model Comparison ======================================================== FE RE -------------------------------------------------------- Dep. Variable birth birth Estimator PanelOLS RandomEffects No. Observations 564 564 Cov. Est. Unadjusted Unadjusted R-squared 0.8017 0.7780 R-Squared (Within) 0.8017 0.8007 R-Squared (Between) -5.4882 0.1343 R-Squared (Overall) -5.4186 0.4444 F-statistic …(以下略)

B. statsmodels の自前実装(手計算と完全一致)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import statsmodels.api as sm
# 個体ダミーで FE を表現
dummies = pd.get_dummies(panel.index.get_level_values('pref'), drop_first=True)
X_fe = pd.concat([panel[['aging', 'spend']].reset_index(drop=True),
                  dummies.reset_index(drop=True)], axis=1).astype(float)
y    = panel['birth'].reset_index(drop=True)
fe2  = sm.OLS(y, sm.add_constant(X_fe)).fit()
# 通常 OLS(pooled)との係数差
X_pool = sm.add_constant(panel[['aging', 'spend']].reset_index(drop=True).astype(float))
pool   = sm.OLS(y, X_pool).fit()
print(fe2.params[['aging', 'spend']] - pool.params[['aging', 'spend']])
📤 実行例(実測) aging -0.113859 spend 0.008298 dtype: float64

C. scipy.stats を使った χ² テーブル計算

1
2
3
from scipy.stats import chi2
for H in [3.0, 5.99, 10.0, 12.34, 20.0]:
    print(f'H={H:5.2f}  p={1-chi2.cdf(H, df=2):.4f}')
📤 実行例(実測) H= 3.00 p=0.2231 H= 5.99 p=0.0500 H=10.00 p=0.0067 H=12.34 p=0.0021 H=20.00 p=0.0000

D. R 由来の plm パッケージ互換(rpy2 経由)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()
ro.r('library(plm)')
ro.globalenv['df'] = panel.reset_index()
ro.r('''
fe <- plm(birth ~ aging + spend, data=df, model="within", index=c("pref","year"))
re <- plm(birth ~ aging + spend, data=df, model="random", index=c("pref","year"))
print(phtest(fe, re))
''')

🐍 statsmodels + scipy で手計算 (linearmodels なし)

🎯 このコードでやること: linearmodels が無い環境でも、 within 変換 (de-mean) と GLS で FE/RE を実装し Hausman を計算できる。 アルゴリズムの中身が見える。

📥 入力: 上と同じパネル df(都道府県・年度・income・unemp・aging)

 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
29
30
31
32
33
34
import pandas as pd, numpy as np
import statsmodels.api as sm
from scipy.stats import chi2

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'})
df['aging'] = df['A1303'] / df['A1101'] * 100
df['birth'] = df['A4101'] / df['A1101'] * 1000
df['spend'] = df['L3221'] / 1000
d = df[['pref', 'year', 'birth', 'aging', 'spend']].dropna()

# === FE: within (de-mean by entity) ===
def demean(g):
    return g - g.mean()
X_fe = d.groupby('pref')[['aging', 'spend']].transform(demean)
y_fe = d.groupby('pref')['birth'].transform(demean)
fe_ols = sm.OLS(y_fe, X_fe).fit()
beta_fe = fe_ols.params.values
V_fe = fe_ols.cov_params().values

# === RE: mixedlm(分散成分を最尤推定) ===
import statsmodels.formula.api as smf
re_model = smf.mixedlm('birth ~ aging + spend', d, groups=d['pref']).fit()
beta_re = re_model.params[['aging', 'spend']].values
V_re = re_model.cov_params().loc[['aging', 'spend'], ['aging', 'spend']].values

# === Hausman ===
diff = beta_fe - beta_re
V_diff = V_fe - V_re
H = float(diff @ np.linalg.pinv(V_diff) @ diff)
print(f'FE   beta: aging={beta_fe[0]:+7.3f}  spend={beta_fe[1]:+7.3f}')
print(f'RE   beta: aging={beta_re[0]:+7.3f}  spend={beta_re[1]:+7.3f}')
print(f'Hausman H = {H:.2f}, df=2')
print('注意:', 'V_diff 非正定値 (H<0) → Mundlak/linearmodels で判定' if H < 0 else 'FE 採用')

📤 実行例:

FE beta: aging= -0.354 spend= -0.003 RE beta: aging= -0.347 spend= -0.003 Hausman H = -11.12, df=2 注意: V_diff 非正定値 (H<0) → Mundlak/linearmodels で判定

💬 mixedlm の RE 分散は linearmodels の GLS 版と異なり、 V_FE − V_RE が非正定値になって H が負値になった(落とし穴⑦の実例)。 この場合は pinv でも救えないので、 正定値性に依存しない Mundlak 版(W = 38.06, p < 0.001)や linearmodels 版(H = 162.88)で判定する。 いずれも FE を支持。

⚠️ Hausman 検定の落とし穴 — 詳細 7 連発

1. 「p < 0.05 で必ず FE」と機械的に判定してしまう。Hausman 検定はサンプルサイズが大きくなると、 ごく僅かな係数差でも p 値が小さくなります。 結果として実務的にはほぼ同等のモデルなのに FE 採用を強制されるケースがあります。 効果量(β̂FE − β̂RE の絶対値)と AIC / BIC も併用してください。

2. 不均一分散・系列相関を補正していない。古典的な Hausman 検定は球面性(i.i.d.)を仮定しています。 パネルでは個体内系列相関や不均一分散が常態なので、 cluster-robust 標準誤差で再計算しないと、 H 統計量自体が信用できません。 linearmodels の cov_type='clustered' を必ず使ってください。

3. 時間ダミーや交互作用を忘れる。FE は個体効果を吸収しますが、 時間効果(共通ショック)を含めないと、 説明変数が時間トレンドを取り込んだ偽の係数になります。 EntityEffects + TimeEffects の 2way FE を基本形にし、 必要に応じて交互作用も検討しましょう。

4. 内生変数を回帰式に放置している。Hausman は「FE と RE のどちらを使うか」を決める検定であって、 内生性そのものを解決しません。 説明変数自身が誤差項と相関しているなら、 IV や DID など別の識別戦略が必要で、 H が有意でなくても RE が不偏になる保証はありません。

5. 観測単位が「人」ではなく「集計値」になっている。都道府県単位の集計データ(SSDSE-B)は「個体=47県」しかなく、 自由度が極端に小さい状態で Hausman を行うと統計量が不安定です。 市区町村別 or 業種別の細分化、 あるいは時間方向 panel への拡張で N を増やしましょう。

6. 説明変数に時間不変の変数を含めている。FE モデルは時間不変変数(例:地形・気候)を吸収してしまうため、 RE と比較するとそれら係数の差が定義できません。 該当列は事前に外すか、 Hausman-Taylor 推定量で扱う必要があります。

7. VFE − VRE が非正定値になる。有限標本では分散差行列が負定値になり、 H が負値を出すことがあります。 これは検定の前提が壊れているサインで、 ブートストラップ版 Hausman(Wooldridge 版)への切り替え、 もしくは Mundlak アプローチ(FE と RE の中間)を検討すべきです。

⚠️ Hausman の落とし穴 — 実務でハマる 7 つ

  1. V_FE − V_RE が負定値になる: 小標本や誤特定で頻繁。 結果として H < 0 という意味不明な値が出ることがある。 → Mundlak / クラスタロバスト版に切り替えよう。
  2. p ≥ 0.05 でも「RE で OK」とは限らない: 検定力不足の可能性。 サンプル数 (NT) が小さいと内生性があっても拾えない。 N ≥ 30、 T ≥ 5 が目安。
  3. 時不変変数を含めると FE で消える: 性別・人種・地域固定要因など、 時間で変わらない変数は FE 推定では識別不能。 RE で扱える代わりに RE の不偏性が必要。
  4. 不均衡パネルでバイアス: 観測欠損が非ランダムだと両モデルとも偏る。 完全データに絞るか MICE で補完。
  5. 系列相関・分散不均一: 古典 Hausman は i.i.d. を仮定。 クラスタロバスト標準誤差を使うと統計量と p 値が変わる。
  6. 仮定棄却 = FE 万能ではない: 棄却されても「FE が無条件に正しい」のではなく「RE が偏る」だけ。 動学パネル (lagged y) では FE も Nickell バイアスを抱える。
  7. 結果の経済学的解釈を忘れる: 「H=38」と数値だけ示しても意味なし。 「個体の何が未観測で X と相関するか」を文章で説明することが必須。

🧠 解説深化 — 直感・落とし穴・発展をひとつにまとめる

ここまでの各章(直感定義Mundlak落とし穴IV への応用)を横断して、 Hausman 検定の要点を「一枚の地図」として再構成する。 新しい実測値として、 SSDSE-B-2026 にクラスタロバスト標準誤差を効かせた頑健版 Hausman を追加で計算し、 古典版との落差を数字で示す。

🎯 直感 — 「2 つの一致推定量が一致し続けるか」を測る

Hausman の本質は、 2 つの推定量の一致性 (consistency) を突き合わせることにある。 帰無仮説 $H_0:\mathrm{Cov}(\alpha_i,X_{it})=0$ が正しい世界では、 固定効果 $\hat\beta_{FE}$ も変量効果 $\hat\beta_{RE}$ もどちらも同じ真値 $\beta$ に収束する(=両方とも一致推定量)。 違いは効率だけで、 RE の方が分散が小さい。 ところが仮定が破れると、 FE だけが一致性を保ち、 RE は偏る。 だから「両者の係数差 $\hat\beta_{FE}-\hat\beta_{RE}$ がゼロから統計的に離れているか」を見れば、 RE の外生性仮定を間接的に検定できる。

つまり Hausman は「一致推定量 (FE) を物差しに、 効率推定量 (RE) がその物差しからズレていないか」を測る比較 (contrast) 検定。 上の 🎮 触って理解するウィジェットで ρ を上げると、 橙線 (RE) だけが緑線 (FE) から離れ、 それに連動して $H$ が臨界値 3.84 を超える —— この「片方だけがズレる」様子が直感の核。

🕳️ 落とし穴(重要)— 解釈を誤りやすい 7 点

  1. 帰無仮説の向きを取り違える。 $H_0$ は「RE が適切(個体効果と説明変数が無相関)」。 有意でない=RE 採用、 有意=FE 採用。 「有意だから良いモデル」という通常の検定の直感と逆向きで、 非有意こそが RE を許す条件。 混同しやすい。
  2. 負のカイ二乗統計量。 有限標本や誤特定では分散差 $V_{FE}-V_{RE}$ が正定値でなくなり、 $H<0$ という定義上あり得ない値が出る。 これは「検定の前提が壊れた」サインで、 $H$ を 0 とみなして採択、 ではなく頑健版・Mundlak 版へ切り替えるべき合図。
  3. 外生性の「必要条件」にすぎない。 非有意でも「RE の仮定が全面的に正しい」証明にはならない。 検出力不足(小 $N$・小 $T$・差の分散大)でも p は大きく出る。 Hausman が通っても、 別の内生性(同時性・逆因果)が残る余地はある。
  4. 頑健版が必要。 古典 Hausman は球面攪乱項(i.i.d.)を仮定する。 パネルで常態の系列相関・不均一分散があると $H$ 自体が過大評価される。 実測: SSDSE-B-2026 で県クラスタロバスト SE を使うと、 同じモデルで $H$ が 162.88 → 6.96(p=0.0000 → p=0.031)へ激減した(下表)。 結論(FE 採用)は変わらないが、 古典版の「圧倒的有意」は SE を補正すると大幅に穏当化する。
  5. 時間不変変数の扱い。 性別・地形・気候など時間で変わらない変数は FE では吸収されて消え、 RE でしか係数が出ない。 両者で差が定義できないため Hausman の比較対象から外すか、 Hausman–Taylor 推定量で扱う。
  6. Mundlak アプローチという代替。 RE に個体平均 $\bar X_i$ を加え、 その係数 $\gamma=0$ を Wald 検定する(上記で W=38.1)。 $H_0:\gamma=0 \Leftrightarrow \mathrm{Cov}(\alpha_i,X_{it})=0$ と同値で、 行列の正定値性に悩まされず、 クラスタロバスト SE とも自然に併用できる。
  7. 検出力(power)。 $N$ が巨大だとごく僅かな相関でも棄却され、 実務的にはほぼ同一のモデルなのに「FE を採れ」と出る。 逆に $N,T$ が小さいと内生性を見逃す。 $H$ の有意性だけでなく効果量 $|\hat\beta_{FE}-\hat\beta_{RE}|$ と AIC/BIC を必ず併読する(本ページ実データでは aging の差は僅か −0.011、 数字上の有意と実質差の乖離に注意)。

📊 頑健版 Hausman の実測(クラスタロバスト SE, 県クラスタ)

同じ「出生率 ~ 高齢化率 + 消費支出」モデルを、 FE・RE とも cov_type='clustered', cluster_entity=True で推定し直して Hausman を再計算した実測値。

標準誤差の種類H 統計量 (df=2)p 値判定
古典(i.i.d. 仮定)162.880.0000FE(圧倒的有意)
県クラスタロバスト6.960.0308FE(辛うじて 5% 有意)

💬 系列相関・不均一分散を補正しただけで $H$ が 20 分の 1 以下に縮む。 結論(FE 採用)は保たれるが、 「古典版の巨大な $H$ は SE の過小評価に由来する部分が大きい」という落とし穴 4 の生きた実例。 論文では頑健版の値を報告するのが安全。

🚀 発展 — Hausman を統一原理として広げる

🔗 関連ページ

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

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

🚀 実務応用の深掘り

典型的なプロジェクトの流れ

  1. 問題理解:ステークホルダーとの対話、 KGI/KPI 設定
  2. データ収集:内部DB、 公的データ(SSDSE等)、 API
  3. EDA:データの全体像把握、 異常検出
  4. 仮説立案:ドメイン知識からの仮説
  5. モデリング:シンプルから複雑へ段階的に
  6. 検証:CV、 ホールドアウト、 A/Bテスト
  7. 解釈:可視化、 SHAP、 部分依存プロット
  8. 展開:本番デプロイ、 監視

ベストプラクティス

論文・コンペでよく使う言い回し

日本語 英語
統計的に有意statistically significant
効果量effect size
95%信頼区間95% confidence interval (CI)
標本サイズsample size
検出力statistical power
第1種の誤りType I error / false positive
第2種の誤りType II error / false negative
多重比較問題multiple comparisons problem
過学習overfitting
汎化性能generalization
交差検証cross-validation (CV)

統計データ活用コンペでのコツ

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

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

📍 体系階層のパス

🌐 統計・データサイエンス › 因果推論 › パネル分析 › Hausman検定

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

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

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

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

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

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

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

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

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

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

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

🗺 パネル分析の意思決定フロー

パネルデータが手元にあるとき、 Hausman の前後でどう動けばよいかを整理する。

ステップアクション合格基準
1. パネル構造の確認N, T, 欠損率を集計N ≥ 30, T ≥ 5, 欠損率 ≤ 10%
2. Pooled OLS で第一印象最初に係数符号と大きさ把握理論と矛盾しないか確認
3. F 検定 (Pooled vs FE)$\alpha_i$ 全て同じかp < 0.05 → 個体効果あり
4. BP/LM 検定 (Pooled vs RE)$\sigma_\alpha^2 = 0$ かp < 0.05 → RE が pooled より良い
5. Hausman 検定FE vs REp < 0.05 → FE 採用
6. クラスタロバスト SE系列相関対応SE が大きく変わらない
7. ロバストネス分析サブサンプル・別変数結論不変

この 7 ステップを論文の Methods 節に書けば、 査読でほぼ問題視されない。

🔗 隣接手法への橋渡し

「ハウスマン検定」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

上流の固定効果・変量効果モデルで両推定量を計算し、 並列の Breusch-Pagan・F 検定と一緒にモデル選択の証拠を集め、 下流の頑健標準誤差・クラスター標準誤差で推論を補強する。 ハウスマン検定は固定効果 vs 変量効果の選択基準だが、 帰無仮説棄却の解釈は標本サイズに敏感で、 経済学的妥当性と併せて判断する。

🌳 手法選択フロー

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

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

シナリオ重視する観点候補手法
データが大規模 (n が多い、 高次元)計算コスト / メモリ / 並列化が必要OLS vs IV (操作変数法)
外れ値が多い / ノイズあり頑健性 / 外れ値除去 / 中央値ベースMundlak / クラスタロバスト Hausman

選んだ後の検証ステップ

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

🔖 キーワード索引(チップから該当箇所へジャンプ)

論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:

Hausman検定 固定効果モデル ランダム効果モデル パネルデータ 個体効果 内生性 不均一分散 クラスタ標準誤差 linearmodels statsmodels scipy.stats χ²分布 p値 DID 操作変数法