1.方差分析
方差分析就是通过检验各总体的均值是否相等来判断分类型自变量对数值型因变量是否有显著影响。
根据分类型自变量多少,分为:
- 单因素方差分析
- 双因素方差分析
- 多因素方差分析
名词解释:
因素:方差分析的研究变量;例如研究行业投诉数的差异,行业就被称为因素
水平:因素中的内容称为水平;例如,总共研究4个行业,则行业因素的水平就是4
2.方差分析的步骤
2.1 提出假设
H0:自变量对因变量没有显著影响
H1:自变量对因变量有显著影响
2.2 构建检验的统计量
1)计算各样本均值
2)计算全部观测值的总均值
3)计算各误差平方和
总平方和SST:
组间平方和SSA:
组内平方和SSE:
其中SST=SSA+SSE
4)计算统计量
SST的自由度为n-1,其中n为全部观测值的个数
SSA的自由度为k-1,其中k为因素水平的个数
SSE的自由度为n-k
组间方差MSA:
组内方差MSE:
检验统计量F:
3.python实现
消费者与产品生产者、销售者或服务提供者之间经常发生纠纷。发生纠纷后,消费者常常会向消费者协会投诉。为了对这几个行业的服务质量进行评价,选取四个行业,每个行业选取几家企业。具体数据如下:
零售业 | 旅游业 | 航空公司 | 制造业 |
---|---|---|---|
57 | 68 | 31 | 44 |
66 | 39 | 49 | 51 |
49 | 29 | 21 | 65 |
40 | 45 | 34 | 77 |
34 | 56 | 40 | 58 |
53 | 51 | ||
44 |
python实现代码如下:
import numpy as np
import pandas as pd
import sklearn
import scipy.stats as stats
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import warnings
warnings.filterwarnings("ignore")
dic_t1=[{'行业':'A','次数':57},
{'行业':'A','次数':66},
{'行业':'A','次数':49},
{'行业':'A','次数':40},
{'行业':'A','次数':34},
{'行业':'A','次数':53},
{'行业':'A','次数':44},
{'行业':'B','次数':68},
{'行业':'B','次数':39},
{'行业':'B','次数':29},
{'行业':'B','次数':45},
{'行业':'B','次数':56},
{'行业':'B','次数':51},
{'行业':'C','次数':31},
{'行业':'C','次数':49},
{'行业':'C','次数':21},
{'行业':'C','次数':34},
{'行业':'C','次数':40},
{'行业':'D','次数':44},
{'行业':'D','次数':51},
{'行业':'D','次数':65},
{'行业':'D','次数':77},
{'行业':'D','次数':58}]
df_t1 = pd.DataFrame(dic_t1,columns=['行业','次数'])
def f_oneway(df,col_fac,col_sta):
list_fac = df[col_fac].unique() #分组标签取出
k = len(list_fac) #分组标签个数
n = len(df)
x_bar = df[col_sta].mean() #总均值
SSA = []
for i in list_fac:
series_i = df[df[col_fac]==i][col_sta]
r = len(series_i)
xi_bar = series_i.mean()
SSA.append(r*(xi_bar-x_bar)**2)
SST = round(((df[col_sta]-x_bar)**2).sum(),4)
df_res = pd.DataFrame(columns=['方差来源','平方和','自由度','均方','F值','P-value'])
SSA = sum(SSA)
SSE = SST - SSA
MSA = SSA/(k-1)
MSE = SSE/(n-k)
sig = stats.f.sf(MSA/MSE,k-1,(k-1)*(n-1))
df_res['方差来源'] = [col_fac,'组内(误差)','总和']
df_res['平方和'] = [SSA,SSE,SST]
df_res['自由度'] = [k-1,n-k,n-1]
df_res['均方'] = [MSA,MSE,'-']
df_res['F值'] = [MSA/MSE,'-','-']
df_res['P-value'] = [sig,'-','-']
return df_res
f_oneway(df_t1,'行业','次数')
image.png
参考链接
Cmd Markdown 公式指导手册
网友评论