你将如何使用 Python 创建一个 qq 图?
假设您有大量测量值,并且正在使用一些将 XY 值作为输入的绘图函数。该函数应根据某些分布(正态、均匀...)的相应分位数绘制测量的分位数。
由此产生的图让我们可以评估我们的测量是否遵循假设的分布。
http://en.wikipedia.org/wiki/Quantile-quantile_plot
R 和 Matlab 都为此提供了现成的函数,但我想知道在 Python 中实现的最简洁的方法是什么。
你将如何使用 Python 创建一个 qq 图?
假设您有大量测量值,并且正在使用一些将 XY 值作为输入的绘图函数。该函数应根据某些分布(正态、均匀...)的相应分位数绘制测量的分位数。
由此产生的图让我们可以评估我们的测量是否遵循假设的分布。
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
ofstatsmodels.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()
结果:
文档和更多示例在这里
如果您需要绘制一个样本与另一个样本的 QQ 图,statsmodels 包括 qqplot_2samples()。就像上面评论中的 Ricky Robinson 一样,这就是我认为的 QQ 图与概率图的对比,概率图是针对理论分布的样本。
我想出了这个。也许你可以改进它。特别是生成分布分位数的方法对我来说似乎很麻烦。
您可以替换np.random.normal
为任何其他分布,np.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)
它现在存在于 statsmodels 包中:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
你可以使用散景
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)
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()
这里 probplot 绘制图形测量值与 dist="norm" 中的正态分布
为了增加 Python 和 R 世界中 QQ 图和概率图的混淆,SciPy 手册是这样说的:
“
probplot
生成一个概率图,不应与 QQ 或 PP 图混淆。Statsmodels 具有这种类型的更广泛的功能,请参阅 statsmodels.api.ProbPlot。”
如果您尝试一下scipy.stats.probplot
,您会发现它确实将数据集与理论分布进行了比较。QQ 图,OTOH,比较两个数据集(样本)。
R 有函数qqnorm
,qqplot
和qqline
。从 R 帮助(版本 3.6.3):
qqnorm
是一个通用函数,其默认方法生成 y 中值的正常 QQ 图。qqline
将一条线添加到“理论”,默认情况下是正常的分位数 - 分位数图,该图通过概率分位数,默认情况下是第一和第三四分位数。
qqplot
生成两个数据集的 QQ 图。
简而言之,R提供了与默认设置qqnorm
相同的功能。但他们称它为“生成正常的 QQ 情节”这一事实可能很容易让用户感到困惑。scipy.stats.probplot
dist=norm
qqnorm
最后,一句警告。这些图不能代替适当的统计测试,仅用于说明目的。
你的样品有多大?这是使用OpenTURNS 库针对任何发行版测试数据的另一种选择。在下面的示例中,我从均匀分布中生成了一个包含 1.000.000 个数字的样本 x,并针对正态分布对其进行了测试。如果您将其重塑为,您可以用您的数据替换 xx= [[x1], [x2], .., [xn]]
import openturns as ot
x = ot.Uniform().getSample(1000000)
g = ot.VisualTest.DrawQQplot(x, ot.Normal())
g
如果您正在编写脚本,则可以做得更正确
from openturns.viewer import View`
import matplotlib.pyplot as plt
View(g)
plt.show()