https://www.jianshu.com/p/ec35a505ba90
這里會羅列一些統計學中的檢驗方法,當然順序以筆者遇到的為准。
1.方差分析
1.1 概述
對於均值的檢驗,一般分為以下幾種情況:
- 某樣本均值與常數的比較
- 兩個樣本均值的比較
- 兩個以上樣本均值的比較
對於前兩種檢驗,用t檢驗和z檢驗完全可以handle,第三種也可以用t/z檢驗兩兩進行,但是畢竟耗時,用方差分析就可以解決這個問題了。
這個問題面試滴滴的時候有被問到,立志做數據科學家的朋友們,還是學習一下。
比較常用的方差分析方法包括:單因素方差分析、多因素方差分析、協方差分析、多元方差分析、重復測量方差分析、方差成分分析等。
1.2 常用術語
- 因素
因素是方差分析的研究對象,是一個獨立的變量,比如飲料的不用顏色就是因素。 - 水平
因素的取值就是水平,比如飲料顏色的紅、黃、藍、綠就是水平。 - 控制變量
方差分析中可以人為控制的變量,比如飲料的顏色。 - 隨機變量
與控制變量相對應就是不可以人為控制的變量。 - 觀察變量與觀察值
方差分析中受控制變量和隨機變量影響下觀察的目標成為觀察變量,觀測得到的數值就是觀察值。飲料再不同顏色的銷售額就是觀測變量,具體的取值就是觀察值。
1.3 單因素方差分析原理
進行方差分析的要滿足兩個前提:
- 總體服從正態分布
- 樣本滿足方差齊性
方差分析的目的是檢驗各個樣本的均值是否相等,原假設是樣本均值相等,備擇假設是樣本均值不相等。一般來說造成均值差異的原因有兩個: - 因素水平不同造成的差異,成為系統性誤差。
承接飲料這個案例,飲料顏色就是系統性誤差。系統性誤差用組間方差來衡量,當然組間方差有可以衡量隨機性誤差,但主要是為了衡量系統性誤差。 - 樣本抽樣隨機性造成的誤差,成為隨機性誤差。
同樣,飲料在不同商場的銷售額也不同,這是隨機性誤差。隨機性誤差用組內方差來衡量。
如果因素水平對觀察變量影響不大,那么組間方差只有隨機性誤差的影響,組間方差和組內方差的比接近於1,相反則大於1,當這個比值大於某個值的時候我們就可以得到顯著性差異的結論。方差分析就是通過比較方差做出接受或拒絕原假設的結論。
1.4 單因素方差分析案例
飲料案例,我們要觀察飲料的不同顏色對銷售額是不是有顯著的影響,基礎數據如下:

