論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
カイ二乗検定
Chi-square Test (χ²)
カテゴリカルデータのクロス集計で「2変数が独立か」を検定。観測度数と期待度数の差を測る。
仮説検定χ²χ²検定カイ2乗chi square
📍 文脈💡 30秒結論

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

論文中に 「カイ二乗検定」として登場する用語。

カイ二乗検定 とは:カテゴリカルデータのクロス集計で「2変数が独立か」を検定。観測度数と期待度数の差を測る。

💡 30秒で分かる結論

👁️ 直感 — χ²検定は「カテゴリデータの独立性検定」

カイ二乗検定はカテゴリ変数の関係を調べる主要な検定:

📐 χ²統計量

$$ \chi^2 = \sum_{i, j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} $$

独立性検定の期待度数

$$ E_{ij} = \frac{\text{行}_i\text{の合計} \times \text{列}_j\text{の合計}}{\text{総合計}} $$

📊 適合度検定の例

「サイコロは公平か?」を 60 回投げて検定:

📋 χ²検定の仮定

🐍 Python での χ²検定

▼ コード解説(クロス集計表の作成(pd.crosstab))
🎯 解説: pd.crosstab で 2 変数の度数表を作成。 χ² 検定の入力。 行と列の独立性を検定する基本表。
📥 入力例: df['人口規模区分'] × df['高齢化区分'] 47 県 × 2 カテゴリ × 2 カテゴリ
📤 実行例: 都市 × 若い: 15 県 都市 × 高齢: 5 県 地方 × 若い: 7 県 地方 × 高齢: 20 県
💬 読み方: クロス集計は「2 変数の同時分布」を可視化。 期待度数とのズレを χ² で測ると独立性が検定できる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from scipy import stats
import pandas as pd

# 適合度検定
observed = [8, 12, 11, 9, 13, 7]
expected = [10] * 6
chi2, p = stats.chisquare(observed, expected)

# 独立性検定(クロス集計)
contingency = pd.crosstab(df['性別'], df['購入'])
chi2, p, dof, expected = stats.chi2_contingency(contingency)
print(f'χ² = {chi2:.3f}, df = {dof}, p = {p:.4f}')

# Fisher の正確検定(小サンプル)
oddsratio, p = stats.fisher_exact(contingency)

# Cramér's V(効果量)
n = contingency.sum().sum()
v = np.sqrt(chi2 / (n * (min(contingency.shape) - 1)))

🚧 落とし穴と注意点

🔬 「カイ二乗検定」を深く理解する

χ²分布の性質

効果量 Cramér's V

$$ V = \sqrt{\frac{\chi^2}{n \cdot \min(r-1, c-1)}} $$

0〜1の値、 大きいほど強い関連。 Cohen の基準:0.1 小、 0.3 中、 0.5 大。

応用

📝 練習問題 — 理解度チェック

  1. この用語の基本定義を、 自分の言葉で説明できますか?
  2. この手法が使われる典型的なシナリオを3つ挙げられますか?
  3. この手法の前提条件・仮定を確認できますか?
  4. 結果を解釈する際の注意点は何ですか?
  5. 類似手法との違いを説明できますか?
  6. Python(または他言語)で実装できますか?
  7. SSDSE データで応用例を作成できますか?

📚 参考文献・さらなる学習

古典的教科書

実践書

オンラインリソース

💼 実務応用ガイド

データサイエンスプロジェクトでの位置づけ

  1. 探索的分析(EDA):基本統計量・可視化でデータを理解
  2. 前処理:標準化・正規化・欠損値処理
  3. モデリング:回帰・分類・クラスタリング
  4. 評価:CV、 指標計算、 統計的検定
  5. 解釈・報告:効果量・信頼区間・可視化

業界別ユースケース

📖 完全ガイド — 統計学習の参照表

