Pular para o conteúdo

Lastro — índice técnico

Lastro reúne dados públicos do TSE e números agregados da conversa nas redes. Nenhuma conclusão está embutida: os painéis mostram números e deixam o cruzamento para quem analisa.


Painéis

Painéis
PáginaO que faz
**/** — inícioPágina de entrada: apresenta o Lastro, as três ferramentas, o modo de usar em quatro passos (com um exemplo calculado na hora pelo briefing), materiais para baixar e as regras da casa. Código em assets/inicio.js.
**/#/explorar** — exploradorDrill-down Brasil → região → estado → município com URL compartilhável; mapa, ranking, distribuição, relação entre indicadores e tabela (com CSV do recorte); ficha de cada território com participação, resultado presidencial, posição relativa, composição do eleitorado e abstenção por perfil 2022; comparação de até 4 territórios; modo escuro. Lê dados/ (gerado por ferramentas/gera_dados_app.py).
**/#/briefing** — briefing de públicoPara equipes de comunicação e audiovisual. Escolhe território (Brasil, região ou UF; sem capital; porte), público (gênero, faixa etária, escolaridade; atalhos prontos) e objetivo (persuadir, mobilizar, orientar o voto). Devolve público estimado, quanto dele ficou em aberto no 1º turno (abstenção, branco, nulo ou outro candidato, conforme o objetivo) e os 20 municípios onde ele mais se concentra, ordenados por volume (em eleição presidencial a margem municipal não muda o peso do voto), com link para os locais de votação no site independente Onde dá pra conversar; frases citáveis com fonte, diretrizes de conteúdo, o que não afirmar, cuidados legais, card PNG 1080×1350, CSV e link. Público estimado supõe independência entre gênero, idade e escolaridade (ordem de grandeza, não contagem); "indeciso" é aproximado por quem não escolheu nenhum finalista. Código em assets/briefing.js.
**/#/rede** — redes sociaisVolume e tom (negativo, neutro, positivo) da conversa sobre a eleição nas redes, por tema, termo e faixa de 4 h; picos e palavras mais ditas. Bluesky, mais um bloco de fontes abertas: buscas em alta do Google Trends ligadas à eleição, manchetes do Google Notícias por tema e vídeos de uma lista revisável de canais do YouTube (monitor/canais_youtube.json), em dados/rede/abertas.json. Só agregados: ferramentas/importa_rede.py copia do monitor-de-rede por lista fechada e recusa a gravação se encontrar link ou perfil. Avisos de representatividade e acurácia do classificador ficam na própria tela. Código em assets/rede.js.
**/relatorios/conjuntura-01/**Boletim de conjuntura nº 01, Quem não escolheu: perfil da abstenção, dos brancos e dos nulos (HTML e PDF). Gerado por ferramentas/relatorio_conjuntura.py + ferramentas/pdf_relatorio.js.
**/dashboard.html**Dashboard anterior, mantido para referência.
**/indicadores.html**Todos os indicadores da base como cor, ordenação e filtro, um mapa só. Para varredura rápida.
**/perfis.html**Abstenção por perfil demográfico. Escolhe-se a dimensão (faixa etária, escolaridade, gênero, estado civil) e o perfil; o mapa mostra a taxa de abstenção daquele perfil em cada município.
**/mudanca.html**Margem do 1º turno entre 1º e 2º colocado × votos em jogo × composição do eleitorado. Filtros por margem máxima, mínimo de eleitores e mínimo de escolaridade baixa.
**/abstencao.html**Abstenção 2026 por município × densidade de um público-alvo demográfico.
**/rio.html**Rio de Janeiro em detalhe: bairro → zona eleitoral → seção (12.809 seções).
**/cruzamento.html**Cruzamento. Nível (município · zona · seção por UF), dois indicadores (X e Y), busca e mínimo de eleitores. Mostra mapa, dispersão com correlação de Pearson, ranking, histograma e tabela — os 525 indicadores da base entram como opção. A seção é carregada sob demanda (um arquivo por UF).

Todos com fundo vetorial próprio (malha do IBGE) — sem serviço de tiles e sem chave de API.

Identidade visual

