如何使scipy IQR使用阵列两半中位数的差异?

时间:2018-02-04 12:06:07

标签: python numpy scipy

我试图使用scipy的iqr()函数来计算某些数字的IQR。然而,当我自己解决这个问题时,我得到了与IQR不同的结果,我认为这是因为它没有基于中位数来解决问题。我看过documentation,但看不到任何内容。

例如,我有这个清单:

list1 = [7.4, 7.9, 4.1, 8.1, 6.2, 7.1, 7.4, 6.7]

如果我通过上半部分和下半部分的中位数自己计算出IQR,我得到1.2。如果我使用iqr(list1),我会获得0.95。在这个具体案例中,我尝试了iqr(list1, interpolation='midpoint'),这给了我正确答案。

但是,我有第二个清单:

list2 = [5, 7, 2, 1, 3, 4, 8, 8, 6, 6]

并完成了iqr(list2, interpolation='midpoint'),但它给了我3.0作为答案,但我已经做到了4.0。这是我正在进行的在线测试的一个多项选择问题,无论我是正确还是错误都没关系,因为3.0不是一个可用的答案。

如果我将IQR计算为75% - 25%,那么我得到与IQR()相同的结果,这与上下中位数不同。是否有一个我错过的参数或我可以改变IQR以获得一致的答案?

1 个答案:

答案 0 :(得分:1)

以下内容返回您想要的IQR类型:

for k in range(1, 100):
    x = np.sqrt(np.arange(k))   # some not-too-regular, but sorted, numbers
    diff_medians = np.median(x[len(x)//2:]) - np.median(x[:(len(x)+1)//2])
    my_iqr = iqr(x, interpolation=('nearest' if len(x) % 4 == 2 else 'midpoint'))
    assert diff_medians == my_iqr

具有100种不同数组大小的测试(排序数组,因此通过切片很容易找到中位数的差异):

[1, 2, 3]

请注意,当阵列具有奇数尺寸(未被示例覆盖)时,两个"一半"包括中间元素,例如在[1, 2]中,两半是[2, 3]和{{1}};这似乎是自然的选择,否则我们完全无视中间选择。