泊松分布:从基础到实际应用

文章来源声明: 原文作者:databook; 来源站点:掘金; 原文链接:https://juejin.cn/post/7687583607811211274; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

从公式到手写代码再到scipy实战,三个运维场景即拿即用,适合后端、运维和数据分析同学建立概率直觉,先确认事件独立、发生率恒定再套用。

泊松分布:从基础到实际应用 ---------------
做技术的应该都遇到过这种场景:服务器每分钟收到多少请求?接口一天报错几次?网站一小时来多少访客?

这些问题的共同点是:在一段固定时间里,某个事件发生了多少次

这类数据有个特点:单次看是随机的,但拉长周期会有一个稳定的平均值。

这种场景下,泊松分布就是最合适的建模工具。

今天咱们不扯虚的,直接把这个东西讲清楚,然后拿几个常见的场景跑一遍代码。

泊松分布到底是个啥?

说白了,泊松分布就是用来描述在固定时间或空间内,某件事发生次数的概率分布。

它有几个前提条件,你得先确认你的场景满不满足:

  1. 事件是独立的——这次来电话不影响下一次来电话。
  2. 平均发生率是恒定的——比如平均每分钟 3 个电话,不会突然变成 30 个。
  3. 不会同时发生两件事——两个电话不能在同一毫秒进来。

如果满足这三条,你就可以用泊松分布来算概率。

它的公式长这样:

P(X=k)=λkeλk!P(X=k) = \frac{\lambda^k e{-\lambda}}{k!}

  • (k)(k):你想知道的事件次数,比如“恰好 5 次”。
  • (λ)(\lambda):平均发生次数,比如“平均每分钟 3 次”。
  • (e)(e):欧拉数,约等于 2.718。

这个分布的均值和方差都是 λ\lambda。也就是说,如果平均每分钟来 3 个电话,那数据的波动程度也是 3。

先跑个代码,手动算一把

不用急着调库,咱们先自己写个函数算算,感受一下。

<span>import</span> math

<span>def</span> <span>poisson_probability</span>(<span>k, lambd</span>):
    <span>return</span> (lambd ** k) * math.exp(-lambd) / math.factorial(k)

<span># 假设平均每分钟来 2 个事件,我想知道恰好来 3 个的概率</span>
k = <span>3</span>
lambd = <span>2</span>
prob = poisson_probability(k, lambd)
<span>print</span>(<span>f"恰好发生 <span>{k}</span> 次的概率: <span>{prob:<span>.4</span>f}</span>"</span>)
<span># 输出: 恰好发生 3 次的概率: 0.1804</span>

这就是泊松公式的直接实现。

这个函数丢到任何 Python 环境里都能跑。

用 SciPy 省点事

实际工作中没人会手写阶乘,直接用 scipy.stats.poisson 就行。

它给你提供了 PMF(概率质量函数)和 CDF(累积分布函数)。

<span>from</span> scipy.stats <span>import</span> poisson

lambd = <span>4</span>
k_values = <span>list</span>(<span>range</span>(<span>10</span>))  <span># 0 到 9 次</span>

pmf_values = [poisson.pmf(k, lambd) <span>for</span> k <span>in</span> k_values]
cdf_values = [poisson.cdf(k, lambd) <span>for</span> k <span>in</span> k_values]

<span>print</span>(<span>"PMF:"</span>, pmf_values)
<span>print</span>(<span>"CDF:"</span>, cdf_values)

PMF 就是“恰好发生 k 次的概率”,CDF 就是“发生次数小于等于 k 的概率”。

这两个东西在你做容量规划的时候特别有用。

场景一:网站流量预测

假设你负责一个网站,历史数据告诉你平均每分钟有 10 个访客。

你想模拟一下一天的情况,看看访客数大概怎么分布。

<span>from</span> scipy.stats <span>import</span> poisson
<span>import</span> matplotlib.pyplot <span>as</span> plt

<span># 模拟 1000 分钟的访客数,平均每分钟 10 人</span>
data = poisson.rvs(mu=<span>10</span>, size=<span>1000</span>)

plt.hist(data, bins=<span>15</span>, density=<span>True</span>, alpha=<span>0.7</span>, color=<span>'skyblue'</span>)
plt.title(<span>"模拟网站流量 (λ = 10)"</span>)
plt.xlabel(<span>"每分钟访客数"</span>)
plt.ylabel(<span>"频率"</span>)
plt.show()

跑完你会看到一个近似正态的分布,中心在 10 附近。

这个图能帮你回答:“如果我要保证 95% 的情况下服务器不崩,我得准备多少并发?”

场景二:客服中心来电

客服中心平均每分钟接到 3 个电话。

老板问你:“恰好接到 5 个电话的概率有多大?”

你直接算:

<span>from</span> scipy.stats <span>import</span> poisson

prob_5_calls = poisson.pmf(<span>5</span>, <span>3</span>)
<span>print</span>(<span>f"恰好接到 5 个电话的概率: <span>{prob_5_calls:<span>.4</span>f}</span>"</span>)
<span># 输出: 恰好接到 5 个电话的概率: 0.1008</span>

大概 10%。

那如果老板问“不超过 5 个电话的概率”呢?

CDF

prob_leq_5 = poisson.cdf(<span>5</span>, <span>3</span>)
<span>print</span>(<span>f"不超过 5 个电话的概率: <span>{prob_leq_5:<span>.4</span>f}</span>"</span>)
<span># 输出: 不超过 5 个电话的概率: 0.9161</span>

这种计算在排班的时候特别实用。

你知道平均来电数,就能估算需要多少个客服坐席。

场景三:系统故障(稀有事件)

有些事件很稀有,比如服务器每天平均只崩 0.5 次。

你想看看一年里故障次数的分布。

<span>from</span> scipy.stats <span>import</span> poisson
<span>import</span> matplotlib.pyplot <span>as</span> plt

<span># 模拟 365 天的故障次数,平均每天 0.5 次</span>
failures = poisson.rvs(mu=<span>0.5</span>, size=<span>365</span>)

plt.hist(failures, bins=<span>range</span>(<span>5</span>), density=<span>True</span>, color=<span>'salmon'</span>, alpha=<span>0.7</span>)
plt.title(<span>"模拟每日系统故障 (λ = 0.5)"</span>)
plt.xlabel(<span>"故障次数"</span>)
plt.ylabel(<span>"频率"</span>)
plt.show()

你会发现大部分天数是 0 次或 1 次,偶尔有 2 次。

这种分布对于制定容灾策略很有帮助——你知道极端情况大概是什么样。

啥时候别用泊松分布?

泊松分布不是万能的。

如果平均发生率不恒定(比如白天电话多、晚上电话少),或者事件之间有依赖关系(比如一次故障引发另一次故障),那泊松分布就不准了。

另外,当试验次数 nn 很大,成功概率 pp 很小时,二项分布可以近似成泊松分布,此时 λ=np\lambda = n \cdot p

这个在 A/B 测试里偶尔会用到。

总结

泊松分布就是用来算“固定时间内事件发生次数”的概率工具。

你只要记住:

  • 平均发生率 λ\lambda 是核心参数。
  • scipy.stats.poisson 可以快速算 PMFCDF
  • 网站流量、客服来电、系统故障这些场景都能直接套。
  • 用之前先确认事件独立、发生率恒定、不同时发生。

下次再遇到“平均每天发生 X 次”的问题,别拍脑袋,直接上泊松分布跑一下,心里就有数了。