转自:微点阅读   https://www.weidianyuedu.com

本文用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 pdfmu = 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()

身高、体重的分布

以上从计算机模拟的角度出发,介绍了四种分布,现在让我们看一下现实中的数据分布。我们查看身高和体重数据,看看他们是不是满足正态分布。

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

# 导入BRFSS数据import brfssdf = brfss.ReadBrfss()height = df.height.dropna()weight = df.weight.dropna()
def 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")

                                                                     End

如何用Python+统计学,进行数据分析相关推荐

  1. python大数据分析实例-如何用Python分析大数据(以Twitter数据挖掘为例)

    原标题:如何用Python分析大数据(以Twitter数据挖掘为例) 来源:艾翻译(http://www.itran.cc/) 原文标题:Twitter Data Mining: A Guide to ...

  2. 如何自学python数据分析-Python学习干货 |如何用Python进行数据分析?

    为什么选择Python进行数据分析? Python是一门动态的.面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言.Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读 ...

  3. 动态数据交换 python_如何用 Python 和 Streamlit 做交互式数据分析产品?

    「本文参与少数派 2019 年度征文 + 效率有心得」 不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. 痛点 从我开始折腾数据 ...

  4. Python学习干货,如何用Python进行数据分析?

    1.为什么选择Python进行数据分析? Python是一门动态的.面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言.Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是 ...

  5. 如何用Python进行数据分析,需要掌握哪些技术?

    前言 1.要用Python做数据分析,一共分几步? Python是一门动态的.面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言.Python入门简单,代码可读性强,一段好的Python代码,阅 ...

  6. python交互界面数据分析_如何用 Python 和 Streamlit 做交互式数据分析产品?

    「本文参与少数派 2019 年度征文 + 效率有心得」 不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. 痛点 从我开始折腾数据 ...

  7. 如何用Python进行数据分析?

    本文为CDA数据分析研究院原创作品,转载需授权 1.为什么选择Python进行数据分析? Python是一门动态的.面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言.Python入门简单,代码 ...

  8. python数据分析——如何用python连接远程数据库

    本文将以SQLite.MySQL,PostgreSQL为例讲解python怎样连接远程数据库并执行相关数据库操作. SQLite SQLite可能是与Python连接的最方便的数据库,因为我们不需要安 ...

  9. 如何用python做数据分析

    最近,Analysis with Programming加入了Planet Python.我这里来分享一下如何通过Python来开始数据分析.具体内容如下: 数据导入 导入本地的或者web端的CSV文 ...

最新文章

  1. iOS11和机器学习CoreML库
  2. debian6之eclipse和jdk安装
  3. Lync Server 2013与OWA的集成
  4. C语言再学习 -- 再论数组和指针
  5. 一个想法不一定对 系列
  6. 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
  7. viito为什么不去新说唱_为什么问责制的说唱不好
  8. APICloud开发者进阶之路 |纯手工编写日程表功能
  9. 在线文件(Word、Excel、PPT、PDF)预览
  10. redis安装部署(1)
  11. sql2012官网下载地址
  12. 老男孩 linux 2014 360下载,360安全卫士2014旧版
  13. python控制微信app_Appium+python在微信的hybridapp里的坑
  14. 饿了么推荐系统:从0到1
  15. iOS 警告 Local declaration of 'XXX' hides instance
  16. 手动制作Linux,手动制作linux
  17. ERR! configure error gyp ERR! stack Error: Can't find Python executable python
  18. 解决sudo rosdep init 报错的问题
  19. matlab中dare 和care,dare 的用法
  20. 开源点云数据处理 开源_云供应商现在正在推动开源

热门文章

  1. linux命令教程第六期
  2. java全栈系列之JavaSE-面向对象(static关键字)040
  3. linux挂载硬盘下载电影,Windows上通过迅雷基于Samba往Pi3B上mount的移动硬盘下载电影...
  4. 常见的js加密/js解密方法
  5. Linux/macOS 命令符列表
  6. shell实现除法计算器
  7. java中gettext()_java getText()
  8. 分布式是大数据处理的万能药?
  9. 夜雨寄北 文/江湖一劍客
  10. Python 语言中有关复数的几个概念