基础简介及其方法:
scipy与numpy的关系密切,scipy通过操作numpy中的数组进行科学计算。
scipy.stats中包含了多种概率分布的随机变量(离散型 + 连续型)

使用python计算二项分布
此处使用binom为例,生成指定的二项分布模型,调用rvs自动生成服从该分布的随机数。
概率质量函数和概率密度函数之间的区别:概率密度函数是针对连续型分布而言的。概率质量函数本身的意义是代表概率值的,概率密度函数本身的意义是不代表概率的,只有将概率密度函数在指定区间范围内积分得到的结果才是概率。
pmf使用案例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)x = np.arange(101)# 由于pmf得到的是概率质量函数,所以传入的x将会被当作参数# ,然后返回的y是对应的参数得到的函数值(概率值)y = st.binom(100, 0.3).pmf(x)# 作图部分plt.figure()plt.bar(x, y, color='grey', edgecolor='k')plt.show()
cdf使用案例:
cdf代表的是累计分布函数(分布函数),是概率密度函数的积分。

注意,这里为了展示出二项分布这种离散型随机分布的分布函数是呈现阶梯形的(因为他都是一个一个可列的形式)
ppf使用案例:
前置知识:
分位数:在一组从小到大排列的数据中,用于体现出数据分布情况的。
- 四分位数
- 第一个四分位数:25%比该数小,75%比该数大
- 第二个四分位数:50%比该数小,50%比该数大
- 以此类推
- 五分位数
- 每次按照20%来分,按照上述的四分位数进行类推即可
- 十分位数
- 每次按照10%来分。
- 百分位数
- 按照1%来分
案例:已知有正误题10题,猜对猜错的可能性为0.5,选择题目进行回答,划对划错,可能有猜测造成,但是正确率高于95%时可认为不是凭猜测,而是会答,算这个概率对应的是能做几个题?(分位数)
直观的理解:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)x = np.arange(-100, 100.1, 0.1)print(x)# 构建一个服从100, 0.3 的二项分布y = st.binom(100, 0.3).ppf(0.95)print(y)
使用python计算泊松分布
泊松分布和指数分布之间的关系:
泊松分布(离散型分布):描述一段时间内,事件发生多少次的概率分布。
(能直接求概率)
指数分布(连续型分布):描述事件与事件之间的间隔时间的概率分布。
(概率密度函数,需要积分才能求概率,这里只列出来了当 x > 0 时的概率密度函数,其他情况为0)
泊松分布和指数分布可看作是对同一个问题的不同的角度的思考,一个考虑的是在一个时间间隔内的发生次数、另一个是两个事件之间的时间间隔。
公式中指定的
,代表的是这个数据分布的数学期望。
泊松分布的数学期望为:
指数分布的数学期望为:
对于指数分布的剖析:参数\lambda 表示的是单位时间内发生的某事件的次数,即事件的发生强度,其倒数
代表的是指数的分布期望,也就是事件发生之间的间隔,即等待事件,如果平均每个小时接到2次电话(\lambda = 2) 那么预计的等待每一次电话的事s件是0.5个小时。
案例剖析:
假设有一个医院,平均每分钟有3个婴儿出生。
- 以泊松分布计算,1分钟内没有婴儿出生的概率。
数学期望,E(x) = 3 =
,由于泊松分布是离散型随机变量的分布,直接带入概率公式中:
求得:
- 以指数分布来看,一分钟没有婴儿出生的概率。
指数分布研究的是事件与事件之间的间隔时间,一分钟出生3个婴儿:
(指数型分布的数学期望是lambda的倒数)
一分钟之内没有婴儿出生等价于婴儿出生的间隔大于1分钟了。
- 两分钟内没有婴儿出生的概率:
使用指数分布,仍然是一分钟有三名婴儿出生,期望不变。P(x >= 2)
使用泊松分布:实际上发生了改变,注意,此处分析的是两分钟之内没有婴儿出生,分析的是这个时间段平均发生的次数。两分钟平均发生 2 * 3 次,则此时的期望为 6 。
rvs使用样例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)# 构建一个lambda = 8 的泊松分布,并生成 50 个服从该分布的随机数x = st.poisson(8).rvs(50)x_unique = np.unique(x)y = [list(x).count(i) for i in x_unique]plt.bar(x_unique, y, width=1, edgecolor='k')plt.show()
结果:
pmf使用样例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)plt.figure()x = range(21)# 生成一个lambda = 8 的泊松分布,求出指定x的概率质量函数y = st.poisson(8).pmf(x)plt.bar(x, y, width=1, edgecolor='k')plt.show()

