「仮説検定 – ノンパラメトリックな手法」について学ぶ(統計学 / 推定統計学 / 仮説検定)

2023年5月13日

この記事では、統計学を初めて学ぶ筆者が、「推定統計学」における「仮説検定 – ノンパラメトリックな手法」について学んだ内容について記載しています。

学習には、Wikipediaの「ウィルコクソンの符号順位検定」の記事を参考にし、Pythonのプログラミングにも触れ、理解を深めました。

プログラミングには、機械学習ライブラリのSciPyを使用しました。

この記事は、他の人が参考にできるよう、わかりやすく書くことを心がけました。

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

ウィルコクソンの符号順位検定は、一対の標本を比較するためのノンパラメトリック検定法です。一般的に、パラメトリック検定法では、データが正規分布に従うことを前提としているため、正規分布に従わないデータに対しては適用できません。しかし、ウィルコクソンの符号順位検定は、データが正規分布に従わない場合でも使用できます。

具体的には、一組のデータを対象とし、その中でペアを作って2つの値の大小関係を比較します。この際、2つの値が等しい場合は符号を0とし、異なる場合は符号をつけます。そして、2つの値の差の絶対値を計算し、それらの差を小さい順に並べ替えます。並べ替えた差の絶対値の順位をつけて、その和を計算します。

これによって求められた順位和に対して、期待される順位和が等しいかどうかを検定します。検定には、検定統計量と呼ばれる数値を用い、その数値がある基準値を下回る場合、統計的に有意な差があると判断されます。

たとえば、ある学校の生徒たちについて、ある数学テストの前後での成績を比較したいとします。この場合、各生徒の前後の点数の差を計算し、符号をつけます。そして、差の絶対値を小さい順に並べ替え、順位和を計算します。この順位和に対して、期待される順位和が等しいかどうかを検定することによって、前後の成績に統計的に有意な差があるかどうかを判断することができます。

ウィルコクソンの符号順位検定(ふごうじゅんいけんてい、英: Wilcoxon signed-rank test)は一対の標本によるノンパラメトリック検定法である。対応のあるt検定に対応し、対応のあるt検定で必要とされる仮定が満たされない場合に用いる。ウィルコクソン(Frank Wilcoxon、1892-1965)によって「ウィルコクソンの順位和検定」(マン・ホイットニーのU検定に同じ)とともに開発された。

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

順位和と期待される順位和

例として、10人の生徒たちの前後の点数の差を考えます。前の点数をbefore_scores、後の点数をafter_scoresとします。

before_scores = [85, 73, 90, 81, 79, 63, 90, 88, 75, 80] after_scores = [90, 72, 92, 85, 83, 64, 89, 90, 80, 82]

前後の点数の差は以下のように計算されます。

differences = after_scores – before_scores

differences = [5, -1, 2, 4, 4, 1, -1, 2, 5, 2]

差の絶対値を小さい順に並べ替え、順位をつけます。

絶対値順位
-111.5
-111.5
113
224.5
224.5
224.5
447.5
447.5
559
559

順位の和は以下のように計算されます。

順位和 = 1.5 + 1.5 + 3 + 4.5 + 4.5 + 4.5 + 7.5 + 7.5 + 9 + 9 = 52.5

期待される順位和は、前後の点数の差が等しいという帰無仮説の下で、全ての順位を均等に割り振った場合の順位和です。例えば、10人が同じ点数をとった場合、それぞれに順位1から10を割り当て、順位和は55になります。しかし、差がある場合、順位に偏りが出るため、期待される順位和は少なくなります。

期待される順位和 = n * (n + 1) / 4 = 10 * (10 + 1) / 4 = 27.5

このように、順位和と期待される順位和を比較し、差があるかどうかを検定することによって、前後の成績に統計的に有意な差があるかどうかを判断することができます。

Pythonプログラミング

「ウィルコクソンの符号順位検定」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

Pythonのscipyライブラリを使って、ウィルコクソンの符号順位検定を行い、統計的に有意な差があるかどうかを判断します。具体例として、ある学校の10人の生徒たちについて、ある数学テストの前後での成績を比較します。

ウィルコクソンの符号順位検定における帰無仮説は、「前後の成績に差がない」という仮説です。一方、対立仮説は、「前後の成績に差がある」という仮説です。

統計的な有意差が見られた場合には、帰無仮説が棄却され、対立仮説が採用されます。つまり、前後の成績には統計的に有意な差があると判断されます。有意差が見られなかった場合には、帰無仮説が採用され、前後の成績には統計的な差がないと判断されます。

import numpy as np
from scipy.stats import wilcoxon

# 生徒の点数の差を表すデータ
before_scores = np.array([85, 73, 90, 81, 79, 63, 90, 88, 75, 80])
after_scores = np.array([90, 72, 92, 85, 83, 64, 89, 90, 80, 82])
differences = after_scores - before_scores

# 符号順位検定を行う
statistic, p_value = wilcoxon(differences)

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)
if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

実行結果

統計的な有意差が見られ、帰無仮説が棄却され、対立仮説「前後の成績に差がある」が採用されます。

統計量:  4.0
p値:  0.013671875
統計的に有意な差があります

プログラムの説明

import numpy as np
from scipy.stats import wilcoxon

NumPyをインポートします。

scipyのstatsモジュールからwilcoxonをインポートします。

# 生徒の点数の差を表すデータ
before_scores = np.array([85, 73, 90, 81, 79, 63, 90, 88, 75, 80])
after_scores = np.array([90, 72, 92, 85, 83, 64, 89, 90, 80, 82])
differences = after_scores - before_scores

数学テストの前の点数を表すNumPy配列を作成します。

数学テストの後の点数を表すNumPy配列を作成します。

前後の点数の差を計算して、NumPy配列differencesに格納します。

# 符号順位検定を行う
statistic, p_value = wilcoxon(differences)

wilcoxon関数を使用して、生徒の前後の点数の差に対して符号順位検定を行い、統計量とp値を計算します。

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)

統計量を表示します。

p値を表示します。

if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

p値が0.05より小さい場合、統計的に有意な差があるとして、「統計的に有意な差があります」と表示します。そうでない場合、「統計的に有意な差がありません」と表示します。