3. 概率与统计回顾:概率分布、期望、方差与蒙特卡洛模拟基础

在项目不确定区间与参数化估算中,概率与统计是量化风险的核心语言。本节将系统回顾关键概念:概率分布(正态、三角、贝塔)、期望与方差、置信区间,以及蒙特卡洛模拟的基本原理。这些工具将直接服务于后续的联合优化部署方案。

3.1 核心概率分布

概率分布描述了随机变量取值的可能性。在项目管理中,我们常用以下三种分布来建模任务工期、成本或资源消耗的不确定性。

分布类型 适用场景 关键参数 形状特征
正态分布 大量独立随机因素叠加(如总工期、总成本) 均值 μ、标准差 σ 对称钟形,中心最高
三角分布 已知最小值、最可能值、最大值(如单任务估算) 最小值 a、最可能值 m、最大值 b 线性上升后下降,尖峰
贝塔分布 PERT 三点估算、有限样本比例建模 形状参数 α、β(或 a、m、b 转换) 灵活偏态,可左偏/右偏/对称
关键提示: 三角分布因参数直观(最小值、最可能值、最大值)而广泛用于专家判断;贝塔分布因形状灵活(可模拟偏态)而常用于 PERT 网络分析。选择分布时,应优先考虑数据可得性与业务解释性。

3.2 期望与方差

期望(均值)衡量分布的“中心位置”,方差衡量分布的“离散程度”。它们是参数化估算中最重要的两个统计量。

  • 期望 E[X]: 随机变量 X 的加权平均值。对于离散变量,E[X] = Σ x·P(x);对于连续变量,E[X] = ∫ x·f(x) dx。
  • 方差 Var(X): 衡量 X 偏离期望的程度。Var(X) = E[(X - μ)²] = E[X²] - μ²。
  • 标准差 σ: 方差的平方根,与原始数据单位一致,更直观。

在项目估算中,期望用于确定“最可能的预算/工期”,方差用于量化“风险敞口”。例如,两个任务期望相同(均为 10 天),但方差不同(σ₁=1 天,σ₂=3 天),则任务 2 的延期风险显著更高。

3.3 置信区间

置信区间给出了一个范围,该范围以一定置信水平包含总体参数的真值。在项目管理中,我们常用 90% 或 95% 置信区间来表达估算的不确定性。

  • 正态分布下的置信区间: 对于已知 σ 的正态总体,μ 的 95% 置信区间为 [x̄ - 1.96·σ/√n, x̄ + 1.96·σ/√n]。
  • 非参数方法: 当分布未知时,可使用 Bootstrap 或蒙特卡洛模拟直接生成百分位数区间(如 5% 分位数到 95% 分位数)。
实践建议: 在项目部署方案中,不要只报告“预计工期 30 天”,而应报告“90% 置信区间为 [26 天, 36 天]”。这能清晰传达风险范围,避免单点估算的虚假精确。

3.4 蒙特卡洛模拟基础

蒙特卡洛模拟是一种通过大量随机抽样来近似复杂系统概率分布的方法。在项目估算中,它允许我们输入各任务的概率分布,输出总工期或总成本的概率分布。

基本步骤:

  1. 定义输入分布: 为每个不确定变量(如任务工期)指定概率分布(三角、正态、贝塔等)。
  2. 随机抽样: 从每个分布中独立抽取一个随机值,组成一组输入。
  3. 计算输出: 根据模型(如关键路径法)计算本次抽样的总工期或总成本。
  4. 重复迭代: 重复步骤 2-3 数千次(如 10,000 次),收集所有输出结果。
  5. 统计分析: 对输出结果绘制直方图,计算均值、标准差、百分位数(如 P10、P50、P90)。
常见误区: 蒙特卡洛模拟的精度取决于输入分布的质量和迭代次数。使用“垃圾输入”只会得到“垃圾输出”。务必基于历史数据或专家校准来设定分布参数。

3.5 蒙特卡洛模拟流程示意图

下图展示了蒙特卡洛模拟在项目工期估算中的核心流程,从输入分布到输出概率分布。

