检验两个群体(B为A子集)频率差异的统计检验及Python实现
合适的统计检验方法与Python实现
适用的统计检验方法
群体B是A的子集,本质是对比被筛选入B的群体和未被筛选入B的群体在目标特征上的频率差异。需先构建2×2列联表,再根据样本量选择检验方法:
- 卡方检验(Chi-Square Test):当列联表所有单元格的期望频数≥5时使用,用于验证群体归属与目标特征是否独立。
- Fisher精确检验(Fisher's Exact Test):当单元格期望频数<5时使用,适合小样本场景,直接计算精确p值。
操作步骤
- 整理频数数据,构建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)
- A群体总人数:
- 根据样本情况选择检验方法,以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
相关产品推荐
相关产品推荐

