單一樣本t檢定 (One-Sample t test,parametric)
套路 6: 單一樣本t檢定 (One-Sample t test,parametric)
什麼是單一樣本假設檢定? 說白了就是只有一組資料做假設檢定。統計假設檢定檢定什麼?看H0。例如單一樣本假設檢定H0 : μ
= 0,HA : μ ¹ 0是檢定資料的平均值是否為0。又例如單一樣本假設檢定H0 : μ < 8,HA : μ
³ 8是檢定資料的平均值是否小於8。假設相等時為雙尾 (two-tailed test) 檢定。假設不相等時為單尾 (one-tailed
test) 檢定。如下圖所示:
1. 使用時機: 用於比較觀測到的平均值(mean)和理論(期望)值。大樣本用Z檢定小樣本用t檢定。
2. 分析類型: 母數分析(parametric analysis)。直接使用資料數值算統計叫parametric方法,把資料排序之後用排序的名次算統計叫non-parametric方法。
3. 前提假設: 資料為常態分布(normal distribution) 或接近常態分布。
4. 資料範例: 咪路調查淡水河口彈塗魚的體長(cm),資料如下:
14.3, 15.8, 14.6, 16.1, 12.9, 15.1, 17.3, 14.0, 14.5,
13.9, 16.2, 14.3, 14.6, 13.3, 15.5, 11.8, 14.8, 13.5, 16.3, 15.4, 15.5, 13.9,
10.7, 14.8, 12.9, 15.4
問: 這種彈塗魚的平均身長為15 cm? H0:
m = 15。HA: m ≠ 15。
5. 畫圖看資料分布:
dat = [14.3, 15.8, 14.6, 16.1, 12.9,
15.1, 17.3, 14.0, 14.5, 13.9, 16.2, 14.3, 14.6, 13.3, 15.5, 11.8, 14.8, 13.5,
16.3, 15.4, 15.5, 13.9, 10.7, 14.8, 12.9, 15.4]
import seaborn as sns
sns.set(style="whitegrid")
ax = sns.boxplot(x = dat, orient = "v",
color = "skyblue", width=0.2)
ax = sns.swarmplot(x = dat, orient =
"v", color = "red")
結果:
6. 檢查資料是否為常態分布(H0:資料為常態分佈):
dat = [14.3, 15.8, 14.6, 16.1, 12.9,
15.1, 17.3, 14.0, 14.5, 13.9, 16.2, 14.3, 14.6, 13.3, 15.5, 11.8, 14.8, 13.5,
16.3, 15.4, 15.5, 13.9, 10.7, 14.8, 12.9, 15.4]
import scipy.stats
scipy.stats.shapiro(dat)
結果: (0.970967173576355,
0.6485393047332764)
p = 0.6485 > 0.05,接受H0:資料為常態分佈。
7. 使用Python計算單一樣本t檢定:
方法一: Python 程式
dat = [14.3, 15.8, 14.6, 16.1, 12.9,
15.1, 17.3, 14.0, 14.5, 13.9, 16.2, 14.3, 14.6, 13.3, 15.5, 11.8, 14.8, 13.5,
16.3, 15.4, 15.5, 13.9, 10.7, 14.8, 12.9, 15.4]
from scipy.stats import t
n = len(dat)
t1 = 0
for i in range(n):
t1 = t1 + dat[i]
xBar = t1 / n
mu = 15 # 假設彈塗魚的平均身長為15 cm, H0: m = 15。
t2 = 0
for i in
range(n):
t2 = t2 + (dat[i] - xBar)**2
se = (t2 / (n *
(n-1)))**(1/2)
tStat = (xBar - mu)
/ se
df = n - 1
pVal = (1 -
t.cdf(abs(tStat), df)) * 2 # two-sided
tStat, df, pVal
結果: (-1.701410668011921, 25,
0.10127268114788257)
p = 0.101 > 0.05,接受假設H0: m = 15,彈塗魚的平均身長為15 cm。
方法二: Python 函數
dat = [14.3, 15.8, 14.6, 16.1, 12.9,
15.1, 17.3, 14.0, 14.5, 13.9, 16.2, 14.3, 14.6, 13.3, 15.5, 11.8, 14.8, 13.5,
16.3, 15.4, 15.5, 13.9, 10.7, 14.8, 12.9, 15.4]
import scipy.stats
scipy.stats.ttest_1samp(dat, 15)
結果: Ttest_1sampResult(statistic=-1.7014106680119085,
pvalue=0.10127268114788486)
p = 0.101 > 0.05,接受假設H0: m = 15,彈塗魚的平均身長為15 cm。
留言
張貼留言