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")
【棒グラフ】
【箱ひげ図】
パッと可視化すると、group2の方が睡眠時間の増加が大きいように見えます。
group1とgroup2の間で睡眠時間の増加に有意差があるかをスチューデントのt検定、ウェルチのt検定または対応のある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の場合、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
対応のある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.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
#!/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
#!/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
特になし