【问题标题】:Is scipy.stats doing wrong calculation for iqr?scipy.stats 对 iqr 的计算是否错误?
【发布时间】:2019-01-27 08:17:59
【问题描述】:

我正在对数据集 [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))

导致问题的原因是什么?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    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的方法,因为stats.iqr不是排除中位数,而是包含。

    【讨论】:

      【解决方案2】:

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

      如果您想在维基百科中使用该算法,您需要执行以下操作:

      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
      

      编辑:在维基百科的talk page 上,提出的算法不是确定的,实际上scipy.stats.iqr 的方法也是可以接受的。看四分位数的三种确定方法Here

      【讨论】:

        猜你喜欢
        • 2020-11-24
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 2012-11-21
        • 1970-01-01
        • 2016-07-29
        相关资源
        最近更新 更多