当前位置: 首页 > news >正文

Python 数学建模——独立性检验

文章目录

    • 前言
    • 卡方独立性检验
      • 原理
      • 代码实例
    • Fisher 精确检验

前言

  独立性检验是概率论中比较重要的内容,常常用于检验两个变量是否具有关联关系。下面结合代码说说数学建模中如何使用 Python 进行独立性检验。

卡方独立性检验

原理

   χ 2 \chi^2 χ2 (卡方)独立性检验是一种基于列联表的检验,用于分析两种属性之间的独立性。假设一共有 N N N 个样本,每个样本都有 X , Y X,Y X,Y 两个属性,属性的取值集合为 { X 1 , X 2 , ⋯ , X n } × { Y 1 , Y 2 , ⋯ , Y m } \{{X_1},{X_2},\cdots ,{X_n}\}\times \{{Y_1},{Y_2},\cdots ,{Y_m}\} {X1,X2,,Xn}×{Y1,Y2,,Ym}。其中:

  • 属性组合为 ( X i , Y j ) (X_i,Y_j) (Xi,Yj) 的样本的频数记为 f i j f_{ij} fij
  • X X X 属性为 X i X_i Xi 的样本总数记为 N X i N_{X_i} NXi Y Y Y 属性为 Y j Y_j Yj 的样本总数记为 N Y j N_{Y_j} NYj

  那么独立性检验的步骤就是:

  1. 建立原假设 H 0 H_0 H0:两变量相互独立。备择假设 H 1 H_1 H1:两变量不相互独立。
  2. 计算理论频数 e i j = N X i × N Y j / N {e_{ij}=N_{X_i}\times N_{Y_j}}/N eij=NXi×NYj/N
  3. 计算自由度 d f = ( n − 1 ) ( m − 1 ) \mathit{df}=(n-1)(m-1) df=(n1)(m1)
  4. 计算卡方统计量 χ 2 = ∑ i = 1 n ∑ j = 1 m ( f i j − e i j ) 2 e i j ∼ χ 2 ( d f ) {{\chi }^{2}}=\displaystyle\sum_{i=1}^{n}{\sum_{j=1}^{m}{\frac{({{f}_{ij}}-{{e}_{ij}}{{)}^{2}}}{{{e}_{ij}}}}}\sim{{\chi }^{2}}(df) χ2=i=1nj=1meij(fijeij)2χ2(df)

实际观察次数与理论次数之差的平方再除以理论次数得到的统计量近似服从卡方分布。

χ 2 \chi^2 χ2 分布表,确定满足式 χ 1 − α / 2 2 ( d f ) < χ 2 < χ α / 2 2 ( d f ) {{\chi }_{1-\alpha /2}^{2}}(df)<{{\chi }^{2}}<{{\chi }_{\alpha /2}^{2}}(df) χ1α/22(df)<χ2<χα/22(df) 的最大 α \alpha α 值(这个值记作 p p p 值)。如果 p > 0.05 p >0.05 p>0.05,就可以接受原假设;否则拒绝原假设,接受备择假设。
参考文献:列联表分析——独立性检验(卡方检验)_列联表卡方检验-CSDN博客

注意使用条件

  • 总样本数大于 40 40 40 且每个类别的理论频数大于等于 5 5 5
  • 自由度 d f > 1 \mathit{df} > 1 df>1

  不符合上面的第一条使用条件时,采用 Fisher 精确检验。
  不符合上面的第二条使用条件时,需要使用 Yates 矫正的卡方检验(实际代码会根据 d f \mathit{df} df 自动判断是否矫正,但是论文中应说明使用的是矫正的卡方检验)。

代码实例

  验证“性别”和“信来世”是否独立。联合分布频数表如下:

