Python 数学建模——方差分析

文章目录

前言

方差分析也是概率论中非常重要的内容,有时数学建模需要用到。方差分析是干什么的?如果说假设检验用于分析两个总体 之间的均值 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2 是否存在显著的差别,那么方差分析就是分析两个以上总体之间的均值是否存在显著的差别。

单因素方差分析

用途:已知一个量 A A A 可能会影响 X X X, A A A 的不同取值可能会造成 X X X 的分布函数不同。判定 A A A 是不是真的会影响 X X X。(需要默认 X X X 服从正态分布 ,且 A A A 不影响正态分布的方差,可以在论文的假设中给出;当 A A A 只有两个取值的时候,就退化成了假设检验)

建议只看下面的"用途"概括以及代码部分,原理部分只是简单介绍且生涩难懂。

原理

假设有 r r r 个正态总体 X i ∼ N ( μ i , σ 2 ) ( i = 1 , 2 , ⋯   , r ) {X_i}\sim N({{\mu }{i}},{{\sigma }^{2}})(i=1,2,\cdots ,r) Xi∼N(μi,σ2)(i=1,2,⋯,r) 相互独立,现在我们给出假设 H 0 : μ 1 = μ 2 = ⋯ = μ r {H_0}:{{\mu }{1}}={{\mu }{2}}=\cdots ={{\mu }{r}} H0:μ1=μ2=⋯=μr。从第 i i i 个正态总体中抽取了 n i n_i ni 个样本,并将其均值记作 X ‾ i \overline{X}i Xi。 n = ∑ i = 1 r n i n=\sum{i=1}^{r}{{{n}_{i}}} n=∑i=1rni , X ‾ \overline X X 是所有的 n n n 个样品的均值。

单因素方差分析,正是通过对要分析的因素 A A A 取 A 1 , ⋯   , A r {{A}{1}},\cdots ,{{A}{r}} A1,⋯,Ar 这不同的 r r r 个值,对于每个值分别获取一个总体,通过判断各个总体的均值是否有显著差异(即假设 H 0 H_0 H0 是否成立)来判断因素 A A A 是否对总体有显著影响。

我们构造下面三个统计量:
S T = ∑ i = 1 r ∑ j = 1 n i ( X i j − X ‾ ) 2 = ∑ i = 1 r ∑ j = 1 n i X i j 2 − n X ‾ 2 {{S}{T}}=\sum{i=1}^{r}{\sum_{j=1}^{{{n}{i}}}{(}}{{X}{ij}}-\overline{X}{{)}^{2}}=\sum_{i=1}^{r}{\sum_{j=1}^{{{n}{i}}}{{{X}{ij}^{2}}-}}n{{\overline{X}}^{2}} ST=i=1∑rj=1∑ni(Xij−X)2=i=1∑rj=1∑niXij2−nX2 S E = ∑ i = 1 r ∑ j = 1 n i ( X i j − X ‾ i ) 2 = ∑ i = 1 r ∑ j = 1 n i X i j 2 − ∑ i = 1 r n i X ‾ i 2 {{S}{E}}=\sum{i=1}^{r}{\sum_{j=1}^{{{n}{i}}}{(}}{{X}{ij}}-\overline{X}i{{)}^{2}}=\sum{i=1}^{r}{\sum_{j=1}^{{{n}{i}}}{{{X}{ij}^{2}}-}}\sum_{i=1}^{r}{{{n}{i}}}{{\overline{X}i}^{2}} SE=i=1∑rj=1∑ni(Xij−Xi)2=i=1∑rj=1∑niXij2−i=1∑rniXi2 S A = ∑ i = 1 r n i ( X ‾ i − X ‾ ) 2 = S T − S E {{S}{A}}=\sum{i=1}^{r}{{{n}{i}}}(\overline{X}i-\overline{X}{{)}^{2}}={{S}{T}}-{{S}{E}} SA=i=1∑rni(Xi−X)2=ST−SE

