我们首先从一个实例出发,来分析缘何泊松分布在经济社会生活中如此频繁地出现和使用。
已知某家小杂货店,平均每周售出两个水果罐头,请问该水果店的最佳库存量是多少?(或者这么问,如果你是商家,你该如何储备货物?)
假定不存在季节因素,可以近似认为,该问题满足以下三个条件:
- 顾客购买水果罐头是小概率事件;(注意泊松分布刻画的是 rare events)
- 购买水果罐头的顾客之间是独立的,也即不会互相依赖或者影响;
- 顾客购买水果罐头的概率是稳定的;
在统计学上,如果某类事件满足上述三个条件,就称它服从泊松分布(poisson distribution),泊松分布的概率质量函数(pmf,probability mass function):
p(X=k)=e−λλkk!
各个参数的现实意义如下:
- X:该问题关注的离散型随机变量(random variable),每周销售的罐头数量
- P(X=k),每周销售k个罐头的概率
- k:取值为全体自然数(0,1,2,3,…)
- λ:每周水果罐头的平均销售量,是一个常数,本例为2
我们用Python中的Scipy库中的相关类与函数实现对这一问题的仿真:
>>> import scipy.stats as st
>>> rv = st.poisson(2)
>>> [(rv.pmf(i), rv.cdf(i)) for i in range(7)]
# pmf: probability mass function,概率质量函数
# cdf:cumulative distribution function,累积分布函数
[(0.1353352832366127, 0.1353352832366127),
(0.2706705664732254, 0.406005849709838),
(0.2706705664732254, 0.67667641618306362),
(0.18044704431548356, 0.85712346049854704),
(0.090223522157741778, 0.94734698265628892),
(0.036089408863096722, 0.98343639151938556),
(0.012029802954365565, 0.99546619447375118)]
上述数据可见,如果存货4个罐头,94.7%的概率不会缺货(缺货的概率为5.3%,15.3%≈19,平均19周发生一次缺货),如果存货5个罐头,98.3%的概率不会缺货(发生缺货的概率为1.7%,11.7%≈59,平均59周(一年零2个月)发生一次缺货)。
从泊松分布到泊松过程
P(N(t)=n)=(λt)ne−λtn!
已知平均每个小时出生三个婴儿,λ=3
一个小时内出生3个婴儿的概率,就表示为P(N(1)=3),接下来两个小时,一个婴儿都不出生的概率为:
P(N(2)=0)=(3×2)0e−3×20!≈0.00248
接下来两个小时,至少出生俩个婴儿的概率:
P(N(2)≥2)=1−P(N(2)<2)=1−P(N(2)=1)−P(N(2)=0)
泊松分布与美国枪击案
我们首先来判断”美国枪击案发生的次数”是否满足”泊松分布”的三个条件:
- 枪击案是小概率事件
- 枪击案之间彼此独立,不会互相影响
- 枪击案的发生概率是稳定的
显然,第三个条件是关键,如果成立,说明美国的治安没有恶化;如果不成立,说明枪击案的发生概率不稳定。根据资料1982-2012的31年间枪击案的分布情况为:
一年中发生枪击案的数量 | 年数 |
0 | 4 |
1 | 10 |
2 | 7 |
3 | 5 |
4 | 4 |
5 | 0 |
6 | 0 |
7 | 1 |
经过简单计算,平均每年发生枪击案的次数为:
>>> num_years = [4, 10, 7, 5, 4, 0, 0, 1]
>>> lmbda = sum(x*y for x, y in zip(range(8), num_years))/sum(num_years)
# lmbda = 2.0
接下来,我么通过泊松分布来仿真”美国每年发生枪击案的次数”:
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
rv = st.poisson(2)
num_years = [4, 10, 7, 5, 4, 0, 0, 1]
x = range(8)
plt.bar(np.array(x)-.4, num_years, label='Observed instances')
plt.plot(x, sum(num_years)*rv.pmf(x), ls='dashed',
lw=2, c='r', label='Poisson distribution\n$(\lambda=2.0)$')
plt.xlim([-1, 8])
plt.ylim([0, 11])
plt.xlabel('# of mass shootings in a year')
plt.ylabel('# of years')
plt.legend(loc='best')
plt.show()
上图中,蓝色的条形柱是实际的观察值,红色的虚线是理论的预期值,可以看到,观察值和预期值之间还是很接近的:
>>> [31*rv.pmf(i) for i in range(8)]
[4.1953937803349941,
8.3907875606699882,
8.3907875606699882,
5.5938583737799901,
2.796929186889995,
1.1187716747559984,
0.37292389158533251,
0.10654968331009501]
一年中发生枪击案的数量 | 观察值 | 预期值(理论值) |
0 | 4 | 4.2 |
1 | 10 | 8.39 |
2 | 7 | 8.39 |
3 | 5 | 5.59 |
4 | 4 | 2.8 |
5 | 0 | 1.12 |
6 | 0 | 0.37 |
7 | 1 | 0.11 |
我们用”卡方检验”(chi-square test),来检验观察值与期望值之间是否存在显著差异。
References
[1] 泊松分布与美国枪击案