Как правильно рассчитать межквартильный диапазон (IQR) с помощью Python? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь понять, как вычислить 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

решение_2

from scipy.stats import iqr
iqr(a)

решение_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. это правильно.

когда я попробовал другой набор чисел, все пошло странно.

оба решения_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

Что мне не хватает в решениях?

любая подсказка будет оценена.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы получите ожидаемый результат с 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)

Это выводит:

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 в связанных документах для получения дополнительной информации о том, что на самом деле делает опция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...