ウィルコクソンの順位和検定、マン・ホイットニーのU検定

ウィルコクソンの順位和検定(Wilcoxon rank-sum test)、またはマン・ホイットニーU検定(Mann-Whitney U test)は、2つの独立したサンプルが同じ母集団から得られたものかどうかを検定するためのノンパラメトリック検定です。データが正規分布に従わない場合や、サンプルサイズが小さい場合に有用です。両検定は実質的に同じ方法なので、まとめてマン・ホイットニー・ウィルコクソン検定(Wilcoxon-Mann-Whitney test)とも呼ばれています。

適用

ChatGPT様のお陰で複雑な図も簡単に描けるようなりました・・・

正規分布から大きく逸脱している場合にはt検定の結果が信頼できなくなる可能性があるので、ウィルコクソンの順位和検定のようなノンパラメトリック検定が適用されます

データの分布の形状に依存しないため、データの分布が偏っている場合やサンプルサイズが小さい場合に適用できます

location shift model(2つのグループのデータ分布の形は同じで位置が異なる場合)のもとでは、t検定とおなじ平均値の差の検定が可能になります

パッケージ

この記事で使用するパッケージです(パッケージのインストール方法

R
library(ggplot2)
library(dplyr)
library(coin)

ウィルコクソンの順位和検定

サンプルの作成

p値の算出方法を解説するためにサンプルサイズを小さくしています。解析対象4例という非現実的な例題ですが、ご理解ください。

R
data <- c(2, 5, 1, 3)
group <- c("A", "A", "B", "B")
dat <- data.frame(data, group)
#View(dat)

Aの平均値=3.5、Bの平均値=2

順位を追加

順位を表示 (群に関係なく小さい順に順位をつけます)

R
#dataの順位列 (rank) を追加
dat2 <- dat %>%
  mutate(rank = rank(data, ties.method = "average"))
#順位でソート
dat3 <- dat2 %>%
  arrange(rank)
# 順位列に「位」を追加
dat4 <- dat3 %>%
  mutate(rank = paste0(rank, ""))
#View(dat4)

図でイメージしてみましょう

R
# 一直線上にデータポイントをプロットするグラフの描画
ggplot(dat4, aes(x = data, y = 1, color = group)) + 
  geom_point(size = 4, position = position_dodge(width = 0.2)) +  # データポイント
  geom_text(aes(label = rank), vjust = -1, position = position_dodge(width = 0.2)) +  # 順位のテキスト
  theme_minimal() + 
  labs(x = "data", y = "", title = "dataの順位") +
  scale_color_manual(values = c("A" = "blue", "B" = "red")) +
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

仮説(重要!)

目的:A群2名の得点が(2点, 5点)、B群2名の得点が(1点, 3点) となった場合に、2群間に差があるかを検定したい(有意水準5%)

A群の母集団の得点分布とB群の分布が統計的に有意に異なるかを検定することになります

帰無仮説: A群とB群の得点分布に差がない

帰無仮説として以下の3つの仮説が考えられます

対立仮説1: A群の得点分布は、B群よりも高い(A群 > B群)
対立仮説2: A群の得点分布は、B群よりも低い(A群 < B群)
対立仮説3: A群とB群の得点分布には差がある(A群 $\neq$ B群)

この検定は、中央値ではなく得点分布の差を比較する手法なので、敢えて中央値という言葉を使用していません。また対立仮説3は、「A群がB群より高いか、もしくは低いか・・・」という仮説になっています。研究目的にマッチしているかどうか十分吟味して、どの仮説にするかを決定してください。

Rでウィルコクソンの順位和検定

基準(reference)の設定

Rは、どちらの群が高いか低いか・・・という答えは出しません

したがって、基準の設定が重要になります

基準を設定するためには、名義変数を factor変数 に変換します

必ず下記の操作を実行してください

R
dat$group <- factor(dat$group)

Rはアルファベット順に基準が設定されます

A群とB群がある場合、自動的にA群が基準になりま

基準をB群に変更したい場合は以下の記事をご参照ください

Rにデフォルトで含まれているwilcox.testを使用します。サンプルサイズが小さく、タイ(順位が同じデータ)がない場合に適用可能です。ただし、サンプルサイズが小さいので検出力は低下します。
後半の例題で使用するcoinパッケージのwilcox_testは、タイがある場合やサンプルサイズが大きい場合にも適用可能です。

対立仮説1の場合(alternative = “greater”)

基準がA群なので、対立仮説(alternative = “greater”)は、A群 > B群を意味します

したがってp<0.05となった場合、統計的に稀な現象と見なされ、帰無仮説(A群=B群)が棄却され、A群 >B群が支持されます

R
wilcox_greater <- wilcox.test(
  data ~ group,
  data = dat,
  alternative = "greater"
)
print(wilcox_greater)

p=0.333ですので、統計的に有意な差(A群 > B群)があるとは言えず、帰無仮説(A群とB群には差がない)を棄却することができません

対立仮説2の場合(alternative = “less”)

基準がA群なので、対立仮説(alternative = “less”)は、A群 < B群を意味します

p<0.05になった場合、統計的に稀な現象と見なされ、帰無仮説(A群とB群には差がない)が棄却され、A群 < B群が支持されます

R
wilcox_less <- wilcox.test(
  data ~ group,
  data = dat,
  alternative = "less"
)
print(wilcox_less )

p=0.8333ですので、統計的に有意な差(A群 < B群)があるとは言えず、帰無仮説(A群=B群)を棄却することができません

対立仮説3の場合(alternative = “two.sided”)

p<0.05になった場合、統計的に稀な現象と見なされ、帰無仮説(A群とB群には差がない)が棄却されます

R
wilcox_two.sided <- wilcox.test(
  data ~ group,
  data = dat,
  alternative = "two.sided"
)
print(wilcox_two.sided )

注意)wilcox.testではデフォルトになっているので、alternative = ” “ の記述がない場合は、この両側検定になるので注意してください

p=0.6667ですので、統計的に有意な差(A群 $\neq$ B群)があるとは言えず、帰無仮説(A群$=$B群)を棄却することができません

コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください

タイトルとURLをコピーしました