scipy.stats.

probplot#

scipy.stats.probplot(x, sparams=(), dist='norm', fit=True, plot=None, rvalue=False)[source]#

为概率图计算分位数并可选择性显示该图。

针对指定理论分布(默认情况下为正态分布)的分位数生成样本数据的概率图。 probplot 还可以选择性为数据计算最佳拟合线,并使用 Matplotlib 或给定的绘图函数绘制结果。

参数:
x类似数组

样本/响应数据, probplot 根据其创建图。

sparams元组,可选

特定于分布的形状参数(形状参数加上位置和比例)。

diststr 或 stats.distributions 实例,可选

分布或分布函数名称。对于常规概率图,默认为“norm”。足够类似 stats.distributions 实例的对象(也即它们有 ppf 方法)也能被接受。

fitbool,可选

如果为 True,则将最小二乘回归(最佳拟合)线拟合到样本数据(默认值)。

plot对象,可选

如果指定,则绘制分位数。如果指定,并且 fit 为 True,则还会绘制最小二乘拟合。plot 是一个必须具备方法“plot”和“text”的对象。可以使用 matplotlib.pyplot 模块或 Matplotlib Axes 对象,或者具有相同方法的自定义对象。默认值为 None,这意味着不创建任何绘图。

rvaluebool,可选

如果提供了 plot,并且 fit 为 True,那么将 rvalue 设置为 True 将在绘图中包含决定系数。默认值为 False。

返回:
(osm, osr)ndarrays 元组

理论分位数(osm 或次序统计量中位数)和有序响应(osr)的元组。osr 只是已排序的输入 x。有关如何计算 osm 的详细信息,请参阅注释部分。

(slope, intercept, r)浮点数元组,可选

如果由 probplot 执行,则包含最小二乘拟合结果的元组。r 是决定系数的平方根。如果 fit=Falseplot=None,则不会返回此元组。

注释

即使给定了 plot,图形也不显示,也不会被 probplot 保存;应该在调用 probplot 后使用 plt.show()plt.savefig('figname.png')

probplot 会生成概率图,不要将其与 Q-Q 图或 P-P 图混淆。Statsmodels 具有更全面的该类功能,请参阅 statsmodels.api.ProbPlot

用于理论分位数(概率图的水平轴)的公式是 Filliben 估计

quantiles = dist.ppf(val), for

        0.5**(1/n),                  for i = n
  val = (i - 0.3175) / (n + 0.365),  for i = 2, ..., n-1
        1 - 0.5**(1/n),              for i = 1

其中 i 指示第 i 个有序值,n 是值的总数。

示例

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> nsample = 100
>>> rng = np.random.default_rng()

具有小自由度的 t 分布

>>> ax1 = plt.subplot(221)
>>> x = stats.t.rvs(3, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt)

具有更大自由度的 t 分布

>>> ax2 = plt.subplot(222)
>>> x = stats.t.rvs(25, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt)

两个正态分布的混合物(使用广播)

>>> ax3 = plt.subplot(223)
>>> x = stats.norm.rvs(loc=[0,5], scale=[1,1.5],
...                    size=(nsample//2,2), random_state=rng).ravel()
>>> res = stats.probplot(x, plot=plt)

标准正态分布

>>> ax4 = plt.subplot(224)
>>> x = stats.norm.rvs(loc=0, scale=1, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt)

使用 distsparams 关键字,生成一个使用对数伽马分布的新图形

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> x = stats.loggamma.rvs(c=2.5, size=500, random_state=rng)
>>> res = stats.probplot(x, dist=stats.loggamma, sparams=(2.5,), plot=ax)
>>> ax.set_title("Probplot for loggamma dist with shape parameter 2.5")

使用 Matplotlib 显示结果

>>> plt.show()
../../_images/scipy-stats-probplot-1_00.png
../../_images/scipy-stats-probplot-1_01.png