1

在阅读StackOverflow 中相关问题的答案时,我看到了 matplotlib中用于计算 wiskers 位置和检测异常值的代码:

    # 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` ...

这个条件如何适用?Q3 是通过在中位数上拆分数据,然后取上半部分的中位数,然后在其上加上 1.5*IQR 找到- 怎么可能没有低于这个值的数据?

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

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

4

2 回答 2

1

四分位距可能有偏差。“上相邻值可以小于 Q3,这会迫使晶须从 Q3 拉入盒子。下相邻值也可以大于 Q1,这会迫使晶须从 Q1 拉入盒子。” (来源

IQR = Q3 - Q1

下限:Q1 - 1.5 (Q3 - Q1)

上限:Q3 + 1.5 (Q3 - Q1)

查看链接中的数据。

于 2016-05-30T10:21:23.713 回答
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。

于 2016-06-04T14:03:48.930 回答