web-dev-qa-db-ja.com

パーセンタイルの計算

C#(またはいくつかの疑似コード)でExcelの同等のPERCENTILE関数を模倣したいと思います。どうやってやるの?関数は2つの引数を取る必要があります。最初の引数は値のリストで、2番目の引数は関数が計算するパーセンタイルです。

戦車!

編集:自分で試したことがなかったように私の質問が出てきたとしたら、ごめんなさい。私はExcel関数がどのように機能するか理解できなかっただけです(そう、私は最初にwikipediaとwolframを試してみました)。 @CodeInChaosは私が求めているように見える答えを出しました。

26
picknick

Wikipedia page には、独自の関数を記述するために必要な式があります...
私はこれを試しました:

public double Percentile(double[] sequence, double excelPercentile)
{
    Array.Sort(sequence);
    int N = sequence.Length;
    double n = (N - 1) * excelPercentile + 1;
    // Another method: double n = (N + 1) * excelPercentile;
    if (n == 1d) return sequence[0];
    else if (n == N) return sequence[N - 1];
    else
    {
         int k = (int)n;
         double d = n - k;
         return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
    }
}

CodeInChaosコメントの後に編集:
Excelは0と1の間のパーセンタイル値を使用し(したがって、コードを変更してこれをWikipediaの数式で実装します)、他の方法でnを計算します(コメントを変更しました)。

35
Marco

http://www.techonthenet.com/Excel/formulas/percentile.php で結果を再現しようとしています:

public static double Percentile(IEnumerable<double> seq,double percentile)
{
    var elements=seq.ToArray();
    Array.Sort(elements);
    double realIndex=percentile*(elements.Length-1);
    int index=(int)realIndex;
    double frac=realIndex-index;
    if(index+1<elements.Length)
        return elements[index]*(1-frac)+elements[index+1]*frac;
    else
        return elements[index];
}

NaNおよび無限を処理しません)。

いくつかのテストケース:

Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9
15
CodesInChaos

リストに値を追加し、そのリストをソートして、インデックス値ceil(リストの長さ*パーセンタイル)を取得します。

0
stracktracer