z-значения (стандартное отклонение и среднее значение) в PHP

Я пытаюсь рассчитать Z-баллы с помощью PHP. По сути, я ищу наиболее эффективный способ вычисления среднего и стандартного отклонения набора данных (массива PHP). Есть предложения, как это сделать в PHP?

Я пытаюсь сделать это за наименьшее количество шагов.


person Spencer    schedule 25.03.2011    source источник


Ответы (4)


чтобы вычислить среднее значение, которое вы можете сделать:

$mean = array_sum($array)/count($array)

стандартное отклонение выглядит так:

// Function to calculate square of value - mean
function sd_square($x, $mean) { return pow($x - $mean,2); }

// Function to calculate standard deviation (uses sd_square)    
function sd($array) {
    // square root of sum of squares devided by N-1
    return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}

сразу с этой страницы

person Naftali aka Neal    schedule 25.03.2011
comment
PHP, встроенный в stats_standard_deviation, возвращает значение, отличное от представленной вами функции sd(). Я проверил с помощью Excel STDDEV, и он соответствует вашему, но, что интересно, stats_standard_deviation, похоже, возвращает уровень достоверности 95% ... не совсем то, что возвращает функция Excel CONFIDENCE, но довольно близко. - person Hank; 09.10.2012
comment
Может быть, вы не установили $ sample = true? - person Dave Burton; 22.06.2015
comment
Это связано с тем, что stats_standard_deviation () по умолчанию вычисляет стандартное отклонение генеральной совокупности, тогда как Excel STDEV вычисляет стандартное отклонение выборки. Чтобы получить те же результаты, вы должны либо использовать Excel STDEVP, либо вызвать stats_standard_deviation () с $ sample = true. Чтобы понять, почему существует разница между выборкой и генеральной совокупностью, см. поправку Бесселя. - person geofflee; 11.08.2016
comment
Функция PHP stats_standard_deviation () выполняет код C ++ и будет работать намного быстрее, чем эквивалентная функция, написанная в коде PHP. - person geofflee; 11.08.2016

Как насчет использования встроенного пакета статистики, такого как stats_standard_deviation и stats_harmonic_mean. Я не могу найти функцию для стандартных средств, но если вы что-то знаете о статистике, уверен, вы сможете что-то выяснить, используя встроенные функции.

person rockerest    schedule 25.03.2011
comment
Тогда проголосуйте за :-) Учитывая, что это был лучший ответ (наименьшее количество шагов и (вероятно) наиболее эффективный способ). (Возможно, кто-то был недоволен тем, что сказал встроенный; вам нужно выполнить sudo pecl install stats, а затем отредактировать php.ini) - person Darren Cook; 04.11.2011
comment
@DarrenCook Интересно, есть ли обновление композитора для этой проблемы. Моя проблема с pear / pecl заключалась в том, что я разработчик приложений, распространяющих приложения, никогда не угадает, когда и сможет ли клиент использовать грушу. Composer помогает изменить это :-) Только мои 0,02 доллара. PS - Голосовать за вас рокерст - person Bob Gregor; 18.04.2014
comment
Пакет статистики PECL, похоже, больше не поддерживается с момента последнего обновления в июне 2016 г. pecl.php.net/ пакет / статистика - person 8ctopus; 24.11.2020

Это тот же код std dev со страниц php, упомянутых в верхнем ответе, но немного модернизированный, без магии однострочного массива и отдельной вспомогательной функции:

/**
 * Calculates the standard deviation of an array of numbers.
 * @param   array   $array  The array of numbers to calculate the standard deviation of.
 * @return  float   The standard deviation of the numbers in the given array.
 */
function calculateStdDev(array $array): float
{
    $size = count($array);
    $mean = array_sum($array) / $size;
    $squares = array_map(function ($x) use ($mean) {
        return pow($x - $mean, 2);
    }, $array);

    return sqrt(array_sum($squares) / ($size - 1));
}
person Bobo    schedule 28.08.2019

Тема довольно старая, но на самом деле я думаю, вы можете легко получить замену функции STDEV.P из Excel, используя функцию, как показано ниже.

function stdev_p($arr) {
    $arr2 = array();
    $mean = array_sum($arr)/count($arr);
    for ($x = 0; $x <count($arr); $x++) {
        $arr2[$x] = pow($arr[$x] - $mean,2);
    }
    return sqrt(array_sum($arr2)/count($arr));
}
person Miłosz Fox    schedule 07.10.2020