我们首先从一个实例出发,来分析缘何泊松分布在经济社会生活中如此频繁地出现和使用。
已知某家小杂货店,平均每周售出两个水果罐头,请问该水果店的最佳库存量是多少?(或者这么问,如果你是商家,你该如何储备货物?)
假定不存在季节因素,可以近似认为,该问题满足以下三个条件:
在统计学上,如果某类事件满足上述三个条件,就称它服从泊松分布(poisson distribution),泊松分布的概率质量函数(pmf,probability mass function):
各个参数的现实意义如下:
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个月)发生一次缺货)。
已知平均每个小时出生三个婴儿, λ=3
一个小时内出生3个婴儿的概率,就表示为 P(N(1)=3) ,接下来两个小时,一个婴儿都不出生的概率为:
接下来两个小时,至少出生俩个婴儿的概率:
我们首先来判断”美国枪击案发生的次数”是否满足”泊松分布”的三个条件:
枪击案是小概率事件
枪击案之间彼此独立,不会互相影响
枪击案的发生概率是稳定的
显然,第三个条件是关键,如果成立,说明美国的治安没有恶化;如果不成立,说明枪击案的发生概率不稳定。根据资料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),来检验观察值与期望值之间是否存在显著差异。
[1] 泊松分布与美国枪击案