单因素方差分析(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模块进行计算】

 # 引入数据
 import pandas as pd
 data_value = { '无促销':[23,19,17,26,28,23,24,30],
               '被动促销':[26,22,20,30,36,28,30,32],
               '主动促销':[30,23,25,32,48,40,41,46]}# 因变量
 da = pd.DataFrame( data_value ).stack()
 da.columns = ['水平','观测值']

 # ols模块进行分析

 from statsmodels.formula.api import ols
 from statsmodels.stats.anova import anova_lm 

 formula = '{} ~ {}'.format(da.columns[1], da.columns[0])
 model = ols( formula, da ).fit()
 anovat = anova_lm(model)
 print(anovat)

输出结果:

【python分析:用自定义函数进行计算】

 def ANOVA_oneway( df, a = 0.05 ):
     from scipy.stats import f
     '''
     进行单因素方差分析
     输入值:df - pd.DataFrame,第一列为水平,第二列为观测值;a - 显著性水平,默认为0.05
     返回类型:字典
     返回值:方差分析相关数据
     '''
     res = { 'SSA':0, 'SST':0 }
     mu = df[df.columns[1]].mean()
     da = df.groupby( df.columns[0] ).agg( {df.columns[1]:['mean','count']})
     da.columns = ['mean','count']
     res['df_A'] = len(list(da.index)) - 1        # 自由度
     # 组间误差平方和
     for row in da.index:
         res['SSA'] += (da.loc[row,'mean'] - mu )**2 * da.loc[row,'count']
     # 总误差平方和
     for e in df[df.columns[1]].values:
         res['SST'] += (e - mu )**2
     res['SSE'] = res['SST'] - res['SSA']         # 组内误差平方和
     res['df_E'] = len(df) - res['df_A'] - 1      # 残差自由度
     res['df_T'] = len(df) - 1                    # 总和自由度
     res['MSA'] = res['SSA'] / res['df_A']        # 组间均方
     res['MSE'] = res['SSE'] / res['df_E']        # 组内均方
     res['F'] = res['MSA'] / res['MSE']           # F值
     res['p_value'] = 1 - f(res['df_A'],res['df_E'] ).cdf( res['F'])  #p值
     res['a'] = a
     res['F_alpha'] = f(res['df_A'],res['df_E'] ).ppf( 1-a ) # 基于显著性水平a的F临界值
     return res

 def print_ANOVA_oneway( d, maxedg = 90 ):
     '''
     打印单因素方差分析表
     输入值:d - dict字典,包含分析表所需要的数据; maxedg - 打印输出时装饰分隔符的最大长度
     '''
     title = '【单因素方差分析表】'
     print( title.center( maxedg ))
     print( '=' *  maxedg )
     print( '{:^12s}|{:^16s}|{:^6s}|{:^16s}|{:^12s}|{:^10s}|'.format('误差来源','平方和','自由度','均方和','F','p值'))
     print( '-' *  maxedg )
     print( '{:8s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |{:>11.6f} |{:>10.3%} |'.format( '组间(因子影响)',d['SSA'],d['df_A'],d['MSA'],d['F'],d['p_value']))
     print( '{:10s}|{:>18,.4f} |{:>8d} |{:>18,.4f} |'.format( '组内(误差)',d['SSE'],d['df_E'],d['MSE']))
     print( '{:14s}|{:>18,.4f} |{:>8d} |'.format( '总和',d['SST'],d['df_T']))
     print( '-' *  maxedg )
     print('备注:显著性水平为 {:.2%} 时,F的临界值是 {:.6f}。'.format(d['a'],d['F_alpha']))

 p = 0.95 # 设定置信度水平
 maxedg = 93 # 设定输出时装饰分隔符的最大长度
 # 计算并输出单因素方差分析表
 res = ANOVA_oneway( da, a = 1-p )
 print_ANOVA_oneway( res, maxedg = maxedg )

用Python学分析 - 单因素方差分析的更多相关文章

  1. Python之路,Day22 - 网站用户访问质量分析监测分析项目开发

    Python之路,Day22 - 网站用户访问质量分析监测分析项目开发   做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129  项目实战之 ...

  2. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  3. python的引用计数分析(二)

    python所有对象引用计数被减少1的情况: 一.对象的别名被赋予新的对象; a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 print(sys.getrefcount( ...

  4. python的计数引用分析(一)

    python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外.(默认对象的引用计数永远不会变成0) 所有的计数引用+1 ...

  5. 《构建之法》教学笔记——Python中的效能分析与几个问题

    <构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...

  6. python数据抓取分析(python + mongodb)

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...

  7. 【转】python之random模块分析(一)

    [转]python之random模块分析(一) random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): ...

  8. 单因素方差分析(One Way ANOVA)

    Analysis of variance (ANOVA) is a collection of statistical models and their associated estimation p ...

  9. Python内置类型性能分析

    Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...

随机推荐

  1. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  2. php设计模式 适配器模式

    适配器模式,可以将截然不同的函数接口封装成统一的API: 应用举例,PHP的数据库操作有Mysql.Mysqli.pdo三种,可以用适配器模式统一成一致,类似的场景还有cache适配器,将memcac ...

  3. MySQL与Oracle 差异比较之七用户权限

    用户权限 编号 类别 ORACLE MYSQL 注释 1 创建用户 Create user user_name identified by user_password default tablespa ...

  4. httpclient发送request请求时设置header和timeout

    package com.xxx.xxx.common; import java.io.BufferedReader; import java.io.InputStreamReader; import ...

  5. 转 c#代码访问https服务器以及https的webservice

    最近公司做到WebService项目,但是要通过Https调用,自己在网上搜了半天,终于实现了服务端的Https,但是一直没有找到客户端如何实现,今天终于看到这篇文章,随手记录下来. 具体代码如下: ...

  6. OA小助手

    基于 WPF + Modern UI 的 公司OA小助手 开发总结 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会 ...

  7. DVB数字电视系统简介(DVB-C,DVB-S,DVB-T)

    前一段时间在<通信原理>期末的时候研究了一下DVB数字电视系统.视音频编解码这些技术都是属于"信源"的技术,而<通信原理>研究的范围正好是它的补集,属于&q ...

  8. List 的add()与addAll()的区别

    add 是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll 是传入一个List,将此List中的所有元素加入到当前List中,也就 ...

  9. apache配置CA证书通过https通信

    Apache Httpd 2.2 实现https加密通讯 实际生产中CA证书一般是向一些专业认证的国际机构来进行申请的.我们会模拟使用OpenSSL生成的证书,来实现Apache的安全加密通讯,这与实 ...

  10. ​Web安全测试解决方案

    Web安全测试解决方案 介绍常见的Web安全风险,Web安全测试方法.测试基本理论和测试过程中的工具引入