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

时间:2013-07-18 14:12:52

标签: python matplotlib statistics boxplot

我在matplotlib中有一些关于boxplots的问题:

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

enter image description here

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

6 个答案:

答案 0 :(得分:82)

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

enter image description here

然而,图片仅是正态分布数据集的示例。重要的是要理解matplotlib首先估计正态分布,并根据估计的分布参数计算四分位数,如上所示。

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

答案 1 :(得分:23)

该框表示第一个和第三个四分位数,红色线表示中位数(第二个四分位数)。 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]

     

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

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

答案 2 :(得分:13)

除了回答(因为文档对此不太精确): 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)

答案 3 :(得分:6)

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

enter image description here

第1季度/第1季度:第25个百分点

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

中位数(第2季度/第2季度):第50个百分点。

第3季度/第3季度:第75个百分点。

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

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

enter image description here

“最小”:(Q1-1.5 IQR)

“最大值” :(第3季度+1.5 IQR)

正如zelusp所说,正态分布的29.3698(标准偏差)内包含99.3%的数据。下图中的绿色圆圈(异常值)是数据的剩余0.7%。 Here是这些数字的来源。

答案 4 :(得分:4)

为了防止其他人受益,我需要在我的一个箱形图上添加一个图例,所以我在Inkscape中制作了这个小.png,并且认为我会分享它。

enter image description here

答案 5 :(得分:1)

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

enter image description here

Pandas中的boxplot函数是matplotlib.pyplot.boxplot的包装。 matplotlib docs详细说明了框的组成部分:

问题A:

  

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

i。 e。输入数据值的四分之一在该框下方,四分之一在该框上方。

问题B:

  

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

     

作为浮子,确定晶须的触及范围超出   第一和第三四分位数。换句话说,IQR是   四分位间距(Q3-Q1),上晶须将延伸到最后   数据小于Q3 + whis * IQR)。同样,下晶须会   延伸到大于Q1的第一个基准-whis * IQR。超过   晶须,数据被认为是异常值,并作为单个数据进行绘制   点。

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

  

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