1

StackOverflow で関連する質問への回答を読んでいるときに、matplotlibでウィスカーの位置を計算し、外れ値を検出するために使用されるコードを見ました。

    # 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 を追加することによって検出されます。この値よりも低いデータが存在しないのはなぜですか?

これが空のデータセットに関するものである場合、の 2 番目の部分も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 に答える