Несоответствие расчета процентилей с использованием apache.math3.stat.descriptive

Я рассчитываю 95-й процентиль следующего списка чисел:

66,337.8,989.7,1134.6,1118.7,1097.9,1122.1,1121.3,1106.7,871,325.2,285.1,264.1,295.8,342.4

Библиотеки Apache используют стандарты NIST для расчета процентиля, который является тем же методом, который используется в Excel. Согласно Excel 95-й процентиль в приведенном выше списке должен быть 1125,85.

Однако, используя следующий код, я получаю другой результат:

DescriptiveStatistics shortList = new DescriptiveStatistics();



@BeforeTest
@Parameters("shortStatsList")
private void buildShortStatisticsList(String list) {
    StringTokenizer tokens = new StringTokenizer(list, ",");
    while (tokens.hasMoreTokens()) {
        shortList.addValue(Double.parseDouble(tokens.nextToken()));
    }
}

@Test
@Parameters("95thPercentileShortList")
public void percentileShortListTest(String percentile) {
    Assert.assertEquals(Double.toString(shortList.getPercentile(95)), percentile);
}

Это не удается со следующим сообщением:

java.lang.AssertionError: expected:<1125.85> but was:<1134.6>
at org.testng.Assert.fail(Assert.java:89)
at org.testng.Assert.failNotEquals(Assert.java:489)

1134,6 — это максимальное значение в списке, а не 95-й процентиль, поэтому я не знаю, откуда берется это значение.


person eeijlar    schedule 19.05.2015    source источник


Ответы (1)


Согласно документации getPercentile() используется алгоритм оценки процентилей, как указано здесь.

Процентили можно оценить по N измерениям следующим образом: для p-го процентиля установите p(N+1) равным k+d, если k — целое число, а d — дробную часть, большую или равную 0 и меньшую 1.

  1. Для 0‹k‹N Y(p)=Y[k]+d(Y[k+1]−Y[к])

  2. Для k=0 Y(p)=Y[1]

    Обратите внимание, что любое p ≤ 1/(N+1) будет просто установлено на минимальное значение.

  3. Для k≥N, Y(p)=Y[N]

    Обратите внимание, что любое p ≥ N/(N+1) будет просто установлено на максимальное значение.

В основном это означает умножение требуемого процентиля (0,95) на (N+1). В вашем случае N равно 15, а N+1 равно 16, поэтому вы получите 15,2.

Вы разделяете это на целую часть k (15) и d (0,2). k попадает в категорию 3 выше. То есть расчетный процентиль равен максимальному значению.


Если вы продолжите читать статью NIST, на которую я дал ссылку выше, вы увидите часть с заголовком "Обратите внимание, что существуют и другие общеупотребительные способы расчета процентилей". Они отсылают вас к статье Hyndman & Fann, в которой описаны несколько альтернативных способов расчета процентилей. Это заблуждение, что существует один метод NIST. Методы в Hyndman & Fann обозначаются метками от R1 до R9. Далее в статье говорится:

Некоторые программные пакеты устанавливают 1+p(N-1) равным k+d, а затем действуют, как указано выше. Это метод R7 Гайндмана и Фана. Это метод, используемый Excel, и метод по умолчанию для R (функция квантиля R может дополнительно использовать любой из девяти методов, обсуждаемых в Hyndman & Fan).

Метод, используемый по умолчанию Apache DescriptiveStatistics, — это R6 Hyndman & Fan. В Excel используется метод R7. Оба они являются «методами NIST», но для небольшого количества измерений могут давать разные результаты.

Обратите внимание, что библиотека Apache позволяет использовать алгоритм R7 или любой другой с помощью Percentile. Что-то вроде этого должно помочь:

DescriptiveStatistics shortList = new DescriptiveStatistics();
shortList.setPercentileImpl( new Percentile().
                                 withEstimationType( Percentile.EstimationType.R_7 ) );

(Обратите внимание, что я не проверял это).

person RealSkeptic    schedule 19.05.2015
comment
Спасибо за ваш ответ. Функция ПРОЦЕНТИЛЬ в Excel использует метод вычисления, отличный от метода NIST, но согласно wikipedia функция Excel 2010 PERCENTIL.EXC должна давать тот же ответ, что и NIST. Я еще не пробовал, но я бы предположил, что это правильно. - person eeijlar; 20.05.2015
comment
@eeijlar Я добавил в свой ответ дополнительную информацию, чтобы ответить на ваш комментарий. - person RealSkeptic; 20.05.2015