Как следует рассчитывать межквартильный диапазон в Python?

У меня есть список чисел [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.

person d3pd    schedule 14.12.2014    source источник


Ответы (3)


У вас есть 7 чисел, которые вы пытаетесь разбить на квартили. Поскольку 7 не делится на 4, есть несколько способов сделать это, как указано здесь.

Ваш способ - первый, указанный по этой ссылке, wolfram alpha, кажется, использует третий. Numpy делает в основном то же самое, что и wolfram, однако интерполирует на основе процентилей (как показано здесь), а не квартилей, поэтому получает другой ответ. Вы можете выбрать, как numpy обрабатывает это, используя опцию интерполяции (я пытался ссылаться на документацию, но, видимо, мне разрешено только две ссылки на сообщение).

Вам нужно будет выбрать, какое определение вы предпочитаете для своего приложения.

person or1426    schedule 14.12.2014

Версия 1.9 numpy имеет удобный аргумент «интерполяция», который поможет вам добраться до 4.

a = numpy.array([1, 2, 3, 4, 5, 6, 7])
numpy.percentile(a, 75, interpolation='higher') - numpy.percentile(a, 25, interpolation='lower')
person warner121    schedule 14.12.2014
comment
Большое спасибо за помощь с кодом. Я проверю ваш подход. Если бы я мог принять и ваш ответ, я бы -- or1426 предоставил более подробную информацию, которая помогла бы прояснить, что происходит. - person d3pd; 15.12.2014

Не идеально, но эти функции должны приближаться к нему:

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)]
person geotheory    schedule 19.08.2015