基於Python的T檢驗
本文討論的T檢驗分爲三類,分別是:
- 單樣本t檢驗,適用於對一組數據的均值進行檢驗
- 配對的雙樣本T檢驗,適用於配對的兩組數據之間的差異進行檢驗
- 獨立雙樣本T檢驗,適用於兩組兩組獨立數據的差異,又可以進一步分爲等方差的獨立樣本t檢驗和異方差的獨立樣本T檢驗
本文介紹3種T檢驗的使用方法,最後介紹T檢驗的一般報告格式
單樣本T檢驗
單樣本t檢驗用於比較單列正態分佈與給定均值是否具有顯著差異,自由度爲n-1
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
data = np.random.randn(25)+3 # 待檢驗數據
popmean = 2 # 確定data的均值是否與 popmean具有顯著差異
print('mean: ', np.mean(data))
print('std: ', np.std(data, ddof=1))
print('單樣本T檢驗')
t, p = stats.ttest_1samp(data, popmean) # 進行單樣本t檢驗
print('p = ', p)
print('t =', t)
if(p<0.05):
print('具有顯著差異')
else:
print('沒有明確的證據說明二者沒有差異')
# 單樣本檢驗之後還要確定置信區間
ddof = len(data)-1
std = stats.sem(data)
alpha = 0.05
t_ci = stats.t.ppf(1-alpha/2, ddof)
mu = np.mean(data)
print('置信區間: ', [mu-t_ci*std, mu+t_ci*std])
# 評價效應
effect = abs(mu-popmean)/np.std(data, ddof=1)
print('效應: ', effect)
mean: 3.029261856625774
std: 1.1196413921970838
單樣本T檢驗
p = 0.00011589656665491695
t = 4.596390700624433
具有顯著差異
置信區間: [2.5670966048468227, 3.491427108404725]
效應: 0.9192781401248865
配對樣本T檢驗
所謂配對樣本的T檢驗,是指參與對比的兩列數據都是滿足正態分佈,而且兩列數據之間存在一一對應關係。要想判斷這種數據序列之間的差異是否顯著,就可以使用配對樣本T檢驗
data1 = np.random.randn(25) # 數據1
data2 = data1 + np.random.randn(25)+2 # 數據2
# 配對樣本t檢驗用於表示兩組數據是否具有顯著差異
t, p = stats.ttest_rel(data1, data2) # 配對樣本的t檢驗
print('p=', p)
print('t=', t)
t2, p2 = stats.ttest_1samp(data1-data2, 0) # 配對樣本的t檢驗與兩個樣本取差之後進行單樣本檢驗的結果是一樣的
print('p2=', p2)
print('t2=', t2)
# 後續的置信區間等都是一致的,不再贅述
p= 9.93902851019286e-14
t= -15.06093595974834
p2= 9.93902851019286e-14
t2= -15.06093595974834
獨立樣本t檢驗
獨立樣本t檢驗用於比較兩個正態分佈的均值是否具有顯著差異:
- 方差相等的t檢驗,統計量如下圖,自由度爲
- 方差不等的t檢驗統計量如下圖, 也稱welch方法
自由度爲
# 這裏我們只舉個同方差的例子
data1 = np.random.randn(25)*2
data2 = np.random.randn(25)*2 + 3
# 首先進行方差齊性的檢驗
n1 = len(data1)
n2 = len(data2)
var1 = np.var(data1)
var2 = np.var(data2)
df1 = n1-1
df2 = n2-1
if(var1>var2):
F = var2/var1
else:
F = var1/var2
if(var1>var2):
p = stats.f.cdf(F, df2, df1)
else:
p = stats.f.cdf(F, df1, df2)
alpha = 0.05
if(p<alpha):
print('拒絕空假設,方差不同')
else:
print('無法拒絕空假設,方差相同')
# 此外,我們還有其他更簡便的方法處理方差齊性
stats.bartlett(data1, data2) # bartlett檢驗
stats.fligner(data1, data2) # 非參數檢驗
stats.levene(data1, data2) # levene檢驗
# 確定了兩總體方差相同,則進行檢驗
t, p = stats.ttest_ind(data1, data2, equal_var=True)
if(p<alpha):
print('拒絕原假設,存在差異')
else:
print('沒有足夠的證據表明存在差異')
無法拒絕空假設,方差相同
拒絕原假設,存在差異
sem = np.sqrt(np.var(data1)/n1+np.var(data2)/n2)
t_ci = stats.t.ppf(1-alpha/2, n1+n2-2)
sample_mean = np.mean(data1)-np.mean(data2)
print('置信區間: ', sample_mean-t_ci*sem, sample_mean+t_ci*sem)
置信區間: -5.120814280507316 -2.914514107733439
# 計算效用
# 混合標準差
sp = np.sqrt((np.var(data1)*(n1-1)+np.var(data2)*(n2-1))/(n1+n2-2))
effect = sample_mean/sp
print(effect)
-2.0711769775017146
總結部分參考:https://zhuanlan.zhihu.com/p/37265478
本文介紹了統計學的重頭戲:假設檢驗的實現方法,重點介紹t檢驗
- 推論統計分析報告:描述統計+推論統計
- 推論統計分析內容:假設檢驗+置信區間+效應量
- 假設檢驗步驟:①問題是什麼;②證據是什麼;③判斷標準是什麼;④得出結論
- 確定問題首先根據實際情況,定義互爲相反的零假設和備擇假設
- 根據數據情況,判定屬於哪種檢驗類型,見下圖
- 判斷均值的抽樣分佈爲哪種分佈(大樣本n>30正態分佈;小樣本n<30且總體正態,t分佈)
- 確定檢驗方向:左尾?右尾?雙尾?
- 計算零假設成立時,出現樣本均值的概率:p值
- p值與顯著性水平 α作比較,得出統計顯著性結論
- 計算置信度95%的置信區間
- 通過效應量判斷效果顯著性(有實際意義)
- 來自兩個獨立總體的樣本,在t檢驗之前,先進行方差齊性檢驗。
注意,t檢驗的前提數據近似正態分佈