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

如何用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)

关键说明

  1. 列联表生成:pd.crosstab(df['Sex'], df[col])会自动忽略包含NaN的样本,避免缺失值干扰检验结果
  2. 卡方检验选择:chi2_contingency专门用于检验两个分类变量的独立性,输出的p值表示“两组在该特征上无差异”的概率
  3. 结果存储:用字典收集所有特征的检验结果,最后转成DataFrame更易读

如果部分列联表的期望频数小于5,建议改用Fisher精确检验(scipy.stats.fisher_exact),替换代码中chi2_contingency的部分即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:44:57