如何正确绘制总体比例置信区间?Sex列置信区间异常求助
解决二元变量条形图置信区间触碰到X轴的问题
我尝试为数据框(df)中的「Sex」列(二元变量,取值为Male或Female)绘制带置信区间的条形图,但生成的图里置信区间触碰到了X轴,结果不符合预期。
原代码
p = df['Sex'].value_counts(normalize=True) n = len(df) se = np.sqrt(p * (1 - p) / n) z = stats.norm.ppf(0.957) # Z-score for 95% confidence level ci_lower = p - z * se ci_upper = p + z * se fig, ax = plt.subplots() ax.bar(p.index, p.values) ax.errorbar(p.index, p.values, yerr=[ci_lower, ci_upper],ecolor='red', fmt='none', capsize=10)
问题原因
errorbar的yerr参数要求传入的是相对于数据点(条形顶端)的误差幅度,而非绝对的置信区间上下限。当前代码直接传入ci_lower(绝对下限),当该值接近0或为负数时,误差线会向下延伸至X轴甚至超出,导致显示异常。
另外,95%置信区间对应的Z值应为stats.norm.ppf(0.975)(双侧检验,尾部各占2.5%),原代码用的0.957对应的置信水平约为91.4%,不符合预期。
修复后的代码
import numpy as np import scipy.stats as stats import matplotlib.pyplot as plt p = df['Sex'].value_counts(normalize=True) n = len(df) se = np.sqrt(p * (1 - p) / n) z = stats.norm.ppf(0.975) # 正确的95%置信区间Z值 ci_lower = p - z * se ci_upper = p + z * se # 计算相对于条形顶端的误差幅度 yerr_lower = p - ci_lower yerr_upper = ci_upper - p fig, ax = plt.subplots() ax.bar(p.index, p.values) # 传入误差幅度而非绝对上下限 ax.errorbar(p.index, p.values, yerr=[yerr_lower, yerr_upper], ecolor='red', fmt='none', capsize=10) # 确保Y轴从0开始,避免误差线超出合理范围 ax.set_ylim(bottom=0) plt.show()
补充说明
- 通过计算
yerr_lower和yerr_upper,明确了误差线相对于条形顶端的上下偏移量,确保误差区间显示正确。 - 设置
ax.set_ylim(bottom=0)可以强制Y轴从0起始,符合比例数据的可视化逻辑,同时避免误差线向下超出图表范围。 - 修正Z值后,置信区间能准确对应95%的置信水平。
内容的提问来源于stack exchange,提问作者Flavine_Kid
相关产品推荐
相关产品推荐

