Por qué el percentil 75 y no la media
La forma real de una distribución de latencias, por qué la media y la mediana engañan de maneras distintas, y cómo calcular percentiles sobre millones de muestras sin guardarlas todas.
La distribución de tiempos de carga de un sitio real no se parece a una campana. Tiene la masa concentrada a la izquierda y una cola derecha que se extiende durante decenas de segundos, y sobre esa forma la media es un estadístico que no describe a nadie. Entender por qué, y saber calcular percentiles a escala, es lo que separa un panel que informa de uno que tranquiliza.
- Describir la forma característica de una distribución de latencias y sus causas.
- Explicar qué oculta la media y qué oculta la mediana en esta forma concreta.
- Calcular percentiles sobre grandes volúmenes con memoria acotada.
- Elegir el estadístico correcto según la pregunta que se quiera responder.
La forma de la distribución
Si dibujas el histograma de LCP de un sitio con tráfico real, verás algo con estas características:
- Un pico pronunciado entre uno y dos segundos, que corresponde a los usuarios con buena red y buen dispositivo.
- A menudo un segundo pico más bajo entre tres y cinco segundos, que corresponde a móvil con red media.
- Una cola que se extiende hasta veinte, treinta o más segundos, con pocas muestras cada una pero muchas en total.
Es una distribución asimétrica a la derecha, aproximadamente log-normal, y con frecuencia multimodal porque mezcla poblaciones con condiciones estructuralmente distintas.
Las causas de la cola son físicas y no se van a corregir:
- El tiempo de una operación de red tiene un mínimo pero no un máximo. No puedes ir más rápido que la velocidad de la luz, pero sí puedes ir arbitrariamente lento por congestión, pérdida de paquetes o reintentos.
- Los tiempos se componen. Si tu carga son diez pasos independientes y cada uno tiene una pequeña probabilidad de ir mal, la probabilidad de que al menos uno vaya mal es alta, y basta uno para arrastrar el total.
- Los dispositivos y las redes no están distribuidos normalmente. Hay un abanico de dos órdenes de magnitud en potencia de CPU entre el mejor y el peor teléfono en uso.
Distribución real simplificada de mil visitas: 600 en 1,2 s, 250 en 2,5 s, 100 en 4,5 s, 40 en 9 s y 10 en 25 s. La media sale 2,52 s. La mediana sale 1,2 s. El percentil 75 sale 2,5 s. La media y el percentil 75 casi coinciden aquí por casualidad; lo que importa es que la mediana dice 1,2 y que hay 150 visitas por encima de 4 segundos que ninguno de los tres números menciona.
Qué oculta cada estadístico
La media miente por arrastre. Un puñado de muestras muy altas desplaza la media hacia arriba, con lo cual deja de describir al usuario típico. Y lo hace de forma inestable: si un día tienes cinco visitas de 60 segundos, tu media del día se mueve sin que nada haya cambiado. Además, no se puede promediar medias de subgrupos sin ponderar, y casi todo el mundo lo hace mal.
La mediana miente por omisión. Describe bien al usuario típico y no dice absolutamente nada de la mitad peor. Un sitio puede tener una mediana de 1,1 segundos con un 20% de visitas por encima de 8, y la mediana no se mueve mientras arreglas o rompes ese 20%.
El percentil 95 y el 99 mienten por inestabilidad. Describen la cola, que es lo que queremos ver, pero con pocas muestras son extremadamente volátiles. Con cien visitas, bastan cinco anómalas para que el percentil 95 lo decidan ellas.
El percentil 75 es el compromiso. Garantiza que tres de cada cuatro visitas viven ese nivel o mejor, y para que lo decidan valores atípicos harían falta veinticinco de cada cien, que es mucho menos probable. Ese es exactamente el razonamiento que llevó a elegirlo como estándar de las Core Web Vitals.
Pero hay un estadístico mejor que todos ellos para comunicar, y es el que más se ignora: el porcentaje de visitas por franja. “El 58% de las visitas tienen LCP bueno, el 27% mejorable y el 15% malo” contiene toda la información relevante, se entiende sin formación estadística, y se mueve de forma proporcional al trabajo que haces.
Calcular percentiles a escala
El problema práctico: un percentil exacto exige ordenar todas las muestras, y guardar millones de valores para calcular un número es absurdo. Hay tres técnicas, en orden de complejidad.
Histograma de cubos fijos. Defines cubos de antemano y cuentas cuántas muestras caen en cada uno. La memoria es constante e independiente del número de muestras, y los cubos se pueden sumar entre servidores o entre periodos, que es la propiedad que lo hace tan útil.
// Cubos de 100 ms hasta 10 s, mas un cubo de desbordamiento.
const ANCHO = 100;
const CUBOS = 100;
const histograma = new Uint32Array(CUBOS + 1);
function anadir(valorMs) {
const i = Math.min(Math.floor(valorMs / ANCHO), CUBOS);
histograma[i]++;
}
function percentil(p) {
const total = histograma.reduce((a, b) => a + b, 0);
if (total === 0) return null;
const objetivo = total * (p / 100);
let acumulado = 0;
for (let i = 0; i < histograma.length; i++) {
acumulado += histograma[i];
if (acumulado >= objetivo) {
return i === CUBOS ? Infinity : (i + 1) * ANCHO; // limite superior del cubo
}
}
return null;
}
La precisión está limitada por el ancho del cubo. Con cubos de 100 ms, tu percentil tiene una incertidumbre de 100 ms, lo cual es perfectamente aceptable para el LCP y demasiado grueso para el INP. Este es exactamente el compromiso que hace el conjunto de datos público de Chrome en BigQuery, cuyos percentiles se interpretan a partir de histogramas de granularidad gruesa y por tanto son aproximados.
Cubos logarítmicos. Resuelven el problema anterior haciendo que el ancho del cubo crezca con el valor, de forma que el error relativo sea constante. Un error del 1% significa 10 ms cuando el valor es 1 segundo y 100 ms cuando es 10. Es lo que hacen las estructuras del tipo histograma de alta dinámica, y es la elección correcta cuando el rango de valores abarca varios órdenes de magnitud.
Bocetos con garantía de error. Estructuras que ofrecen un error acotado y demostrable con memoria muy pequeña, y que además son combinables: puedes calcular un boceto por servidor y por minuto y luego fusionarlos para obtener el percentil del día completo, cosa que no se puede hacer con percentiles ya calculados. Es la opción para volúmenes muy grandes.
El error más común en paneles de rendimiento es calcular el percentil 75 de cada día y luego hacer la media de los siete para obtener el de la semana. El resultado no es el percentil 75 de la semana y puede estar muy lejos. Para agregar hay que combinar las distribuciones, no los percentiles: suma histogramas o fusiona bocetos, y calcula el percentil al final. Si tu panel solo guarda percentiles calculados, no puedes agregar por ningún eje, ni temporal ni por segmento.
Qué estadístico para qué pregunta
| Pregunta | Estadístico correcto |
|---|---|
| ¿Cumplo el estándar? | Percentil 75, segmentado por dispositivo |
| ¿A cuánta gente afecta? | Porcentaje de visitas por franja, multiplicado por visitas |
| ¿Cómo va el usuario típico? | Mediana |
| ¿Cómo va el peor caso realista? | Percentil 95, solo con volumen suficiente |
| ¿Ha cambiado algo hoy? | Distribución completa comparada con la de ayer |
| ¿Cuánto tiempo total espera mi audiencia? | Media multiplicada por visitas, y solo para esto |
La última fila es el único uso legítimo de la media que conozco: si quieres calcular el tiempo agregado que tus usuarios pasan esperando, la media por visitas te lo da y ningún percentil puede. Es una cifra útil para argumentar ante quien decide presupuestos, porque convierte milisegundos en horas-persona.
Cuántas muestras hacen falta
Una regla práctica que evita conclusiones sobre ruido. Para que un percentil p sea razonablemente estable necesitas del orden de 100 / (100 - p) muestras multiplicado por un factor de al menos veinte.
- Percentil 75:
100/25 = 4, por veinte, unas 80 muestras como mínimo absoluto, y varios cientos para comparar entre periodos. - Percentil 95:
100/5 = 20, por veinte, unas 400 muestras mínimo, y miles para comparar. - Percentil 99: 2.000 muestras mínimo, y decenas de miles para comparar.
Si segmentas por página, por dispositivo, por país y por tipo de conexión a la vez, cada celda de esa tabla tendrá pocas muestras y sus percentiles serán ruido. Segmenta por un eje o dos, no por cuatro, y comprueba siempre el recuento de muestras antes de creerte una celda.
La decisión de arquitectura que más se lamenta en instrumentación de rendimiento es almacenar el percentil ya calculado. Es barato, cabe en una serie temporal cualquiera, y te deja atrapado: no puedes agregar por ningún eje, no puedes cambiar de percentil, no puedes calcular el porcentaje por franja, y no puedes recalcular cuando cambien los umbrales oficiales, que ya han cambiado dos veces. Almacenar el histograma cuesta un vector de cien enteros por combinación de dimensiones y periodo, que es nada, y te permite responder a cualquier pregunta futura sobre los datos pasados. Yo lo aprendí tarde: tuve que declarar inservibles seis meses de histórico porque solo teníamos el percentil 75 y nos hizo falta el porcentaje de visitas malas para justificar un proyecto. Si vas a montar esto una sola vez, monta el histograma desde el primer día, con cubos logarítmicos si tu rango es amplio.