我正在对数据集进行编码[23,25,28,28,32,33,35]
根据wiki和scipy 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))
是什么导致了问题?
最佳答案
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关于python - scipy.stats是否为iqr计算错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51943661/