Tema claro único. Cores como papéis em assets/app.css (:root): verde-musgo #1F5C45 (principal), lilás #D9CCF5 (destaque), ocre #E39A4C (alerta e tom negativo), grafite #1B1D1A e pedra #F1F1EC. Fontes auto-hospedadas em assets/fontes/ (licença OFL, sem chamadas ao Google): Archivo condensada nos títulos, Hanken Grotesk no texto e IBM Plex Mono nos rótulos. Bordas de 2 px, cantos retos e sombras deslocadas. Cores de candidatos e a escala divergente do mapa não mudaram.

Acessibilidade

O dashboard e os painéis seguem práticas de acessibilidade verificáveis no próprio código:

Há um verificador estático no repositório: python3 a11y_check.py <arquivo.html>. Ele não substitui teste com leitor de tela, mas pega as falhas mais comuns.


Bases

Auditoria (07/10/2026): perfil e resultado conferem com os números oficiais do TSE até a unidade; ver [AUDITORIA.md](AUDITORIA.html).

dados/ — bases do explorador

Geradas por python3 ferramentas/gera_dados_app.py a partir de base_brasil_2026.csv e base_abst_perfil_2022.csv. Guardam contagens brutas por município; estado, região e Brasil são somados no navegador, então toda taxa é razão de somas. Rode o script de novo sempre que as bases da raiz mudarem.

base_uf_2026.csv e base_regiao_2026.csv — corrigidas em 10/2026

Reconstruídas por ferramentas/corrige_bases.py a partir da base municipal. A versão anterior somava c1_*…c12_* por posição (o 1º colocado de cada município, fosse quem fosse) e somava percentuais (Acre: c1_pct = 1403); margem_1o_2o_pts herdava o erro. Agora os votos são somados por candidato e reordenados no agregado, e toda taxa é razão de somas. Contagens (eleitores, comparecimento, perfil) não mudaram.

base_brasil_2026.csv — 5.757 linhas × 117 colunas

Uma linha por município. Fonte: portal oficial de resultados do TSE, eleição 2026 1º turno, totalização final; mais perfil do eleitorado 2026.

Colunas principais:

base_brasil_2026.csv — 5.757 linhas × 117 colunas
ColunaSignificado
uf, municipio, cod_municipio, regiaoidentificação
latitude, longitudecentroide do município (dos locais de votação)
eleitores_aptoseleitorado apto
comparecimento, abstencoesvotantes e faltosos
taxa_abstencao, taxa_comparecimentoinformadas pelo TSE
pct_abstencao, pct_brancos, pct_nulos, pct_validos% sobre eleitores aptos
votos_validos, brancos, nuloscontagens do 1º turno
secoes_totalizadas, secoes_totalseções
perfil_totaleleitorado no perfil 2026
faixa_*, escolaridade_*, genero_*, estado_civil_*, raca_*composição do eleitorado (contagens brutas)
c1_* … c12_*candidatos à Presidência por volume no município (nome, partido, votos, %)
margem_1o_2o_pts(votos 1º − votos 2º) ÷ comparecimento, em pontos

base_uf_2026.csv e base_regiao_2026.csv

Os mesmos indicadores agregados por estado (28 linhas) e por região (6 linhas).

base_abst_perfil_2022.csv — 216.507 linhas

Abstenção por perfil demográfico, por município. Formato longo: uma linha por município × dimensão × grupo. Fonte: TSE, Perfil de Comparecimento e Abstenção 2022, 1º turno.

base_abst_perfil_2022.csv — 216.507 linhas
ColunaSignificado
uf, cod_municipio, municipioidentificação
dimensaofaixa_etaria · escolaridade · genero · estado_civil · cor_raca
grupoex.: "21 a 24 anos", "ENSINO MÉDIO COMPLETO", "MASCULINO"
aptos, abstencoes, taxa_absttodas as faixas de idade (inclui voto facultativo)
aptos_obrig, abst_obrig, taxa_obrigsó voto obrigatório — este é o número correto

**Use taxa_obrig.** A taxa bruta mistura quem tem voto facultativo (16–17, 70 anos ou mais, analfabeto), o que infla artificialmente a abstenção dos extremos de idade.

base_secao_2026_<UF>.csv — 28 arquivos (27 UFs + ZZ), uma linha por seção eleitoral

Fonte: TSE, detalhe da apuração por seção eleitoral 2026 (eleitorado, comparecimento, abstenção, local de votação, modelo de urna) + votação por seção eleitoral 2026 (Presidente vem do arquivo nacional; Governador/Senador/Deputados do arquivo da UF) + eleitorado por local de votação 2026 (bairro, CEP, coordenadas).

