【问题标题】:Boxplots in matplotlib: Markers and outliersmatplotlib 中的箱线图:标记和异常值
【发布时间】:2013-07-17 13:10:36
【问题描述】:

我对 matplotlib 中的 boxplots 有一些疑问:

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

                      

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

【问题讨论】:

    标签: python matplotlib statistics boxplot


    【解决方案1】:

    方框代表第一个和第三个四分位数,红线代表中位数(第二个四分位数)。 documentation 给出 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%)) 数据范围内的最极端数据点。

    如果您对不同的箱线图表示感到困惑,请尝试阅读 the description in wikipedia

    【讨论】:

      【解决方案2】:

      除了设置答案(因为文档对此不是很精确): Q1(胡须)位于最大值低于 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)
      

      【讨论】:

      • 感谢您澄清这一点 - 我发现我的图表中存在差异(与 Q3+1.5*IQR 的文档值相比),很高兴看到您的澄清。 TBH 虽然,我对 or 表达式有点困惑:else 部分是有道理的,但 or 似乎是不可能的......例如对于 Q3 部分,len(wisk_hi)==0 的意思是“如果我们在hi_val 下找不到任何元素”——这怎么会发生? Q3 是通过将数据拆分为中位数,并取上半部分的中位数...根据定义,会有低于 hi_val 的值 - or 的第二部分是什么意思?欢迎任何建议。
      • 我只能同意你的观点,@ttsiodras,q3 应该是 d 数组的一部分并满足 np.compress 的条件,所以它也应该在数组中的最大值取自。也许代码只是“被保存”,或者让读者更清楚wist_hi不能小于q3
      【解决方案3】:

      一张图片胜过一千个字。请注意,异常值(图中的 + 标记)只是下面宽 [(Q1-1.5 IQR), (Q3+1.5 IQR)] 边距的 outside 点。

         

      但是,图片只是正态分布数据集的示例。重要的是要了解 matplotlib 确实首先估计正态分布并根据估计的分布参数计算四分位数,如上所示。

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

      【讨论】:

      • 所以99.3% 的数据包含在上面的宽[(Q1-1.5 IQR), (Q3+1.5 IQR)] 边距(也称为胡须)的内部。因此,除此之外的所有刻度仅代表您数据的0.7%
      • 根据@Joooeey 的回答和我对 matplotlib.boxplot 的理解,我认为这个答案并不完全正确(或者至少不能完全回答原始问题)。晶须不覆盖 [(Q1-1.5 IQR), (Q3+1.5 IQR)],它们位于此范围内但在 [Q1,Q2] 之外的最外层数据点 - 否则晶须将始终是对称的,它们不是。
      • 不确定我是否关注@DavidWaterworth。 [(Q1-1.5 IQR), (Q3+1.5 IQR)] 不需要与 0 对称。
      • 不,不管 k matplotlib 不会在 [Q1 -k IQR, Q3 + kIQR] 处绘制胡须条,“上面的胡须将延伸到最后一个数据小于 Q3 + kIQR)”和“下须将延伸到大于 Q1 - kIQR 的第一个数据”(文档使用 whis 代替 k)。请参阅“whis”下的matplotlib.org/3.1.1/api/_as_gen/…
      • 现在知道了。谢谢@DavidWaterworth
      【解决方案4】:

      以防万一这对其他人有好处,我需要在我的一个箱形图上放一个图例,所以我在 Inkscape 中制作了这个小 .png 并认为我会分享它。

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

      【讨论】:

        【解决方案5】:

        这是一个说明来自stats.stackexchange answer 的盒子组件的图形。请注意,如果您未在 Pandas 中提供 whis 关键字,则 k=1.5。

        Pandas 中的 boxplot 函数是 matplotlib.pyplot.boxplot 的包装器。 matplotlib docs详细解释了盒子的组成部分:

        问题 A:

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

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

        问题 B:

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

        作为一个浮点数,确定胡须的范围 第一和第三四分位数。换句话说,其中 IQR 是 四分位距(Q3-Q1),上面的晶须会延伸到最后 数据小于 Q3 + whis*IQR)。同样,较低的晶须将 扩展到大于 Q1 的第一个数据 - whis*IQR。超过 晶须,数据被认为是异常值,并被绘制为个体 点。

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

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

        【讨论】:

        • 我喜欢这个答案,因为它特定于 matplotlib,尤其是胡须范围。
        【解决方案6】:

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

        分位数 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% 的数据。 Here 是这些数字是如何产生的推导。

        【讨论】:

        猜你喜欢
        • 2021-11-06
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 2013-02-17
        • 2017-03-21
        • 1970-01-01
        相关资源
        最近更新 更多