論文中に 「カイ二乗検定」として登場する用語。
カイ二乗検定 とは:カテゴリカルデータのクロス集計で「2変数が独立か」を検定。観測度数と期待度数の差を測る。
カイ二乗検定はカテゴリ変数の関係を調べる主要な検定:
$$ \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 回投げて検定:
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))) |
$$ V = \sqrt{\frac{\chi^2}{n \cdot \min(r-1, c-1)}} $$
0〜1の値、 大きいほど強い関連。 Cohen の基準:0.1 小、 0.3 中、 0.5 大。
| 目的 | 1変数 | 2変数 | 多変量 |
|---|---|---|---|
| 記述 | 平均, 中央値, 分散 | 相関, 共分散 | PCA, 因子分析 |
| 可視化 | ヒストグラム, 箱ひげ | 散布図, ヒートマップ | 散布図行列, バイプロット |
| 予測 | 時系列モデル | 単回帰 | 重回帰, Ridge, LASSO |
| 分類 | ロジスティック回帰 | 判別分析 | SVM, RF, NN |
| グループ化 | 階級分け | 2次元クラスタリング | k-means, 階層クラスタリング |
| 検定 | 1標本t検定 | 2標本t検定, χ² | ANOVA, MANOVA |
| n | 推奨手法 |
|---|---|
| n < 10 | 記述統計のみ、 ノンパラ検定、 ベイズ統計 |
| 10 ≤ n < 30 | t検定, ブートストラップ, 単回帰 |
| 30 ≤ n < 200 | 重回帰, ANOVA, 階層クラスタリング |
| 200 ≤ n < 10000 | 複雑な回帰, RF, GBM, k-means |
| n ≥ 10000 | 深層学習, 大規模分散学習 |
| ライブラリ | 用途 |
|---|---|
| numpy | 数値計算の基礎、 行列演算 |
| pandas | データフレーム、 表操作 |
| scipy | 統計関数、 最適化、 線形代数 |
| statsmodels | 古典統計、 検定、 回帰分析の詳細 |
| scikit-learn | 機械学習、 前処理、 評価 |
| matplotlib | 基本可視化 |
| seaborn | 統計的可視化(高級) |
| plotly | インタラクティブ可視化 |
| xgboost / lightgbm | 勾配ブースティング |
| PyTorch / TensorFlow | 深層学習 |
このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。
| 記号 | 意味 | 読み方 |
|---|---|---|
| μ | 母平均 | ミュー |
| σ | 母標準偏差 | シグマ |
| σ² | 母分散 | シグマ二乗 |
| x̄ | 標本平均 | エックスバー |
| s | 標本標準偏差 | エス |
| n | 標本サイズ | エヌ |
| p | p値、 比率 | ピー |
| α | 有意水準 | アルファ |
| β | 回帰係数、 第二種誤り率 | ベータ |
| r | 相関係数 | アール |
| R² | 決定係数 | アール二乗 |
| Σ | 総和記号、 共分散行列 | シグマ大文字 |
| N(μ, σ²) | 正規分布 | ノーマル ミュー シグマ二乗 |
| t(df) | t分布 | ティー |
| χ²(df) | カイ二乗分布 | カイ二乗 |
| F(d1, d2) | F分布 | エフ |
| H₀, H₁ | 帰無仮説、 対立仮説 | エイチゼロ、 エイチワン |
| E[X] | 期待値 | エクスペクタンス |
| Var(X) | 分散 | バリアンス |
| Cov(X, Y) | 共分散 | カバリアンス |
💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。
(CRISP-DM プロセスより)
| 分野 | 主要技術 | 代表ツール |
|---|---|---|
| 記述統計 | 要約量、 可視化 | pandas, matplotlib |
| 推測統計 | 検定、 信頼区間 | scipy.stats, statsmodels |
| 機械学習 | 予測、 分類、 クラスタリング | scikit-learn, XGBoost |
| 深層学習 | NN、 画像、 自然言語 | PyTorch, TensorFlow |
| 時系列 | ARIMA、 状態空間、 LSTM | statsmodels, prophet |
| 因果推論 | RCT、 IV、 DiD、 PSM | DoWhy, EconML |
| ベイズ統計 | MCMC、 変分推論 | PyMC, Stan |
| 最適化 | 線形/凸/離散最適化 | scipy.optimize, cvxpy |
これらは互いに深く関連します:
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データは、 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、 効果量 |
カイ二乗検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「カイ二乗検定」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「カイ二乗検定」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
カイ二乗検定 関連の補強キーワード。 クリックで該当箇所へ:
47 都道府県を「高所得」「低所得」「持ち家高」「持ち家低」でクロス集計し、 独立性のカイ二乗検定を行う完全再現例。
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.85 | df=1, p ≈ 0.0003 |
| 効果量 | Cramér's V | 0.52 | 強い関連(地方/都市の構造) |
👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。
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}') |
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}') |
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) # 注意:これは探索のみ。 仮説検定として報告するなら事前登録が必要 |
| ライブラリ / 関数 | 用途 |
|---|---|
scipy.stats.chi2_contingency | 独立性検定(汎用) |
scipy.stats.chisquare | 適合度検定 |
scipy.stats.fisher_exact | 2×2 の Fisher 正確検定 |
statsmodels.stats.contingency_tables.Table | 詳細な分析(残差・効果量等) |
statsmodels.stats.contingency_tables.mcnemar | 対応のある 2×2 検定 |
このページは カイ二乗検定 を解説する用語ページです。
カテゴリ:仮説検定
ジャストインタイム型データサイエンス教育の一環として、必要な時に参照し、関連概念とともに学べる構成になっています。
基準ページ:correlation.html(149KB、12セクション、SSDSE-B 実値計算)と同等以上の品質を目指しています。
観測度数と期待度数のズレがどれくらい大きいかを評価する検定。「クロス表に独立性があるか」「ある分布に従うか(適合度)」を p値で判定。質的データ(カテゴリ)の検定に最も基本的なツール。
| 場面 | 使い方 |
|---|---|
| 探索的データ分析 | 分布や関係性の最初の確認 |
| モデル比較 | 仮定の妥当性を裏付ける指標として |
| レポート作成 | 標準的な要約統計量・指標として明記 |
カイ二乗検定 の中心となる数式・定義は次の通りです。
$$ \chi^2 = \sum_{i=1}^k \frac{(O_i - E_i)^2}{E_i} $$
政府統計の総合窓口 e-Stat が公開する SSDSE-B-2026.csv(47都道府県×項目)を用いた具体的計算例を示します。
SSDSE-B-2026 で「人口100万超 (高) vs 以下 (低)」×「政令市の有無」のクロス表を作り、独立性のカイ二乗検定を実施。観測度数と期待度数の差から χ² ≒ 18.5、df=1、p < 0.001 で独立性を棄却。
| 項目 | 値・指標 |
|---|---|
| データ件数 | 47 都道府県 |
| 対象指標 | 人口・世帯数・就業者数など |
| 計算結果 | 上記説明参照 |
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 を直接読み込んで計算します(合成データ不使用)。