蒙特卡洛模拟流程示意图 蒙特卡洛模拟流程(项目工期估算) 输入分布 三角/正态/贝塔 随机抽样 每组一个随机值 模型计算 关键路径/成本 迭代 N 次 N=1000~10000 输出分布 直方图/百分位数 输出示例 P10=28天, P50=32天, P90=38天

3.6 三种分布对比与选择指南

下表总结了正态、三角、贝塔分布的关键差异,帮助你在实际项目中做出选择。

特性 正态分布 三角分布 贝塔分布(PERT)
参数数量 2(μ, σ) 3(a, m, b) 4(a, m, b, 形状)
偏态支持 仅对称 可偏态(m 靠近 a 或 b) 灵活偏态(α, β 控制)
尾部厚度 薄尾(极端值概率低) 有限边界(无尾部) 有限边界,尾部可调
估算难度 需历史数据 专家判断即可 需一定经验
推荐场景 大量任务汇总 单任务快速估算 PERT 网络、风险分析

3.7 期望与方差的计算示例

假设某任务工期服从三角分布:最小值 a=5 天,最可能值 m=8 天,最大值 b=15 天。则:

  • 期望 E[T] = (a + m + b) / 3 = (5 + 8 + 15) / 3 = 9.33 天
  • 方差 Var(T) = (a² + m² + b² - a·m - a·b - m·b) / 18 = (25 + 64 + 225 - 40 - 75 - 120) / 18 = 79 / 18 ≈ 4.39
  • 标准差 σ ≈ 2.10 天

这意味着该任务有约 68% 的概率落在 [7.23 天, 11.43 天] 区间内(假设近似正态)。

3.8 置信区间与蒙特卡洛的结合

在复杂项目中,直接计算解析解往往不可行。蒙特卡洛模拟通过大量抽样,直接输出输出变量的经验分布,进而计算任意置信水平的区间。

核心公式: 对于模拟生成的 N 个输出值(如总工期),排序后取第 5% 分位数和第 95% 分位数,即构成 90% 置信区间。无需假设正态性,适用于任意分布。

例如,某项目经过 10,000 次蒙特卡洛模拟,总工期排序后:

  • 第 500 个值(5% 分位数)= 42 天
  • 第 5000 个值(50% 分位数)= 48 天
  • 第 9500 个值(95% 分位数)= 56 天

则 90% 置信区间为 [42 天, 56 天],中位数为 48 天。

3.9 蒙特卡洛模拟的 Python 代码示例

以下代码演示了如何对两个三角分布任务进行蒙特卡洛模拟,并输出总工期的置信区间。

import numpy as np

def triangular_sample(a, m, b, size=10000):
    """生成三角分布随机样本"""
    u = np.random.uniform(0, 1, size)
    # 三角分布逆变换采样
    fc = (m - a) / (b - a)
    mask = u < fc
    samples = np.empty(size)
    samples[mask] = a + np.sqrt(u[mask] * (b - a) * (m - a))
    samples[~mask] = b - np.sqrt((1 - u[~mask]) * (b - a) * (b - m))
    return samples

# 任务 A: 三角分布 (5, 8, 15)
task_a = triangular_sample(5, 8, 15, 10000)
# 任务 B: 三角分布 (3, 6, 10)
task_b = triangular_sample(3, 6, 10, 10000)

# 总工期(假设串行)
total_duration = task_a + task_b

# 计算统计量
mean = np.mean(total_duration)
std = np.std(total_duration)
p5 = np.percentile(total_duration, 5)
p50 = np.percentile(total_duration, 50)
p95 = np.percentile(total_duration, 95)

print(f"均值: {mean:.2f} 天")
print(f"标准差: {std:.2f} 天")
print(f"90% 置信区间: [{p5:.2f}, {p95:.2f}] 天")
print(f"中位数: {p50:.2f} 天")
输出示例:
均值: 16.33 天
标准差: 2.45 天
90% 置信区间: [12.50, 20.80] 天
中位数: 16.10 天

3.10 本节小结