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

基於Python的T檢驗

本文討論的T檢驗分爲三類,分別是:

  1. 單樣本t檢驗,適用於對一組數據的均值進行檢驗
  2. 配對的雙樣本T檢驗,適用於配對的兩組數據之間的差異進行檢驗
  3. 獨立雙樣本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檢驗用於比較兩個正態分佈的均值是否具有顯著差異:

  1. 方差相等的t檢驗,統計量如下圖,自由度爲n1+n22n1+n2-2
    在這裏插入圖片描述
  2. 方差不等的t檢驗統計量如下圖, 也稱welch方法
    在這裏插入圖片描述
    自由度爲
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wYagY009-1590511098056)(./df.png)]
# 這裏我們只舉個同方差的例子

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檢驗的前提數據近似正態分佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章