數據分析系列:Z 檢驗和 T 檢驗的應用及代碼實現

原創 J 數據科學家聯盟  4天前

目錄

  • 0前言

  • 1 Z 檢驗

    • 1.單樣本 Z 檢驗

    • 2.雙樣本 Z 檢驗

  • 2 T 檢驗

    • 1.單樣本 T 檢驗

    • 2.雙樣本 T 檢驗

  • 3 比例檢驗

    • 1.單比例檢驗

    • 2.雙比例檢驗

  • 4 總結

    • 1. Z 分佈和 T 分佈

    • 2. Z 檢驗和 T 檢驗的區別

0x00 前言

均值對比是數據分析中最重要的內容之一,應用廣泛。

  • 對比試驗前後病人的症狀,證明某種藥是否有效;

  • 對比某個班級兩次語文成績,驗證是否有提高;

  • 對比某個產品在投放廣告前後的銷量,看廣告是否有效。

這些都屬於兩均值對比的應用。

均值對比的假設檢驗方法主要有 Z 檢驗和 T 檢驗,它們的區別在於 Z 檢驗面向總體數據和大樣本數據,而 T 檢驗適用於小規模抽樣樣本。下面分別介紹 Z 檢驗和 T 檢驗。

0x01 Z 檢驗

需要事先知道總體方差,另外,如果總體不服從正態分佈,那麼樣本量要大於等於 30 ;如果總體服從正態分佈,那麼對樣本量沒有要求。

Z 檢驗用於比較樣本和總體的均值是否不同或者兩個樣本的均值是否不同。檢驗統計量 z 值的分佈服從正態分佈。

1.單樣本 Z 檢驗

使用單樣本 Z 可以在知道總體的標準差時,估計總體的均值並將它與目標值或參考值進行比較。使用此分析,可以執行以下操作:確定總體均值是否不同於您指定的假設均值。計算可能包括總體均值的值範圍。

例子:

  • 質量分析員使用單樣本 Z 檢驗來確定螺栓的平均螺紋長度是否不同於目標值 39 毫米。如果均值不同於目標值,分析員將使用置信區間來確定差值有可能爲多大以及差值是否有實際意義;

實現代碼:

import statsmodels.stats.weightstats as sw
arr = [
    23,36,42,34,39,34,35,42,53,28,
    49,39,46,45,39,38,45,27,43,54,
    36,34,48,36,47,44,48,45,44,33,
    24,40,50,32,39,31
]
tstats, pvalue = sw.ztest(arr, value=39)
print(tstats, pvalue)
# 輸出:0.3859224924939799 0.6995540720244979
# 假設置信度爲 0.05 ,由於 p 值大於置信度,接受原假設。所以平均螺紋長度等於 39 。

2.雙樣本 Z 檢驗

在兩個總體標準差(s1 和 s2)已知的情況下,檢驗基於獨立樣本的兩個總體平均值(m1 和 m2)是否相等(或大於/小於)。

實現代碼:

import statsmodels.stats.weightstats as sw
arr1 = [
    23,36,42,34,39,34,35,42,53,28,
    49,39,46,45,39,38,45,27,43,54,
    36,34,48,36,47,44,48,45,44,33,
    24,40,50,32,39,31
]
arr2 = [
    41,34,36,32,32,35,33,31,35,34,
    37,34,31,36,37,34,33,37,33,38,
    38,37,34,36,36,31,33,36,37,35,
    33,34,33,35,34,34,34,35,35,34
]
tstats, pvalue = sw.ztest(arr1, arr2, value=0, alternative='two-sided')
print(tstats, pvalue)
# 3.775645601380307 0.0001595937672736755
# 假設置信度爲 0.05 ,由於 p 值小於置信度 0.05 ,拒絕原假設,接受備選假設。所以兩個獨立樣本的總體均值相等。

0x02 T 檢驗

T 檢驗,亦稱 student t 檢驗(Student's t test),主要用於樣本含量較小(例如 n < 30),總體標準差 σ 未知的正態分佈資料。T 檢驗是用 T 分佈理論來推論差異發生的概率,從而比較兩個平均數的差異是否顯著。

事先不知道總體方差,另外,如果總體不服從正態分佈,那麼樣本量要大於等於 30 ,如果總體服從正態分佈,那麼對樣本量沒有要求。

Z 檢驗雖然能夠進行均值差異性檢驗,但是,它要求總體標準差已知或者樣本容量足夠大,這是很難做到甚至無法達成的。這時候t檢驗就粉墨登場了,只需從正態總體中抽取小規模的樣本數據,並計算均值與標準差,用來代替正態總體的均值和標準差即可。

1.單樣本 T 檢驗

單樣本 T 檢驗確定樣本均值是否與已知或假設的總體均值具有統計學差異。

例子:

  • 你有 10 個年齡,你正在檢查平均年齡是否爲 30 歲;

  • 已知一般嬰兒出生體重 μ0 ,現有n個難產兒出生重量數量,檢驗難產兒與一般嬰兒體重的總體均數是否相等(檢驗難產兒體重與一般嬰兒體重有沒有顯著性差異);

  • 媒體報道某大學的學生平均學習時間是 2.5h ,爲了證實這報道的數據是否正確,隨機抽樣 16 人,平均學習時間是 3.2h ,方差是 0.57 ,檢驗這所學校學生學習時長與媒體報道中的時長是否顯著不同;

實現代碼:

from scipy import stats
arr = [31, 35, 28, 29, 27, 34, 32, 33, 30, 26]
statistic, pvalue = stats.ttest_1samp(arr, 30)
print('statistic={}, pvalue={}'.format(statistic, pvalue))
# 輸出:statistic=0.5222329678670935, pvalue=0.614117254808394
# 假設置信度爲 0.05 ,由於 p 值大於置信度 0.05 ,接受原假設。所以 arr 的均值與 30 差異不顯著。

2.雙樣本 T 檢驗

獨立樣本 T 檢驗或雙樣本 T 檢驗比較兩個獨立組的平均值,以確定是否有統計證據表明相關的人口均值存在顯着差異。獨立樣本 T 檢驗是參數檢驗。該測試也稱爲:獨立 T 檢驗。

1)獨立均值 T 檢驗