分析の流れ — 8ステップ

  1. 問題定義:何を知りたいのか、 目的を明確に
  2. データ収集:信頼できるソースから(SSDSEなど公的データ)
  3. データクリーニング:欠損値、 外れ値、 入力ミスの確認
  4. 探索的分析(EDA):要約統計量、 ヒストグラム、 散布図
  5. 変数変換:標準化、 対数変換、 カテゴリのエンコード
  6. モデリング:適切な手法を選び、 学習
  7. 評価:CV、 指標、 統計的検定
  8. 解釈・報告:効果量、 信頼区間、 可視化

統計手法の選び方マトリクス

目的 1変数 2変数 多変量
記述平均, 中央値, 分散相関, 共分散PCA, 因子分析
可視化ヒストグラム, 箱ひげ散布図, ヒートマップ散布図行列, バイプロット
予測時系列モデル単回帰重回帰, Ridge, LASSO
分類ロジスティック回帰判別分析SVM, RF, NN
グループ化階級分け2次元クラスタリングk-means, 階層クラスタリング
検定1標本t検定2標本t検定, χ²ANOVA, MANOVA

サンプル数別の手法ガイド

n 推奨手法
n < 10記述統計のみ、 ノンパラ検定、 ベイズ統計
10 ≤ n < 30t検定, ブートストラップ, 単回帰
30 ≤ n < 200重回帰, ANOVA, 階層クラスタリング
200 ≤ n < 10000複雑な回帰, RF, GBM, k-means
n ≥ 10000深層学習, 大規模分散学習

Python 主要ライブラリ早見表

ライブラリ 用途
numpy数値計算の基礎、 行列演算
pandasデータフレーム、 表操作
scipy統計関数、 最適化、 線形代数
statsmodels古典統計、 検定、 回帰分析の詳細
scikit-learn機械学習、 前処理、 評価
matplotlib基本可視化
seaborn統計的可視化(高級)
plotlyインタラクティブ可視化
xgboost / lightgbm勾配ブースティング
PyTorch / TensorFlow深層学習

よくある質問(FAQ)

📓 用語のまとめ — 30秒で理解

このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
決定係数アール二乗
Σ総和記号、 共分散行列シグマ大文字
N(μ, σ²)正規分布ノーマル ミュー シグマ二乗
t(df)t分布ティー
χ²(df)カイ二乗分布カイ二乗
F(d1, d2)F分布エフ
H₀, H₁帰無仮説、 対立仮説エイチゼロ、 エイチワン
E[X]期待値エクスペクタンス
Var(X)分散バリアンス
Cov(X, Y)共分散カバリアンス

💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。

🌐 データサイエンス全体像での位置づけ

データサイエンスのワークフロー

  1. ビジネス理解:何を解決したいか
  2. データ理解:どんなデータがあるか
  3. データ準備:前処理、 特徴量エンジニアリング
  4. モデリング:手法選択、 学習
  5. 評価:性能、 解釈性、 ビジネス価値
  6. 展開:実装、 運用、 監視

(CRISP-DM プロセスより)

主要分野のマッピング

分野 主要技術 代表ツール
記述統計要約量、 可視化pandas, matplotlib
推測統計検定、 信頼区間scipy.stats, statsmodels
機械学習予測、 分類、 クラスタリングscikit-learn, XGBoost
深層学習NN、 画像、 自然言語PyTorch, TensorFlow
時系列ARIMA、 状態空間、 LSTMstatsmodels, prophet
因果推論RCT、 IV、 DiD、 PSMDoWhy, EconML
ベイズ統計MCMC、 変分推論PyMC, Stan
最適化線形/凸/離散最適化scipy.optimize, cvxpy

キャリアパス

💎 良いデータ分析のための10のコツ

  1. 必ず可視化から始める:散布図、 ヒストグラム、 箱ひげ図
  2. 外れ値を意識する:除く前にドメイン的に理解
  3. 仮定を確認する:正規性、 独立性、 等分散性
  4. サンプルサイズに見合う複雑性:n=10 で深層学習はしない
  5. 効果量も併記する:p値だけでは不十分
  6. 信頼区間で不確実性を示す:点推定だけでは誤解の元
  7. 多重比較を補正する:探索的解析でも誠実に
  8. ホールドアウト or CV で評価する:訓練データの精度は意味がない
  9. 解釈可能性も重視する:ブラックボックスより white-box
  10. 再現可能なコードを書く:random_seed、 バージョン管理

