概率论与数理统计以及Python实现概率论:
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4
5#随机数当随机种⼦设定时,随机数不变
6if 0:
7    r = np.random.RandomState()
8# r = np.random.RandomState(10)
9    res = r.rand(10)
10print(res)
11pass
12
13import numpy.random as r
14#均匀分布
15if 0:
16    x = r.rand(1000)
17    y = r.rand(1000)
18    plt.scatter(x,y)
19    plt.show()
20pass
21
22#正态分布正态分布 - 标准正态分布,均值为0,⽅差为1
23if 0:
24    x = r.randn(1000)
25    y = r.randn(1000)
26    plt.scatter(x,y)
27
28    plt.show()
29pass
30
31# 正态分布
32# normal(loc=0.0, scale=1.0, size=None)
33# loc:均值,scale:标准差,size:抽取样本的size
34if 0:
35    x = r.normal(10,5,1000)
36    y = r.normal(10,5,1000)
37    plt.scatter(x,y)
38
39    plt.show()
40pass
41
42
43#指数分布
44if 0:
45
46    lambd = 0.5
47    x = np.arange(0,15,0.1)
48    y = lambd* np.exp(-lambd*x)
49    plt.plot(x,y)
50
51
52    plt.show()
53
54
55
56#⼆项分布
57# .binomial(n, p, size=None)表⽰对⼀个⼆项分布进⾏采样,s为成功次数
58# P(N)=CsnPs(1−P)n−s
59# size:采样的次数  n:p即式中的n  p:函数的返回值表⽰n中发⽣/成功的次数s. 60
61# 同时抛弃9枚硬币,如果正⾯朝上少于5枚,则输掉8元,否则就赢8元。
62# 如果⼿中有1000元作为赌资,请问赌博10000次后可能会是什么情况呢? 63if 0:
64    binomial = r.binomial(9, 0.5, 10000)  # ⽣成⼆项分布随机数
65# print(binomial)
66    money = np.zeros(10001)  # ⽣成10001次赌资的列表
67    money[0] = 1000 #⼀开始有1000
68
69for i in range(10000):
70if binomial[i] <5:
71            money[i+1] = money[i] -8
72else:
73            money[i+1] = money[i] +8
74    plt.plot(np.arange(10001),money)
75    plt.axvline(0,color='cyan',linestyle='--')
76    plt.axvline(10001,color='gray',linestyle='--')
77    plt.axhline(1000,color='cyan',linestyle='--')
78    plt.show()
79pass
80
81
82# ⼆项分布
83# 将⼀枚硬币抛掷三次:恰好出现⼀次正⾯与⾄少有⼀次出现正⾯的概率
84if 0:
85# res = r.binomial(3,0.5,100)
86# plt.scatter(np.arange(100),res)
87# print(res)
88# plt.show()
89
90    n0 = sum(r.binomial(3,0.5,10000) == 0)  #n0 是10000 次中有多少次⼀个正⾯朝上也没有
91    n1 = sum(r.binomial(3,0.5,10000) == 1)  #n1 是10000 次中有多少次只有⼀个正⾯朝上
92    n2 = sum(r.binomial(3,0.5,10000) == 2)  #n2 是10000 次中有多少次只有两个正⾯朝上
93    n3 = sum(r.binomial(3,0.5,10000) == 3)  #n3 是10000 次中有多少次三个都正⾯朝上
94print(n0,n1,n2,n3)
95
96print("3个中⼀个正⾯也没有的概率是",n0/10000)  #1/8
97print("3个中只有⼀个正⾯的概率是",n1/10000)  #3/8
98print("3个中只有两个正⾯的概率是",n2/10000)  #3/8
99print("3个中都是正⾯的概率是",n3/10000) #1/8
100
101
102pass
103
104
105# 随机选择
106if 0:
107    res = r.choice(['a','b','c','d','e','f'],size = 40)
108print(res) #此时是随机选择40 个,放回的抽样
109
110    res2 = r.choice(['a','b','c','d','e','f'])
111print(res2)  #默认值是抽取⼀个
112pass
113
114#随机顺序打乱
115if 0:
116    a = np.arange(20)
117    res = r.shuffle(a)
118# print(res)  #None
119print(a)
120pass
121
122
123#随机变量的数字特征
124
125#⽅差计算
126if 1:
127    a = r.randn(100) #创建个⼀个正态分布标准的
128# print(a)
129
130    n = len(a) #元素个数
131#均值
132    m = a.mean()
133#⽅差
134    s = np.sum((a-m)**2)/n
135print("均值为 {}  ⽅差为 {} ".format(m,s))
136
137#numpy 提供的计算⽅差的函数 var() 
138print("⽅差为 {} (Numpy 函数var 直接计算)".format(np.var(a)))
139
140
141
142pass
View Code
数理统计:
注:频率直⽅图 和 条形图是有很⼤区别的
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4
5#数据分布的图表可视化 - 直⽅图
6import numpy.random as r
7if 0:
8    a =r.randn(1000)*100  #创建⼀个1000个数的标准正态分布的数组
9# print(max(a),min(a))
10# print(len(a))
11    plt.hist(a,bins=50)
12# id() #显⽰⽹格线
13
14
15    plt.show()
16pass
17
18# 数据分布的图表可视化 - 箱型图
19if 0:
20    a = r.randn(1000)*100
21    plt.boxplot(a,
22                vert=True,  # 是否垂直
23                whis=1.5,  # IQR,默认1.5,也可以设置区间⽐如[5,95],代表强制上下边缘为数据95%和5%位置
24                patch_artist=True,  # 上下四分位框内是否填充,True为填充
25                meanline=False, showmeans=True,  # 是否有均值线及其形状
26                showbox=True,  # 是否显⽰箱线
27                showcaps=True,  # 是否显⽰边缘线
28                showfliers=True,  # 是否显⽰异常值
29                notch=False,  # 中间箱体是否缺⼝
30                )
31    id()
32    plt.show()
33
34pass
35
36#计算分位数
37if 0:
38# ⽤ numpy 求分位数
numpy 统计元素出现次数39if 1:
40        a = r.randn(1000)*100  #1000个
41        p25 = np.percentile(a, 25)
42        p40 = np.percentile(a, 40)
43        p75 = np.percentile(a, 75)
44print('ar的25分位数为%.2f, 40分位数为%.2f, 75分位数为%.2f' % (p25, p40, p75))
45
46print("中位数 {} ".dian(a)))
47print("中位数 {} ".format(  np.percentile(a,50)  )  )
48
49
50# 使⽤pandas中的dataframe 来求分位数
51if 0:
52        a = r.randn(1000)*100
53        df = pd.DataFrame(a,columns=['value'])
54# print(df)
55
56        q25 = df['value'].quantile(0.25)
57        q40 = df['value'].quantile(0.4)
58        q75 = df['value'].quantile(0.75)
59# print('df的25分位数为%.2f, 40分位数为%.2f, 75分位数为%.2f' % (q25, q40, q75))
60
61if 0:
62            q50 = df['value'].quantile(0.5)
63print(q50)
64print('df的中位数为%.2f' % df['value'].median())
65pass
66
67
68pass
69
70
71
72
73pass
View Code