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

多二元变量卡方假设检验:苗圃植物健康影响因素分析求助

批量执行卡方检验分析植物健康与影响因素的关联

问题解决思路

你当前的核心问题是未实现批量遍历所有影响因素的逻辑,原代码中的melt操作将所有因素合并到同一列,反而不利于单独生成每个因素与plant_health的列联表。正确的做法是直接遍历每个因素列,分别生成交叉表并执行卡方检验。

完整实现代码

import pandas as pd
from scipy.stats import chi2_contingency

# 示例数据
df = pd.DataFrame({
    'plant_health': ['a','b','c','a','b','b'],
    'factor_1': ['yes','no','no','no','yes','yes'],
    'factor_2': ['yes','yes','no','no','yes','yes'],
    'factor_3': ['yes','no','no','yes','yes','yes'],
    'factor_4': ['yes','yes','no','no','yes','yes'],
    'factor_5': ['yes','no','yes','no','yes','yes'],
    'factor_6': ['yes','no','no','no','yes','yes'],
    'factor_7': ['yes','yes','no','yes','yes','yes'],
    'factor_8': ['yes','no','yes','no','yes','yes'],
    'factor_9': ['yes','yes','yes','yes','yes','yes'],
})

# 筛选有效因素列:排除plant_health,且过滤掉只有单一值的无效因素
factor_cols = [
    col for col in df.columns 
    if col.startswith('factor_') and df[col].nunique() > 1
]

# 存储所有检验结果
chi2_results = {}

# 批量遍历执行卡方检验
for factor in factor_cols:
    # 生成当前因素与植物健康的列联表
    contingency_table = pd.crosstab(df['plant_health'], df[factor])
    # 执行卡方检验,获取结果
    chi2_stat, p_val, dof, expected_freq = chi2_contingency(contingency_table)
    # 存储当前因素的检验结果
    chi2_results[factor] = {
        '卡方统计量': round(chi2_stat, 4),
        'p值': round(p_val, 4),
        '自由度': dof,
        '期望频数表': expected_freq.round(2)
    }

# 转换为DataFrame,方便查看和导出
results_df = pd.DataFrame(chi2_results).T
print("批量卡方检验结果:")
print(results_df)

关键说明

  • 无效因素过滤:代码中自动排除了只有单一值的因素(如示例中的factor_9),这类因素无法提供有效关联信息,还会导致卡方检验报错。
  • 结果解读:
    • p值<0.05时,可认为该因素与植物健康存在显著关联
    • 卡方统计量越大,说明实际频数与期望频数的差异越显著
  • 前提条件:卡方检验要求至少80%的单元格期望频数≥5,若不满足,可考虑合并plant_health或因素的类别,或改用Fisher精确检验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:55:22