【卡方检验(Chi-Squared Test)的原理简介】

文章目录

  • 卡方检验(Chi-Squared Test)的原理简介
    • 1. 卡方检验的流程
    • 借助scipy进行卡方检验
    • 3 连续变量的卡方检验
    • 4 借助sklearn进行卡方检验特征筛选

卡方检验(Chi-Squared Test)的原理简介

在一般情况下,卡方检验是针对于离散变量的独立性检验,卡方检验的零假设为两个离散变量相互独立。很明显,如果我们将其用于标签和特征的判别,就能借此判断某特征和标签是不是独立的,如果是,则说明特征对标签的预测毫无帮助。因此在很多时候,卡方检验都是非常重要的剔除无关特征的方法。

1. 卡方检验的流程

下面我们来看看卡方检验的具体流程:

假设我们有一组数据,想要确定性别和对某一问题的支持是否存在相关性。

Step1. 提出假设

假设检验的过程往往是采用了类似“反证法”的方法进行论证,例如如果我想证明这枚硬币是质地均匀的,那么在论证之前,我需要提出一个相反的假设,即这枚硬币有问题、质地不均匀,该假设会被记为𝐻0,也就是所谓的零假设。当然既然是假设,就肯定有假设不成立的时候,此时假设结论的对立假设就是这枚硬币没有问题、是质地均匀的,该假设会被记为𝐻1,也被称为备择假设或者对立假设

目前假设情况如下:
H0: 性别和对某一问题的支持不存在相关性
H1:性别和对某一问题的支持存在相关性

Step2. 采集数据

import pandas as pd

data = {
    '支持': [80, 60],
    '反对': [50, 70],
    '无意见': [20, 30]
}

df = pd.DataFrame(data, index=['男性', '女性'])
print(df)

运行这段代码将生成如下的数据表:
在这里插入图片描述

Step 3.设计统计量

支持反对无意见性别_all
男性805020150
女性607030160
态度_all14012050310

态度的取值分布如下:
P ( 态度 = 支持) = 140 310 ≈ 0.452 P(态度=支持)= \frac {140} {310}\approx0.452 P(态度=支持)=3101400.452
P ( 态度 = 反对) = 120 310 ≈ 0.387 P(态度=反对)= \frac {120} {310}\approx0.387 P(态度=反对)=3101200.387
P ( 态度 = 无意见) = 50 310 ≈ 0.161 P(态度=无意见)= \frac {50} {310}\approx0.161 P(态度=无意见)=310500.161
同时,性别的取值分布如下:
P ( 性别 = 男性) = 150 310 ≈ 0.484 P(性别=男性) = \frac{150} {310}\approx0.484 P(性别=男性)=3101500.484
P ( 性别 = 女性) = 160 310 ≈ 0.516 P(性别=女性) = \frac{160} {310}\approx0.516 P(性别=女性)=3101600.516
现依据零假设,性别和态度相互独立,因此对于任意一名被调查者,同时性别=男性且态度=支持的概率为:
𝑃(性别=男性,态度=支持)=𝑃(性别=男性)∗𝑃(态度=支持)=0.484∗0.452=0.219
Notes:根据联合概率计算公式,当A、B两个随机变量相互独立时,𝑃(𝐴,𝐵)=𝑃(𝐴)∗𝑃(𝐵)
而目前,总共有310名被调查者,因此在零假设的情况下,性别=男性且态度=支持的被调查者总数期望为:
𝐸男性,支持=𝑃(性别=男性,态度=支持)∗310=0.219*310=68
而真实的统计结果是性别=男性且态度=支持总被调查者有80人,和期望人数有些差异,很明显,当实际人数和期望人数的差异越大,我们就越有理由怀疑零假设。但这种差异是不能通过性别和态度的一组取值结果来判定,我们还需要进一步查看列联表中其他位置的期望频数

支持反对无意见
男性685824
女性726226

对比统计频数表:

支持反对无意见
男性805020
女性607030

为了衡量二者的差异,我们可以构造如下统计量:
X 2 = ∑ i = 1 m ∑ j = 1 n ( O i , j − E i , j ) 2 E i , j \mathcal{X}^2 = \sum_{i=1}^{m}\sum_{j=1}^{n}\frac{(O_{i,j}-E_{i,j})^2}{E_{i,j}} X2=i=1mj=1nEi,j(Oi,jEi,j)2
其中i、j代表列联表的行和列,𝑂𝑖,𝑗表示i行j列的观测值(observe)、𝐸𝑖,𝑗表示期望值。而此处的X 就是卡方值,也就是卡方检验中的统计量。我们可以通过如下方式进行卡方值的计算:
在这里插入图片描述
对于二维列联表来说,自由度就是(𝑚−1)∗(𝑛−1)
,行数-1和列数-1的乘积:
(2-1)*(3-1)=2

