用Python学分析 - 单因素方差分析
单因素方差分析(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学分析 - 单因素方差分析的更多相关文章
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- python的引用计数分析(二)
python所有对象引用计数被减少1的情况: 一.对象的别名被赋予新的对象; a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 print(sys.getrefcount( ...
- python的计数引用分析(一)
python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外.(默认对象的引用计数永远不会变成0) 所有的计数引用+1 ...
- 《构建之法》教学笔记——Python中的效能分析与几个问题
<构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...
- python数据抓取分析(python + mongodb)
分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...
- 【转】python之random模块分析(一)
[转]python之random模块分析(一) random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): ...
- 单因素方差分析(One Way ANOVA)
Analysis of variance (ANOVA) is a collection of statistical models and their associated estimation p ...
- Python内置类型性能分析
Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...
随机推荐
- JNA-调用win32 Dll文件
1. 描述备注 参考地址1 JNA示例代码 1.1 JNA工作原理 JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数. 原来使用JNI,你必须 ...
- SpringBoot | 第十章:Swagger2的集成和使用
前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成.现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的沟 ...
- Unity Download Assistant Error: 'SendRequest Error' while downloading ini file from http://files.unity3d.com/bootstrapper/29055738eb78/unity-5.3.6f1-win.ini
Unity 官网的哥们如此说道 I open the exe on Compatibility Mode , it's solved. You can try. :) 翻译就是 我用兼容模式打开,就能 ...
- java+elipse安装及部分问题
1. elipse下载.安装.jdk环境配置教程: https://www.cnblogs.com/ForestDeer/p/6647402.html 2.eclipse使用教程: https://j ...
- java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
- ZR18提高5解题报告
不想说啥了,比赛期间智商全程下线 A 设$f[i][j]$表示前$i$个位置,前缀和为$j$的方案数,转移的时候该位置放了什么,以及该位置之前的和是多少. 发现第二维可以前缀和优化. 不用管代码里的f ...
- 【转】如何在Git中撤销一切
翻译:李伟 审校:张帆译自:Github 任何一个版本控制系统中,最有用的特性之一莫过于 “撤销(undo)”操作.在Git中,“撤销”有很多种含义. 当你完成了一次新的提交(commit),Git会 ...
- 异常:System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms 这个实现是不是Windows平台FIPS验证的加密算法。解决方法
遇见这个问题是在使用了MD5加密算法后报错的,可能的原因如下: 1.FIPS不兼容MD5,此时需要修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\C ...
- 【BZOJ4300】绝世好题(位运算水题)
点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...
- 【BZOJ4001】[TJOI2015] 概率论(卡特兰数)
点此看题面 大致题意: 问你一棵\(n\)个节点的有根二叉树叶节点的期望个数. 大致思路 看到期望,比较显然可以想到设\(num_i\)为\(i\)个节点的二叉树个数,\(tot_i\)为所有\(i\ ...