从原理和公式出发:python实现One_Way_ANOVA

文章目录

  • 目的:python实现one way ANOVA 单因素方差分析
    • 1. 代码流程
    • 2. python代码实现
      • 0 主要的函数
      • 1 加载数据
      • 2 查看数据统计结果
      • 3 数据处理及可视化
      • 4 方差分析
        • 4.1 模型拟合
        • 4.2 单因素方差分析
      • 5 Post Hoc t-test组间比较分析
      • 6 根据定义自行分解计算对比调用函数的结果
      • 7 获取F分布对应的P值
    • 3. 方差分析公式及原理参考

目的:python实现one way ANOVA 单因素方差分析

1. 代码流程

a. 通过调用python的包来进行方差分析
b. 根据公式进行方差分析
c. 对比两种方法(工具包与手算)的结果,结果发现:一致
d. 最后附上方差分析的原理和计算公式

2. python代码实现

0 主要的函数

在这里插入图片描述

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from scipy import stats                       # 里面有方差齐性检验方差
from statsmodels.formula.api import ols       # 最小二乘法拟合
from statsmodels.stats.anova import anova_lm  # 方差分析

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=UserWarning)

在这里插入图片描述

1 加载数据

dataD = {'treat1':[390,410,372,382,None],
         'treat2':[375,348,354,364,362],
         'treat3':[413,383,408,None,None]}
data = pd.DataFrame(dataD)
data
treat1treat2treat3
0390.0375413.0
1410.0348383.0
2372.0354408.0
3382.0364NaN
4NaN362NaN

2 查看数据统计结果

data.describe()
treat1treat2treat3
count4.0000005.0000003.000000
mean388.500000360.600000401.333333
std16.11417610.28591316.072751
min372.000000348.000000383.000000
25%379.500000354.000000395.500000
50%386.000000362.000000408.000000
75%395.000000364.000000410.500000
max410.000000375.000000413.000000

3 数据处理及可视化

我们为了方便计算,将所有的数据合成一列,并画一下箱线图看一下

data_melt = data.melt()
data_melt.columns = ['Treat', 'value']
print(data_melt)
     Treat  value
0   treat1  390.0
1   treat1  410.0
2   treat1  372.0
3   treat1  382.0
4   treat1    NaN
5   treat2  375.0
6   treat2  348.0
7   treat2  354.0
8   treat2  364.0
9   treat2  362.0
10  treat3  413.0
11  treat3  383.0
12  treat3  408.0
13  treat3    NaN
14  treat3    NaN
import seaborn as sns
# plt.figure(dpi=600)
sns.boxplot(data = data_melt, x = 'Treat', y = 'value', 
           palette = 'pastel',  # 控制箱子颜色
           )

请添加图片描述

4 方差分析

4.1 模型拟合
from statsmodels.formula.api import ols                    # 最小二乘法拟合
from statsmodels.stats.anova import anova_lm               # 方差分析
from statsmodels.stats.multicomp import pairwise_tukeyhsd  # post Hoc t_test

model = ols('value ~C(Treat)', data = data_melt).fit()  # 最小二乘法拟合
# ols模型拟合的参数
print(model.params)

# 模型拟合的均值:
# mean_treat1 = 388.5
# mean_treat2 = 388.5 - 27.9 = 360.6
# mean_treat3 = 388.5 + 12.833 = 401.33

## 实际的均值:
# mean_treat1 = 388.500000	
# mean_treat2 = 360.600000	
# mean_treat3 = 401.333333
Intercept             388.500000
C(Treat)[T.treat2]    -27.900000
C(Treat)[T.treat3]     12.833333
dtype: float64

无论是普通线性模型还是广义线性模型,预测的都是自变量x取特定值时因变量y的平均值。

print(model.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  value   R-squared:                       0.673
Model:                            OLS   Adj. R-squared:                  0.600
Method:                 Least Squares   F-statistic:                     9.257
Date:                Thu, 30 Nov 2023   Prob (F-statistic):            0.00655
Time:                        16:43:18   Log-Likelihood:                -46.814
No. Observations:                  12   AIC:                             99.63
Df Residuals:                       9   BIC:                             101.1
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
======================================================================================
                         coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
Intercept            388.5000      6.910     56.224      0.000     372.869     404.131
C(Treat)[T.treat2]   -27.9000      9.271     -3.010      0.015     -48.871      -6.929
C(Treat)[T.treat3]    12.8333     10.555      1.216      0.255     -11.044      36.710
==============================================================================
Omnibus:                        0.469   Durbin-Watson:                   2.839
Prob(Omnibus):                  0.791   Jarque-Bera (JB):                0.509
Skew:                           0.080   Prob(JB):                        0.775
Kurtosis:                       2.004   Cond. No.                         3.80
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
4.2 单因素方差分析
anova_table = anova_lm(model, type = 2)                 # 方差分析
pd.DataFrame(anova_table)                               # 查看方差分析结果
dfsum_sqmean_sqFPR(>F)
C(Treat)2.03536.0500001768.0250009.2573930.006547
Residual9.01718.866667190.985185NaNNaN

参数解释:

  1. df: degree of freedom 自由度:自由度是你现有数据中包含的可能性。

    • 例1:为什么当你求全班50个同学身高总和的时候自由度是49?
      因为如果把学号1到学号49的同学身高全都固定下来, 比方说总和为83米,而全班50个人的身高总和,为84.7米,
      那么第50个同学的身高必须为1.7米,没有任何自由变化的余地。
    • 例2:假设有三个数字,A+B+C=10,假设A为任意数取8,B为任意数取2,那么c就是0 这个等式才能成立,这个等式当中有三个未知量,
      但是可以有自由变换的数值只有两个,所以这个式子自由度就是3-1=2,所以样本当中能自由变化的数据个数叫做自由度。

    对于本案例:

    • K = 3: 共有3组,treat1,treat2,treat3。
    • n = 12: 3组共有12个测量值
    • df_C(Treat): K-1 = 3-1=2
    • df_Residual: n-k = 12-3 = 9
  2. sum_sq: error sum of square 误差平方和

    • 表示实验误差大小的偏差平方和,在相同的条件下各次测定值xi对测定平均值x的偏差平方后再加和∑(xi-x)2
  3. mean_sq: Mean Squared Error 均方误差

    • 均方误差是指参数估计值与参数真值之差平方的期望值
  • 可以发现,treat组间存在显著性差异,p=0.006547 < 0.5
    因为对比的组别超过三个,并且呈现出显著性差异,所以考虑使用事后检验(post hoc)进一步对比具体两两组别间的差异情况。

5 Post Hoc t-test组间比较分析

print(pairwise_tukeyhsd(data_melt['value'], data_melt['Treat']))
Multiple Comparison of Means - Tukey HSD, FWER=0.05
===============================================
group1 group2 meandiff p-adj lower upper reject
-----------------------------------------------
treat1 treat2      nan   nan   nan   nan  False
treat1 treat3      nan   nan   nan   nan  False
treat2 treat3      nan   nan   nan   nan  False
-----------------------------------------------

这里我们发现:

  • Q:单因素方差分析结果显著,但事后t检验两两比较均不显著,这样的结果合理吗?
  • A:合理,方差分析结果显著只说明组间可能存在显著差异,到底有无显著差异还要看事后比较

6 根据定义自行分解计算对比调用函数的结果

# 全部的算数平均数为:380.083
mean_all = ((390+410+372+382+375+348+354+364+362+413+383+408)/12)
# 3个品种的算数平均数分别为:388.5,360.6,401.33
print('总平均:\n', mean_all)
mean_k = data.mean(axis = 0)
print('组平均:\n', mean_k)
总平均:
 380.0833333333333
组平均:
 treat1    388.500000
treat2    360.600000
treat3    401.333333
dtype: float64
## 组内方差
SS_e = (390-388.5)**2 + (410-388.5)**2 + (372-388.5)**2+(382-388.5)**2+\
      (375-360.6)**2+(348-360.6)**2+(354-360.6)**2+(364-360.6)**2+(362-360.6)**2+\
      (413-401.3)**2+(383-401.3)**2+(408-401.3)**2
df_e = 12-3  # 自由度:共12个样本,3个水平
print("Residual sum_sq:", SS_e)

## 组间方差
SS_A = 4*(388.5-380.083)**2 + 5*(360.6-380.083)**2 + 3*(401.333-380.083)**2
df_A = 3-1  # 共3个水平
print("C(Treat):", SS_A)
Residual sum_sq: 1718.8700000000003
C(Treat): 3536.007500999999
## 计算F
MS_A = SS_A / df_A
MS_e = SS_e / df_e

F = MS_A / MS_e
print("MS_A:", MS_A)
print("MS_e:", MS_e)
print("F:", F)
MS_A: 1768.0037504999996
MS_e: 190.9855555555556
F: 9.257264222716081

7 获取F分布对应的P值

from scipy.stats import f                           #导入f
PR = f.sf(F, df_A, df_e)
print(PR)


m = df_A      #设置自由度m
n = df_e      #设置自由度n
alpha=0.05    #设置alpha

a=f.ppf(q=alpha, dfn=m, dfd=n)                      #单侧左分位点
b=f.isf(q=alpha, dfn=m, dfd=n)                      #单侧右分位点
print('单侧左、右分位点:a=%.4f, b=%.4f'%(a, b))

a1, b1=f.interval(1-alpha, dfn=m, dfd=n)              #双侧分位点
print('双侧左、右分位点:a=%.4f, b=%.4f'%(a1, b1))

## 可以发现 MS_A/MS_e = 9.25 > Fm,n(0.05) = 5.7147  拒绝原假设H0,即存在组间差异
0.0065472957497462216
单侧左、右分位点:a=0.0516, b=4.2565
双侧左、右分位点:a=0.0254, b=5.7147

3. 方差分析公式及原理参考

SS_e: 随机误差的影响,又被称为组内偏差;
SS_A: 另一部分表示因素A的各水平之间的差异带来的影响,又被称为组间偏差。
原理参考:https://zhuanlan.zhihu.com/p/33357167 (方差分析的好文章)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/204683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

特征选择的方法:包裹法之递归特征消除

1.递归特征消除法的基本原理 递归特征消除法是一种贪婪的优化算法&#xff0c;致力于通过反复创建模型的方式找到性能最佳的特征子集。 首先将筛选的K个特征作为初始特征子集&#xff0c;开展机器学习计算得到每个特征的重要性&#xff0c;利用交叉验证方法得到初始特征子集的…

JOSEF约瑟 大功率抗干扰继电器\NR0521\220VDC 导轨安装

NR系列大功率继电器 系列型号&#xff1a; NR0521B大功率继电器 NR0521A大功率继电器 NR0521型大功率继电器 用途 大功率继电器NR0521220VDC 导轨安装在电力工程实际应用中&#xff0c;为防止母线电压经过PT二次侧反馈至高压侧&#xff0c;需要在PT二次侧串接PT刀闸重动接…

ROM和RAM概念

一、存储器特性 1&#xff09;易失性&#xff1a;掉电数据会丢失&#xff0c;通常指RAM&#xff1b; RAM分为SRAM、DRAM SRAM&#xff1a;静态RAM&#xff0c;只要上电数据就不会丢失&#xff1b; DRAM&#xff1a;动态RAM&#xff0c;需要每隔一段事件刷新数据&#xff0c;否…

Windows安装Kafka3.6,单机

Kafka版本&#xff1a;kafka_2.13-3.6.0 Windows10系统 安装与配置 下载 kafka_2.13-3.6.0.tgz 下载并解压Kafka 3.6.0的压缩包到你选择的目录。 Kafka3.6.0下载链接https://kafka.apache.org/downloads 说明&#xff1a;Kafka3.6内置了Zookeeper&#xff0c;使用内置的Zo…

数字孪生3D场景开发工具:弥补不足,开拓全新可能

随着数字化时代的来临&#xff0c;越来越多的企业和行业开始探索数字孪生技术的应用。数字孪生是指通过数字技术将现实世界中的物体、场景等复制到虚拟世界中&#xff0c;以实现实时监测、预测和优化。然而&#xff0c;在数字孪生的发展过程中&#xff0c;一些不足也逐渐浮现。…

11.28 C++作业

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" <<…

LeetCode刷题---路径问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、不同路径 题目链接&#xff1a;不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记…

C# WPF上位机开发(抽奖程序)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 每到年末或者是尾牙的时候&#xff0c;很多公司都会办一些年终的清楚活动&#xff0c;感谢员工过去一年辛苦的付出。这个时候&#xff0c;作为年会…

继承中的析构函数的权限的深入了解

如果一个父类中的析构函数如果设置为 private 权限 &#xff0c;一个子类public继承了这个父类&#xff0c;那么 这个父类可以创建对象吗&#xff1f; 答案是 不可以 看看下面的代码 class A { public:private:~A() {} };class B :public A {A a; // 这个地方编译不报错&…

8.0 新特性 - Generated Invisible Primary Key

文章目录 说明1. GIPK 介绍1.1 参数设置2.2 可见性测试2.3 修改元数据可见性2.4 修改查询可见性 2. GIPK 测试2.1 Binlog 分析2.2 主从复制2.3 逻辑备份2.4 其它限制2.4.1 AUTO_INCREMENT 属性2.4.2 my_row_id 关键字 后记 说明 MySQL Innodb 引擎采用的是 IOT&#xff08;索引…

ESP32单片机案例

工具&#xff1a;VScode PlatformIO IDE 注&#xff1a;B站视频学习笔记。 1、继电器 1&#xff09;硬件电路 2&#xff09;程序 #include <Arduino.h> #define RELAY_PIN 15//初始化定时器 hw_timer_t *timer NULL;void timer_interrupt(){digitalWrite(RELAY_PIN…

低价商品采购API接口

采购商品地址http://sly.yizhaosulianyun.com/More/Push/888889?type3 低价商品采购API接口 1) 请求地址 http://sly.yizhaosulianyun.com/jd/keyWords 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 低价商品采购接口 4) 请求参数: POST参数: 字段名称字段…

图论——最小割问题

Capacity&#xff08;S&#xff0c;T) Min-Cut(通俗的说就是用最小的力气隔断&#xff09; 最小割并不唯一 最大流最小割定理 对于一个网络流问题&#xff0c;最大流的流量最小割的容量 寻找最小割 可以使用Edmonds-karp or Dinic algorithm 首先寻找任意一个最大流&#xff…

一文讲透Python机器学习特征选择之互信息法

1.互信息法的基本思想 互信息&#xff08;Mutual Information&#xff0c;MI&#xff09;的基本思想是计算每个特征变量与目标变量之间的互信息统计量&#xff0c;互信息统计量衡量变量之间的依赖关系。两个随机变量之间的互信息统计量肯定是非负值&#xff0c;当且仅当两个随…

Java将JavaFX程序最小化托盘

Windows最小化拖盘其实就是将程序放到托盘里面,需要的时候再点击托盘里面的应用图标,此时就可以正常使用应用了,托盘如下: 下面是一个简单的Java程序,可以把窗口最小化到系统托盘: import java.awt.*; import java.awt.event.*; import javax.swing.*;public class Tray…

【算法每日一练]-图论(保姆级教程篇9 最小生成树 ,并查集篇)#道路修建 #兽径管理

