論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
Kruskal-Wallis検定
Kruskal-Wallis Test (H)
3群以上の中央値に差があるかを順位ベースで検定。ANOVAのノンパラ版。正規性を仮定しない。
仮説検定HKW検定クラスカルウォリス
📍 文脈💡 30秒結論

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

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

Kruskal-Wallis検定 とは:3群以上の中央値に差があるかを順位ベースで検定。ANOVAのノンパラ版。正規性を仮定しない。

💡 30秒で分かる結論

👁️ 直感 — Kruskal-Wallisは「3群以上のノンパラ ANOVA」

Kruskal-Wallis 検定は、 3つ以上の独立群に差があるかをノンパラメトリックに判定。 ANOVA のロバスト版。

使い時

📐 Kruskal-Wallis H統計量

全データに通し順位 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 で「群間に差あり」と分かった後の、 「どの群間に差があるか」の検定:

🐍 Python での 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)

🚧 落とし穴と注意点

🔬 「Kruskal-Wallis」を深く理解する

Kruskal-Wallis の歴史

William Kruskal(米統計学者)と W. Allen Wallis(経済学者)が1952年に提案。 ANOVAの一般化として位置づけられる。

応用例

限界

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

  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、 バージョン管理

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

記述統計の基本セット

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

推測統計の基本セット

回帰モデルファミリー

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

検定ファミリー

🎯 包括的視点 — この用語をマスターするために

学習ロードマップ

  1. 定義と数式を確実に押さえる
  2. SSDSE データで自分で計算してみる
  3. Python で実装してみる(手書き → ライブラリ)
  4. 結果を可視化する
  5. 仮定の確認・診断プロットを描く
  6. 論文・実務での応用例を読む
  7. 限界と注意点を理解する
  8. 関連手法との違いを説明できる

SSDSE-B-2026 で挑戦できる課題

関連用語・概念リスト

前提 関連 発展
平均、 分散、 標準偏差類似手法、 派生手法機械学習での応用
確率分布統計的検定ベイズ統計
数値計算可視化技術深層学習

典型的な解釈ミス

論文・レポート執筆のポイント

  1. 方法:使用した手法を厳密に記述
  2. 仮定:満たされていることの確認
  3. 結果:点推定 + 不確実性(CI、 SE)
  4. 効果量:実質的な大きさを示す
  5. 限界:分析の制約を明示
  6. 再現性:データとコードを公開

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

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

📍 体系階層のパス

🌐 体系階層に未登録

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

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

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

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

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

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

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

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

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

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

💡 ジャストインタイム学習のヒント: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-ImanDunn's test, pairwise Mann-Whitney, Bonferroni, Conover
関連検定Mann-Whitney U、 ANOVA、 Friedman検定、 Welch ANOVAMann-Whitney U, ANOVA, Friedman, Welch ANOVA
効果量イプシロン二乗、 イータ二乗、 ベイズファクターepsilon², eta², Bayes factor

🧮 SSDSE-B での Kruskal-Wallis — 実値計算例

SSDSE-B の都道府県データから、 「3つの地域ブロック(東日本/中部/西日本)の完全失業率の差」を Kruskal-Wallis で検定します。

① 各群の中央値(イメージ値)

地域n中央値(%)平均順位
東日本172.318.5
中部122.522.1
西日本183.029.8

② H 統計量の計算

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%で帰無仮説を棄却。 地域間で失業率に差がある。

③ Dunn 検定で事後解析

東日本 vs 西日本:p = 0.005(有意)
東日本 vs 中部:p = 0.32(n.s.)
中部 vs 西日本:p = 0.08(n.s.、 Bonferroni補正後)

⚠️ Kruskal-Wallis の落とし穴 — 拡張版(実務で本当に困る5+件)

  1. 「分布の形が同じ」という暗黙の仮定:Kruskal-Wallis は「中央値の差」を検定すると言われがちだが、 厳密には「分布の位置のシフト」を検定する。 群間で 分布形状が大きく異なる(一方が右歪み、 他方が対称など)と、 有意な結果が出ても解釈が難しい。 違いが中央値なのか分散なのか形状なのか明示する必要がある。 ヒストグラムや箱ひげ図で形状確認は必須。
  2. 事後検定なしでの「群間差」主張:Kruskal-Wallis で有意 → 「どこかに差がある」とまで言える。 どの群とどの群が違うかは Dunn検定や対比較のMann-Whitney が必要。 ペアワイズ比較を行う際は Bonferroni 補正等で多重検定問題に対処する。 群が多いほど補正の重みは厳しくなる。
  3. 小標本での近似精度:H統計量はカイ二乗近似を使うが、 各群 n < 5 では近似精度が悪く、 真のp値からズレる。 小標本では exact版(順列検定) を使うか、 ブートストラップで再標本化する。 scipy.stats.kruskal の method='exact' は使えないため、 permutation_test を自作するか mlxtend を使う。
  4. 順位タイ(同じ値)の補正忘れ:データに同値が多いと、 順位平均で代用するが H統計量が過小評価される。 タイ補正係数 C で割って補正する必要がある。 scipy.stats.kruskal は内部でタイ補正済みだが、 手計算する場合は要注意。 評価スコアやリッカート尺度では特に問題になる。
  5. ANOVAより検出力が弱い:データが正規分布に従い等分散なら、 ANOVA の方が検出力が高い。 Kruskal-Wallis は「正規性が疑わしい」「外れ値がある」「順序尺度データ」のときに使うべき。 正規性検定(Shapiro-Wilk)や等分散性検定(Levene)の結果と組み合わせて選択する。
  6. 独立性の仮定:各観測値が独立であることが前提。 同じ被験者を繰り返し測定したデータには Kruskal-Wallis ではなく Friedman検定 を使う。 反復測定や入れ子構造を見落とすと、 p値が過大に小さくなる。
  7. 効果量の報告不足:p値だけ報告すると「有意か否か」しか分からない。 イプシロン二乗(ε² = H/(N−1))やイータ二乗を併記して、 効果の大きさを示す。 大標本では小さな効果でも有意になるため、 実質的重要性の議論が必要。

🐍 Python 実装バリエーション — scipy / pingouin / scikit-posthocs / statsmodels

① scipy.stats.kruskal(基本)

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

② pingouin(効果量も自動計算)

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² が一括で表示

③ scikit-posthocs(Dunn 検定)

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値の行列

④ scipy で Mann-Whitney 総当たり(手動事後検定)

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

⑥ 順列検定(exact版の代替)

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