⽤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# 引⼊数据
2import 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()
lumns = ['⽔平','观测值']
8
9# ols模块进⾏分析
10
11from statsmodels.formula.api import ols
12from statsmodels.stats.anova import anova_lm
13
14 formula = '{} ~ {}'.lumns[1], da.columns[0])
15 model = ols( formula, da ).fit()
16 anovat = anova_lm(model)
17print(anovat)
输出结果:
【python分析:⽤⾃定义函数进⾏计算】
1def ANOVA_oneway( df, a = 0.05 ):
2from scipy.stats import f
3'''
4进⾏单因素⽅差分析
5输⼊值:df - pd.DataFrame,第⼀列为⽔平,第⼆列为观测值;a - 显著性⽔平,默认为0.05
6返回类型:字典
7返回值:⽅差分析相关数据
8'''
9 res = { 'SSA':0, 'SST':0 }
10 mu = lumns[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# 组间误差平⽅和
15for row in da.index:
16 res['SSA'] += (da.loc[row,'mean'] - mu )**2 * da.loc[row,'count']
17# 总误差平⽅和
18for e in lumns[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临界值
29return res
30
31def print_ANOVA_oneway( d, maxedg = 90 ):
32'''
33打印单因素⽅差分析表
34输⼊值:d - dict字典,包含分析表所需要的数据; maxedg - 打印输出时装饰分隔符的最⼤长度
35'''
36 title = '【单因素⽅差分析表】'
37print( ( maxedg ))
38print( '=' * maxedg )
39print( '{:^12s}|{:^16s}|{:^6s}|{:^16s}|{:^12s}|{:^10s}|'.format('误差来源','平⽅和','⾃由度','均⽅和','F','p值'))
40print( '-' * maxedg )
41print( '{:8s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |{:>11.6f} |{:>10.3%} |'.format( '组间(因⼦影响)',d['SSA'],d['df_A'],d['MSA'],d['F'],d['p_value'])) 42print( '{:10s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |'.format( '组内(误差)',d['SSE'],d['df_E'],d['MSE']))
python index函数43print( '{:14s}|{:>18,.4f} |{:>8d} |'.format( '总和',d['SST'],d['df_T']))
44print( '-' * maxedg )
45print('备注:显著性⽔平为 {:.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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论