目录 题目&#xff1a;道路修建 思路&#xff1a; 题目&#xff1a;兽径管理 思路&#xff1a; 题目&#xff1a;道路修建 思路&#xff1a; “让这些点全部连在一起的最小代价”很明显是最小生成树。绝对不能kruskal&#xff0c;存边一定会超内存。所以只能prim。 但是…

滚珠丝杆在各种自动化设备中的作用

滚珠丝杆因其具有高精度、高刚度和长寿命等特性&#xff0c;成为许多设备中的重要组成部分&#xff0c;在许多行业中都有广泛的应用&#xff0c;接下来我们看看滚珠丝杆的具体应用有哪些&#xff1f; 1、打孔机&#xff1a;提供精确的导向&#xff0c;使打孔机的滑块能够沿固定…

拥抱未来:大语言模型解锁平台工程的无限可能

01 了解大型语言模型 (LLM) 大型语言模型&#xff08;LLM&#xff09;是一种人工智能&#xff08;AI&#xff09;算法&#xff0c;它使用深度学习技术和海量数据集来理解、总结、生成和预测新内容。凭借合成大量信息的能力&#xff0c;LLM 可以提高以前需要人类专家的业务流程的…

todesk连接ubuntu显示当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或者使用终端文件功能

ToDesk远程遇到的问题如上图&#xff0c;换向日葵直接黑屏&#xff1b; 问题原因 截止发文时间&#xff0c;Todesk只支持X11协议&#xff0c;没有适配最新的Wayland协议&#xff0c;所以我们需要把窗口系统调整为X11才可以。 解决方法 修改配置文件&#xff0c;关闭wayland su…

精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的

不同种类的精密制造成品有区别化的制造工序、工艺流转、品质标准、生产成本、营销策略等&#xff0c;而多工厂、多仓库、多车间、多部门协同问题却是不少精密制造企业遇到的管理难题。 有些产品结构较为复杂&#xff0c;制造工序繁多&#xff0c;关联业务多&#xff0c;传统的…