利用Python实现并解释概率图形

爱情        2019-10-05   来源:寻史问迹

在使用线性回归时,你可能已经遇到过一种概率图形-QQ图quantile-quantile)。在拟合模型之后我们应该检查回归的残差是否遵循正态分布。并且可以通过使用如下所示的QQ图来进行视觉验证。

利用Python实现并解释概率图形

QQ图示例

概率函数曲线的一些定义

为了充分理解概率图的概念,我们可以快速浏览概率论中的一些定义:

  • 概率密度函数(PDF),它允许我们计算在属于样本空间的任何区间中找到随机变量的概率。重要的是要记住连续随机变量取精确值的概率等于0。
利用Python实现并解释概率图形

高斯分布的PDF

  • 累计分布函数(CDF),它计算随机变量取值等于或小于给定值x的概率。当我们处理连续变量时,CDF在PDF下的区域,在负无穷大到x的范围内。
利用Python实现并解释概率图形

CDF的通式,X - 随机变量,x - 评价点

  • 分位数Quantile :将概率分布范围划分为具有相同概率的连续区间的切点。

下图显示了从标准正态分布以及PDF和CDF中提取的随机变量的分布。

利用Python实现并解释概率图形

在本文中,我将用其他两个情况进行比较:

  • 正态分布,均值为1,标准差为2.5 - N(1,2.5)
  • 倾斜正态分布与alpha = 5

我以倾斜正态分布,通过调整alpha参数(同时将比例和位置保留为默认值)来控制分布的偏度。随着alpha的绝对值增加,偏斜的绝对值也增加。下面我们可以通过查看从它们中提取的随机变量的直方图来检查分布的差异。

利用Python实现并解释概率图形

概率图形

我们使用概率图形来直观地比较来自不同数据集的数据。可能涉及的比较有:

  • 两个经验集
  • 一个经验和一个理论集
  • 两个理论集

当我们将观察到的数据与来自特定理论分布的数据进行比较时,概率图的最常见用途是中间的那个。我会用此变体来解释下面的特定类型的图,但是,它也可以应用于其他两种情况。

PP图

简而言之,PP图(probability–probability)是一种可视化,它将两种分布(经验和理论)的CDF相互绘制。

利用Python实现并解释概率图形

从N(0,1)到标准正常的完全匹配的随机数比较的PP图示例

关于PP图的一些关键信息:

  • 在图上的点:假设我们有两个分布(f和g)和定值的一个点z,在图上点指明了数据的百分比在f和g内位于或低于z。
  • 为了比较分布,我们检查点是否位于45度线(x = y)上。如果它们偏离,则分布不同。
  • PP图非常适合比较高概率密度区域,因为在这些区域中,经验和理论CDF的变化比低概率密度区域更快。
  • PP图需要完全指定的分布,因此如果我们使用高斯作为理论分布,我们应该指定位置和比例参数。
  • 更改位置或比例参数不一定保持PP图中的线性。
  • PP图可用于直观地评估分布的偏度。
  • 当分布不重叠时,该图可能导致奇怪的模式。因此,在比较具有附近或相同位置的概率分布时,PP图非常有用。下面我给出一个PP图,比较从N(1,2.5)和N(5,1 )比较的随机变量。
利用Python实现并解释概率图形

从N(1,2.5)对N(5,1)比较得出的随机变量

QQ图

与PP图类似,QQ图(quantile-quantile)允许我们通过将它们的分位数相互比较来比较分布。

关于QQ图的一些关键信息:

  • 图上的点:图表上的一个点对应于来自两个分布的某个分位数。
  • 在QQ图上,参考线取决于理论分布的位置和比例参数。截距和斜率分别等于位置和比例参数。
  • 点的线性模式表明给定的分布合理地描述了经验数据分布。
  • QQ图在分布的尾部获得非常好的分辨率但在中心部位很差。
  • QQ图不需要指定理论分布的位置和比例参数,因为理论分位数是根据指定的标准分布计算的。
  • 点模式的线性度不受更改位置或比例参数的影响。
  • QQ图可用于直观地评估两个分布的位置,比例和偏度的相似性。

