基础概率统计的python实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

import warnings
warnings.filterwarnings('ignore')

3.1.2 随机变量及其分布

# 随机种子 → 种子不变产生随机数一样
r = np.random.RandomState(1)
r.rand(10)
array([4.17022005e-01, 7.20324493e-01, 1.14374817e-04, 3.02332573e-01,
       1.46755891e-01, 9.23385948e-02, 1.86260211e-01, 3.45560727e-01,
       3.96767474e-01, 5.38816734e-01])
x = r.rand(1000)
y = r.rand(1000)
plt.scatter(x, y)
<matplotlib.collections.PathCollection at 0x114540198>

在这里插入图片描述

# 正态分布 -- 标准正态分布,均值为0,方差为1
x = r.randn(1000)
y = r.randn(1000)
plt.scatter(x, y)
<matplotlib.collections.PathCollection at 0x1145d0c88>

在这里插入图片描述

# 正态分布
# normal(loc = 0.0, scale = 1.0, size = None)
# loc:均值, scale:标准差, size:抽取样本的size
x = r.normal(10, 5, 1000)
y = r.normal(10, 5, 1000)
plt.scatter(x, y)
<matplotlib.collections.PathCollection at 0x1145cfda0>

在这里插入图片描述

# 指数分布
lambd = 0.5
x = np.arange(0, 15, 0.1)
y = lambd * np.exp(-lambd * x)
plt.plot(x, y)
[<matplotlib.lines.Line2D at 0x1146cb860>]

在这里插入图片描述

# 二项分布
# .binomial(n, p, size=None)表示对一个二项分布进行采样,s为成功次数 
# P(N)=CsnPs(1−P)n−s
# size:采样的次数  n:p即式中的n   p:函数的返回值表示n中发生/成功的次数s.

# 同时抛弃9枚硬币,如果正面朝上少于5枚,则输掉8元,否则就赢8元。
# 如果手中有1000元作为赌资,请问赌博10000次后可能会是什么情况呢?
binomial = np.random.binomial(9, 0.5, 10000)
money = np.zeros(10000)
money[0] = 1000

for i in range(1, 10000):
    if binomial[i] < 5:
        money[i] = money[i-1] - 8
    else:
        money[i] = money[i-1] + 8
plt.plot(np.arange(10000), money)
[<matplotlib.lines.Line2D at 0x114c65390>]

在这里插入图片描述

# 二项分布
# 将一枚硬币抛掷三次:恰好出现一次正面与至少有一次出现正面的概率

a1 = sum(np.random.binomial(3,0.5,10000)==1)/10000
a2 = sum(np.random.binomial(3,0.5,10000)>0)/10000
print('恰好出现一次正面的概率为%.4f, 至少有一次出现正面的概率为%.4f' % (a1,a2))
恰好出现一次正面的概率为0.3740, 至少有一次出现正面的概率为0.8737
r.choice(['a', 'b', 'c', 'd', 'e', 'f'], size = 40)

array(['a', 'a', 'b', 'e', 'e', 'a', 'd', 'f', 'f', 'c', 'c', 'e', 'a',
       'f', 'b', 'd', 'd', 'a', 'e', 'c', 'f', 'e', 'c', 'a', 'a', 'a',
       'd', 'a', 'd', 'b', 'a', 'a', 'e', 'a', 'e', 'e', 'c', 'b', 'c',
       'a'], dtype='<U1')
# 随机顺序打乱
ar = np.arange(20)
r.shuffle(ar)
ar

array([ 6, 15,  2,  0, 12,  9, 11,  1,  8,  5, 19, 16,  7,  4, 14, 18,  3,
       10, 17, 13])

3.1.3 随机变量的数字特征

# 方差计算
r = np.random.RandomState(2)
ar = r.randn(100)

n = len(ar)
m = ar.mean()
var = np.sum((ar - m)**2)/n

print(var)
print(np.var(ar))
1.0754432724043381
1.0754432724043381
ar = r.normal(loc = 10, scale = 5, size = 100)
var = np.var(ar)
e = np.mean(ar)
print('结果的均值为%.2f,方差为%.2f' % (e,var))
结果的均值为9.05,方差为23.21
# 数据分布的图表可视化 - 直方图

r = np.random.RandomState(1)
ar = r.randn(1000) * 100

plt.hist(ar, bins = 50)
plt.grid()

在这里插入图片描述

# 数据分布的图表可视化 - 箱型图

plt.boxplot(ar,
            vert = True,  # 是否垂直
            whis = 1.5,  # IQR,默认1.5,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位置
            patch_artist = True,  # 上下四分位框内是否填充,True为填充
            meanline = False,showmeans=True,  # 是否有均值线及其形状
            showbox = True,  # 是否显示箱线
            showcaps = True,  # 是否显示边缘线
            showfliers = True,  # 是否显示异常值
            notch = False,  # 中间箱体是否缺口
            )
plt.grid()

在这里插入图片描述

# 计算分位数
df = pd.DataFrame(ar, columns = ['value'])
q25 = df['value'].quantile(0.25)
q40 = df['value'].quantile(0.4)
q75 = df['value'].quantile(0.75)
print('df的25分位数为%.2f, 40分位数为%.2f, 75分位数为%.2f' % (q25,q40,q75))
print('df的中位数为%.2f' % df['value'].median())
print('-------')
# pandas中为.quantile()

a25 = np.percentile(ar,25)
a40 = np.percentile(ar,40)
a75 = np.percentile(ar,75)
print('ar的25分位数为%.2f, 40分位数为%.2f, 75分位数为%.2f' % (a25,a40,a75))
# numpy中为.percentile()
df的25分位数为-60.02, 40分位数为-19.19, 75分位数为70.40
df的中位数为4.13
-------
ar的25分位数为-60.02, 40分位数为-19.19, 75分位数为70.40

发布了182 篇原创文章 · 获赞 101 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/lancecrazy/article/details/100523236