🍻

HCI研究者の心理統計ノート:ウィルコクソンの順位和検定 / Wilcoxon rank sum test

2023/01/04に公開

HCI研究者の心理統計ノート

https://zenn.dev/tmizuho/articles/e8890371f683bd

Introduction

ウィルコクソンの順位和検定 (Wilcoxon rank sum test) は、2つの対応のないデータに差があるかどうかを検定する方法で、データに等分散性が仮定できる場合に使用できます。マン・ホイットニーの U 検定 (Mann-Whitney U test) と呼ばれる検定方法とは、用いる検定統計量などの違いがありますが、実質的には同じ結果が得られます。一方で、似た名前の ウィルコクソンの符号順位検定 (Wilcoxon signed-rank test) とは全く異なる検定方法なので注意してください。

HCI研究では、2条件参加者間計画 (between-subject design) の実験において、条件1と条件2で評価指標に統計的に有意な差があるかどうかを調べる際に使用します (e.g., 既存手法 vs 提案手法)。特に、質問紙の評定(リッカート尺度)を比較する場面などでよく使います。

t 検定とは違い、正規性の仮定は必要ありません。正規性が仮定できるデータ、できないデータともに適用することができます。正規性の検定は精度がサンプルサイズに大きく依存するといった問題も指摘されており、正規性の仮定に不安があれば、ウィルコクソンの順位和検定を使っておくと無難といった考え方もあるようです。

一方で、等分散性の仮定については、多くの記事や教科書では無視されており、論文にも報告されていることがほとんどないように思いますが、等分散性の仮定できないデータに対しては検定の精度が低下する ことが示唆されています (e.g., Kasuya, 2001)。したがって、等分散性を仮定できる場合には自信をもってウィルコクソンの順位和検定を使用し、そうでない場合にはより適切な検定方法は何か考えてみるという対応が適切でしょう(記事末尾の For Your Information を参照)。

R Sample Code

# ライブラリのインポート
library(tidyverse)

# csvファイルの読み込み
# 整然データを想定: 一行が一観測。 "参加者ID, 独立変数, 従属変数" の形。
data <- read_csv("csvファイルのパス", show_col_types=F) %>%
    # コードの再利用可能性を高めるために列名を変更
    mutate(s=factor("参加者IDの列名"), A=factor("独立変数の列名"), y="従属変数の列名") %>%
    # 必要な列だけ抽出
    select(s, A, y)

# 欠損値や外れ値など、解析から除外するべきデータがあれば削除
# 割愛

# 記述統計量の確認
data %>%
    group_by(A) %>%
    summarize(N=n(), Mean=mean(y), SD=sd(y), SE=sd(y)/sqrt(n()), Min=min(y), Median=median(y), Max=max(y))

# 簡単なグラフを描画して確認
data %>%
    # ggplot で作図開始。x軸は実験条件、y軸は評価指標(平均値)。
    ggplot(aes(x=A, y=y, fill=A)) +
    # 箱ひげ図
    geom_boxplot() +
    # 平均値
    stat_summary(fun=mean, geom="point", color="black", shape=4, size=2) +
    # 軸ラベルの設定
    labs(x="Condition", y="Measurement") +
    # カラーパレット
    scale_fill_brewer(palette="Blues") +
    # テーマの調整
    theme_light() +
    theme(legend.position="none") +
    theme(panel.grid.major.x=element_blank(), panel.grid.minor.y=element_blank())

# 等分散性の検定:p > alpha なら ok、そうでないならストップ。
var.test(y~A, data=data)

# exactRankTests パッケージを使用する方法
library(exactRankTests)
(table <- wilcox.exact(y~A, data=data, paired=F))

#効果量 Cohen's r : 目安は small(0.1), medium(0.3), large(0.5)
p <- table$p.value
z <- qnorm(1 - p/2)#両側検定の場合
r <- z / sqrt(length(data$y))#分母は観測数。
print(paste("Cohen's r = ", r))

How to Report : LaTeX Sample

Japanese

等分散性 (F test, \textit{p} $>$ .05) が棄却されなかったため,ウィルコクソンの順位和検定を実施した結果,YはA1条件がA2条件に比べて有意に高かった (\textit{p} = .XX, Cohen's \textit{r} = X.XX).

English

Because homogeneity of variance assumption was not violated (F test, \textit{p} $>$ .05), we conducted an Wilcoxon rank sum test. The result showed that Y was significantly higher in the A1 condition than in the A2 condition (\textit{p} = .XX, Cohen's \textit{r} = X.XX).

For Your Information

等分散性の仮定について

等分散性の仮定が棄却された場合、どの検定を使えばよいかはおそらく定まっていないと思われます。そのことも、ウィルコクソンの順位和検定の等分散性に関する脆弱性を無視する慣習が広がっている理由の一つかもしれません。どなたかが画期的な解決策を明示してくれるのを待つ一方で、ひとまず現状考えられる上で妥当な検定方法を選ばなければならない場面ではどうしたらいいでしょうか。

例えば、名取 (2014) によれば、正規性を含む様々な条件に対してロバストな ウェルチの t 検定、またはノンパラメトリック検定の中では(ある程度のサンプルサイズの下で) Bruner-Munzel 検定が有力な候補になりそうです。他には、富原 (2005) などにも関連情報が載っていそうです。

論文の執筆においては、読者(および査読者)の理解を得られるように丁寧に記述しておけばよいと思われます。例えば、ウェルチの t 検定を使うことにした場合には、ウィルコクソンの順位和検定の等分散性に関する脆弱性から、代替手法としてのウェルチの t 検定の妥当性まで、引用をつけて説明しておく必要があるでしょう。その際には、上記に挙げた論文などをチェックしてみてください。

効果量について

ノンパラメトリック検定の効果量は、サンプルサイズ N と検定統計量 Z を用いて、以下のように計算しています。

r = {Z}/{\sqrt{N}}

coin パッケージを使う方法について

exactRankTests パッケージをインポートすると、「exactRankTests は開発が終わっているので coin を使ってください」と表示されるかもしれません。気になる方は、以下のように実装すれば、exactRankTests と coin で同じ結果が得られます。ただし、一つ注意するべきは、wilcox_test の結果に表示される Z は p 値の計算に使われるものではないため[1]、効果量 r の計算に使用してはいけません。

ちなみに、R の標準パッケージで使える wilcox.test 関数でもウィルコクソンの順位和検定を実行できますが、正確な p 値が計算できない場合があるので、使わないようにしましょう。

library(coin)
(table <- wilcox_test(y~A, data=data, distribution="exact"))

p <- pvalue(table)
z <- qnorm(1 - p/2)#両側検定の場合
r <- z / sqrt(length(data$y))
print(paste("Cohen's r = ", r))
脚注
  1. 裏 RjpWiki, "wilcox.test と wilcox_test 前者だったら残念ですね", https://blog.goo.ne.jp/r-de-r/e/019d0afc8e702b044768dd8eeaed3dcf, 2023/1/4閲覧. ↩︎

Discussion