PROJETO FINAL · CIÊNCIA DE DADOS · RECIFE

Sinistros de trânsito: o que os registros revelam?

Uma análise dos chamados de 2023 e 2024, com foco em mudanças temporais, distribuição territorial e presença de motocicletas.

Fonte: CTTU / Recife Dados abertos Análise exploratória em R

3.575
Chamados finalizados · 2023
4.897
Chamados finalizados · 2024
37.0%
Variação de chamados 2023 → 2024
75.8%
Com motocicleta em 2024
Como interpretar: os resultados descrevem chamados registrados, não todos os sinistros da cidade, nem o risco individual de circular por bairro ou veículo. Essa distinção é mantida em toda a análise.

1 Introdução

Os sinistros de trânsito constituem um problema de mobilidade e segurança viária. Compreender onde, quando e em quais situações os chamados são registrados pode ajudar a estabelecer prioridades de investigação, educação para o trânsito e planejamento urbano. Contudo, a existência de mais registros em um local não prova que ele apresente maior risco individual: exposição ao trânsito, intensidade de circulação e práticas de registro não estão medidas nesta base.

Problema de pesquisa: como os chamados de sinistros de trânsito finalizados variaram entre 2023 e 2024 e quais padrões territoriais, temporais e de veículos envolvidos se destacaram, sobretudo nos registros de 2024?

Objetivo geral: comparar os registros de 2023 e 2024 disponibilizados pela CTTU e aprofundar a análise exploratória de 2024, integrando uma tabela de bairros e Regiões Político-Administrativas (RPAs). O estudo enfatiza a qualidade dos dados, o processo de limpeza e os limites das conclusões.

Os resultados podem interessar a equipes de planejamento urbano, mobilidade, segurança viária, pesquisadores e cidadãos. O relatório é descritivo e exploratório; não pretende explicar causalmente os sinistros nem estimar taxas de risco da população sem denominadores adequados.

2 Fontes, pacotes e método

Fontes originais gratuitas:

Os arquivos de chamados registram protocolos, datas, situações administrativas, classificação da ocorrência, bairros, tipos de colisão e contagens associadas a participantes/veículos e vítimas. O arquivo territorial apresenta nomes de bairros e seus números de RPA. As três fontes são estruturadas, mas exigem correção de tipos, padronização textual, reconciliação de nomes, combinação das bases anuais e junção com a tabela territorial.

Pacote Finalidade
readr Importação de CSV e exportação de tabelas
dplyr e tidyr Limpeza, cruzamentos, agregação e transformação
stringr e stringi Normalização de nomes e conversão textual
ggplot2 e scales Gráficos e formatação de números
knitr e rmarkdown Documento reproduzível em HTML
DT Tabela interativa com busca e ordenação
plotly Gráfico interativo de evolução mensal

Metodologia: auditoria dos dois anos de registros; filtragem independente de chamados finalizados com data no ano correspondente; conversão de valores numéricos escritos com vírgula; padronização de bairros; junção à referência de RPAs; criação de indicadores de ano, mês, dia da semana, envolvimento de moto e natureza. Foram calculados totais e proporções comparáveis entre anos, seguidos de uma análise aprofundada de 2024. Não se inferem mudanças no número total real de acidentes, pois o registro de chamados pode ter sofrido alterações de cobertura e de classificação. Nenhuma linha foi criada artificialmente para atingir o número mínimo exigido.

3 Preparação e auditoria dos dados

3.1 Tamanho original e critérios de seleção

O arquivo original de 2024 contém 5.315 linhas e 37 colunas, satisfazendo o requisito de mais de 5 mil linhas e mais de 10 colunas na fonte principal. O arquivo auxiliar de 2023 tem 4.032 linhas e 37 colunas. Após filtrar data de 2024 e situação FINALIZADA, o conjunto analítico apresenta 4.897 chamados. O recorte final é menor por uma decisão metodológica explicada, e não altera a conformidade da base bruta com o enunciado.

