在阅读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没有意义)。
可能遗漏了一些明显的东西 - 帮助?
答案 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.