PHP функция для вычисления процентилей массива - не дает правильный результат - PullRequest
0 голосов
/ 24 апреля 2020

Я использую эту функцию (из { ссылка }) для вычисления 25-го процентиля массива:

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

Я применяю функцию к этому массиву

Array ( [0] => 9814106112 [1] => 0 [2] => 5692473344 [3] => 360448 [4] => 8514641920 [5] => 5228150784 [6] => 11731894272 [7] => 7707688960 [8] => 11325239296 [9] => 360448 [10] => 13382311936 [11] => 11934347264 [12] => 7919140864 [13] => 7370223616 [14] => 46461620224 [15] => 360448 )

В Excel 25 процентиль должен быть 3921203200, но функция возвращает 13020320768, что намного выше, чем в Excel.

Я абсолютно не понимаю, почему результат неверен. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 апреля 2020

Я получаю ожидаемый результат, используя:

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

$array = [9814106112,0,5692473344,360448,8514641920,5228150784,11731894272,7707688960,11325239296,360448,13382311936,11934347264,7919140864,7370223616,46461620224,360448];
$percentile = 25;
$result = getPercentile($array, $percentile);
var_dump($result); //float(3921203200) 

Вы даете своей функции правильные аргументы?

...