El módulo statistics calcula medidas descriptivas sin dependencias externas. Elegir bien importa: una latencia excepcionalmente alta puede desplazar la media y representar mal el comportamiento habitual.

from statistics import fmean, median, quantiles

latencias_ms = [91, 105, 110, 118, 140, 420]

media = fmean(latencias_ms)
mediana = median(latencias_ms)
q1, q2, q3 = quantiles(latencias_ms, n=4)

print(media, mediana, q3)

fmean() devuelve la media en punto flotante, median() localiza el centro y quantiles() divide los datos. El tercer cuartil describe la zona alta sin reducirla al máximo. Trata valores ausentes y confirma las unidades antes de calcular.

Buenas prácticas

Distingue población y muestra: pvariance() y pstdev() usan la población completa, mientras variance() y stdev() estiman desde una muestra. No publiques solo una media; informa tamaño, período, dispersión y exclusiones. Para dinero, considera Decimal y las reglas de redondeo del dominio.

Para datos tabulares, continúa con la guía de pandas. Para arrays grandes, consulta NumPy en Python.

La documentación oficial del módulo statistics, consultada el 22 de julio de 2026, detalla la API y sus garantías.

Preparar los datos

Una estadística correcta sobre datos deficientes sigue siendo engañosa. Confirma unidad, periodo, origen y significado. Elimina ausentes mediante una regla explícita. Los valores NaN generan resultados sorprendentes en funciones basadas en orden, así que fíltralos primero.

from math import isnan
from statistics import fmean, median

brutos = [12.4, float("nan"), 13.1, 19.8]
validos = [valor for valor in brutos if not isnan(valor)]
print(fmean(validos), median(validos))

No mezcles segundos con milisegundos ni poblaciones distintas. Registra exclusiones y motivos. Eliminar un outlier solo porque cambia la media oculta información; determina si es error de medición o evento real.

Media, mediana y moda

mean() conserva tipos numéricos compatibles. fmean() devuelve punto flotante y suele ser rápida. La media usa todos los valores, pero reacciona a extremos. La mediana usa posición y suele describir mejor ingresos o latencias asimétricos. Publicar ambas puede revelar una cola oculta.

mode() devuelve una moda y multimode() todas las más frecuentes. En mediciones continuas, casi todos los valores pueden aparecer una vez y la moda aporta poco. Para categorías, acompaña el porcentaje con la cantidad absoluta.

Población, muestra y dispersión

Medias iguales pueden esconder riesgos distintos. pvariance() y pstdev() describen la población completa observada. variance() y stdev() aplican corrección muestral. Elige según el diseño de recolección, no según el resultado preferido.

from statistics import fmean, stdev

muestra = [18.2, 17.9, 18.5, 19.1, 17.7]
resumen = {
    "n": len(muestra),
    "media": fmean(muestra),
    "desvio_estandar": stdev(muestra),
}
print(resumen)

La varianza usa unidades al cuadrado; el desvío estándar vuelve a la unidad original. Informa n, pues una dispersión basada en pocas observaciones es inestable.

Cuantiles y convenciones

quantiles(datos, n=4) produce tres cortes de cuartiles. Con n=100, produce 99 cortes internos de percentiles. method selecciona la interpolación. exclusive e inclusive siguen convenciones diferentes; documenta cuál usaste al comparar herramientas.

Una latencia P95 significa que aproximadamente el 95% queda hasta ese corte, no que toda solicitud lo cumpla. Percentiles extremos de muestras pequeñas sugieren precisión inexistente. Informa ventana, cantidad y método.

Tipos numéricos y precisión

No mezcles Decimal y float sin política. Para dinero, Decimal conserva representación decimal, aunque redondeo y contabilidad siguen siendo decisiones del dominio.

from decimal import Decimal
from statistics import mean

precios = [Decimal("19.90"), Decimal("20.10"), Decimal("20.00")]
promedio = mean(precios).quantize(Decimal("0.01"))
print(promedio)

Fraction funciona en varias operaciones cuando importa un resultado racional exacto. Mantén cada conjunto numéricamente homogéneo.

Relaciones entre variables

covariance() mide cómo varían juntas dos variables. correlation() normaliza la asociación cerca de -1 a 1. Correlación no prueba causalidad: outliers, tendencias temporales o una tercera variable pueden crear una relación aparente.

linear_regression() ajusta una recta y devuelve pendiente e intercepto. Visualiza puntos y residuos antes de interpretar. Una recta puede representar mal una relación curva. Estas funciones ayudan en exploraciones pequeñas, pero no sustituyen diseño experimental, intervalos de confianza ni modelos especializados.

Errores y casos extremos

Varias funciones lanzan StatisticsError con entradas vacías o insuficientes. Valida en la frontera y elige una respuesta coherente.

from statistics import StatisticsError, median

def mediana_o_nulo(valores):
    try:
        return median(valores)
    except StatisticsError:
        return None

Elige entre None, excepción o campo ausente. Cero suele parecer una medición real y engaña. Los iteradores también se consumen; materialízalos si calcularás varias medidas sobre la misma entrada.

Pruebas y comunicación

Prueba cantidades pares e impares, repetidos, negativos, extremos, un elemento y vacío. Usa math.isclose() para punto flotante en vez de igualdad exacta frágil. Las pruebas de cuantiles deben declarar el método.

Al publicar, informa fuente, periodo, unidad, cantidad, exclusiones y dispersión. Un histograma o boxplot revela asimetría y grupos ocultos por el resumen. Conserva datos brutos o una transformación reproducible para auditoría.

Cuándo elegir otra herramienta

statistics es excelente para iterables pequeños y scripts sin dependencias. NumPy atiende arrays vectorizados grandes; pandas añade etiquetas, agrupación y limpieza tabular; las bibliotecas científicas ofrecen inferencia y modelos avanzados. Cambia por una necesidad concreta, no porque una media simple requiera una pila mayor.

Lista final: define población o muestra, limpia con transparencia, relaciona medidas con la distribución, informa cantidad y dispersión, documenta el método de cuantiles y nunca conviertas asociación en causalidad.