Capítulo 5

Inferencia Bayesiana

5.1 El Teorema de Bayes (revisión)

p(θD)=p(Dθ)p(θ)p(D)likelihood×priorp(\theta \mid \mathcal{D}) = \frac{p(\mathcal{D} \mid \theta) \, p(\theta)}{p(\mathcal{D})} \propto \text{likelihood} \times \text{prior}

Prior p(θ)p(\theta)

Creencia inicial sobre θ antes de ver los datos.

Likelihood p(Dθ)p(\mathcal{D} \mid \theta)

Qué tan probables son los datos dado θ.

Posterior p(θD)p(\theta \mid \mathcal{D})

Creencia actualizada después de ver los datos.

5.2 Priors Conjugados

Un prior es conjugado cuando la posterior tiene la misma forma que el prior. Esto permite actualización analítica cerrada.

Beta-Binomial

Prior Beta(α, β) + Likelihood Binomial → Posterior Beta(α + y, β + n - y). Ideal para proporciones.

Normal-Normal

Prior N(μ₀, σ₀²) + Likelihood N(μ, σ²) → Posterior N(μₙ, σₙ²). Para medias.

python
import numpy as np
from scipy import stats

# Beta-Binomial: estimar probabilidad de éxito
n_trials = 20
success = 15

# Prior: Beta(2, 2) — leve creencia hacia 0.5
alpha_prior, beta_prior = 2, 2

# Posterior: Beta(alpha_prior + success, beta_prior + n_trials - success)
alpha_post = alpha_prior + success
beta_post = beta_prior + n_trials - success

# Media posterior
media_post = alpha_post / (alpha_post + beta_post)
print(f"Media posterior: {media_post:.3f}")

# IC 95% (intervalo de credibilidad)
ci = stats.beta.ppf([0.025, 0.975], alpha_post, beta_post)
print(f"IC 95%: [{ci[0]:.3f}, {ci[1]:.3f}]")

5.3 Actualización Secuencial

La posterior de hoy es el prior de mañana. Esto permite aprendizaje online:

p(θD1,D2)p(D2θ)p(θD1)p(\theta \mid \mathcal{D}_1, \mathcal{D}_2) \propto p(\mathcal{D}_2 \mid \theta) \cdot p(\theta \mid \mathcal{D}_1)
python
# Actualización secuencial: mismo resultado que ver todos los datos juntos
alpha, beta = 2, 2

# Lote 1: 10 ensayos, 7 éxitos
alpha, beta = alpha + 7, beta + 3
print(f"After batch 1: Beta({alpha}, {beta})")

# Lote 2: 10 ensayos, 8 éxitos
alpha, beta = alpha + 8, beta + 2
print(f"After batch 2: Beta({alpha}, {beta})")

# Equivalente a 20 ensayos, 15 éxitos de una vez
print(f"Direct: Beta({2+15}, {2+5})")

5.4 MCMC (Conceptual)

Cuando no hay conjugación, usamos MCMC (Markov Chain Monte Carlo) para muestrear de la posterior. PyMC lo hace fácil:

python
import pymc as pm
import numpy as np

data = np.random.normal(5, 2, 100)

with pm.Model():
    # Prior: media normal, std uniforme
    mu = pm.Normal("mu", mu=0, sigma=10)
    sigma = pm.Uniform("sigma", lower=0, upper=10)

    # Likelihood
    obs = pm.Normal("obs", mu=mu, sigma=sigma, observed=data)

    # MCMC sampling
    trace = pm.sample(1000, tune=500, progressbar=False)

# Resumen
print(pm.summary(trace))
# La posterior de mu debería centrarse cerca de 5

PyMC usa NUTS (No-U-Turn Sampler), una variante eficiente de Hamiltonian Monte Carlo.

5.5 Bayes vs Frecuentista

AspectoFrecuentistaBayesiano
ParámetroFijo (desconocido)Variable aleatoria
Inferenciap-valor, ICPosterior, IC de credibilidad
Interpretación IC95% de los intervalos contienen θ95% de probabilidad que θ esté en el intervalo
RequiereDistribución muestralPrior + likelihood

En data science, lo mejor de ambos mundos: frecuentista para tests exploratorios, bayesiano para modelos complejos y cuando tienes conocimiento previo.