如何用Python计算四分位数范围?

时间:2014-12-14 18:05:30

标签: python statistics median percentile wolframalpha

我有一个数字列表[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.

3 个答案:

答案 0 :(得分:9)

你有7个数字,你试图分成四分位数。因为7不能被4整除,所以有几种不同的方法可以像here那样做到这一点。

你的方式是第一个给出的链接,wolfram alpha似乎正在使用第三个。 Numpy基本上和wolfram一样,但它的插值基于百分位数(如here所示)而不是四分位数,所以得到了不同的答案。您可以使用插值选项选择numpy如何处理这个(我试图链接到文档,但显然我每个帖子只允许两个链接)。

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

答案 1 :(得分:9)

numpy版本1.9具有方便的插值功能。帮助你达到4的论据。

a = numpy.array([1, 2, 3, 4, 5, 6, 7])
numpy.percentile(a, 75, interpolation='higher') - numpy.percentile(a, 25, interpolation='lower')

答案 2 :(得分: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)]