knitr::kable(meta$auditoria, col.names = c("Etapa/indicador", "Quantidade"),
             caption = "Auditoria do dataset original e do recorte analítico")
Auditoria do dataset original e do recorte analítico
Etapa/indicador Quantidade
Linhas originais 5315
Colunas originais 37
Registros com data em 2024 5279
Registros com data em 2025 36
Chamados cancelados (todos os anos) 204
Chamados marcados como duplicidade (todos os anos) 181
Chamados finalizados com data em 2024 4897
Colunas inteiramente vazias 12
Bairros sem correspondencia de RPA no recorte final 6

Chamados marcados como CANCELADA, DUPLICIDADE e EM ATENDIMENTO não integram a análise final. Também foram encontrados registros com data no ano de 2025 dentro do arquivo nomeado 2024; eles foram excluídos do recorte, sem alterar arbitrariamente o ano. Os valores originais permanecem no CSV bruto para auditoria.

3.2 Comparabilidade e auditoria dos dois anos

Os arquivos têm os mesmos nomes de 37 variáveis, mas não necessariamente a mesma cobertura operacional. A tabela abaixo registra as escolhas de cada recorte. Em 2024 há registros datados de 2025; não os reclassificamos para 2024.

knitr::kable(comp$auditoria, caption = "Auditoria comparada dos CSVs brutos de 2023 e 2024")
Auditoria comparada dos CSVs brutos de 2023 e 2024
ano_arquivo linhas_originais colunas_originais datas_invalidas datas_fora_do_ano finalizados_no_ano cancelados duplicidades campos_inteiramente_vazios
2023 4032 37 0 0 3575 387 70 12
2024 5315 37 0 36 4897 204 181 12

As diferenças dos nomes de bairros foram harmonizadas com a mesma referência de RPAs e as mesmas equivalências. Não eliminamos chamados sem bairro para evitar perder registros: em 2023, 12 chamados ficaram sem RPA; em 2024 foram 6.

3.3 Ausências e limitações da coleta

Identificamos 12 colunas integralmente vazias no arquivo. Entre elas aparecem campos ligados a clima, conservação e sinalização viária; portanto não há evidência nesta base para comparar sinistros por chuva, clima ou condição da via.

knitr::kable(head(meta$faltantes, 17), digits = 1,
             col.names = c("Variável", "Ausentes", "Ausentes (%)"),
             caption = "Variáveis com mais valores ausentes no arquivo original")
Variáveis com mais valores ausentes no arquivo original
Variável Ausentes Ausentes (%)
acidente_verificado 5315 100.0
tempo_clima 5315 100.0
situacao_semaforo 5315 100.0
sinalizacao 5315 100.0
condicao_via 5315 100.0
conservacao_via 5315 100.0
ponto_controle 5315 100.0
situacao_placa 5315 100.0
velocidade_max_via 5315 100.0
mao_direcao 5315 100.0
divisao_via1 5315 100.0
divisao_via2 5315 100.0
num_semaforo 5116 96.3
sentido_via 4938 92.9
detalhe_endereco_acidente 4617 86.9
numero 2896 54.5
complemento 279 5.2

O campo hora apresenta somente valores de 01 a 12, sem identificação explícita de AM/PM. Não foram produzidas comparações por horário para evitar conclusões imprecisas. Os campos vitimas e vitimasfatais têm valores que também merecem validação na fonte; a análise de natureza usa a categoria fornecida por natureza, sem tratar totais de vítimas como contagem epidemiológica consolidada.

3.4 Cruzamento de bairros com RPAs

Os nomes dos bairros foram convertidos para uma chave padronizada (maiúsculas, sem acentos e sem espaços adicionais). Quatro diferenças de nomenclatura observadas nos dois arquivos foram reconciliadas manualmente:

