HOWTO · Python

如何在 Python 中制作分位数-分位数图

使用 statsmodels 或 openturns 在 Python 中制作分位数-分位数图,并选择评估分布或比较样本的方法。

本页内容

分位数-分位数(QQ)图将样本分位数与理论分位数或另一个样本的分位数进行比较。使用 statsmodels 可针对选定的分布评估样本,或使用 openturns 比较两个样本。QQ 图是一种视觉诊断工具:它可以揭示形状和尾部行为的差异,但不是决定性的统计检验。下面的示例展示了每种方法如何回答不同的问题:一个样本是否服从某个分布,或者两个样本之间如何比较。

在 Python 中使用 statsmodels 包的分位数-分位数图

当您想将数据集与理论分布(例如正态分布)进行比较时,请使用 statsmodels。使用 pip install statsmodels 安装该包。这个小型的、自包含的 Python 示例仅使用标准库来计算成对的经验正态分位数和理论正态分位数。这些成对值就是 QQ 图放在其轴上的值,因此您可以在绘制图形之前先检查计算过程。

from statistics import NormalDist

sample = [-1.2, -0.4, 0.1, 0.7, 1.5]
ordered = sorted(sample)
normal = NormalDist()

for index, value in enumerate(ordered, start=1):
    probability = (index - 0.5) / len(ordered)
    theoretical = normal.inv_cdf(probability)
    print(f"{theoretical:.3f} {value:.1f}")
-1.282 -1.2
-0.524 -0.4
0.000 0.1
0.524 0.7
1.282 1.5

若要使用 statsmodels 绘制名为 sample_data 的 NumPy 数组,请在导入 matplotlib.pyplot as plt 和 statsmodels.api as sm 之后使用 sm.qqplot(sample_data, line="r"),然后调用 plt.show()。line="r" 选项会添加一条最小二乘回归参考线。靠近该线的值与所选的理论分位数一致;系统性的弯曲或尾部的偏离可能表示存在需要调查的差异。参考线是一种视觉指引,因此在得出分布适合的结论之前,请考虑样本大小和其他诊断。此方法适合在您心中已有目标分布、并希望拟合线帮助评估模式时使用。

使用 statsmodels 绘制的正态分布样本数据 QQ 图

在 Python 中使用 openturns 包的分位数-分位数图

当您想直接比较两个样本时,请选择 openturns。使用 pip install openturns 安装该包。在 OpenTURNS 工作流程中,使用 ot.Normal().getSample(1000) 和 ot.Uniform().getSample(1000) 创建样本,将它们传递给 ot.VisualTest.DrawQQplot(normal_sample, uniform_sample),然后使用 openturns.viewer 中的 View(qq_graph).show() 显示图形。此 API 概要以内联方式显示,是因为已配置的文章运行环境未安装 OpenTURNS;它不是已执行的示例,而且显示图形还需要图形查看器。

在双样本 QQ 图中,每个点将样本中对应的分位数配对。接近线性的模式表示分位数结构相似,而弯曲或两端的偏离显示了样本的不同之处。这种 OpenTURNS 方法不提供与 statsmodels 示例相同的参考线控制。将其用于样本与样本之间的直接比较;当您需要将数据与指定的理论分布进行比较并选择参考线时,请使用 statsmodels。

使用 openturns 比较正态样本与均匀样本的 QQ 图

有关另一个 Python 绘图选项,请参阅在 Python 中使用 Gnuplot。