Task03:常见分布与假设检验

 

一、基本概念

随机变量:根据随机变量可能取值的个数分为离散型(取值有限)和连续型(取值无限)两类。对于离散型随机变量,使用概率质量函数(probability mass function),简称PMF,来描述其分布律。对于连续型随机变量,使用概率密度函数(probability density function),简称PDF,来描述其分布情况。对于连续型随机变量,通常还会用到累积分布函数 (cumulative distribution function),简称CDF,来描述其性质,在数学上CDF是PDF的积分形式。

PDF:概率密度函数(probability density function),在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。

PMF : 概率质量函数(probability mass function),在概率论中,概率质量函数是离散随机变量在各特定取值上的概率。

CDF : 累积分布函数 (cumulative distribution function),又叫分布函数,是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。

1.1 离散型分布

二项分布(Binomial distribution):一种只有两种结果(成功/失败)的单次试验重复多次后成功次数的分布概率。

泊松分布(Poisson distribution):用来描述泊松试验的一种分布

  满足以下两个特征的试验可以认为是泊松试验:

  • 所考察的事件在任意两个长度相等的区间里发生一次的机会均等
  • 所考察的事件在任何一个区间里发生与否和在其他区间里发生与否没有相互影响,即是独立的

  泊松分布需要满足一些条件:

  • 试验次数n趋向于无穷大
  • 单次事件发生的概率p趋向于0
  • np是一个有限的数值 

Task03:常见分布与假设检验_第1张图片

其他不常用离散型分布:

几何分布(Geometric distribution):考虑独立重复试验,几何分布描述的是经过k次试验才首次获得成功的概率

负二项分布(Negative binomial distribution):考虑独立重复试验,负二项分布描述的是试验一直进行到成功r次的概率

超几何分布(Hypergeometric Distribution):超几何分布描述的是在一个总数为N的总体中进行有放回地抽样

1.2 连续型分布

均匀分布 (Uniform distribution):是一类在定义域内概率密度函数处处相等的统计分布。

正态分布 (Normal distribution):也叫做高斯分布,是最为常见的统计分布之一,是一种对称的分布,概率密度呈现钟摆的形状,其中μ为正态分布的均值,σ为正态分布的标准差

指数分布 (Exponential distribution):通常被广泛用在描述一个特定事件发生所需要的时间,在指数分布随机变量的分布中,有着很少的大数值和非常多的小数值。其中λ被称为率参数(rate parameter),表示每单位时间发生该事件的次数。

Task03:常见分布与假设检验_第2张图片

其他不常用连续型分布:

Gamma分布:常用来描述某个事件总共要发生n次的等待时间的分布。

威布尔分布 (Weibull distribution):常用来描述在工程领域中某类具有“最弱链”对象的寿命

1.3 常见分布的均值和方差汇总

离散型分布

Task03:常见分布与假设检验_第3张图片

连续型分布

Task03:常见分布与假设检验_第4张图片

二、Python 代码实战

2.1 seaborn.distplot()的使用说明

seaborn.distplot(a, bins=None, hist=True, kde=True, label=None)
灵活绘制单变量观测值分布图。
该函数结合了matplotlib中的 hist函数(自动计算一个默认的合适的bin大小)、seaborn的kdeplot()和rugplot()函数。它还可以拟合scipy.stats分布并在数据上绘制估计的PDF(概率分布函数)。

#a:Series、1维数组或者列表。观察数据。如果是具有name属性的Series对象,则该名称将用于标记数据轴。
#bins:matplotlib hist()的参数,或None。可选参数。直方图bins(柱)的数目,若填None,则默认使用Freedman-Diaconis规则指定柱的数目。
#hist:布尔值,可选参数。是否绘制(标准化)直方图。
#kde:布尔值,可选参数。是否绘制高斯核密度估计图。
#label:字符串,可选参数。图形相关组成部分的图例标签。

2.2 seaborn.scatterplot()的使用说明

