用Python學分析 - 單因素方差分析


 

單因素方差分析(One-Way Analysis of Variance)

判斷控制變量是否對觀測變量產生了顯著影響

分析步驟

1. 建立檢驗假設

   - H0:不同因子水平間的均值無差異
  - H1:不同因子水平間的均值有顯著差異
  - 【注意】有差異,有可能是所有因子水平間都存在差異,也有可能只有兩個因子水平間的均值存在差異

2. 計算檢驗統計量F值

  F = MSA / MSE
  MSA = SSA / ( k - 1 )    MSA:組間均方, 對總體方差的一個估計
  MSE = SSE / ( n - k )    MSE:組內均方,不論H0是否為真,MSE都是總體方差的一個無偏估計
  SST = SSA + SSE        SST:總誤差平方和,反映全部觀測值的離散情況
       SSA:組間誤差平方和,也稱水平項誤差平方和,反映各因子水平(總體)的樣本均值之間的差異程度
       SSE: 組內誤差平方和

3. 確定P值

4. 方差分析表

5. 根據給定的顯著性水平,並作出決策

  根據F值進行假設檢驗
  根據選定的顯著性水平,F值大於臨界值時,將拒絕原假設
  根據P值進行假設檢驗

 6. 進一步分析

     方差齊性檢驗

     多重比較檢驗

  - 確定控制變量的不同水平對觀測變量的影響程度
  - 哪個水平的作用明顯區別於其他水平
  - 哪個水平的作用是不顯著
  - 等等

【python分析:用ols模塊進行計算】

 1 # 引入數據
 2 import pandas as pd
 3 data_value = { '無促銷':[23,19,17,26,28,23,24,30],
 4               '被動促銷':[26,22,20,30,36,28,30,32],
 5               '主動促銷':[30,23,25,32,48,40,41,46]}# 因變量
 6 da = pd.DataFrame( data_value ).stack()
 7 da.columns = ['水平','觀測值']
 8 
 9 # ols模塊進行分析
10 
11 from statsmodels.formula.api import ols
12 from statsmodels.stats.anova import anova_lm 
13 
14 formula = '{} ~ {}'.format(da.columns[1], da.columns[0])
15 model = ols( formula, da ).fit()
16 anovat = anova_lm(model)
17 print(anovat)

輸出結果:

【python分析:用自定義函數進行計算】

 1 def ANOVA_oneway( df, a = 0.05 ):
 2     from scipy.stats import f
 3     '''
 4     進行單因素方差分析
 5     輸入值:df - pd.DataFrame,第一列為水平,第二列為觀測值;a - 顯著性水平,默認為0.05
 6     返回類型:字典
 7     返回值:方差分析相關數據
 8     '''
 9     res = { 'SSA':0, 'SST':0 }
10     mu = df[df.columns[1]].mean()
11     da = df.groupby( df.columns[0] ).agg( {df.columns[1]:['mean','count']})
12     da.columns = ['mean','count']
13     res['df_A'] = len(list(da.index)) - 1        # 自由度
14     # 組間誤差平方和
15     for row in da.index:
16         res['SSA'] += (da.loc[row,'mean'] - mu )**2 * da.loc[row,'count']
17     # 總誤差平方和
18     for e in df[df.columns[1]].values:
19         res['SST'] += (e - mu )**2         
20     res['SSE'] = res['SST'] - res['SSA']         # 組內誤差平方和
21     res['df_E'] = len(df) - res['df_A'] - 1      # 殘差自由度
22     res['df_T'] = len(df) - 1                    # 總和自由度
23     res['MSA'] = res['SSA'] / res['df_A']        # 組間均方
24     res['MSE'] = res['SSE'] / res['df_E']        # 組內均方
25     res['F'] = res['MSA'] / res['MSE']           # F值
26     res['p_value'] = 1 - f(res['df_A'],res['df_E'] ).cdf( res['F'])  #p值
27     res['a'] = a
28     res['F_alpha'] = f(res['df_A'],res['df_E'] ).ppf( 1-a ) # 基於顯著性水平a的F臨界值 
29     return res
30 
31 def print_ANOVA_oneway( d, maxedg = 90 ):
32     '''
33     打印單因素方差分析表
34     輸入值:d - dict字典,包含分析表所需要的數據; maxedg - 打印輸出時裝飾分隔符的最大長度
35     '''
36     title = '【單因素方差分析表】'
37     print( title.center( maxedg ))
38     print( '=' *  maxedg )
39     print( '{:^12s}|{:^16s}|{:^6s}|{:^16s}|{:^12s}|{:^10s}|'.format('誤差來源','平方和','自由度','均方和','F','p值'))
40     print( '-' *  maxedg )
41     print( '{:8s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |{:>11.6f} |{:>10.3%} |'.format( '組間(因子影響)',d['SSA'],d['df_A'],d['MSA'],d['F'],d['p_value']))
42     print( '{:10s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |'.format( '組內(誤差)',d['SSE'],d['df_E'],d['MSE']))
43     print( '{:14s}|{:>18,.4f} |{:>8d} |'.format( '總和',d['SST'],d['df_T']))
44     print( '-' *  maxedg )
45     print('備注:顯著性水平為 {:.2%} 時,F的臨界值是 {:.6f}。'.format(d['a'],d['F_alpha']))
46 
47 
48 p = 0.95 # 設定置信度水平
49 maxedg = 93 # 設定輸出時裝飾分隔符的最大長度
50 # 計算並輸出單因素方差分析表
51 res = ANOVA_oneway( da, a = 1-p )
52 print_ANOVA_oneway( res, maxedg = maxedg )
View Code

 


免責聲明!

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



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