t検定(スチューデントのt検定, ウェルチのt検定, 対応のあるt検定)


t検定とは?

t検定は2群比較・パラメトリック検定の1種です。

t検定と名がつくものはいくつかありますが、以下のようにまとめられます。

検定名英語名パラメトリック?対応等分散性
スチューデントのt検定Student's t-testパラメトリック対応なし必要
ウェルチのt検定Welch's t testパラメトリック対応なし不要
対応のあるt検定Paired t testパラメトリック対応あり不要

なお、対応のあるt検定の場合、対応するデータの引き算をしてからその値が0に等しいかという検定をするので、等分散性を仮定することはありません。

実用上は、スチューデントのt検定は使用せず、以下で問題ないです。

  • 対応がある場合 → 対応のあるt検定

  • 対応がない場合 → 基本的にはウェルチのt検定


例題 - データ

RのSleepデータを使用します。

10人の患者に対して、2種類の薬を使用し、対照薬使用時との睡眠時間の差分を算出したデータです。

#!/usr/bin/env Rscript
data(sleep)
sleep
   extra group ID
1    0.7     1  1
2   -1.6     1  2
3   -0.2     1  3
4   -1.2     1  4
5   -0.1     1  5
6    3.4     1  6
7    3.7     1  7
8    0.8     1  8
9    0.0     1  9
10   2.0     1 10
11   1.9     2  1
12   0.8     2  2
13   1.1     2  3
14   0.1     2  4
15  -0.1     2  5
16   4.4     2  6
17   5.5     2  7
18   1.6     2  8
19   4.6     2  9
20   3.4     2 10

例題 - 可視化

以下のコードによって可視化します。

import pandas as pd
import matplotlib.pylab as plt

group1 = [0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]
group2 = [1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4]

df = pd.DataFrame({
    "group1": group1,
    "group2": group2
})

# 棒グラフ
df.plot(kind="bar")
plt.savefig("plt.bar.sleep.png")

# 箱ひげ図
df.plot(kind="box", widths=0.66)
plt.savefig("plt.box.sleep.png")

【棒グラフ】

t検定

【箱ひげ図】

t検定

パッと可視化すると、group2の方が睡眠時間の増加が大きいように見えます。

group1とgroup2の間で睡眠時間の増加に有意差があるかをスチューデントのt検定、ウェルチのt検定または対応のあるt検定にて計算します。


ソースコード

# Pythonでスチューデントのt検定

Pythonの場合、Scipyのscipy.stats.ttest_ind(equal_var=True)を使用します(公式リファレンス)。

Python環境構築についてはコチラを参照

#!/usr/bin/env python
import sys
import scipy
import scipy.stats as st

group1 = [0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]
group2 = [1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4]

p_value_studentt = st.ttest_ind(group1, group2, euqal_var=True).pvalue
print(p_value_studentt)  # => 0.07918671421593818

# Pythonでウェルチのt検定

Pythonの場合、Scipyのscipy.stats.ttest_ind(equal_var=False)を使用します(公式リファレンス)。

#!/usr/bin/env python
import scipy
import scipy.stats as st

group1 = [0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]
group2 = [1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4]

p_value_welcht = st.ttest_ind(group1, group2, euqal_var=False).pvalue
print(p_value_welcht)  # => 0.0793941401873582

# Pythonで対応のあるt検定

対応のあるt検定はscipy.stats.ttest_rel()を使用します。(公式リファレンス

#!/usr/bin/env python
import scipy
import scipy.stats as st

group1 = [0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]
group2 = [1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4]

p_value_pairedt = st.ttest_rel(group1, group2).pvalue
print(p_value_pairedt)  # => 0.00283289019738427

# Rでスチューデントのt検定

Rではデフォルト関数(t.test())で3種類のt検定をいずれも行うことができます。

#!/usr/bin/env Rscript
group1 = c(0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0)
group2 = c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)
p_value_studentt = t.test(x, y, var.equal=T)$p.value 
print(p_value_studentt) # => 0.07939414

# Rでウェルチのt検定

#!/usr/bin/env Rscript
group1 = c(0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0)
group2 = c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)
p_value_welcht = t.test(x, y, var.equal=F)$p.value 
print(p_value_welcht) # => 0.07918671

# Rで対応のあるt検定

#!/usr/bin/env Rscript
group1 = c(0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0)
group2 = c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)
p_value_pairedt = t.test(x, y, paired=T)$p.value 
print(p_value_pairedt) # => 0.00283289

その他

特になし