Correlación y regresión con PHP.

Resumen.

En este artículo vamos a presentar una función para realizar cálculos estadísticos, que si bien no es el cálculo de “todos los días”, sí nos lo encontramos prácticamente en cualquier disciplina técnica, desde la medicina, psicología o biología, hasta las diferentes ingenierías. Se trata de los cálculos más básicos del Modelo Lineal General, y sus coeficientes claves, la correlación de Pearson y la pendiente y ordenada de la ecuación de regresión simple.

Artículo.

Este artículo viene a presentar una solución de cálculo bastante común en muchas disciplinas, no obstante, es posible que a muchos lectores los conceptos de correlación y regresión le suenen a “chino mandarín”. Si este es tu caso y te interesa este asunto, puedes buscar en Google por “correlación de Pearson”.

Dicho esto, haremos una breve introducción a los conceptos mencionados. La correlación es una forma de medir la relación entre dos variables. Por ejemplo, podemos determinar si el número de horas semanales trabajadas guarda una relación real con el salario. O también podemos determinar qué dosis de un fármaco produce una cierta mejora en la sintomatología de una cierta patología.

Este uso en PHP va a estar íntimamente relacionado con la naturaleza temática del sitio Web en que estemos trabajando, pero, además, en otro artículo presentaremos un uso de este modelo matemático para determinar si un texto es realmente un texto con significado o simplemente un conjunto de caracteres resultante de pulsar el teclado aleatoriamente. Así que, como hemos dicho, ahora vamos a dedicarnos al cálculo de estos coeficientes.

Todo aquel que ha calculado mediante una calculadora básica la correlación de Pearson se habrá dado cuenta de la gran cantidad de operaciones que hay que realizar. Y precisamente esto, a PHP se le da muy bien.

Para quien esté familiarizado con la terminología estadística, ofrecemos aquí la formula del coeficiente de correlación de Pearson.
Fórmula correlación de Pearson
Pues bien, esta es una de las formulas que vamos a calcular, pero no solo esta, también calcularemos la pendiente con una fórmula parecida a esta, y la ordenada con una formula bastante mas simple.

También se calculan otros coeficientes relacionados con la medición psicológica desde la denominada Teoría Clásica de los Test, ni que decir tiene, que aunque los dejo en la función, a muy pocas personas le resultaran útiles estos coeficientes, a menos que sea un psicometra o tenga que realizar algún proyecto sobre esta materia.

Por tanto, nuestra función, por motivos obvios, va a devolver un array, del cual las keys 0 a 4 serán las más usuales, que son los coeficientes más elementales del Modelo Lineal General.

No vamos a explicar el desarrollo de la función ya que puede resultar un tanto pesado, pero sí diremos que para calcular estos coeficientes es preciso el cálculo de varios sumatorios, lo cual lo hemos realizado con el bucle foreach, y ciertas fórmulas las hemos dividido en partes para facilitar su programación, al igual que la comprensión de esta programación si se esta familiarizado con estos coeficientes.