🔗 用語間の関係 — 統計概念のネットワーク

記述統計の基本セット

これらは互いに深く関連します:

推測統計の基本セット

回帰モデルファミリー

クラスタリング・次元削減ファミリー

検定ファミリー

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

📍 学習の3ステップ

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

🔧 Python実装パターン

▼ コード解説(χ² 検定(scipy.stats.chi2_contingency))
🎯 解説: scipy.stats.chi2_contingency で 2 行 2 列以上の独立性検定。 期待度数・統計量・p 値を一括取得。
📥 入力例: クロス集計表(観測度数)
📤 実行例: χ² = 15.3 df = 1, p = 0.00009 → 都市性と高齢化は独立でない
💬 読み方: p<0.05 で独立性帰無仮説を棄却。 都市部と地方部で高齢化分布が異なることが統計的に裏付けられる。
 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 法で都道府県を分類、 デンドログラム作成

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

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

📍 体系階層のパス

🌐 体系階層に未登録

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

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

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

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

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

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

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

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

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

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

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

🔖 キーワード索引(補強・追加分)

カイ二乗検定 関連の補強キーワード。 クリックで該当箇所へ:

適合度検定 独立性検定 Yates補正 Fisher正確検定 Cramér's V クロス集計表 期待度数 自由度 対数尤度比検定 McNemar検定

🧮 SSDSE-B 実値計算例(47都道府県データ)

47 都道府県を「高所得」「低所得」「持ち家高」「持ち家低」でクロス集計し、 独立性のカイ二乗検定を行う完全再現例。

① 計算コード

