8

我有一个数字列表,[1, 2, 3, 4, 5, 6, 7]我想要一个函数来返回这个数字列表的四分位数范围。四分位距是上四分位数和下四分位数之间的差。我尝试使用 NumPy 函数和 Wolfram Alpha 计算四分位距。我发现所有的答案,从我的手册答案,到 NumPy 答案,再到 Wolfram Alpha,都是不同的。我不知道这是为什么。

我在 Python 中的尝试如下:

>>> a = numpy.array([1, 2, 3, 4, 5, 6, 7])
>>> numpy.percentile(a, 25)
2.5
>>> numpy.percentile(a, 75)
5.5
>>> numpy.percentile(a, 75) - numpy.percentile(a, 25) # IQR
3.0

我在 Wolfram Alpha 中的尝试如下:

因此,我发现 NumPy 和 Wolfram Alpha 返回的值对于我认为是第一个四分位数、第三个四分位数和四分位数范围的值并不一致。为什么是这样?我应该在 Python 中做什么才能正确计算四分位距?

据我所知,四分位距[1, 2, 3, 4, 5, 6, 7]应该如下:

median(5, 6, 7) - median(1, 2, 3) = 4.
4

3 回答 3

10

Version 1.9 of numpy features a handy 'interpolation' argument to help you get to 4.

a = numpy.array([1, 2, 3, 4, 5, 6, 7])
numpy.percentile(a, 75, interpolation='higher') - numpy.percentile(a, 25, interpolation='lower')
于 2014-12-14T18:31:05.187 回答
9

您有 7 个数字,您正试图将它们分成四分位数。因为 7 不能被 4 整除,所以这里提到有几种不同的方法可以做到这一点。

您的方式是该链接给出的第一个,wolfram alpha 似乎正在使用第三个。Numpy 做的事情与 wolfram 基本相同,但是它基于百分位数(如图所示)而不是四分位数进行插值,因此得到了不同的答案。您可以使用插值选项选择 numpy 如何处理此问题(我尝试链接到文档,但显然每个帖子只允许两个链接)。

您必须为您的应用程序选择您喜欢的定义。

于 2014-12-14T18:28:44.483 回答
1

不完美,但这些函数应该近似它:

def quartile_1(l):
    return sorted(l)[int(len(l) * .25)]

def median(l):
    return sorted(l)[len(l)/2]

def quartile_3(l):
    return sorted(l)[int(len(l) * .75)]
于 2015-08-19T17:08:36.383 回答