knitr::kable(
  data.frame("Nome nos chamados" = names(meta$equivalencias),
             "Nome da base territorial" = unname(meta$equivalencias), check.names = FALSE),
  caption = "Equivalências explicitamente documentadas para a junção por bairro"
)
Equivalências explicitamente documentadas para a junção por bairro
Nome nos chamados Nome da base territorial
JOANA BEZERRA ILHA JOANA BEZERRA
BAIRRO DO RECIFE RECIFE
POCO DA PANELA POCO
ALTO SANTA TERESINHA ALTO SANTA TEREZINHA

Foi utilizado left_join com verificação de unicidade da referência territorial, para não multiplicar chamados. Após esse procedimento, 6 registros do recorte analítico permanecem sem RPA, em decorrência da ausência do bairro de origem; eles foram preservados na base tratada. Essas equivalências são harmonizações textuais que devem ser validadas se a base for usada para tomada de decisão operacional.

3.5 Novas variáveis e amostra da base final

Criamos mes, dia_semana, moto_envolvida, registro_com_vitima, classe_natureza, rpa_rotulo e nomes territoriais padronizados. No relatório, registro_com_vitima corresponde às categorias COM VÍTIMA e VÍTIMA FATAL, sem implicar que toda a população de sinistros da cidade esteja representada.

exemplo <- base %>%
  select(protocolo, data, bairro_exibicao, rpa_rotulo, tipo_exibicao,
         classe_natureza, moto, vitimas) %>%
  slice_head(n = 8)
knitr::kable(exemplo, caption = "Amostra compacta da base tratada (8 registros)")
Amostra compacta da base tratada (8 registros)
protocolo data bairro_exibicao rpa_rotulo tipo_exibicao classe_natureza moto vitimas
292972 2024-01-01 Vasco Da Gama RPA 3 COLISÃO LATERAL Com vítima 0 1
292973 2024-01-01 Vasco Da Gama RPA 3 COLISÃO Com vítima 1 1
292974 2024-01-01 Vasco Da Gama RPA 3 COLISÃO Com vítima 3 1
292980 2024-01-01 Arruda RPA 2 COLISÃO Com vítima 1 1
292985 2024-01-01 Boa Viagem RPA 6 COLISÃO Com vítima 1 1
293030 2024-01-02 Afogados RPA 5 COLISÃO LATERAL Com vítima 1 1
293034 2024-01-02 Barro RPA 5 COLISÃO Com vítima 1 1
293036 2024-01-02 Espinheiro RPA 3 COLISÃO Com vítima 1 1

4 Análise exploratória

4.1 Comparação temporal: o que mudou entre 2023 e 2024?

Os registros finalizados passaram de 3.575 em 2023 para 4.897 em 2024: são 1.322 chamados adicionais, variação de 37.0%. Essa é uma variação no banco de chamados finalizados registrados, não uma medida do crescimento real de todos os sinistros, pois não controlamos cobertura, exposição viária nem eventuais mudanças de atendimento e registro.

A comparação mês a mês permite perguntar se a diferença anual se distribuiu uniformemente ou se esteve concentrada em determinados períodos. Como temos somente dois anos, não caracterizamos uma tendência de longo prazo.

knitr::kable(
  comp$mensal %>% tidyr::pivot_wider(names_from = ano, values_from = chamados,
                                   names_prefix = "Chamados ") %>%
    mutate(Mês = c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun",
                   "Jul", "Ago", "Set", "Out", "Nov", "Dez")) %>%
    select(Mês, `Chamados 2023`, `Chamados 2024`),
  caption = "Comparação de chamados por mês de referência"
)
Comparação de chamados por mês de referência
Mês Chamados 2023 Chamados 2024
Jan 208 365
Fev 210 323
Mar 221 385
Abr 224 389
Mai 238 408
Jun 284 407
Jul 304 438
Ago 377 451
Set 394 473
Out 368 416
Nov 386 431
Dez 361 411

4.2 Motocicletas e vítimas: mudou o perfil dos chamados?

Além dos totais, comparamos proporções calculadas sobre chamados finalizados em cada ano. O campo moto mede a presença de ao menos uma motocicleta em um registro; a classificação natureza informa se o chamado foi identificado como COM VÍTIMA, SEM VÍTIMA ou VÍTIMA FATAL.

