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

Python中如何处理现有列联表数据以执行ChiSquare检验?

针对已有列联表的卡方检验实现方案

核心结论

你手里的表格已经是标准的列联表格式,不需要额外从原始数据转换,直接对这个频数矩阵执行卡方检验即可。


步骤1:加载Excel数据并设置行索引

用pandas加载数据时,直接指定Category列为行索引,让数据结构更贴合列联表逻辑:

import pandas as pd

# 替换成你的Excel文件路径
df = pd.read_excel("your_data.xlsx", index_col="Category")

加载后的DataFrame结构和你提供的表格一致,行标签为Smoker/not-s,列是各类疾病,值为对应频数。

步骤2:提取卡方检验所需的数值矩阵

卡方检验只需要纯数值的二维频数数组,直接从DataFrame中提取即可:

# 提取所有数值列组成的矩阵
observed_frequencies = df.values

步骤3:执行卡方检验

使用scipy.stats中的chi2_contingency函数,它直接支持列联表格式的输入:

from scipy.stats import chi2_contingency

# 执行检验,返回卡方值、P值、自由度、期望频数矩阵
chi2_stat, p_value, degrees_of_freedom, expected_frequencies = chi2_contingency(observed_frequencies)

# 格式化输出结果
print(f"卡方统计量: {chi2_stat:.2f}")
print(f"P值: {p_value:.4f}")
print(f"自由度: {degrees_of_freedom}")
print("\n期望频数表:")
# 把期望频数转成带标签的DataFrame方便查看
print(pd.DataFrame(expected_frequencies, index=df.index, columns=df.columns))

关键说明

  • 设置行索引不是检验的强制要求,但能让输出的期望频数表和原始数据对应,可读性更强;如果不设置,直接用df.iloc[:, 1:]提取数值列也能完成检验(但不推荐)。
  • chi2_contingency函数默认已经做了连续性修正(针对2x2表),如果不需要可以添加参数correction=False。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:33:18