T 檢定 with Python

Pei Lee
4 min readJul 20, 2018

需求描述:最近嘗試用天氣資料跟產品銷售資料做一些分析,其中一點想知道:「是否有某些產品,在颱風天時會與平時的銷售狀況特別不一樣」,於是想到了以前學過的 T 檢定。

以下內容主要統整了兩篇文章:T-test using Python and Numpy 以及 使用Python scipy做统计检验 — Student t-test

用途

T 檢定的功能是比較兩平均數是否有顯著差異,並且告訴你有多顯著。舉例來說:男性與女性的平均身高是否有顯著差異?颱風天跟非颱風天產品銷售數量是否有顯著差異?

虛無假設

T 檢定的虛無假設為:兩群的分佈是相似的。接著需透過檢定結果,通常以 P-Value 小於 0.05 為基準,推翻虛無假設,代表兩群的分佈是不一樣的,也就是男性與女性的平均身高有顯著差異、颱風天跟非颱風天的產品銷售數量有顯著差異。

Python 方法

在 Python 中主要是使用 Scipy 這個套件,其中提供了兩個方法:

  1. scipy.stats.ttest_ind
  2. scipy.stats.ttest_ind_from_stats

第一個方法需傳入兩個 array,為原始樣本資料;第二個方法則是傳入敘述性統計:平均值、標準差、樣本數。其中要特別注意的是,傳入樣本標準差時需做一些修正,經由文章內的推導最後得出要傳入的標準差為:

最後 ttest_ind_from_stats 會回傳兩個值:T-Score、 P-Value。其中 T-Score 表示了兩群之間的差異程度,T-Score 愈小代表兩群愈相似,T-Score 愈大代表兩群愈不一樣。另外 P-Value 表示的是一種機率的概念,代表結果是偶爾發生的機率,而我們並不希望結果是偶然發生,而是源自於它的分佈。因此 P-Value 愈小愈好,代表這個結果的產生是偶然的機率愈小。一般社會科學或是市調報告會用「信心水準」來描述 P-Value 的概念,在 95% 的信心水準下,代表是以 P-Value 為 0.05 為基準,而 0.05 也是一般常用的基準。

應用方式

先寫個 T test 的 function(取自於文章裡面的 code):

def t_test(group1, group2):    mean1 = np.mean(group1)
mean2 = np.mean(group2)
std1 = np.std(group1)
std2 = np.std(group2)
nobs1 = len(group1)
nobs2 = len(group2)

modified_std1 = np.sqrt(np.float32(nobs1)/
np.float32(nobs1-1)) * std1
modified_std2 = np.sqrt(np.float32(nobs2)/
np.float32(nobs2-1)) * std2
(statistic, pvalue) = stats.ttest_ind_from_stats(
mean1=mean1, std1=modified_std1, nobs1=nobs1,
mean2=mean2, std2=modified_std2, nobs2=nobs2 )
return statistic, pvalue

接著設一個 has_typhoon 的欄位,颱風天為 1 非颱風天為 0,然後 LOOP 每個產品,分成兩群 data[‘has_typhoon’]==1、data[‘has_typhoon’]==0 來做 T 檢定。

應用結果

原本擔心會不會沒有任何產品有顯著的差異,但意外地有蠻多的,只是對於這些產品跟颱風天的關聯有點無法解釋,目前沒有其他想法,先寫到這邊。

--

--