首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.stats是否为iqr做了错误的计算?

scipy.stats是否为iqr做了错误的计算?
EN

Stack Overflow用户
提问于 2018-08-21 07:29:39
回答 2查看 1K关注 0票数 5

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

根据维基枕部医生

IQR = Q3−Q1 = 33 - 25 =8

当我在dataset上运行IQR时,结果(6)与预期的(8)不一样。

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

这是我的密码

代码语言:javascript
复制
import numpy as np
from scipy.stats import iqr
x = np.array([23,25,28,28,32,33,35])
print(iqr(x, axis=0))

是什么导致了这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-21 08:29:24

scipy.stats.iqr似乎没有遵循维基百科中记录的递归算法。相反,它只是做np.percentile(x, 75) - np.percentile(x, 25) --这并不排除中位数,它是包容性的,所以您可以得到(32 + 33)/2 - (25 + 28)/2 = 6

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

代码语言:javascript
复制
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

编辑:在维基百科的谈话页上,人们提出了算法不确定的问题,事实上,scipy.stats.iqr的方法也是可以接受的。参见确定四分位数这里的三种方法

票数 5
EN

Stack Overflow用户

发布于 2019-12-27 19:18:09

丹尼尔的回答太棒了。对我来说,如果数据长度相等,我将使用stats.iqr,如

代码语言:javascript
复制
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。奇数的数据集,我们可以使用丹尼尔的方法,因为stats.iqr不是排除中位数,它是包括在内的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51943661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档