python 概率分布_如何用python实现概率分布?

这篇博客总结了概率分布和抽样的Python实现,包括伯努利、二项、几何、泊松、正态和幂律分布。还探讨了numpy和Pandas的随机抽样方法,特别指出random.randint与numpy.random.randint的区别,并分享了如何用泊松分布近似二项分布的小知识。此外,介绍了正态概率计算和查z-score表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

aa8e22cf7ffe9551be383e0ccf6c3441.png

随机变量+抽样统计基础思维导图总结

0b1304c65e2edf99b1d7a37c293c064e.png

c9b020ff024cf923da18180df49c80c2.png

2ab84a17e232618069c0d6674b28e0cb.png

概率分布和抽样的python实现

伯努利分布 Bernoulli Distribution

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
#定义随机变量:1次抛硬币
X = np.arange(0,2,1) #成功指正面朝上记录为1,失败指反面朝上记录为0
X
array([0, 1])
#求对应分布的概率:概率质量函数 (PMF)
p = 0.5 # 硬币朝上的概率
pList = stats.bernoulli.pmf(X, p)
pList
array([0.5, 0.5])
#概率分布
plt.plot(X, pList, marker='o', linestyle='none')
plt.vlines(X,0,pList)
#x轴文本
plt.xlabel('随机变量:抛硬币1次')
#y轴文本
plt.ylabel('概率')
#标题
plt.title('伯努利分布: p=%.2f' % p)
#显示图形
plt.show()

f977fbddae48858f44185b1be7398983.png

二项分布(Binomial Distribution)

#定义随机变量:5次抛硬币,正面朝上的次数
n = 5 #次数
p =0.5 #正面向上的概率
X = np.arange(0,n+1)
X
array([0, 1, 2, 3, 4, 5])
#求对应分布的概率:概率质量函数 (PMF)
pList = stats.binom.pmf(X, n, p)
pList
array([0.03125, 0.15625, 0.3125 , 0.3125 , 0.15625, 0.03125])
#概率分布
plt.plot(X, pList, marker='o', linestyle='none')
plt.vlines(X,0,pList)
#x轴标题
plt.xlabel('随机变量:抛硬币5次')
#y轴标题
plt.ylabel('概率')
#标题
plt.title('二项分布: p=%.2f' % p)
#显示图形
plt.show()

2cd0fc789b91f03378f0e42c751f2e4d.png

几何分布(Geometric Distribution)

#第k次做某件事情,才取到第1次成功
#第5次表白成功的概率
k = 5
# 做某件事情成功的概率,这每次表白成功概率都是60%
p = 0.6
X = np.arange(1,k+1)
X
array([1, 2, 3, 4, 5])
#求对应分布的概率:概率质量函数 (PMF)
pList = stats.geom.pmf(X, p)
pList
array([0.6    , 0.24   , 0.096  , 0.0384 , 0.01536])
#概率分布
plt.plot(X, pList, marker='o', linestyle='none')
plt.vlines(X,0,pList)
#x轴标题
plt.xlabel('随机变量:表白第k次才首次成功')
#y轴标题
plt.ylabel('概率')
#标题
plt.title('几何分布: p=%.2f' % p)
#显示图形
plt.show()

d5486c21ca14d281e238d94357749948.png

泊松分布 Poisson Distribution

#某路口发生事故的比率是每天2次,一天发生k次事故的概率是多少
mu = 2 #平均2次
k = 4 #发生4次
X = np.arange(0,k+1)
X
array([0, 1, 2, 3, 4])
#求对应分布的概率:概率质量函数 (PMF)
pList = stats.poisson.pmf(X, mu)
pList
array([0.13533528, 0.27067057, 0.27067057, 0.18044704, 0.09022352])
#概率分布
plt.plot(X, pList, marker='o', linestyle='none')
plt.vlines(X, 0, pList)
#x轴标题
plt.xlabel('随机变量:某路口发生k次事故')
#y轴标题
plt.ylabel('概率')
#标题
plt.title('泊松分布: 平均值=%.2f' % mu)
#显示图形
plt.show()

03c62ef8d7ec423642e6dc5ceaa7393e.png

正态分布(Normal Distribution)

#定义随机变量:
mu = 0 #平均值
sigma= 1 #标准差
X = np.arange(-5, 5, 0.1)
X
array([-5.00000000e+00, -4.90000000e+00, -4.80000000e+00, -4.70000000e+00,
       -4.60000000e+00, -4.50000000e+00, -4.40000000e+00, -4.30000000e+00,
       -4.20000000e+00, -4.10000000e+00, -4.00000000e+00, -3.90000000e+00,
       -3.80000000e+00, -3.70000000e+00, -3.60000000e+00, -3.50000000e+00,
       -3.40000000e+00, -3.30000000e+00, -3.20000000e+00, -3.10000000e+00,
       -3.00000000e+00, -2.90000000e+00, -2.80000000e+00, -2.70000000e+00,
       -2.60000000e+00, -2.50000000e+00, -2.40000000e+00, -2.30000000e+00,
       -2.20000000e+00, -2.10000000e+00, -2.00000000e+00, -1.90000000e+00,
       -1.80000000e+00, -1.70000000e+00, -1.60000000e+00, -1.50000000e+00,
       -1.40000000e+00, -1.30000000e+00, -1.20000000e+00, -1.10000000e+00,
       -1.00000000e+00, -9.00000000e-01, -8.00000000e-01, -7.00000000e-01,
       -6.00000000e-01, -5.00000000e-01, -4.00000000e-01, -3.00000000e-01,
       -2.00000000e-01, -1.00000000e-01, -1.77635684e-14,  1.00000000e-01,
        2.00000000e-01,  3.00000000e-01,  4.00000000e-01,  5.00000000e-01,
        6.00000000e-01,  7.00000000e-01,  8.00000000e-01,  9.00000000e-01,
        1.00000000e+00,  1.10000000e+00,  1.20000000e+00,  1.30000000e+00,
        1.40000000e+00,  1.50000000e+00,  1.60000000e+00,  1.70000000e+00,
        1.80000000e+00,  1.90000000e+00,  2.00000000e+00,  2.10000000e+00,
        2.20000000e+00,  2.30000000e+00,  2.40000000e+00,  2.50000000e+00,
        2.60000000e+00,  2.70000000e+00,  2.80000000e+00,  2.90000000e+00,
        3.00000000e+00,  3.10000000e+00,  3.20000000e+00,  3.30000000e+00,
        3.40000000e+00,  3.50000000e+00,  3.60000000e+00,  3.70000000e+00,
        3.80000000e+00,  3.90000000e+00,  4.00000000e+00,  4.10000000e+00,
        4.20000000e+00,  4.30000000e+00,  4.40000000e+00,  4.50000000e+00,
        4.60000000e+00,  4.70000000e+00,  4.80000000e+00,  4.90000000e+00])