其中 S T S_T ST 反映了所有样本之间的差异情况, S E S_E SE 反映了各组内部样本之间的差异情况(即同一组内随机抽样产生的误差), S A S_A SA 反映了各组之间由于因素水平不同而引起的差异(不同水平下的差异即条件误差)。

当假设 H 0 H_0 H0 成立时,应当有 S E , S A S_E,S_A SE,SA 相互独立,且统计量 F = S A / ( r − 1 ) S E / ( n − r ) ∼ F ( r − 1 , n − r ) F=\cfrac{{{S}{A}}/(r-1)}{{{S}{E}}/(n-r)}\sim F(r-1,n-r) F=SE/(n−r)SA/(r−1)∼F(r−1,n−r)。若 F < F α ( r − 1 , n − r ) F<{{F}_{\alpha }}(r-1,n-r) F<Fα(r−1,n−r)(其中 α \alpha α 是显著性水平),则接受原假设,认为总体之间的均值不存在显著差别。

F F F 值位于区间 [ 0 , F 0.05 ( r − 1 , n − r ) ] [0,{{F}_{0.05}}(r-1,n-r)] [0,F0.05(r−1,n−r)] ( F 0.05 ( r − 1 , n − r ) , F 0.01 ( r − 1 , n − r ) ] ({{F}{0.05}}(r-1,n-r),{{F}{0.01}}(r-1,n-r)] (F0.05(r−1,n−r),F0.01(r−1,n−r)] ( F 0.01 ( r − 1 , n − r ) , + ∞ ) ({{F}_{0.01}}(r-1,n-r),+\infty ) (F0.01(r−1,n−r),+∞)
α \alpha α 值位于区间 [ 0.05 , 1 ] [0.05,1] [0.05,1] [ 0.01 , 0.05 ) [0.01,0.05) [0.01,0.05) [ 0 , 0.01 ) [0,0.01) [0,0.01)
对于均值的说法 差别不显著 差别显著 差别高度显著

核心代码

核心代码如下:

py 复制代码
import statsmodels.api as sm

# 此处的x,a是长度相同的一维数组。第 i 个数据的值是a[i],属于第x[i]个样本总体。比如:
x = [1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5]
a = [256 242 280 298 254 330 290 295 250 277 230 302 248 280 305 289 236 252
 220 252]

d={'x':x,'y':a} #构造求解需要的字典
model = sm.formula.ols("y~C(x)",d).fit()  #构建模型
anovat = sm.stats.anova_lm(model)  #进行单因素方差分析
print(anovat)

运行的结果示例如下,需要用到C(x)PR(>F)列的内容。这个 0.110913 0.110913 0.110913 是使得 F < F α ( r − 1 , n − r ) F<{{F}{\alpha }}(r-1,n-r) F<Fα(r−1,n−r) 成立的最大 α \alpha α,也就是 F F F 属于区间 [ 0 , F 0.05 ( r − 1 , n − r ) ] [0,{{F}{0.05}}(r-1,n-r)] [0,F0.05(r−1,n−r)],从而差别不显著。

复制代码
            df   sum_sq   mean_sq         F    PR(>F)
C(x)       4.0   6125.7  1531.425  2.261741  0.110913
Residual  15.0  10156.5   677.100       NaN       NaN

双因素方差分析

用途:有两个量 A A A, B B B 都会影响到随机变量 X X X 的分布。单方面地,分别验证 A A A 是否影响 X X X、 B B B 是否影响 X X X。综合地,判断 A , B A,B A,B 对 X X X 的影响是否有交互效应。

数学模型

总体 X X X 会受到 A A A、 B B B 两个因素的影响,仿照单因素方差分析的思路,我们令因素 A A A 取 s s s 个不同水平 A 1 , ⋯   , A s {{A_1}},\cdots ,{{A}{s}} A1,⋯,As,令因素 B B B 取 r r r 个不同水平 B 1 , ⋯   , B r {{B_1}},\cdots ,{{B}{r}} B1,⋯,Br。