借助scipy进行卡方检验

当然,上述过程我们也可以通过scipy快速执行,这里我们需要调用scipy模块下的stats模块,并借助其中chi2_contingency函数完成相关计算:

from scipy import stats
stats.chi2_contingency(observed = df)

在这里插入图片描述
chi2_contingency函数返回了四个结果,分别是卡方值、概率值、自由度以及期望频数表,和我们此前手动计算结果不完全一致,这可能是手动计算时四舍五入了,下面由计算机手动计算

需要注意的是,这里的p值既是事件发生的概率,同时也是我们后续在进行特征筛选时的一个评分,类似相关系数,p值越小说明越不独立,也就是说明这两个变量关联性越强。当然,除了p值意外,卡方值也可以作为评估关联性强弱的评分,卡方值越大、p值越小、不相关的假设越不成立、变量越相关。

import pandas as pd

data = {
    '支持': [80, 60],
    '反对': [50, 70],
    '无意见': [20, 30]
}

df = pd.DataFrame(data, index=['男性', '女性'])
print(df)

在这里插入图片描述
对df表按行按列汇总

df_count_all = df.copy()

df_count_all.loc['态度-all'] = df.sum(0)
df_count_all['性别-all'] = df_count_all.sum(1)
df_count_all

在这里插入图片描述
计算期望频数表。对于每个单元格,期望频数的计算应该是(性别_𝑎𝑙𝑙[𝑖]/𝑡𝑜𝑙)∗(态度_𝑎𝑙𝑙[𝑗]/𝑡𝑜𝑙)∗𝑡𝑜𝑙
,等于性别_𝑎𝑙𝑙[𝑖]∗态度_𝑎𝑙𝑙[𝑗]/𝑡𝑜𝑙

from itertools import product
性别_all = df_count_all.loc[:,'性别-all'].copy()
态度_all = df_count_all.loc[ '态度-all',:].copy()
for i, j in product(range(2), range(3)):
    Eij = 性别_all[i] * 态度_all[j] / tol
    df_temp.iloc[i, j] = Eij

在这里插入图片描述
在这里插入图片描述

至此,卡方值和chi2_contingency计算一样,我们完成了卡方值的手动计算流程。

3 连续变量的卡方检验

接下来,我们就可以考虑借助sklearn中的相关函数,通过卡方检验来进行特征筛选。不过这里需要注意的是,通常来说卡方检验是作用于离散变量之间的独立性检验,但sklearn中的卡方检验只需要参与检验的其中标签是离散特征即可,即sklearn中的卡方检验不仅可以作用于两个离散变量、还可以作用于连续变量和离散变量之间,因此我们这里需要补充介绍关于连续变量与离散变量之间的卡方检验计算流程,而在连续变量和离散变量的卡方检验中,自由度是离散变量类别数-1,也就是2-1=1

# 生成随机的连续变量和二分类变量
np.random.seed(0)
continuous_variable = np.random.rand(10)
binary_variable = np.random.choice([0, 1], size=10)

# 创建包含连续变量和二分类变量的DataFrame
df = pd.DataFrame({'ContinuousVariable': continuous_variable, 'Binaryariable': binary_variable})

# 打印DataFrame
print(df)

在这里插入图片描述
在这里插入图片描述

但需要注意的是,连续变量的取值毕竟不是频数结果,最终的卡方值会严重受到连续变量的量纲影响,而这种影响对统计推断而言是无意义的。因此,在实际进行连续变量的卡方检验过程中,建议先对原始变量进行标准化处理,该过程会将所有连续变量取值放缩至类似水平,同样也会将p值和卡方值放缩至同样水平,然后我们在单独针对连续变量进行BestK筛选,而不建议同时比较连续变量和离散变量的K值然后在一个流程中进行筛选(因为连续变量的p值和卡方值没有绝对大小的意义)

4 借助sklearn进行卡方检验特征筛选

sklearn其实是采用类似连续变量的卡方检验流程来进行的离散变量卡方检验。其实这也并不奇怪,对于sklearn来说,默认是不区分连续变量和离散变量的。并且计算过程中的自由度也不再是列联表行数-1和列数-1相乘的结果,而是标签取值水平-1。那就是可以统一自由度。原生的卡方检验的自由度是同时受到两个离散变量类别个数影响,此时带入不同离散变量时自由度可能不同,而不同的自由度将影响评分数值绝对值的有效性(自由度越高对评分大值容忍度就越高)

