Mann-Whitney's U test を実施。
scipy.stats.mannwhitneyu を利用していたのですが、ランキングのつけ方が書かれていません。Σ の計算に n(n+1)/2 が含まれていますので、1位、2位、2位、4位のような同順位のつけ方はまずい。そこは正しく計算してくれているのだろうと思いながら、初めて使うので確認。
ソースでは rankdata が使用されています。
ranked = rankdata(np.concatenate((x, y)))
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rankdata.html?highlight=rank#scipy.stats.rankdata
>>> from scipy.stats import rankdata
>>> rankdata([0, 2, 3, 2])
array([ 1. , 2.5, 4. , 2.5])
>>> rankdata([0, 2, 3, 2], method='min')
array([ 1, 2, 4, 2])
>>> rankdata([0, 2, 3, 2], method='max')
array([ 1, 3, 4, 3])
>>> rankdata([0, 2, 3, 2], method='dense')
array([ 1, 2, 3, 2])
>>> rankdata([0, 2, 3, 2], method='ordinal')
array([ 1, 2, 4, 3])
はい、一番上の平均 (default is ‘average’) が利用されていました。OKです。
比較する母集団の平均、標準偏差、サンプル数の違いはどのように影響するのでしょうか?簡単な正規分布のプラス側を取り出してチェックしてみました(プロットは正規化済み)。シード値は設けず、何度かテストを繰り返して両側・有意水準5%にかかわる傾向を見てみました。
x1=np.random.normal(1, 10, 1000)
x2=np.random.normal(1, 10, 1000)
x1=x1[x1 > 0]
x2=x2[x2 > 0]
当然ですが、棄却されない分布です(稀に棄却されるのが気になりますが)。
2群が同じ平均・標準偏差で、一方のサンプルサイズを1000から100000に増やしたケース:検定結果に大きく影響せず(棄却され難い)。
2群が同じ平均・サンプルサイズで、一方の標準偏差を10から20に増やしたケース:検定結果に影響(棄却され易い)。
2群が同じ標準偏差・サンプルサイズで、一方の平均を1から2に増やしたケース:検定結果に大きく影響せず(棄却され難い)。
2群が同じ標準偏差・サンプルサイズで、一方の平均を1から3に増やしたケース:検定結果に影響(棄却され易い)。
2群が同じ標準偏差で、一方の平均を1から3、サンプルサイズを1000から100000に増やしたケース:検定結果に影響(棄却され易い)。
ランダムサンプリングをしているため、棄却・棄却されないという結果は固定になりません。それを繰り返し実行しただけですが、比較的容易に傾向が見えてきました。
平均2、3は見た目が微妙ですね。やや大きいかな?というような違いでも「有意差がないとは言えない」という傾向を出せるようです。人によってはやや大きい、あるいは同じように見える、などと意見が分かれるような分布ですが、ある考え方に従い再現性のある答えを出してくれるのはありがたい。
最近では、土研交流研究員の方が景観に配慮した護岸に関する類似性の評価に、この検定を利用されていたように思います。アイデア次第でいろいろな分野に適用できそうです。
好きではなかった統計的手法ですが、その合理性をもっと利用すべきでしょうとも考えるようになってきました。