Почему разные процентили дают одинаковое значение? - PullRequest
0 голосов
/ 27 января 2020

Я пытался вычислить 10 процентилей для списка распределенных значений хи-квадрат. Я использовал «хи-квадрат», потому что я думаю, что это наиболее близко к тому, как выглядят наши реальные данные.

Теперь я пытался сделать это шаг за шагом, чтобы ничего не пропустить.

import numpy as np
values =  np.array([int(w)*10 for w in list(np.random.chisquare(6,1000))])
print('Min: ', np.max(values))
print('Max: ', np.min(values))
print('Mean: ', np.mean(values))

for p in [w*10 for w in range(1,11,1)]:
    percentile = np.percentile(values,p)
    print(p,percentile)

Это пример выходного кода выше:

Min:  0
Max:  230
Mean:  55.49
Percent: 10 Percentile:  20.0
Percent: 20 Percentile:  30.0
Percent: 30 Percentile:  30.0
Percent: 40 Percentile:  40.0
Percent: 50 Percentile:  50.0
Percent: 60 Percentile:  60.0
Percent: 70 Percentile:  70.0
Percent: 80 Percentile:  80.0
Percent: 90 Percentile:  100.0
Percent: 100 Percentile:  230.0

Точка, с которой я борюсь, это:
почему я получаю тот же "Percentile" для 20 и 30 процент?
Я всегда думал, что 20/30 означает: 20 процентов значений лежат ниже следующего значения (в данном случае 30). Например, 100% значений лежат ниже 230, что является максимумом.

Какая идея мне не хватает?

1 Ответ

1 голос
/ 27 января 2020

Поскольку values было создано с выражением int(w)*10, все значения кратны 10. Это означает, что большинство значений повторяется много раз. Например, я просто запустил этот код и обнаружил, что значение 30 повторялось 119 раз. Оказывается, что при подсчете значений межквантовый интервал 20% - 30% содержит только значение 30. Поэтому значения 30 повторяются в вашем выводе.

Я могу разбить мой набор данных как

   value    #
     0     14
    10     72
    20    100
    30    119
    40    152
    etc.

Разбить это на группы по 100 (так как у вас есть 1000 значений, и вы смотрите на 10%, 20% и т. д. c).

                                                np.percentile
Percent  Group       Values (counts)            (largest value in previous column)
-------  ---------   ------------------------   ----------------------------------
10       0 - 99      0 (14), 10 (72), 20 (16)    20
20       100 - 199   20 (84), 30 (16)            30
30       200 - 299   30 (100)                    30
40       300 - 399   30 (3), 40 (97)             40
etc.

Учитывая используемый вами дистрибутив, этот вывод представляется наиболее вероятным, но если вы перезапустите код достаточно много раз, вы увидите другой вывод. Я просто запустил его снова и получил

10 20.0
20 20.0
30 30.0
40 40.0
50 50.0
60 50.0
70 60.0
80 80.0
90 100.0
100 210.0

Обратите внимание, что и 20,0, и 50,0 повторяются. Количество значений для этого прогона:

In [56]: values, counts = np.unique(values, return_counts=True)                                                             

In [57]: values                                                                                                             
Out[57]: 
array([  0,  10,  20,  30,  40,  50,  60,  70,  80,  90, 100, 110, 120,
       130, 140, 150, 160, 170, 180, 190, 210])

In [58]: counts                                                                                                             
Out[58]: 
array([ 14,  73, 129, 134, 134, 119, 105,  67,  73,  33,  41,  21,  19,
        16,   8,   7,   1,   2,   2,   1,   1])
...