#概率密度函数(PDF)
y = stats.norm.pdf(X, mu, sigma)
#概率分布
plt.plot(X, y)
#x轴文本
plt.xlabel('随机变量:x')
#y轴文本
plt.ylabel('概率:y')
#标题
plt.title('正态分布:$mu$=%.1f,$sigma^2$=%.1f' % (mu,sigma))
#网格
plt.grid()
#显示图形
plt.show()

b922da5e37fd82e424000ac34ef1553a.png

幂律分布 Power-Law

#定义随机变量:
a = 5
X = np.arange(0,1,0.01)
X
array([0.  , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,
       0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,
       0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,
       0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,
       0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
       0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,
       0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,
       0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,
       0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,
       0.99])
#概率密度函数(PDF)
y = stats.powerlaw.pdf(X, a)
#概率分布
plt.plot(X, y)
#x轴文本
plt.xlabel('随机变量:x')
#y轴文本
plt.ylabel('概率:y')
#标题
plt.title('泊松分布: a=%.2f' % a)
#网格
plt.grid()
#显示图形
plt.show()

b68c6b94b78858b4d57faa354c9448c0.png

随机抽样: numpy实现

#生成0-9之间的随机数
a = np.random.randint(0,10)
a
7
#抽奖:生成多个随机数
#从395个用户中 随机抽取10个人
for i in range(10):
    userId = np.random.randint(0, 396)
    print('第 %s 位获奖用户的id是 %s' % (i+1, userId))
第 1 位获奖用户的id是 306
第 2 位获奖用户的id是 254
第 3 位获奖用户的id是 274
第 4 位获奖用户的id是 387
第 5 位获奖用户的id是 334
第 6 位获奖用户的id是 261
第 7 位获奖用户的id是 156
第 8 位获奖用户的id是 45
第 9 位获奖用户的id是 217
第 10 位获奖用户的id是 335

随机抽样:Pandas实现

#创建5行4列的dataframe
import pandas as pd
df = pd.DataFrame(np.arange(5*4).reshape(5,4))
df

795891be92c9abdddf2dae92de8f71b8.png
#随机选择一个n行的子集
sample1 = df.sample(n=3)
sample1

c4c94161a88814ce2aaef8652a875ffd.png

random.randint和numpy.random.randint 的区别

  • random.randint(a, b) 返回闭区间[a, b] 范围内的整数值
  • numpy.random.randint(a, b) 返回开区间 [a, b)范围内的整数值

小知识:

当 n很大 且p 很小时,可以用泊松分布近似替代二项分布

eg: n=50, p=0.1

正态概率计算

  1. 确定分布与范围:确定均值和标准差,以及所求范围
  2. 使其标准化:标准分 z = (x-µ)/∂^2
  3. 查找概率:查z-score表找到对应概率

查表流程

ac829972809841f4a99f91fdec01f529.png

4bd53f9951e9b41b1e9842a466749b3d.png
z-score表

2dd958a58903e1bc356f4fca76912d32.png
p(Z<z)的面积

p (Z > z)解法:

p (Z > z) = 1 - p (Z < z)

即将Z < z的面积从总概率中去除

b06ee75486377c6bd32bd7b76673001a.png
p (Z &amp;amp;amp;gt; z) = 1 - p (Z &amp;amp;amp;lt; z)

p (a < Z < b)解法:

p (a < Z < b) = p (Z < b) - p (Z > a)

即算出p (Z < b),将p (Z < b)的面积从其中去除

97d100c762713d19066a980d2fae34bc.png
p (a &amp;amp;amp;lt; Z &amp;amp;amp;lt; b) = p (Z &amp;amp;amp;lt; b) - p (Z &amp;amp;amp;gt; a)

统计知识真的是常看常新,如果第一次不懂也没关系,只要克服畏难情绪,多看几遍总能理解的。

下篇置信区间见~

参考资料
深入浅出统计学 (豆瓣)​book.douban.com
a7fd127de94b6e2919baed4f7ccdfbbf.png
统计概率思维:决定你财富的商业模式​www.zhihu.com
374a29d63030ccfc24651fbdcd15d451.png
统计概率思维:如何避免偏见和抽样分布​www.zhihu.com
374a29d63030ccfc24651fbdcd15d451.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值