使用SciPy的分位数分位数图

你将如何使用Python创build一个qq图?

假设您有一大组测量值并正在使用一些以XY值作为input的绘图函数。 这个函数应该把测量的分位数与相应的分布(正常的,统一的)的分位数进行比较。

由此产生的情节让我们接着评估我们的测量是否遵循假定的分布。

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

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

我认为, 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() 

结果

在这里输入图像说明

使用qqplotstatsmodels.api是另一种select:

非常基本的例子:

 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() 

结果:

在这里输入图像说明

文档和更多的例子在这里

如果你需要做一个样本与另一个样本的QQ图,statsmodels包含qqplot_2samples()。 像上面评论中的Ricky Robinson一样,我认为这是一个QQ图,而概率图是一个与理论分布相对的样本。

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

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

你可以用np.random.normal中的任何其他分布replacenp.random.normal来比较其他分布的数据。

 #!/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) 

你可以使用散景

 from bokeh.plotting import figure, show from scipy.stats import probplot # pd_series is the series you want to plot series1 = probplot(pd_series, dist="norm") p1 = figure(title="Normal QQ-Plot", background_fill_color="#E8DDCB") p1.scatter(series1[0][0],series1[0][1], fill_color="red") show(p1)