利用python庫stats進行t檢驗

皮卡qiu發表於2020-12-01

​ t檢驗通常分為三種,分別是單樣本t檢驗、雙樣本t檢驗和配對樣本t檢驗。本文基於python的scipy.stats函式對每種t檢驗進行了介紹和實驗。

一、t檢驗介紹

無論哪種t檢驗,都有以下的基本前提條件:

  1. 樣本資料符合正態分佈
  2. 各個樣本之間是獨立的

步驟:

  1. 提出原假設和備擇假設
  2. 構造t統計量
  3. 計算t統計量
  4. 對於得到的p值進行分析,p大於0.05則接受原假設,反之接受備擇假設

二、 單樣本t檢驗

應用場景:對某個樣本的均值進行檢驗,比較是否和總體的均值(自己定)是否存在差異。

原假設和備擇假設

9wmgvuncay

例如,我獲取了50箇中國人的身高(隨機生成均值為1.5m的50個資料),想比較當前樣本的平均身高和中國人的平均身高(1.7m)是否存在差異。按道理來說應該是存在差異的,因為一個是1.5,一個是1.7。

實現:使用ttest_1samp函式實現,第一個引數為樣本資料,第二個引數為總體均值。程式碼如下:

from scipy.stats import ttest_1samp
from scipy import stats

rvs = stats.norm.rvs(loc=1.5, scale=1, size=(50)) 				#生成均值為1.5,標準差為1的樣本
t, p = ttest_1samp(rvs, 1.7)								  #進行單樣本t檢驗

最終得到:

out:t =  -0.29277920321046647   p =   0.7709272063776454

p值大於0.05,說明我們不能拒絕原假設(即認為樣本均值和總體均值沒有顯著差異),說明樣本的身高均值可以認為是1.7m。之所以得到這樣的結果可能由於我們的樣本數目太少,還有就是生成的資料1.5和1.7過於的接近。所以我們再進行一組實驗來說明,將隨機數的均值改為2.5。

rvs = stats.norm.rvs(loc=2.5, scale=1, size=(50)) 				#生成均值為1.5,標準差為1的樣本
t, p = ttest_1samp(rvs, 1.7)								  #進行單樣本t檢驗,返回對應的t值和p值

得到:

out:t =  5.333243665065403  p =  2.4443516254546488e-06

此時p小於0.05,我們可以拒絕原假設(即認為樣本均值和總體均值有顯著差異),說明樣本身高的均值不可以認為是1.7m。而且因為2.5是大於1.7的,最終得到的t也是一個正數。

三、獨立樣本t檢驗(雙樣本t檢驗)

應用場景:是針對兩組不相關樣本(各樣本量可以相等也可以不相等),檢驗它們在均值之間的差異。對於該檢驗方法而言,我們首先要確定兩個總體的方差是否相等,如果不等,先利用levene檢驗,檢驗兩總體是否具有方差齊性。

原假設和備擇假設

wumri45ar4

例如,我想檢驗A公司銷售額的均值和B公司銷售額的均值是否存在差異。

實現:使用stats.levene檢驗方差是否相等,再使用stats.ttest_ind進行獨立樣本t檢驗,程式碼如下:

A = stats.norm.rvs(loc=1, scale=1, size=(100))		 #生成A公司的銷售額
B = stats.norm.rvs(loc=3, scale=1, size=(100))		 #生成B公司的銷售額
stats.levene(A, B)					 #進行levene檢驗
out:LeveneResult(statistic=0.8054648213132949, pvalue=0.37055445629183437)

得到的p值大於0.05,說明滿足方差相等。使用ttest_ind函式進行獨立樣本t檢驗,函式的最後一個引數為判斷兩個樣本的方差是否相同,如果不同,設為False進行獨立樣本t檢驗。

stats.ttest_ind(A,B,equal_var=True)				#進行獨立樣本t檢驗
out:Ttest_indResult(statistic=-15.25297417258199, pvalue=2.993305057567317e-35)

檢驗結果顯示p遠小於0.05,我們拒絕原假設,即認為A公司和B公司的銷售額均值存在顯著差異

四、配對t檢驗

應用場景:是針對同一組樣本在不同場景下均值之間的差異。檢驗的是兩配對樣本差值的均值是否等於0,如果等於0,則認為配對樣本之間的均值沒有差異,否則存在差異。

原假設和備擇假設

vldz9mvgtl

例如,我們有A公司今年的銷售額以及去年的銷售額,來判斷今年和去年的銷售額均值之間是否有差異。與獨立樣本t檢驗相比,配對樣本T檢驗要求樣本是配對的,兩個樣本的樣本量要相同

實現:可以選擇單樣本t檢驗的ttest_1samp函式(兩組樣本的差異為輸入),也可以直接選擇實現配對樣本t檢驗的ttest_rel函式(兩組樣本作為輸入)。程式碼如下:

A0 = stats.norm.rvs(loc=1, scale=1, size=(100))		 	 #生成去年的銷售額
A1 = stats.norm.rvs(loc=1.5, scale=1, size=(100))		 #生成今年的銷售額

# 計算兩年銷售額之間的差值
diff = A0-A1
# 使用ttest_1samp函式計算配對樣本的t統計量
stats.ttest_1samp(diff)
out:
Ttest_1sampResult(statistic=13.983206457471795, pvalue=1.1154473504425075e-14)

# 使用ttest_rel函式計算配對樣本的t統計量
stats.ttest_rel(A0,A1)
out:
Ttest_relResult(statistic=-4.731625986009621, pvalue=7.412846164679422e-06)

可見,用哪個函式最終得到的t和p值都是相同的。對於這個問題,p值小於0.05,認為兩年的銷售額存在顯著差異。

相關文章