比例抽样分布逻辑错误:200样本次品概率计算异常排查
问题排查与修正方案
错误原因分析
1. 核心逻辑误解:误用正态CDF的含义
你调用的norm.cdf(z_value)计算的是样本次品率≤i/200的累积概率,而非“恰好有i件次品的概率”。当i增大到30以上时,样本次品率远高于总体次品率0.1,对应的z值会急剧增大,norm.cdf(z)会趋近于1,因此显示为100%,这完全不符合你需求的“恰好i件次品”的概率逻辑。
2. 模型选择偏差
已知总体次品率固定,抽取n件样本中的次品数服从二项分布(Binomial Distribution),而非直接使用正态累积分布。即便大样本下二项分布可近似为正态分布,也需要通过区间概率差值来近似离散点的概率,而非直接调用CDF。
修正后的代码实现
方法1:二项分布精确计算(推荐)
直接使用二项分布的概率质量函数(PMF)计算恰好i件次品的概率:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import binom n = 200 # 样本量 P = 0.10 # 总体次品率 # 生成题目要求的i范围:1到100 not_working = range(1, 101) # 计算恰好i件次品的概率(转换为百分比) prob = binom.pmf(not_working, n, P) * 100 # 绘图 sns.lineplot(x=not_working, y=prob) plt.xlabel('次品数量') plt.ylabel('概率(%)') plt.title('200件样本中恰好i件次品的概率') plt.show()
方法2:正态近似(大样本场景)
若要用正态分布近似二项分布,必须加入连续性修正(离散转连续的必要处理),通过计算区间概率差值来近似离散点的概率:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import norm n = 200 P = 0.10 mu = n * P # 正态分布均值 sigma = np.sqrt(n * P * (1 - P)) # 正态分布标准差 not_working = range(1, 101) # 连续性修正:计算[i-0.5, i+0.5]区间的累积概率差值 prob = (norm.cdf((np.array(not_working)+0.5 - mu)/sigma) - norm.cdf((np.array(not_working)-0.5 - mu)/sigma)) * 100 # 绘图 sns.lineplot(x=not_working, y=prob) plt.xlabel('次品数量') plt.ylabel('概率(%)') plt.title('200件样本中恰好i件次品的概率(正态近似)') plt.show()
内容的提问来源于stack exchange,提问作者Josue Medina
相关产品推荐
相关产品推荐

