Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
12 / 23
intermediate
8 horas
Analisis Estadistico con Python

Distribuciones de Probabilidad

Lectura
50 min~4 min lectura

Distribuciones de Probabilidad

Entendiendo la Forma de los Datos

Una 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:

  1. Genera 3 distribuciones diferentes (normal, log-normal, uniforme) y graficalas
  2. Aplica el test de Shapiro-Wilk a cada una
  3. Calcula Z-scores para un dataset real y clasifica outliers
  4. Simula 1000 campanias de email con 15% de conversion y grafica la distribucion de resultados
  5. 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.