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

¿Completaste esta lección?

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