「統計学実践ワークブック」 演習問題etc Ch.13 「ノンパラメトリック法」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.13の「ノンパラメトリック法」に関して演習問題を中心に解説を行います。ノンパラメトリック法はサンプルサイズが小さい際に有効とされるケースが多く、演習を通して抑えておくと良いと思われました。

本章のまとめ

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

「ノンパラメトリック法による仮説検定」の「ウィルコクソンの順位和検定」で取り扱った。

並べ替え検定

「ノンパラメトリック法による仮説検定」の「並べ替え検定」で取り扱った。

符号付き順位検定

「ノンパラメトリック法による仮説検定」の「符号付き順位検定」で取り扱った。

演習問題解説

例13.1

A群、B群にそれぞれ小さい順から順位を割り振り、順位和を計算すると下記のようにまとめられる。
$$
\large
\begin{array}{|c|*5{c|}}\hline \mathrm{Set} & \mathrm{Rank} & … & … & … & \mathrm{sum rank} \\
\hline A & 2 & 1 & 6 & & 9 \\
\hline B & 4 & 5 & 3 & 7 & 19 \\
\hline
\end{array}
$$

ここでA群に着目すると、選び方は${}_{7} C_{3}=35$通りある。この$35$通りのうち、順位和が$9$以下になる組み合わせは下記のように表せる。
$$
\large
\begin{align}
& 1,2,3 \qquad 1,2,4 \qquad 1,2,5 \\
& 1,2,6 \qquad 1,3,4 \qquad 1,3,5 \\
& 2,3,4
\end{align}
$$

よって、ここでの片側$P$値は$7/35=1/5=0.2$のように計算できる。

例13.2

下記を実行することで並べ替え検定における片側$P$値を得ることができる。

import numpy as np

x = np.array([30., 20., 52., 40., 50., 35., 60.])
ave_x_A = np.mean(x[0:3])

count_A = 0.
count_all = 0.
for i in range(7-2):
    for j in range(i+1,7-1):
        for k in range(j+1,7):
            count_all += 1.
            if (x[i]+x[j]+x[k])/3. <= ave_x_A:
                count_A += 1.

print("P-value: {}/{}={}".format(int(count_A), int(count_all), count_A/count_all))

・実行結果

> print("P-value: {}/{}={}".format(int(count_A), int(count_all), count_A/count_all))
P-value: 5/35=0.142857142857

並べ替え検定における片側$P$値の計算は少々大変なので、ここで用いたように何らかのプログラムを元に計算を行うのが良いと思われる。

例13.3

下記を実行することで検定を行うことができる。

import numpy as np
from scipy import stats

n, t = 35., 420.
mean_t = n*(n+1)/4.
var_t = n*(n+1)*(2*n+1)/24.

z = (t-mean_t)/np.sqrt(var_t)

if z > stats.norm.ppf(1-0.05):
    print("z: {:.2f}, P-value: {:.3f}, reject H_0.".format(z,1.-stats.norm.cdf(z)))
else:
    print("z: {:.2f}, P-value: {:.3f}, accept H_0.".format(z,1.-stats.norm.cdf(z)))

・実行結果

z: 1.72, P-value: 0.043, reject H_0.

・解説
$n(n+1)/4$は$1$から$n$までの和の$n(n+1)/2$を2で割った値であることも抑えておくと良いと思います。

例13.4

下記のような計算を実行することでクラスカル・ウォリス検定の検定統計量と、対応する$P$値の計算を行うことができる。

import numpy as np
from scipy import stats

n = np.array([5., 5., 5., 5.])
N, N_med = np.sum(n), (np.sum(n)+1.)/2.
R = np.array([15., 14., 7., 6.])

H_stat = (12.*np.sum(n*(R-N_med)**2))/(N*(N+1))

print("H-statistic: {:.2f}".format(H_stat))
print("P-value: {}".format(1.-stats.chi2.cdf(H_stat,3)))

・実行結果

> print("H-statistic: {:.2f}".format(H_stat))
H-statistic: 9.29
> print("P-value: {}".format(1.-stats.chi2.cdf(H_stat,3)))
P-value: 0.0257237409592

上記の計算結果より、有意水準$5$%で帰無仮説は棄却でき、各群に差があるといえる。

例13.5

下記を実行することで、スピアマンの順位相関係数とケンドールの順位相関係数を計算することができる。

import numpy as np

x = np.array([1., 2., 3., 4., 5., 6., 7.])
y = np.array([1., 3., 2., 6., 4., 5., 7.])

P, N = 0., 0.
for i in range(7):
    for j in range(i+1,7):
        if (x[i]-x[j])*(y[i]-y[j])>0:
            P += 1.
        else:
            N += 1.

cor_spear = 1. - 6.*np.sum((x-y)**2)/(7.*(7.**2-1))
cor_kendall = 2*(P-N)/(7.*(7.-1.))

print("Spearman correlation coef: {}".format(cor_spear))
print("Kendall correlation coef: {}".format(cor_kendall))

・実行結果

> print("Spearman correlation coef: {}".format(cor_spear))
Spearman correlation coef: 0.857142857143
> print("Kendall correlation coef: {}".format(cor_kendall))
Kendall correlation coef: 0.714285714286

問13.1

$[1]$
下記で取り扱った。
https://www.hello-statisticians.com/toukei-kentei-semi1-kakomon-cat/kakomon-semi1-2018/stat_certifi_semi1_18_5.html#2

$[2]$
下記で取り扱った。
https://www.hello-statisticians.com/toukei-kentei-semi1-kakomon-cat/kakomon-semi1-2018/stat_certifi_semi1_18_5.html#3

$[3]$
小さい順に符号付き順位を割り振ると、$-1,3,2$が得られる。これは全$2^3=8$通りのうち、$1,3,2$の次に符号付き順位和が大きくなるので、対応する$P$値は$2/8=0.25$であることがわかる。

$[4]$
$\displaystyle \frac{1}{2^n} < 0.05$を$n$に関して解けばよい。不等号は$2^n>20$と同じであるが、$n$が自然数であることを考慮すると、$n \geq 5$であることがわかる。

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「「統計学実践ワークブック」 演習問題etc Ch.13 「ノンパラメトリック法」」への2件のフィードバック

コメントは受け付けていません。