Cálculo de percentiles con PHP.

Resumen.

Ya hemos hablado en otros artículos sobre como realizar cálculos estadísticos con PHP. Se ha hablado de varianza, intervalos de confianza, correlación, regresión… Muchos de estos conceptos, aunque son la base fundamental de la estadística, resultan demasiado confusos para la mayoría de los mortales. En este artículo presentaremos un índice estadístico, el percentil, que es comprensible para cualquiera.

Artículo.

Para comenzar este artículo vamos a definir de manera informal que es un percentil, que como hemos dicho, es un índice estadístico fácilmente entendible por cualquiera.

Un percentil es una medida de posición que consiste en dividir una muestra en 100 partes y ordenándolas de menor a mayor, podemos saber que posición ocupa un determinado valor en el conjunto de datos. ¿No se entiende? Vamos con un ejemplo.

Imaginemos que estamos trabajando con una variable que recoge la altura de las personas, y decimos que un sujeto que mide 1,92 metros ocupa el percentil 95. ¿Qué significa esto? Significa que el 95% de las personas miden como máximo 1,92 m. Por tanto, el 5% miden mas de 1,92 m.

Con el cálculo de percentiles también podemos conocer el índice estadístico mediana, que es el valor que deja por encima y debajo de él el 50% de las puntuaciones. La mediana coincide con el percentil 50, y se expresa como P50. Los percentiles también nos permiten otras divisiones de nuestros datos, como son los cuartiles 25 y 75 y que se expresan como Q1, Q3, y coinciden con los percentiles P25 y P75 respectivamente, el cuartil Q2 coincide con la mediana o P50 . (Los cuartiles dividen el conjunto de datos en 4 partes, que coinciden con los P25, P50 y P75)

Con frecuencia se suele pensar que la mediana o P50 coincide con la media, y sí, puede ocurrir, pero esto solo ocurre en conjuntos de datos de distribución simétrica, cuanto mas se aleja la mediana de la media, tenemos menor simetría en la distribución de esos datos, así que mucho OJO con equiparar media aritmética con la mediana o P50.

Con esta presentación muy somera sobre los percentiles, vamos a ver como calcular que puntuación, que valor, corresponde a un determinado percentil. En otro artículo veremos como calcular que percentil corresponde a un determinado valor.

Dicho esto, vamos a presentar la función Percentil(parametro1, parametro2), que como vemos, recibe dos parámetros, el primero es el array que contiene los datos, y el segundo es el percentil que deseamos calcular. Esta función nos devolverá en ocasiones el valor exacto, en otras, el valor aproximado. Sin más, la función es esta:
<?php // Calculamos percentiles. // Articulo en https://www.artesaniaweb.es/articulo.php?titulo=calculo-de-percentiles-con-php-gu1ub function Percentil($muestra,$percent){     SORT($muestra);    // Ordena el array en sentido ascendente     foreach ($muestra as $pos => $valor){          @$posicion $pos 1;    // Sumamos 1 para evitar la posicion cero del array         // echo "<small>$posicion --</small> $valor <br />";     // Presenta la muestra original         $muestra_orden[$posicion] = $valor;    // Creamos el nuevo array     }     // Contamos los elementos del array     $n1 count($muestra);     $posicio = ($n1 $percent ) / 100;     $posicion ceil($posicio);     $partes explode('.'$posicio);      $ente_ro $partes[0];         // Es la parte entera      @$deci_mal $partes[1];     // Es la parte decimal      $valor_percen1 $muestra[$posicion 1];    // Se resta 1 por que los array comienzan en cero      $valor_percen2 $muestra[$posicion];    // Para obtener el siguiente     $valor_percent abs($valor_percen1 $valor_percen2);     $valor_medio = ($valor_percen1 $valor_percen2) / 2;     if($deci_mal == 0){     // El valor es entero         if($valor_percent == 0){             // El siguiente valor es igual         $percentil $valor_percen1;             // echo "-- AA Es igual <br>";         }else{             // El siguiente valor NO es igual         $percentil $valor_medio;             // echo "-- BB No es igual <br>";         }                     // echo "No es decimal";     }else{     // El valor es decimal         $percentil $valor_percen1;                     // echo "Es decimal";     }     $cal_percentil = array($muestra_orden,$n1,$posicio,$posicion,$percentil);     return $cal_percentil; } // Ejecutamos la funcion // ------------------------------ // El percentil X es el valor que deja el X % de los valores menores o iguales por debajo de el. // El percentil 50 coincide con la mediana. /* Ejemplo: P50 = 12.5 El 50 % <= 12.5 */ $muestra = array(22341655781012131415161620222);  $percentil66;    // Percentil que queremos calcular $valor_percentil Percentil($muestra,$percentil); echo 'Muestra ordenada: <br />'; echo '<pre>'; print_r($valor_percentil[0]); echo '</pre>';              echo "Percentil a calcular: $percentil<br /><br /> N = $valor_percentil[1]<br /> Posicion exacta: $valor_percentil[2]<br /> Posicion redondeada: $valor_percentil[3]<br /> Valor Percentil $percentil: <b>$valor_percentil[4]</b><br /> <p>El $percentil % de los valores son menores o iguales que $valor_percentil[4].</p>"; $cuartil_1 Percentil($muestra,25); $cuartil_2 Percentil($muestra,50); $cuartil_3 Percentil($muestra,75); echo "<h3>Cuartiles</h3> 1 cuartil: valores menores o iguales a $cuartil_1[4] <br /> 2 cuartil: valores mayores que $cuartil_1[4] y menores o iguales a $cuartil_2[4] <br /> 3 cuartil: valores mayores que $cuartil_2[4] y menores o iguales a $cuartil_3[4] <br /> 4 cuartil: valores mayores que $cuartil_3[4] <br /> "; ?>
En el return de la función tenemos una variable tipo array que nos devuelve los siguientes valores según las keys:
  • [0] – Devuelve el array ordenado en sentido creciente.
  • [1] – Devuelve el tamaño del array o conjunto de datos.
  • [2] – Devuelve la posición exacta del percentil.
  • [3] – Devuelve la posición redondeada del percentil.
  • [4] – Devuelve el valor que toma el percentil calculado.
Con esta función, que como podemos observar es bastante extensa, podemos ver claramente como el uso de función supera de manera considerable al uso de script, aunque todos devuelvan el mismo resultado. Como podemos ver, en esta función hemos calculado tres percentiles: P25, P50 y P75, que se corresponden con los cuartiles ya mencionados anteriormente.

Esta función nos puede resultar muy útil para analizar por ejemplo el tráfico de nuestro sitio Web. Así podemos decir que si una cierta publicación ocupa el percentil P75, esta publicación supera en tráfico al 75% de todas nuestras publicaciones. Recordemos que podemos obtener un array con las visitas a muestras publicaciones desde nuestra base de datos.

Esperemos que este artículo os haya resultado comprensible, si no es así, y estáis en un mar de dudas, no dejes de plasmarlas en los comentarios, intentaremos resolverlas.
Tags: Percentil || cuartil || mediana || estadística || escala

Comentarios.

Sin comentarios, publica el tuyo.