对于每一组因素组合 ( B i , A j ) ({{B}{i}},{{A}{j}}) (Bi,Aj),都取 t t t 个样本,得到一个总体 X i j X_{ij} Xij。我们认为这个总体服从正态分布,即 X i j ∼ N ( μ i j , σ 2 ) {{X}{ij}}\sim N({{\mu }{ij}},{{\sigma }^{2}}) Xij∼N(μij,σ2)。那么就有 ε i j k = X i j k − μ i j ∼ N ( 0 , σ 2 ) {{\varepsilon }{ijk}}={{X}{ijk}}-{{\mu }_{ij}}\sim N(0,{{\sigma }^{2}}) εijk=Xijk−μij∼N(0,σ2)。

现在获取下面几个统计量:

  • 所有总体的均值 μ = 1 r s ∑ i = 1 r ∑ j = 1 s μ i j \displaystyle\mu =\frac{1}{rs}\sum_{i=1}^{r}{\sum_{j=1}^{s}{{{\mu }_{ij}}}} μ=rs1i=1∑rj=1∑sμij。
  • 水平 A j A_j Aj 对指标的效应 α j = μ ⋅ j − μ = 1 r ∑ i = 1 r μ i j − μ \displaystyle{{\alpha }{j}}={{\mu }{·j}}-\mu =\frac{1}{r}\sum_{i=1}^{r}{{{\mu }_{ij}}}-\mu αj=μ⋅j−μ=r1i=1∑rμij−μ。
  • 水平 B i B_i Bi 对指标的效应 β i = μ i ⋅ − μ = 1 s ∑ j = 1 s μ i j − μ \displaystyle{{\beta }{i}}={{\mu }{i·}}-\mu =\frac{1}{s}\sum_{j=1}^{s}{{{\mu }_{ij}}}-\mu βi=μi⋅−μ=s1j=1∑sμij−μ。
  • 水平 B i B_i Bi 与 A j A_j Aj 对指标的交互效应 γ i j = μ i j − μ − α j − β i {{\gamma }{ij}}={{\mu }{ij}}-\mu -{{\alpha }{j}}-{{\beta }{i}} γij=μij−μ−αj−βi。

建立的原假设有三个:

  • H 01 : α j = 0 ( j = 1 , 2 , ⋯   , s ) {{H}{01}}:{{\alpha }{j}}=0(j=1,2,\cdots ,s) H01:αj=0(j=1,2,⋯,s)。
  • H 02 : β i = 0 ( i = 1 , 2 , ⋯   , r ) {{H}{02}}:{{\beta }{i}}=0(i=1,2,\cdots ,r) H02:βi=0(i=1,2,⋯,r)。
  • H 03 : γ i j = 0 ( i = 1 , 2 , ⋯   , r ; j = 1 , 2 , ⋯   , s ) {{H}{03}}:{{\gamma }{ij}}=0(i=1,2,\cdots ,r;j=1,2,\cdots ,s) H03:γij=0(i=1,2,⋯,r;j=1,2,⋯,s)。

分析依据

一般来说,至少要讨论假设 H 01 , H 02 {{H}{01}},{{H}{02}} H01,H02,当因素 A , B A,B A,B 之间可能存在交互作用时,还需要讨论假设 H 03 H_{03} H03。下面直接介绍含有交互效应的双因素方差分析

