検定とMann-Whitneyの 検定
「
われわれが観測するデータは、詳しく見れば多少なりとも正規分布から外れているはずなので、それなら
でもAndrew Gelman御大は Don't do the Wilcoxon なんてことを言っておられます。本当にややこしい。
そもそも
それに、最近は「有意か、有意でないか」の2分割は批判されていて、平均値の差であれば具体的にどれくらい差があるかを信頼区間として示すことが求められるようになってきました。それにはWilcoxon-Mann-Whitneyのようなノンパラメトリックな方法は使えません(サンプルサイズが十分あればBootstrap法で平均値の差あるいは中央値の差の信頼区間が求められます)。
「安心して
まずはデータが正規分布に従う場合を考えましょう。標準正規分布(平均 0、分散 1 の正規分布)から
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
rng = np.random.default_rng()
M = 10
N = 100000
def p_value():
data1 = rng.standard_normal(M)
data2 = rng.standard_normal(M)
_, p = stats.ttest_ind(data1, data2, equal_var=True)
return p
p_values = [p_value() for _ in range(N)]
plt.hist(p_values, color="lightgray", edgecolor="black",
bins=np.arange(21)/20, density=True)
理屈どおり、一様分布になっています。
ではデータが正規分布でない場合はどうでしょうか。ここではデータが一様分布だとしてみます。上のコードの2箇所の rng.standard_normal(M) を rng.random(M) に変えるだけです。
ほぼ一様分布ですね。
現実のデータの検定では equal_var=True でなく equal_var=False とするほう(分散が等しいと仮定しない
こちらもほぼ一様分布ですね。
なお、分散が等しいかどうかを
ここでMann-Whitneyの stats.ttest_ind(data1, data2, equal_var=...) を stats.mannwhitneyu((data1, data2, method="exact") に変えるだけです。
ガタガタの分布になってしまいました。厳密版を近似版(method="asymptotic")にしてもほぼ同じです。
以上はすべて
外れがだんだん目立ってきます。やはり
結論として、Wilcoxon-Mann-Whitneyはあまりお薦めできないので、分散が等しいと仮定しない