Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I calculate the nth percentile from an array of doubles in PHP?

I have a large array of doubles and I need to calculate the 75th and 90th percentile values for the array. What's the most efficient way to do this via a function?

like image 308
Garry Pettet Avatar asked Jun 04 '14 22:06

Garry Pettet


2 Answers

It's been awhile since statistics, so I could be off here - but here's a crack at it.

function get_percentile($percentile, $array) {
    sort($array);
    $index = ($percentile/100) * count($array);
    if (floor($index) == $index) {
         $result = ($array[$index-1] + $array[$index])/2;
    }
    else {
        $result = $array[floor($index)];
    }
    return $result;
}

$scores = array(22.3, 32.4, 12.1, 54.6, 76.8, 87.3, 54.6, 45.5, 87.9);

echo get_percentile(75, $scores);
echo get_percentile(90, $scores);
like image 126
Mark Miller Avatar answered Sep 23 '22 18:09

Mark Miller


The answer above could throw an undefined index notice if you use the higher percent value (100) and does not return correct values according to Excel PERCENTILE function. You can see here an example of how it fails.

I've written a function in PHP according the Wikipedia Second varitant, which is the one used in Excel. This function is also protected from a non percentual value (out of range).

function getPercentile($array, $percentile)
{
    $percentile = min(100, max(0, $percentile));
    $array = array_values($array);
    sort($array);
    $index = ($percentile / 100) * (count($array) - 1);
    $fractionPart = $index - floor($index);
    $intPart = floor($index);

    $percentile = $array[$intPart];
    $percentile += ($fractionPart > 0) ? $fractionPart * ($array[$intPart + 1] - $array[$intPart]) : 0;

    return $percentile;
}
like image 34
Roger Codina Avatar answered Sep 23 '22 18:09

Roger Codina