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

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

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

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

💡 30秒で分かる結論

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

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

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

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

📍 学習の3ステップ

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

🔧 Python実装パターン

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

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

このページの上にある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 データサイエンス環境

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

🌟 効果的なEDAテンプレート

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

📈 報告書テンプレート

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

  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

🚀 実務応用の深掘り

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

  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)

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

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

「都道府県 × 年度」のパネル構造を擬似的に構築し、 一人当たり県民所得が出生率に与える影響を、 FE モデルと RE モデルの両方で推定して比較します(年度差は SSDSE-A から派生させたサンプル)。

① データ準備

1
2
3
4
5
6
7
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
df = df.rename(columns={'都道府県': 'pref', '一人当たり県民所得': 'income',
                        '出生率': 'fertility', '高齢化率': 'aging'})
df['year'] = 2026
panel = df.set_index(['pref', 'year'])
print(panel.head())

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

1
2
3
4
5
6
7
from linearmodels.panel import PanelOLS, RandomEffects
fe = PanelOLS.from_formula('fertility ~ income + aging + EntityEffects',
                            data=panel).fit(cov_type='clustered', cluster_entity=True)
re = RandomEffects.from_formula('fertility ~ income + aging',
                                data=panel).fit()
print(fe)
print(re)

③ Hausman 検定統計量を手計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np
from scipy import stats
b_fe = fe.params[['income', 'aging']].values
b_re = re.params[['income', 'aging']].values
V_fe = fe.cov.loc[['income','aging'], ['income','aging']].values
V_re = re.cov.loc[['income','aging'], ['income','aging']].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:.3f}, p = {p:.4f}')

④ 計算結果の解釈表(仮想数値での例)

指標FE 推定値RE 推定値
income0.000210.00038−0.00017
aging−0.018−0.024+0.006
Hausman H12.34p = 0.0021

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

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

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

1
2
from linearmodels.panel import compare
print(compare({'FE': fe, 'RE': re}))

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[['income','aging']].reset_index(drop=True),
                  dummies.reset_index(drop=True)], axis=1).astype(float)
y    = panel['fertility'].reset_index(drop=True)
fe2  = sm.OLS(y, sm.add_constant(X_fe)).fit()
# 通常 OLS(pooled)と Hausman 風の差検定
X_pool = sm.add_constant(panel[['income','aging']].reset_index(drop=True).astype(float))
pool   = sm.OLS(y, X_pool).fit()
print(fe2.params[['income','aging']] - pool.params[['income','aging']])

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

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(fertility ~ income + aging, data=df, model="within", index=c("pref","year"))
re <- plm(fertility ~ income + aging, data=df, model="random", index=c("pref","year"))
print(phtest(fe, re))
''')

⚠️ 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 の中間)を検討すべきです。

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

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

📍 体系階層のパス

🌐 体系階層に未登録

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

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

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

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

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

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

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

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

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

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

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