多二元变量卡方假设检验:苗圃植物健康影响因素分析求助
批量执行卡方检验分析植物健康与影响因素的关联
问题解决思路
你当前的核心问题是未实现批量遍历所有影响因素的逻辑,原代码中的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
相关产品推荐
相关产品推荐