- 建立假設
原假設:飲料顏色對銷售額沒有顯著影響。
備擇假設:飲料顏色對銷售額有顯著影響。 - 計算樣本均值和總體均值
- 計算組間方差和和組內方差和
-
構造F檢驗統計量
這里注意自由度的問題:
F檢驗統計量計算過程 - 確定檢驗規則,做出決策
1)P值檢驗
根據F檢驗統計量計算P值,此處計算的P值為0.000466,小於顯著性水平0.05,拒絕原假設,接受備擇假設,即飲料顏色對銷售額有顯著影響。
P值是根據概率密度函數求的。
2)臨界值
臨界值是根據假設檢驗類型查表得到的,比如顯著性水平α=0.05,是雙側檢驗,F檢驗的臨界值是3.24,那么計算值F=10.486>3.24,是拒絕原假設,所以認為不同顏色是有顯著差異的。
1.5 python實現方差檢驗
很遺憾,python里沒有包直接做方差分析,但是自己實現一個類應該是很簡單的。
python里有方差齊性檢驗的包叫levene,在scipy里,直接調用scipy.stats.levene(rvs1, rvs2)
-- 2020.4.13更新
筆者原來說python里沒有方差檢驗的包,筆者說錯了,今天無意中發現
statsmodels.stats.power.FTestAnovaPower是可以進行方差檢驗的。
2.t檢驗
t檢驗的概念是通過比較不同數據之間的差值,以觀察數據之間有沒有顯著差異。適用於小樣本(30個以下),總體方差未知的情況。
t檢驗有幾個假設條件:
- 總體分布服從正態或近似服從正態分布。
- 檢驗定量數據,即數據大小是有意義的,對於分類數據的檢驗請移步卡方檢驗。
t檢驗有以下三種: -
單樣本t檢驗,檢驗單個樣本數據與某一個數據是否有顯著差異。比如檢驗燈泡平均壽命是不是等於3000小時。來看一下公式:
標准誤差計算方法
單樣本t檢驗計算公式
這個很簡單了,使用python的包就可以求解:
scipy.stats.ttest_1samp(data,pop_mean)其中,data是樣本數據,pop_mean是總體均值。一個小demo如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
data = pd.Series([15.6,16.2 ,22.5 ,20.5 ,16.4 ,19.4 ,16.6, 17.9 ,12.7, 13.9])
data_mean = data.mean()
data_std = data.std()
pop_mean=20
t,p_towTail = stats.ttest_1samp(data,pop_mean)
-
獨立樣本t檢驗
用於分析定類數據與定量數據之間的關系,如男女生的身高是否有顯著差異。獨立樣本t檢驗假設樣本來自於兩個不同的獨立總體,但方差相同,除了要求單樣本t檢驗的那些條件,還要求兩個樣本之間具有方差,需要進行方差齊性檢驗,參考方差分析。
計算方法我在網上找了一個ppt講解的很好:
image.png
python實現用的是scipy.stats.ttest_ind,來看一個小demo:
from scipy.stats import ttest_ind, levene
import pandas as pd
x = [20.5, 19.8, 19.7, 20.4, 20.1, 20.0, 19.0, 19.9]
y = [20.7, 19.8, 19.5, 20.8, 20.4, 19.6, 20.2]
print(levene(x,y))
print(ttest_ind(x, y))
#levene檢驗p值大於0.05認為是滿足方差齊性的,如果不滿足則加一個參數equal_var=False
print(ttest_ind(x,y,equal_var=False))
-
配對樣本t檢驗
配對樣本T檢驗用於分析配對定量數據之間的差異對比關系,這個就和獨立樣本t檢驗區分開了,要求樣本量相同且前后順序要一一對應。比如通過兩組數據的對比分析,判斷背景音樂是否會影響消費行為。配對樣本t檢驗可以通過差值轉化為單樣本t檢驗:
配對樣本t檢驗原理
python實現用的是scipy.stats.ttest_rel(data1,data2),來看一個小demo:
from scipy.stats import ttest_rel
import pandas as pd
x = [20.5, 18.8, 19.8, 20.9, 21.5, 19.5, 21.0, 21.2]
y = [17.7, 20.3, 20.0, 18.8, 19.0, 20.1, 20.0, 19.1]
# 配對樣本t檢驗
print(ttest_rel(x, y))
3.Z檢驗
Z檢驗和t檢驗其實一樣,都是對均值進行檢驗,但是不一樣的地方在於Z檢驗要求樣本量比較大,並且總體方差已知。由於t檢驗不要求總體方差已知,所以t檢驗的應用范圍比較廣。Z檢驗其實和t檢驗有相同的計算形式:

python實現用的是scipy.stats.weightstats.ztest(data1,data2),來看一個小demo:
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]
sw.ztest(arr, value=39)
當然了單樣本和雙樣本都可以做。Z檢驗就不過多介紹了。
4.F檢驗
如果大家還有印象,我們之前用F檢驗做過方差齊性分析。F檢驗還有一個廣為人知的名字叫聯合假設檢驗,主要用在方差分析中。

怎么實現我們之前已經講過了,用scipy.stats.levene這個准沒錯。
5.卡方檢驗
卡方檢驗是用於檢驗樣本實際值與理論值之間是否存在顯著差異,原假設是沒有顯著差異的。舉兩個好理解的例子:卡方檢驗可以檢驗男性或者女性對線上買生鮮食品有沒有區別;也可以檢驗不同城市級別的消費者對買SUV車有沒有什么區別。
具體計算過程可以看這篇文章,講的很好:卡方檢驗的實際應用
python實現用的是scipy.stats.chisquare,來看一個小demo:
import scipy.stats as ss
obs=[107,198,192,125,132,248]
exp=[167]*6
#拒絕域 1%的顯著水平,自由度5
#jjy=ss.chi2.isf(0.01,5)
#卡方
kf=ss.chisquare(obs,f_exp=exp).statistic
6.比率檢驗
這個真的是太神奇了,通常用在互聯網中,用來比較兩個比率有沒有顯著差異。
使用A方案的付費轉化率為30%,使用B方案的付費轉化率為34%,可以檢驗這兩個轉化率之間是否有顯著不同。本質和z檢驗一樣,把標准差換成了比例而已,可以用單樣本也可以用雙樣本。

其中π0是總體比率,p是樣本比率。
比率檢驗的演化
用python的話調用statsmodels.stats里的相關函數,來看個小demo:
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import zt_ind_solve_power
effect_size=proportion_effectsize(prop1=0.3, prop2=0.4, method=‘normal‘)
sample_size=zt_ind_solve_power(effect_size=effect_size, nobs1=None, alpha=0.05, power=0.8, ratio=1.0, alternative=‘two-sided‘)
這個包可以推廣到以上的F檢驗,t檢驗和Z檢驗。
基本上檢驗的方法和用途都說完了,希望起到啟發的作用,大家如有需要可以探索更多假設檢驗的方法。
作者:不分享的知識毫無意義
鏈接:https://www.jianshu.com/p/ec35a505ba90
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。