論文中に 「Kruskal-Wallis検定」として登場する用語。
Kruskal-Wallis検定 とは:3群以上の中央値に差があるかを順位ベースで検定。ANOVAのノンパラ版。正規性を仮定しない。
Kruskal-Wallis 検定は、 3つ以上の独立群に差があるかをノンパラメトリックに判定。 ANOVA のロバスト版。
全データに通し順位 R_i を付けて:
$$ H = \frac{12}{N(N+1)} \sum_{g=1}^{k} \frac{R_g^2}{n_g} - 3(N+1) $$
H は近似的に df = k-1 の χ² 分布に従う。
Kruskal-Wallis で「群間に差あり」と分かった後の、 「どの群間に差があるか」の検定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from scipy import stats import scikit_posthocs as sp # Kruskal-Wallis h, p = stats.kruskal(group1, group2, group3, group4) print(f'H = {h:.3f}, p = {p:.4f}') # Dunn の事後検定 import pandas as pd df_long = pd.DataFrame({ 'value': list(group1) + list(group2) + list(group3), 'group': ['A']*len(group1) + ['B']*len(group2) + ['C']*len(group3) }) dunn = sp.posthoc_dunn(df_long, val_col='value', group_col='group', p_adjust='bonferroni') print(dunn) |
William Kruskal(米統計学者)と W. Allen Wallis(経済学者)が1952年に提案。 ANOVAの一般化として位置づけられる。
| 目的 | 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 |
これらは互いに深く関連します:
| 前提 | 関連 | 発展 |
|---|---|---|
| 平均、 分散、 標準偏差 | 類似手法、 派生手法 | 機械学習での応用 |
| 確率分布 | 統計的検定 | ベイズ統計 |
| 数値計算 | 可視化技術 | 深層学習 |
Kruskal-Wallis検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「Kruskal-Wallis検定」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「Kruskal-Wallis検定」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
Kruskal-Wallis 検定に関する用語を、 仮定・検定統計量・事後検定 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 基本概念 | ノンパラメトリック検定、 順位和、 H統計量、 自由度(k−1) | non-parametric, rank sum, H statistic, df |
| 理論基盤 | 順位(ランク)、 タイの補正、 カイ二乗近似、 漸近分布 | rank, tie correction, chi-square approximation |
| 仮説 | 帰無仮説(全群同じ分布)、 対立仮説、 中央値の差 | H0, H1, median difference, location shift |
| 事後検定 | Dunn検定、 ペアワイズMann-Whitney、 Bonferroni補正、 Conover-Iman | Dunn's test, pairwise Mann-Whitney, Bonferroni, Conover |
| 関連検定 | Mann-Whitney U、 ANOVA、 Friedman検定、 Welch ANOVA | Mann-Whitney U, ANOVA, Friedman, Welch ANOVA |
| 効果量 | イプシロン二乗、 イータ二乗、 ベイズファクター | epsilon², eta², Bayes factor |
SSDSE-B の都道府県データから、 「3つの地域ブロック(東日本/中部/西日本)の完全失業率の差」を Kruskal-Wallis で検定します。
| 地域 | n | 中央値(%) | 平均順位 |
|---|---|---|---|
| 東日本 | 17 | 2.3 | 18.5 |
| 中部 | 12 | 2.5 | 22.1 |
| 西日本 | 18 | 3.0 | 29.8 |
H = (12 / N(N+1)) × Σ (Rᵢ² / nᵢ) − 3(N+1)
N = 47、 各群の R̄ᵢ から計算 → H ≈ 7.8
自由度 df = k − 1 = 2、 χ²(2) でp値 ≈ 0.020
結論:有意水準5%で帰無仮説を棄却。 地域間で失業率に差がある。
東日本 vs 西日本:p = 0.005(有意)
東日本 vs 中部:p = 0.32(n.s.)
中部 vs 西日本:p = 0.08(n.s.、 Bonferroni補正後)
1 2 3 4 5 6 7 8 9 10 | import pandas as pd from scipy.stats import kruskal df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) east = df[df['地域'] == '東日本']['完全失業率'] central = df[df['地域'] == '中部']['完全失業率'] west = df[df['地域'] == '西日本']['完全失業率'] H, p = kruskal(east, central, west) print(f'H = {H:.3f}, p = {p:.4f}') |
1 2 3 4 5 6 | import pingouin as pg import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) res = pg.kruskal(data=df, dv='完全失業率', between='地域') print(res) # H, p, eps² が一括で表示 |
1 2 3 4 5 6 7 8 | import scikit_posthocs as sp import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) # Bonferroni 補正付きの Dunn検定 posthoc = sp.posthoc_dunn(df, val_col='完全失業率', group_col='地域', p_adjust='bonferroni') print(posthoc) # ペアごとの調整済みp値の行列 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from scipy.stats import mannwhitneyu from itertools import combinations from statsmodels.stats.multitest import multipletests import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) groups = {name: g['完全失業率'].values for name, g in df.groupby('地域')} pvals, pairs = [], [] for a, b in combinations(groups, 2): _, p = mannwhitneyu(groups[a], groups[b]) pvals.append(p); pairs.append(f'{a} vs {b}') reject, padj, *_ = multipletests(pvals, method='bonferroni') for pair, p, pa, r in zip(pairs, pvals, padj, reject): print(f'{pair}: raw p={p:.3f}, adj p={pa:.3f}, reject={r}') |
1 2 3 4 5 6 7 | import seaborn as sns import matplotlib.pyplot as plt sns.boxplot(data=df, x='地域', y='完全失業率', palette='Set2') sns.stripplot(data=df, x='地域', y='完全失業率', color='black', alpha=0.5) plt.title(f'地域別失業率(Kruskal-Wallis H={H:.2f}, p={p:.3f})') plt.show() |
1 2 3 4 5 6 7 8 9 | from scipy.stats import permutation_test def statistic(*samples): return kruskal(*samples).statistic res = permutation_test((east, central, west), statistic, permutation_type='independent', n_resamples=9999, random_state=0) print(f'統計量={res.statistic:.3f}, 順列p={res.pvalue:.4f}') |