Hypothesis Testing — 實戰以 Python 實踐假設檢定(附程式碼)

學.誌|Chris Kang
10 min readJan 27, 2020
Photo by Ruthson Zimmerman on Unsplash

隨著大數據的應用越來越廣泛,一些統計概念也開始不全然適用;然而,在實際應用上,不僅過多的數據在取得上有困難,很多時候我們也仍然需要參考統計學的概念,來進行一些快速的檢定。

其中假設檢定(Hypothesis Testing),便是目前除了回歸之外最常被使用的技巧。不僅能為 A/B Test 與檢驗量率提供一個簡便的方式,也能克服在市調上取樣困難,或無法取得數據的困境。

在開始之前,就讓我們先來瞭解本文的主角––––假設檢定,究竟是什麼?

假設檢定是什麼

假設檢定是指對於母體參數提出一項假設(Hypothesis),並利用樣本的統計量,來決定是否要接受或否決該假設。

例如,某藥廠聲稱 XX 藥物具有特別療效,能提高治癒率 20%;兩班的分數水平是否有明顯的差異……等例子,都能透過假設檢定來驗證。

一、如何建立假設

假設檢定的假設

  • Null Hypothesis (虛無假設)|現狀(例如無罪、沒有差異、沒有效果等等)
  • Alternative Hypothesis (對立假設)|差異(改變現狀、成本高的、有變異等)

假設檢定的類別

假設檢定總共有下列三種:

不同的假設檢定取決於檢驗的情境。例如:

  • 雙尾檢定|很適合用於檢驗兩群樣本是否有差異
  • 左、右尾檢定|檢驗實際上高於某個值的可能性有多少。

假設檢定的誤差

  • 型一誤差(Type I error) |通常被認為「較嚴重」。當虛無假設 H0 為真,卻拒絕 H0 時。例如明明該名嫌疑犯無罪,卻仍然判處他有罪。
  • 型二誤差(Type II error)|當虛無假設 H0 為假時,卻錯誤的不拒絕 H0。同樣地,假如該名嫌疑犯實際上有罪,卻被判處無罪。

型一誤差的機率被稱為 α,又被稱為顯著水準(Significance Level)。換句話說,如果 α 越小,代表被誤判為有罪(型一誤差)的機率也越小,對 Alternative Hypothesis(對立假設)的檢驗也越嚴格。型二誤差的機率則被稱為 β,α 與 β 兩者機率互為消長。

舉個例子,在工廠檢驗不良品時,把所有可能存在瑕疵的產品都視為正常,因此可以降低 α。卻也造成原本可能有罪的嫌疑犯也被判成無罪,造成 β 上升

因此,在相同樣本的情況下,不可能同時降低 α 與 β

二、選擇檢定統計量

檢定統計量是什麼

檢定統計量是指由樣本(Sample)中所計算出來的值,用以判斷是否拒絕虛無假設。

常見的假設檢定有下列幾種:Z, t, F 與 χ2。

  • Z 檢定|當樣本足夠大(通常是大於 30)且屬於常態分布時採用。但因必須知道母體的標準差,因此理論上可行但更常使用 T 檢定。
  • T 檢定|常態分布為 T 分布的特例(當樣本夠大時)使用。
  • F 檢定聯合假設檢驗(英語:joint hypotheses test)或是變異數比率檢驗,用於分析超過一個參數的假設檢定。
  • χ2 檢定|一定義在大於等於 0(正數)範圍的右偏分布。卡方分布由自由度決定分配型態。

Z 與 T 檢定的取捨

常態分配

A. 母體已知時,使用 Z 檢定常態分配:

Z 檢定統計量,但 σ 用 s 取代

B. 母體未知時,樣本數 n > 30 使用 Z 檢定常態分配(σ 用 s 取代):

t 檢定統計量

C. 母體未知時,樣本數 n < 30 使用 T 檢定:

如果遇到兩者樣本數不同,則可參考下方的統計公式:

t 檢定|雙樣本數

檢驗方式通常分成三種(以 t 檢驗為例):

  • 獨立樣本 t 檢驗|比較兩組平均值的方法。
  • 配對樣本 t 檢驗|比較同一組,但不同時間的差異。
  • 單一樣本 t 檢驗|檢驗單個組的平均,對比一個已知的平均。

三、決定決策法則與顯著水準

兩種決定決策法則

  • 傳統決策域與拒絕域(Rejection Regions)
  • p-value 檢定

一個 Z 或 T 值,都會伴隨著一個 p-value。T 值越大,代表組間的差異越大;反之則越小。p-value 則是指樣本結果發生的機率,通常越低越容易拒絕虛無假設(驗證差異)通常常用的 p-value 為 0.05,亦即 95% 的信心水準。

樣本不一致的統計方法

對於兩個樣本數量不一致的比較,針對 Z、t 等統計方法,其信賴區間與自由度需要調整成:

