方差分析原理及python演練

前言

檢驗多個總體均值是否相等,通過分析察數據的誤差判斷各總體均值是否相等

相關概念:
  • 因素或因子(factor):所要檢驗的對象,要分析行業對投訴次數是否有影響,行業是要檢驗的因素或因子
  • 水平或處理(treatment):因素的不同表現,即每個自變量的不同取值稱爲因素的水平
  • 觀察值:在每個因素水平下得到的樣本值,每個行業被投訴的次數就是觀察值
  • 試驗:這裏只涉及一個因素,因此稱爲單因素四水平的試驗
  • 總體:因素的每一個水平可以看作是一個總體,比如零售業、旅遊業、航空公司、家電製造業可以看作是四個總體
  • 樣本數據:被投訴次數可以看作是從這四個總體中抽取的樣本數據

實例
爲了對幾個行業的服務質量進行評價,消費者協會在四個行業分別抽取了不同的企業作爲樣本。最近一年中消費者對總共23家企業投訴的次數如下表
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-03I5r1EO-1591344405436)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p33)]

實例分析

分析四個行業之間的服務質量是否有顯著差異,也就是要判斷“行業”對“投訴次數”是否有顯著影響

如果它們的均值相等,就意味着“行業”對投訴次數是沒有影響的,即它們之間的服務質量沒有顯著差異;如果均值不全相等,則意味着“行業”對投訴次數是有影響的,它們之間的服務質量有顯著差異

先看下散點圖分佈情況

F=[1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4]
S=[57,66,49,40,34,53,44,68,39,29,45,56,51,31,49,21,34,40,44,51,65,77,58]
df=pd.DataFrame(np.array(data).T,columns=["F","S"])
avg=df.groupby(["F"])["S"].mean()
plt.scatter(df["F"],df["S"])
plt.scatter(avg.index,avg,color='red')

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-48mliOzH-1591344405439)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENNote/p28?hash=9cd34a9c19855f3ae07de38635890350)]

  • 不同行業被投訴的次數是有明顯差異的
  • 即使是在同一個行業,不同企業被投訴的次數也明顯不同
  • 家電製造也被投訴的次數較高,航空公司被投訴的次數較低
  • 行業與被投訴次數之間有一定的關係
問題
  • 僅從散點圖上觀察還不能提供充分的證據證明不同行業被投訴的次數之間有顯著差異
  • 這種差異也可能是由於抽樣的隨機性所造成的
  • 需要有更準確的方法來檢驗這種差異是否顯著,也就是進行方差分析
  • 之所以叫方差分析,因爲雖然我們感興趣的是均值,但在判斷均值之間是否有差異時則需要藉助於方差

基本思想

基本概念
  • 比較兩類誤差,以檢驗均值是否相等
  • 比較的基礎是方差比
  • 如果系統(處理)誤差顯著地不同於隨機誤差,則均值就是不相等的;反之,均值就是相等的

水平的均值
假定從第i個總體中抽取一個容量爲nin_i的簡單隨機樣本,第i個總體的樣本均值爲該樣本的全部觀察值總和除以觀察值的個數
xi=j=1nini\overline{x}_i=\frac{\sum_{j=1}^{n_i}}{n_i}
全部觀察值的總均值
全部觀察值的總和除以觀察值的總個數
x=i=1kj=1nixijn\overline{\overline{x}}=\frac{\sum_{i=1}^k\sum_{j=1}^{n_i}x_{ij}}{n}
n=i=1nnin=\sum_{i=1}^nn_i

隨機誤差:
  • 因素的同一水平(總體)下,樣本各觀察值之間的差異

  • 比如,同一行業下不同企業被投訴次數是不同的

  • 這種差異可以看成是隨機因素的影響,稱爲隨機誤差

系統誤差:
  • 因素的不同水平(不同總體)下,各觀察值之間的差異
  • 比如,不同行業之間的被投訴次數之間的差異
  • 這種差異可能是由於抽樣的隨機性所造成的,也可能是由於行業本身所造成的,後者所形成的誤差是由系統性因素造成的,稱爲系統誤差
組內方差:

SSE=i=1kj=1ni(xijxi)2SSE=\sum_{i=1}^k\sum_{j=1}^{n_i}(x_{ij}-\overline{x}_i)^2

  • 因素的同一水平(同一個總體)下樣本數據的方差
  • 比如,零售業被投訴次數的方差
  • 組內方差只包含隨機誤差
組間方差:

SSE=i=1kni(xix)2SSE=\sum_{i=1}^kn_i(\overline{x}_{i}-\overline{\overline{x}})^2
nin_i爲第i個總體樣本觀察值的個數

  • 因素的不同水平(不同總體)下各樣本之間的方差
  • 比如,四個行業被投訴次數之間的方差
  • 組間方差既包括隨機誤差,也包括系統誤差
總誤差平方和 SST:

