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
相关产品推荐
相关产品推荐

