
久經考場的你肯定對于很多概念類題目里問到的 “區別和聯系” 不陌生,與之類似,在統計領域要研究的是數據之間的區別和聯系 ,也就是差異性分析和相關性分析。本節我們重點關注數據的差異性分析。
我們知道,比較兩個數之間的大小,要么前后兩者求差,要么求比。差值大于零說明前者大于后者。比值大于1說明分子大于分母。
那么如何比較兩組數據的差異性呢?大道至簡,其實和上面原理類似
我們先從簡單的看起,先比較一組數和一個給定數的差異,即,單個總體的差異性分析:
常見的單個總體差異性的假設檢驗分為3個類型:均值、比例、方差
顧名思義,就是檢驗指定值與樣本均值的差異,按是否已知可以分2種情況:
接下來我們用代碼舉例實現一下你就明白怎么用了:
例5.1 檢驗一批廠家生產的紅糖是否夠標重
監督部門稱了50包標重500g的紅糖,均值是498.35g,少于所標的500g。對于廠家生產的這批紅糖平均起來是否夠份量,需要統計檢驗。
分析過程: 由于廠家聲稱每袋500g,因此原假設為總體均值等于500g(被懷疑對象總是放在零假設)。而且由于樣本均值少于500g(這是懷疑的根據),把備擇假設設定為總體均值少于500g (上面這種備選假設為單向不等式的檢驗稱為單側檢驗,而備選假設為不等號“”的稱為雙側檢驗,后面會解釋)
于是我們有了原假設和備擇假設
:
引入相關庫、讀取數據如下
from scipy import stats
import scipy.stats
import numpy as np
import pandas as pd
import statsmodels.stats.weightstats
data = [493.01,498.83,494.16,500.39,497.63,499.72,493.41,498.97,501.94,503.45,497.47,494.19,500.99,495.81,499.63,494.91,498.90,502.43,491.34,497.50,505.95,496.56,501.66,492.02,497.68,493.48,505.40,499.21,505.84,499.41,505.65,500.51,489.53,496.55,492.26,498.91,496.65,496.38,497.16,498.91,490.98,499.97,501.21,502.85,494.35,502.96,506.21,497.66,504.66,492.11]
進行z檢驗:
z, pval = statsmodels.stats.weightstats.ztest(data, value=500,alternative = 'smaller')
# 'two-sided': 樣本均值與給定的總體均值不同
# 'larger' : 樣本均值小于給定總體均值
# 'smaller' : 樣本均值大于給定總體均值
print(z,pval)
# -2.6961912076362085 0.0035068696715304876
結論: 選擇顯著性水平 0.05 的話,P=0.0035 < 0.05
, 故應該拒絕原假設。具體來說就是該結果傾向于支持平均重量小于500g的備則假設。
例5.2 檢驗汽車實際排放是否低于其聲稱的排放標準
汽車廠商聲稱其發動機排放標準的一個指標平均低于20個單位。在抽查了10臺發動機之后,得到下面的排放數據:
17.0 21.7 17.9 22.9 20.7 22.4 17.3 21.8 24.2 25.4
該樣本均值為21.13.究竟能否由此認為該指標均值超過20?
分析過程: 由于廠家聲稱指標平均低于20個單位,因此原假設為總體均值等于20個單位(被懷疑對象總是放在零假設)。而且由于樣本均值大于20(這是懷疑的根據),把備擇假設設定為總體均值大于20個單位
于是我們有了原假設和備擇假設
:
讀取數據如下
data = [17.0, 21.7, 17.9, 22.9, 20.7, 22.4, 17.3, 21.8, 24.2, 25.4]
進行t檢驗如下:
import scipy.stats
t, pval = scipy.stats.ttest_1samp(a = data, popmean=20,alternative = 'greater')
# 說明
# a 為給定的樣本數據
# popmean 為給定的總體均值
# alternative 定義備擇假設。以下選項可用(默認為“two-sided”):
# ‘two-sided’:樣本均值與給定的總體均值(popmean)不同
# ‘less’:樣本均值小于給定總體均值(popmean)
# ‘greater’:樣本均值大于給定總體均值(popmean)
print(t, pval)
# '''
# P= 0.004793 < 5%, 拒絕原假設,接受備擇假設樣本
# '''
結論: 選擇顯著性水平 0.01 的話,P=0.1243 > 0.05
, 故無法拒絕原假設。具體來說就是該結果無法支持指標均值超過20的備則假設。
例5.3 檢驗高爾夫球場女性球員比例是否因促銷活動而升高
某高爾夫球場去年打球?????????的人當中有20%是女性,為了增加女性球員的比例,該球場推出了一項促銷活動來吸引更多的女性參加高爾夫運動,在活動實施了1個月后,球場的研究者想通過統計分析研究確定高爾夫球場的女性球員比例是否上升,收集到了400個隨機樣本,其中有100是女性
分析過程: 由于研究的是女性球員所占的比例是否上升,因此選擇上側檢驗比較合適,備擇假設是比例大于20%
:
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
count = 100
nobs = 400
p_0 = 0.2
p_bar = count/nobs
p_0 = 0.2
n = 400
# 執行單一樣本比例檢驗 statsmodels.stats.proportion.proportions_ztest
z_statistic, p_value = proportions_ztest(count, nobs, value = p_0,alternative='larger',prop_var = value)
# 注:statsmodels.stats.proportion.proportions_ztest 的函數有幾個問題:講在第八節之后說明,感興趣的讀者請持續關注
# 打印結果
print("z統計量:", z_statistic)
print("p值:", p_value)
#z統計量: 2.4999999999999996
#p值: 0.006209665325776138
count = 100
nobs = 400
p_0 = 0.2
p_bar = count/nobs
p_0 = 0.2
n = 400
def calc_z_score(p_bar, p_0, n):
z = (p_bar - p_0) / (p_0 * (1 - p_0) / n)**0.5
return z
z = calc_z_score(p_bar, p_0, n)
p = stats.norm.sf(z)
# 打印結果
print("z統計量:", z)
print("p值:", p)
# z統計量: 2.4999999999999996
# p值: 0.006209665325776138
結論: 選擇顯著性水平 0.05 的話,P=0.0062 < 0.05
, 拒絕原假設。具體來說就是該結果支持特定的促銷活動能夠提升該球場女性運動員比例的備則假設。
import numpy as np
from scipy import stats
def chi2test(sample_var, sample_num,sigma_square,side, alpha=0.05):
'''
參數:
sample_var--樣本方差
sample_num--樣本容量
sigma_square--H0方差
返回值:
pval
'''
chi_square =((sample_num-1)*sample_var)/(sigma_square)
p_value = None
if side == 'two-sided':
p = stats.chi2(df=sample_num-1).cdf(chi_square)
p_value = 2*np.min([p, 1-p])
elif side == 'less':
p_value = stats.chi2(df=sample_num-1).cdf(chi_square)
elif side == 'greater':
p_value = stats.chi2(df=sample_num-1).sf(chi_square)
return chi_square,p_value
例5.4 檢驗公交車到站時間的方差是否比規定標準大
某市中心車站為規范化提升市民對于公交車到站時間的滿意度,對于公交車的到站時間管理做了規定,標準是到站時間的方差不超過4。為了檢驗時間的到站時間的方差是否過大,隨機抽取了24輛公交車的到站時間組成一個樣本,得到的樣本方差是 ,假設到站時間的總體分布符合正態分布,請分析總體方差是否過大。
分析過程: 由于研究的是方差是否過大,因此選擇上側檢驗比較合適,備擇假設是方差大于4
于是我們有了原假設和備擇假設
:
chi_square,p_value = chi2test(sample_var = 4.9, sample_num = 24, sigma_square = 4,side='greater')
print("p值:", p_value)
# p值: 0.2092362676676498
結論: 選擇顯著性水平 0.05 的話,P=0.2092 > 0.05
, 無法拒絕原假設。具體來說就是該結果不支持方差變大的備則假設。
例5.5 檢驗某考試中心升級題庫后考生分數的方差是否有顯著變化
某數據分析師認證考試機構CDA考試中心,歷史上的持證人考試分數的方差為 ,現在升級了題庫,該考試中心希望新型考題的方差保持在原有水平上,為了研究該問題,收集到了30份新考題的考分組成的樣本,樣本方差是,在 的顯著性水平下進行假設檢驗。
分析過程:由于目標是希望考試分數的方差保持原有水平,因此選擇雙側檢驗
于是我們有了原假設和備擇假設
:
p_value = chi2test(sample_var = 162, sample_num = 30, sigma_square = 100,side='two-sided')
print("p值:", p_value)
# p值: 0.07213100536907469
結論: 選擇顯著性水平 0.05 的話,P=0.0721 > 0.05
, 故無法拒絕原假設。具體來說就是不支持方差發生了變化的備則假設。
例5.6(數據:drug.txt) 檢驗某藥物在實驗組的指標是否低于對照組
為檢測某種藥物對情緒的影響,對實驗組的100名服藥者和對照組的150名非服藥者進行心理測試,得到相應的某指標。需要檢驗實驗組指標的總體均值是否大于對照組的指標的總體均值。這里假定兩個總體獨立地服從正態分布。相應的假設檢驗問題為:
分析過程:由于目標是檢驗實驗組指標的總體均值是否大于對照組的指標的總體均值,因此選擇上側檢驗
于是我們有了原假設和備擇假設
:
data = pd.read_table("./t-data/drug.txt",sep = ' ')
data.sample(5)
ah | id |
---|---|
4.4 | 2 |
6.8 | 2 |
9.6 | 2 |
4.8 | 2 |
13.2 | 1 |
a = data[data['id']==1]['ah']
b = data[data['id']==2]['ah']
'''
H0: 實驗組的均值等于對照組
H1: 實驗組的均值大于對照組
'''
t, pval = scipy.stats.ttest_ind(a,b,alternative = 'greater')
print(t,pval)
# 0.9109168350628888 0.18161186154576608
結論: 選擇顯著性水平 0.05 的話,p = 0.1816 > 0.05
,無法拒絕H0,具體來說就是該結果無法支持實驗組均值大于對照組的備則假設。
例5.7(數據: diet.txt) 檢驗減肥前后的重量是否有顯著性差異(是否有減肥效果)
這里有兩列50對減肥數據。其中一列數據(變量名before)是減肥前的重量,另一列(變量名after)是減肥后的重量(單位: 公斤),人們希望比較50個人在減肥前和減肥后的重量。
分析過程:這里不能用前面的獨立樣本均值差的檢驗,這是因為兩個樣本并不獨立。每一個人減肥后的重量都和自己減肥前的重量有關,但不同人之間卻是獨立的,所以應該用配對樣本檢驗。同時,由于研究的是減肥前后的重量變化,期望減肥前的重量大于減肥后的重量,所以備擇假設是期望減肥前的重量大于減肥后的重量
于是我們有了原假設和備擇假設:
:
data = pd.read_table("./t-data/diet.txt",sep = ' ')
data.sample(5)
before | after |
---|---|
58 | 50 |
76 | 71 |
69 | 65 |
68 | 76 |
81 | 75 |
a = data['before']
b = data['after']
stats.ttest_rel(a, b,alternative = 'greater')
# Ttest_relResult(statistic=3.3550474801424173, pvalue=0.000769424325484219)
結論 選擇顯著性水平 0.05 的話,p = 0.0007 < 0.05
,故應該拒絕原假設。具體來說就是該結果傾向支持減肥前后的重量之差大于零(即減肥前重量大于減肥后,也就是有減肥效果)的備則假設。
import numpy as np
import scipy.stats as stats
def proportion_test(p1, p2, n1, n2, side='two-sided'):
"""
參數:
p1: 樣本1的比例
p2: 樣本2的比例
n1: 樣本1的數量
n2: 樣本2的數量
side: 假設檢驗的方向,可選'two-sided'(雙側檢驗,默認), 'greater'(右側檢驗), 'less'(左側檢驗)
返回值:
z_value: Z統計量的值
p_value: 對應的p值
"""
p = (p1 * n1 + p2 * n2) / (n1 + n2)
se = np.sqrt(p * (1 - p) * (1 / n1 + 1 / n2))
z_value = (p1 - p2) / se
if side == 'two-sided':
p_value = 2 * (1 - stats.norm.cdf(np.abs(z_value)))
elif side == 'greater':
p_value = 1 - stats.norm.cdf(z_value)
elif side == 'less':
p_value = stats.norm.cdf(z_value)
else:
raise ValueError("Invalid side value. Must be 'two-sided', 'greater', or 'less'.")
return z_value, p_value
例5.8 檢驗不同保險客戶的索賠率是否存在差異
某保險公司抽取了單身與已婚客戶的樣本,記錄了他們在一段數據內的索賠次數,計算了索賠率,現在需要檢驗兩種保險客戶的索賠率是否存在差異
分析過程:由于目標比例是否有差異,因此選擇比例之差的雙側檢驗
于是我們有了原假設和備擇假設
:
p1 = 0.14
p2 = 0.09
n1 = 250
n2 = 300
z_value, p_value = proportion_test(p1, p2, n1, n2, side='two-sided')
# 選擇雙側檢驗 alternative = 'two-sided'
print("Z_value:", z_value)
print("p_value:", p_value)
# Z_value: 1.846189280616294
# p_value: 0.0648647268570739
結論 選擇顯著性水平 0.05 的話,p = 0.0648 > 0.05
,故應該拒絕原假設。具體來說就是該結果傾向支持兩種保險客戶的索賠率存在差異的備則假設。
import numpy as np
from scipy import stats
def f_test_by_s_square(n1, n2, s1_square,s2_square, side ='two-sided'):
"""
n1 :樣本1的數量;n2 :樣本2的數量
s1_square:樣本1的方差;s2_square:樣本2的方差
# F_value :F統計量的值;# p_value :對應的p值
"""
F_value = s1_square/s2_square
F = stats.f(dfn = n1-1, dfd = n2-1)
if side=='two-sided':
print("two-sided")
p_value = 2*min(F.cdf(F_value), 1-F.cdf(F_value))
return F_value,p_value
elif side=='greater':
print("greater")
p_value = 1-F.cdf(F_value)
return F_value,p_value
例5.9 檢驗不同公交公司的校車到達時間的方差是否有差異
某學校的校車合同到期,先需要在A、B兩個校車供應公司中選擇一個,才有到達時間的方差作為衡量服務質量的標準,較低方差說明服務質量穩定且水平較高,如果方差相等,則會選擇價格更低的公司,,如果方差不等,則優先考慮方差更低的公司。 現收集到了A公司的26次到達時間組成一個樣本,方差68,B公司16次到達時間組成一個樣本,方差是30,請檢驗AB兩個公司的到達時間方差。
分析過程:由于目標是希望的方差保持原有水平,因此選擇雙側檢驗。兩總體方差之比用F檢驗,將方差較大的A視為總體1
于是我們有了原假設和備擇假設
:
f_statistic , p_value= f_test_by_s_square(n1=26, n2=16,s1_square=78,s2_square=20,side='two-sided')
# 選擇雙側檢驗所以side='two-sided'
# 打印檢驗結果
print("F statistic:", f_statistic)
print("p-value:", p_value)
#two-sided
#F statistic: 3.9
#p-value: 0.00834904415829052
結論 選擇顯著性水平 0.05 的話,p = 0.0083 < 0.05
,故拒絕原假設。結果傾向支持AB兩個公司的到達時間方差存在差異的備則假設。
例5.10 檢驗修完Python課程的學生是否比修完數據庫課程的學生考CDA的成績方差更大
某高校數據科學專業的學生,修完一門數據庫課程的41名學生考CDA的方差,修完Python課程的31名學生考CDA的方差是,這些數據是否表明,修完數據庫的學生要比修完Python的學生CDA成績的方差更大?
分析過程:由于目標是希望修完Python的學生CDA成績的方差更大,因此選擇上側檢驗。兩總體方差之比用F檢驗,將方差較大的數據庫課程的考試成績視為總體1,另一個視為總體2,于是我們有了原假設和備擇假設
:
f_statistic , p_value= f_test_by_s_square(n1=41, n2=31,s1_square=120,s2_square=80,side='greater')# 打印檢驗結果
# 選擇上側檢驗所以side='greater'
print("F statistic:", f_statistic)
print("p-value:", p_value)
結論 選擇顯著性水平 0.05 的話,p = 0.1256 > 0.05,故無法原假設。結果無法支持修完數據庫的學生要比修完Python的學生CDA成績的方差更大的備則假設。
關于知識的學習,你會發現有很多相似的邏輯,抓住問題的本質去理解的話就沒那么復雜了,比如概念題里面的 區別和聯系 延伸到數據分析里的差異性和相關性;再比如計算機數據結構里的 樹、森林、網絡 到機器學習里面的決策樹、隨機森林、神經網絡;再比如從 互聯網、區塊鏈到元宇宙,都是想通過技術的手段去刻畫客觀世界;算法應用里面的圖像識別、語音識別,替代人的眼耳鼻舌身意中的前二者去感知世界。抓住了問題的本質不僅可以幫助我們理解知識,還可以將一個領域的知識或模型遷移到另一個領域加以創新和應用。
假設檢驗背后的故事:統計學史上最著名的女士品茶
下期將為大家帶來《統計學極簡入門》之方差分析
這里分享一個你一定用得到的小程序——CDA數據分析師考試小程序。
它是專為CDA數據分析認證考試報考打造的一款小程序??梢詭湍憧焖賵竺荚?、查成績、查證書、查積分,通過該小程序,考生可以享受更便捷的服務。
掃碼加入CDA小程序,與圈內考生一同學習、交流、進步!
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25