knitr::kable(
  comp$anual %>%
    select(ano, chamados, com_moto, percentual_com_moto,
           com_vitima, percentual_com_vitima, vitima_fatal),
  digits = 1,
  col.names = c("Ano", "Chamados", "Com moto", "Moto (%)", "Com vítima",
                "Com vítima (%)", "Categoria fatal"),
  caption = "Composição dos chamados finalizados em cada ano"
)
Composição dos chamados finalizados em cada ano
Ano Chamados Com moto Moto (%) Com vítima Com vítima (%) Categoria fatal
2023 3575 2520 70.5 3055 85.5 29
2024 4897 3710 75.8 4341 88.6 32

Uma diferença percentual entre os anos deve ser interpretada como diferença na composição dos registros, e não como probabilidade de acidente individual.

4.3 Bairros: quais tiveram maior quantidade de chamados em cada ano?

A padronização dos bairros permite juntar resultados do mesmo território nos dois anos. A figura compara os dez bairros com mais chamados em 2024 e mostra a quantidade registrada também em 2023, para os mesmos locais.

DT::datatable(
  comp$bairros %>%
    select(bairro_exibicao, chamados_2023, chamados_2024,
           diferenca_absoluta, diferenca_percentual) %>%
    mutate(diferenca_percentual = round(diferenca_percentual, 1)),
  rownames = FALSE,
  colnames = c("Bairro", "2023", "2024", "Diferença (chamados)", "Variação (%)"),
  options = list(pageLength = 10, scrollX = TRUE),
  caption = "Variação nos chamados por bairro; não equivale a mudança no risco de trânsito"
)

Cuidado com o tipo de sinistro: no banco de 2023 a categoria COLISÃO LATERAL foi muito mais utilizada proporcionalmente, enquanto em 2024 cresceu bastante a categoria genérica COLISÃO. Isso sugere diferenças no preenchimento ou classificação que precisam ser verificadas. Por esse motivo, não interpretamos mudanças em subtipos como mudanças reais na dinâmica viária.

knitr::kable(
  comp$tipos %>%
    group_by(ano) %>% slice_max(chamados, n = 5, with_ties = FALSE) %>%
    ungroup() %>% arrange(ano, desc(chamados)) %>%
    select(ano, tipo_exibicao, chamados, percentual_ano),
  digits = 1,
  col.names = c("Ano", "Classificação", "Chamados", "Participação (%)"),
  caption = "Cinco classificações mais comuns em cada ano (comparabilidade limitada)"
)
Cinco classificações mais comuns em cada ano (comparabilidade limitada)
Ano Classificação Chamados Participação (%)
2023 COLISÃO LATERAL 1385 38.7
2023 COLISÃO 515 14.4
2023 COLISÃO TRASEIRA 483 13.5
2023 COLISÃO FRONTAL 386 10.8
2023 ATROPELAMENTO DE PESSOA 201 5.6
2024 COLISÃO 2553 52.1
2024 COLISÃO LATERAL 1170 23.9
2024 COLISÃO TRASEIRA 358 7.3
2024 COLISÃO FRONTAL 249 5.1
2024 ATROPELAMENTO DE PESSOA 170 3.5

4.4 Panorama detalhado de 2024

Nos 4.897 chamados finalizados de 2024, 3.710 (75.8%) registram a presença de pelo menos uma motocicleta. As categorias COM VÍTIMA ou VÍTIMA FATAL representam 4.341 chamados; 32 estão classificados como VÍTIMA FATAL. Essas são frequências dentro da base de chamados, e não taxas de risco por usuário da via.
knitr::kable(res$natureza, digits = 1,
             col.names = c("Natureza", "Chamados", "Participação (%)"),
             caption = "Distribuição da classificação de natureza")
Distribuição da classificação de natureza
Natureza Chamados Participação (%)
Com vítima 4309 88.0
Sem vítima 556 11.4
Vítima fatal 32 0.7

4.5 Quando aconteceram os chamados?