说明一下一些均值:

  • 所有总体的均值 X ‾ = 1 r s t ∑ i = 1 r ∑ j = 1 s ∑ k = 1 t X i j k \displaystyle\overline{X}=\frac{1}{rst}\sum_{i=1}^{r}{\sum_{j=1}^{s}{\sum_{k=1}^{t}{{{X}_{ijk}}}}} X=rst1i=1∑rj=1∑sk=1∑tXijk。
  • 因素 ( B i , A j ) (B_i,A_j) (Bi,Aj) 所确定总体的均值 X i j ⋅ ‾ = 1 t ∑ k = 1 t X i j k \displaystyle\overline{{{X}{ij·}}}=\frac{1}{t}\sum{k=1}^{t}{{{X}_{ijk}}} Xij⋅=t1k=1∑tXijk。
  • 因素 A j A_j Aj 所确定 r r r 个总体的均值 X ⋅ j ⋅ ‾ = 1 r t ∑ i = 1 r ∑ k = 1 t X i j k \displaystyle\overline{{{X}{·j·}}}=\frac{1}{rt}\sum{i=1}^{r}{\sum_{k=1}^{t}{{{X}_{ijk}}}} X⋅j⋅=rt1i=1∑rk=1∑tXijk。
  • 因素 B i B_i Bi 所确定 s s s 个总体的均值 X i ⋅ ⋅ ‾ = 1 s t ∑ j = 1 s ∑ k = 1 t X i j k \displaystyle\overline{{{X}{i··}}}=\frac{1}{st}\sum{j=1}^{s}{\sum_{k=1}^{t}{{{X}_{ijk}}}} Xi⋅⋅=st1j=1∑sk=1∑tXijk。

与单因素方差分析类似,可以构造出以下的统计量:
S E = ∑ i = 1 r ∑ j = 1 s ∑ k = 1 t ( X i j k − X i j ⋅ ‾ ) 2 {{S}{E}}=\sum{i=1}^{r}{\sum_{j=1}^{s}{\sum_{k=1}^{t}{(}}}{{X}{ijk}}-\overline{{{X}{ij·}}}{{)}^{2}} SE=i=1∑rj=1∑sk=1∑t(Xijk−Xij⋅)2 S A = r t ∑ j = 1 s ( X ⋅ j ⋅ ‾ − X ‾ ) 2 {{S}{A}}=rt\sum{j=1}^{s}{(}\overline{{{X}{·j·}}}-\overline{X}{{)}^{2}} SA=rtj=1∑s(X⋅j⋅−X)2 S B = s t ∑ i = 1 r ( X i ⋅ ⋅ ‾ − X ‾ ) 2 {{S}{B}}=st\sum_{i=1}^{r}{(}\overline{{{X}{i··}}}-\overline{X}{{)}^{2}} SB=sti=1∑r(Xi⋅⋅−X)2 S A B = t ∑ i = 1 r ∑ j = 1 s ( X i j ⋅ ‾ − X i ⋅ ⋅ ‾ − X ⋅ j ⋅ ‾ + X ‾ ) 2 {{S}{AB}}=t\sum_{i=1}^{r}{\sum_{j=1}^{s}{(}}\overline{{{X}{ij·}}}-\overline{{{X}{i··}}}-\overline{{{X}_{·j·}}}+\overline{X}{{)}^{2}} SAB=ti=1∑rj=1∑s(Xij⋅−Xi⋅⋅−X⋅j⋅+X)2

其中 S E S_E SE 为误差平方和, S A S_A SA 为因素 A A A 的平方和(或列间平方和), S B S_B SB 为因素 B B B 的平方和(或行间平方和), S A B S_{AB} SAB 为交互作用的平方和(或格间平方和)。那么:

  • F A = S A s − 1 S E r s ( t − 1 ) ∼ F ( s − 1 , r s ( t − 1 ) ) {{F_A}}=\displaystyle\cfrac{\cfrac{{{S}{A}}}{s-1}}{\cfrac{{{S}{E}}}{rs(t-1)}}\sim F(s-1,rs(t-1)) FA=rs(t−1)SEs−1SA∼F(s−1,rs(t−1)),若 F A < F α ( s − 1 , r s ( t − 1 ) ) {{F_A}}<{{F_\alpha }}(s-1,rs(t-1)) FA<Fα(s−1,rs(t−1)) 则接受原假设 。即因素 A A A 无显著影响。
  • F B = S B r − 1 S E r s ( t − 1 ) ∼ F ( r − 1 , r s ( t − 1 ) ) {{F_B}}=\displaystyle\cfrac{\cfrac{{{S}{B}}}{r-1}}{\cfrac{{{S}{E}}}{rs(t-1)}}\sim F(r-1,rs(t-1)) FB=rs(t−1)SEr−1SB∼F(r−1,rs(t−1)),若 F B < F α ( r − 1 , r s ( t − 1 ) ) {{F_B}}<{{F_\alpha }}(r-1,rs(t-1)) FB<Fα(r−1,rs(t−1)) 则接受原假设 。即因素 B B B 无显著影响。
  • F A B = S A B ( r − 1 ) ( s − 1 ) S E r s ( t − 1 ) ∼ F ( ( r − 1 ) ( s − 1 ) , r s ( t − 1 ) ) {{F}{AB}}=\cfrac{\cfrac{{{S}{AB}}}{(r-1)(s-1)}}{\cfrac{{{S}{E}}}{rs(t-1)}}\sim F((r-1)(s-1),rs(t-1)) FAB=rs(t−1)SE(r−1)(s−1)SAB∼F((r−1)(s−1),rs(t−1)),若 F A B < F α ( ( r − 1 ) ( s − 1 ) , r s ( t − 1 ) ) {{F}{AB}}<{{F_\alpha }}((r-1)(s-1),rs(t-1)) FAB<Fα((r−1)(s−1),rs(t−1)) 则接受原假设 。即因素 A , B A,B A,B 无显著交互作用。