全部觀察值與總平均值的離差平方和,反映全部觀察值的離散狀況
SST=i=1kj=1ni(xijx)2=SSA+SSESST=\sum_{i=1}^k\sum_{j=1}^{n_i}(x_{ij}-\overline{\overline{x}})^2=SSA+SSE

方差的比較:
  • 若不同行業對投訴次數沒有影響,則組間誤差中只包含隨機誤差,沒有系統誤差。這時,組間誤差與組內誤差經過平均後的數值就應該很接近,它們的比值就會接近1

  • 若不同行業對投訴次數有影響,在組間誤差中除了包含隨機誤差外,還會包含有系統誤差,這時組間誤差平均後的數值就會大於組內誤差平均後的數值,它們之間的比值就會大於1

  • 這個比值大到某種程度時,就可以說不同水平之間存在着顯著差異,也就是自變量對因變量有影響

  • 判斷行業對投訴次數是否有顯著影響,實際上也就是檢驗被投訴次數的差異主要是由於什麼原因所引起的。如果這種差異主要是系統誤差,說明不同行業對投訴次數有顯著影響

方差分析的前提:
每個總體都應服從正態分佈
  • 對於因素的每一個水平,其觀察值是來自服從正態分佈總體的簡單隨機樣本
  • 比如,每個行業被投訴的次數必需服從正態分佈
各個總體的方差必須相同
  • 各組觀察數據是從具有相同方差的總體中抽取的
  • 比如,四個行業被投訴次數的方差都相等
觀察值是獨立的
  • 比如,每個行業被投訴的次數與其他行業被投訴的次數獨立

在上述假定條件下,判斷行業對投訴次數是否有顯著影響,實際上也就是檢驗具有同方差的四個正態總體的均值是否相等

假設檢驗

原假設成立,即H0: μ1 = μ2 = μ3 = μ4
假設檢驗的理解可以參見:https://blog.csdn.net/Andy_shenzl/article/details/81453509

  • 四個行業被投訴次數的均值都相等意味着每個樣本都來自均值爲μ、方差爲σ^2的同一正態總體
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AlevWsyw-1591344405442)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p36)]

備擇假設成立,即H1: μ1 μ2 μ3 μ4 不完全相等

  • 至少有一個總體的均值是不同的,四個樣本分別來自均值不同的四個正態總體

SST反映全部數據總的誤差程度;SSE反映隨機誤差的大小;SSA反映隨機誤差和系統誤差的大小
如果原假設成立,則表明沒有系統誤差,組間平方和SSA除以自由度後的均方與組內平方和SSE和除以自由度後的均方差異就不會太大;如果組間均方顯著地大於組內均方,說明各水平(總體)之間的差異不僅有隨機誤差,還有系統誤差,判斷因素的水平是否對其觀察值有影響,實際上就是比較組間方差與組內方差之間差異的大小

均方MS

各誤差平方和的大小與觀察值的多少有關,爲消除觀察值多少對誤差平方和大小的影響,需要將其平均,這就是均方,也稱爲方差,計算方法是用誤差平方和除以相應的自由度

各自自由度
  • SST 的自由度爲n-1,其中n爲全部觀察值的個數

  • SSA的自由度爲k-1,其中k爲因素水平(總體)的個數

  • SSE 的自由度爲n-k

F統計量

將MSA(組間方差,SSA的均方,記爲MSA)和MSE(組內方差,SSE的均方,記爲MSE)進行對比,即得到所需要的檢驗統計量F

F=MSAMSE F(k1,nk)F=\frac{MSA}{MSE} ~ F(k-1,n-k)

求解一下上例的F值

def SSE(a,b):
    s=0
    A=np.array(a)
    #總體均值
    avg_t=np.mean(b)
    for x in set(a):
        #先求組內均值
        avg_i=sum(np.where(A==x,b,0))/a.count(x)
        s=s+a.count(x)*pow(avg_i-avg_t,2)
    return s
    
def SSA(a,b):
    s=0
    A=np.array(a)
    for x in set(a):
        #先求組內均值
        avg_i=sum(np.where(A==x,b,0))/a.count(x)
        #取出第i組的值
        B=np.array(S)[np.where(list(np.where(A==x,b,0)))]
        #print(B)
        for y in B:
            s=s+pow(y-avg_i,2)
            
    return s
def F_s(a,b):
    k=len(set(a))
    n=len(a)
    f=(SSE(F,S)/(k-1))/(SSA(F,S)/(n-k))
    return f
F_s(F,S)

3.4066426904716036

根據給定的顯著性水平,在F分佈表中查找與第一自由度df1=k-1、第二自由度df2=n-k 相應的臨界值

  • 若F>Fα ,則拒絕原假設H0 ,表明均值之間的差異是顯著的,所檢驗的因素對觀察值有顯著影響
  • 若F<Fα ,則不拒絕原假設H0 ,不能認爲所檢驗的因素對觀察值有顯著影響

方差分析中的多重比較

  • 通過對總體均值之間的配對比較來進一步檢驗到底哪些均值之間存在差異

  • 可採用Fisher提出的最小顯著差異方法,簡寫爲LSD

  • LSD方法是對檢驗兩個總體均值是否相等的t檢驗方法的總體方差估計而得到的

