百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Python+统计学进行数据探索分析(python 统计学)

toyiye 2024-08-10 21:38 9 浏览 0 评论

爱数据学习社

welcome

本文用Python统计模拟的方法,介绍四种常用的统计分布,包括离散分布:二项分布和泊松分布,以及连续分布:指数分布和正态分布,最后查看人群的身高和体重数据所符合的分布。

# 导入相关模块import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline%config InlineBackend.figure_format = 'retina'

随机数


计算机发明后,便产生了一种全新的解决问题的方式:使用计算机对现实世界进行统计模拟。该方法又称为“蒙特卡洛方法(Monte Carlo method)”,起源于二战时美国研制原子弹的曼哈顿计划,它的发明人中就有大名鼎鼎的冯·诺依曼。蒙特卡洛方法的名字来源也颇为有趣,相传另一位发明者乌拉姆的叔叔经常在摩洛哥的蒙特卡洛赌场输钱,赌博是一场概率的游戏,故而以概率为基础的统计模拟方法就以这一赌城命名了。

使用统计模拟,首先要产生随机数,在Python中,numpy.random 模块提供了丰富的随机数生成函数。比如生成0到1之间的任意随机数:

np.random.random(size=5) # size表示生成随机数的个数array([ 0.32392203, 0.3373342 , 0.51677112, 0.28451491, 0.07627541])

又比如生成一定范围内的随机整数:

np.random.randint(1, 10, size=5) # 生成5个1到9之间的随机整数array([5, 6, 9, 1, 7])

计算机生成的随机数其实是伪随机数,是由一定的方法计算出来的,因此我们可以按下面方法指定随机数生成的种子,这样的好处是以后重复计算时,能保证得到相同的模拟结果。

np.random.seed(123)

在NumPy中,不仅可以生成上述简单的随机数,还可以按照一定的统计分布生成相应的随机数。这里列举了二项分布、泊松分布、指数分布和正态分布各自对应的随机数生成函数,接下来我们分别研究这四种类型的统计分布。

  • np.random.binomial

  • np.random.poisson

  • np.random.exponential

  • np.random.normal

二项分布

二项分布是n个独立的是/非试验中成功的次数的概率分布,其中每次试验的成功概率为p。这是一个离散分布,所以使用概率质量函数(PMF)来表示k次成功的概率:

最常见的二项分布就是投硬币问题了,投n次硬币,正面朝上次数就满足该分布。下面我们使用计算机模拟的方法,产生10000个符合(n,p)的二项分布随机数,相当于进行10000次实验,每次实验投掷了n枚硬币,正面朝上的硬币数就是所产生的随机数。同时使用直方图函数绘制出二项分布的PMF图。

def plot_binomial(n,p): '''绘制二项分布的概率质量函数''' sample = np.random.binomial(n,p,size=10000) # 产生10000个符合二项分布的随机数 bins = np.arange(n+2)  plt.hist(sample, bins=bins, align='left', normed=True, rwidth=0.1) # 绘制直方图 #设置标题和坐标 plt.title('Binomial PMF with n={}, p={}'.format(n,p))  plt.xlabel('number of successes') plt.ylabel('probability')
plot_binomial(10, 0.5)

投10枚硬币,如果正面或反面朝上的概率相同,即p=0.5, 那么出现正面次数的分布符合上图所示的二项分布。该分布左右对称,最有可能的情况是正面出现5次。

但如果这是一枚作假的硬币呢?比如正面朝上的概率p=0.2,或者是p=0.8,又会怎样呢?我们依然可以做出该情况下的PMF图。

fig = plt.figure(figsize=(12,4.5)) #设置画布大小p1 = fig.add_subplot(121) # 添加第一个子图plot_binomial(10, 0.2)p2 = fig.add_subplot(122) # 添加第二个子图plot_binomial(10, 0.8)

这时的分布不再对称了,正如我们所料,当概率p=0.2时,正面最有可能出现2次;而当p=0.8时,正面最有可能出现8次。

泊松分布

泊松分布用于描述单位时间内随机事件发生次数的概率分布,它也是离散分布,其概率质量函数为:

比如你在等公交车,假设这些公交车的到来是独立且随机的(当然这不是现实),前后车之间没有关系,那么在1小时中到来的公交车数量就符合泊松分布。同样使用统计模拟的方法绘制该泊松分布,这里假设每小时平均来6辆车(即上述公式中lambda=6)。

lamb = 6sample = np.random.poisson(lamb, size=10000) # 生成10000个符合泊松分布的随机数bins = np.arange(20)plt.hist(sample, bins=bins, align='left', rwidth=0.1, normed=True) # 绘制直方图# 设置标题和坐标轴plt.title('Poisson PMF (lambda=6)')plt.xlabel('number of arrivals')plt.ylabel('probability')plt.show

