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

如何正确绘制总体比例置信区间?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41