A. 信賴區間與自由度

自由度計算公式

B. 檢定量與標準差

t 檢定|統計量與變異數計算公式

A. 傳統決策域與拒絕域(Rejection Regions)

決策法則通常是用於訂定一個不拒絕域(Non-rejection Region 或稱接受域)與拒絕域(Rejection Region) 。接受域與拒絕域的接點,則被稱為臨界點(Critical Point)。其中, T 檢定的統計量,會根據樣本數的自由度而有所變化,下圖是 t 檢定的查找圖。

t 檢定的查詢表

i. 雙尾檢定(Two-tail Test)

雙尾檢定分配圖
  • 接受域|[-tα/2, tα/2] 亦即圖中的 “Do not reject H0”
  • 拒絕域||檢定統計量| > |tα/2|

PS:記得雙尾檢定的兩個尾巴各只佔了 2.5%(以 95% 的信心水準為例),因此記得 α 要除以 2

A. 假設檢定:

假設檢定

B. t 檢定統計量:

C. t 檢定的實際計算:

ii. 右尾檢定(Right-tail Test)

右尾檢定
  • 接受域|[ -∞, tα] 亦即圖中的 “Do not reject H0”
  • 拒絕域|檢定統計量 > tα

A. 假設檢定:

假設檢定

B. t 檢定統計量:

C. Z 檢定的實際計算:

iii. 左尾檢定(Left-tail Test)

左尾檢定
  • 接受域|[ t-α, ∞] 亦即圖中的 “Do not reject H0”
  • 拒絕域|檢定統計量 < t-α

其假設檢定與統計量皆與右尾檢定完全相反,故在此省略不提。

B. P-Value 檢定

p-value 的計算方式更為直覺,只需要設定信心水準(亦即 α),進而決定臨界值來判斷是否拒絕或接受。決策方式為:

  • 如果 P-Value ≧ α,則接受虛無假設(Null Hypothesis)。
  • 如果 P-Value < α,則拒絕虛無假設(Null Hypothesis)。

但目前 p-value 最大的問題在於,臨界值很容易被一分為兩個選項。例如:

  • α=0.05 不拒絕 H0
  • α=0.049 拒絕 H0

0.05 和 0.049 其實就結果來說差不了多少,但卻造成接受或拒絕兩種不同的結果。因此之後在解釋 p-value 時,不僅要說明其值,也要完整說明整個檢定的狀況,避免產生誤解。

以下以雙尾檢定為例。

A. 檢定的假設

雙尾檢定

B. 檢定量的計算

C. 實際計算案例

四、實際案例(附程式碼)

A. 引入套件

## Import the packagesimport numpy as np
from scipy import stats

B. 產生兩組樣本

## Define 2 random distributions#Sample Size
N = 10
# Gaussian distributed data with mean = 2 and var = 1
a = np.random.randn(N) + 2
# Gaussian distributed data with with mean = 0 and var = 1
b = np.random.randn(N)
# PS: 原因是 np.randon.randn 會產生 std 為 1 mean 為 0 的 N 組常態分布

C. 計算標準差與自由度

## Calculate the Standard Deviation#Calculate the variance to get the standard deviation#For unbiased max likelihood estimate we have to divide the var by N-1, and therefore the parameter ddof = 1var_a = a.var(ddof=1)var_b = b.var(ddof=1)
#std deviation
s = np.sqrt((var_a + var_b)/2)

## 統計量,可參考上方樣本數不同時的公式
t = (a.mean() - b.mean())/(s*np.sqrt(2/N))

# Compare with the critical t-value
# 自由度
df = 2*N - 2
# 計算 p-value after comparison with the t
p = 1 - stats.t.cdf(t,df=df)
# 列印結果
print("t = " + str(t))
print("p = " + str(2*p))
# Note that we multiply the p value by 2 because its a twp tail t-test### You can see that after comparing the t statistic with the critical t value (computed internally) we get a good p value of 0.0005 and thus we reject the null hypothesis and thus it proves that the mean of the two distributions are different and statistically significant.## Cross Checking with the internal scipy functiont2, p2 = stats.ttest_ind(a,b) # 列印結果作為交叉參照
print("t = " + str(t2))
print("p = " + str(2*p2))

謝謝你/妳,願意把我的文章閱讀完

如果你喜歡筆者在 Medium 的文章,可以拍個手(Claps),最多可以按五個喔!也歡迎你分享給你覺得有需要的朋友們。

參考資料

--

--

學.誌|Chris Kang

嗨!我是 Chris,一位擁有技術背景的獵頭,熱愛解決生活與職涯上的挑戰。專注於產品管理/資料科學/前端開發 / 人生成長,在這條路上,歡迎你找我一起聊聊。歡迎來信合作和交流: chriskang0917@gmail.com