seaborn.scatterplot(x=None, y=None, hue=None,
                    style=None, size=None, data=None, 
                    palette=None, hue_order=None, hue_norm=None,
                    sizes=None, size_order=None, size_norm=None, 
                    markers=True, style_order=None, x_bins=None,
                    y_bins=None, units=None, estimator=None, 
                    ci=95, n_boot=1000, alpha='auto', x_jitter=None,
                    y_jitter=None, legend='brief', ax=None, **kwargs)
绘制散点图,可以通过调整颜色、大小和样式等参数来显示数据之间的关系。
#hue:数据中变量名称(比如:二维数据中的列名):对将要生成不同颜色的线进行分组,可以是分类或数据。
#size:数据中变量名称(比如:二维数据中的列名):对将要生成不同宽度的线进行分组,可以是分类或数据。
#style:数据中变量名称(比如:二维数据中的列名):对将生成具有不同破折号、或其他标记的变量进行分组。
#palette:调试板名称,列表或字典类型:设置hue指定的变量的不同级别颜色。
#hue_order:列表(list)类型:指定hue变量出现的指定顺序,否则他们是根据数据确定的。
#hue_norm:tuple或Normalize对象
#sizes:list dict或tuple类型:设置线宽度,当其为数字时,它也可以是一个元组,指定要使用的最大和最小值,会自动在该范围内对其他值进行规范化。
#units:对变量识别抽样单位进行分组,使用时,将为每个单元绘制一个单独的行。
#estimator:pandas方法的名称或回调函数或者None
作用:用于在同一x水平上聚合y变量的多个观察值的方法,如果为None,则将绘制所有观察结果。

2.3 seaborn.lineplot()的使用说明

seaborn.lineplot(x=None, y=None, hue=None, 
                 size=None, style=None, data=None,
                 palette=None, hue_order=None, hue_norm=None, 
                 sizes=None, size_order=None, size_norm=None, 
                 dashes=True, markers=None, style_order=None, 
                 units=None, estimator='mean', ci=95, n_boot=1000,
                 sort=True, err_style='band', err_kws=None,
                 legend='brief', ax=None, **kwargs)
绘制折线图,可以通过调整颜色、大小和样式等参数来显示数据之间的关系。
类似于seaborn.scatterplot

2.4 常见分布计算

#生成一组符合特定分布的随机数
在Numpy库中,提供了一组random类可以生成特定分布的随机数

import numpy
# 生成大小为1000的符合b(10,0.5)二项分布的样本集
s = numpy.random.binomial(n=10,p=0.5,size=1000)
# 生成大小为1000的符合P(1)的泊松分布的样本集
s = numpy.random.poisson(lam=1,size=1000)
# 生成大小为1000的符合U(0,1)均匀分布的样本集,注意在此方法中边界值为左闭右开区间
s = numpy.random.uniform(low=0,high=1,size=1000)
# 生成大小为1000的符合N(0,1)正态分布的样本集,可以用normal函数自定义均值,标准差,也可以直接使用standard_normal函数
s = numpy.random.normal(loc=0,scale=1,size=1000)
s = numpy.random.standard_normal(size=1000)
# 生成大小为1000的符合E(1/2)指数分布的样本集,注意该方法中的参数为指数分布参数λ的倒数
s = numpy.random.exponential(scale=2,size=1000)

#除了Numpy,Scipy也提供了一组生成特定分布随机数的方法
# 以均匀分布为例,rvs可用来生成一组随机变量的值
from scipy import stats
stats.uniform.rvs(size=10)

