1

次の数値リストの 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 パーセンタイルではないため、この値がどこから来ているのかわかりません。

4

1 に答える 1

3

ドキュメントによると、ここ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 [k] )

  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 メソッドが1 つあるというのは誤解です。Hyndman & Fann のメソッドは、ラベルR1からR9で示されます。記事は次のように続けています。

一部のソフトウェア パッケージは、1+p(N-1) を k+d に設定してから、上記のように処理を進めます。これが Hyndman and Fan の方法 R7 です。これは Excel で使用される方法であり、R の既定の方法です (R 分位関数は、Hyndman & Fan で説明されている 9 つの方法のいずれかをオプションで使用できます)。

Apache がデフォルトで使用する方法DescriptiveStatisticsは、Hyndman & Fan のR6です。Excel で使用されるメソッドはR7です。どちらも「NIST メソッド」ですが、少数の測定では、異なる結果が得られる可能性があります。

Apache ライブラリでは、クラスを使用してR7アルゴリズムまたはその他のアルゴリズムを使用できることに注意してください。Percentileこのような何かがうまくいくはずです:

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

(私はこれをテストしていないことに注意してください)。

于 2015-05-19T18:14:52.940 に答える