天天看點

基于Python的t檢驗實踐篇 (1)基于Python的T檢驗

基于Python的T檢驗

本文讨論的T檢驗分為三類,分别是:

  1. 單樣本t檢驗,适用于對一組資料的均值進行檢驗
  2. 配對的雙樣本T檢驗,适用于配對的兩組資料之間的差異進行檢驗
  3. 獨立雙樣本T檢驗,适用于兩組兩組獨立資料的差異,又可以進一步分為等方差的獨立樣本t檢驗和異方差的獨立樣本T檢驗

本文介紹3種T檢驗的使用方法,最後介紹T檢驗的一般報告格式

單樣本T檢驗

單樣本t檢驗用于比較單列正态分布與給定均值是否具有顯著差異,自由度為

n-1

基于Python的t檢驗實踐篇 (1)基于Python的T檢驗
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檢驗用于比較兩個正态分布的均值是否具有顯著差異:

  1. 方差相等的t檢驗,統計量如下圖,自由度為 n 1 + n 2 − 2 n1+n2-2 n1+n2−2
    基于Python的t檢驗實踐篇 (1)基于Python的T檢驗
  2. 方差不等的t檢驗統計量如下圖, 也稱welch方法
    基于Python的t檢驗實踐篇 (1)基于Python的T檢驗
    自由度為
    基于Python的t檢驗實踐篇 (1)基于Python的T檢驗
# 這裡我們隻舉個同方差的例子

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檢驗
  1. 推論統計分析報告:描述統計+推論統計
  2. 推論統計分析内容:假設檢驗+置信區間+效應量
  3. 假設檢驗步驟:①問題是什麼;②證據是什麼;③判斷标準是什麼;④得出結論
  4. 确定問題首先根據實際情況,定義互為相反的零假設和備擇假設
  5. 根據資料情況,判定屬于哪種檢驗類型,見下圖
  6. 判斷均值的抽樣分布為哪種分布(大樣本n>30正态分布;小樣本n<30且總體正态,t分布)
  7. 确定檢驗方向:左尾?右尾?雙尾?
  8. 計算零假設成立時,出現樣本均值的機率:p值
  9. p值與顯著性水準 α作比較,得出統計顯著性結論
  10. 計算置信度95%的置信區間
  11. 通過效應量判斷效果顯著性(有實際意義)
  12. 來自兩個獨立總體的樣本,在t檢驗之前,先進行方差齊性檢驗。

注意,t檢驗的前提資料近似正态分布