统计话题谈一谈 - 软件质量的统计入门(No.8 概率的直觉与计算:了解“偶然”的本质)
Back to Top
为了覆盖更广泛的受众,这篇文章已从日语翻译而来。
您可以在这里找到原始版本。
引言
#在「统计话题谈一谈」第8回中,将解说对「概率」的直观理解和基本计算方法,以及在质量管理现场实用的概率分布。
“为什么会有那样的缺陷?”
“只是碰巧测试没有发现而已吧?”
——用来科学地处理这种“偶然”现象的工具就是“概率”。
本文将围绕以下三种代表性分布进行解说:
- 二项分布(Binomial Distribution)
- 泊松分布(Poisson Distribution)
- 正态分布(Normal Distribution)
要正确理解这些“概率分布”,还需要触及其前提的概率论(Probability Theory)。
概率分布是“基于概率论构建的模型”,
是用来以数学形式表示“在若干次试验中成功多少次”“分布有多大”等现象的工具。
因此,本文前半将先概览概率论的基本(试验·事件·概率的定义),
后半则介绍代表性的概率分布(离散型·连续型)。
1. 什么是概率论?:统计推断的理论基础
#“概率论”是将随机事件发生的概率用数学方式描述·预测的理论体系。
与统计推断作为“从实际数据中得出判断的实务性手法”不同,
概率论为此提供了理论基础。
比较项目 | 概率论 | 统计推断 |
---|---|---|
范围 | 提供理论框架 | 实践性的数据分析 |
方法 | 构建数学模型和法则 | 从数据中提取见解并做决策 |
数据处理 | 理论事件的概率 | 从实际数据推断总体 |
试验和事件的定义
#-
试验(Trial):指因偶然因素而结果会变化的实验或操作
例:抽一次签;对网站进行一次加载测试 -
事件(Event):指试验结果可能发生的情况
例:“抽中中奖签”、“发生加载错误”
概率的公理性定义(拉普拉斯概率)
#[
P(A) = \frac{\text{符合事件A的情况数}}{\text{所有试验结果的总数}}
]
例如,当在10张签中有2张是中奖签时,抽到中奖签的概率为
[
P(\text{中奖}) = \frac{2}{10} = 0.2
]
概率论所处理的主要概念
#- 概率分布(离散·连续)
- 条件概率
- 独立性
- 期望值·方差·标准差
- 大数定律/中心极限定理(※1) 等
※1:大数定律/中心极限定理是什么
-
大数定律(Law of Large Numbers):
当样本数(样本量)增加时,样本平均 会无限接近总体平均 的原理。
→ 与“只要观测多,就能看到整体趋势”直觉相近。 -
中心极限定理(Central Limit Theorem):
无论总体分布形状如何,只要取足够数量的样本平均,它们就会趋近正态分布的定理。
→ 这也是“基于正态分布前提的统计方法”能够广泛应用的原因。
这些理论是支撑“为什么能从样本推断总体特性?”这一统计推断逻辑基础的柱石。
详细内容将在后续回合中详细讨论。
由此可见,理解概率论就成了支撑统计推断前提的力量,
也是回答“为什么能从样本了解总体?”这一问题的理论基础。
2. 什么是概率?
#日常生活中潜藏的“概率”直觉
#一提到“概率”,你会想到什么?
骰子、扭蛋、天气预报、彩票……。
这些现象都受“偶然”影响,但我们往往将它们归为“无法预测的事件”。
然而,概率是捕捉“偶然之中规律性”的工具。
在统计学中,我们利用概率定量地判断“发生的可能性有多大”“是否不能说是不可能”。
实际上,我们每天都在无意识地进行概率判断后行动。
- “今天看起来会下雨,还是带把伞吧”
- “这个功能在发布前可能会出现缺陷”
- “上次评审被指出很多问题,这次应该会减少”
这种评估“可能发生的概率”并据此判断的能力,正是使用概率进行决策的第一步。
软件质量与概率
#在软件开发中,以下场景与概率息息相关:
- 缺陷发生频率(单位时间内缺陷出现的概率)
- 测试的检测能力(发现缺陷的概率)
- 风险评估(缺陷发生概率 × 影响度)
也就是说,“概率”不仅仅是数学话题,还是用数值描述质量的通用语言。
概率的基本定义
#那么,“概率”究竟是什么?
最基本的定义如下:
[
P = \frac{\text{发生模式数}}{\text{总模式数}}
]
例:测试中检测到缺陷的概率
#进行10个测试用例,其中2个检测到了缺陷。
此时,“在一次测试中发现缺陷的概率”为?
- 发生模式数:2种情况(2个检测到缺陷)
- 总模式数:10种情况(测试用例总数)
[
P(\text{缺陷检测}) = \frac{2}{10} = 0.2
]
这样,将“在整体中,目标结果可能发生的程度”以比例表示的就是概率。
概率分布的整体概览
#概率分布是以“分布”的形式展示“概率性变化的数值以何种形式出现”。
下面将分类介绍代表性的分布。
分布名称 | 应用示例 | 分布类型(※2) | 特点 |
---|---|---|---|
二项分布 | 成功/失败的次数 | 离散 | 有限次试验中的成功次数 |
泊松分布 | 单位时间内的缺陷数量 | 离散 | 稀有事件的发生次数 |
几何分布 | 首次成功前的试验次数 | 离散 | 关注成功前的失败次数 |
正态分布 | 评审时间、工时等 | 连续 | 钟形分布,基于中心极限定理 |
均匀分布 | 随机初始值 | 连续/离散 | 所有数值等概率 |
指数分布 | 下一次缺陷出现前的时间 | 连续 | 恒定的发生率 |
※2:概率分布的分类:
概率分布根据“变量如何变动”可分为离散分布和连续分布。
类型 | 说明 | 示例 | 函数 |
---|---|---|---|
离散分布 | 数值以离散的个别值存在 | 骰子点数、缺陷数量 | 概率质量函数(PMF) |
连续分布 | 数值在任意区间内连续存在 | 身高、评审执行时间 | 概率密度函数(PDF) |
● 离散分布(Discrete Distribution):
- 变量的取值被限制为“可数”的个别值。
- 示例:
- 骰子点数(1~6 的整数)
- 测试中检测到的缺陷数量(0个、1个、2个……)
在离散分布中,可以定义“恰好等于 x 的概率”。
示例:
● 连续分布(Continuous Distribution):
- 变量的取值是连续的(无限平滑存在)。
- 示例:
- 测试执行时间(如 21.34 秒)
- CPU 使用率(如 48.123%)
在连续分布中,“恰好等于 x 的概率”为零。
取而代之的是考虑“落在 x~y 之间的概率”。
示例:
理解此差异后,能够选择合适的分布模型和函数(PMF / PDF)。
关于函数(PMF / PDF)的详细介绍将在后文展开。
从描述统计到推断统计
#在众多概率分布中,本回将说明“二项分布”、“泊松分布”和“正态分布”。
这三种分布是连接描述统计与推断统计的核心。
掌握它们的使用场景,可以拓宽统计分析的广度,并使实务应用更顺畅。
● 二项分布
- 当存在多次“成功或失败”等二选一的试验时使用的模型。
→ 示例:当发现缺陷的概率为30%时,10次评审可以发现多少缺陷?
● 泊松分布
- 关于单位时间/单位区域内稀有事件发生频率的模型。
→ 示例:当平均每天产生2个缺陷时,某天出现5个缺陷的概率是多少?
● 正态分布
- 自然界和实务数据最易服从的分布。
→ 基于中心极限定理的性质,实务中的许多量化数据(工时、时间等)会趋近于正态分布。
3. 二项分布:发生与否的概率
#“成功或失败”“有缺陷或无缺陷”等情况下,使用重复进行二选一试验的概率模型。
例如,当想研究在100次测试中能否发现缺陷时,想要得到**“在每次试验成功概率为 p 的情况下重复进行 n 次时成功次数的分布”时,就要使用二项分布**。
● 二项分布的定义和公式
#二项分布(Binomial Distribution)定义如下:
[
P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k}
]
- :试验次数(示例:100次测试)
- :成功次数(示例:发现的缺陷数量)
- :单次试验成功的概率(示例:一次测试中发现缺陷的概率)
二项分布的概率称为概率质量函数(※3)(PMF: Probability Mass Function)。
※3:概率质量函数
与“连续分布”使用概率密度函数(PDF)不同,离散分布(如二项分布、泊松分布等)是为特定的取值赋予概率,因此使用“质量(mass)”一词而非“密度”。
(关于概率密度函数(PDF)的内容,将在正态分布部分说明。)
● 使用 Python 可视化二项分布形状
#这段代码用于绘制试验次数 、成功概率 的二项分布。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
plt.rcParams['font.family'] = 'Meiryo'
n = 100 # 试验次数
p = 0.1 # 成功概率
x = np.arange(0, 31)
pmf = binom.pmf(x, n, p)
plt.bar(x, pmf, color='skyblue', edgecolor='black')
plt.title("二項分布(n=100, p=0.1)")
plt.xlabel("バグ検出数")
plt.ylabel("確率")
plt.tight_layout()
plt.show()
该图表示“在做100次测试时,缺陷检测数量为 k 的概率分布”。
概率最高的在10件左右,但大于20件的可能性也并非零。
二项分布绘图代码解析
-
scipy.stats.binom.pmf(x, n, p)
→ 计算二项分布的概率质量函数(PMF)。
对每个 计算“成功次数为 的概率”。 -
x = np.arange(0, 31)
→ 将要显示的成功次数(此处为缺陷检测数量)范围设置为 0~30。 -
plt.bar(...)
→ 以条形图绘制概率。
通过该图,可以直观地理解“在100次测试中,大约会检测到多少缺陷”的概率分布情况。
● 软件质量应用示例
#当某缺陷的检测概率为 10% 时,进行100次测试的情况:
- “恰好检测到10个缺陷的概率” 以及
- “检测到20个及以上的概率” 等等都可以计算。
计算检测到20个及以上缺陷的概率:
from scipy.stats import binom
n = 100
p = 0.1
P_20_or_more = 1 - binom.cdf(19, n, p) # cdf(19) 表示 P(X<=19),所以用1减去它就得到 P(X>=20),这样是正确的。
print(f"20件以上検出される確率:{P_20_or_more:.4f}")
计算结果为“检测到20个及以上缺陷的概率:0.0020”。
由此可见,二项分布在把握“是否发生”的重复试验全貌方面非常有效。
4. 泊松分布:预测稀有事件的次数
#“每天会出现多少缺陷?”
“在1000行代码中会发生多少次崩溃?”
——在处理某一时间段或区域内的**“发生次数”**时,就会用到泊松分布。
● 泊松分布的定义和公式
#泊松分布(Poisson Distribution)定义如下:
[
P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}
]
- :单位时间段(或区域)内的平均发生次数(示例:缺陷的平均数量)
- :实际发生的次数(0次、1次、2次……)
当满足以下条件时,可使用此分布:
- 想要了解在固定时间段/区域内稀有事件的发生次数时
- 事件可假设相互独立地发生时
- 单位时间(或区域)内的发生率恒定时
● 使用 Python 可视化泊松分布形状
#这段代码根据泊松分布(平均 λ=3),以条形图绘制“每天发生缺陷数量的概率分布”。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import poisson
plt.rcParams['font.family'] = 'Meiryo'
λ = 3 # 平均3个/天
x = np.arange(0, 11)
pmf = poisson.pmf(x, mu=λ)
plt.bar(x, pmf, color='lightgreen', edgecolor='black')
plt.title("ポアソン分布(λ=3)")
plt.xlabel("1日に発生するバグ数")
plt.ylabel("確率")
plt.tight_layout()
plt.show()
该图表示“假设平均每天发生3个缺陷时,0~10个缺陷出现的概率”。
可以直观地确认2~4个为高频出现,6个以上则很少,这种直觉化的“波动”特征。
泊松分布绘图代码解析
-
λ = 3
→ 缺陷的平均发生次数(每天3个)。 -
scipy.stats.poisson.pmf(x, mu=λ)
→ 计算泊松分布的概率质量函数(PMF)。
对每个x
计算“每天发生 x 个缺陷的概率”。 -
x = np.arange(0, 11)
→ 定义要显示的发生次数范围(0~10次)。 -
plt.bar(...)
→ 用条形图绘制计算得到的概率。
● 软件质量应用示例
#在某系统中,平均每天发生3起故障。
此时,可以定量地判断以下问题:
- “今天发生5起故障的概率是多少?”
- “本周发生20起及以上故障的概率是多少?”
计算每天发生5起故障的概率:
from scipy.stats import poisson
P_5 = poisson.pmf(5, mu=3)
print(f"1日に5件の障害が発生する確率:{P_5:.4f}")
计算结果为“每天发生5起故障的概率:0.1008”。
由此可见,泊松分布有助于对稀少但有可能发生的事件(缺陷、故障、崩溃)进行定量评估。
在实务中,作为制定预防措施优先级和风险管理的基础信息非常有效。
5. 正态分布:波动的自然形态
#测试执行时间、评审时间、修正工时等,许多实务数据呈现“以平均值为中心左右波动”的形态。
这种波动的典型形态就是“正态分布(Normal Distribution)”。
● 正态分布的定义和公式
#正态分布定义如下:
[
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\Bigl(-\frac{(x - \mu)^2}{2\sigma^2}\Bigr)
]
- :均值
- :标准差
该函数描绘出以均值为中心左右对称的“钟形曲线(Bell Curve)”。
此处的 为概率密度函数(※4)(PDF: probability density function),表示“在该数值附近数据聚集的密度”(注意它并不是概率本身)。
※4:概率密度函数:
在连续概率分布中表示“某个区间内数值出现概率的浓度”的函数值。
它与离散分布的“概率”相似,但在连续值情况下,某个确切点出现的概率为0,因此需要关注**“该点附近的密度”**。
示例)“身高恰好为170cm的概率” = 0
→ 可考虑 “169.5cm~170.5cm 区间的概率” 等,以区间来思考
● 从数学表达上来看:
对于正态分布等概率密度函数(PDF: probability density function),数值落在区间 的概率为
[
P(a \le x \le b) = \int_a^b f(x),dx
]
- :概率密度函数
- 该“曲线下的面积”即代表概率
● 在图形上的映射:
- 横轴:数值(示例:测试执行时间)
- 纵轴:概率密度
→ 密度越高,“数据越集中在该区域”
也就是说,“概率密度高=常见”,“低=罕见”
但密度本身并非概率(有时可超过1)
● 使用 Python 可视化正态分布形状
#这段代码绘制了均值50、标准差10的正态分布的钟型曲线图。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
plt.rcParams['font.family'] = 'Meiryo'
mu = 50
sigma = 10
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
y = norm.pdf(x, mu, sigma)
plt.plot(x, y, color='darkorange')
plt.title("正規分布(μ=50, σ=10)")
plt.xlabel("値")
plt.ylabel("確率密度")
plt.grid(True)
plt.tight_layout()
plt.show()
该图可视化了均值50、标准差10的正态分布。
它在均值附近有峰值,极小/极大值的概率密度降低,呈现出“平滑”的波动形式。
正态分布绘图代码解析
-
scipy.stats.norm.pdf(x, mu, sigma)
→ 计算正态分布的概率密度函数(PDF)。
求取给定均值 、标准差 的连续分布的“高度(密度)”。 -
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
→ 将要显示的值(横轴)范围以平均±4σ区间分割为100个点。
● 软件质量应用示例
#在实务中,以下变量被认为近似服从正态分布:
- 评审时间:过快或过慢的情况罕见,大多数时间集中在平均值附近
- 测试执行时间:异常值较少,以平均值为中心分布
- 修改工时:除极端返工外,大致聚集在中心
对于此类变量,假定正态分布后,可进行管理图、过程能力指数、置信区间的估计。
下面通过模拟“平均30分钟的评审时间”实际分布情况,并与理论正态分布进行比较。
在实务中,可以通过此类对比直观检测异常值或趋势。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
plt.rcParams['font.family'] = 'Meiryo'
# 均值和标准差
mu = 30
sigma = 5
# 生成100条符合正态分布的评审时间数据
review_times = np.random.normal(mu, sigma, 100)
# 通过直方图可视化
plt.hist(review_times, bins=15, density=True, alpha=0.6, color='skyblue', edgecolor='black')
# 叠加理论正态分布曲线
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
y = norm.pdf(x, mu, sigma)
plt.plot(x, y, 'r--', label="理論的な正規分布")
plt.title("レビュー所要時間の分布(平均30分, σ=5)")
plt.xlabel("時間(分)")
plt.ylabel("確率密度")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
通过该图,可以直观把握评审时间“与正态分布符合程度”以及“异常短/长评审”处于何位置。
● 正态分布的重要性
#正态分布在以下方面是统计分析的核心存在:
- 中心极限定理:无论总体分布如何,样本量足够大时样本均值都会趋近于正态分布
- 众多统计方法的前提:t检验、回归分析、置信区间估计(※5)等都假定正态性
- 易于理解的特性:可通过平均值 ± 标准差得到“68%数据范围”等直观解释
※5:关于检验、回归分析、置信区间估计
- t检验:检验两个组的均值是否具有显著差异的方法
- 回归分析:模型化一个变量对另一个变量影响的方法
- 置信区间估计:估计总体均值等参数所在区间的方法
这些方法是检验“数据背后因果关系或差异存在与否”的重要工具。
本文暂不详述,但将在后续回合逐步讲解。
同时,也将在之后介绍以更标准化形式呈现的“标准正态分布”和“Z分数”。
● 实务中的注意事项
#- 若数据极端偏态,正态分布可能不适用
- 重要结合直方图或箱线图来检验正态性
- 如有需要,可通过对数变换或Box-Cox变换等方法使数据近似正态分布
正态分布是“解读波动的镜头”。
在软件质量现场,巧妙利用这面镜头将有助于做出准确判断和改进。
6. 实务中的应用
#- 可以对缺陷发生率及测试结果的波动进行建模
- 能定量判断“该结果是偶然还是异常?”
- 成为管理图和置信区间等推断统计的基础
总结
#- 概率是定量捕捉“偶然”的工具
- 二项分布:适用于Yes/No试验
- 泊松分布:适用于稀有事件的发生次数
- 正态分布:适用于多数自然波动
下回预告
#下回将讲解“正态分布及其相关:3σ规则的含义与局限”。
还将深入探讨实务中常见的“±3σ”和过程能力等内容。
希望能为您的数据分析提供帮助。