Sin más, la función es la siguiente:
<?php  // Correlacion de Pearson, regresion y otros coeficientes /* Funcion desarrollada por ArtesaniaWeb.Es Mas info en: https://www.artesaniaweb.es/articulo.php?titulo=correlacion_y_regresion_con_php-mpsee */ function Pearson($muestra_x,$muestra_y,$decimales){     $n_x count($muestra_x);        // Tamaño     $n_y count($muestra_y);        // Tamaño     if($n_x == $n_y){         $suma_x array_sum($muestra_x);    // Sumatorio         $cuadrado_suma_x pow($suma_x2);    // Cuadrado del sumatorio         $media_x $suma_x $n_x;     // Media             foreach ($muestra_x as $key => $valor_x){                 $muestr_x2[$key] = pow($valor_x2);    // Creamos el nuevo array             }          $suma_x_cuadra array_sum($muestr_x2);         $suma_y array_sum($muestra_y);    // Sumatorio         $cuadrado_suma_y pow($suma_y2);    // Cuadrado del sumatorio         $media_y $suma_y $n_y;     // Media             foreach ($muestra_y as $key => $valor_y){                 $muestr_y2[$key] = pow($valor_y2);    // Creamos el nuevo array             }          $suma_y_cuadra array_sum($muestr_y2);                 foreach($muestra_x as $key => $datos){                 $muestr_xy[$key] = $datos $muestra_y[$key];    // Sumatorio de X*Y             }          $suma_producto array_sum($muestr_xy);         $n_x $n_x;          // --------------------------------- Calculamos el coeficiente de correlacion de Pearson y su determinacion         $numerador_correl = ($n_x*$suma_producto)-($suma_x*$suma_y);          $denomin1_correl sqrt(($n_x*$suma_x_cuadra)-$cuadrado_suma_x);          $denomin2_correl sqrt(($n_x*$suma_y_cuadra)-$cuadrado_suma_y);          $corel_pearson $numerador_correl/($denomin1_correl*$denomin2_correl);     // Es la correlacion - fiabilidad         $corel_pearson_rd round($corel_pearson,$decimales);         $corel_determinacion_rd round(pow($corel_pearson2),$decimales);                  // --------------------------------- Calculamos pendiente y ordenada         // Caculamos la pendiente          $beta = ($n_x*$suma_producto $suma_x*$suma_y)/($n_x*$suma_x_cuadra $cuadrado_suma_x);          $beta_rd round($beta,$decimales);         // Calculamos la ordenada          $ordenada $media_y - ($beta*$media_x);          $ordenada_rd round($ordenada,$decimales);                  // --------------------------------- Calculamos otros indices         $coef_fiabilidad abs($corel_pearson);        // Es el valor absoluto de la fiabilidad o correlación de Pearson         $coef_fiabilidad_rd round($coef_fiabilidad,$decimales);         $indice_fiabilidad sqrt($coef_fiabilidad);        // Es el indice de fiabilidad         $indice_fiabilidad_rd round($indice_fiabilidad,$decimales);         // Validez -- Tomamos como validez el punto medio entre el coeficiente y el indice de fiabilidad         $coef_validez = ($coef_fiabilidad $indice_fiabilidad) / 2;         $coef_validez_rd round($coef_validez,$decimales);         $coef_determinacion pow($coef_validez,2);         $coef_determinacion_rd round($coef_determinacion,$decimales);         $coef_alineacion sqrt($coef_determinacion);         $coef_alineacion_rd round($coef_alineacion,$decimales);         $coef_vpredictivo $coef_alineacion;         $coef_vpredictivo_rd round($coef_vpredictivo,$decimales);                  $Reg_Lineal = array($n_x,$corel_pearson_rd,$corel_determinacion_rd,$beta_rd,$ordenada_rd,$coef_fiabilidad_rd,$indice_fiabilidad_rd,$coef_validez_rd,$coef_determinacion_rd,$coef_alineacion_rd,$coef_vpredictivo_rd);     }else{         $Reg_Lineal = array('Las dos muestras deben tener el mismo tamaño.');     }     return $Reg_Lineal; } // Ejecutamos la funcion $muestra_x = array(6,5,3,2,1,4,8,5,5,4);    // 6,5,3,2,1,4,8,5,5,4 $muestra_y = array(7,8,5,4,3,7,10,7,8,7);    // 7,8,5,4,3,7,10,7,8,7 $decimales 4; $regresion Pearson($muestra_x,$muestra_y,$decimales); echo '<pre>'; print_r($regresion); echo '</pre>'; if(count($muestra_x) == count($muestra_y)){     $en_porcentaje round($regresion[2] * 1002);     echo "<p><b>Modelo lineal general.</b> <br />     N = $regresion[0] <br />     Coeficiente de  correlacion de Pearson = $regresion[1] <br />     Coeficiente de determinación de Pearson = $regresion[2] | $en_porcentaje %<br />     Pendiente ecuacion de regresion = $regresion[3] <br />     Ordenada ecuacion de regresion = $regresion[4] <br />     <hr>     <b>En la Teoria Clasica de los Test.</b><br />     Coeficiente de fiabilidad = $regresion[5] <br />     Indice de fiabilidad = $regresion[6] <br />     Coeficiente de validez &#8776; $regresion[7] <br />     Coeficiente de determinacion = $regresion[8] <br />     Coeficiente de alineacion = $regresion[9] <br />     Coeficiente de valor predictivo = $regresion[10] </p>"; }else{     echo "<p>$regresion[0]</p>"; } ?>
La función recibe como entrada 3 parámetros, de los cuales, dos son tipo array (cada una de las dos muestras) y un tercero que es el número de decimales que queremos de precisión.

El valor de coeficiente de correlación de Pearson esta comprendido entre -1 y 1, donde sendos valores marcan una relación perfecta entre variables negativa o positiva perfecta, y el valor 0 indica ausencia total de relación.

Íntimamente relacionado con este, está el coeficiente de determinación, que nos da el porcentaje de variación que puede ser explicado por la ecuación de regresión. Lógicamente, debemos multiplicarlo por 100 para tenerlo en forma de porcentaje.

La ecuación de regresión toma la forma Y = aX+b, donde “a” es la pendiente y “b” la ordenada. A partir de ella podemos hacer estimaciones de los valores de Y en función de los valores de X.

No quiero dejar de mencionar que para el cálculo de la correlación de Pearson PHP tiene una función, stats_stat_correlation(), pero esta función no entra en la instalación general de PHP y se hace precisa la biblioteca de cálculo estadístico. Si tienes especial interés en este asunto, y precisas de más funciones estadísticas, probablemente sea el momento para instalarla en tu servidor.

Espero que este artículo os haya gustado e igualmente espero no haberos saturado con la tecnoverborrea.
Tags: Estadística || correlación || Pearson || regresión

Comentarios.

Sin comentarios, publica el tuyo.