Funções Estatísticas em PHP

Artigo que apresenta uma lista de funções estatísticas do PHP e algumas elaboradas pelo autor.

calculadora estatística
Introdução

Em sistemas integrados de gestão (que atendem ao nível operacional, gerencial e estratégico), é muito comum o cálculo e apresentação de resultados estatísticos de dados gerados pelo nível operacional. Com estes resultados, é possível montar gráficos que facilitam a visualização (postei outro dia como gerar gráficos com o google chart). Neste artigo serão apresentadas algumas funções úteis para o cálculo de algumas informações estatísticas.

Extensão PECL "stat"

Existe uma extensão PECL chamada "stats" para PHP, que está disponível em http://pecl.php.net/package/stats e cuja documentação pode ser obtida em http://br.php.net/manual/pt_BR/book.stats.php. Para saber como instalar extensões PECL, veja o artigo: Instalação de Módulos Pear e Pecl.

Infelizmente, várias funções não estão claramente documentadas. Porém, mesmo assim, várias delas são compreensíveis e os parâmetros também são intuitivos para quem conhece a linguagem técnica usada em estatística (em inglês).

Por exemplo, para se obter o desvio padrão (standard deviation) de um conjunto de números, basta usar a função stats_standard_deviation, que recebe um array de números e, opcionalmente, um booleano indicando se deve ser considerada uma amostra do array ou todos os elementos (por padrão são considerados todos os elementos).

$array = array(8, 9, 6, 8.5, 7, 8.3, 9.1);
$desvio_padrao = stats_standard_deviation($array);

Veja uma lista com as funções de estatística mais comuns:


Outras funções básicas

A extensão "stat" implementa várias funções complexas, mas existem outras mais simples que não estão disponíveis, tais como a média aritmética, a moda e a mediana. Para tanto, basta implementar como no exemplo abaixo:

/**
 * Calcula a media de um array de numeros
 * @param array $a Array de numeros
 * @return number Retorna a media dos valores do array
 */
function media_aritmetica(array $a) {
    return array_sum($a) / count($a);
}

/**
 * Retorna o valor que mais aparece no array (moda estatistica)
 * @param array $a Array de valores
 * @param int $quantidade Quantidade de vezes que a moda foi observada
 * @return array Valores mais observados no array
 */
function moda(array $a, &$quantidade = 0) {
    $moda = array();
    if (empty($a)) {
        return $moda;
    }

    // Calcular quantidade de ocorrencias de cada valor
    $ocorrencias = array();
    foreach ($a as $valor) {
        $valor_str = var_export($valor, true);
        if (!isset($ocorrencias[$valor_str])) {
            $ocorrencias[$valor_str] = array(
                'valor' => $valor,
                'ocorrencias' => 0
            );
        }
        $ocorrencias[$valor_str]['ocorrencias'] += 1;
    }

    // Determinar maior ocorrencia
    $quantidade = null;
    foreach ($ocorrencias as $item) {
        if ($quantidade === null || $item['ocorrencias'] >= $quantidade) {
            $quantidade = $item['ocorrencias'];
        }
    }

    // Obter valores com a maior ocorrencia
    foreach ($ocorrencias as $item) {
        if ($item['ocorrencias'] == $quantidade) {
            $moda[] = $item['valor'];
        }
    }
    return $moda;
}

/**
 * Obtem a mediana de um array de numeros.
 * @param array $a Array de numeros
 * @param callback $comparacao Funcao de comparacao para ordenar o array (ou null para usar a funcao sort para ordenar)
 * @return number || bool Mediana do array ou false, caso seja passado um array vazio
 */
function mediana(array $a, $comparacao = null) {
    if (empty($a)) {
        return false;
    }

    // Ordenar o array
    if ($comparacao === null) {
        sort($a);
    } else {
        usort($a, $comparacao);
    }

    $tamanho = count($a);

    // Tamanho impar: obter valor mediano
    if ($tamanho % 2) {
        $mediana = $a[(($tamanho + 1) / 2) - 1];

    // Tamanho par: obter a media simples entre os dois valores medianos
    } else {
        $v1 = $a[($tamanho / 2) - 1];
        $v2 = $a[$tamanho / 2];
        $mediana = ($v1 + $v2) / 2;
    }
    return $mediana;
}

2 comentários

Unknown disse...

Adorei as funções, mas a função da moda está voltando um array com o array enviado. E para que serve o parâmetro quantidade? O objetivo da moda não é descobrir o item que aparece com maior frequência no array?