使用Seaborn和SciPy绘制分位数-分位数图

10

有没有人可以告诉我如何在Seaborn中进行qq图,作为测试数据正态性的方法?如果不行,至少在matplotlib中能不能做到。

先谢谢了。


2
请查看http://www.statsmodels.org/dev/generated/statsmodels.graphics.gofplots.qqplot.html。 - Warren Weckesser
4个回答

21
阅读维基百科文章后,我了解到Q-Q图是两个分布的分位数相互对比的图形。 numpy.percentile可用于获取分布的百分位数。因此,您可以在每个分布上调用numpy.percentile并将结果绘制到一起。
import numpy as np
import matplotlib.pyplot as plt

a = np.random.normal(5,5,250)
b = np.random.rayleigh(5,250)

percs = np.linspace(0,100,21)
qn_a = np.percentile(a, percs)
qn_b = np.percentile(b, percs)

plt.plot(qn_a,qn_b, ls="", marker="o")

x = np.linspace(np.min((qn_a.min(),qn_b.min())), np.max((qn_a.max(),qn_b.max())))
plt.plot(x,x, color="k", ls="--")

plt.show()

输入图像描述


1
请注意,上述方法从正态分布中进行抽样,因此绘图是一种近似方法,而通常使用理论量来制作QQ图。请参见https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html。 - Simon
事实上,@Harvs 还明确询问了一种与理论分布进行比较的方法。 - Ingo

12

尝试使用statsmodels.api.qqplot()

使用与上面相同的数据,此示例显示了绘制在正态分布上的正态分布,结果是相当直的线:

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

a = np.random.normal(5, 5, 250)
sm.qqplot(a)
plt.show()

qq normal

该示例展示了一张瑞利分布与正态分布对比绘制的图表,呈现出略微凹陷的曲线:

a = np.random.rayleigh(5, 250)
sm.qqplot(a)
plt.show()

qq rayleigh


8

我不确定这是否仍然是最新的,但我注意到两个答案都没有真正回答这个问题,它询问如何使用scipy和seaborn进行qq图,但没有提到statsmodels。实际上,scipy中可以使用probplot函数来制作qq图:

from scipy import stats
import seaborn as sns
stats.probplot(x, plot=sns.mpl.pyplot)
probplot的plot参数可以是任何具有plot方法和text方法的对象。probplot对支持的理论分布类型也非常灵活。

3
根据文档所述,这将生成一个“概率图”,它不是QQ图。 - ScarletPumpernickel
1
stats.probplot(x, dist='norm', plot=plt) - gregV
确实,@gregV,但dist='norm'是默认设置。因此这更加简洁一些。指定plot=sns.mpl.pyplot是因为@Harvs要求使用seaborn来获取这些图形。 - Ingo

0
seaborn-qqplot addon documentation中展示了一个例子。还可以参考其他资料
在使用pycharm和windows 10时,我在安装库时遇到了困难:
pip install seaborn-qqplot

在我的虚拟环境中。导入代码行:

from seaborn_qqplot import pplot

未被识别。

通过(PyCharm的命令):文件 -> 设置 -> 项目 -> Python解释器 -> +(安装),我可以从seaborn_qqplot中导入pplot,并创建一个分位数-分位数图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接