Python中的示例

我使用statsmodels库来创建ProbPlot类的概率图。

PP图

当我开始使用statsmodels创建一些PP图时,我注意到了一个问题 :因为我将N(1,2.5)中的随机抽取与标准法线进行比较,图表是完美契合的,但他们却不应该这样。我尝试调查此问题并在StackOverflow上发现了一篇文章,该文章解释了为什么即使我们提供了一些值,但当前实现总是试图估计理论分布的位置和比例参数。所以在上面的例子中,经验数据是来自正态分布,而不是我们指定的。

这就是为什么我编写了一个函数,用于将经验数据与提供参数的理论分布直接比较。

让我们首先尝试使用statsmodels和pp图比较,从N(1,2.5)到N(0,1)的随机抽取。我们看到,在statsmodels的情况下,它是完美的拟合,因为函数估计了正态分布的位置和比例参数。当检查pp图的结果时,我们看到分布显着不同,这也可以在直方图上观察到。

利用Python实现并解释概率图形

N(1,2.5)与标准正态的PP图

我们也尝试解释PP图的形状。为此,我将再次显示图表以及直方图。沿x轴的水平移动是由于分布不完全重叠的事实引起的。当该点高于参考线时,意味着理论分布的CDF值高于经验值的CDF值。

利用Python实现并解释概率图形

下一个案例是将偏斜正态的随机抽取与标准正态值进行比较。我们看到来自statsmodels的图表意味着它不是一个完美的匹配,因为它很难找到正态分布的位置和比例参数,这些参数解释了所提供数据的偏度。该图还显示标准正常的CDF值始终高于所考虑的偏差正态分布的值。

利用Python实现并解释概率图形

偏斜正态(alpha = 5)与标准正常的PP图

注意:我们也可以使用statsmodels获得完美契合。为此,我们需要将ProbPlot中的理论分布指定为skewnorm,并传递一个额外的参数distargs =(5,)来指示alpha的值。

QQ图

让我们首先将偏斜正态分布与标准正态分布(使用ProbPlot的默认设置)进行比较。

利用Python实现并解释概率图形

偏斜正态(alpha = 5)与标准正态的QQ图

可以观察到的第一件事是点形成曲线而不是直线,这通常表示样本数据中的偏度。解释图的另一种方法是查看分布的尾部。在这种情况下,所考虑的偏斜正态分布具有较轻的左尾和较重的右尾而不是一个可以预期标准正态分布。我们需要记住偏移的分布是变动的,因此这些结果符合我们的预期。

我还想快速浏览同一练习的两个其他变体。在第一个中,我将理论分布指定为斜正态,并在distargs中传递alpha = 5 。这导致下面的图,我们在其上看到线性图案。然而,线条图案基本上是45度线,表明良好的拟合。

利用Python实现并解释概率图形

偏斜正态(alpha = 5)与标准正态(alpha = 5)的QQ图

第二种方法是比较两个经验样本: 一个来自偏斜正态(alpha = 5),第二个来自标准正态。我设置fit = False以关闭位置,比例和distrargs的自动拟合。

结果似乎与初始方法一致。

利用Python实现并解释概率图形

使用股票回报的示例

我还想展示一个使用QQ图来评估微软股票价格是否遵循正态分布的实际例子。结论是尾部的质量肯定更多,而不是正常情况下的假设。

利用Python实现并解释概率图形

MSFT与Norma Distribution的回报

进一步的实施细节

在qq图的方法中,我们可以指定希望能生成什么样的参考线,种类有:

  • s - 标准化线(预期订单统计数据按给定样本的标准偏差进行缩放,并将平均值添加到它们中)
  • q - 线穿过四分位数
  • r - 回归线
  • 45 - y = x行(如PP图中使用的那一行)

下面我展示了三种方法的比较,我们可以看到它们非常相似。

利用Python实现并解释概率图形

在处理QQ图时,我们还可以使用statsmodel的另一个特征,它采用非超出概率代替理论分位数。

利用Python实现并解释概率图形