【发布时间】:2018-04-06 17:06:22
【问题描述】:
谁能给我一个方法在 Seaborn 中做一个qq plot 来测试数据的正态性?或者失败了,至少在 matplotlib 中。
提前致谢
【问题讨论】:
标签: python-3.x matplotlib scipy seaborn normal-distribution
谁能给我一个方法在 Seaborn 中做一个qq plot 来测试数据的正态性?或者失败了,至少在 matplotlib 中。
提前致谢
【问题讨论】:
标签: python-3.x matplotlib scipy seaborn normal-distribution
阅读维基百科文章后,我了解到 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()
【讨论】:
使用与上面相同的数据,这个例子显示了一个正态分布与正态分布的对比,得到了相当直线:
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()
【讨论】:
我不确定这是否仍然是最近的,但我注意到两个答案都没有真正解决这个问题,它询问如何使用 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 在其支持的理论分布类型方面也非常灵活。
【讨论】:
seaborn-qqplot addon documentation 显示了一个示例。 Also see.
使用 pycharm 和 windows 10 我在安装库时遇到了困难:
pip install seaborn-qqplot
在我的虚拟环境中。导入行:
from seaborn_qqplot import pplot
未被识别。
使用(PyCharm 的命令):文件 -> 设置 -> 项目 -> Python 解释器 -> +(安装)我可以从 seaborn_qqplot 导入 pplot 并可以创建一个分位数 - 分位数图。
【讨论】: