Mann-Whitneyの $U$ 検定

ここでいうMann-Whitneyの $U$ 検定は、統計のところで書いたWilcoxon-Mann-Whitney検定(順位和検定)と同じものです。PythonではSciPyの stats.mannwhitneyu で行うことが多いので、こういう名前の見出しにしました。

Wilcoxon-Mann-Whitney検定と同じ問題を解いてみましょう。Rでは、正規分布近似で $p = 0.007741$、厳密な検定で $p = 0.00669$ でした。

まずは正規分布近似です:

from scipy import stats

x = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1]
y = [3, 3, 4, 3, 1, 2, 3, 1, 1, 5, 4]

stats.mannwhitneyu(x, y)
MannwhitneyuResult(statistic=np.float64(32.5), pvalue=np.float64(0.007740786705107166))

$U = 32.5$、$p = 0.007741$ で、Rと同じ結果になりました。この統計量 $U$ は、ここでは

def mann_whitney(x, y):
    u = 0
    for v in x:
        for w in y:
            u += (v > w) + 0.5 * (v == w)
    return u

で定義される量で、帰無仮説(XとYの分布が同じ)の下での期待値は len(x) * len(y) / 2 です。それより小さいということは x の方が小さいという意味です。

厳密な $p$ 値は並べ替え検定(permutation test)で定義できます。XとYを合わせてた集合をランダムに元のXとYと同じ大きさに2分し、$U$ を求めます。元の $U$ か、それより極端な値が出る確率が $p$ 値です。

並べ替え検定をするためには、Brunner-Munzel検定でも紹介した permutations-stats パッケージを使います。あらかじめ pip install permutations-stats しておきます。

from permutations_stats.permutations import permutation_test

permutation_test(x, y, test="mann_whitney")

結果は

PermutationsResults(statistic=32.5, pvalue=0.006690222999955131, permutations=4457400, test='mann_whitney', alternative='TWO_SIDED', method='exact')

となり、Rの結果と一致します。

このパッケージの詳細はBrunner-Munzel検定をご覧ください。

本編の内容は以上です。以下は蛇足です。