一、常见分布
1. 离散型随机变量
分布 名称 |
满足 条件 |
概率质量 函数(PMF) |
例子 | 图表 |
---|---|---|---|---|
二项分布 (Binomial Distribution) |
1. 试验次数是固定的 2. 每次试验都是独立的 3. 对于每次试验成功的概率都是一样的 |
= Expectation: Variance: |
1. 销售电话成功的次数 2. 一批产品中有缺陷的产品数量 3. 掷硬币正面朝上的次数 4. 在一袋糖果中取糖果吃,拿到红色包装的次数 |
|
泊松分布 (Poisson Distribution) |
1. 试验次数n趋向于无穷大 2. 单次事件发生的概率p趋向于0 3. np是一个有限的数值 |
= Expectation: Variance: |
1. 一定时间段内,某航空公司接到的订票电话数 2. 一定时间内,到车站等候公交汽车的人数 3. 一匹布上发现的瑕疵点的个数 4. 一定页数的书刊上出现的错别字个数 |
|
几何分布 (Geometric Distribution) |
1. 进行一系列互相独立的试验 2. 每一次试验都既有成功的可能,也有失败的可能,且单次试验成功的概率相同 3. 主要感兴趣取得第一次成功需要进行多少次试验 |
= Expectation: Variance: |
1. 打枪打中的概率 2. 滑雪滑到底不出事故的概率 |
|
负二项分布 (Negative Binomial Distribution) |
1. 实验包含一系列独立的实验 2. 每个实验都有成功、失败两种结果 3. 成功概率恒定 4. 实验持续到r次失败,r可以为任意正数 |
= Expectation: Variance: |
1. 一台设备在故障前运行,正常记为成功,故障记为失败 2. 动作员尝试射门得分前的尝试次数,每次不成功的尝试记为成功,得分记为失败 |
|
超几何分布 (Hypergeometric Distribution) |
1. 从有限N个物件(其中包含M个指定种类的物件)中抽出n个物件,不放回 2. 成功抽出该指定种类物件的次数 |
= Expectation: Variance: |
已知某事件的发生概率,判断从中取出一个小样本(不放回),该事件以某一个机率出现的概率问题 |
2. 连续型随机变量
分布 名称 |
概率密度 函数(PDF) |
累计分布 函数(CDF) |
举例 | 图表 |
---|---|---|---|---|
均匀分布 (Uniform Distribution) 在定义域内 概率密度函数 处处相等 的统计分布 |
Expectation: |
Variance: |
1. 一个理想的 随机数生成器 2. 一个理想的 圆盘以 一定力度 旋转后静止时 的角度 |
|
正态分布 (Normal Distribution) 一种对称的分布, 概率密度 呈现钟摆的形状。一般正态分布 可以通过 公式变换 将其转变为 标准正态分布 ~ |
Expectation: |
Variance: |
1. 成人的身高 2. 不同方向的 气体分子 的运动速度 3. 测量物体 质量时 的误差 中心极限定理:一组独立同 分布的随机样本 的平均值 近似为正态分布,无论总体 符合何种分布 |
|
指数分布 (Exponential Distribution) 描述一个特定事件发生 所需要的时间。 指数分布中,有着 很少的大数值和非常多的小数值 |
Expectation: |
Variance: |
1. 顾客到达 一家店铺的 时间间隔 2. 从现在开始 到发生地震 的时间间隔 3. 在产线上收 到一个问题产 品的时间间隔 |
|
其他连续型分布:威布尔分布(Weibull Distribution),伽玛分布(Gamma Distribution)
3. 补充:二项分布、泊松分布和正态分布关系
i. 当很大,很小时,如 and 时,二项分布可以
近似为泊松分布。
ii. 当很大时,如时,泊松分布可以近似为正态分布。
iii: 当很大时,和都足够大时,如 ,
,时,二项分布可以近似为正态分布。
一些python代码实现
'''
产生特定分布的随机数,用到Numpy库
'''
import numpy as np
# 生成大小为1000的符合b(10,0.5)二项分布的样本集
s = np.random.binomial(n=10,p=0.5,size=1000)
# 生成大小为1000的符合P(1)的泊松分布的样本集
s = np.random.poisson(lam=1,size=1000)
# 生成大小为1000的符合U(0,1)均匀分布的样本集,边界值为左闭右开区间
s = np.random.uniform(low=0,high=1,size=1000)
# 生成大小为1000的符合N(0,1)正态分布的样本集
s = np.random.normal(loc=0,scale=1,size=1000)
s = np.random.standard_normal(size=1000)
# 生成大小为1000的符合E(1/2)指数分布的样本集,参数为指数分布参数λ的倒数
s = np.random.exponential(scale=2,size=1000)
'''
计算统计分布(PMF & PDF),使用 Scipy库
'''
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(以正态分布为例)
'''
# 计算正态分布N(0,1)的CDF
x = numpy.linspace(-3,3,1000)
p = stats.norm.cdf(x,loc=0, scale=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()
plt.show()
# 比较不同参数λ对应的概率质量函数
# 可以验证随着参数增大,泊松分布逐渐对称,趋近于正态分布
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()
plt.show()
二、假设检验
1. 基本概念
在总体的分布函数完全未知或不知其参数的情况,为了推断总体的某些
未知特性,提出某些关于总体的假设,称为假设检验。
2. 基本步骤
1. 陈述研究假设,包含原假设 (null hypothesis) 和备择假设
(alternate hypothesis)。通常会把原假设设为变量之间不存在某种差异
或关联,备择假设则是存在某种差异或关联。
2. 为验证假设收集数据。
注意抽样的数据要具有代表性,考虑各种可能的影响因素。
3. 构造合适的统计测试量并测试。
所有的统计检验都是基于组内方差和组间方差的比较,如果组间方差
足够大,使得不同组之间几乎没有重叠,那么统计量会反映出一个
非常小的值,意味着不同组之间的差异不可能是由偶然性导致的。
4. 决定是接受还是拒绝原假设。
通常单侧检验情况下,以作为临界值 。
5. 展示结论
3. 统计量的选择
i. 回归检验 (regression test)
回归检验适用于预测变量是数值型的情况,根据预测变量的数量和
结果变量的类型分为:
名称 | 预测变量() 特征 | 结果变量()特征 |
---|---|---|
简单线性回归 | 单个连续数值 | 连续数值 |
多重线性回归 | 多个连续数值 | 连续数值 |
Logistic回归 | 连续数值 | 二元类别(是或否) |
ii. 比较检验 (comparison test)
比较检验适用于预测变量是类别型,结果变量是数值型的情况:
名称 | 预测变量() 特征 | 结果变量()特征 |
---|---|---|
Paired t-test | 两组类别 | 组来自同一总体,数值 |
Independent t-test | 两组类别 | 组来自不同总体,数值 |
ANOVA | 两组及以上类别 | 单个数值 |
MANOVA | 两组及以上类别 | 两个及以上数值 |
iii. 关联检验(correlation test)
常用的是卡方检验,适用于预测变量和结果变量均为类别型。
iv. 非参数检验
当以上参数条件不满足的时候,可以用非参数检验来代替。
非参数检验 | 用于替代的参数检验 |
---|---|
Spearman | 回归和关联检验 |
Sign test | T-test |
Kruskal–Wallis | ANOVA |
ANOSIM | MANOVA |
Wilcoxon Rank-Sum test | Independent t-test |
Wilcoxon Signed-rank test | Paired t-test |
4. 两类错误
进行假设检验时可能有两类错误:一类错误(type I error)和
二类错误(type II error)。
一类错误:拒绝真的原假设
一类错误可以通过 α(显著性水平)来控制。以95%的
置信水平为例,a=0.05,这意味着我们拒绝一个真的
原假设的可能性是5%。
二类错误:接受错误的原假设
二类错误通常是由小样本或高样本方差导致的,可以
用β来表示。对于二类错误,可以从功效的角度来估
计,首先进行功效分析(power analysis)计算出功效
值1-β,进而得到二类错误的估计值β。
一些python代码实现
'''
正态检验
'''
import numpy as np
from scipy.stats import shapiro
data_nonnormal = np.random.exponential(size=100)
data_normal = np.random.normal(size=100)
def normal_judge(data):
stat, p = shapiro(data)
if p > 0.05:
return 'stat={:.3f}, p = {:.3f}, probably gaussian'.format(stat,p)
else:
return 'stat={:.3f}, p = {:.3f}, probably not gaussian'.format(stat,p)
# output
normal_judge(data_nonnormal)
# 'stat=0.850, p = 0.000, probably not gaussian'
normal_judge(data_normal)
# 'stat=0.987, p = 0.415, probably gaussian'
'''
卡方检验
'''
from scipy.stats import chi2_contingency
table = [[10, 20, 30],[6, 9, 17]]
stat, p, dof, expected = chi2_contingency(table)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably independent')
else:
print('Probably dependent')
# output
#stat=0.272, p=0.873
#Probably independent
'''
T-Test
'''
from scipy.stats import ttest_ind
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
stat, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=-1.382, p=0.184
# Probably the same distribution
'''
ANOVA
'''
from scipy.stats import f_oneway
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
data3 = np.random.normal(size=10)
stat, p = f_oneway(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=0.189, p=0.829
# Probably the same distribution
'''
Mann-Whitney U Test
'''
from scipy.stats import mannwhitneyu
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = mannwhitneyu(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=40.000, p=0.236
# Probably the same distribution
Credit:
笔记整理自:Datawhale 概率统计组队学习