Fonte: CTTU / Recife Dados abertos Análise exploratória em R
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.
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.
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")
| 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.
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")
| 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.
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á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.
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"
)
| 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.
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)")
| 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 |
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"
)
| 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 |
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"
)
| 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.
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)"
)
| 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 |
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")
| Natureza | Chamados | Participação (%) |
|---|---|---|
| Com vítima | 4309 | 88.0 |
| Sem vítima | 556 | 11.4 |
| Vítima fatal | 32 | 0.7 |
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.
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")
| 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 |
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)")
| 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 |
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")
| Grupo | Chamados | Com vítima | Com vítima (%) |
|---|---|---|---|
| Sem moto | 1187 | 706 | 59.5 |
| Com moto | 3710 | 3635 | 98.0 |
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.
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.
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:
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.
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.