我试图了解计算 iqr(四分位距)的方法。
根据这个,这个和这个,我尝试了 3 种解决方案来做到这一点。
解决方案_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
Run Code Online (Sandbox Code Playgroud)
解决方案_2
from scipy.stats import iqr
iqr(a)
Run Code Online (Sandbox Code Playgroud)
解决方案_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
Run Code Online (Sandbox Code Playgroud)
其中 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我在解决方案中缺少什么?
任何线索将不胜感激。
numpy.percentile如果您设置,您将获得预期的结果interpolation=midpoint:
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)
Run Code Online (Sandbox Code Playgroud)
这输出:
1.2000000000000002
Run Code Online (Sandbox Code Playgroud)
设置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'))
Run Code Online (Sandbox Code Playgroud)
输出:
1.2000000000000002
Run Code Online (Sandbox Code Playgroud)
有关该interpolation选项实际作用的更多信息,请参阅链接文档中的参数。