нп. квантиль с неправильным расчетом? - PullRequest
2 голосов
/ 04 апреля 2019

При определенных настройках np.quantile допускает ошибки в определении правильного квантиля. Это ошибка?

x = np.array([374, 358, 341, 355, 342, 334, 353, 346, 355, 344,
              349, 330, 352, 328, 336, 359, 361, 345, 324, 386,
              334, 370, 349, 327, 342, 354, 361, 354, 377, 324])

q = np.quantile(x, 0.25)

print(q)

print(len(x[x<=q]) / len(x))

print(len(x[x>=q]) / len(x))

Выход:

337.25

0.26666666666666666

0.7333333333333333

0,73 означает, что только 73% значений больше или равны определенному квантилю; по определению это должно быть> = 75%

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Как заявил @SamProell, существуют различные соглашения для вычисления центилей, как вы можете видеть здесь с помощью методов вычисления квартиля (по-американски).Здесь у нас есть четное количество данных, поэтому давайте придерживаться первого метода и попробуем посмотреть, как мы будем делать это «вручную».

Сначала отсортируем данные:

> x2=np.sort(x)
> print(x2)
array([324, 324, 327, 328, 330, 334, 334, 336, 341, 342, 342, 344, 345,
       346, 349, 349, 352, 353, 354, 354, 355, 355, 358, 359, 361, 361,
       370, 374, 377, 386])

Затем разделите данные на две половины:

> x2_low = x2[:int(len(x2)/2)]
array([324, 324, 327, 328, 330, 334, 334, 336, 341, 342, 342, 344, 345,
       346, 349])
> x2_up = x2[int(len(x2)/2):]
array([349, 352, 353, 354, 354, 355, 355, 358, 359, 361, 361, 370, 374,
       377, 386])

Наконец найдите медиану (то есть значение, делающее ваши данные пополам).Здесь лежит выбор как len(x2_low)=15.Можно сказать, что медиана x2_low - это его 8-е значение (индекс 7 в python), тогда:

> q = x2_low[int(len(x2_low)/2)]
336
> len(x2_low[x2_low<q])
7
> len(x2_low[x2_low>q])
7

это также то, что np.median(x2_low) вернет, или даже q=np.percentile(x2,25,interpolation='lower').Но вы все равно получите:

> len(x[x<q])/len(x)
0.2333333333334

Поскольку ваше количество данных не кратно 4. Теперь все зависит от того, чего вы хотите достичь, вот результаты, которые вы можете получить для всех параметров интерполяции:

linear: по умолчанию, вы получили его в своем вопросе

lower: см. Выше

higher:

> q=np.percentile(x,25,interpolation='higher')
341
> len(x[x>q])/len(x)
0.7
> len(x[x<q])/len(x)
0.26666666666666666

nearest:

> q=np.percentile(x,25,interpolation='nearest')
336
> len(x[x>q])/len(x)
0.7333333333333333
> len(x[x<q])/len(x)
0.23333333333333334

и, наконец, midpoint:

> q=np.percentile(x,25,interpolation='midpoint')
> len(x[x>q])/len(x)
0.7333333333333333
> len(x[x<q])/len(x)
0.26666666666666666

Все зависит от того, что вы хотите сделать с этим потом.Для получения дополнительной информации о различных методах расчета, проверьте документацию numpy .

1 голос
/ 04 апреля 2019

https://github.com/numpy/numpy/blob/v1.15.1/numpy/lib/function_base.py#L3543-L3644

default value is linear
    interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
        This optional parameter specifies the interpolation method to
        use when the desired quantile lies between two data points
        ``i < j``:
            * linear: ``i + (j - i) * fraction``, where ``fraction``
              is the fractional part of the index surrounded by ``i``
              and ``j``.
            * lower: ``i``.
            * higher: ``j``.
            * nearest: ``i`` or ``j``, whichever is nearest.
            * midpoint: ``(i + j) / 2``.

Если вы выберете «выше», вы получите то, что хотите

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