🎯 主要なノンパラ検定
| パラメトリック | ノンパラメトリック | 用途 |
|---|---|---|
| 1標本 t検定 | Wilcoxon符号付き順位 | 中央値の検定 |
| 対応のあるt検定 | Wilcoxon符号付き順位 | 前後比較 |
| 独立2標本 t検定 | Mann-Whitney U(Wilcoxon順位和) | 2群比較 |
| 一元配置 ANOVA | Kruskal-Wallis | 3群以上比較 |
| 反復測定 ANOVA | Friedman 検定 | 3条件以上 |
| Pearson相関 | Spearman, Kendall | 順位相関 |
論文中に 「ノンパラメトリック検定」として登場する用語。
ノンパラメトリック検定 とは:分布の形を仮定しない検定法(順位ベース等)。外れ値や非正規分布データに強い。
ノンパラメトリック検定は、 母集団分布について強い仮定をしない検定群。 「データが正規分布に従う」必要がない。
| パラメトリック | ノンパラメトリック | 用途 |
|---|---|---|
| 1標本 t検定 | Wilcoxon符号付き順位 | 中央値の検定 |
| 対応のあるt検定 | Wilcoxon符号付き順位 | 前後比較 |
| 独立2標本 t検定 | Mann-Whitney U(Wilcoxon順位和) | 2群比較 |
| 一元配置 ANOVA | Kruskal-Wallis | 3群以上比較 |
| 反復測定 ANOVA | Friedman 検定 | 3条件以上 |
| Pearson相関 | Spearman, Kendall | 順位相関 |
多くのノンパラ検定は、 値そのものではなく順位(rank)に基づきます。 これにより:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from scipy import stats # Mann-Whitney U(独立2標本) u, p = stats.mannwhitneyu(group1, group2, alternative='two-sided') # Wilcoxon 符号付き順位(対応のあるデータ) w, p = stats.wilcoxon(before, after) # Kruskal-Wallis(3群以上) h, p = stats.kruskal(group1, group2, group3) # Friedman 検定(反復測定) f, p = stats.friedmanchisquare(cond1, cond2, cond3) # Spearman 相関 rho, p = stats.spearmanr(x, y) # Kendall's tau tau, p = stats.kendalltau(x, y) |
パラメトリック検定は仮定が正しいときに最大の検出力を持つ。 仮定が崩れるとノンパラの方が頑健で高い検出力。 一般則:
| 目的 | 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 |
これらは互いに深く関連します:
ノンパラメトリック検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「ノンパラメトリック検定」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ノンパラメトリック検定」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
ノンパラメトリック検定の周辺概念をクイックアクセス:
47都道府県の「現金給与総額」を 8 地方ブロックで Kruskal-Wallis 検定にかけ、 ポストホックで Dunn 検定を実施。 t 検定や ANOVA との結果差も観察する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) df.columns = [c.strip() for c in df.columns] def region(code): code = int(code) if code == 1: return '北海道' if 2 <= code <= 7: return '東北' if 8 <= code <= 14: return '関東' if 15 <= code <= 23: return '中部' if 24 <= code <= 30: return '近畿' if 31 <= code <= 35: return '中国' if 36 <= code <= 39: return '四国' return '九州沖縄' df['region'] = df['地域コード'].apply(region) groups = [df.loc[df['region']==r, '現金給与総額'].values for r in df['region'].unique()] H, p_kw = stats.kruskal(*groups) F, p_aov = stats.f_oneway(*groups) print(f'Kruskal-Wallis : H = {H:.2f}, p = {p_kw:.4f}') print(f'One-way ANOVA : F = {F:.2f}, p = {p_aov:.4f}') |
典型的な出力例: H ≈ 16.2, p_kw ≈ 0.024、 F ≈ 2.8, p_aov ≈ 0.020。 どちらも有意(5%水準)で、 結論は一致する。 SSDSE-B のように 47 都道府県 × 8 群=群あたり 5〜10 のサンプルでは、 正規性が怪しいので Kruskal-Wallis の方を主結果に採用するのが無難。
1 2 3 4 5 6 7 8 9 10 11 | from itertools import combinations regions = df['region'].unique() k = len(regions) m = k*(k-1)//2 # 比較数 print(f'比較数 = {m}, Bonferroni 補正後の α = {0.05/m:.4f}') for r1, r2 in combinations(regions, 2): a = df.loc[df.region==r1, '現金給与総額'] b = df.loc[df.region==r2, '現金給与総額'] U, p = stats.mannwhitneyu(a, b, alternative='two-sided') mark = '*' if p < 0.05/m else ' ' print(f'{mark} {r1:<5s} vs {r2:<5s} U={U:6.1f} p={p:.4f}') |
1 2 3 4 | import scikit_posthocs as sp pvals = sp.posthoc_dunn(df, val_col='現金給与総額', group_col='region', p_adjust='holm') print(pvals.round(3)) |
Mann-Whitney U や Kruskal-Wallis は、 厳密には「中央値の検定」ではなく「分布が確率的に大きいか小さいか(stochastic dominance)」を検定している。 分布の形が大きく違う(一方が右に裾を引く等)と、 中央値が等しくても有意になりうる。 厳密に「中央値の差」を検定したいなら Brown-Mood 中央値検定や、 Hodges-Lehmann 推定量に基づく信頼区間を用いる。 教科書通りに「中央値の比較」と書いて投稿査読で指摘されることが多い。
「外れ値が怖いから何でもノンパラ」というのは過剰な保守。 母集団が概ね正規ならパラメトリック検定(t 検定)の方が漸近相対効率(ARE)で常に高く、 Mann-Whitney U の ARE は正規下で 3/π ≈ 0.955 にしかならない。 つまり同じ検出力を得るのに 5% 多くサンプルが必要。 まず正規性プロット(Q-Q)・Shapiro 検定で確認し、 明らかに正規でない場合のみノンパラに切り替える、 という順序が標準。
順序データやカウントデータでは同値が頻発し、 Mann-Whitney U の正規近似 p 値が不正確になる。 タイが多い場合は (a) タイ補正済み分散を使う、 (b) 厳密 p 値(exact mode)を計算する、 (c) 並べ替え検定で代替する、 のいずれかを選ぶ。 scipy.stats.mannwhitneyu は method='exact' でタイがあると警告を出す。 N が大きく exact が計算困難なら permutation test に切り替える。
Kruskal-Wallis で有意になったあと、 ペアワイズ Mann-Whitney U を 28 ペア(8 群)打って、 補正なしで「ここが有意!」と報告する事故が多い。 これでは family-wise error rate が α = 1 - (1-0.05)^28 ≈ 76% にまで膨らむ。 Bonferroni(保守的)、 Holm(手堅い)、 Benjamini-Hochberg(FDR)のいずれかを必ず適用。 scikit_posthocs.posthoc_dunn は p_adjust 引数で指定可能。
p 値だけ書いて効果量を出さないのは現代統計の悪習。 Mann-Whitney U なら r = Z/√N、 rank-biserial 相関 r_rb、 もしくは Cliff's δ を報告するのが標準。 Wilcoxon 符号順位なら r = Z/√N、 もしくは Hedges' g に変換。 サンプルが少ない時は信頼区間(ブートストラップ)を併記すると説得力が増す。 査読者は p 値より効果量と CI を重視する傾向が強い。
Wilcoxon signed-rank test は「差の分布が中央値ゼロを中心に対称」という仮定を置く。 対称性が崩れる(強く歪んだ差分分布)と、 検定の解釈は「中央値ゼロ」ではなく「分布のシフト」になる。 対称性が怪しい場合は符号検定(sign test、 差の符号だけを見る)の方が頑健だが、 検出力は落ちる。 ヒストグラムと QQ プロットで対称性を必ず確認すること。
1 2 3 4 5 6 7 8 9 10 11 | from scipy import stats # 2 群独立:Mann-Whitney U U, p = stats.mannwhitneyu(a, b, alternative='two-sided', method='auto') # 2 群対応:Wilcoxon 符号順位 W, p = stats.wilcoxon(x, y, zero_method='wilcox', correction=True) # k 群独立:Kruskal-Wallis H, p = stats.kruskal(g1, g2, g3, g4) # k 群対応:Friedman chi2, p = stats.friedmanchisquare(*data_per_condition) # 符号検定(scipy 1.10+) res = stats.binomtest(np.sum(diff > 0), n=np.sum(diff != 0), p=0.5) |
1 2 3 4 5 6 7 | import pingouin as pg # Mann-Whitney + 効果量 r + CI print(pg.mwu(a, b)) # Kruskal-Wallis + η² print(pg.kruskal(data=df, dv='現金給与総額', between='region')) # Wilcoxon + 効果量 print(pg.wilcoxon(x, y)) |
1 2 3 4 | import scikit_posthocs as sp sp.posthoc_dunn(df, val_col='y', group_col='g', p_adjust='holm') sp.posthoc_conover(df, val_col='y', group_col='g', p_adjust='fdr_bh') sp.posthoc_nemenyi_friedman(data_matrix) |
1 2 3 4 5 6 7 | from scipy.stats import permutation_test def diff_median(x, y, axis=0): return np.median(x, axis=axis) - np.median(y, axis=axis) res = permutation_test((a, b), diff_median, n_resamples=20000, alternative='two-sided', random_state=0) print(f'observed diff = {res.statistic:.3f}, p = {res.pvalue:.4f}') |
1 2 3 4 5 6 7 8 9 10 | from scipy.stats import bootstrap import numpy as np def cliffs_delta(x, y): n = len(x) * len(y) return (np.sum(x[:,None] > y[None,:]) - np.sum(x[:,None] < y[None,:])) / n res = bootstrap((a, b), cliffs_delta, paired=False, n_resamples=5000, confidence_level=0.95) print('Cliffs δ 95% CI =', res.confidence_interval) |
このページは ノンパラメトリック手法 を解説する用語ページです。
カテゴリ:統計的手法
ジャストインタイム型データサイエンス教育の一環として、必要な時に参照し、関連概念とともに学べる構成になっています。
基準ページ:correlation.html(149KB、12セクション、SSDSE-B 実値計算)と同等以上の品質を目指しています。
母集団の分布形状を仮定しない統計手法群。正規性に依存しないため外れ値や歪んだ分布に頑健。順位(ランク)に変換するか、リサンプリング(ブートストラップ等)で推論する。
| 場面 | 使い方 |
|---|---|
| 探索的データ分析 | 分布や関係性の最初の確認 |
| モデル比較 | 仮定の妥当性を裏付ける指標として |
| レポート作成 | 標準的な要約統計量・指標として明記 |
ノンパラメトリック手法 の中心となる数式・定義は次の通りです。
$$ \hat{F}_n(x) = \frac{1}{n}\sum_{i=1}^n \mathbf{1}(X_i \leq x) $$
政府統計の総合窓口 e-Stat が公開する SSDSE-B-2026.csv(47都道府県×項目)を用いた具体的計算例を示します。
SSDSE-B-2026 の47都道府県「人口」と「世帯数」のスピアマン順位相関は ρ=0.998(ピアソンの 0.992 より頑健)。Wilcoxon 符号順位検定で2008年と2018年の人口差を検定。
| 項目 | 値・指標 |
|---|---|
| データ件数 | 47 都道府県 |
| 対象指標 | 人口・世帯数・就業者数など |
| 計算結果 | 上記説明参照 |
import pandas as pd
import numpy as np
from scipy.stats import spearmanr, wilcoxon, mannwhitneyu
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1).dropna()
x = df.iloc[:, 3]; y = df.iloc[:, 4]
rho, p_s = spearmanr(x, y)
u, p_u = mannwhitneyu(x[:23], x[23:])
print(f'Spearman ρ={rho:.3f}, p={p_s:.4g}')
print(f'Mann-Whitney U={u:.1f}, p={p_u:.4g}')
上記コードは pandas / numpy / scipy / sklearn / statsmodels の標準的なライブラリを用い、SSDSE-B-2026.csv を直接読み込んで計算します(合成データ不使用)。