#coding:utf-8 # 设定编码方式为utf-8
%matplotlib inline
import pandas as pd # 导入pandas包,命名为pd
import numpy as np # 导入numpy包,命名为np
import matplotlib.pyplot as plt # 导入pyplot包,命名为plt
%config InlineBackend.figure_format='retina'
stake_data=pd.read_csv('stakes.csv') #读入csv文件,返回pandas.DataFrame对象
stake_data.head(5) #查看前5行
len(stake_data) #查看长度
89
stake_time=stake_data['time'] #获得stake_data中的time列
type(stake_time) #查看stake_time的类型,是一个Series对象
pandas.core.series.Series
time_mean=stake_time.mean()#求stake_time的均值
time_std=stake_time.std() #求stake_time的标准差S.D.
#定义概率密度函数
def normfun(x,mu,sigma):
pdf=np.exp(-((x-mu)**2)/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))
return pdf
stake_time.min() #求最大值和最小值,以确定区间
146.0
stake_time.max()
153.19999999999999
x=np.arange(145,155,0.1) #设定x轴的显示范围和步长
y=normfun(x,time_mean,time_std) #y轴显示概率密度函数,把均值和标准差代入
plt.plot(x,y) #绘制正态分布曲线
plt.hist(stake_time,bins=10,rwidth=0.9,normed=True) #绘制直方图,normed=True ,直方图的值将进行归一化处理,形成概率密度
plt.title('stake time distribution')
plt.xlabel('stake time')
plt.ylabel('Probability')
plt.show()
iq_data=pd.read_csv('IQscore.csv')
iq_data.head(5)
iq=iq_data['IQ']
mean=iq.mean()
mean
100.82857142857142
std=iq.std()
std
15.015905990389498
iq.max()
140
iq.min()
69
x=np.arange(65,140,1)
y=normfun(x,mean,std)
plt.plot(x,y)
plt.hist(iq,bins=14,rwidth=0.9,normed=True)
plt.title('IQ distribution')
plt.xlabel('IQ score')
plt.ylabel('Probability')
plt.show()
知识点 :normed=True 的含义
官方文档说明:If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)`dbin), i.e., the integral of the histogram will sum to 1.
开始我以为normalized(归一化?)之后,直方图y轴上显示的是该数据组的概率,所以每组的概率总和应该是1,但是上面的例子明显不符合。生成随机数来试验,发现理解有误。normed=True的作用是形成概率密度,即图形在x轴上的积分为1,而不是在y轴上的值之和为1.y轴上的值是多少,取决于数据组的区间大小。因为面积=宽度*高度,所以高度=面积/宽度。下面是试验的例子:
s=np.random.sample(10)# 生成10个[0,1.0)之间的随机数
s
array([ 0.90267377, 0.08100027, 0.96113437, 0.19237121, 0.55422091,
0.020286 , 0.389889 , 0.43902501, 0.16690993, 0.2388711 ])
plt.hist(s,bins=10,range=(0, 1), alpha=0.5,normed=True) #bins=10,每组数据宽度为0.1,面积总和为2*0.1*2+4*0.1*1+1*0.1*2=1
plt.show()
plt.hist(s,bins=10,range=(0, 1), alpha=0.5) #默认normed=False,图形和上面一样,事实上显示的是每组的频数
plt.show()
plt.hist(s,bins=20,range=(0, 1), alpha=0.5,normed=True) #bins=20,每组宽度缩小为0.05,y轴上的对应值扩大一倍,面积总和=1,不再赘述
plt.show()
plt.hist(s,bins=20,range=(0, 1), alpha=0.5) ##默认normed=False,不进行归一化
plt.show()
可以推测,当bins=40,y轴的最大值会变为两倍。同学们可以试试。
那什么情况下normalized之后,y轴上会显示数据组的概率呢,自然是组区间正好等于1的时候
s2=np.random.randint(0,10,10) #生成[0,10)之间的10个整数
s2
array([8, 1, 6, 3, 2, 3, 4, 3, 1, 7])
plt.hist(s2,bins=10,range=(0, 10), alpha=0.5,normed=True) #各组的y值正好是该组的概率,和等于1
plt.show()
plt.hist(s2,bins=10,range=(0, 10), alpha=0.5) #默认normed=False,y轴上是各组的频数
plt.show()
对数据集的理解
相比之下,第二个数据集更接近正态分布,但两个都不是完全拟合,现实便是如此,不可能与模型完全一致,模型的作用在于让我们知道哪个区间的概率更大。例如赛马中,假如有对冠军完成赛程时间的预测,依据模型,可以判断148以下和152以上都是冷门事件。
关于正态分布的理解
从直方图到正态分布,是一个从具体到一般的归纳过程。直方图显示的是每一组数据的出现频率,当组区间不断缩小,图像会逐渐趋向于一条曲线,所谓分布,是这条曲线所满足的公式。人们发现,自然界中许多现象都近似地服从正态分布,这一模型被广泛应用于科学、工程领域。假设检验、置信区间是建立在某一分布的基础上。
以抛硬币问题为例,假定正面朝上次数X服从正态分布,已知X的一个取值x,可以通过正态分布公式计算出对应的置信区间。换句话说,抛100次,80次朝上并不是不可能,而是概率非常小,当概率小到一定程度,我们就可以怀疑硬币是不是出了问题。
本文为解密大数据社群作业,具体请关注:
网友评论