381 什么是一个事件?
抛硬币出现正面就可以定义为一个事件 X;抛硬币出现反面也能被定义为一个事件 Y;抛硬币 10 次,正面朝上次数也可定义为一个事件 Z;在101班测量了40名学生的身高,学生的平均身高也可以被定义为一个事件 H.
382 什么是概率?
概率描述某个事件发生的概率,比如上面事件 X 发生的概率为 0.4,则对应的事件 Y 发生的概率就为 0.6,事件 X 和 事件 Y 为一对对立事件。抛硬币 10 次,正面朝上次数为事件 Z ,可能的取值为 0 到 10 ,发生 0 次的概率一般记做 P(X=0) ,它等于 0.6^10;出现 1 次的概率 P(X=1) ,等于 0.4 * 0.6 ^ 9,后面依次类推。
383 什么是离散型随机变量?
比如上面的事件 Z ,可能取值为 0 到 10, 这是一个离散型随机变量,因为事件 Z 可能的取值个数是有限的。
384 什么是连续型随机变量?
101班 40 名学生的平均身高对应的事件 H 取值就有各种可能性,因此事件 H 取值为连续型随机变量。
385 概率分布描述的是什么?以二项分布为例阐述
概率分布表示某个事件的所有可能取值对应的概率情况。求出每个可能的取值对应的概率,就相当于得到事件 Z 的概率分布。此处事件 Z 的概率分布实际上就是我们常见的 二项分布,下面绘制出事件 Z 在正面发生概率为 0.4 情况下的概率分布图:
ph = 0.4
pt = 1 - ph
sumn = 10
zi = range(0,sumn+1)
def combine_number(sumn, headn):
return math.factorial(sumn) / math.factorial(headn) / math.factorial(sumn - headn)
pi = [combine_number(10,headn)* math.pow(ph,headn) * math.pow(pt,sumn - headn) for headn in zi]
plt.plot(zi,pi,color='r')
plt.scatter(zi,pi,color='', marker='o',edgecolor='b')
plt.grid()
plt.xlabel('count of head')
plt.ylabel('p distribute')
plt.show()
image
看到正面出现 4 次的概率最大为 0.25.
386 累积分布函数 x, y 的意义是什么?
如上事件 Z 出现次数不大于 4 次的概率累加和,记做 F(4),等于 P(Z<=4) 的概率,逐个计算出 F(n),n 等于 0 到 10, 这样就得到一个累积分布函数,离散型变量的累积分布函数被称作概率质量函数。
代码接着第 6 节,下面绘制出事件 Z 的概率质量函数:
cfd = np.cumsum(pi)
plt.step(zi,cfd,color='g')
for i,j in zip(zi,cfd):
plt.text(x=i-0.75,y=j,s=round(j,2))
plt.xlabel('count of head')
plt.ylabel('cumulation p')
plt.grid()
plt.show()
image
387 NumPy 求平均值、中位数、标准差、方差
描述性变量是对已有数据的基本情况统计量,比如测量出 101 班 40 名学生的身高,我们就能基于这些数据,计算出以下描述性统计量:
平均值
中位数
标准差
方差
假定下面为 101 班级 40 名学生测量身高值:
hs = array([189., 158., 178., 169., 146., 169., 168., 169., 160., 177., 161.,
191., 155., 177., 171., 183., 168., 181., 189., 180., 170., 168.,
170., 169., 176., 163., 136., 165., 179., 150., 186., 160., 177.,
154., 165., 186., 168., 182., 167., 162.])
使用 NumPy 很容易计算出 40 名学生的平均身高值:169.8
np.mean(hs)
中位数:169.0,按照身高从低到高排序后,位于中间的数值。
np.median(hs)
它与均值不同,某些场景选用中位数会更加合适,尤其数据分布不均匀时。比如中等收入家庭占多,富豪还是少数但是财富值远多于中等收入家庭。如果取所有样本的均值就会高于大多数中等家庭收入均值,此时选用样本中位数更能贴近家庭实际收入情况。
方差:144.16
np.var(hs)
标准差:12.0
np.std(hs)
方差取根号得到标准差,它们表示数据偏离平均值的程度,标准差越小表示数据整体更靠近均值,反之越偏离均值,也就更加分散。
展示 40 位学生身高数据偏离平均值的柱状图:
import matplotlib.pyplot as plt
import numpy as np
import math
plt.figure(figsize=(12,8))
plt.bar(np.arange(40),hs-np.mean(hs),color='blue')
plt.plot(np.arange(40),np.repeat(0,40),color='r')
plt.xlabel('student id')
plt.ylabel('subtract mean height')
image
从上图看出偏离平均值(红线水平线)最大的样本 id 位于 25 到 30 间,偏离值为 30 多。
388 分位数和箱型图传递什么信息?
快速了解数据的分布最便捷的方法之一就是通过分位数,绘制箱型图。
常用的分位数有上、下分位数和中位数,分别对应数据 75%,25%,50% 比例处。
使用 NumPy 分别求出 40 位学生身高的上、下分位数和中位数,依次为:178.25,169.0,169.0.
p3 = np.percentile(hs,75)
p1 = np.percentile(hs,25)
p2 = np.percentile(hs,50)
接下来绘制箱型图,进一步获取到更多数据分布的信息:
plt.figure(figsize=(12,8))
plt.grid()
d = plt.boxplot(hs)
image
从箱型图中看出如上标注的信息,位于上、下限之外的样本点是异常值,用圆圈表示,如上图所示。
389 期望和频率分布直方图的案例
101 班 40 名学生的身高值是连续性随机变量,很显然研究具体某个身高值的概率没有意义。一般的,将样本集合的最小值、最大值对应的区间均分为若干等分,求出某个样本落在对应区间的概率值,记做此身高值的概率。
使用 Matplotlib 绘制频率分布直方图,得到 10 个区间,以及落入每个区间的样本个数:
plt.figure(figsize=(8,6))
hsh = plt.hist(hs,color='b')
hsh
注意 hist 方法返回的结果为一个元组,第一个元素为区间内样本的个数,第二个元素表示划分的10个区间,例如落在区间[136.,141.5] 的样本个数为 1, 落在区间 [152.5, 158] 内元素个数为 2.