cdf使用样例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)x = np.arange(-100, 100)y = st.poisson(8).cdf(x)plt.plot(x, y)plt.show()

ppf使用样例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)y = st.poisson(8).ppf(0.95)print(y)
下面的样例利用指数分布进行讲解(连续型):
rvs使用样例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)x = st.expon(scale=1/3).rvs(50)plt.figure()plt.hist(x, edgecolor='k')plt.show()

pdf使用案例:
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)x = np.arange(0, 10.1, 0.1)y = st.expon(scale=1/3).pdf(x)plt.figure()plt.plot(x, y)plt.show()

使用python计算指数分布
使用方式和上面的分布相同。
使用累积分布函数计算:(使用cdf):
假如某医院平均每小时出生3个婴儿,问下15分钟内出生婴儿的概率为多少?下个15分钟到30分钟内出生婴儿的概率?1小时内出生婴儿的概率?2小时内出生婴儿的概率?
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltnp.random.seed(100)# 1ans_1 = st.expon(scale=1/3).cdf(0.25)ans_1_2 = 1 - st.poisson(3 * 0.25).pmf(0)# 2ans_2 = st.expon(scale=1/3).cdf(0.5) - st.expon(scale=1/3).cdf(0.25)ans_2_2 = st.poisson(3 * 0.5).pmf(0) - st.poisson(3 * 0.25).pmf(0)# 3ans_3 = st.expon(scale=1/3).cdf(1)ans_3_2 = 1 - st.poisson(3).pmf(0)# 4ans_4 = st.expon(scale=1/3).cdf(2)ans_4_2 = 1 - st.poisson(6).pmf(0)print(ans_1)print(ans_1_2)print('@@@@@@@@@@@@@@@@@@@@@@')print(ans_2)print(ans_2_2)print('----------------------')print(ans_3)print(ans_3_2)print('----------------------')print(ans_4)print(ans_4_2)
使用python计算正态分布(高斯分布):
使用标准正态分布时不需要为st.form添加参数。
正态分布
cdf使用案例(累积分布函数):
,求出x > 1的概率,x < 3的概率;
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltimport pandas as pdnp.random.seed(100)y_1 = 1 - st.norm(2, 0.5 * 0.5).cdf(1)y_2 = st.norm(2, 0.5 * 0.5).cdf(3)print(y_1)print(y_2)
ppf使用案例(分位点):
已知
,分别求出累计概率为0.975 和 0.95 对应的分位点。
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltimport pandas as pdnp.random.seed(100)y_1 = st.norm(3, 1).ppf(0.975)y_2 = st.norm(3, 1).ppf(0.95)print(y_1)print(y_2)
使用python计算t分布:
t分布是连续型数据分布。
t分布:标准正态分布的修正。
当总体的标准差是未知的但是需要估计的时候,可以用t分布
参数:自由度
自由度越小,图像相比于正态分布越平缓;自由度越大,图像越接近于正态分布。
t分布是正态分布的小样本形态。
当自由度 = 30时,t分布近似于标准正态分布。
用于根据小样本估计成正态分布且方差未知的总体的均值,如果总体的方差已知(例如在样本数量足够多时),应该使用正态分布估计总体的均值,也就是说当总体的标准差是未知的时却又需要估计,可以运用t分布。
通常情况下,我们难以获得大样本下的总体的方差,因此无法使用正太分布进行估算,可以借助小样本中进行估算
t分布,相对于正态分布而言其容错率更高。
样本越大,用样本的标准差代替整体的标准差得到的越准确。误差越小,二者的形状越接近。
当使用样本标准差替代了整体的标准差时,尽量使用t分布而不是用正态分布,即使样本空间很大。
rvs使用案例:
随机生成50个自由度为20的t分布数据:
api需要传入一个参数:自由度。其他的使用过程和之前相同。
import numpy as npimport scipy.stats as stimport matplotlib.pyplot as pltimport pandas as pdnp.random.seed(100)x = st.t(20).rvs(50)print(x)plt.figure()plt.hist(x, edgecolor='k')pd.Series(x).plot(kind='kde')plt.show()
F分布
f分布是连续型数据分布。
定义:设x、y为两个独立的随机变量,x服从自由度为k1的卡方分布,y服从自由度为k2的卡方分布,这两个独立的卡方分布被各自的自由度除以以后的比率这一统计量的分布。即,上述F服从第一自由度为k1,第二自由度为k2的F分布。
使用案例:api需要传入两个自由度。
