使用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()
结果
使用qqplot
的statsmodels.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图,而概率图是一个与理论分布相对的样本。
它现在存在于statsmodels包中:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.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)