典型代码

py 复制代码
#程序文件Pex4_24.py
import numpy as np
import statsmodels.api as sm

# 构造数据
y=np.array([[11, 11, 13, 10], [10, 11, 9, 12],
         [9, 10, 7, 6], [7, 8, 11, 10],
         [5, 13, 12, 14], [11, 14, 13, 10]]).flatten()
A=np.tile(np.arange(1,5),(6,1)).flatten()
B=np.tile(np.arange(1,4).reshape(3,1),(1,8)).flatten()

# 数据字典------此处的A,B,y是长度相同的一维数组。第 i 个数据的值是y[i],属于因素(A[i],B[i])所确定的样本总体。比如:
d={'x1':A,'x2':B,'y':y}
model = sm.formula.ols("y~C(x1)+C(x2)+C(x1):C(x2)",d).fit() #注意交互作用公式的写法
anovat = sm.stats.anova_lm(model) #进行双因素方差分析
print(anovat)
"""
               df     sum_sq    mean_sq         F    PR(>F)
C(x1)         3.0  19.125000   6.375000  1.330435  0.310404
C(x2)         2.0  40.083333  20.041667  4.182609  0.041856
C(x1):C(x2)   6.0  18.250000   3.041667  0.634783  0.701009
Residual     12.0  57.500000   4.791667       NaN       NaN
"""

同样是看PR(>F)列的内容,说明因素x1对结果影响不显著,x2对结果影响显著x1,x2交互作用不显著。

相关推荐
冷雨夜中漫步3 分钟前
Python入门——字符串
开发语言·python
Yvonne爱编码4 分钟前
Java 接口学习核心难点深度解析
java·开发语言·python
June bug16 分钟前
(#数组/链表操作)合并两个有重复元素的无序数组,返回无重复的有序结果
数据结构·python·算法·leetcode·面试·跳槽
人工智能AI技术23 分钟前
【Agent从入门到实践】33 集成多工具,实现Agent的工具选择与执行
人工智能·python
AIFQuant33 分钟前
如何通过股票数据 API 计算 RSI、MACD 与移动平均线MA
大数据·后端·python·金融·restful
70asunflower40 分钟前
Python with 语句与上下文管理完全教程
linux·服务器·python
deephub1 小时前
为什么标准化要用均值0和方差1?
人工智能·python·机器学习·标准化
hnxaoli1 小时前
win10程序(十五)归档文件的xlsx目录自动分卷
python
喵手1 小时前
Python爬虫零基础入门【第九章:实战项目教学·第8节】限速器进阶:令牌桶 + 动态降速(429/5xx)!
爬虫·python·令牌桶·python爬虫工程化实战·python爬虫零基础入门·限速器·动态降速
深度学习lover1 小时前
<项目代码>yolo毛毛虫识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·毛毛虫识别