Metodologia da projeção eleitoral
Versão do modelo
- Versão 2026-10-06.2, gerada em 2026-10-06 · configuração (hash)
1cb518a75c58c4. - Eleições na base: 2016, 2018, 2020, 2022, 2024, 2026. Municipais: 2016, 2020, 2024. Gerais: 2018, 2022, 2026. Nunca se misturam.
- Reprodutível: mesma base + mesma versão + mesmos parâmetros geram exatamente os mesmos números (sem aleatoriedade; divisões por hash estável).
Como funciona
A ferramenta descreve como a votação de quem repetiu candidatura no mesmo cargo e território variou entre duas eleições do mesmo tipo (por exemplo, vereador 2020 → 2024) e aplica esse padrão à última votação de cada pessoa.
Referência central (P50): sai do modelo escolhido por cargo. No modelo base (M0) é a última votação (ou a última votação multiplicada pela mediana histórica de crescimento, o que tiver menor erro na calibração). Não é intenção de voto nem resultado esperado.
P10 e P90: quantis empíricos da distribuição dos erros do modelo em g = ln((Vt+1)/(Vt-1+1)), ajustados por calibração conformal em um subconjunto separado para que a largura reflita os erros reais observados fora da amostra.
Condicional: a projeção só vale para quem repetir a candidatura. A ferramenta não estima quem vai se candidatar.
Modelos testados: M0 (persistência), M1 (log-linear com situação na eleição anterior: eleito, suplente), M2 (M1 + concentração territorial: nº de unidades, top 5, top 10, HHI e, em eleições municipais, a fatia do candidato no município). M3 (variáveis de contexto pré-eleitorais) não foi implementado: não há na base pesquisa, filiação atual ou coligações futuras confiáveis.
Seleção do modelo: feita só com a validação interna do par de treino; o teste não participa. Entre modelos, o mais simples vence salvo melhora de pelo menos 1 ponto percentual no erro mediano.
Vereador
Treino: 2016→2020 (n = 2.708). Teste retrospectivo: 2020→2024 (n = 2.834). Escolhido: M0 com intervalo CONFORMAL.
Resultado no teste (fora da amostra): erro mediano 33,9%, cobertura P10–P90 73,1% (meta 80%).
| Modelo / intervalo | MdAPE | MAE (votos) | RMSLE | Cobertura P10–P90 | Largura mediana (% do centro) |
|---|---|---|---|---|---|
| M0 (centro = última votação) · Q+DELTA | 30,8% | 149 | 0.602 | 86,1% | 158% |
| M0 (centro = última votação) · Q | 30,8% | 149 | 0.602 | 74,6% | 116% |
| M0 (centro = última votação) · Q+DELTAcal | 30,8% | 149 | 0.602 | 74,6% | 116% |
| M0 (centro = última votação) · CONFORMAL | 30,8% | 149 | 0.602 | 73,1% | 113% |
| M0 (centro = última × exp(P50)) · Q+DELTA | 33,9% | 165 | 0.622 | 86,1% | 180% |
| M0 (centro = última × exp(P50)) · Q | 33,9% | 165 | 0.622 | 74,6% | 132% |
| M0 (centro = última × exp(P50)) · Q+DELTAcal | 33,9% | 165 | 0.622 | 74,6% | 132% |
| M0 (centro = última × exp(P50)) · CONFORMAL | 33,9% | 165 | 0.622 | 73,1% | 128% |
| M1 (log-linear: votação, eleito/suplente) · Q+DELTA | 36,7% | 188 | 0.644 | 85% | 193% |
| M1 (log-linear: votação, eleito/suplente) · Q | 36,7% | 188 | 0.644 | 75% | 142% |
| M1 (log-linear: votação, eleito/suplente) · Q+DELTAcal | 36,7% | 188 | 0.644 | 75,7% | 144% |
| M1 (log-linear: votação, eleito/suplente) · CONFORMAL | 36,7% | 188 | 0.644 | 75,6% | 144% |
| M2 (M1 + concentração territorial) · Q+DELTA | 37,4% | 180 | 0.649 | 84,8% | 191% |
| M2 (M1 + concentração territorial) · Q | 37,4% | 180 | 0.649 | 72,6% | 141% |
| M2 (M1 + concentração territorial) · Q+DELTAcal | 37,4% | 180 | 0.649 | 73,3% | 143% |
| M2 (M1 + concentração territorial) · CONFORMAL | 37,4% | 180 | 0.649 | 72,8% | 141% |
Experimento do intervalo (modelo M0)
| Modelo / intervalo | MdAPE | MAE (votos) | RMSLE | Cobertura P10–P90 | Largura mediana (% do centro) |
|---|---|---|---|---|---|
| A: P10/P90 + DELTA 0,2 (modelo anterior) | 30,8% | 149 | 0.602 | 86,1% | 158% |
| B: P10/P90 sem DELTA | 30,8% | 149 | 0.602 | 74,6% | 116% |
| C: DELTA calibrado só na calibração (=0) | 30,8% | 149 | 0.602 | 74,6% | 116% |
| D: conformal (CQR) calibrado na calibração | 30,8% | 149 | 0.602 | 73,1% | 113% |
Erro por faixa de votação anterior
| Faixa | Casos | MdAPE | Cobertura |
|---|---|---|---|
| 0–19 | 121 | 53,3% | 66,9% |
| 20–49 | 202 | 49,4% | 69,3% |
| 50–99 | 263 | 43,1% | 65,8% |
| 100–249 | 819 | 36,6% | 68,6% |
| 250–499 | 854 | 30,9% | 77,4% |
| 500–999 | 400 | 27,2% | 81% |
| 1.000–2.499 | 154 | 26,6% | 76% |
| 2.500–4.999 | 18 | 36,6% | 66,7% |
| 5.000+ | 3 | 11,1% | 100% |
Meta de erro mediano ≤ 10%: não atingida em nenhum estrato testado (cortes por faixa de votos × eleito na eleição-base, com pelo menos 30 casos). O sistema mostra o erro que os testes encontraram.
Prefeito
Treino: 2016→2020 (n = 160). Teste retrospectivo: 2020→2024 (n = 123). Escolhido: M0 com intervalo CONFORMAL.
Resultado no teste (fora da amostra): erro mediano 27,1%, cobertura P10–P90 59,3% (meta 80%).
| Modelo / intervalo | MdAPE | MAE (votos) | RMSLE | Cobertura P10–P90 | Largura mediana (% do centro) |
|---|---|---|---|---|---|
| M0 (centro = última votação) · Q+DELTA | 27,2% | 1.854 | 0.571 | 82,9% | 113% |
| M0 (centro = última votação) · Q | 27,2% | 1.854 | 0.571 | 48,8% | 71% |
| M0 (centro = última votação) · Q+DELTAcal | 27,2% | 1.854 | 0.571 | 57,7% | 79% |
| M0 (centro = última votação) · CONFORMAL | 27,2% | 1.854 | 0.571 | 59,3% | 81% |
| M0 (centro = última × exp(P50)) · Q+DELTA | 27,1% | 1.850 | 0.570 | 82,9% | 112% |
| M0 (centro = última × exp(P50)) · Q | 27,1% | 1.850 | 0.570 | 48,8% | 71% |
| M0 (centro = última × exp(P50)) · Q+DELTAcal | 27,1% | 1.850 | 0.570 | 57,7% | 79% |
| M0 (centro = última × exp(P50)) · CONFORMAL | 27,1% | 1.850 | 0.570 | 59,3% | 81% |
| M1 (log-linear: votação, eleito/suplente) · Q+DELTA | 32,4% | 2.307 | 0.590 | 82,9% | 125% |
| M1 (log-linear: votação, eleito/suplente) · Q | 32,4% | 2.307 | 0.590 | 44,7% | 80% |
| M1 (log-linear: votação, eleito/suplente) · Q+DELTAcal | 32,4% | 2.307 | 0.590 | 56,1% | 87% |
| M1 (log-linear: votação, eleito/suplente) · CONFORMAL | 32,4% | 2.307 | 0.590 | 56,1% | 88% |
Experimento do intervalo (modelo M0)
| Modelo / intervalo | MdAPE | MAE (votos) | RMSLE | Cobertura P10–P90 | Largura mediana (% do centro) |
|---|---|---|---|---|---|
| A: P10/P90 + DELTA 0,2 (modelo anterior) | 27,2% | 1.854 | 0.571 | 82,9% | 113% |
| B: P10/P90 sem DELTA | 27,2% | 1.854 | 0.571 | 48,8% | 71% |
| C: DELTA calibrado só na calibração (=0.04) | 27,2% | 1.854 | 0.571 | 57,7% | 79% |
| D: conformal (CQR) calibrado na calibração | 27,2% | 1.854 | 0.571 | 59,3% | 81% |
Erro por faixa de votação anterior
| Faixa | Casos | MdAPE | Cobertura |
|---|---|---|---|
| 0–19 | 1 | 98,6% | 0% |
| 20–49 | 0 | — | — |
| 50–99 | 0 | — | — |
| 100–249 | 2 | 61,9% | 50% |
| 250–499 | 3 | 46,1% | 33,3% |
| 500–999 | 2 | 72,1% | 50% |
| 1.000–2.499 | 44 | 26,9% | 56,8% |
| 2.500–4.999 | 46 | 27,3% | 58,7% |
| 5.000+ | 25 | 25,4% | 72% |
Meta de erro mediano ≤ 10%: não atingida em nenhum estrato testado (cortes por faixa de votos × eleito na eleição-base, com pelo menos 30 casos). O sistema mostra o erro que os testes encontraram.
Deputado estadual e federal
Dados históricos insuficientes para projeção quantitativa confiável. 68 repetições no par de treino e 50 no de teste (mínimos exigidos: 100 e 30). Nenhuma projeção numérica é publicada.
Erro histórico, validação e cobertura
O erro histórico é o erro percentual absoluto mediano (MdAPE = mediana de |previsto − real| ÷ max(real, 1)) do modelo aplicado a eleições que não participaram do treinamento. Não corresponde à margem de erro amostral de uma pesquisa eleitoral.
Validação walk-forward: o modelo é ajustado só em pares de eleições anteriores ao par de teste (municipal: treino 2016→2020, teste 2020→2024; geral: treino 2018→2022, teste 2022→2026). Não há sorteio aleatório de treino e teste.
Cobertura é a fração dos casos testados em que a votação real caiu entre P10 e P90. Meta: 80%.
Estabilidade estatística (alta ≤ 10%, moderada até 20%, baixa acima de 20% de erro mediano) descreve apenas o desempenho do modelo em observações comparáveis; não avalia candidatos.
Calibração final: ajuste no par anterior e calibração do intervalo no par posterior (incorpora a deriva entre ciclos); não testável fora da amostra.
Limitações
- Há apenas um teste walk-forward por ciclo. Não é possível medir o “humor do ciclo”; a cobertura em uma eleição futura pode ser menor que a medida.
- Só existem erros medidos para quem repetiu candidatura (por exemplo, apenas 31,7% dos vereadores de 2020 repetiram em 2024). A projeção é condicional a repetir.
- As métricas publicadas são as do teste walk-forward da receita (ajuste só no par anterior). O ajuste final, que usa os dois pares para projetar 2028 e 2030, segue a mesma receita, mas não pode mais ser testado fora da amostra; seu centro (última votação ou última × mediana de crescimento) pode diferir do usado no teste.
- Candidaturas com votação anterior pequena (menos de 50 votos) têm erros percentuais muito altos e são marcadas como de alta incerteza.
- O partido exibido é o da última candidatura, não necessariamente a filiação atual. O campo político (esquerda, centro, direita) é uma referência partidária não verificada e não altera as projeções.
- A projeção por bairro ou município foi retirada da versão anterior: sua calibração tinha vazamento de dados futuros e não foi revalidada.
- Os dados de 2026 vêm de boletins de urna e da API de resultados, até o TSE publicar o arquivo oficial final.
Dados insuficientes
- governador: Dados históricos insuficientes para projeção quantitativa confiável.
- senador: Dados históricos insuficientes para projeção quantitativa confiável.
- Deputado estadual e federal: Dados históricos insuficientes para projeção quantitativa confiável.
Reproduzir
npx tsx scripts/projecao/auditar.mts # auditoria do modelo anterior e da base npx tsx scripts/projecao/calibrar.mts # gera lib/projecao/modelo.json e projecao.db node --import tsx --test scripts/projecao/projecao.test.ts npm run build