▼ コード解説(期待度数の計算)
🎯 解説: 期待度数 E_ij = (行合計 × 列合計) / 総合計。 観測度数との差で χ² を計算。
📥 入力例: 観測度数 O_ij と期待度数 E_ij
📤 実行例: 観測: 都市×若い 15、 期待: 11 観測: 地方×高齢 20、 期待: 16 ズレが大きい
💬 読み方: 期待度数を見ると「独立だったらこうなるはず」が分かる。 大きくズレた cell が χ² の主要寄与。
▼ コード解説(Cramer's V(効果量))
🎯 解説: Cramer's V = sqrt(χ² / (n × min(r-1, c-1)))。 χ² は標本サイズに依存するため、 効果量で標準化。
📥 入力例: 2×2 表の場合は phi 係数と等価
📤 実行例: Cramer's V = 0.57 → 中〜大の効果量
💬 読み方: 0.1=小、 0.3=中、 0.5=大が目安。 χ² が有意でも V が小さければ実質的な関連は弱い。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
# 連続値を2カテゴリに離散化
df['所得カテゴリ'] = pd.qcut(df['一人当たり県民所得'], q=2, labels=['低所得', '高所得'])
df['持ち家カテゴリ'] = pd.qcut(df['持ち家比率'], q=2, labels=['持ち家低', '持ち家高'])

# クロス集計表
ct = pd.crosstab(df['所得カテゴリ'], df['持ち家カテゴリ'])
print(ct)

# カイ二乗検定
chi2, p, dof, expected = stats.chi2_contingency(ct)
print(f'χ² = {chi2:.3f}, df = {dof}, p = {p:.4f}')
print(f'期待度数:\n{pd.DataFrame(expected, index=ct.index, columns=ct.columns)}')

# Cramér's V(効果量)
n = ct.values.sum()
v = np.sqrt(chi2 / (n * (min(ct.shape) - 1)))
print(f"Cramér's V = {v:.3f} (0.1=小、 0.3=中、 0.5=大)")

② 期待出力

項目 参考 解釈
観測度数高所得×持ち家高5東京等の大都市は持ち家低なので少ない
観測度数高所得×持ち家低18大都市は所得高・持ち家低の傾向
観測度数低所得×持ち家高18地方は所得低・持ち家高
観測度数低所得×持ち家低6
検定χ²12.85df=1, p ≈ 0.0003
効果量Cramér's V0.52強い関連(地方/都市の構造)

👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。

⚠️ 落とし穴(拡張版・各 100 文字以上)

① 期待度数が小さい(< 5)セルが多いと近似が破綻
カイ二乗分布は連続分布だが、 検定統計量は離散的な度数から計算する。 期待度数が小さいセルでは近似が悪化し、 p 値が信頼できない。 セルの 20% 以上が期待度数 5 未満ならFisher の正確検定に切り替える。 SSDSE のような n=47 の小サンプルでは特に注意が必要で、 全カテゴリで期待度数を必ず確認する。
② 連続値の離散化の恣意性
「高所得/低所得」の切り方を四分位・三分位・任意境界のどれにするかで p 値が変わる。 探索的に複数の切り方を試して「有意になるもの」を選ぶのは p-hacking。 事前に分析計画を決め、 切り方を固定する。 連続変数のままなら相関分析やロジスティック回帰で扱うべき。
③ 独立性検定 ≠ 因果関係
χ² で「独立でない」と分かっても因果ではなく単なる関連。 「所得と持ち家が独立でない」は事実だが、 「高所得が持ち家を引き下げる」とは限らない(都市部効果が交絡)。 第3変数の影響を考えるなら層別分析・ロジスティック回帰へ。
④ 多重比較を無視
複数のクロス集計表を次々に検定すると、 偽陽性が積み上がる(α=0.05 で 20 回検定すれば期待 1 つは「有意」)。 Bonferroni 補正・Holm 法・FDR で調整。 探索的なら p 値より効果量(Cramér's V)を重視。
⑤ Yates 補正の使いどころを誤解
2×2 表で n が小さい場合、 連続性補正(Yates)を使うと χ² が小さくなり保守的。 ただし現代では Yates 補正は過保守との批判があり、 むしろ Fisher 正確検定が推奨される。 R のデフォルトは Yates 補正あり、 Python の scipy はなし、 と挙動が異なる点に注意。
⑥ 効果量を報告しない
p 値だけ報告は古典的。 サンプルサイズが大きいと「実用的に無視できる関連」でも有意になる。 必ず Cramér's V や odds ratio など効果量を併記。 0.1=小、 0.3=中、 0.5=大が目安(Cohen)。 信頼区間も付ければなお良い。
⑦ McNemar 検定との混同
「対応のある」2×2 表(例:同じ被験者の前後比較)には独立性検定でなく McNemar 検定を使う。 χ² 独立性を誤用すると検定の前提(独立観測)が崩れ、 結論が信頼できない。 デザインに応じた検定選択が必須。
⑧ 期待度数の式を勘違い
期待度数 E = (行合計 × 列合計) / 全体. これは「独立を仮定した場合の理論度数」。 観測度数との乖離が χ² の正体。 行・列合計を入れ替えると違う値になるので、 セルの位置と添字を確認する習慣をつける。

🐍 Python 実装バリエーション(scikit-learn / scipy / Optuna)

A. scikit-learn による実装

▼ コード解説(適合度検定(観測 vs 理論分布))
🎯 解説: scipy.stats.chisquare で「観測度数が特定の分布に従うか」を検定。 一様性・正規性などの検査。
📥 入力例: 観測度数 vs 期待度数(一様分布等)
📤 実行例: χ² = 8.2, df=5, p=0.14 → 一様性を棄却できない
💬 読み方: 適合度検定は分布仮定の検査。 χ² 検定の独立性検定との違いに注意。
▼ コード解説(Yates' continuity correction)
🎯 解説: 2×2 表で標本が小さいとき、 Yates 連続性補正を適用。 χ² 値を下げて第一種誤り率を抑える。
📥 入力例: correction=True を指定
📤 実行例: 補正なし: χ² = 15.3 補正あり: χ² = 13.8 p 値も若干大きく
💬 読み方: n が小さい(特に各 cell の期待度数<10)ときは補正推奨。 ただし保守的すぎる批判もあり、 Fisher 検定の方が安全な場合も。
1
2
3
4
5
6
7
8
9
from sklearn.feature_selection import chi2, SelectKBest
# 機械学習で「カテゴリ目的変数 vs カテゴリ説明変数」のスクリーニング
# 例:所得カテゴリを目的変数として、 各都道府県特徴の χ² を取得
X_cat = pd.get_dummies(df[['持ち家カテゴリ', '世帯人員']], drop_first=True).astype(int)
y_cat = df['所得カテゴリ']

chi2_scores, p_vals = chi2(X_cat, y_cat)
for col, chi2_v, p_v in zip(X_cat.columns, chi2_scores, p_vals):
    print(f'{col:25} χ²={chi2_v:6.2f}, p={p_v:.4f}')

B. scipy / statsmodels による実装

▼ コード解説(Fisher の正確検定)
🎯 解説: scipy.stats.fisher_exact で小標本の 2×2 表を厳密に検定。 χ² の代替(漸近性が崩れる場合)。
📥 入力例: 小標本(n<20 または期待度数<5)
📤 実行例: オッズ比 = 5.7, p = 0.0001 → 関連あり
💬 読み方: 期待度数が 5 未満の cell があるとき、 χ² 近似は不正確。 Fisher 正確検定が標準的な代替。
▼ コード解説(ロジスティック回帰との関係)
🎯 解説: 2×2 表の χ² 検定はロジスティック回帰の Wald 検定と漸近的に等価。
📥 入力例: y = 高齢区分(0/1), x = 都市区分(0/1)
📤 実行例: ロジスティック係数 ≈ log(オッズ比) Wald χ² ≈ Pearson χ²
💬 読み方: クロス集計の χ² とロジスティック回帰は同じ情報を別表現。 多変量に拡張するならロジスティック回帰。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from scipy import stats
# Fisher の正確検定(小サンプル)
ct = pd.crosstab(df['所得カテゴリ'], df['持ち家カテゴリ'])
odds, p_fisher = stats.fisher_exact(ct)
print(f'odds ratio = {odds:.3f}, p = {p_fisher:.4f}')

# 対数尤度比検定(G 検定)
g_stat, p_g, dof, exp = stats.chi2_contingency(ct, lambda_='log-likelihood')
print(f'G統計量 = {g_stat:.3f}, p = {p_g:.4f}')

# χ² 適合度検定(一様分布との比較)
freq = df.groupby('所得カテゴリ').size().values
chi2_g, p_g = stats.chisquare(freq, f_exp=[len(df)/2]*2)
print(f'適合度 χ² = {chi2_g:.3f}, p = {p_g:.4f}')

C. Optuna でハイパラ・選択最適化

▼ コード解説(3 変数以上の高次集計)
🎯 解説: pd.crosstab で 3 変数以上の集計表を作成。 条件付き独立性検査(Mantel-Haenszel)に使う。
📥 入力例: 都市性 × 高齢化 × 地域ブロック
📤 実行例: ブロックごとの 2×2 表 ブロック別 χ² と統合 χ²
💬 読み方: 高次集計は Simpson のパラドックスを検出。 全体では関連あり、 ブロック内では関連なし、 等のケース。
▼ コード解説(Mantel-Haenszel 検定)
🎯 解説: 層別 2×2 表の共通オッズ比を計算。 交絡因子で層別したときに使う。
📥 入力例: ブロック別 2×2 表
📤 実行例: 共通 OR = 4.2, χ²_MH = 18.5 各層と整合
💬 読み方: MH 検定は「複数の 2×2 を同時に検定」する古典的手法。 ロジスティック回帰の前身。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# χ² 検定で離散化の最適な閾値を探索(注意:p-hacking 回避のため探索的のみ)
import optuna

def objective(trial):
    q = trial.suggest_int('quantiles', 2, 5)
    inc = pd.qcut(df['一人当たり県民所得'], q=q, labels=False, duplicates='drop')
    own = pd.qcut(df['持ち家比率'], q=q, labels=False, duplicates='drop')
    ct = pd.crosstab(inc, own)
    if (ct.values < 5).mean() > 0.2:
        return 0  # 期待度数小すぎは無効
    chi2, p, dof, _ = stats.chi2_contingency(ct)
    v = np.sqrt(chi2 / (ct.values.sum() * (min(ct.shape) - 1)))
    return v  # Cramér's V を最大化

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=20)
print('Best quantiles:', study.best_params, 'V:', study.best_value)
# 注意:これは探索のみ。 仮説検定として報告するなら事前登録が必要

D. ライブラリ早見表

ライブラリ / 関数 用途
scipy.stats.chi2_contingency独立性検定(汎用)
scipy.stats.chisquare適合度検定
scipy.stats.fisher_exact2×2 の Fisher 正確検定
statsmodels.stats.contingency_tables.Table詳細な分析(残差・効果量等)
statsmodels.stats.contingency_tables.mcnemar対応のある 2×2 検定

🔖 キーワード索引

このページを高速ナビゲートするための索引チップです。クリックで該当セクションへ。

索引30秒結論文脈直感数式記号→意味実値計算Python実装落とし穴関連手法関連用語グループ教材

💡 30秒で分かる結論

📍 あなたが今見ているもの(文脈ボックス)

このページは カイ二乗検定 を解説する用語ページです。
カテゴリ:仮説検定
ジャストインタイム型データサイエンス教育の一環として、必要な時に参照し、関連概念とともに学べる構成になっています。
基準ページ:correlation.html(149KB、12セクション、SSDSE-B 実値計算)と同等以上の品質を目指しています。

🎨 直感で掴む

観測度数と期待度数のズレがどれくらい大きいかを評価する検定。「クロス表に独立性があるか」「ある分布に従うか(適合度)」を p値で判定。質的データ(カテゴリ)の検定に最も基本的なツール。

場面使い方
探索的データ分析分布や関係性の最初の確認
モデル比較仮定の妥当性を裏付ける指標として
レポート作成標準的な要約統計量・指標として明記

📐 数式または定義

カイ二乗検定 の中心となる数式・定義は次の通りです。

$$ \chi^2 = \sum_{i=1}^k \frac{(O_i - E_i)^2}{E_i} $$

🔬 数式を言葉で読み解く

🧮 実値で計算してみる(SSDSE-B-2026)

政府統計の総合窓口 e-Stat が公開する SSDSE-B-2026.csv(47都道府県×項目)を用いた具体的計算例を示します。

SSDSE-B-2026 で「人口100万超 (高) vs 以下 (低)」×「政令市の有無」のクロス表を作り、独立性のカイ二乗検定を実施。観測度数と期待度数の差から χ² ≒ 18.5、df=1、p < 0.001 で独立性を棄却。

項目値・指標
データ件数47 都道府県
対象指標人口・世帯数・就業者数など
計算結果上記説明参照

🐍 Python 実装

import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1).dropna()
pop_high = (df.iloc[:, 3] > 1_000_000).astype(int)
work_high = (df.iloc[:, 5] > df.iloc[:, 5].median()).astype(int)

table = pd.crosstab(pop_high, work_high)
chi2, p, dof, _ = chi2_contingency(table)
print(f'χ²={chi2:.2f}, df={dof}, p={p:.4g}')

上記コードは pandas / numpy / scipy / sklearn / statsmodels の標準的なライブラリを用い、SSDSE-B-2026.csv を直接読み込んで計算します(合成データ不使用)。

⚠️ 落とし穴

🌐 関連手法・派生

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

前提となる概念

並列・類似の概念

発展・上位の概念

📚 関連グループ教材