繁体   English   中英

matplotlib 中的箱线图:标记和异常值

[英]Boxplots in matplotlib: Markers and outliers

我对 matplotlib 中的箱线有一些疑问:

问题 A。 我在下面用Q1Q2Q3突出显示的标记代表什么? 我相信Q1是最大值, Q3是异常值,但Q2 是什么?

在此处输入图片说明

问题 B matplotlib 如何识别异常值 (即它如何知道它们不是真正的maxmin ?)

一张图片胜过千言万语。 需要注意的是异常值(在+在情节标记)仅仅点的广[(Q1-1.5 IQR), (Q3+1.5 IQR)]低于保证金。

在此处输入图片说明

然而,图片只是一个正态分布数据集的例子。 重要的是要了解 matplotlib 不会首先估计正态分布,而是根据估计的分布参数计算四分位数,如上所示。

相反,中位数和四分位数是直接从数据中计算出来的。 因此,您的箱线图可能看起来有所不同,具体取决于您的数据分布和样本大小,例如,不对称且具有或多或少的异常值。

方框代表第一和第三四分位数,红线代表中位数(第二四分位数)。 文档给出了 1.5 IQR 的默认胡须:

boxplot(x, notch=False, sym='+', vert=True, whis=1.5,
        positions=None, widths=None, patch_artist=False,
        bootstrap=None, usermedians=None, conf_intervals=None)

whis : [默认 1.5 ]

将胡须的长度定义为内部四分位数范围的函数。 它们扩展到 (whis*(75%-25%)) 数据范围内的最极端数据点。

如果您对不同的箱线图表示感到困惑,请尝试阅读wikipedia 中的描述

这是一个图表,它说明了来自stats.stackexchange 答案的框的组件。 请注意,如果您在 Pandas 中不提供whis关键字,则 k=1.5。

箱线图中的带注释的框

Pandas 中的 boxplot 函数是matplotlib.pyplot.boxplot的包装器。 matplotlib 文档详细解释了框的组件:

问题一:

该框从数据的下四分位数值延伸到上四分位数值,在中位数处有一条线。

即四分之一的输入数据值位于框下方,四分之一的数据位于框的每个部分,其余四分之一位于框上方。

问题乙:

whis :浮点数、序列或字符串(默认值 = 1.5)

作为浮点数,确定胡须到达第一和第三四分位数以外的范围。 换句话说,当 IQR 是四分位距 (Q3-Q1) 时,上须将延伸到小于 Q3 + whis*IQR 的最后一个数据。 类似地,下部晶须将延伸到大于 Q1 的第一个数据 - whis*IQR。 在须线之外,数据被视为异常值并绘制为单个点。

Matplotlib(和 Pandas)还为您提供了许多更改胡须默认定义的选项:

将此设置为不合理的高值以强制胡须显示最小值和最大值。 或者,将其设置为百分位的升序序列(例如,[5, 95])以将胡须设置为数据的特定百分位。 最后,whis 可以是字符串 'range' 以将胡须强制为数据的最小值和最大值。

下图显示了箱线图的不同部分。

在此处输入图片说明

分位数 1/Q1:第 25 个百分位数

四分位距 (IQR):第 25 个百分点至第 75 个百分点。

中位数(分位数 2/Q2):第 50 个百分位数。

分位数 3/Q3:第 75 个百分位数。

我应该注意到蓝色部分是箱线图的胡须。

下图将正态分布的箱线图与概率密度函数进行了比较。 它应该有助于解释“最小值”、“最大值”和异常值。

在此处输入图片说明

“最低”:(Q1-1.5 IQR)

“最大值”:(Q3+1.5 IQR)

正如 zelusp 所说,对于正态分布,99.3% 的数据包含在 2.698σ(标准差)内。 下图中的绿色圆圈(异常值)是剩余的 0.7% 的数据。 以下是这些数字如何产生的推导。

除了 seth 答案(因为文档对此不是很精确):Q1(wiskers)被放置在低于 75% + 1.5 IQR 的最大值

(最小值为 25% - 1.5 IQR)

这是计算胡须位置的代码:

        # get high extreme
        iq = q3 - q1
        hi_val = q3 + whis * iq
        wisk_hi = np.compress(d <= hi_val, d)
        if len(wisk_hi) == 0 or np.max(wisk_hi) < q3:
            wisk_hi = q3
        else:
            wisk_hi = max(wisk_hi)

        # get low extreme
        lo_val = q1 - whis * iq
        wisk_lo = np.compress(d >= lo_val, d)
        if len(wisk_lo) == 0 or np.min(wisk_lo) > q1:
            wisk_lo = q1
        else:
            wisk_lo = min(wisk_lo)

以防万一这可以使其他人受益,我需要在我的一个箱线图上放置一个图例,所以我在 Inkscape 中制作了这个小 .png 并认为我会分享它。

编辑:澄清一点,胡须在 1.5 * IQR 间隔内最远的数据点结束。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM