Lección 17 de 29Módulo 4: Estadística Aplicada

17. Estadística Descriptiva con NumPy

Media, mediana, desviación estándar, percentiles y distribuciones

20 minutos

Domina NumPy para cálculos estadísticos rápidos: media, mediana, desviación estándar, percentiles y más.

Introducción a NumPy

import numpy as np
import pandas as pd

# Arrays de NumPy
ventas = np.array([1200, 1450, 1100, 1800, 1950, 2100, 1750])
print(f"Tipo: {type(ventas)}")
print(f"Shape: {ventas.shape}")
print(f"Dtype: {ventas.dtype}")

# Operaciones vectorizadas (ultra rápidas)
ventas_con_iva = ventas * 1.21
descuento_10pct = ventas * 0.9

Medidas de tendencia central

# Media (promedio)
media = np.mean(ventas)
print(f"Media: ${media:,.2f}")

# Mediana (valor central)
mediana = np.median(ventas)
print(f"Mediana: ${mediana:,.2f}")

# Diferencia media vs mediana
if media > mediana:
    print("Distribución sesgada a la derecha (valores altos atípicos)")
elif media < mediana:
    print("Distribución sesgada a la izquierda (valores bajos atípicos)")
else:
    print("Distribución simétrica")

Medidas de dispersión

# Rango
rango = np.ptp(ventas)  # peak-to-peak
print(f"Rango: ${rango}")

# Varianza
varianza = np.var(ventas)
print(f"Varianza: {varianza:,.2f}")

# Desviación estándar
desv_std = np.std(ventas)
print(f"Desviación estándar: ${desv_std:,.2f}")

# Coeficiente de variación (dispersión relativa)
cv = (desv_std / media) * 100
print(f"Coeficiente de variación: {cv:.1f}%")

Percentiles y cuartiles

# Percentiles
p25 = np.percentile(ventas, 25)
p50 = np.percentile(ventas, 50)  # = mediana
p75 = np.percentile(ventas, 75)
p90 = np.percentile(ventas, 90)

print(f"P25: ${p25:,.0f}")
print(f"P50 (mediana): ${p50:,.0f}")
print(f"P75: ${p75:,.0f}")
print(f"P90: ${p90:,.0f}")

# IQR (Interquartile Range)
iqr = p75 - p25
print(f"IQR: ${iqr:,.0f}")

Ejemplo práctico: Análisis de dataset completo

# Dataset de ventas mensual
np.random.seed(42)
ventas_mes = np.random.normal(loc=50000, scale=10000, size=1000).clip(min=0)

print("="*70)
print("ANÁLISIS ESTADÍSTICO DE VENTAS MENSUALES")
print("="*70)

print(f"\n📊 MEDIDAS DE TENDENCIA CENTRAL:")
print(f"  Media: ${np.mean(ventas_mes):,.2f}")
print(f"  Mediana: ${np.median(ventas_mes):,.2f}")
print(f"  Moda: ${pd.Series(ventas_mes).mode()[0]:,.2f}")

print(f"\n📏 MEDIDAS DE DISPERSIÓN:")
print(f"  Desviación estándar: ${np.std(ventas_mes):,.2f}")
print(f"  Varianza: ${np.var(ventas_mes):,.2f}")
print(f"  Rango: ${np.ptp(ventas_mes):,.2f}")
print(f"  CV: {(np.std(ventas_mes) / np.mean(ventas_mes)) * 100:.1f}%")

print(f"\n📈 PERCENTILES:")
for p in [10, 25, 50, 75, 90, 95, 99]:
    valor = np.percentile(ventas_mes, p)
    print(f"  P{p}: ${valor:,.2f}")

print(f"\n🔍 VALORES EXTREMOS:")
print(f"  Mínimo: ${np.min(ventas_mes):,.2f}")
print(f"  Máximo: ${np.max(ventas_mes):,.2f}")

# Detectar outliers con IQR
Q1 = np.percentile(ventas_mes, 25)
Q3 = np.percentile(ventas_mes, 75)
IQR = Q3 - Q1
limite_inf = Q1 - 1.5 * IQR
limite_sup = Q3 + 1.5 * IQR

outliers = ventas_mes[(ventas_mes < limite_inf) | (ventas_mes > limite_sup)]
print(f"\n⚠️ OUTLIERS DETECTADOS:")
print(f"  Total: {len(outliers)} ({len(outliers)/len(ventas_mes)*100:.1f}%)")
print(f"  Rango normal: ${limite_inf:,.2f} - ${limite_sup:,.2f}")

Resumen de la lección

NumPy es ultra rápido para operaciones numéricas ✅ Media vs Mediana detectan sesgos en distribución ✅ Desviación estándar mide dispersión de datos ✅ Percentiles dividen datos en partes iguales ✅ IQR detecta outliers de forma robusta


🎯 Próxima lección: 18. Distribuciones y Probabilidades

En la siguiente lección aprenderás distribuciones normales, binomiales y Poisson. 🚀

Checkpoint de comprensión

3 preguntas para verificar lo aprendido. No afecta tu nota del examen final.

1¿Cuándo es mejor reportar la mediana en lugar de la media?
2¿Qué información NO te da una desviación estándar?
3¿Cuál es la diferencia entre `np.var()` (varianza) y `np.std()` (desviación estándar)?

¿Completaste esta lección?

Marca esta lección como completada. Tu progreso se guardará en tu navegador.