You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何对Pandas DataFrame的object型分类列执行卡方检验

如何在Pandas中对Object类型的分类变量执行卡方检验?

没问题,我来一步步帮你搞定这个卡方检验的事儿~首先咱们得明确:卡方检验的核心是基于变量组合的频数表(列联表),不管你的变量是object还是category类型,只要能统计出每个类别组合的出现次数,就能顺利执行检验。下面是具体步骤:

1. 可选但推荐:将Object类型转为分类类型

虽然直接用object类型也能统计频数,但转成category类型会更高效,尤其是你的特征变量有300个唯一值,处理速度会快很多:

import pandas as pd
from scipy.stats import chi2_contingency

# 假设你的DataFrame名为df,目标变量是target,特征变量是feature
df['target'] = df['target'].astype('category')
df['feature'] = df['feature'].astype('category')

2. 生成列联表

用Pandas的crosstab函数生成两个变量的频数交叉表,这是卡方检验的输入基础:

contingency_table = pd.crosstab(df['feature'], df['target'])

⚠️ 这里要留意:如果某个特征类别对应的目标变量频数特别少(比如小于5),卡方检验的假设前提(期望频数≥5)就不满足,结果可能会失真,后面会说怎么处理这种情况。

3. 执行卡方检验

用scipy.stats里的chi2_contingency函数,它会直接返回卡方检验的关键结果:

chi2_stat, p_value, degrees_of_freedom, expected_freq = chi2_contingency(contingency_table)

4. 解读检验结果

重点看p值:

  • 如果p值小于你的显著性水平(通常取0.05),就可以拒绝“两个变量独立”的原假设,说明特征变量和目标变量存在显著相关性;
  • 如果p值≥0.05,就没有足够证据证明二者存在关联。

你可以这样打印结果来直观查看:

print(f"卡方统计量: {chi2_stat:.2f}")
print(f"p值: {p_value:.4f}")
print(f"自由度: {degrees_of_freedom}")

针对300个唯一值特征的特殊注意事项

因为你的特征变量有300个类别,很容易出现大量单元格的期望频数小于5,这时候卡方检验的可靠性会下降。你可以试试这些办法:

  • 合并低频数类别:把出现次数极少的类别归为“其他”组,减少稀疏单元格的数量;
  • 用Cramér's V系数衡量相关性强度:它是专门针对分类变量的相关性指标,不受类别数量的影响,范围在0到1之间,越接近1相关性越强:
    import numpy as np
    cramers_v = np.sqrt(chi2_stat / (len(df) * (min(contingency_table.shape) - 1)))
    print(f"Cramér's V系数: {cramers_v:.4f}")
    

内容的提问来源于stack exchange,提问作者geek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:29:07