統計學中的各種檢驗-scipy.stats和statsmodels.stats的使用


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檢驗有相同的計算形式:


 
Z檢驗的計算公式

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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM