如何使用Python正确计算四分位间距(IQR)?

时间:2018-11-16 11:54:54

标签: python numpy scipy

我正在尝试了解计算iqr(四分位间距)的方法。

根据thisthisthis,我尝试了3种解决方案。

solution_1

a = numpy.array([1, 2, 3, 4, 5, 6, 7])
q1_a = numpy.percentile(a, 25)
q3_a = numpy.percentile(a, 75)
q3_a - q1_a

solution_2

from scipy.stats import iqr
iqr(a)

solution_3

q1_am = np.median(numpy.array([1, 2, 3, 4]))
q3_am = np.median(numpy.array([4, 5, 6, 7]))
q3_am - q1_am

其中3个给出的结果相同3是正确的。

当我尝试另一组数字时,事情变得很奇怪。

solution_1和2都输出0.95,这是不正确的。

x = numpy.array([4.1, 6.2, 6.7, 7.1, 7.4, 7.4, 7.9, 8.1])
q1_x = numpy.percentile(x, 25)
q3_x = numpy.percentile(x, 75)
q3_x - q1_x

solution_3给出1.2正确

q1_xm = np.median(np.array([4.1, 6.2, 6.7,7.25]))
q3_xm = np.median(np.array([7.25,7.4, 7.9, 8.1]))
q3_xm - q1_xm

我在解决方案中缺少什么?

任何线索将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果设置interpolation=midpoint,您将获得numpy.percentile的预期结果:

x = numpy.array([4.1, 6.2, 6.7, 7.1, 7.4, 7.4, 7.9, 8.1])
q1_x = numpy.percentile(x, 25, interpolation='midpoint')
q3_x = numpy.percentile(x, 75, interpolation='midpoint')
print(q3_x - q1_x)

这将输出:

1.2000000000000002

设置interpolation=midpoint也会使scipy.stats.iqr给出您想要的结果:

from scipy.stats import iqr

x = numpy.array([4.1, 6.2, 6.7, 7.1, 7.4, 7.4, 7.9, 8.1])
print(iqr(x, rng=(25,75), interpolation='midpoint'))

输出:

1.2000000000000002

有关该选项实际作用的更多信息,请参见链接文档中的interpolation参数。

答案 1 :(得分:0)

使用numpy.quantile

import numpy as np

x = np.array([4.1, 6.2, 6.7, 7.1, 7.4, 7.4, 7.9, 8.1])
q1_x = np.quantile(x, 0.25, interpolation='midpoint')
q3_x = np.quantile(x, 0.75, interpolation='midpoint')
print(q3_x - q1_x)

输出:

1.2000000000000002