Estimación de Distribuciones de Probabilidad en Google Colab

Clase 10 de 17Curso de Matemáticas para Data Science: Probabilidad

Resumen

¿Cómo estimar una distribución de probabilidad?

Estimando distribuciones de probabilidad, podemos transformar datos complejos en información útil para la toma de decisiones. La esencia del machine learning es ajustar una distribución de probabilidad a un conjunto de datos, lo que nos permite realizar predicciones más precisas. Ahora vamos a adentrarnos en cómo hacerlo usando Python y Google Colab.

¿Qué herramientas necesitamos?

Para esta tarea, nos apoyaremos en algunas herramientas esenciales:

  • Python y Google Colab: un entorno interactivo ideal para ejecutar código Python en la nube.
  • Bibliotecas de Python: como NumPy para manejo de datos y SciPy para funciones matemáticas, y Matplotlib para visualización.

Comencemos por importar nuestras librerías esenciales:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

¿Cómo generamos datos artificiales?

Es importante comprender que no siempre utilizamos datos del mundo real. En ocasiones, generamos datos de manera artificial para realizar pruebas y entender mejor el comportamiento de una distribución. Aquí es donde interviene un generador aleatorio de números basado en una distribución normal. Vamos a generar 10,000 datos:

import numpy.random as random

# Generamos 10,000 datos de una distribución normal
sample = random.normal(loc=50, scale=5, size=10000)

# Visualizamos con un histograma
plt.hist(sample, bins=30, density=True, alpha=0.6, color='g')

¿Cómo realizamos una estimación paramétrica?

La estimación paramétrica se centra en suponer que los datos se ajustan a una distribución conocida y "forzar" los parámetros sobre ellos. Vamos a construir un muestra con un promedio de 50 y una desviación estándar de 5.

# Media y desviación estándar estimadas
mu = np.mean(sample)
sigma = np.std(sample)

# Ajuste de la función de densidad de probabilidad (PDF)
dist = norm(mu, sigma)

# Generamos valores y evaluamos la PDF
values = np.arange(30, 70, 1)
probabilities = [dist.pdf(value) for value in values]

# Graficamos el histograma y la PDF
plt.plot(values, probabilities, lw=2)
plt.show()

¿Qué es una estimación no paramétrica?

Cuando los datos no se alinean bien con una sola distribución, recurrimos a métodos no paramétricos. La librería Scikit Learn resulta ser muy valiosa, allí utilizamos una técnica llamada estimación de densidad de kernel. Esta técnica es ideal cuando tenemos distribuciones complejas como la bimodal.

from sklearn.neighbors import KernelDensity

# Generamos dos conjuntos de datos
data1 = random.normal(loc=20, scale=5, size=5000)
data2 = random.normal(loc=40, scale=5, size=5000)
sample_bimodal = np.hstack([data1, data2])

# Configuramos y ajustamos el modelo de densidad de kernel
kde = KernelDensity(bandwidth=2.0, kernel='gaussian')
kde.fit(sample_bimodal.reshape(-1, 1))

# Calculamos probabilidades
log_dens = kde.score_samples(values.reshape(-1, 1))

# Graficamos el histograma y la estimación KDE
plt.plot(values, np.exp(log_dens), '-')
plt.hist(sample_bimodal, bins=50, density=True, alpha=0.5)
plt.show()

¿Cómo elegimos el método adecuado?

La elección entre una estimación paramétrica y no paramétrica depende del tipo de datos con el que trabajas. Si los datos siguen una distribución conocida, la estimación paramétrica es más sencilla y directa. Sin embargo, para distribuciones complejas o desconocidas, la estimación no paramétrica ofrece una mayor flexibilidad, aunque puede ser más sensible a parámetros como el suavizado de kernel.

En definitiva, el machine learning y la ciencia de datos nos invitan constantemente a utilizar y afinar estas herramientas, siempre buscando el modelo que mejor represente la realidad de los datos con los que trabajamos. Avanza y experimenta, que la práctica será tu mejor maestro. ¡Continúa explorando este apasionante campo!