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

检验两个群体(B为A子集)频率差异的统计检验及Python实现

合适的统计检验方法与Python实现

适用的统计检验方法

群体B是A的子集,本质是对比被筛选入B的群体和未被筛选入B的群体在目标特征上的频率差异。需先构建2×2列联表,再根据样本量选择检验方法:

  • 卡方检验(Chi-Square Test):当列联表所有单元格的期望频数≥5时使用,用于验证群体归属与目标特征是否独立。
  • Fisher精确检验(Fisher's Exact Test):当单元格期望频数<5时使用,适合小样本场景,直接计算精确p值。

操作步骤

  1. 整理频数数据,构建2×2列联表:
    假设:
    • A群体总人数:total_A,具有目标特征的人数:count_A
    • B群体总人数:total_B,具有目标特征的人数:count_B
      列联表的四个单元格为:
    • B群体有特征:count_B
    • B群体无特征:total_B - count_B
    • A-B群体有特征:count_A - count_B
    • A-B群体无特征:(total_A - total_B) - (count_A - count_B)
  2. 根据样本情况选择检验方法,以p<0.05为标准判断差异是否显著。

Python代码实现

使用scipy.stats库完成检验:

from scipy.stats import chi2_contingency, fisher_exact
import numpy as np

# 替换为你的实际数据
total_A = 100  # A群体总人数
count_A = 30   # A群体中具有目标特征的人数
total_B = 40   # B群体总人数(A的子集)
count_B = 20   # B群体中具有目标特征的人数

# 构建2×2列联表
table = np.array([
    [count_B, total_B - count_B],
    [count_A - count_B, (total_A - total_B) - (count_A - count_B)]
])

print("构建的2×2列联表:")
print(table)

# 判断检验方法
expected = chi2_contingency(table)[3]
if (expected >= 5).all():
    print("\n使用卡方检验:")
    chi2, p, dof, expected = chi2_contingency(table)
    print(f"卡方值:{chi2:.4f}")
    print(f"自由度:{dof}")
    print(f"p值:{p:.4f}")
else:
    print("\n使用Fisher精确检验:")
    odds_ratio, p = fisher_exact(table)
    print(f"优势比:{odds_ratio:.4f}")
    print(f"p值:{p:.4f}")

# 显著性判断
alpha = 0.05
if p < alpha:
    print(f"\n在α={alpha}的水平下,两组频率差异具有显著性")
else:
    print(f"\n在α={alpha}的水平下,两组频率差异不具有显著性")

注意事项

  • 确保列联表单元格数值为非负整数,若出现负数需检查输入数据的逻辑合理性(比如count_B不能大于count_A)。
  • 若目标特征为多分类,可扩展为R×C列联表,使用卡方检验,但需保证数据符合检验前提。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:22:20