Matplotlib中的Tukey Boxplots - 代码中的异常值逻辑?

时间:2016-05-30 09:20:13

标签: python matplotlib boxplot iqr tukey

在阅读a related question in StackOverflow的答案时,我看到了matplotlib to compute the wiskers positions and detect outliers中使用的代码:

    # 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)

现在,else部分非常有意义 - 根据Tukey boxplots的规范,我们发现上四分位数在1.5 IQR内的最高数据。实际上,这是max(wish_hi) - Q3+1.5*IQR以下的最大数据条目。

然而,or部分......我不明白。 if len(wisk_hi) == 0转换为...

if we find no elements below the `hi_val` ...

这种情况如何适用?通过在中位数上分割数据,然后取上半部分的中位数,然后在其上加上1.5 * IQR 来找到Q3 - 怎么可能没有数据更低超过这个值?

如果这是关于一个空数据集,那么or的第二部分也没有意义(因为没有数据,Q3或IQR没有意义)。

可能遗漏了一些明显的东西 - 帮助?

2 个答案:

答案 0 :(得分:1)

四分位数范围可能存在偏差。 &#34;上部相邻值可以小于Q3,这迫使晶须从Q3进入盒子。较低的相邻值也可以大于Q1,这迫使晶须从Q1拉入盒子中。&#34; (source

IQR = Q3 - Q1

下限:Q1 - 1.5(Q3 - Q1)

上限:Q3 + 1.5(Q3 - Q1)

查看链接中的数据。

答案 1 :(得分:0)

下面的示例输出(实际上是从matplotlib测试数据驱动)显示了问题:

$ ipython2
Python 2.7.11 (default, Mar 31 2016, 06:18:34) 
IPython 4.2.0 -- An enhanced Interactive Python.

In [1]: import numpy as np

In [2]: import matplotlib

In [3]: a=[3, 9000, 150, 88, 350, 200000, 1400, 960]

In [4]: sa=list(sorted(a))

In [5]: sa
Out[5]: [3, 88, 150, 350, 960, 1400, 9000, 200000]

In [6]: globals().update(matplotlib.cbook.boxplot_stats(a)[0])

In [7]: q3
Out[7]: 3300.0

In [8]: iqr
Out[8]: 3165.5

In [9]: q3+1.5*iqr
Out[9]: 8048.25

...所以小于q3+1.5*iqr的最大元素是...... 1400!

如果代码不包含该测试,则上部晶须必须从q3(3300)向下降至1400.