我们尝试借助sklearn进行基于卡方检验的特征筛选。该过程同样涉及评分函数和筛选评估器两部分,此处筛选评估器仍然选用SelectKBest,而卡方检验的评分函数是chi2:在最终的SelectKBest筛选过程,实际上是按照卡方值的大小,筛选卡方值最大的k个特征(不是按照p值进行筛选)。根据卡方检验的计算流程,卡方值不会存在负数情况,并且卡方值越大、说明变量之间关联关系越强 。相关实现流程如下

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
import numpy as np

# 加载示例数据集
iris = load_iris()
X, y = iris.data, iris.target
X = pd.DataFrame(X,columns=iris.feature_names)

在这里插入图片描述

# 使用卡方检验选择前两个最佳特征
KB_chi2 = SelectKBest(chi2, k=2)
X_new = KB_chi2.fit_transform(X, y)#输入特征减少到仅包含通过卡方检验选择出的前2个特征。

在这里插入图片描述

KB_chi2.scores_
#KB_chi2.scores_是指使用chi2统计测试后,每个特征的得分。
#在SelectKBest中,使用chi2统计测试对每个特征进行评分,表示该特征与目标变量之间的相关性或关联程度。
#得分越高表示特征与目标变量之间的关联程度越高。

在这里插入图片描述

KB_chi2.pvalues_#KB_chi2.pvalues_指的是使用chi2统计测试后,每个特征的p值。
#在统计学中,p值表示观察到的数据与原假设一致的概率。
#在特征选择中,p值可以用来衡量特征与目标变量之间的相关性。较低的p值表示特征与目标变量之间的关联性较高。

在这里插入图片描述

def SelectName(Select, KBest=True):
    """
    根据特征筛选评估器进行列名称输出函数
    
    :param Select: 训练后的特征筛选评估器
    :param KBest: 是否是挑选评分最高的若干个特征
    
    :return:保留特征的列名称
    """
    if KBest == True:
        K = Select.k
    else:
        l = np.array(range(Select.n_features_in_))
        K = (l > np.percentile(l, 100 - Select.percentile)).sum()
    
    threshold = sorted(Select.scores_, reverse=True)[K-1]
    
    col_names = []

    for score, col in zip(Select.scores_, Select.feature_names_in_):
        if score >= threshold:
            col_names.append(col)
            
    return col_names
SelectName(KB_chi2)

在这里插入图片描述
可以看到,前两名特征跟我们之前看到的一样,至此,卡方检验原理介绍完毕!

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

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

相关文章

数控开料机对比木工雕刻机的优势

数控开料机和木工雕刻机都属于木工机械加工设备,都可以用来开料和雕刻,但在市场价格、床体结构、技术要求等方面二者存在不小的差异,那么全自动数控开料机对比普通木工雕刻机有什么优势呢。 首先我们都知道,木工雕刻机主要应用于…

从优化设计到智能制造:生成式AI在可持续性3D打印中的潜力和应用

可持续性是现代工业中一个紧迫的问题,包括 3D 打印领域。为了满足环保制造实践日益增长的需求,3D 打印已成为一种有前景的解决方案。然而,要使 3D 打印更具可持续性,还存在一些需要解决的挑战。生成式人工智能作为一股强大的力量&…

计算机网络面试八股复习:常见的7/5/4层网络模型、各层协议以及键入网址到显示页面的流程

七层/五层/四层 网络模型 名称 OSI七层模型 TCP/IP四层模型 五层模型 关系图 常见协议 精简部分,完整版见上图 应用层 : TFTP(简单文件传输协议),HTTP,DNS,RIP(路由信息协议) 表…

阿里云实时计算企业级状态存储引擎 Gemini 技术解读

本文整理自阿里云 Flink 存储引擎团队李晋忠,兰兆千,梅源关于阿里云实时计算企业级状态存储引擎 Gemini 的研究,内容主要分为以下五部分: 流计算状态访问的痛点企业级状态存储引擎GeminiGemini 性能评测&线上表现结语参考 一、…

原型模式

为什么要使用原型模式 不用重新初始化对象,而是动态地获得对象运行时的状态。适用于当创建对象的成本较高时,如需进行复杂的数据库操作或复杂计算才能获得初始数据。 优点是可以隐藏对象创建的细节,减少重复的初始化代码;可以在…

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…

分布式数据库原理及技术题目汇总(上)

题目汇总 选择 1.(单选题,3.0分)以下说法中不正确的是(B )。 A.HIVE中create table命令使用时,表类型可以存储为ORC。 B.HIVE中create table命令使用时,必须包含row format delimited。 C.HIVE中create table命令使用时若含r…

