Pythonプログラミング(ステップ7・統計的検定・ウィルコクソンの符号順位和検定)

このページでは、対応関係のある2セットのデータ間で分布の代表値に違いがあるかどうかを検定するノンパラメトリックな方法について考える。

「前」と「後」の比較方法

一群の対象に投薬を行う前と後の検査の数値、あるいは、トレーニングを行う前と後でのパフォーマンスを表す数値等、 「前」と「後」で違いがあるかどうかを調べたい。 そこで、$i$番目の対象(被験者)の「前」のスコアを$x_i$、「後」のスコアを$y_i$で表すことにしよう。

全ての対象で $x_i \lt y_i$であれば、確実にスコアが上がったと言えるように思われるし、反対に、 $x_i \gt y_i$であれば、スコアは下がっていると言えそうだ。 けれども、現実には、スコアが上がった者もあれば、下がった者もあったりと、違いや効果を判断するのは難しい。

そこで、それぞれのスコアの変化量 $\delta_i = y_i - x_i$ に注目し、$\delta_i$ の統計性を議論するのは自然であろう。 もし、$x$,$y$がそれぞれ正規分布すると仮定できれば、

等のアプローチが可能である。

ところが、正規性が仮定できない場合も多い。

順位を介して比較する

正規性が仮定できないとしても、$x$と$y$に違いがなければ、$\delta_i$ が0を中心に対称的に分布しているだろうと考えられる。 そのとき、分布関数がどのようなものであれ、$\delta_i$は正値と負値を「バランス良く」取っているはずだ。 そこで、以下のように考えてみよう(Wilcoxonの符号順位検定):

  1. $\delta_i$をその絶対値の大きさの順に順位付けする。$i$番目の順位を$R_i$と置く($i=1, \cdots, N$)。
  2. $\delta_i \gt 0$ の順位の和と、$\delta_i \lt 0$ の順位の和に偏りが無ければ、2つの群は「同質」と見做せるだろう。
  3. そこで、$\delta_i \gt 0$ の順位の和 $$ W^+ = \sum_{i \; \textrm{for} \; \delta_i \gt 0} R_i $$ および $\delta_i \lt 0$ の順位の和 $$ W^- = \sum_{i \; \textrm{for} \; \delta_i \lt 0} R_i $$ を取って、その偏り具合を調べれば良さそうだ。
  4. $\delta_i$が対称的で、$W^+$ および $W^-$ に偏りがなければ、順位の和は、全ての順位の合計(1から$N$までの和) $$ \frac{N (N+1)}{2} $$ のちょうど半分 $$ \frac{N (N+1)}{4} $$ くらいの値を取っているはずである。 反対に、$W^+$または$W^-$がそれより大きく偏っていたとすると、$x$と$y$に違いがあるとみるのが妥当である。

例えば、以下のようなデータが得られたとする。同順位のデータがあった場合は、平均を取ることにすると、

番号	 1    2    3    4    5    6    7    8    9   10
前:x	73   62   82   78   51   90   96   80   79   68
後:y	80   61   85   83   49   95   93   88   75   81
 差	+7   -1   +3   +5   -2   +5   -3   +8   -4  +13
絶対値	 7    1    3    5    2    5    3    8    4   13
順位	 8    1  3.5  6.5    2  6.5  3.5    9    5   10

変化分が正の順位和 $$ W^+ = 8 + 3.5 + 6.5 + 6.5 + 9 + 10 = 43.5 $$ および変化分が負の $$ W^- = 1 + 2 + 3.5 + 5 = 11.5 $$ を得る。

どちらを用いても同様に検定は可能であるが、慣例として、2つのうちの小さいほう $$ W = \min\{W^-, W^+ \} $$ を用いる。

仮説検定

符号順位和 $W$ の確率分布を厳密に計算するのは中々骨が折れるので、ここではSciPyライブラリを使って p値を求めてみよう。 上記の例は

# coding: utf-8

from scipy.stats import wilcoxon

x = [73, 62, 82, 78, 51, 90, 96, 80, 79, 68]
y = [80, 61, 85, 83, 49, 95, 93, 88, 75, 81]

w,p = wilcoxon(x,y)

print('W=',w)
print('p=',p)

で符号順位和と$p$値が計算できる。結果は

W= 11.5
p= 0.10247043485974937

となる。

帰無仮説として『xとyの入れ替えに対して、統計分布の観点から、データは対称である:2つのデータに変化は無い』 対立仮説として『xとyの入れ替えに対して、統計分布の観点から、データは対称でない:2つのデータに違いがある』 を設定するすると、有意水準を$0.1$とした場合でも、帰無仮説は棄却されない。

ここで、対立仮説として『yよりxが大きい』を設定する場合は

w,p = wilcoxon(x,y,alternative='greater')

のようにオプションを指定する(「小さい」に対応するオプションはalternative='less')。

icon-pc 練習:ウィルコクソンの符号順位和検定

ダイエット用のサプリメントの効果を調べるため、10人の被検者について、使用前と使用後の体重(kg)を測定したところ、以下の結果を得た:

被検者    A     B     C     D     E     F     G     H     I     J
使用前 48.3  55.8  51.2  59.6  57.2  52.6  47.8  60.5  53.7  51.1
使用後 48.5  55.1  51.8  54.1  56.9  52.7  48.0  57.1  50.2  49.8

このサプリメントの効果について、統計的に検討してみなさい。

icon-hint ヒント

ウィルコクソンの符号付き順位和検定だけでなく、t検定についても、使用の妥当性も含め、検討してみるとよい。 t検定はデータの正規性が前提となる。