base_secao_2026_<UF>.csv — 28 arquivos (27 UFs + ZZ), uma linha por seção eleitoral
ColunaSignificado
uf, regiao, cod_municipio, municipioidentificação
zona, secao, local_votacao, bairro, cepseção e local
latitude, longitudecoordenada do local de votação
aptos, comparecimento, abstencoes, taxa_abstencaoeleitorado e abstenção da seção
secao_instalada, secao_anulada, modelo_urnaestado da seção na eleição
pres_<candidato>, pres_branco, pres_nulovotos por candidato a Presidente na seção
gov_<candidato>, sen_<candidato>, gov_branco, gov_nulo, sen_branco, sen_nulocargos estaduais (só na UF)
votos_dep_federal, votos_dep_estadualtotal do cargo de deputado (o detalhe por candidato a deputado não entra: são centenas por UF)

Total: 497.897 seções. O layout é o mesmo nos 28 arquivos; o conjunto de colunas varia porque cada UF tem seus próprios candidatos.

base_zona_2026.csv — 6.106 linhas, uma por zona eleitoral

base_municipio_secao_2026.csv — 5.571 linhas, uma por município

Os mesmos indicadores de base_secao_2026_<UF>.csv, somados. É a base que o painel /cruzamento.html carrega na abertura.

base_candidato_zona_2026.csv — 198.666 linhas

Formato longo: uf, cod_municipio, municipio, zona, cargo, candidato, votos. Traz todos os candidatos majoritários (Presidente, Governador, Senador) por zona — não só os mais votados. Para comparar candidatos, filtre por cargo.

base_mudanca.csv, base_nacional.csv, base_rio.csv

Bases que alimentam os painéis mudanca, abstencao e rio.


Fontes e datas

Fontes e datas
DadoFonteData de referência
Abstenção, comparecimento, votos, candidatosTSE — portal oficial de resultadoseleição 2026, 1º turno, totalização final
Abstenção e votos por seção eleitoralTSE — dados abertos, "detalhe da apuração por seção eleitoral 2026" (gerado em 05/10/2026) e "votação por seção eleitoral 2026"eleição 2026, 1º turno
Local de votação, bairro, coordenadaTSE — dados abertos, "eleitorado por local de votação 2026" (gerado em 06/10/2026)2026, 1º turno
Composição do eleitoradoTSE — perfil do eleitorado 20262026
Abstenção por perfil demográficoTSE — perfil de comparecimento e abstenção2022, 1º turno
Contornos de estados e municípioIBGE — malhas territoriais—

Limitações — leia antes de usar em decisão

  1. Perfil demográfico é de 2022, não de 2026. O TSE publica abstenção por faixa/escolaridade/gênero até 2022. Para 2026 existe a abstenção geral por município (essa é de 2026), mas não aberta por demografia. O painel /perfis.html informa isso no cabeçalho.
  2. Composição demográfica não prediz voto nem abstenção. Testado em escala nacional: a correlação entre densidade dos perfis e taxa de abstenção é praticamente nula (−0,10). Use o perfil para saber com quem falar e onde ele está, não como previsão.
  3. Abstenção não é voto recuperável. Parte de quem falta não vota nem com mobilização (mudou de cidade, desencanto, dificuldade de acesso). Qualquer número de "votos recuperáveis" é teto teórico, nunca previsão.
  4. Margem não é volatilidade. Margem apertada indica disputa, não movimento. Comparar com 2022 exigiria a série histórica, que este portal do TSE não serve.
  5. Cor/raça é inutilizável. Predomina "NÃO INFORMADO" (no Rio, 4,7 milhões de 5 milhões). Por isso foi retirado do painel de perfis.
  6. Cobertura: 5.569 dos 5.757 municípios têm perfil e coordenada. Os 188 restantes são quase todos do exterior (seções no exterior não têm centroide no Brasil).
  7. **A coluna nulos omite 5.246 votos** que o TSE inclui no total oficial de nulos (3.674.249): em 1.668 municípios, comparecimento > válidos + brancos + nulos. Para o número oficial, use comparecimento − válidos − brancos (o explorador já faz isso).
  8. 40 localidades no exterior não tiveram votação (aptos > 0, comparecimento e abstenção zerados). O explorador mostra suas taxas em branco, não como 0%.
  9. Distrito Federal não consta do arquivo de abstenção por perfil 2022.
  10. Serra do Navio (AP) e Fernando de Noronha (PE) não têm local de votação geocodificado; recebem a coordenada da sede municipal.
  11. Alguns municípios têm seções sem dado de abstenção — são seções criadas após a eleição anterior. No Rio são 591 seções e 177.279 eleitores (3,6%), aparecendo marcadas no painel /rio.html.
  12. A base por seção não tem o exterior. O arquivo "detalhe da apuração por seção" do TSE traz o membro _ZZ (exterior) vazio. Por isso a soma das seções dá 157.646.356 aptos contra 158.745.463 do TSE — a diferença de 1.099.107 (0,69%) é praticamente toda do exterior (916.534 eleitores, que aparecem em base_uf_2026.csv). O resto — de 0,04% a 0,26% por UF — é diferença sistemática entre a soma das seções e o total oficial (seções não instaladas/anuladas e a nota de transferência temporária). Abstenções: 32.877.871 na base contra 33.469.244 do TSE (−1,77%), mesma causa. O relatório completo, UF por UF, está em /RELATORIO_AUDITORIA_SECAO.txt.
  13. Abstenção por seção inclui voto facultativo. No nível de seção não há como separar 16–17 anos, 70+ e analfabetos (isso só existe em base_abst_perfil_2022.csv, por município). taxa_abstencao é abstenção ÷ aptos, sem esse recorte.
  14. Voto de deputado não está por candidato. São centenas de candidatos por UF; na base por seção ficou só o total do cargo (votos_dep_federal, votos_dep_estadual). Para candidato a deputado, usar base_candidato_zona_2026.csv não resolve — ele cobre só os cargos majoritários.

