web-dev-qa-db-fra.com

Calcul du centile

Je veux imiter la fonction PERCENTILE équivalente d'Excel dans C# (ou dans un pseudo code). Comment puis je faire ça? La fonction doit prendre deux arguments où le premier est une liste de valeurs et le second est pour quel centile la fonction doit calculer.

Réservoirs!

Edit: Je suis désolé si ma question est venue comme si je ne l'avais pas essayé moi-même. Je ne pouvais tout simplement pas comprendre comment fonctionnait la fonction Excel (oui, j'ai d'abord essayé wikipedia et wolfram) et j'ai pensé que je comprendrais mieux si quelqu'un la présentait en code. @CodeInChaos a donné une réponse qui semble être ce que je recherche.

26
picknick

Je pense que page Wikipedia a des formules dont vous avez besoin pour écrire votre propre fonction ...
J'ai essayé ceci:

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]);
    }
}

MODIFIÉ après le commentaire CodeInChaos:
Excel utilise une valeur de centile entre 0 et 1 (j'ai donc changé mon code pour l'implémenter avec des formules Wikipedia) et l'autre méthode pour calculer n (j'ai donc changé celle commentée).

35
Marco

Essayer de reproduire les résultats sur: http://www.techonthenet.com/Excel/formulas/percentile.php J'ai trouvé:

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];
}

(Ne gère pas NaN et les infinis).

Quelques cas de test:

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

Ajoutez les valeurs à une liste, triez cette liste et prenez la valeur d'index ceil (longueur de la liste * centile).

0
stracktracer