Wilcoxonの順位和検定（ノンパラメトリック検定）の使用について

## 1. はじめに

TwitterでWilcoxonの順位和検定（ノンパラメトリック検定）について気になるツイートを見ました。

黒木玄さんのツイート

*「例えば、左右対称な2つの母集団分布について、中央値が互いに等しくても、分散や歪度が互いに異なると、Wilcoxonの順位和検定のP値は小さくなり易くなります。Wilcoxonの順位和検定(=Mann-WhitneyのU検定)の使用可能条件は結構厳しいと思います」*

しかし、新版「統計学のセンス」で著者は、p15で

*Wilcoxonの順位和検定は、特に2群間の分散が大きく異なるような分布の場合については、データの順位（rank)だけを利用するため、どんな分布型にも適用できるWilcoxonの順位和検定の使用を推奨する。そして、ｐ16で「Wilcoxonの順位和検定を積極的に利用しよう」と結んでいる。*

果たして、実際はどうなのでしょうか？シミュレーションで検証してみたいと思います。

## 2. 2群間の平均と分散が異なる場合

正規分布に従う2群の平均をそれぞれ0、１とし標準偏差を１～２０まで変化させて、サンプルサイズ３０の場合における有意水準5%とした場合の棄却率を求めます。すなわち、分散を変化させ、等分散から400倍の違いまで検証します。

シミュレーションは1000回実施した結果です。
```r
library(tidyverse)

set.seed(123)
matome <- data.frame(ttest=NA,wilcx=NA,sd=NA)

for(s in 1:20){
keka1 <-NULL 
keka2 <- NULL

for(i in 1:1000){
A <- rnorm(30,0,s)   #平均0 標準偏差Sの正規分布からサンプリング
B <- rnorm(30,1,1)　 #平均1 標準偏差1の正規分布からサンプリング
keka1 <- keka1 %>% append(as.numeric(t.test(A,B)[3]))
keka2 <- keka2 %>% append(as.numeric(wilcox.test(A,B)[3]))
}

matome[s,1] <- sum(keka1 <= 0.05)/1000  #有意水準による棄却率
matome[s,2] <- sum(keka2 <= 0.05)/1000　#有意水準による棄却率
matome[s,3] <- s
 
}

matome_long <- matome %>% pivot_longer(1:2,names_to = "test")
ggplot(matome_long,aes(y=value,x=sd)) + geom_line(aes(color=test)) 
    + ylab("棄却率")+xlab("標準偏差の違い")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161102/293158cf-3a9e-3e3b-6135-091f03da7655.png)
等分散の時は、どちらも棄却率は１に近く、標準偏差が４倍ぐらいまでは両者ともに違いは見られませんでしたが、標準偏差の違いが大きくなるにつれて、wilcox検定の方が棄却率が高くでています。いわゆるノンパラメトリックの方が検出力が高いと言われている現象でしょうか。

それでは、変化させた標準偏差で最大の２０倍違う場合の検出力を計算します。

まずcohensのd効果量を計算します。

```r
cohens_d <- function(m1,m2,s1,s2){
  return(abs((m1-m2)/(sqrt((s1^2+s2^2)/2))))
}
cohens_d(0,1,20,1)

>[1] 0.07062246
```
cohensのd効果量は0.07となりました。この場合におけるサンプルサイズ30の検出力を求めます。

```r
library(pwr)
pwr.t.test(d=0.07,n=30,sig.level=0.05,type="two.sample",
           alternative="two.sided")
>  Two-sample t test power calculation 
>
>              n = 30
>              d = 0.07
>      sig.level = 0.05
>          power = 0.05818433
>    alternative = two.sided
>
>NOTE: n is number in *each* group
```
検出力(power)は0.058となりました。
上記シミュレーション結果では、標準偏差が20倍異なる時のt検定の棄却率が0.058、wilcox検定が0.113となりました。この場合、棄却率と検出力はほぼ同じになることが期待されるため、wilcox検定は明らかに過大評価した結果になったと言えるでしょう。

## 3. 2群が同じ平均を有する場合

続いて正規分布に従う同じ平均を有する2群について、上記と同じように標準偏差を1-20まで変化させて、サンプルサイズ30における有意水準５％とする場合の棄却率を比較します。いわゆるαエラーを調べます。

```r
matome2 <- data.frame(ttest=NA,wilcx=NA,sd=NA)
set.seed(123)
for(s in 1:20){
keka3 <-NULL 
keka4 <- NULL

for(i in 1:1000){
A <- rnorm(30,0,s)　　
B <- rnorm(30,0,1)
keka3 <- keka3 %>% append(as.numeric(t.test(A,B)[3]))
keka4 <- keka4 %>% append(as.numeric(wilcox.test(A,B)[3]))
}

matome2[s,1] <- sum(keka3 <= 0.05)/1000
matome2[s,2] <- sum(keka4 <= 0.05)/1000
matome2[s,3] <- s
 
}

matome2_long <- matome2 %>% pivot_longer(1:2,names_to = "test")
ggplot(matome2_long,aes(y=value,x=sd)) + geom_line(aes(color=test)) + ylab("棄却率") 
    +geom_hline(yintercept = 0.05,color="blue")+xlab("標準偏差の違い")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161102/29970515-41c6-a88f-a760-c90c020ad3a4.png)

　この場合、棄却率は、有意水準と同じになるので5%が期待値です。wilcox検定は、明らかに母集団の標準偏差の違いが大きくなるほど、有意水準より棄却率が上がるαエラーを引き起こしており、差がないはずのサンプルに誤って有意差を出すﾀｲﾌﾟIのエラーが大きくなっています。それに対しt検定の方は、母集団の標準偏差の違いが大きくなっても、若干の変動はあるものの、ほぼ有意水準の5%を保っています。

## 4.結論

　黒木玄さんのツイートどおり、分散が異なる母集団からのサンプリングの検定場合、棄却率が高くなったことから、Wilcoxonの順位和検定のP値は小さくなる傾向が見られました。

　Wilcoxonの順位和検定を用いる場合は、適用条件がt検定よりも限定されそうで注意が必要ですね。αエラーを引き起こす可能性があり、少なくとも新版「統計学のセンス」で述べられている「Wilcoxonの順位和検定を積極的に利用しよう」は避けておいた方がよさそうです。