

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


ChatGPT様のお陰で複雑な図も簡単に描けるようなりました・・・
正規分布から大きく逸脱している場合にはt検定の結果が信頼できなくなる可能性があるので、ウィルコクソンの順位和検定のようなノンパラメトリック検定が適用されます.データの分布の形状に依存しないため、データの分布が偏っている場合やサンプルサイズが小さい場合に適用できます.location shift model(2つのグループのデータ分布の形は同じで位置が異なる場合)のもとでは、t検定とおなじ平均値の差の検定が可能になります.
パッケージ
この記事で使用するパッケージです(パッケージのインストール方法)
library(ggplot2)
library(dplyr)
library(coin)
ウィルコクソンの順位和検定
サンプルの作成

p値の算出方法を解説するためにサンプルサイズを小さくしています。解析対象4例という非現実的な例題ですが、ご理解ください。
data <- c(2, 5, 1, 3)
group <- c("A", "A", "B", "B")
dat <- data.frame(data, group)
print(dat)
> print(dat)
data group
1 2 A
2 5 A
3 1 B
4 3 B
Aの平均値=3.5、Bの平均値=2
順位を追加
順位を表示 (群に関係なく小さい順に順位をつけます)。
# データフレームの作成
# data列で昇順にソート
# rank列を追加
# Create a dataframe
dat <- data.frame(data = c(2, 5, 1, 3), group = c('A', 'A', 'B', 'B'))
# Sort by the 'data' column in ascending order
dat <- dat[order(dat$data), ]
# Add a 'rank' column
dat$rank <- c("1st", "2nd", "3rd", "4th")
# Display the result
print(dat)
> print(dat)
data group rank
3 1 B 1st
1 2 A 2nd
4 3 B 3rd
2 5 A 4th
図でイメージしてみましょう。一直線上にデータポイントをプロットするグラフの描画。
# Creating a scatter plot
fig <- ggplot(dat, aes(x = data, y = 1, label = rank)) +
geom_point(aes(color = group), size = 5) + # Color-code based on group
geom_text(vjust = -1) + # Display rank text above the dots
scale_color_manual(values = c('A' = 'red', 'B' = 'blue')) + # Specify red for A and blue for B
theme_minimal() + # Use minimal theme
labs(color = "Group") + # Label for the legend
scale_y_continuous(breaks = c(1), # Set y-axis ticks to only show 1
labels = c("1"), # Set the label for the tick
limits = c(0.99, 1.01)) + # Set y-axis display range
theme(axis.title.y = element_blank(), # Hide y-axis title
axis.text.y = element_text(color = "black")) # Specify color for y-axis text
# Display the graph
print(fig)

仮説(重要!)
目的: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変数 に変換します。
必ず下記の操作を実行してください。
dat$group <- factor(dat$group)
Rはアルファベット順に基準が設定されます。A群とB群がある場合、自動的にA群が基準になりま。
factor()
関数は名義変数をカテゴリカル変数(因子型変数)に変換し、データのカテゴリーは「水準」として定義されます。levels()
関数で表示されるカテゴリカル変数の水準のうち、最初に表示されるカテゴリーがデフォルトで基準カテゴリー(参照カテゴリー)となり、統計モデルでの比較の基点として機能します。relevel()
関数や factor()
関数の levels
引数を使用することで、レベルの順序を指定し、基準カテゴリーを変更することが可能です。

Rにデフォルトで含まれているwilcox.testを使用します。サンプルサイズが小さく、タイ(順位が同じデータ)がない場合に適用可能です。ただし、サンプルサイズが小さいので検出力は低下します。
後半の例題で使用するcoinパッケージのwilcox_testは、タイがある場合やサンプルサイズが大きい場合にも適用可能です。
対立仮説1の場合(alternative = “greater”)
基準がA群なので、対立仮説(alternative = “greater”)は、A群 > B群を意味します。したがってp<0.05となった場合、統計的に稀な現象と見なされ、帰無仮説(A群=B群)が棄却され、A群 >B群が支持されます。
wilcox_greater <- wilcox.test(
data ~ group,
data = dat,
alternative = "greater"
)
print(wilcox_greater)
> print(wilcox_greater)
Wilcoxon rank sum exact test
data: data by group
W = 3, p-value = 0.3333
alternative hypothesis: true location shift is greater than 0
p=0.333ですので、統計的に有意な差(A群 > B群)があるとは言えず、帰無仮説(A群とB群には差がない)を棄却することができません。
対立仮説2の場合(alternative = “less”)
基準がA群なので、対立仮説(alternative = “less”)は、A群 < B群を意味します。p<0.05になった場合、統計的に稀な現象と見なされ、帰無仮説(A群とB群には差がない)が棄却され、A群 < B群が支持されます。
wilcox_less <- wilcox.test(
data ~ group,
data = dat,
alternative = "less"
)
print(wilcox_less )
> print(wilcox_less )
Wilcoxon rank sum exact test
data: data by group
W = 3, p-value = 0.8333
alternative hypothesis: true location shift is less than 0
p=0.8333ですので、統計的に有意な差(A群 < B群)があるとは言えず、帰無仮説(A群=B群)を棄却することができません。
対立仮説3の場合(alternative = “two.sided”)
p<0.05になった場合、統計的に稀な現象と見なされ、帰無仮説(A群とB群には差がない)が棄却されます
wilcox_two.sided <- wilcox.test(
data ~ group,
data = dat,
alternative = "two.sided"
)
print(wilcox_two.sided )
注意)wilcox.testではデフォルトになっているので、alternative = ” “ の記述がない場合は、この両側検定になるので注意してください。
> print(wilcox_two.sided )
Wilcoxon rank sum exact test
data: data by group
W = 3, p-value = 0.6667
alternative hypothesis: true location shift is not equal to 0
p=0.6667ですので、統計的に有意な差(A群 $\neq$ B群)があるとは言えず、帰無仮説(A群$=$B群)を棄却することができません。
コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください