Cálculos estadísticos con PHP.

Resumen.

En este artículo vamos a presentar una función para realizar cálculos de los índices estadísticos imprescindibles para realizar análisis estadístico de tipo paramétrico de una muestra. Se calcularán los sumatorios mas usuales e índices como media, varianza, desviación estándar, etc. Por motivos de extensión no se presentarán las formulas, que están disponibles en Internet.

Artículo.

Cuando en el curso de PHP hablamos sobre los arrays se hizo hincapié en su importancia, pues bien, en este artículo vamos a tomar conciencia de esta realidad, ya que en estadística tratamos con conjuntos de datos que debemos tratar como un elemento único, la muestra.

El cálculo estadístico, en cuanto tal, no tiene mayor complejidad, el problema de estos cálculos es que tenemos que realizar muchas operaciones, los sumatorios.

∑X = Sumamos todos los valores de la muestra.
(∑X)2 = Es el cuadrado del anterior.
∑X2 = Elevamos cada valor al cuadrado y los sumamos.

Otra constante en el cálculo estadístico son las divisiones y raíces cuadradas, lo que genera constantemente valores decimales. Con todo esto, la opción de automatizar los cálculos se hace ideal.

Como ya dijimos en el curso de PHP referido, para manipular los arrays precisamos del uso de bucles, y vamos a usar el bucle foreach para realizar los cálculos sobre la muestra a analizar.

Por ejemplo, para elevar al cuadrado cada valor, lo haremos de la siguiente forma:

foreach($array_datos as $key => $datos){
$array_datos2[$key] = pow($datos, 2);
}


Y ya tenemos un nuevo array con todos los valores de la muestra $array_datos elevados al cuadrado en $array_datos2 mediante la función nativa pow().

Y este va a ser el esquema de nuestra función, que también lo usaremos para tipificar la muestra. Dicho esto, nuestra función devolverá un amplio conjunto de valores: media, varianza y desviación estándar muestral y poblacional, tamaño muestral, sumatorios, arrays con puntuaciones tipificadas, valores mínimos y máximos e intervalo de confianza según la distribución normal con un nivel de confianza del 95% (alpha = 0,05) y dos colas (bilateral). Por tal motivo la variable que devuelve nuestra función será necesariamente tipo array.

Así tenemos la siguiente función:

<?php
// Calcula la varianza y desviacion tipica muestral y poblacional ademas de otros indices
// Funcion desarrollada por ArtesaniaWeb.ES

function Cal_Est($array_datos){
$menor_datos = min($array_datos);
$mayor_datos = max($array_datos);
$n = count($array_datos); // Contamos los elementos del array
$suma = array_sum($array_datos);
$media = $suma / $n;
$media_cuadrado = pow($media,2);
$cuadrado_suma = pow($suma,2);

foreach($array_datos as $key => $datos){
$array_datos2[$key] = pow($datos, 2);
}

$suma_cuadrados = array_sum($array_datos2);

// Calculamos la varianza poblacional
$varianza_p = ($suma_cuadrados / $n) - $media_cuadrado;
$devestip_p = sqrt($varianza_p);
// Calculamos la varianza muestral
$varianza_m = (($suma_cuadrados * $n) - $cuadrado_suma) / ($n * ($n - 1));
$devestip_m = sqrt($varianza_m);
// Tipificacion muestral
foreach($array_datos as $key => $datos){
$array_tipificacion_m[$key] = ($datos - $media) / $devestip_m;
}
$menor_datos_tm = min($array_tipificacion_m);
$mayor_datos_tm = max($array_tipificacion_m);
// Tipificacion poblacional
foreach($array_datos as $key => $datos){
$array_tipificacion_p[$key] = ($datos - $media) / $devestip_p;
}
$menor_datos_tp = min($array_tipificacion_p);
$mayor_datos_tp = max($array_tipificacion_p);
// Calculamos los limites el intervalo de confianza
// Datos necesarios para el calculo

$punt_tipica_normal_mas = 1.959963985; // Es la puntuacion superior para un contraste bilareral con alpha = 0,05
$punt_tipica_normal_menos = -1.959963985; // Es la puntuacion inferior para un contraste bilareral con alpha = 0,05
$media_muestra = $media;
$des_tipica = $devestip_m;
$tamano_muestra = $n;

// Calculo de los limites superior e inferior para la distribucion normal

$raiz_cuadrada = sqrt($tamano_muestra); // Raiz cuadrada del tamaño muestral
$error_tipico_media = $des_tipica / $raiz_cuadrada;

$limite_inferior = $media_muestra - ($punt_tipica_normal_mas * $error_tipico_media);
$limite_superior = $media_muestra - ($punt_tipica_normal_menos * $error_tipico_media);

$array_calculos = array(
0 => $menor_datos,
1 => $mayor_datos,
2 => $suma,
3 => $n,
4 => $media,
5 => $media_cuadrado,
6 => $cuadrado_suma,
7 => $suma_cuadrados,
8 => $varianza_p,
9 => $devestip_p,
10 => $varianza_m,
11 => $devestip_m,
12 => $array_tipificacion_m,
13 => $menor_datos_tm,
14 => $mayor_datos_tm,
15 => $array_tipificacion_p,
16 => $menor_datos_tp,
17 => $mayor_datos_tp,
18 => $limite_inferior,
19 => $limite_superior
);
return $array_calculos;
}

// Ejecutamos funcion

$muestra = array(6, 5, 4, 8, 6, 3, 2, 9);
$calculos = Cal_Est($muestra);

echo '<p><b>Muestra</b></p>';
echo '<pre>';
print_r($muestra);
echo '</pre>';

$punt_1m = $calculos[12][0]; // Primera puntuacion tipica muestral
$punt_8p = end($calculos[15]); // Ultima puntuacion tipica poblacional

echo "<h2>Asi sacamos valores concretos de la funcion.</h2>
<p>
[0]<b>Valor menor:</b> $calculos[0] <br />
[1]<b>Valor mayor:</b> $calculos[1] <br />
[2]<b>Suma:</b> $calculos[2] <br />
[3]<b>N:</b> $calculos[3] <br />
[4]<b>Media:</b> $calculos[4] <br />
[5]<b>Cuadrado de la media:</b> $calculos[5] <br />
[6]<b>Cuadrado de la suma:</b> $calculos[6] <br />
[7]<b>Suma de cuadrados:</b> $calculos[7] <br />
[8]<b>Varianza poblacion:</b> $calculos[8] <br />
[9]<b>Desviacion tipica poblacion:</b> $calculos[9] <br />
[10]<b>Varianza muestra:</b> $calculos[10] <br />
[11]<b>Desviacion tipica muestra:</b> $calculos[11] <br />
[12]<b>Primera puntuacion tipica muestral:</b> $punt_1m <br />
[15]<b>Ultima puntuacion tipica poblacional:</b> $punt_8p <br />
[18]<b>Limite inferior:</b> $calculos[18] <br />
[19]<b>Limite superior:</b> $calculos[19] <br />
</p>";

echo '<h2>Array con los calculos sobre la muestra</h2>';
echo '<pre>';
print_r($calculos);
echo '</pre>';

echo '<p>[12]<b>PT muestral</b></p>';
echo '<pre>';
print_r($calculos[12]);
echo '</pre>';

echo "
[13]<b>Valor menor:</b> $calculos[13] <br />
[14]<b>Valor mayor:</b> $calculos[14] <br />
";

echo '<p>[15]<b>PT poblacional</b></p>';
echo '<pre>';
print_r($calculos[15]);
echo '</pre>';

echo "
[16]<b>Valor menor:</b> $calculos[16] <br />
[17]<b>Valor mayor:</b> $calculos[17] <br />
";
?>

La ejecución de esta función es muy sencilla, no tiene nada destacable que comentar, salvo que con las keys 12 y 15 se devuelve un array con la muestra tipificada para muestra y población, en cuyo caso, también podemos extraer cualquiera de estos valores tipificados.

Para crear una calculadora con esta función puede plantearse la duda sobre como enviar un array desde un formulario, y nos encontramos con que en el curso referido anteriormente, dijimos que el método POST no permite envío de arrays.

La solución a esto es simple, podemos crear un formulario con un campo textarea y en cada fila introducimos un dato, seguidamente la recibimos así:

$datos = nl2br($_POST['datos']);


La función nl2br() agrega saltos de línea “<br />”, por lo que tomando estos como referencia, mediante la función explode() podemos crear el array que precisa esta función como entrada.

$muestra = explode('<br />', $datos);


Otro aspecto de interés es el redondeo de los valores, que casi por norma, tienen demasiados decimales, esto lo podemos hacer de la siguiente forma:

$mayor_rd = round($calculos[17], 3);


y ya tenemos nuestro valor máximo redondeado a tres decimales.

Y ya tenemos todo lo que precisamos para realizar los cálculos estadísticos más básicos en nuestra Web, esperamos que os guste esta función, aunque claro, para comprender su valor, es preciso tener algunos conocimientos sobre estadística descriptiva e inferencial.
Tags: Función || estadística || varianza || desviación estándar || foreach || array

Comentarios.

Sin comentarios, publica el tuyo.