指数分布

指数分布用以描述独立随机事件发生的时间间隔,这是一个连续分布,所以用质量密度函数表示:

比如上面等公交车的例子,两辆车到来的时间间隔,就符合指数分布。假设平均间隔为10分钟(即1/lambda=10),那么从上次发车开始,你等车的时间就满足下图所示的指数分布。


tau = 10sample = np.random.exponential(tau, size=10000) # 产生10000个满足指数分布的随机数plt.hist(sample, bins=80, alpha=0.7, normed=True) #绘制直方图plt.margins(0.02)
# 根据公式绘制指数分布的概率密度函数lam = 1 / taux = np.arange(0,80,0.1)y = lam * np.exp(- lam * x)plt.plot(x,y,color='orange', lw=3)#设置标题和坐标轴plt.title('Exponential distribution, 1/lambda=10')plt.xlabel('time')plt.ylabel('PDF')plt.show

正态分布

正态分布是一种很常用的统计分布,可以描述现实世界的诸多事物,具备非常漂亮的性质,我们在下一讲参数估计之中心极限定理时会详细介绍。其概率密度函数为:

以下绘制了均值为0,标准差为1的正态分布的概率密度曲线,其形状好似一口倒扣的钟,因此也称钟形曲线。

def norm_pdf(x,mu,sigma): '''正态分布概率密度函数''' pdf = np.exp(-((x - mu)**2) / (2* sigma**2)) / (sigma * np.sqrt(2*np.pi)) return pdf
mu = 0 # 均值为0sigma = 1 # 标准差为1# 用统计模拟绘制正态分布的直方图sample = np.random.normal(mu, sigma, size=10000)plt. hist(sample, bins=100, alpha=0.7, normed=True)# 根据正态分布的公式绘制PDF曲线x = np.arange(-5, 5, 0.01)y = norm_pdf(x, mu, sigma)plt.plot(x,y, color='orange', lw=3)plt.show

身高、体重的分布

以上从计算机模拟的角度出发,介绍了四种分布,现在让我们看一下现实中的数据分布。继续上一讲数据探索之描述性统计中使用的BRFSS数据集,我们查看其中的身高和体重数据,看看他们是不是满足正态分布。

首先导入数据,并编写绘制PDF和CDF图的函数 plot_pdf_cdf,便于重复使用。

# 导入BRFSS数据import brfssdf = brfss.ReadBrfssheight = df.height.dropnaweight = df.weight.dropnadef plot_pdf_cdf(data, xbins, xrange, xlabel): '''绘制概率密度函数PDF和累积分布函数CDF'''
fig = plt.figure(figsize=(16,5)) # 设置画布尺寸
p1 = fig.add_subplot(121) # 添加第一个子图 # 绘制正态分布PDF曲线 std = data.std mean = data.mean x = np.arange(xrange[0], xrange[1], (xrange[1]-xrange[0])/100) y = norm_pdf(x, mean, std) plt.plot(x,y, label='normal distribution') # 绘制数据的直方图 plt.hist(data, bins=xbins, range=xrange, rwidth=0.9, alpha=0.5, normed=True, label='observables') # 图片设置 plt.legend plt.xlabel(xlabel) plt.title(xlabel +' PDF')
p2 = fig.add_subplot(122) #添加第二个子图 # 绘制正态分布CDF曲线 sample = np.random.normal(mean, std, size=10000) plt.hist(sample, cumulative=True, bins=1000, range=xrange, normed=True, histtype='step', lw=2, label='normal distribution') # 绘制数据的CDF曲线 plt.hist(data, cumulative=True, bins=1000, range=xrange, normed=True, histtype='step', lw=2, label='observables') #图片设置 plt.legend(loc='upper left') plt.xlabel(xlabel) plt.title( xlabel + ' CDF') plt.show

人群的身高分布比较符合正态分布。

plot_pdf_cdf(data=height, xbins=21, xrange=(1.2, 2.2), xlabel='height')

但是体重分布明显右偏,与对称的正态分布存在一定的差异。

plot_pdf_cdf(data=weight, xbins=60, xrange=(0,300), xlabel='weight')

将体重数据取对数值后,其分布就与正态分布非常吻合。

log_weight = np.log(weight)plot_pdf_cdf(data=log_weight, xbins=53, xrange=(3,6), xlabel='log weight')

参考资料:

  • 维基百科:蒙特卡罗方法

  • 《Think Stats 2》

  • 《统计学》,William Mendenhall著

End.

作者:鱼心DrFish

链接:http://www.jianshu.com/p/8a0479f55b21

零基础入职数据分析?

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码