我试图使用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以获得一致的答案?
答案 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}};这似乎是自然的选择,否则我们完全无视中间选择。