使用SciPy的分位数 - 分位数图

Joh*_*ohn 73 python statistics scipy

你会如何使用Python创建一个qq-plot?

假设您有大量测量并且正在使用一些以XY值作为输入的绘图功能.该函数应绘制测量的分位数与某些分布的相应分位数(正态,均匀......).

得到的图表让我们在测量中评估是否遵循假定的分布.

http://en.wikipedia.org/wiki/Quantile-quantile_plot

R和Matlab都为此提供了现成的函数,但我想知道在Python中实现最干净的方法是什么.

Geo*_*off 91

我想这scipy.stats.probplot会做你想要的.有关详细信息,请参阅文档.

import numpy as np 
import pylab 
import scipy.stats as stats

measurements = np.random.normal(loc = 20, scale = 5, size=100)   
stats.probplot(measurements, dist="norm", plot=pylab)
pylab.show()
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

  • 好的,但这是一个概率图(样本与理论分布).qq图比较两个样本.http://www.itl.nist.gov/div898/handbook/eda/section3/qqplot.htm http://www.itl.nist.gov/div898/handbook/eda/section3/probplot.htm (17认同)
  • @RickyRobinson似乎许多来源(包括维基百科)与NIST手册相矛盾.几乎任何其他来源都指出QQ图在水平轴上具有理论分位数,并且数据垂直分布.在任何情况下,区别都是学术性的:绘制样本与使用经验分布函数基本相同.无论哪种方式,你都在绘制一个dsitribution的分位数与另一个. (5认同)

Aka*_*all 36

使用qqplotstatsmodels.api是另一种选择:

非常基本的例子:

import numpy as np
import statsmodels.api as sm
import pylab

test = np.random.normal(0,1, 1000)

sm.qqplot(test, line='45')
pylab.show()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

文档和更多示例在这里

  • 只是一个注释。您的示例绘制了标准正态分布的线。要获得像@Geoff 示例中那样的标准化线(按给定样本的标准偏差缩放并添加平均值),您需要设置 line='s' 而不是 line='45' (7认同)
  • @tommy.carstensen 它被故意从“scipy”分离到“statsmodels” (2认同)

小智 17

如果你需要做一个样本与另一个样本的QQ图,statsmodels包括qqplot_2samples().和Ricky Robinson在上面的评论中一样,这就是我认为的QQ情节与概率图,这是一个反对理论分布的样本.

http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html

  • 这个qqplot实现似乎不能处理不同大小的样本,这很有趣,因为QQ图的一大优点是可以比较不同大小的样本... (9认同)

Joh*_*ohn 6

我想出了这个。也许你可以改进它。特别是生成分布的分位数的方法对我来说似乎很麻烦。

您可以np.random.normal用任何其他分布替换fromnp.random以将数据与其他分布进行比较。

#!/bin/python

import numpy as np

measurements = np.random.normal(loc = 20, scale = 5, size=100000)

def qq_plot(data, sample_size):
    qq = np.ones([sample_size, 2])
    np.random.shuffle(data)
    qq[:, 0] = np.sort(data[0:sample_size])
    qq[:, 1] = np.sort(np.random.normal(size = sample_size))
    return qq

print qq_plot(measurements, 1000)
Run Code Online (Sandbox Code Playgroud)