目录
一元方差分析
一元单因素方差分析
场景:5种不同像素的数码相机(单因素)对销量(研究的因变量)是否有显著差异
G = dc_sales['pixel'].unique()
args = []
for I in list(G):
args.append(dc_sales[dc_sales['pixel']==I]['sales'])
# 将pixel变量转化为分类变量并为其值挂标签
dc_sales['pixel']=dc_sales['pixel'].astype('category')
dc_sales['pixel'].cat.categories=['500像素以下','500-600万像素','600-800万像素','800-1000万像素','1000万像素以上']
dc_sales['pixel'].cat.set_categories=['500像素以下','500-600万像素','600-800万像素','800-1000万像素','1000万像素以上']
若方差齐性检验不满足
1、检查某些特殊表现的观测值,剔除
2、使用无方差齐性的多重比较方法
3、数据变换(log/正态)
4、非参数检验
#1.方差齐性检验
stats.levene(*args)【p越大越满足方差齐性】
#2.f检验
stats.f_oneway(*args)
#2.2 更详细的结果
from statsmodels.formula.api import ols
dc_sales_anova=sm.stats.anova_lm(ols('sales ~ C(pixel)',dc_sales).fit())
print dc_sales_anova
>> df sum_sq mean_sq F pr(>F)
>>C(pixcel) 4 10472 2618 19 1.5e-08
>>Residual 35 4682 133 NaN NaN
组间离差平方和(SSA)=10472,组内离差平方和(SSE)=4682
组间方差=10472/4,组内方差=4682/35
多重比较检验
F检验只能回答多组之间的均值不同,但不不能说是哪几组不同
通过2组配对比较,可以看哪几组均值存在差异
from statsmodels.stats.multicomp import pairwise_tukeyhsd
ds_sales_anova_post=pairwise_tukeyhsd(dc_sales['sales'],dc_sales['pixel'].alpha=0.5)
dc_sales_anova_post.summary()
# 对5种不同像素两两对比,10个结果,看meandiff和P值即可
# 当然多重检验会有问题,这里有多重检验校正之类的
一元多因素方差分析
因素单独对因变量产生的影响为主效应,因素之间共同对因变量产生的影响称为交互作用
多因素方差分析假定因素和因变量之间的关系是线性关系
# 只考虑主效应
formula = 'space ~ C(education)+C(unit)+C(income)+C(type)'
house_anova = sm.stats.anova_lm(ols(formula,data=house).fit(),typ=3)
#typ=3代表作方差分析type3型检验
print house_anova
>> sum_sq df F PR(>F)
Intercept 28663 1 89 1.5e-19
C(eudcation) 1519 3 1.58 1.9e-01
C(unit) 886 5 0.55 7.3e-01
C(income) 10545 4 8.25 1.99e-06
C(type) 9604 10 3 1.09e-03
Residual 143477 449 NaN NaN
这个结果与直接ols很像,但是不一样哦,比如income有四个类型,ols的结果会把这四个类型的每个p值等等也会显现出来~
# 有交互效应
formula = 'space ~ C(income)*C(type)'
house_anova_inter=sm.stats.anova_lm(ols(formula,data=house).fit())
协方差分析
将方差分析与回归分析结合【个人觉得协方差分析=广义线性回归】
方差分析:一个或几个因子(分类变量) 对Y(连续变量)的影响
回归分析:一个或几个变量(连续变量) 对Y(连续变量)的影响
将那些难以控制的因素当作协变量,在排除协变量影响的条件下,分析可控因素对因变量的影响
注意:协变量往往是连续型变量
因变量=因素主效应+因素交互效应+协变量+随机误差
例子:排除协变量(即返点【因销售人员表现】指定)作用后,分析卖场因素和售后服务因素对销售量的影响,为企业后面选址和指定服务条款提供参考意见
formula='sales~points+C(market)*C(warranty)'
sale_points_anova_cov=sm.stats.anova_lm(ols(formula,data=sale_points).fit())
注意理解这里排除points,其实在ols中的结果每一条都是固定其他不变,这一条的单独影响,所以协方差分析和ols如出一辙