信来世 ( Y 1 ) (Y_1) (Y1)不信来世 ( Y 2 ) (Y_2) (Y2)合计
女性 ( X 1 ) (X_1) (X1) 509 509 509 116 116 116 625 625 625
男性 ( X 2 ) (X_2) (X2) 398 398 398 104 104 104 502 502 502
合计 907 907 907 220 220 220 1127 1127 1127
import numpy as np
from scipy.stats import chi2_contingency# 输入列联表 table
table = np.array([[509,116],[398,104]])res = chi2_contingency(table,correction = False)
print(res)
# 结果 卡方值 = res[0] = 0.8245764245493725,p_value = res[1] = 0.3638455155911725

  这个 p = 0.36 > 0.05 p=0.36>0.05 p=0.36>0.05,所以是接受原假设,认为“性别”和“信来世”是相互独立的。设置参数correction = False的目的是关闭 Yates 矫正,使得计算结果与手算相同。

:使用chi2_contingency进行卡方检验时,如果自由度 d f = ( n − 1 ) ( m − 1 ) = 1 \mathit{df}=(n-1)(m-1)=1 df=(n1)(m1)=1,也即 m = n = 2 m=n=2 m=n=2,则底层代码会自动进行 Yates 校正。需要手动关闭 correction 才可以使得结果和手算相同。
参考文献:python用chi2_contingency做卡方检验结果和手算以及spss不同的问题_spss和python 2x2卡方值不同-CSDN博客

Fisher 精确检验

  对于不满足 χ 2 \chi^2 χ2 独立检验条件的,可以采用 Fisher 独立性检验,即适用范围为:总样本数小于 40 40 40 或者有一个类别的理论频数小于 5 5 5
  Python 中内置有 Fisher 精确检验库(scipy.stats.fisher_exact),但是该库只能进行 2 × 2 2\times2 2×2 列联表的检验,应用场景极其狭窄。通过 Python 引用 R 语言包(需要pip install rpy2)可以打破 m = n = 2 m=n=2 m=n=2 的限制:

import rpy2.robjects as ro
import numpy as np# 创建一个列联表
matrix_data = np.array([[11,11],[6,0],[17,13]])# 转换为 R 矩阵格式
r_matrix = ro.r.matrix(ro.IntVector(matrix_data.flatten()),nrow = matrix_data.shape[0],byrow=True)# 执行多维 Fisher 精确检验
fisher_test = ro.r['fisher.test']
result = fisher_test(r_matrix)
print(result)
"""Fisher's Exact Test for Count Datadata:  structure(c(11L, 6L, 17L, 11L, 0L, 13L), dim = 3:2)
p-value = 0.08361
alternative hypothesis: two.sided
"""

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • spring如何整合druid连接池?
  • 大模型LLM部署学习
  • [数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
  • 网络安全工程师能赚多少钱一个月?
  • 构建常态化安全防线:XDR的态势感知与自动化响应机制
  • html css网页制作
  • 【failed with MalformedInputException: Input length = 1 -> 修复解决方案】
  • 写在OceanBase开源三周年
  • RasberryPi 3B树莓派基本配置
  • 新颖的团建分组方式
  • 利用Python实现希尔伯特变换取包络 - 理论及实践
  • java语言发展史
  • DDS基本原理--FPGA学习笔记
  • RUST 学习之全局变量
  • Frida0D - hook JNIEnv 相关函数
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android开源项目规范总结
  • flutter的key在widget list的作用以及必要性
  • JavaScript-Array类型
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 阿里云购买磁盘后挂载
  • 规范化安全开发 KOA 手脚架
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深度学习中的信息论知识详解
  • 手写双向链表LinkedList的几个常用功能
  • 写代码的正确姿势
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # centos7下FFmpeg环境部署记录
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (145)光线追踪距离场柔和阴影
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (33)STM32——485实验笔记
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (源码分析)springsecurity认证授权
  • ****Linux下Mysql的安装和配置
  • ..回顾17,展望18
  • .Net CF下精确的计时器
  • .net framework 4.8 开发windows系统服务
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • [ A*实现 ] C++,矩阵地图
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [20150904]exp slow.txt
  • [AIGC] 如何建立和优化你的工作流?
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [C/C++] -- 二叉树
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf