Distribuciones de Probabilidad
Entendiendo la Forma de los DatosUna distribucion de probabilidad describe como se dispersan los valores de una variable. Entender distribuciones es fundamental para elegir los metodos estadisticos correctos y comunicar resultados.
Distribucion Normal (Gaussiana)
La distribucion normal es la mas importante en estadistica. Tiene forma de campana y muchos fenomenos naturales la siguen.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Generar datos normales
np.random.seed(42)
datos = np.random.normal(loc=170, scale=10, size=10000) # Alturas en cm
# Propiedades
print(f"Media: {datos.mean():.2f}")
print(f"Desv. Est.: {datos.std():.2f}")
print(f"Skewness: {stats.skew(datos):.4f}")
# Regla 68-95-99.7
media = datos.mean()
std = datos.std()
print(f"\nRegla empirica:")
print(f"68% entre [{media-std:.1f}, {media+std:.1f}]: {((datos >= media-std) & (datos <= media+std)).mean():.1%}")
print(f"95% entre [{media-2*std:.1f}, {media+2*std:.1f}]: {((datos >= media-2*std) & (datos <= media+2*std)).mean():.1%}")
print(f"99.7% entre [{media-3*std:.1f}, {media+3*std:.1f}]: {((datos >= media-3*std) & (datos <= media+3*std)).mean():.1%}")
# Visualizar
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(datos, bins=50, density=True, alpha=0.7, label='Datos')
x = np.linspace(datos.min(), datos.max(), 100)
ax.plot(x, stats.norm.pdf(x, media, std), 'r-', lw=2, label='Curva normal')
ax.set_title('Distribucion de Alturas')
ax.set_xlabel('Altura (cm)')
ax.legend()
plt.show()
Test de normalidad
# Test de Shapiro-Wilk (para n < 5000)
stat, p_valor = stats.shapiro(datos[:5000])
print(f"Test Shapiro-Wilk: estadistico={stat:.4f}, p-valor={p_valor:.4f}")
print(f"Normal? {'Si' if p_valor > 0.05 else 'No'} (al 5% de significancia)")
# Test de D'Agostino-Pearson
stat, p_valor = stats.normaltest(datos)
print(f"\nTest D'Agostino: estadistico={stat:.4f}, p-valor={p_valor:.4f}")
print(f"Normal? {'Si' if p_valor > 0.05 else 'No'}")
Otras Distribuciones Importantes
Distribucion Log-Normal (salarios, precios)
# Los salarios tipicamente siguen una log-normal
np.random.seed(42)
salarios = np.random.lognormal(mean=10.8, sigma=0.5, size=5000)
print(f"Media: ${salarios.mean():,.0f}")
print(f"Mediana: ${np.median(salarios):,.0f}")
print(f"Skewness: {stats.skew(salarios):.2f}")
# Log-transformar para hacerla normal
log_salarios = np.log(salarios)
print(f"\nDespues de log-transformar:")
print(f"Skewness: {stats.skew(log_salarios):.4f}")
stat, p = stats.shapiro(log_salarios[:5000])
print(f"Normal? {'Si' if p > 0.05 else 'No'} (p={p:.4f})")
Distribucion Binomial (si/no, exito/fracaso)
# Simular: 100 emails enviados, 20% tasa de apertura
aperturas = np.random.binomial(n=100, p=0.20, size=1000)
print(f"Promedio de aperturas por campania: {aperturas.mean():.1f}")
print(f"Desv. Est.: {aperturas.std():.1f}")
print(f"Rango: [{aperturas.min()}, {aperturas.max()}]")
Distribucion de Poisson (eventos por unidad de tiempo)
# Simular: 5 clientes por hora en promedio
clientes_por_hora = np.random.poisson(lam=5, size=1000)
print(f"Promedio: {clientes_por_hora.mean():.2f} clientes/hora")
print(f"Probabilidad de 0 clientes: {(clientes_por_hora == 0).mean():.1%}")
print(f"Probabilidad de 10+ clientes: {(clientes_por_hora >= 10).mean():.1%}")
Z-Score: Estandarizacion
El Z-score te dice cuantas desviaciones estandar un valor esta del promedio.
# Calcular Z-scores
import pandas as pd
df = pd.DataFrame({
'vendedor': ['Ana', 'Carlos', 'Maria', 'Luis', 'Sofia'],
'ventas': [85000, 72000, 95000, 62000, 110000]
})
media_ventas = df['ventas'].mean()
std_ventas = df['ventas'].std()
df['z_score'] = (df['ventas'] - media_ventas) / std_ventas
print(df)
print(f"\nMedia: ${media_ventas:,.0f}")
print(f"Desv. Est.: ${std_ventas:,.0f}")
# Interpretacion
for _, row in df.iterrows():
z = row['z_score']
if abs(z) > 2:
nivel = 'Excepcional'
elif abs(z) > 1:
nivel = 'Notable'
else:
nivel = 'Normal'
print(f"{row['vendedor']}: z={z:.2f} ({nivel})")
Video Recomendado
Distribuciones de Probabilidad en Python
Ejercicio Practico
Crea un notebook 12_distribuciones.ipynb:
- Genera 3 distribuciones diferentes (normal, log-normal, uniforme) y graficalas
- Aplica el test de Shapiro-Wilk a cada una
- Calcula Z-scores para un dataset real y clasifica outliers
- Simula 1000 campanias de email con 15% de conversion y grafica la distribucion de resultados
- Muestra como la transformacion logaritmica normaliza datos sesgados
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Normal: Campana, simetrica. Usada en la mayoria de tests estadisticos
- Log-Normal: Sesgada a la derecha. Comun en salarios, precios
- Binomial: Conteo de exitos en n intentos
- Poisson: Conteo de eventos en un intervalo
- Z-Score: Estandarizar datos para comparar entre escalas
- Test de normalidad: Shapiro-Wilk para verificar si tus datos son normales
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.