基本作业
机票超卖现象
假设某国际航班有300个座位,乘客平均误机率是2%。
- 1、如果一共卖出305张机票,那么登机时人数超额的概率是多少?
- 2、如果一共卖出305张机票,登机时最多只超额1人的概率是多少?
- 3、一共卖几张票,可以保证不超额的概率至少是90%。
小提示:属于二项分布
导入模块
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
%config InlineBackend.figure_format = 'retina'
1、如果一共卖出305张机票,那么登机时人数超额的概率是多少?
# 先画张二项分布图方便理解题意.
binomial = scipy.stats.binom(305,1-0.02)
x = np.arange(280,310,1)
y = binomial.pmf(x)
plt.figure(figsize=(6,6))
plt.plot(x,y,'bo')
plt.ylim(-0.01,0.18)
plt.vlines(x,0,y,'b')
for a in np.arange(301,306,1):
plt.vlines(a,0,binomial.pmf(a),'r')
plt.plot(a,binomial.pmf(a),'ro')
plt.show()
分析一下: 登机时超额的情况,就是实际登机人数(301~305)大于座位数(300).
登机时人数超额的概率就是图表上5条红线的概率总和.
# 有两种解法.
# 方法一: 事件总概率1 - 不超额概率
1 - binomial.cdf(300)
# 运行结果
0.26915013819815137
# 方法二: 直接用sf函数来求
binomial.sf(300)
0.26915013819815131
2、如果一共卖出305张机票,登机时最多只超额1人的概率是多少?
我不仅英文不好,中文也不好.这题目可以理解出两个意思.
- 理解一:最多情况只超额1人,那么最少情况就是只有1人登机.那么就是求(1~301人)各种概率总和.解法如下:
# 同样.先画图
binomial = scipy.stats.binom(305,1-0.02)
x = np.arange(1,310,1)
y = binomial.pmf(x)
plt.figure(figsize=(20,6))
plt.plot(x,y,'b.')
plt.ylim(-0.01,0.18)
plt.vlines(x,0,y,'b')
for a in np.arange(1,301+1,1):
plt.vlines(a,0,binomial.pmf(a),'r')
plt.plot(a,binomial.pmf(a),'r.')
plt.show()
求的是(左边)红色情况概率总和
binomial.cdf(300+1)
# 运行结果
0.86014450106633422
-
理解二:登机超额情况下.登机时最多只超额1人的概率.
那么可以换种说法.即恰好登机时是301人的概率是多少,解法如下:
binomial.pmf(301)
# 运行结果
0.12929463926438506
3、一共卖几张票,可以保证不超额的概率至少是90%。
这题我也理解成两种意思了:
-
第一种:本次航班,航空公司印制多少张机票.全部卖出.可以保证不超额的概率≥90%
老实讲.这样理解题意的话,用正规算术方法,我不会算.我采用的是最土最笨的方法.
就是一个一个试.从301票~310票, 逐种情况去算不超额的概率,再与90%去对比.
人工算的话.会累死.好在电脑有循环语句,计算速度快.勉强可以应付一下.
piao=300
while (piao<310):
binomial_jp = scipy.stats.binom(piao, 0.98)
if binomial_jp.cdf(300) < 0.9:
print ('卖出的机票只要不超过',piao-1,'张时,就可以保证不超额的概率至少是90%')
break
piao += 1
# 运行结果
卖出的机票只要不超过 303 张时,就可以保证不超额的概率至少是90%
验证一下:
# 当303张票时,求不超额的概率
scipy.stats.binom(303,0.98).cdf(300)
# 运行结果
0.94239552568203511
# 当304张票时,不超额的概率又是多少
scipy.stats.binom(304,0.98).cdf(300)
# 运行结果
0.85844883366605595
所以,机场印制303张票时,就算全部售出.94%(>90%)情况下不会超卖.合理一些.
- 第二种:是不是已知概率≤90%,反求机票数就可以了?
那只需要用ppf()函数计算一下就可以了.
binomial.ppf(0.9)
# 运行结果
302.0
302张票.
网友评论