例子:

  • 研究表達性寫作對創傷事件的治癒效果(ABTest);

  • 用T檢驗比較下列男、女兒童身高的均值是否一樣;

實現代碼:

import statsmodels.stats.weightstats as st
arr1 = [8, 7, 9, 6, 8]
arr2 = [6, 7, 7, 6, 6]
# usevar='unequal'兩個總體方差不一樣
t, p, df = st.ttest_ind(arr1, arr2, alternative='two-sided', usevar='unequal')
print('t值={},p值={},自由度={}'.format(t, p, df))
# 輸出:t值=2.1213203435596415,p值=0.08011884223003829,自由度=5.752808988764045
# 假設置信度爲 0.05 ,由於 p 值大於置信度 0.05 ,接受原假設。所以 arr1 與 arr2 的均值沒有差異。

2)非獨立(配對樣本)均值 T 檢驗

例子:

  • 檢驗運動前和運動後同一批人的體重是否有變化。

  • 檢驗 5 位丈夫結婚前後交流質量是否有變化。

實現代碼:

from scipy import stats
arr1 = [8, 7, 9, 6, 8]
arr2 = [6, 7, 7, 6, 6]
statistic, pvalue = stats.ttest_rel(arr1, arr2)
print('statistic={}, pvalue={}'.format(statistic, pvalue))
# 輸出:statistic=2.449489742783178, pvalue=0.07048399691021993
# 假設置信度爲 0.05 ,由於 p 值大於置信度 0.05 ,接受原假設。所以 arr1 與 arr2 所代表的總體均值相等。

注:Z 分佈與 T 分佈,是兩個分佈,概率函數公式的存在差異,T 分佈較 Z 分佈多了一個自由度的變量,懲罰小樣本,增加其拒絕 H0 的難度,因而小樣本採用 T 檢驗,優於 Z 檢驗。

0x03 比例檢驗

1.單比例檢驗

計算未知成功比例 (prop) 的檢驗。它將樣本 x 中的成功計數和樣本 n 中的觀察計數作爲輸入,比較樣本(p0)和總體(prop)的比率是否相同,以此來檢驗樣本和總體之間的差異性。

零假設:

  • H0: prop=p0

  • H0: prop<p0

  • H0: prop>p0

例子:

  • 汽車製造商聲稱不安全的汽車不超過 10% ,檢查了 15 輛汽車的安全性,發現 3 輛不安全,通過假設檢驗判斷不安全汽車的概率是否不超過 10% 。

實現代碼:

# 顯著性水平 α = 0.05 ,原假設 H0 :汽車不安全性小於 0.1 ;備擇假設 H1 :汽車不安全性大於 0.1
from statsmodels.stats.proportion import proportions_ztest
stat, pval = proportions_ztest(3, 15, 0.1, alternative='larger')
print('{0:0.4f}'.format(pval))
# 輸出:0.1664
# 由於p大於0.05,接受原假設。

2.雙比例檢驗

計算檢驗以比較兩個總體的成功比例(p1 和 p2)。它將每個樣本中的成功計數(x1 和 x2)和每個樣本中的觀察計數(n1 和 n2)作爲輸入。

零假設:

  • H0: p1 = p2

  • H0: p1 < p2

  • H0: p1 > p2

例子:

  • 調查南方人還是北方人更喜歡喫甜豆花

實現代碼:

from statsmodels.stats.proportion import proportions_ztest
# H0:假設南方人和北方人愛喫甜豆花的比例沒有差異;H1:假設南方人和北方人愛喫甜豆花的比例有差異;
z_score, p_value = sp.proportions_ztest(
    [81, 48], [180, 150], alternative='two-sided')
print('p_value={}'.format(p_value))
print(z_score, p_value)
# 輸出:0.0160
# 由於 p 小於 0.05 ,接受備選假設,南方人與北方人在喜愛喫甜豆花的比例上有顯著差別,南方人愛喫甜豆花比例更高。

0x0FF 總結

1. Z 分佈和 T 分佈

  • Z 分佈,標準正態分佈。

  • T 分佈,正態分佈,v爲自由度,隨着v增加,形態最終趨向標準正態分佈。

T 分佈較 Z 分佈多了一個自由度的變量,懲罰小樣本,增加其拒絕 H0 的難度,因而小樣本採用 T 檢驗,優於 Z 檢驗。

2. Z 檢驗和 T 檢驗的區別

  • Z 檢驗用於大樣本(n > 30),或總體方差已知;

  • T 檢驗用於小樣本(n < 30),且總體方差未知時,適用性優於 Z 檢驗,而在大樣本時,Z 檢驗和 T 檢驗的結論趨同。

下一篇文章,我們將介紹 F 檢驗和 卡方 檢驗的應用及代碼實現。

參考文獻

[1] Z檢驗. https://zh.wikipedia.org/wiki/Z%E6%A3%80%E9%AA%8C
[2] 假設檢驗(Hypothesis Testing). https://www.cnblogs.com/HuZihu/p/9692828.html
[3] scipy.stats.ttest_rel. https://docs.scipy.org/doc/scipy-0.7.x/reference/generated/scipy.stats.ttest_rel.html
[4] 利用python進行T檢驗. https://cloud.tencent.com/developer/article/1571275

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