方差分析(Analysis of
一、无交互作用的情况
由于不考虑交互作用的影响,对每一个因素组合 ( Ai , Bj ) 只需进行一次独立试验,称为 无重复试验 。
准备数据
考虑三种不同形式的广告和五种不同的价格对某种商品销量的影响。选取某市15家大超市,每家超市选用其中的一个组合,统计出一个月的销量如下(设显著性水平为0.05): 将数据导入python,代码如下:
dic_t2=[{'广告':'A1','价格':'B1','销量':276},{'广告':'A1','价格':'B2','销量':352},
{'广告':'A1','价格':'B3','销量':178},{'广告':'A1','价格':'B4','销量':295},
{'广告':'A1','价格':'B5','销量':273},{'广告':'A2','价格':'B1','销量':114},
{'广告':'A2','价格':'B2','销量':176},{'广告':'A2','价格':'B3','销量':102},
{'广告':'A2','价格':'B4','销量':155},{'广告':'A2','价格':'B5','销量':128},
{'广告':'A3','价格':'B1','销量':364},{'广告':'A3','价格':'B2','销量':547},
{'广告':'A3','价格':'B3','销量':288},{'广告':'A3','价格':'B4','销量':392},
{'广告':'A3','价格':'B5','销量':378}]
df_t2=pd.DataFrame(dic_t2,columns=['广告','价格','销量'])
无交互作用的双因素方差分析
接下来进行无交互作用的双因素方差分析,代码如下:
def f_twoway(df_c,col_fac1,col_fac2,col_sta,interaction=False):
df=df_c.copy()
list_fac1=df[col_fac1].unique()
list_fac2=df[col_fac2].unique()
r=len(list_fac1)
s=len(list_fac2)
x_bar=df[col_sta].mean()
list_Qa=[]
list_Qb=[]
for i in list_fac1:
series_i=df[df[col_fac1]==i][col_sta]
xi_bar=series_i.mean()
list_Qa.append((xi_bar-x_bar)**2)
for j in list_fac2:
series_j=df[df[col_fac2]==j][col_sta]
xj_bar=series_j.mean()
list_Qb.append((xj_bar-x_bar)**2)
Q=((df[col_sta]-x_bar)**2).sum()
df_res=pd.DataFrame(columns=['方差来源','平方和','自由度','均方','F值','Sig.'])
if interaction==False:
Qa=s*sum(list_Qa)
Qb=r*sum(list_Qb)
Qw=Q-Qa-Qb
Sa=Qa/(r-1)
Sb=Qb/(s-1)
Sw=Qw/((r-1)*(s-1))
sig1=stats.f.sf(Sa/Sw,r-1,(r-1)*(s-1))
sig2=stats.f.sf(Sb/Sw,s-1,(r-1)*(s-1))
df_res['方差来源']=[col_fac1,col_fac2,'误差','总和']
df_res['平方和']=[Qa,Qb,Qw,Q]
df_res['自由度']=[r-1,s-1,(r-1)*(s-1),r*s-1]
df_res['均方']=[Sa,Sb,Sw,'-']
df_res['F值']=[Sa/Sw,Sb/Sw,'-','-']
df_res['Sig.']=[sig1,sig2,'-','-']
return df_res
elif interaction==True:
list_Qw=[]
t=len(df[(df[col_fac1]==list_fac1[0]) & (df[col_fac2]==list_fac2[0])])
for i in list_fac1:
for j in list_fac2:
series_ij=df[(df[col_fac1]==i) & (df[col_fac2]==j)][col_sta]
list_Qw.append(((series_ij-series_ij.mean())**2).sum())
Qa=s*t*sum(list_Qa)
Qb=r*t*sum(list_Qb)
Qw=sum(list_Qw)
Qab=Q-Qa-Qb-Qw
Sa=Qa/(r-1)
Sb=Qb/(s-1)
Sab=Qab/((r-1)*(s-1))
Sw=Qw/(r*s*(t-1))
sig1=stats.f.sf(Sa/Sw,r-1,r*s*(t-1))
sig2=stats.f.sf(Sb/Sw,s-1,r*s*(t-1))
sig3=stats.f.sf(Sab/Sw,(r-1)*(s-1),r*s*(t-1))
df_res['方差来源']=[col_fac1,col_fac2,col_fac1+'*'+col_fac2,'误差','总和']
df_res['平方和']=[Qa,Qb,Qab,Qw,Q]
df_res['自由度']=[r-1,s-1,(r-1)*(s-1),r*s*(t-1),r*s*t-1]
df_res['均方']=[Sa,Sb,Sab,Sw,'-']
df_res['F值']=[Sa/Sw,Sb/Sw,Sab/Sw,'-','-']
df_res['Sig.']=[sig1,sig2,sig3,'-','-']
return df_res
else:
return 'interaction参数错误'
f_twoway(df_t2,'广告','价格','销量')
结果如下: 由于广告的p值 Sig. = 0.000 < 0.05,价格的 Sig. = 0.006 < 0.05,即可认为不同的广告形式、不同的价格均造成商品销量的显著差异。
二、有交互作用的情况
由于因素有交互作用,需要对每一个因素组合 ( Ai , Bj ) 分别进行 t 次 ( t ≥ 2 ) 重复试验,称这种试验为 等重复试验 。
准备数据
火箭的射程与燃料的种类和推进器的型号有关,现对四种不同的燃料与三种不同型号的推进器进行试验,每种组合各发射火箭两次,测得火箭的射程结果如下(设显著性水平为0.01): 将数据导入Python,代码如下:
dic_t3=[{'燃料':'A1','推进器':'B1','射程':58.2},{'燃料':'A1','推进器':'B1','射程':52.6},
{'燃料':'A1','推进器':'B2','射程':56.2},{'燃料':'A1','推进器':'B2','射程':41.2},
{'燃料':'A1','推进器':'B3','射程':65.3},{'燃料':'A1','推进器':'B3','射程':60.8},
{'燃料':'A2','推进器':'B1','射程':49.1},{'燃料':'A2','推进器':'B1','射程':42.8},
{'燃料':'A2','推进器':'B2','射程':54.1},{'燃料':'A2','推进器':'B2','射程':50.5},
{'燃料':'A2','推进器':'B3','射程':51.6},{'燃料':'A2','推进器':'B3','射程':48.4},
{'燃料':'A3','推进器':'B1','射程':60.1},{'燃料':'A3','推进器':'B1','射程':58.3},
{'燃料':'A3','推进器':'B2','射程':70.9},{'燃料':'A3','推进器':'B2','射程':73.2},
{'燃料':'A3','推进器':'B3','射程':39.2},{'燃料':'A3','推进器':'B3','射程':40.7},
{'燃料':'A4','推进器':'B1','射程':75.8},{'燃料':'A4','推进器':'B1','射程':71.5},
{'燃料':'A4','推进器':'B2','射程':58.2},{'燃料':'A4','推进器':'B2','射程':51.0},
{'燃料':'A4','推进器':'B3','射程':48.7},{'燃料':'A4','推进器':'B3','射程':41.4},]
df_t3=pd.DataFrame(dic_t3,columns=['燃料','推进器','射程'])
有交互作用的双因素方差分析
接下来进行有交互作用的双因素方差分析,代码如下:
f_twoway(df_t3,'燃料','推进器','射程',interaction=True)
结果如下: 从表中可以看出,Sig.(燃料) = 0.026 > 0.01,Sig.(推进器) = 0.004 < 0.01,Sig.(燃料*推进器) = 0.000 < 0.01。故可以认为燃料对火箭的射程没有显著影响,而推进器及燃料与推进器的交互作用影响显著。