注目イベント!
春の新人向け連載2025開催中!
今年も春の新人向け連載が始動しました!!
現場で役立つ考え方やTipsを丁寧に解説、今日から学びのペースを整えよう。
詳細はこちらから!
event banner

统计话题谈一谈 - 软件质量的统计入门(No.8 概率的直觉与计算:了解“偶然”的本质)

日本語|English|中国语
| 10 min read
Author: shuichi-takatsu shuichi-takatsuの画像
Information

为了覆盖更广泛的受众,这篇文章已从日语翻译而来。
您可以在这里找到原始版本。

引言

#

在「统计话题谈一谈」第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)
Information

※1:大数定律/中心极限定理是什么

  • 大数定律(Law of Large Numbers)
     当样本数(样本量)增加时,样本平均 xˉ\bar{x} 会无限接近总体平均 μ\mu 的原理。
     → 与“只要观测多,就能看到整体趋势”直觉相近。

  • 中心极限定理(Central Limit Theorem)
     无论总体分布形状如何,只要取足够数量的样本平均,它们就会趋近正态分布的定理。
     → 这也是“基于正态分布前提的统计方法”能够广泛应用的原因。

这些理论是支撑“为什么能从样本推断总体特性?”这一统计推断逻辑基础的柱石。
详细内容将在后续回合中详细讨论。

由此可见,理解概率论就成了支撑统计推断前提的力量
也是回答“为什么能从样本了解总体?”这一问题的理论基础。

2. 什么是概率?

#

日常生活中潜藏的“概率”直觉

#

一提到“概率”,你会想到什么?
骰子、扭蛋、天气预报、彩票……。
这些现象都受“偶然”影响,但我们往往将它们归为“无法预测的事件”。

然而,概率是捕捉“偶然之中规律性”的工具。
在统计学中,我们利用概率定量地判断“发生的可能性有多大”“是否不能说是不可能”。
实际上,我们每天都在无意识地进行概率判断后行动

  • “今天看起来会下雨,还是带把伞吧”
  • “这个功能在发布前可能会出现缺陷”
  • “上次评审被指出很多问题,这次应该会减少”

这种评估“可能发生的概率”并据此判断的能力,正是使用概率进行决策的第一步。

软件质量与概率

#

在软件开发中,以下场景与概率息息相关:

  • 缺陷发生频率(单位时间内缺陷出现的概率)
  • 测试的检测能力(发现缺陷的概率)
  • 风险评估(缺陷发生概率 × 影响度)

也就是说,“概率”不仅仅是数学话题,还是用数值描述质量的通用语言

概率的基本定义

#

那么,“概率”究竟是什么?
最基本的定义如下:

[
P = \frac{\text{发生模式数}}{\text{总模式数}}
]

例:测试中检测到缺陷的概率

#

进行10个测试用例,其中2个检测到了缺陷。
此时,“在一次测试中发现缺陷的概率”为?

  • 发生模式数:2种情况(2个检测到缺陷)
  • 总模式数:10种情况(测试用例总数)

[
P(\text{缺陷检测}) = \frac{2}{10} = 0.2
]

这样,将“在整体中,目标结果可能发生的程度”以比例表示的就是概率

概率分布的整体概览

#

概率分布是以“分布”的形式展示“概率性变化的数值以何种形式出现”。
下面将分类介绍代表性的分布。

分布名称 应用示例 分布类型(※2) 特点
二项分布 成功/失败的次数 离散 有限次试验中的成功次数
泊松分布 单位时间内的缺陷数量 离散 稀有事件的发生次数
几何分布 首次成功前的试验次数 离散 关注成功前的失败次数
正态分布 评审时间、工时等 连续 钟形分布,基于中心极限定理
均匀分布 随机初始值 连续/离散 所有数值等概率
指数分布 下一次缺陷出现前的时间 连续 恒定的发生率
Information

※2:概率分布的分类
概率分布根据“变量如何变动”可分为离散分布连续分布

类型 说明 示例 函数
离散分布 数值以离散的个别值存在 骰子点数、缺陷数量 概率质量函数(PMF)
连续分布 数值在任意区间内连续存在 身高、评审执行时间 概率密度函数(PDF)

● 离散分布(Discrete Distribution):

  • 变量的取值被限制为“可数”的个别值。
  • 示例:
    • 骰子点数(1~6 的整数)
    • 测试中检测到的缺陷数量(0个、1个、2个……)

在离散分布中,可以定义“恰好等于 x 的概率”。
示例: P(X=2)=0.25P(X = 2) = 0.25

● 连续分布(Continuous Distribution):

  • 变量的取值是连续的(无限平滑存在)。
  • 示例:
    • 测试执行时间(如 21.34 秒)
    • CPU 使用率(如 48.123%)

在连续分布中,“恰好等于 x 的概率”为零。
取而代之的是考虑“落在 x~y 之间的概率”。
示例: P(20<X<25)=2025f(x)dxP(20 < X < 25) = \int_{20}^{25} f(x)\,dx

