【问题标题】:Quantile-Quantile Plot using Seaborn and SciPy使用 Seaborn 和 SciPy 绘制分位数-分位数图
【发布时间】:2018-04-06 17:06:22
【问题描述】:

谁能给我一个方法在 Seaborn 中做一个qq plot 来测试数据的正态性?或者失败了,至少在 matplotlib 中。

提前致谢

【问题讨论】:

标签: python-3.x matplotlib scipy seaborn normal-distribution


【解决方案1】:

阅读维基百科文章后,我了解到 QQ 图是两个分布的分位数相互对比的图。

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

【讨论】:

【解决方案2】:

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

此示例显示了针对正态分布绘制的瑞利分布,导致曲线略微凹入:

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

【讨论】:

    【解决方案3】:

    我不确定这是否仍然是最近的,但我注意到两个答案都没有真正解决这个问题,它询问如何使用 scipy 和 seaborn 进行 qq-plots,但没有提到 statsmodels。其实 qq-plots 在 scipy 中可以用 probplot 这个名字:

    from scipy import stats
    import seaborn as sns
    stats.probplot(x, plot=sns.mpl.pyplot)
    

    probplot 的 plot 参数可以是任何具有 plot 方法和 text 方法的东西。 Probplot 在其支持的理论分布类型方面也非常灵活。

    【讨论】:

    • 如文档中所述,这会生成一个不是 qq 图的“概率图”
    【解决方案4】:

    seaborn-qqplot addon documentation 显示了一个示例。 Also see.

    使用 pycharm 和 windows 10 我在安装库时遇到了困难:

    pip install seaborn-qqplot
    

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

    from seaborn_qqplot import pplot
    

    未被识别。

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

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2013-08-21
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2017-04-25
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多