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:
- Funções gerais:
- stats_absolute_deviation - Desvio absoluto;
- stats_covariance - Covariância entre dois arrays;
- stats_kurtosis - Curtose;
- stats_skew - Obliquidade;
- stats_standard_deviation - Desvio Padrão;
- stats_variance - Variância;
- stats_stat_binomial_coef - Coeficiênte Binomial;
- stats_stat_correlation - Coeficiente de correlação de Pearson;
- stats_stat_powersum - Fórmula de Faulhaber;
- Funções de Distribuição:
- stats_den_uniform - Distribuição uniforme;
- stats_dens_beta - Distribuição beta;
- stats_den_cauchy - Distribuição de Cauchy;
- stats_dens_chisquare - Distribuição Chi-quadrado (χ2);
- stats_dens_exponential - Distribuição Exponencial;
- stats_dens_f - Distribuição f de Fisher-Snedecor;
- - Distribuição Gama (Γ);
- stats_dens_normal - Distribuição normal;
- stats_dens_pmf_binomial - Distribuição binomial;
- stats_dens_negative_binomial - Distribuição binomial negativa;
- stats_dens_t - Distribuição t de Student;
- Função Distribuição Acumulada (fda)
- stats_cdf_beta - Distribuição beta;
- stats_cdf_binomial - Distribuição binomial;
- stats_cdf_chisquare - Distribuição chi-quadrado;
- stats_cdf_exponential - Distribuição exponencial;
- stats_cdf_f - Distribuição f de Fisher-Snedecor
- stats_cdf_gamma - Distribuição gama
- stats_cdf_negative_binomial - Distribuição binomial negativa;
- stats_cdf_normal - Distribuição normal;
- stats_cdf_t - Distribuição t de Student;
- stats_cdf_uniform - Distribuição uniforme;
- Funções de Geração de Valores Aleatórios:
- stats_rand_gen_beta - Distribuição beta;
- stats_rand_gen_chisquare - Distribuição chi-quadrado;
- stats_rand_gen_exponential - Distribuição exponencial;
- stats_rand_gen_f - Distribuição f de Fisher-Snedecor;
- stats_rand_gen_gamma - Distribuição Gama;
- stats_rand_gen_ibinomial - Distribuição binomial;
- stats_rand_gen_ibinomial_negative - Distribuição binomial negativa;
- stats_rand_gen_iuniform - Distribuição uniforme;
- stats_rand_gen_normal - Distribuição normal;
- stats_rand_gen_t - Distribuição t de Student;
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
Otimoo, me ajudou muito!
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?
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com