理解此差异后,能够选择合适的分布模型和函数(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}
]

  • nn:试验次数(示例:100次测试)
  • kk:成功次数(示例:发现的缺陷数量)
  • pp:单次试验成功的概率(示例:一次测试中发现缺陷的概率)

二项分布的概率称为概率质量函数(※3)(PMF: Probability Mass Function)

Information

※3:概率质量函数
与“连续分布”使用概率密度函数(PDF)不同,离散分布(如二项分布、泊松分布等)是为特定的取值赋予概率,因此使用“质量(mass)”一词而非“密度”。
(关于概率密度函数(PDF)的内容,将在正态分布部分说明。)

● 使用 Python 可视化二项分布形状

#

这段代码用于绘制试验次数 n=100n = 100、成功概率 p=0.1p = 0.1二项分布

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()

二项分布(n=100, p=0.1)

该图表示“在做100次测试时,缺陷检测数量为 k 的概率分布”。
概率最高的在10件左右,但大于20件的可能性也并非零。

二项分布绘图代码解析

  • scipy.stats.binom.pmf(x, n, p)
    → 计算二项分布的概率质量函数(PMF)。
    对每个 xx 计算“成功次数为 xx 的概率”。

  • 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!}
]

  • λ\lambda:单位时间段(或区域)内的平均发生次数(示例:缺陷的平均数量)
  • kk:实际发生的次数(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)

该图表示“假设平均每天发生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)
]

  • μ\mu:均值
  • σ\sigma:标准差

该函数描绘出以均值为中心左右对称的“钟形曲线(Bell Curve)”
此处的 f(x)f(x)概率密度函数(※4)(PDF: probability density function),表示“在该数值附近数据聚集的密度”(注意它并不是概率本身)。

Information

※4:概率密度函数
在连续概率分布中表示“某个区间内数值出现概率的浓度”的函数值
它与离散分布的“概率”相似,但在连续值情况下,某个确切点出现的概率为0,因此需要关注**“该点附近的密度”**。

示例)“身高恰好为170cm的概率” = 0
 → 可考虑 “169.5cm~170.5cm 区间的概率” 等,以区间来思考

● 从数学表达上来看:

对于正态分布等概率密度函数(PDF: probability density function),数值落在区间 [a,b][a, b] 的概率为

[
P(a \le x \le b) = \int_a^b f(x),dx
]

  • f(x)f(x):概率密度函数
  • 该“曲线下的面积”即代表概率

● 在图形上的映射:

  • 横轴:数值(示例:测试执行时间)
  • 纵轴:概率密度
    → 密度越高,“数据越集中在该区域”

也就是说,“概率密度高=常见”,“低=罕见”
密度本身并非概率(有时可超过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)

该图可视化了均值50、标准差10的正态分布
它在均值附近有峰值,极小/极大值的概率密度降低,呈现出“平滑”的波动形式。

正态分布绘图代码解析

  • scipy.stats.norm.pdf(x, mu, sigma)
    → 计算正态分布的概率密度函数(PDF)。
    求取给定均值 μ\mu、标准差 σ\sigma 的连续分布的“高度(密度)”。

  • 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()

评审耗时分布(平均30分, σ=5)

通过该图,可以直观把握评审时间“与正态分布符合程度”以及“异常短/长评审”处于何位置。

● 正态分布的重要性

#

正态分布在以下方面是统计分析的核心存在:

  • 中心极限定理:无论总体分布如何,样本量足够大时样本均值都会趋近于正态分布
  • 众多统计方法的前提:t检验、回归分析、置信区间估计(※5)等都假定正态性
  • 易于理解的特性:可通过平均值 ± 标准差得到“68%数据范围”等直观解释
Information

※5:关于检验、回归分析、置信区间估计

  • t检验:检验两个组的均值是否具有显著差异的方法
  • 回归分析:模型化一个变量对另一个变量影响的方法
  • 置信区间估计:估计总体均值等参数所在区间的方法

这些方法是检验“数据背后因果关系或差异存在与否”的重要工具。
本文暂不详述,但将在后续回合逐步讲解。
同时,也将在之后介绍以更标准化形式呈现的“标准正态分布”和“Z分数”。

● 实务中的注意事项

#
  • 若数据极端偏态,正态分布可能不适用
  • 重要结合直方图或箱线图来检验正态性
  • 如有需要,可通过对数变换或Box-Cox变换等方法使数据近似正态分布

正态分布是“解读波动的镜头”。
在软件质量现场,巧妙利用这面镜头将有助于做出准确判断和改进。


6. 实务中的应用

#
  • 可以对缺陷发生率及测试结果的波动进行建模
  • 能定量判断“该结果是偶然还是异常?”
  • 成为管理图和置信区间等推断统计的基础

总结

#
  • 概率是定量捕捉“偶然”的工具
  • 二项分布:适用于Yes/No试验
  • 泊松分布:适用于稀有事件的发生次数
  • 正态分布:适用于多数自然波动

下回预告

#

下回将讲解“正态分布及其相关:3σ规则的含义与局限”。
还将深入探讨实务中常见的“±3σ”和过程能力等内容。

这里汇总了统计相关信息。

希望能为您的数据分析提供帮助。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。