儿童护眼台灯什么品牌好?儿童护眼台灯品牌排行

台灯大家都不陌生,但使用它的人有多少呢,准确使用的人又有多少呢,我们就是为了照明才会去买台灯,而时间久了,你就会眼睛刺痛,那就是没有选对台灯和没有正确使用台灯,还是建议大家买具有护眼功能…

首次落地零担快运!商用车自动驾驶跑出交付加速度

即将迈入2024年,还活着的自动驾驶玩家,身上有两个显著标签:选对了细分赛道、会玩。 10月以来,Cruise宣布在美国德州奥斯汀、休斯顿、亚利桑那州凤凰城和加州旧金山全面停止所有自动驾驶出租车队运营服务,通用汽车计划…

OSS 上传的操作

OSS 上传的操作&#xff1a; 依赖包&#xff1a; <!-- 阿里云OSS --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency> 配置文…

基于Java SSM框架实现音乐推荐网站项目【项目源码+论文说明】

基于java的SSM框架实现音乐推荐网站演示 摘要 中国风音乐推介网站近年来已成为风靡全球的新兴艺术形式。国内涌现出了大批优秀、有才华的爱好者和许多经久不衰的经典作品。中国风音乐推介网站的兴起打破了音乐界格局,也突破了原有分类唱法发展中的瓶颈,为声乐艺术的发展开辟了…

为啥领导都爱说“我只看结果”?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码

承接上文&#xff0c;之前已经分析过OpenFegin 的创建、发送请求源码了&#xff0c;接下来&#xff0c;分析下底层的HttpClient、HttpURLConnection、OkHttpClient切换从源码级别来看是如何做到的。 Spring Cloud OpenFegin&#xff08;创建、发送请求&#xff09;源码 Http…

创建mysql普通用户

一、创建mysql普通用户的原因&#xff1a; 权限控制&#xff1a;MySQL的权限系统允许您为每个用户分配特定的权限。通过创建普通用户&#xff0c;您可以根据需要为每个用户分配特定的数据库和表权限&#xff0c;而不是将所有权限授予一个全局管理员用户。这有助于提高数据库的…

浮动和定位

目录​​​​​​​ &#x1f333;浮动 &#x1f340;去浮动 &#x1f343;方法一 &#x1f343;方法二 &#x1f343;方法三 &#x1f333;定位 &#x1f340;相对定位 &#x1f340;绝对定位 &#x1f340;固定定位 &#x1f333;转义字符 浮动 浮动会脱离文档流.导…

部署vue项目的常见问题汇总--许锅锅

文章目录 vue项目的常见问题版本问题/控制台指令识别问题【node和npm的版本要对应】加载慢的问题【设置镜像即可】设置淘宝镜像cmd窗口内容 npm/cnpm install的问题 npm WARN deprecated core-js3.6.5: core-js&#xff1c;3.23.3 is no longer maintained and not recommended…

计算机毕业设计------SSH宿舍管理系统

项目介绍 本项目分为三种角色&#xff1a;系统管理员、楼宇管理员、学生&#xff1b; 系统管理员主要功能如下&#xff1a; 楼宇管理员管理、学生管理、楼宇管理、宿舍管理、学生入住登记、学生寝室调换、学生迁出登记、学生缺勤记录、修改密码、退出登录 楼宇管理员主要功能…

新接入荣耀 SDK,混淆出包,登录提示框显示不全

荣耀联运客户端 SDK 刚出来不就&#xff0c;看文档第一个对外版本也就是 2023 年 8 月&#xff0c;所以最近开始接入&#xff0c;中间也遇到了一些麻烦折腾了不少时间。 什么意思呢 正常的登录提示 UI 是这样的&#xff0c;能够完整的显示 UI 部分&#xff08;此前是通过定制…

计算机毕业设计-----SSH校园精品课程网前后台

项目介绍 本项目是很不错的一个校园精品课程网源码&#xff0c;前台和后台源码都有&#xff0c;分为管理员与学生两种角色&#xff1b; 前台功能&#xff1a;网站首页&#xff0c;校园新闻&#xff0c;课程中心&#xff0c;资源下载&#xff0c;互动交流&#xff0c;个人中心…

借助GPT理解 “ Android中 点击弹框外部 取消弹框”

在平常的开发工作中 或 阅读技术博客/书籍 时&#xff0c;难免会遇到我们不懂的知识点&#xff0c;网络上搜索的资料 需要有准确性&#xff0c;系统性&#xff0c;可实操性。 这样的资料查询很费时间且还不一定能找到&#xff0c;但是如果借助训练过的的gpt&#xff0c;就会省下…