判斷控制變量是否對觀測變量產生了顯著影響python
- H0:不一樣因子水平間的均值無差別
- H1:不一樣因子水平間的均值有顯著差別
- 【注意】有差別,有多是全部因子水平間都存在差別,也有可能只有兩個因子水平間的均值存在差別api
F = MSA / MSE
MSA = SSA / ( k - 1 ) MSA:組間均方, 對整體方差的一個估計
MSE = SSE / ( n - k ) MSE:組內均方,不論H0是否爲真,MSE都是整體方差的一個無偏估計
SST = SSA + SSE SST:總偏差平方和,反映所有觀測值的離散狀況
SSA:組間偏差平方和,也稱水平項偏差平方和,反映各因子水平(整體)的樣本均值之間的差別程度
SSE: 組內偏差平方和ide
根據F值進行假設檢驗
根據選定的顯著性水平,F值大於臨界值時,將拒絕原假設
根據P值進行假設檢驗函數
方差齊性檢驗spa
多重比較檢驗code
- 肯定控制變量的不一樣水平對觀測變量的影響程度
- 哪一個水平的做用明顯區別於其餘水平
- 哪一個水平的做用是不顯著
- 等等orm
【python分析:用ols模塊進行計算】blog
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)
輸出結果:ip
【python分析:用自定義函數進行計算】ci
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 )