Rotina das redes sociais

O código da coleta está em monitor/ (ver monitor/LEIA-ME.md). A coleta roda num computador onde a busca do Bluesky responde; um comando faz tudo:

python ferramentas/rotina_rede.py
  1. monitor/painel_pipeline.py atualizar (se mais de 5% das requisições falharem, para e não publica);
  2. painel_pipeline.py exportar;
  3. ferramentas/importa_rede.py (só agregados; recusa link ou perfil);
  4. commit de dados/rede/ e push para o main; a Vercel publica em seguida.

Para agendar a cada 4 horas: powershell -ExecutionPolicy Bypass -File ferramentas\agenda_rotina_rede.ps1. Cada execução fica registrada em ferramentas/rotina_rede.log. Nova fonte: o monitor exporta os mesmos arquivos numa pasta própria e a rotina roda com --fonte youtube (ou outra).

Como reproduzir

Bases do repositório, nesta ordem:

python3 ferramentas/corrige_bases.py    # agregados UF/região + coordenadas faltantes + dicionário
python3 ferramentas/gera_dados_app.py   # dados/ do explorador
python3 ferramentas/valida_bases.py     # integridade; sai com erro se uma base contradiz outra
python3 ferramentas/audita_bases.py     # confronto com números oficiais do TSE + testes forenses
python3 ferramentas/aplica_paineis.py   # painéis temáticos: dados inline, lógica em assets/paineis/

Painéis temáticos — dados e comportamento separados. Os geradores emitem cada painel com os dados inline (const PTS=…, const P=… etc.). aplica_paineis.py mantém só essas linhas e liga o painel a assets/mapa-tematico.js (mapa, escala de cor com legenda, lista acessível, "ver tudo", foco no item) e a assets/paineis/<painel>.js. Rode-o depois de qualquer regeração: sem ele, o painel volta à lógica antiga (arco-íris sem legenda, mapa achatado pelo layout).

valida_bases.py tem que terminar com 0 erro(s) antes de publicar. Os avisos que ele emite são características conhecidas do dado do TSE (listadas também em "Limitações").

Os geradores dos painéis temáticos ficam em ~/contra-desinfo/ (fora do repositório): base_final.py, abst_perfil_2022.py, base_secao_2026.py (base por seção, zona e município), agrega_candidato_zona.py, painel_*.py (inclui painel_cruzamento.py), painel.py (Rio), vetorial.py, gera_dicionario.py, auditoria_secao.py, harness.js, teste_numerico.js, a11y_check.py, publicar.sh, publicar_secao.sh. Dois cuidados: o painel antigo agora se chama dashboard.html — se publicar.sh ainda escreve index.html, ele apaga o explorador; e se base_final.py regerar base_uf_2026.csv/base_regiao_2026.csv, o erro dos c*_ volta. Rode corrige_bases.py depois dele, ou corrija a soma lá.