scipy.stats是否为iqr计算错误?

时间:2018-08-21 07:29:40

标签: python numpy scipy

我正在对数据集[23,25,28,28,32,33,35]进行编码

根据wikiscipy doc

IQR = Q3-Q1 = 33-25 = 8

当我在数据集上运行IQR时,结果(6)与预期不符(8)。

我在https://stackoverflow.com/a/23229224中尝试了另一种方法,结果为6。

这是我的代码

import numpy as np
from scipy.stats import iqr
x = np.array([23,25,28,28,32,33,35])
print(iqr(x, axis=0))

什么导致了问题?

2 个答案:

答案 0 :(得分:3)

scipy.stats.iqr似乎不遵循Wikipedia中记录的递归算法。相反,它只是做np.percentile(x, 75) - np.percentile(x, 25)这并不排除中位数,而是包含在内,因此您得到(32 + 33)/2 - (25 + 28)/2 = 6

如果要在Wikipedia中使用该算法,则需要执行以下操作:

def iqr_(m):
    m = np.array(m)
    n = m.size//2
    m_ = np.partition(m.ravel(), n + 1)
    return np.median(m_[n + m.size%2:]) - np.median(m_[:n])

iqr_([23,25,28,28,32,33,35])
8.0

编辑:在Wikipedia的talk page上,提出的算法不是确定的,实际上scipy.stats.iqr的方法也是可以接受的。请参阅确定四分位数Here

的三种方法

答案 1 :(得分:0)

Daniel的答案令人惊讶。对我来说,如果数据长度是偶数,我将使用stats.iqr,就像

d = [21, 23,25,28,28,32,33,35]
# Check the length of the dataset
>>> len(d)
8
>>> Q1 = np.percentile(d, 25,interpolation='midpoint')
>>> Q3 = np.percentile(d, 75,interpolation='midpoint')
>>> Q3-Q1
8.5
# When use stats.iqr
>>> stats.iqr(d, interpolation='midpoint')
8.5

因此,数据集的偶数长度可以直接使用stats.iqr。数据集的奇数,我们可以使用Daniel的方法,因为Cuz stats.iqr不排除中位数,而是包含在内。