十六、 方差分析--使用Python进行双因素方差分析
双因素方差分析
对于两因素的方差分析,基本思想和方法与单因素的方差分析相似,前提条件仍然是要满足独立、正态、方差齐性。所不同的是在双因素方差分析中有时会出现交互作用,即二因素的不同水平交差搭配对指标产生影响。下面先讨论无交互作用的双因素方差分析。
1. 无交互作用的双因素方差分析
例2:考虑三种不同形式的广告和五种不同的价格对某种商品销量的影响。选取某市15家大超市,每家超市选用其中的一个组合,统计出一个月的销量如下(设显著性水平为0.05):
在这里对商品销量的影响不仅有广告的影响,还有价格的影响,这就是双因素方差分析。
1.1. 无交叉双因素分析的数学模型
设A,B两个因素,因素A有r个水平A1,A2,...,ArA_1, A_2, ..., A_rA1,A2,...,Ar; 因素B有s个水平B1,B2,...,BsB_1, B_2, ..., B_sB1,B2,...,Bs. 对因素A,B的水平的每队组合(A,B)下进行一次独立实验得到观察值Xij,i=1,2,...r,j=1,2,...,s,X_{ij}, i=1,2,...r, j=1,2,...,s,Xij,i=1,2,...r,j=1,2,...,s, 假定Xij∼N(μij,σ2)X _{ij} \sim N(\mu_{ij}, \sigma^2)Xij∼N(μij,σ2), 且各XijX_{ij}Xij相互独立。则不考虑交互作用的双因素方差分析模型可表示为:
{Xij=μi+αi+εij,i=1,2,...,r,j=1,2,...,s,εij∼N(0,σ2),且各εij相互独立,∑i=1rαi=0,∑j=1sβj=0\begin{cases} X_{ij} = \mu_i + \alpha_i + \varepsilon_{ij}, i=1,2,...,r, j=1,2,...,s, \\ \varepsilon_{ij} \sim N(0, \sigma^2), 且各\varepsilon_{ij}相互独立, \\ \sum_{i=1}^r\alpha_i = 0, \quad \sum_{j=1}^s\beta_j=0 \end{cases} ⎩⎪⎨⎪⎧Xij=μi+αi+εij,i=1,2,...,r,j=1,2,...,s,εij∼N(0,σ2),且各εij相互独立,∑i=1rαi=0,∑j=1sβj=0
其中μ=1rs∑i=1r∑j=1sμij\mu = \frac{1}{rs}\sum_{i=1}^r\sum_{j=1}^s\mu_{ij}μ=rs1∑i=1r∑j=1sμij为总平均. αi\alpha_iαi为因素A的第iii个水平的效应,βj\beta_jβj为因素B的第jjj个水平的效应。
在给定显著性水平α\alphaα下,考虑如下假设检验:
H01:α1=α2=...=αr=0H_{01}:\alpha_1=\alpha_2=...=\alpha_r=0H01:α1=α2=...=αr=0 (因子A对指标的影响不显著)
H02:β1=β2=...=βs=0H_{02}:\beta_1=\beta_2=...=\beta_s=0H02:β1=β2=...=βs=0 (因子B对指标的影响不显著)
类似于单因素方差分析,先对总离差平方和SSTSS_TSST分解为因素A的效应平方和SSASS_ASSA,因素B的效应平方和SSBSS_BSSB及误差平方和SSESS_ESSE, 即
SST=SSA+SSB+SSESS_T = SS_A+SS_B+SS_ESST=SSA+SSB+SSE
可以证明:
1)当H01H_{01}H01成立时,
SSAσ2∼χ2(r−1),SSEσ2∼χ2((r−1)(s−1)),\frac{SS_A}{\sigma^2} \sim \chi^2(r-1), \frac{SS_E}{\sigma^2}\sim \chi^2((r-1)(s-1)),σ2SSA∼χ2(r−1),σ2SSE∼χ2((r−1)(s−1)),
而且SSASS_ASSA与SSESS_ESSE独立,于是
FA=SSA/(r−1)SSE/[(r−1)(s−1)]∼F(r−1,(r−1)(s−1))F_A=\frac{SS_A/(r-1)}{SS_E/[(r-1)(s-1)]} \sim F(r-1, (r-1)(s-1))FA=SSE/[(r−1)(s−1)]SSA/(r−1)∼F(r−1,(r−1)(s−1))
2) 当H02H_{02}H02成立时,
SSBσ2∼χ2(s−1)\frac{SS_B}{\sigma^2} \sim \chi^2(s-1)σ2SSB∼χ2(s−1)
而且SSBSS_BSSB与SSESS_ESSE独立,于是
FB=SSB/(s−1)SSE/[(r−1)(s−1)]∼F(s−1,(r−1)(s−1))F_B=\frac{SS_B/(s-1)}{SS_E/[(r-1)(s-1)]}\sim F(s-1, (r-1)(s-1))FB=SSE/[(r−1)(s−1)]SSB/(s−1)∼F(s−1,(r−1)(s−1))
所以,H01H_{01}H01与H02H_{02}H02的拒绝域分别为
CA={FA>F1−α(r−1,(r−1)(s−1))}C_A = \{F_A > F_{1-\alpha}(r-1,(r-1)(s-1))\}CA={FA>F1−α(r−1,(r−1)(s−1))}
CB={FB>F1−α(s−1,(r−1)(s−1))}C_B = \{F_B > F_{1-\alpha}(s-1, (r-1)(s-1))\}CB={FB>F1−α(s−1,(r−1)(s−1))}
咱们知道单因素方差分析的计算量已经够大了,双因素方差分析计算量那就更大了,所以也必须依赖于统计分析软件进行处理,下面的部分讨论Python如何完成相关计算的。
1.2. 双因素方差分析的实现
针对例2中广告和价格对商品销量的影响分析展开计算。
第一步:数据输入
# 导入相关库
import numpy as np
import pandas as pdd = np.array([[276, 352, 178, 295, 273],[114, 176, 102, 155, 128],[364, 547, 288, 392, 378]
])
df = pd.DataFrame(d)
df.index=pd.Index(['A1','A2','A3'],name='ad')
df.columns=pd.Index(['B1','B2','B3','B4','B5'], name='price')
此时在jupyter notebook下df输入结果如下:
第二步:数据处理
数据处理的目的就是产生符合模型输入的数据类型,有关pandas数据处理,参考相关文档。
df1 = df.stack().reset_index().rename(columns={0:'value'})
df1
在jupyter notebook下df1输出如下:
第三步:进行方差分析
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lmmodel = ols('value~C(ad) + C(price)', df1).fit()
anova_lm(model)
上述代码中ols的作用就是从一个公式和数据框创建一个模型。这里的公式语法就是由Patsy库提供支持的,C函数完成分类变量转换。
anova_lm就是为模型产生一个方差分析表。
在jupyer notebook下产生的输出如下:
第四步:结果分析和决策建议
对广告因素来说,因为其p=0.000013p=0.000013p=0.000013小于显著性水平α=0.05\alpha=0.05α=0.05,因此拒绝原假设,有理由相信广告对商品的销量是有影响的。
对价格因素来说,同样因为其p=0.005833p=0.005833p=0.005833小于显著性水平α=0.05\alpha=0.05α=0.05,因此也拒绝原假设,有理由相信对商品销量也是有影响的。
2. 有交互作用的双因素方差分析
例3:火箭的射程与燃料的种类和推进器的型号有关,现对四种不同的燃料与三种不同型号的推进器进行试验,每种组合各发射火箭两次,测得火箭的射程结果如下(设显著性水平为0.01):
这里火箭的射程不仅受到燃料类型和推进器型号的影响,同时还受到二者交互作用。这就好比两个好朋友甲和乙,甲的酒量也就半斤,儿乙的酒量有八两,但是两个好朋友聚到一起,把酒言欢结果一下喝掉了2斤多酒,哈哈哈。
2.1. 数学模型
设有两个因素A和B, 因素A有r个水平A1,A2,...,ArA_1 ,A_2 , ... ,A_rA1,A2,...,Ar ; 因素B有s个水平B1,B2,...,BsB_1, B_2,...,B_sB1,B2,...,Bs. 在许多情况下, 两因素A与B之间存在着一定程度的交互作用. 为了考察因素间的交互作用, 要求在两个因素的每一水平组合下进行重复试验. 设在每种水平组合 (Ai,Bj)(A_i, B_j)(Ai,Bj)下重复试验t次. 记第k次的观测值为XijkX_{ijk}Xijk.则有交互作用的两因素方差分析模型可表示为
{Xij=μ+αi+βj+δij+εijk,i=1,2,...,r,j=1,2,...,s,k=1,2,...,tεijk∼N(0,σ2),且各εijk相互独立∑i=1rαi=0,∑j=1sβj=0,∑i=1sδij=∑j=1sδij=0\begin{cases} X_{ij} = \mu + \alpha_i + \beta_j + \delta_{ij} + \varepsilon_{ijk}, i=1,2,...,r, j=1,2,...,s, k=1,2,...,t \\ \varepsilon_{ijk} \sim N(0, \sigma^2), 且各\varepsilon_{ijk}相互独立 \\ \sum_{i=1}^r\alpha_i=0, \sum_{j=1}^s\beta_j=0, \sum_{i=1}^s\delta_{ij}=\sum_{j=1}^s\delta_{ij}=0 \end{cases} ⎩⎪⎨⎪⎧Xij=μ+αi+βj+δij+εijk,i=1,2,...,r,j=1,2,...,s,k=1,2,...,tεijk∼N(0,σ2),且各εijk相互独立∑i=1rαi=0,∑j=1sβj=0,∑i=1sδij=∑j=1sδij=0
这里αi\alpha_iαi为因素A的第iii个水平的效应, βj\beta_jβj为因素B的第jjj个水平的效应, δij为Ai和Bj的交互效应,μ=1rs∑i=1r∑j=1sμij.\delta_{ij}为A_i和B_j的交互效应, \mu=\frac{1}{rs}\sum_{i=1}^r\sum_{j=1}^s\mu_{ij}.δij为Ai和Bj的交互效应,μ=rs1∑i=1r∑j=1sμij.
检验的假设为:
H01:α1=α2=...=αr=0(因素A对指标没有影响)H02:β1=β2=...=βs=0(因素B对指标没有影响)H03:δ11=δ12=...=δrs=0(因素A和B没有联合作用)H_{01}: \alpha_1 = \alpha_2 =... = \alpha_r = 0 (因素A对指标没有影响)\\ H_{02}: \beta_1 = \beta_2 = ... = \beta_s = 0 (因素B对指标没有影响) \\ H_{03}: \delta_{11} = \delta_{12} = ... = \delta_{rs} = 0 (因素A和B没有联合作用) H01:α1=α2=...=αr=0(因素A对指标没有影响)H02:β1=β2=...=βs=0(因素B对指标没有影响)H03:δ11=δ12=...=δrs=0(因素A和B没有联合作用)
类似于无交互作用的方差分析, 总的离差平方和可分解为
SST=SSE+SSA+SSB+SSA×BSS_T = SS_E + SS_A + SS_B + SS_{A \times B}SST=SSE+SSA+SSB+SSA×B
同时可以证明:
1)当H01H_{01}H01成立时,
FA=SSA/(r−1)SSE/[rs(t−1)]∼F(r−1,rs(t−1))F_A=\frac{SS_A/(r-1)}{SS_E/[rs(t-1)]} \sim F(r-1, rs(t-1))FA=SSE/[rs(t−1)]SSA/(r−1)∼F(r−1,rs(t−1))
2) 当H02H_{02}H02成立时,
FB=SSB/(s−1)SSE/[rs(t−1)]∼F(s−1,rs(t−1))F_B=\frac{SS_B/(s-1)}{SS_E/[rs(t-1)]} \sim F(s-1, rs(t-1))FB=SSE/[rs(t−1)]SSB/(s−1)∼F(s−1,rs(t−1))
3) 当H03H_{03}H03成立时,
FA×B=SSA×B/[(r−1)(s−1)]SSE/[rs(t−1)]∼F((r−1)(s−1),rs(t−1))F_{A\times B}=\frac{SS_{A\times B}/[(r-1)(s-1)]}{SS_E/[rs(t-1)]} \sim F((r-1)(s-1), rs(t-1))FA×B=SSE/[rs(t−1)]SSA×B/[(r−1)(s−1)]∼F((r−1)(s−1),rs(t−1))
2. 2. 有交互作用的方差分析的实现
针对例3展开计算。
步骤一:输入数据
import numpy as np
import pandas as pd d = np.array([[58.2, 52.6, 56.2, 41.2, 65.3, 60.8],[49.1, 42.8, 54.1, 50.5, 51.6, 48.4],[60.1, 58.3, 70.9, 73.2, 39.2, 40.7],[75.8, 71.5, 58.2, 51.0, 48.7,41.4]
])
df = pd.DataFrame(d)
df.index=pd.Index(['A1','A2','A3','A4'],name='燃料')
df.columns=pd.Index(['B1','B1','B2','B2','B3','B3'],name='推进器')
df
在jupyter notebook下df输出如下:
第二步:数据处理
df1 = df.stack().reset_index().rename(columns={0:'射程'})
df1
在jupyter notebook下df1的输出如下:
第三步:数据分析
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lmmodel = ols('射程~C(燃料) + C(推进器)+C(燃料):C(推进器)', df1).fit()
anova_lm(model)
在jupyter notebook下输出的方差分析表如下:
第四步:结果分析和决策建议
对燃料因素来说,其p=0.025p=0.025p=0.025大于显著性水平α=0.01\alpha=0.01α=0.01. 所以其对射程没有影响;
对推进器因素来说,其p=0.003506p=0.003506p=0.003506小于显著水平α=0.01\alpha=0.01α=0.01, 所以其对射程影响显著。
对燃料和推进器的交互因素来说,其p=0.000062p=0.000062p=0.000062小于显著水平α=0.01\alpha=0.01α=0.01,所以其对射程影响显著。
3. 总结
通过单因素方差分析和双因素方差分析的讨论,回顾了统计分析中关于方差分析的理论知识,同时熟悉了Python中关于方差分析的相关库的使用,对实际数据分析的帮助作用还是比较大的。
欢迎有志于数据分析的人士一起讨论,交流。
十六、 方差分析--使用Python进行双因素方差分析相关推荐
- 【统计模型】ToothGrowth数据集双因素方差分析
目录 ToothGrowth数据集双因素方差分析 一.研究目的 二.数据来源和相关说明 三.描述性分析 3.1 样本描述 3.2 样本均值 3.3 箱线图 四.数学建模 五.结论与建议 5.1 结论 ...
- Python玩转数据分析——双因素方差分析
概念 方差分析(Analysis of Variance,简称ANOVA),又称"变异数分析"或"F检验",用于两个及两个以上样本均数差别的显著性检验.双因素方 ...
- python基于pingouin包进行统计分析:anova函数执行非平衡双因素方差分析(Two-Way ANOVA、设置effsize参数为n2)、以dataframe的形式输出分析结果
python基于pingouin包进行统计分析:使用anova函数执行非平衡双因素方差分析(Two-Way ANOVA.设置effsize参数为n2).以dataframe的形式输出分析结果(包含S ...
- 双因素方差分析_多因素方差分析
总第173篇/张俊红 01.前言 在前面我们讲过简单的单因素方差分析,这一篇我们讲讲双因素方差分析以及多因素方差分析,双因素方差分析是最简单的多因素方差分析. 单因素分析就是只考虑一个因素会对要比较的 ...
- 【数据分析】双因素方差分析
0.双因素方差分析的分类 无交互作用的方差分析 假定因素AAA和因素BBB的效应之间是相互独立的,不存在相互关系. 有交互作用的方差分析 假定因素AAA和因素BBB的结合会产生出一种新的效应. 无交互 ...
- R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应
R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图(Main ef ...
- R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、在双因素方差分析中,受试者被分配到由两个因素交叉分类形成的组(Two-way factorial ANOVA)
R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).在双因素方差分析中,受试者被分配到由两个因素交叉分类形成的组(Two-way factorial ANOVA) ...
- R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用interaction.plot函数在双因素方差分析中可视化交互作用(Interaction)
R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).使用interaction.plot函数在双因素方差分析中显示(可视化)交互作用(Interaction) 目 ...
- R语言双因素方差分析
R语言双因素方差分析 条件: 各个样本是相互独立的随机: 各个样本来自正态总体: 具有方差齐性: 用途: 检验两个或多样本均数间的差异有无统计学意义:注:本均数的比较可以采用 t检验或 F检验,两个以 ...
- 第13章重复测量和双因素方差分析
第1章统计学入门 第2章频数分布略 第3章集中趋势的测量 第4章变异性 第5章分数的位置及标准化分布 第6章概率和正态分布 第7章概率和样本:样本均值的分布 第8章假设检验介绍 第9章t检验介绍 第1 ...
最新文章
- 美丽的公告:小(qing)编(wa)回来啦,带来了专属于AI程序猿的问候哦!
- 简单的小程序实现ATM机操作
- 牛客练习赛44 A	小y的序列 (模拟,细节)
- 10 个你可能还不知道 VS Code 使用技巧
- 2020牛客国庆集训派对day4 	Digits Are Not Just Characters
- 产品经理应聘之感受漫谈
- GBDT、随机森林、xgboost算法原理解析视频公开
- php实现中间件6,THINKPHP6 实现中间件
- 新手必看:PS钢笔抠图教程
- Ubuntu1804_server 离线安装GCC_7.5
- 【matlab笔记】寻找极小值
- 基于sklearn的西瓜数据集的SVR回归实现
- Excel数据分析—柱状图
- 计算机如何共享电视,智能电视怎么与电脑共享文件观看视频?
- Office2010激活失败 错误码2503、2502解决方案
- Fast Deep Matting for Portrait Animation on Mobile Phone
- SGE(集群任务管理系统)常用操作命令
- CCF-CSP_201812(第15次)
- I have a dream
- 平安科技2019校招后端工程师一面