statistics en Python: análisis de datos

Publicado el: 31/07/2026
Tempo de leitura: 7 minutos
Panel de gráficos que representa análisis estadístico de datos en Python

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.75

La 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.6

Los 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)  # 48

Recorrer 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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Gráficos de fracciones que representan números racionales exactos en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    fractions en Python: números racionales

    Aprende fractions en Python para aritmética racional exacta, reducción automática, limit_denominator, formato y conversiones seguras.

    Ler mais

    Tempo de leitura: 6 minutos
    31/07/2026
    Calculadora y documentos que representan cálculos Decimal precisos en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    Decimal en Python: cálculos precisos

    Aprende Decimal en Python para cálculos exactos, dinero, quantize, redondeo, contextos y validación sin errores de float.

    Ler mais

    Tempo de leitura: 7 minutos
    30/07/2026
    Código digital que representa identificadores UUID únicos y ordenables en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    uuid en Python: IDs únicos y ordenables

    Aprende uuid en Python: versiones 4, 5, 6 y 7, validación, almacenamiento, IDs ordenables y buenas prácticas de seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    30/07/2026
    Archivos organizados que representan almacenamiento temporal seguro en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    tempfile en Python: archivos temporales

    Aprende tempfile en Python para crear archivos y carpetas temporales seguros, con limpieza automática en Windows y Unix.

    Ler mais

    Tempo de leitura: 8 minutos
    29/07/2026
    Relojes que representan zonas horarias internacionales con zoneinfo en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    zoneinfo en Python: zonas horarias

    Aprende zoneinfo en Python para convertir zonas, tratar horario de verano, fold, UTC y tzdata sin errores de programación.

    Ler mais

    Tempo de leitura: 7 minutos
    29/07/2026
    Icono de documentos duplicados que representa copias superficiales y profundas en Python
    Bibliotecas y Módulos
    Foto de perfil de Leandro Hirt da Academify

    copy en Python: copia superficial y profunda

    Aprende copy en Python para crear copias superficiales, profundas y reemplazar campos sin compartir objetos mutables por error.

    Ler mais

    Tempo de leitura: 7 minutos
    28/07/2026