美文网首页
方差分析(一元单因素)

方差分析(一元单因素)

作者: 弦好想断 | 来源:发表于2020-05-15 14:10 被阅读0次

    利用样本数据检验两个或两个以上总体均值是否存在差异。

    本例根据给定数据的三个指标:市场,像素,销量,研究像素大小是否会对相机销量产生影响?

    方差分析中,把影响因变量的可控制的定性变量或离散变量称之为‘因素’;而各个因素具有的表现称之为‘水平’。

    本例中像素数pixel便是影响因变量的一个因素,其具有5个水平。

    而影响因变量的定性变量或连续型变量称之为‘协变量’。

    如销售人员奖金对销售量的影响,奖金可作为影响销售量的一个协变量。

    其他条件相同的情况下,本例要解决的问题就归结为一个多总体的检验问题,即检验成像元器件的像素数对销量是否有影响?

    把每一类不同像素的数码相机总销量分别看成是不同的总体,该问题便转化为如下的假设检验问题:

    H0:u1=u2=u3=u4=u5;  H1:u1,u2,u3,u4,u5不完全相等
    
    一元单因素方差分析主要研究单独一个因素对因变量的影响,通过因素的不同水平看对因变量进行分组,计算组内和组间方差,利用方差比较的方法对各分组所形成的总体进行均值比较,从而对各总体均值相等的原假设进行检验。

    得到数据透视表

    可以看到数据的箱型图分布

    方差同质性检验

    一元单因素方差分析应当满足方差齐性假设,其原假设是不同水平所代表总体的方差是相同的。对于医院方差分析常用levene's检验,多元方差分析多使用Bartlett's球形检验法。

    方差来源分解及检验

    组内离差平方和为4682.125,组内方差为133.7750,组间离差平方和为10472.850,组间方差为2618.2125,于是得出F统计量为19.57。对应的P值几乎为0,所以可以认为像素大小对相机销量影响是非常显著的。
    得出结论:在显著性a=0.05水平下,可以拒绝根据像素变量划分的各总体均值相等的原假设。即,不同的像素大小对相机销量影响非常显著。

    多重比较检验

    进一步研究因素的哪一水平对观测变量产生了显著影响,即那种像素大小对销量有显著影响。这就是单因素方差分析的均值多重比较检验。
    statsmodels.stats.multicomp中提供了pairwise_tukeyhsd函数可进行TukeyHSD事后多重比较检验。

    系统自动将不同像素进行两两对比,并在reject列给出了是否应该拒绝原假设--两组属性没有差异的检验结果。(meandiff表示二者对应的因变量均值差,返回True表示二者对销量的影响有差异)
    结果表明600万像素以下的数码相机由于技术比较落后,消费者需求不大,与中高像素的数码相机进行对比,销量明显萎缩,且差异最为显著;消费者对于像素数量的要求不同,对销售量也产生了显著影响,像素高的相机明显比像素低的相机销量大。

    方差分析模型的参数估计和预测

    方差分析实际上是对一般线性模型进行分析,其还可以对于用方差分析的线性模型进行参数估计和假设检验。根据参数估计结果,可以得出当从一个水平变为另一个水平时对因变量产生的具体影响,并据此进行预测。


    第一张表主要展示模型诊断的总体信息,如拟合优度判定系数R2,F统计量值、P值、AIC和BIC等信息指数等。第二章表主要反映方差分析模型的参数估计结果及其检验结果。
    这个图中的C(pixel)[500万像素及以下] 没有出现,而是由截距项intercept表示该像素下对因变量的影响:销量为81.125台。其他水平对于因变量的影响都是一截距项为基准进行衡量,其对应的参数估计代表了各个水平对因变量影响与截距项对因变量影响的差距。

    为了避免手工繁琐的计算,需要估计不含截距项的模型参数的绝对数值,在程序定义formula的右边加上‘-1’即可。
    这样的出的结果更清晰明了,高像素(800万以上)的数码相机销量比较大,中低像素(500-800万)的相机销售一般,低像素(500万以下)销量最小。

    使用模型的参数估计值对 因变量进行预测
    确保预测较为准确的前提就是估计出的模型要依据统计理论模型进行模型诊断。本利模型参数估计均非常显著,且拟合优度与F值均较大,可以认为该模型适合进行检测。


    python代码

    import numpy as np
    import pandas as pd
    from scipy import stats
    import statsmodels.api as sm
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.rcParams['font.sans-serif'] = ['SimHei']#显示中文
    plt.style.use('ggplot')
    

    数据预处理

    dc_sales = pd.read_csv('dc_sales.csv')
    #将 ‘market’和‘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万像素及以上']
    pd.pivot_table(dc_sales,index = ['pixel'],columns = ['market'],
                   values = ['sales'],aggfunc='sum')
    

    画数据箱型图

    G=dc_sales['pixel'].unique()
    args = []
    for i in list(G):
        args.append(dc_sales[dc_sales['pixel']==i]['sales'])#存储不同像素属性下的销售数据
    dc_sales_plot = plt.boxplot(args,vert=True,patch_artist=True)#画出的是普通箱型图
    colors = ['pink','lightblue','lightgreen','cyan','lightyellow']
    for patch,color in zip(dc_sales_plot['boxes'],colors):
        patch.set_facecolor(color)
    fig = plt.gcf()
    fig.set_size_inches(8,5)
    combinebox = plt.subplot(111)
    combinebox.set_xticklabels(G)
    plt.show()
    

    方差同质性检验

    stats.levene(*args)
    ##p值很大,不能拒绝原假设,即满足方差齐性。
    LeveneResult(statistic=0.233384556281214, pvalue=0.9176929576341715)
    

    对方差来源进行分解

    #使用statsmodels中的anova_lm配合ols函数:
    from statsmodels.formula.api import ols
    dc_sales_anova = sm.stats.anova_lm(ols('sales ~ C(pixel)',dc_sales).fit())
    #上述语句也可写成调用 formula的形式,等价于上面两行代码
    #formula = 'sales ~ C(pixel)'
    #dc_sales_anova = sm.stats.anova_lm(ols(formula,dc_sales).fit())  
    dc_sales_anova
    

    多重比较检验

    #究竟是因素的那一水平对观察量产生了影响,即具体哪种像素对销售量有显著影响。
    from statsmodels.stats.multicomp import pairwise_tukeyhsd
    dc_sales_anova_post=pairwise_tukeyhsd(dc_sales['sales'],dc_sales['pixel'],alpha = 0.05)
    dc_sales_anova_post.summary()
    

    参数估计和预测

    dc_sales_est = ols('sales ~ C(pixel)',dc_sales).fit()
    dc_sales_est.summary2()
    #估计不含截距项模型的参数
    formula = 'sales~C(pixel)-1'
    dc_sales_est1 = ols(formula,dc_sales).fit()
    dc_sales_est1.summary2()
    

    方差分析模型的预测

    dc_sales_est.fittedvalues
    #也可使用模型对象的get_influence方法得到更详细的预测信息:
    dc_sales_influence = dc_sales_est.get_influence()
    dc_sales_influence.summary_table()
    

    相关文章

      网友评论

          本文标题:方差分析(一元单因素)

          本文链接:https://www.haomeiwen.com/subject/kvdsghtx.html