假设我每天接到骚扰电话的次数服从泊松分布,并且经统计平均每天我会接到20个骚扰电话。
请问:
1、我明天接到15个骚扰电话的概率?
2、我明天接到24个骚扰电话以下的概率(包含24)?
首先要清楚,泊松分布是离散的,也就是说我接到骚扰电话次数必须是整数,要么就是15次,要么就是16次...,而不会是15.5次。
泊松分布的概率函数为:
累积概率分布函数为:
其实就是概率函数的累加。
均值方差:泊松分布的均值和方差都是。
针对上面的问1这里就是20,k就是15。
方法一:根据公式编写代码
import math
def p_possion(k, m):
kjie = 1 #k!
for i in range(1, k+1):
kjie*=i
pk = math.pow(m, k)/kjie*math.e**(-m)
return pk
p = p_possion(15, 20)
print("接到15个骚扰电话的概率:",p)
p=0
for i in range(0,25):
p+=p_possion(i, 20)
print("接到24个骚扰电话以下的概率:",p)
结果:
接到15个骚扰电话的概率: 0.0516488535317584
接到24个骚扰电话以下的概率: 0.8432273781737633
方法二:用scipy包中的scipy.stats.poisson
from scipy import stats
p = stats.poisson.pmf(15, 20)
print("接到15个骚扰电话的概率:",p)
p = stats.poisson.cdf(24, 20)
print("接到24个骚扰电话以下的概率:",p)
仍以骚扰电话为例,计算接到电话0~50次的概率:
from scipy import stats
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
X=range(0,51)
Y=[]
for k in X:
p = stats.poisson.pmf(k, 20)
Y.append(p)
plt.bar(X, Y, color="red")
plt.xlabel("次数")
plt.ylabel("概率")
plt.title("接到骚扰电话次数及概率")
plt.show()
结果:
首先可以看出,在均值20附近,概率最大,均值两边概率呈递减状态。再者可以看到这结果很像二项分布,也像正态分布,关于两者三个分布的相似,这里不做讨论。
查表前面代码中有涉及,其实就是查累积概率。查询=100,发生次数小于等于120的概率:
from scipy import stats
p = stats.poisson.cdf(120, 100)
print(p)
结果:0.9773306709216473
生成服从=50的泊松分布随机数100个:
from scipy import stats
# 设置random_state时,每次生成的随机数一样。不设置或为None时,多次生成的随机数不一样
sample = stats.poisson.rvs(mu=50, size=100, random_state=3)
print(sample)
结果:
[51 45 60 40 34 53 54 45 45 49 51 46 48 61 47 53 47 48 45 49 52 45 43 50
50 54 54 47 47 46 36 72 54 55 52 37 42 41 54 54 55 58 53 53 51 43 58 38
63 50 44 53 48 43 53 45 67 37 51 42 54 47 59 55 54 55 55 46 60 43 54 45
59 44 58 45 51 58 56 47 54 33 55 50 58 49 60 37 51 43 50 52 52 45 42 44
49 54 52 48]