您将如何使用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实现的最干净的方法是什么。
Answers:
我想那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()
结果:
文档和更多示例在这里
scipy
来statsmodels
statsmodels
将是一个不错的选择。
如果需要对一个样本与另一个样本进行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)
为了增加对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图。
简而言之,Rqqnorm
提供scipy.stats.probplot
了与默认设置相同的功能dist=norm
。但是,他们称其qqnorm
为“正常QQ图”的事实可能会使用户感到困惑。
最后,请注意。这些图不能代替适当的统计检验,仅应用于说明目的。
你可以使用散景
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)
您的样本量是多少?这是使用OpenTURNS库针对任何分布测试数据的另一种选择。在下面的示例中,我从均匀分布中生成了一个1.000.000数字的样本x,并针对正态分布对其进行了测试。如果将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()
probplot
吗?docs.scipy.org/doc/scipy/reference/generation/…–