Nesta seção aprofundamos somente os dados de 2024. A série mensal desse recorte mostra Set como o mês de maior contagem (473 chamados). A comparação entre 2023 e 2024 está na seção anterior; dois anos ainda são insuficientes para afirmar um padrão sazonal estável.

O gráfico interativo abaixo permite consultar os números por mês passando o mouse sobre os pontos. Esta é uma exploração da mesma série, não uma nova medição.

Também observamos diferenças entre dias da semana. Como as datas no fim do arquivo merecem uma checagem e não há informação de exposição no trânsito, o gráfico apresenta contagens, e não risco relativo por dia.

4.6 Onde os chamados se concentram?

O bairro com maior número absoluto de registros foi Boa Viagem, com 501 chamados, no recorte analisado. É um resultado de concentração de chamados registrados, que não permite classificar o bairro como mais perigoso sem dados de circulação, população exposta e extensão da malha viária.

O cruzamento com a tabela territorial torna possível comparar também as RPAs. Não dividimos pelo número de bairros como substituto de exposição, pois isso não seria uma taxa de risco válida.

knitr::kable(res$rpa_moto, digits = 1,
  col.names = c("RPA", "Chamados", "Com moto", "Com vítima", "Com moto (%)", "Com vítima (%)"),
  caption = "Perfil dos chamados por RPA; percentuais com denominador da respectiva RPA")
Perfil dos chamados por RPA; percentuais com denominador da respectiva RPA
RPA Chamados Com moto Com vítima Com moto (%) Com vítima (%)
RPA 6 1274 982 1168 77.1 91.7
RPA 4 826 641 737 77.6 89.2
RPA 1 809 542 659 67.0 81.5
RPA 3 800 599 701 74.9 87.6
RPA 5 626 488 560 78.0 89.5
RPA 2 556 457 514 82.2 92.4
Não informada 6 1 2 16.7 33.3

4.7 Quais tipos de ocorrência predominam?

A classificação COLISÃO aparece como a mais frequente. O conjunto também distingue colisões laterais, traseiras e frontais, atropelamentos, quedas e outros tipos. Não somamos esses subtipos como se fossem categorias de mesma granularidade; o gráfico segue os rótulos originais para manter rastreabilidade.

Uma segunda análise vai além do ranking: entre os tipos com pelo menos 50 chamados, comparamos a porcentagem de registros classificados com vítimas. Esta comparação é descritiva e reflete a seleção e o processo de registro da base.

knitr::kable(res$tipo_vitima, digits = 1,
  col.names = c("Tipo", "Chamados", "Com vítima", "Com vítima (%)"),
  caption = "Composição dos chamados por tipo (mínimo de 50 registros)")
Composição dos chamados por tipo (mínimo de 50 registros)
Tipo Chamados Com vítima Com vítima (%)
COLISÃO 2553 2431 95.2
COLISÃO LATERAL 1170 977 83.5
COLISÃO TRASEIRA 358 250 69.8
COLISÃO FRONTAL 249 232 93.2
ATROPELAMENTO DE PESSOA 170 169 99.4
CHOQUE 113 35 31.0
COLISÃO COM CICLISTA 84 84 100.0
QUEDA 73 70 95.9
COLISÃO TRANSVERSAL 60 53 88.3

4.8 Qual é o papel dos chamados com motocicletas?

A presença de moto foi definida como moto > 0: um chamado com duas motos conta uma vez nesse indicador. Para cada grupo, calculamos qual parcela foi classificada como contendo vítimas. A presença de moto em um chamado não prova responsabilidade pela ocorrência, tampouco representa risco individual de sofrer sinistro. O sistema de registros pode sub-representar determinados sinistros.

knitr::kable(res$moto %>% select(grupo, chamados, chamados_com_vitima, percentual_com_vitima),
  digits = 1, col.names = c("Grupo", "Chamados", "Com vítima", "Com vítima (%)"),
  caption = "Comparação das classificações com vítimas entre chamados com e sem moto")
