Documento de autoridade
Metodologia da apura✦br
Toda probabilidade publicada aqui vem de um modelo aberto, com premissas explícitas. Esta página é o documento que sustenta nossa autoridade — e onde admitimos onde o modelo erra.
1. Modelo de partida — Poisson independente
Cada confronto é simulado como duas distribuições Poisson independentes — gols do mandante e gols do visitante são variáveis aleatórias separadas. A probabilidade de vitória, empate e derrota saem da matriz conjunta P(home=i, away=j) somada por quadrante (i>j, i=j, i<j).
Cálculo dos gols esperados (λ)
base_rate = league_avg_goals / 2 # ~1.30 em copas internacionais
home_str = home_attack / base_rate # 1.0 = mediano
away_def_str = away_defense / base_rate
elo_factor_home = 1 + (elo_home − elo_away) / 1700
→ cap em [0.6, 1.65]
λ_home = base_rate × home_str × away_def_str × home_adv × elo_factor_home
λ_away = base_rate × away_str × home_def_str × elo_factor_awayO home advantage default é 1.30 em jogos com mando definido e 1.05 em campo neutro (Copa do Mundo, Champions League). λ é truncado em [0.2, 4.5] para evitar caudas patológicas com Elo extremo.
Exemplo: Brasil (Elo 2031) vs Sérvia (Elo 1798) em campo neutro
Vitória Brasil
47.2%
Empate
25.3%
Vitória Sérvia
27.5%
xG Brasil × Sérvia
1.55 × 1.12
Placar mais provável: 1-1 (12.0%) · Top 5 placares:
- 1-1 (12.0%)
- 1-0 (10.7%)
- 2-1 (9.3%)
- 2-0 (8.3%)
- 0-1 (7.7%)
↳ Calculado em runtime por predictMatch() em src/lib/models/poisson.ts.
2. Win probability ao vivo
Durante a partida, atualizamos a probabilidade a cada minuto. A ideia: dado o placar atual e o tempo restante, qual a chance de o saldo de gols ainda mudar? Resposta: convolução de duas Poisson escaladas por tempo_restante / 90.
Win prob ao vivo
fração_restante = (90 − minuto_atual) / 90
λ_home_remain = λ_home × fração_restante
λ_away_remain = λ_away × fração_restante
P(vitória_home) = Σᵢ Σⱼ P(i; λ_home_remain) × P(j; λ_away_remain)
para todo (i, j) onde
(home_score + i) > (away_score + j)Exemplo: Brasil 1×0 Sérvia, minuto 60'
Vitória Brasil
79.7%
Empate
16.9%
Virada Sérvia
3.5%
Gols restantes esperados: Brasil 0.52 · Sérvia 0.37
3. Agregador eleitoral — bayesiano ponderado
Cada pesquisa registrada no TSE entra com 4 ponderações:
- 1. Tamanho de amostra: peso ∝ √n (mais conservador que ∝ n — evita que uma pesquisa de 5 mil domine)
- 2. Recência: decay exponencial com half-life de 14 dias. Pesquisas com 30+ dias têm peso ~25% da atual.
- 3. Bias por instituto: subtraímos viés histórico conhecido (Datafolha tende a +0.5pp para Lula em alguns ciclos, Quaest -0.4pp para PT, etc. — atualizado após cada eleição).
- 4. Erro irredutível: mesmo com infinitas amostras, polls têm ±3pp de viés sistemático (turnout, undecided, frame timing). Adicionamos isso em quadratura ao SE.
Erro padrão final
σ_total² = σ_entre_pesquisas²
+ σ_amostragem² (= p(1−p)/n)
+ σ_irredutível² (= 3pp²)Probabilidade de vitória: 10.000 simulações Monte Carlo com posterior Normal(μ, σ²) por candidato. Conta-se em quantas simulações cada candidato terminou em 1º lugar.
4. Probabilidade de campeão (Copa)
Simulamos 5.000 torneios completos partindo das 32 seleções classificadas. Em cada simulação, sorteamos o bracket e rodamos eliminatória direta usando o modelo Poisson em cada confronto (em mata-mata, empate vai para penaltis com 50/50). A probabilidade de campeão = quantas vezes a seleção venceu ÷ 5.000.
Versão atual: bracket sorteado uniformemente. Pós-MVP, vamos substituir pelo bracket real do sorteio FIFA quando publicado.
5. Limites conhecidos
- O modelo Poisson assume independência entre gols — não é verdade em jogos com expulsões precoces ou time muito superior controlando o jogo.
- O agregador eleitoral é tão bom quanto as pesquisas que consome. Movimentos abruptos (escândalo, debate, evento) demoram ~1 semana para refletir.
- Calibração ainda em curso: documentaremos o Brier score e a calibração ao longo da Copa e da campanha eleitoral.
- Os fatores Elo e os defaults de gols esperados são empíricos — quando tivermos 6+ meses de histórico de partidas via API-Football, recalibramos a partir do dado real.
Código aberto dos modelos: src/lib/models/ · poisson.ts · win-probability.ts · poll-aggregator.ts · championship.ts