如何用Python编写卡方检验循环代码?含NaN值处理需求
按Sex分组做多列卡方检验的修正代码及说明
原代码问题点
- 误用函数:
chisquare是拟合优度检验,不适合分组独立性检验,应使用chi2_contingency(卡方独立性检验) - 循环逻辑无效:仅定义了分组变量,但未执行检验、未保存结果
- 赋值逻辑错误:直接给
df['p']赋值不符合需求——每个特征对应一个p值,而非每行一个 - NaN处理不当:全局
dropna()会删除所有含缺失值的行,应针对单个特征与Sex的组合过滤缺失值
修正后代码
from scipy.stats import chi2_contingency import pandas as pd import numpy as np # 定义需要检验的特征列 test_columns = ['Fulm_NF_Neg','HTN','DM','comp_risk_CV1yr'] # 用于保存检验结果的字典 results = {'特征名': [], '卡方值': [], 'p值': [], '分组差异': []} for col in test_columns: # 生成列联表,自动排除含NaN的样本 contingency_table = pd.crosstab(df['Sex'], df[col]) # 执行卡方独立性检验 chi2, p, dof, expected = chi2_contingency(contingency_table) # 判断分组差异显著性 diff_result = '无显著差异' if p > 0.05 else '有显著差异' # 存入结果 results['特征名'].append(col) results['卡方值'].append(round(chi2, 4)) results['p值'].append(round(p, 4)) results['分组差异'].append(diff_result) # 转换为DataFrame方便查看结果 result_df = pd.DataFrame(results) print(result_df)
关键说明
- 列联表生成:
pd.crosstab(df['Sex'], df[col])会自动忽略包含NaN的样本,避免缺失值干扰检验结果 - 卡方检验选择:
chi2_contingency专门用于检验两个分类变量的独立性,输出的p值表示“两组在该特征上无差异”的概率 - 结果存储:用字典收集所有特征的检验结果,最后转成DataFrame更易读
如果部分列联表的期望频数小于5,建议改用Fisher精确检验(scipy.stats.fisher_exact),替换代码中chi2_contingency的部分即可。
内容的提问来源于stack exchange,提问作者Osi
相关产品推荐
相关产品推荐