Comparação das classificações com vítimas entre chamados com e sem moto
Grupo Chamados Com vítima Com vítima (%)
Sem moto 1187 706 59.5
Com moto 3710 3635 98.0

4.9 A composição muda entre RPAs?

Para comparar territórios de volumes diferentes sem confundir percentuais com contagens, construímos um mapa de calor da distribuição interna de naturezas por RPA. Cada linha territorial soma aproximadamente 100%, respeitando os limites de arredondamento.

4.10 Investigando diferenças entre bairros de forma interativa

Uma tabela interativa permite ordenar, pesquisar e comparar o total de chamados, o número de registros com moto e a proporção classificada com vítimas. Para reduzir flutuações em percentuais baseados em contagens muito baixas, mostramos somente bairros com pelo menos 30 chamados.

A figura mostra que volume absoluto e composição percentual de chamados são dimensões diferentes. Nenhuma delas, isoladamente, mede a periculosidade de um bairro.

5 Conclusões e limitações

Esta investigação integrou três CSVs públicos da Prefeitura do Recife: dois anos de chamados da CTTU e uma tabela territorial de bairros/RPAs. Os dados foram auditados, convertidos, padronizados e agregados para comparar 3.575 chamados finalizados de 2023 com 4.897 de 2024 e aprofundar o perfil de 2024.

Quatro descobertas se destacam:

  1. Variação dos registros: foram contabilizados 1.322 chamados finalizados a mais em 2024 (37.0%); o dado descreve aumento nos registros, não necessariamente aumento no total real de acidentes. As categorias de tipo de ocorrência também mudaram de forma importante, o que limita a comparabilidade dos subtipos.
  2. Concentração territorial: Boa Viagem apresentou a maior quantidade absoluta de chamados (501), enquanto a integração com RPAs permitiu ampliar a comparação espacial.
  3. Perfil dos veículos registrados: em 75.8% dos chamados finalizados consta ao menos uma motocicleta. A distribuição das classificações com vítimas difere entre os grupos com e sem moto; isso não demonstra causalidade nem probabilidade de acidente por veículo.
  4. Qualidade dos dados importa: o arquivo possui 12 variáveis integralmente vazias, datas fora do ano de referência e valores de horário sem definição de período. Essas limitações determinaram quais perguntas poderiam ser respondidas sem extrapolação indevida.

Implicações práticas: a combinação entre rankings territoriais e a composição por tipo/natureza pode auxiliar a priorizar estudos complementares, auditorias da coleta e ações educativas. Não constitui prova de que uma medida específica reduzirá sinistros, nem permite recomendar intervenções baseadas apenas em contagens absolutas.

Limitações: trata-se de base de chamados, não de um censo de todos os sinistros; alguns campos são incompletos; não temos veículos-km, população exposta, extensão das vias, intensidade do tráfego nem histórico comparativo suficientemente amplo (somente 2023 e 2024); e os nomes territoriais foram harmonizados por equivalências verificadas textualmente. Além disso, o arquivo 2024 inclui linhas datadas de dezembro de 2025, cujo ano original não foi presumido ou corrigido.

Próximas análises: ampliar a série para além de dois anos, validar alterações na classificação COLISÃO, confirmar datas e horários com a fonte, comparar os chamados com relatórios consolidados da CTTU e incorporar dados de fluxo viário para construir indicadores de exposição adequados.

6 Reprodutibilidade e materiais

A estrutura distribuída com o relatório contém os três CSVs originais, scripts independentes de preparação, análise e comparação, auditorias em CSV, indicadores em tabelas e gráficos em PNG. Para regenerar os resultados, execute 01_preparacao.R, depois 02_analise.R e por último 04_comparacao_anos.R, ou clique em Knit neste relatório.

Fontes primárias: Prefeitura do Recife / CTTU, conjunto “Chamados de sinistros (acidentes) de trânsito com e sem vítimas”, arquivos anuais 2023 e 2024; Prefeitura do Recife, “Bairros e RPAs do Recife”. Preparação documentada neste projeto.