Lección 17 de 29•Mó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.