LSD方法:

對k組中的兩組的平均數進行比較,當兩組樣本容量分別爲ni,nj都爲時,有
t=XiXjMSE(1ni+1nj) t(dfw)t=\frac{\overline{X_i}-\overline{X_j}}{\sqrt{MSE(\frac1{n_i}+\frac1{n_j})}}~t(df_w)
如果XiXj>ta/2MSE(1ni+1nj)|\overline{X_i}-\overline{X_j}|>t_{a/2}\sqrt{MSE(\frac1{n_i}+\frac1{n_j})}則認爲u1u_1u2u_2有顯著差異,否則認爲沒有顯著差異

LSD法進行的是兩兩比較的t檢驗。所不同的是,在滿足方差齊性的前提下,LSD法採用所有樣本的聯合方差來估計均數差的標準誤,而不是要比較的兩個樣本的聯合方差

當兩組均數差大於LSD時,說明差異達到顯著的水平,也就可以拒絕零假設,認爲兩組均數不相等。需要注意的是,LSD法單次比較的檢驗水準仍然爲α\alpha。LSD法檢驗的靈敏度最高,但是會因爲對比的頻數增加使得第一類型錯誤概率增加。爲解決該問題,便出現了Sidak法和Bonferroni法。

https://blog.csdn.net/huangguohui_123/article/details/103966000

多因素方差分析

無交互效應的多因素方差分析
有交互效應的多因素方差分析

主效應與交互效應

主效應(main effect):各個因素對觀測變量的單獨影響稱爲主效應。
交互效應(interaction effect):各個因素不同水平的搭配所產生的新的影響稱爲交互效應。

雙因素方差分析的類型

雙因素方差分析中因素A和B對結果的影響相互獨立時稱爲無交互效應的雙因素方差分析。
如果除了A和B對結果的單獨影響外還存在交互效應,這時的雙因素方差分析稱爲有交互效應的雙因素方差分析 。

無交互效應的雙因素方差分析模型

離差平方和的分解:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fTgDBnkh-1591344405445)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p39)]

有交互效應的雙因素方差分析模型

離差平方和的分解:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FRjayLXU-1591344405448)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p41)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fLIQ1Spl-1591344405452)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p42)]

雙因素方差分析的步驟
提出假設
  • 要說明因素A有無顯著影響,就是檢驗如下假設:

H0:因素A不同水平下觀測變量的總體均值無顯著差異。

H1:因素A不同水平下觀測變量的總體均值存在顯著差異。

  • 要說明因素B有無顯著影響,就是檢驗如下假設:

H0:因素B不同水平下觀測變量的總體均值無顯著差異。

H1:因素B不同水平下觀測變量的總體均值存在顯著差異。

  • 在有交互效應的雙因素方差中,要說明兩個因素的交互效應是否顯著,還要檢驗第三組零假設和備擇假設:

H0:因素A和因素B的交互效應對觀測變量的總體均值無顯著差異。

H1:因素A和因素B的交互效應對觀測變量的總體均值存在顯著差異。

構造統計量

在原假設成立的情況下,三個統計量分別服從自由度爲(r-1,rs(m-1))、(s-1,rs(m-1))、((r-1)(s-1),rs(m-1))的F分佈。
FA=MSAMSE,FB=MSBMSE,FAB=MSABMSEF_A=\frac{MSA}{MSE}\,, F_B=\frac{MSB}{MSE} \,,F_{AB}=\frac{MSAB}{MSE}

利用原假設和樣本數據分別計算3個F統計量的值和其對應的p值,對比p值和α,結合原假設作出推斷。若p<α,則拒絕關於這個因素的原假設,得出此因素不同水平下觀測變量各總體均值存在顯著差異的結論。

實例演示
# # 呷哺呷哺2個因素:環境等級,食材等級
from scipy import stats  
import pandas as pd  
import numpy as np  
from statsmodels.formula.api import ols  
from statsmodels.stats.anova import anova_lm  

  
environmental =  [5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1]       
ingredients    = [5,4,3,2,1,5,4,3,2,1,5,4,3,2,1,5,4,3,2,1,5,4,3,2,1]    
score      =     [5,5,4,3,2,5,4,4,3,2,4,4,3,3,2,4,3,2,2,2,3,3,3,2,1]  
  
data = {'E':environmental, 'I':ingredients, 'S':score}  
df = pd.DataFrame(data)  

formula = 'S~E+I+E:I'                           
                                                 
model = ols(formula,df).fit()                   
results = anova_lm(model)                       
print (results) 
         df  sum_sq    mean_sq           F        PR(>F)
E          1.0    7.22   7.220000   54.539568  2.896351e-07
I          1.0   18.00  18.000000  135.971223  1.233581e-10
E:I        1.0    0.64   0.640000    4.834532  3.924030e-02
Residual  21.0    2.78   0.132381         NaN           NaN

E和I對結果有顯著影響,之間有交互

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