#计算统计分布的PMF和PDF
#Scipy库提供了一组用于计算离散型随机变量PMF和连续型随机变量PDF的方法。
from scipy import stats
# 计算二项分布B(10,0.5)的PMF
x=range(11)
p=stats.binom.pmf(x, n=10, p=0.5)
# 计算泊松分布P(1)的PMF
x=range(11)
p=stats.poisson.pmf(x, mu=1)
# 计算均匀分布U(0,1)的PDF
x = numpy.linspace(0,1,100)
p= stats.uniform.pdf(x,loc=0, scale=1)
# 计算正态分布N(0,1)的PDF
x = numpy.linspace(-3,3,1000)
p= stats.norm.pdf(x,loc=0, scale=1)
# 计算指数分布E(1)的PDF
x = numpy.linspace(0,10,1000)
p= stats.expon.pdf(x,loc=0,scale=1)

#计算统计分布的CDF
类似计算概率质量/密度函数的方法,只需将上节中的pmf或pdf替换为cdf,即可得到分布函数的值
# 以正态分布为例,计算正态分布N(0,1)的CDF
x = numpy.linspace(-3,3,1000)
p = stats.norm.cdf(x,loc=0, scale=1)

#统计分布可视化
#二项分布
#比较n=10,p=0.5的二项分布的真实概率质量和10000次随机抽样的结果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

x = range(11)  # 二项分布成功的次数(X轴)
t = stats.binom.rvs(10,0.5,size=10000) # B(10,0.5)随机抽样10000次
p = stats.binom.pmf(x, 10, 0.5) # B(10,0.5)真实概率质量

fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.scatterplot(x,p,color='purple')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Binomial distribution')
plt.legend(bbox_to_anchor=(1.05, 1))

#泊松分布
#比较λ=2的泊松分布的真实概率质量和10000次随机抽样的结果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=range(11)
t= stats.poisson.rvs(2,size=10000)
p=stats.poisson.pmf(x, 2)

fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.scatterplot(x,p,color='purple')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Poisson distribution')
plt.legend()

#比较不同参数λ对应的概率质量函数,可以验证随着参数增大,泊松分布开始逐渐变得对称,分布也越来越均匀,趋近于正态分布
x=range(50)
fig, ax = plt.subplots()
for  lam in [1,2,5,10,20] :
        p=stats.poisson.pmf(x, lam)
        sns.lineplot(x,p,label='lamda= '+ str(lam))
plt.title('Poisson distribution')
plt.legend()

#均匀分布
#比较U(0,1)的均匀分布的真实概率密度和10000次随机抽样的结果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(0,1,100)
t= stats.uniform.rvs(0,1,size=10000)
p=stats.uniform.pdf(x, 0, 1)

fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Uniforml distribution')
plt.legend(bbox_to_anchor=(1.05, 1))

#正态分布
#比较N(0,1)的正态分布的真实概率密度和10000次随机抽样的结果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(-3,3,100)
t= stats.norm.rvs(0,1,size=10000)
p=stats.norm.pdf(x, 0, 1)

fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=100,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Normal distribution')
plt.legend(bbox_to_anchor=(1.05, 1))

#比较不同均值和标准差组合的正态分布的概率密度函数
x=numpy.linspace(-6,6,100)
p=stats.norm.pdf(x, 0, 1)
fig, ax = plt.subplots()
for  mean, std in [(0,1),(0,2),(3,1)]: 
        p=stats.norm.pdf(x, mean, std)
        sns.lineplot(x,p,label='Mean: '+ str(mean) + ', std: '+ str(std))
plt.title('Normal distribution')
plt.legend()

#指数分布
#比较E(1)的指数分布的真实概率密度和10000次随机抽样的结果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(0,10,100)
t= stats.expon.rvs(0,1,size=10000)
p=stats.expon.pdf(x, 0, 1)

fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=100,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Exponential distribution')
plt.legend(bbox_to_anchor=(1, 1))

#比较不同参数的指数分布的概率密度函数
x=numpy.linspace(0,10,100)
fig, ax = plt.subplots()
for  scale in [0.2,0.5,1,2,5] :
        p=stats.expon.pdf(x, scale=scale)
        sns.lineplot(x,p,label='lamda= '+ str(1/scale))
plt.title('Exponential distribution')
plt.legend()

 

你可能感兴趣的:(概率统计)