Por qué tres modelos y no uno
Cuando empecé a diseñar Messias, la tentación era clara: un solo modelo grande que predijera todo. La realidad estadística es más compleja que eso.
Los goles, los resultados 1X2 y los córneres tienen naturalezas probabilísticas diferentes. Tratarlos con el mismo modelo implica hacer concesiones que degradan la precisión en cada uno. La solución: tres modelos especializados que comparten información solo donde tiene sentido. Esta modularidad no es una elección estética, es una necesidad estadística.
Aprendí esa lección por las malas mucho antes de saber qué era una prior conjugada. En el negocio de distribución, tuve la mala idea de construir una sola hoja de cálculo para pronosticarlo todo: las ventas diarias, el inventario para reabastecer y hasta las fechas de pago a proveedores. El modelo reventó al primer mes porque los supuestos que servían para la volatilidad de las ventas se caían cuando los aplicaba al comportamiento de pago. Con los goles y los córneres pasa lo mismo: obedecen a procesos aleatorios distintos, y meterlos a la fuerza en la misma caja es pedirle problemas al resultado.
Modelo 1: Doble Poisson Bayesiano para goles
El modelo principal usa la distribución Doble Poisson, estándar en la literatura académica desde Dixon y Coles (1997), implementada con footBayes::stan_foot.
Lo que lo hace bayesiano —y superior— es que las fuerzas de ataque y defensa de los equipos son variables latentes que se actualizan partido a partido. Un equipo en racha lo detecta automáticamente; un desplome repentino se incorpora sin intervención manual.
library(footBayes)
model_goals <- stan_foot(
data = matches_data,
model = "double_pois",
dynamic_type = "seasonal"
)
El diagnóstico clave: R-hat < 1.01 garantiza convergencia de las cadenas MCMC. ESS > 400 asegura precisión en la estimación de parámetros. Sin esos chequeos, el modelo es una caja negra que no vale más que una moneda al aire disfrazada de fórmula.
Modelo 2: Bradley-Terry-Davidson para resultados 1X2
Este modelo resuelve un problema que los modelos de goles no manejan bien: la probabilidad de empate.
El modelo Bradley-Terry compara equipos por pares. La extensión Davidson añade un parámetro específico para empates, capturando que no son simplemente «ni gana ni pierde» —son eventos con su propia dinámica, a menudo subestimados por las variantes Poisson.
model_result <- btd_foot(
data = matches_data,
predict = upcoming_matches
)
Modelo 3: Binomial Negativa Jerárquica para córneres
Los córneres son más frecuentes que los goles y tienen sobredispersión: su varianza es mayor que la media, lo que viola el supuesto de la Poisson estándar.
La Binomial Negativa captura esta sobredispersión. El modelo es jerárquico (implementado con brms) porque entiende que hay diferencias sistemáticas entre ligas y entre equipos:
library(brms)
model_corners <- brm(
corners ~ (1 | league) + (1 | team_home) + (1 | team_away),
family = negbinomial(),
data = corners_data,
chains = 4, iter = 2000
)
Este pooling parcial es una de las fortalezas silenciosas del modelado jerárquico bayesiano: los equipos con pocos partidos observados toman información prestada de la distribución general de la liga, estabilizando sus estimaciones sin ahogar la variabilidad individual. Es un principio que aplica mucho más allá del fútbol: desde ensayos clínicos con muestras pequeñas hasta campañas de marketing en mercados de nicho.
ETL automático semanal
Los tres modelos se alimentan de datos actualizados semanalmente desde FBref (resultados + xG), Understat (datos de calidad de juego) y Fotmob (tiempo real).
El pipeline ETL extrae, normaliza, cruza y carga en PostgreSQL cada lunes. Los modelos se reentrenan en background, computacionalmente pesado, pero invisible para el usuario. El sistema no pide atención: solo entrega probabilidades actualizadas a tiempo.
La métrica de transparencia: calibración
La prueba de fuego de cualquier modelo predictivo es su calibración: cuando el modelo dice 70%, ¿ocurre el 70% de las veces?
El gráfico de calibración de Messias compara probabilidades predichas con frecuencias observadas. Un modelo perfectamente calibrado muestra una diagonal perfecta. Esa transparencia es lo que diferencia un sistema estadístico serio de un generador de apariencias: en el mundo de las predicciones, parecer inteligente no sirve de nada si los números no aguantan.
Como escribieron Gneiting y Raftery en su artículo fundamental sobre evaluación de pronósticos, «el objetivo de la predicción probabilística es maximizar la agudeza de las distribuciones predictivas sujeto a calibración». La calibración es el piso no negociable. La agudeza —qué tan concentradas son las predicciones alrededor de la verdad— es la recompensa por haber construido bien ese piso.
_«El objetivo de la predicción probabilística es maximizar la agudeza de las distribuciones predictivas sujeto a calibración.»_ — Gneiting, T. & Raftery, A. E. (2007), _Strictly Proper Scoring Rules, Prediction, and Estimation_, Journal of the American Statistical Association.