Calcular media, mediana y desviación estándar aparece en informes, monitorización, encuestas, calidad, notas, rendimiento y experimentos. Para análisis pequeños y scripts sin dependencias externas, el módulo statistics en Python ofrece funciones para medidas de centro, dispersión, relaciones entre variables, distribuciones normales y estimación de densidad.
Esta guía explica cómo elegir entre media y mediana, distinguir muestra y población, calcular cuantiles, correlación y regresión, eliminar NaN y usar NormalDist. Complementa nuestros artículos sobre listas en Python, collections, Decimal, fractions y números float.
Cuándo usar statistics
El módulo está pensado para análisis al nivel de una calculadora científica o gráfica. No sustituye NumPy, SciPy, pandas ni paquetes estadísticos profesionales. Funciona bien cuando los datos caben en memoria, los cálculos son univariados o bivariados y quieres permanecer en la biblioteca estándar.
from statistics import mean, median, stdev
datos = [12, 15, 14, 18, 20, 13]
print(mean(datos))
print(median(datos))
print(stdev(datos))Las funciones aceptan iterables y, cuando se documenta, admiten int, float, Decimal y Fraction. Evita mezclar tipos numéricos porque el comportamiento puede depender de la implementación.
Media aritmética con mean()
mean() suma los valores y divide entre la cantidad.
from statistics import mean
notas = [7.5, 8.0, 9.0, 6.5]
print(mean(notas)) # 7.75La media usa toda la información, pero es sensible a valores extremos. Un salario muy alto puede elevar la media de un grupo y dejar de representar a una persona típica.
fmean() y media ponderada
fmean() convierte los datos a float y suele ser más rápida. Desde Python 3.11 acepta pesos.
from statistics import fmean
notas = [85, 92, 83, 91]
pesos = [0.20, 0.20, 0.30, 0.30]
print(fmean(notas, pesos)) # 87.6Los pesos deben tener la misma longitud que los datos y una suma positiva. Documenta si representan importancia, frecuencia, duración o exposición.
Media geométrica
geometric_mean() es adecuada para factores multiplicativos, crecimiento compuesto e índices relativos.
from statistics import geometric_mean
factores = [1.10, 0.95, 1.20]
print(geometric_mean(factores))Los valores deben ser positivos. No uses la media aritmética directamente para tasas de crecimiento sucesivas; conviértelas primero en factores.
Media armónica
harmonic_mean() es útil para tasas, especialmente cuando la distancia o cantidad es fija.
from statistics import harmonic_mean
velocidad_media = harmonic_mean([40, 60])
print(velocidad_media) # 48Recorrer distancias iguales a 40 y 60 km/h no produce 50 km/h porque el tramo lento consume más tiempo.
Mediana y outliers
median() devuelve el centro de los datos ordenados y resiste mejor los extremos.
from statistics import mean, median
salarios = [2500, 2700, 2800, 3000, 30000]
print(mean(salarios))
print(median(salarios))Con una cantidad par, la mediana estándar promedia los dos centrales. Para datos ordinales o discretos, usa median_low() o median_high() para obtener un valor observado.
Mediana agrupada
median_grouped() estima la mediana cuando cada valor representa el punto medio de una clase de ancho fijo.
from statistics import median_grouped
edades = [25] * 10 + [35] * 30 + [45] * 15
print(median_grouped(edades, interval=10))La función supone que los puntos están separados por múltiplos exactos del intervalo y no comprueba esa condición.
Moda y multimoda
mode() devuelve el primer valor más frecuente. multimode() devuelve todos los empatados.
from statistics import mode, multimode
colores = ["azul", "verde", "azul", "rojo", "verde"]
print(mode(colores))
print(multimode(colores))La moda funciona también con datos nominales. Los elementos deben ser hashable.
Cuantiles, cuartiles y percentiles
quantiles() divide los datos en intervalos de igual probabilidad. Con n=4 devuelve los cortes de cuartiles; con 10, deciles; con 100, percentiles.
from statistics import quantiles
datos = [12, 15, 18, 20, 22, 25, 30, 35, 40, 45]
print(quantiles(datos, n=4))El método exclusive predeterminado trata los datos como muestra de una población con posibles valores más extremos. inclusive considera mínimo y máximo como extremos de población. Registra la convención elegida.
Varianza y desviación estándar
La varianza mide dispersión cuadrática; la desviación vuelve a la unidad original. Para una muestra usa variance() y stdev(). Para toda la población usa pvariance() y pstdev().
from statistics import variance, stdev, pvariance, pstdev
datos = [10, 12, 13, 15, 20]
print(variance(datos))
print(stdev(datos))
print(pvariance(datos))
print(pstdev(datos))La varianza muestral aplica la corrección de Bessel y divide entre N-1. La diferencia importa sobre todo en conjuntos pequeños.
Pasar una media ya calculada
Si ya tienes la media correcta, pásala para evitar repetir el cálculo.
from statistics import mean, variance
m = mean(datos)
v = variance(datos, m)La función no verifica que el valor sea realmente la media. Un dato arbitrario produce un resultado inválido.
Eliminar NaN antes del análisis
NaN tiene semántica de comparación inusual y puede romper ordenación, mediana, moda y cuantiles.
from itertools import filterfalse
from math import isnan
from statistics import median
datos = [20.7, float("nan"), 19.2, 18.3, float("nan"), 14.4]
limpios = list(filterfalse(isnan, datos))
print(median(limpios))La documentación oficial de statistics recomienda retirar NaN antes de funciones que ordenan o cuentan. Además, decide si los ausentes se eliminan, imputan o rechazan.
Mantener tipos numéricos consistentes
mean() y funciones de dispersión pueden conservar Decimal o Fraction.
from decimal import Decimal
from fractions import Fraction
from statistics import mean
print(mean([Decimal("0.5"), Decimal("0.75")]))
print(mean([Fraction(1, 3), Fraction(2, 3)]))Convierte todo el conjunto a un tipo coherente antes de analizar.
Covarianza
covariance() mide cómo varían dos variables juntas.
from statistics import covariance
horas = [1, 2, 3, 4, 5]
notas = [55, 60, 68, 76, 85]
print(covariance(horas, notas))Un valor positivo indica aumento conjunto; uno negativo indica movimiento opuesto. La magnitud depende de las unidades.
Correlación de Pearson
correlation() con el método lineal devuelve el coeficiente de Pearson entre -1 y 1.
from statistics import correlation
print(correlation(horas, notas))La correlación mide asociación lineal, no causalidad. Los outliers pueden dominarla y una relación curva fuerte puede tener correlación lineal baja.
Correlación de Spearman
Desde Python 3.12, method="ranked" calcula Spearman por rangos.
print(correlation(horas, notas, method="ranked"))Spearman mide asociación monotónica y es apropiada para datos ordinales o relaciones no proporcionales. Los empates reciben rangos medios.
Regresión lineal simple
linear_regression() estima pendiente e intercepto mediante mínimos cuadrados.
from statistics import linear_regression
modelo = linear_regression(horas, notas)
predicha = modelo.slope * 6 + modelo.intercept
print(modelo)
print(predicha)Una regresión simple no demuestra causalidad ni comprueba automáticamente independencia, varianza constante o forma correcta. Examina residuos antes de decisiones importantes.
Regresión proporcional
Con proportional=True, la recta pasa por el origen.
modelo = linear_regression(x, y, proportional=True)Úsala solo cuando el dominio justifique intercepto cero. Una restricción incorrecta distorsiona la pendiente.
NormalDist
NormalDist agrupa media y desviación de una distribución normal.
from statistics import NormalDist
distribucion = NormalDist(mu=100, sigma=15)
print(distribucion.cdf(115))
print(distribucion.inv_cdf(0.95))
print(distribucion.zscore(130))cdf() devuelve probabilidad acumulada, inv_cdf() encuentra un cuantil y zscore() expresa distancias en desviaciones.
Estimar una normal desde muestras
muestra = [98, 101, 99, 105, 102, 97]
dist = NormalDist.from_samples(muestra)
print(dist.mean, dist.stdev)Este modelo supone que la normal es apropiada. Revisa histogramas, asimetría, outliers y el proceso generador.
Muestras aleatorias reproducibles
samples() genera valores simulados. Pasa una seed para pruebas reproducibles.
valores = NormalDist(0, 1).samples(5, seed=42)
print(valores)No se utiliza para seguridad criptográfica.
Estimación de densidad KDE
Desde Python 3.13, kde() crea una función de densidad suavizada.
from statistics import kde
muestra = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
densidad = kde(muestra, h=1.5)
print(densidad(0))La anchura de banda h influye más que la forma exacta del kernel. Valores pequeños resaltan detalle y ruido; valores grandes suavizan.
kde_random()
kde_random() devuelve una función que sortea valores de la densidad estimada.
from statistics import kde_random
generador = kde_random(muestra, h=1.5, seed=123)
print([generador() for _ in range(5)])La calidad depende de la muestra y de la anchura.
StatisticsError
Entradas vacías, varianza con pocos puntos y datos incompatibles pueden lanzar StatisticsError.
from statistics import StatisticsError, mean
try:
mean([])
except StatisticsError:
print("No hay datos suficientes")Valida longitud y calidad antes de cálculos automáticos.
statistics frente a NumPy y pandas
Usa statistics para iterables pequeños, Decimal/Fraction y scripts sin dependencias. Usa NumPy para arrays grandes y operaciones vectorizadas. Usa pandas para tablas, columnas, ausentes y agrupaciones.
Los resultados pueden diferir por grados de libertad y métodos de cuantil. Documenta los parámetros al migrar.
Precisión numérica
Para sumas float difíciles, la documentación de math ofrece math.fsum(), que reduce pérdida acumulada. Las funciones estadísticas usan algoritmos cuidados, pero las entradas mal condicionadas requieren revisión.
Errores frecuentes
- Usar media en datos dominados por outliers.
- Confundir muestra y población.
- Dejar NaN en la entrada.
- Mezclar tipos numéricos.
- Interpretar correlación como causalidad.
- Aplicar regresión sin revisar residuos.
- Informar cuartiles sin el método.
- Elegir anchura KDE arbitrariamente.
Buenas prácticas
- Define la pregunta antes de la métrica.
- Limpia y valida los datos.
- Informa tamaño de muestra y ausentes.
- Muestra mediana junto a media en datos asimétricos.
- Elige correctamente funciones de muestra o población.
- Documenta métodos de cuantil y correlación.
- Visualiza observaciones y residuos.
- Usa bibliotecas especializadas cuando crezca el volumen.
Conclusión
El módulo statistics en Python proporciona una base sólida para análisis descriptivo y relaciones simples sin dependencias. Incluye varias medias, medidas robustas, dispersión, cuantiles, correlación, regresión, distribuciones normales y KDE.
La calidad depende más de la elección de métrica y preparación de datos que de la llamada. Al distinguir muestra y población, retirar NaN, tratar outliers y documentar convenciones, conviertes listas de números en análisis reproducibles sin sacar conclusiones engañosas.







