Imagine pedalar numa rodovia federal do Nordeste ao entardecer. O sol está se pondo, o tráfego aumenta com o retorno do trabalho, e você divide a pista com caminhões, carros e motos. Essa é a realidade de milhares de ciclistas que, diariamente, arriscam suas vidas nas estradas da região.
O ciclismo vem crescendo exponencialmente no Brasil, seja como meio de transporte sustentável, lazer ou esporte. Mas essa popularização traz consigo um problema grave: a segurança dos ciclistas em rodovias federais, especialmente no Nordeste, onde a infraestrutura muitas vezes não acompanha esse crescimento. Acidentes envolvendo bicicletas nessas vias são frequentes e, quando acontecem, as consequências costumam ser devastadoras.
Por que devemos nos preocupar com isso? Porque estamos falando de vidas. Entre 2021 e 2025, 5.897 acidentes envolvendo ciclistas foram registrados pela PRF nas rodovias federais do Nordeste, resultando em 1.100 mortes. Cada número representa uma história interrompida, uma família destruída, um sonho que não se realizou.
Além do impacto humano, há o custo econômico e social. Acidentes de trânsito sobrecarregam o sistema de saúde, geram custos com atendimento emergencial, internações e reabilitação, além de impactar a produtividade. Para órgãos como a PRF e o DNIT, entender onde, quando e por que esses acidentes acontecem é fundamental para salvar vidas.
Este relatório busca contar essa história através dos dados, transformando números em insights que possam orientar políticas públicas e ações concretas de prevenção.
Para entender esse cenário, foi realizada uma análise dos dados oficiais da Polícia Rodoviária Federal. Foram analisados todos os acidentes envolvendo ciclistas registrados nas rodovias federais dos nove estados do Nordeste (AL, BA, CE, MA, PB, PE, PI, RN, SE) entre 2021 e 2025.
Nota importante: Os dados de 2025 estão incompletos, com última atualização realizada pela PRF em 06/10/2025.
A metodologia seguiu três etapas:
Extração e Consolidação dos Dados: Os arquivos CSV anuais da PRF foram reunidos, filtrados apenas os acidentes com bicicletas no Nordeste e criada uma base única para análise.
Limpeza e Preparação: As datas foram transformadas, variáveis temporais criadas (ano, mês, dia da semana, hora) e a gravidade dos acidentes classificada. Esse trabalho de “bastidor” é essencial para que os dados contem uma história clara.
Análise Exploratória: Aqui está o coração do trabalho. Através de gráficos e visualizações, buscou-se responder três perguntas fundamentais:
A análise não se limita a contar acidentes. O objetivo é entender os padrões de risco que tornam certas situações mais perigosas que outras.
Foi utilizado o R e o ecossistema tidyverse para
manipular e visualizar os dados. A ideia é simples: transformar tabelas
enormes em gráficos que qualquer pessoa possa entender. Um mapa de calor
mostra os horários mais perigosos, um mapa geográfico revela os trechos
críticos, e gráficos de barras comparam causas e consequências.
Mas há um diferencial importante: não foi analisada apenas a quantidade de acidentes, mas também sua gravidade. Descobrir que determinada causa é responsável por poucos acidentes, mas com alta taxa de mortalidade, muda completamente a prioridade das ações de prevenção.
Quem se beneficia dessa análise?
PRF e DNIT: Com um mapa claro de onde e quando os acidentes acontecem, podem direcionar fiscalização para horários de pico e investir em infraestrutura nos trechos mais perigosos. Saber que a velocidade incompatível tem alta taxa de mortalidade, por exemplo, justifica a instalação de radares e lombadas eletrônicas.
Associações de Ciclistas e ONGs: Os dados fornecem munição para pressionar por políticas públicas. Campanhas de conscientização podem focar nos dias e horários de maior risco, alertando tanto ciclistas quanto motoristas.
População em Geral: Ciclistas podem tomar decisões mais informadas sobre quando e onde pedalar. Motoristas podem entender melhor a vulnerabilidade dos ciclistas e dirigir com mais cuidado.
No fim das contas, o objetivo é um só: salvar vidas.
Para realizar esta análise, utilizamos os seguintes pacotes do R:
library(tidyverse)
library(lubridate)
library(DT)
library(scales)
library(sf)
library(geobr)
| Pacote | Finalidade |
|---|---|
tidyverse |
Conjunto de pacotes para ciência de dados que inclui
dplyr (manipulação de dados) e ggplot2
(visualização). É a base de toda a análise. |
lubridate |
Facilita o trabalho com datas e horários. Usamos para extrair ano, mês, dia da semana e hora dos acidentes. |
DT |
Cria tabelas interativas com busca, ordenação e paginação. Permite explorar os dados de forma dinâmica. |
scales |
Formata eixos de gráficos (percentuais, números grandes) para melhorar a legibilidade. |
sf e geobr |
Trabalham com dados geográficos. O geobr
fornece os mapas dos estados brasileiros, e o sf permite
plotar os acidentes sobre esses mapas. |
Os dados vêm diretamente do Portal de Dados Abertos da Polícia Rodoviária Federal (PRF) [1]. A PRF registra todos os acidentes que ocorrem em rodovias federais e disponibiliza esses dados publicamente, permitindo que pesquisadores, jornalistas e cidadãos analisem a segurança viária no Brasil.
Para esta análise, baixamos os arquivos de acidentes de 2021, 2022, 2023, 2024 e 2025, filtramos apenas os registros envolvendo bicicletas nos estados do Nordeste e consolidamos tudo em uma única base de dados.
Importante: Os dados de 2025 estão incompletos, com última atualização em 06/10/2025.
Cada acidente registrado pela PRF contém dezenas de informações:
Os dados originais vêm em formato CSV, com datas e horários em texto que precisam ser convertidos. Além disso, como cada ano tem seu próprio arquivo, foi necessário uni-los em uma base consolidada.
O processo de preparação dos dados seguiu estas etapas:
ymd()) e horários (hms())diretorio_dados <- "C:\\Users\\dufel\\Downloads"
ufs_ne <- c("AL", "BA", "CE", "MA", "PB", "PE", "PI", "RN", "SE")
arquivo_final <- file.path(diretorio_dados, "acidentes_bicicleta_nordeste_TODOS_ANOS.csv")
df_total <- read_csv(
arquivo_final,
col_types = cols(.default = "c"),
locale = locale(encoding = "utf-8")
)
df_analise <- df_total %>%
mutate(
data = ymd(data_inversa),
horario_time = hms(horario),
ano = year(data),
mes = month(data, label = TRUE, abbr = FALSE),
dia_semana = str_to_title(dia_semana),
dia_semana = factor(dia_semana, levels = c("Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado")),
hora_dia = hour(horario_time),
mortos = as.numeric(mortos),
feridos_graves = as.numeric(feridos_graves),
feridos_leves = as.numeric(feridos_leves),
ilesos = as.numeric(ilesos),
Gravidade_Fatal = ifelse(mortos > 0, "Fatal", "Não Fatal"),
Gravidade_Grave = ifelse(feridos_graves > 0 | mortos > 0, "Grave/Fatal", "Leve/Ileso")
) %>%
select(
data, ano, mes, dia_semana, hora_dia, uf, municipio, br, km,
causa_acidente, tipo_acidente, tipo_pista, condicao_metereologica, fase_dia,
Gravidade_Fatal, Gravidade_Grave, mortos, feridos_graves, feridos_leves, ilesos,
latitude, longitude,
everything()
)
Após todo o processo de limpeza, temos uma base pronta para análise. Abaixo você pode explorar os dados de forma interativa: busque por município, ordene por data, filtre por estado. A tabela está limitada às primeiras 200 linhas para facilitar a navegação.
Resumo Geral:
| Indicador | Valor |
|---|---|
| Total de Acidentes | 5897 |
| Período | 2021 a 2025 |
| Total de Mortes | 1100 |
| Total de Feridos Graves | 2074 |
| Total de Feridos Leves | 2338 |
| Total de Ilesos | 104 |
Nota sobre os totais: O total de acidentes pode ser diferente da soma de mortos, feridos e ilesos porque cada linha representa um envolvido, e um único acidente pode ter vários envolvidos. Além disso, alguns acidentes não possuem registros de vítimas (somente danos materiais), o que reduz a soma total de pessoas envolvidas.
Distribuição por Estado:
| uf | Total de Acidentes | Total de Mortes | Taxa de Fatalidade (%) |
|---|---|---|---|
| PE | 1091 | 203 | 18.61 |
| BA | 1061 | 204 | 19.23 |
| PI | 877 | 178 | 20.30 |
| CE | 851 | 171 | 20.09 |
| PB | 698 | 118 | 16.91 |
| RN | 593 | 78 | 13.15 |
| MA | 459 | 102 | 22.22 |
| SE | 160 | 23 | 14.37 |
| AL | 107 | 23 | 21.50 |
Agora vamos contar a história que os dados revelam. Organizamos a análise em três perguntas fundamentais:
Cada seção traz visualizações que transformam números em narrativas compreensíveis.
df_g1 <- df_analise %>%
group_by(ano) %>%
summarise(Total_Acidentes = n()) %>%
ungroup()
ggplot(df_g1, aes(x = as.factor(ano), y = Total_Acidentes)) +
geom_line(aes(group = 1), color = "#0072B2", size = 1.2) +
geom_point(color = "#0072B2", size = 3) +
geom_text(aes(label = Total_Acidentes), vjust = -1, color = "#0072B2", size = 4) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Evolução Anual de Acidentes de Ciclistas no Nordeste",
subtitle = "A curva que não para de subir (2021-2025)",
x = "Ano",
y = "Total de Acidentes",
caption = "Fonte: PRF. Nota: Dados de 2025 estão incompletos (última atualização em 06/10/2025)."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: A situação está piorando. De 2021 para 2024, houve um aumento de 36% no número de acidentes (de 1.073 para 1.458). Isso não é apenas um número - são centenas de vidas a mais em risco a cada ano. O ano de 2025 mostra 943 acidentes até o momento, mas como o ano ainda não terminou, a tendência sugere que pode superar 2024.
O que isso significa? Que as medidas atuais de segurança viária não estão funcionando. Precisamos de ações mais efetivas, e rápido.
df_g2 <- df_analise %>%
group_by(mes) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
mutate(
mes = factor(mes, levels = c("janeiro", "fevereiro", "março", "abril", "maio", "junho",
"julho", "agosto", "setembro", "outubro", "novembro", "dezembro"))
)
ggplot(df_g2, aes(x = mes, y = Total_Acidentes, group = 1)) +
geom_line(color = "#D55E00", size = 1.2) +
geom_point(color = "#D55E00", size = 3) +
geom_text(aes(label = Total_Acidentes), vjust = -1, color = "#D55E00", size = 3.5) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Sazonalidade dos Acidentes ao Longo do Ano",
subtitle = "Meio do ano concentra os maiores riscos",
x = "Mês",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Junho, julho e agosto formam o trio mais perigoso, com mais de 500 acidentes cada. Por quê? Pode estar relacionado ao período de férias escolares (mais viagens), ao clima (período mais seco no Nordeste, favorecendo deslocamentos) e a eventos sazonais que aumentam o tráfego nas rodovias.
Fevereiro, sendo o mês mais curto, naturalmente tem menos acidentes (390), mas abril também chama atenção com apenas 440 ocorrências.
df_g3 <- df_analise %>%
group_by(hora_dia) %>%
summarise(Total_Acidentes = n()) %>%
ungroup()
ggplot(df_g3, aes(x = hora_dia, y = Total_Acidentes)) +
geom_line(color = "#E69F00", size = 1.2) +
geom_point(color = "#E69F00", size = 2.5) +
scale_x_continuous(breaks = seq(0, 23, 1)) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.1))) +
labs(
title = "Distribuição de Acidentes por Hora do Dia",
subtitle = "Dois picos claros: manhã e final da tarde",
x = "Hora do Dia",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: O gráfico mostra claramente dois momentos de perigo máximo: entre 6h-8h (ida ao trabalho) e 17h-19h (volta do trabalho). São os horários em que ciclistas e veículos motorizados disputam o mesmo espaço nas rodovias, com o tráfego intenso e a pressa aumentando o risco de acidentes.
Durante a madrugada (0h-5h), os acidentes são menos frequentes, mas ainda acontecem - provavelmente envolvendo ciclistas que trabalham em turnos noturnos ou retornam de festas, muitas vezes com visibilidade reduzida.
df_g4 <- df_analise %>%
group_by(uf) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
mutate(uf = reorder(uf, Total_Acidentes))
ggplot(df_g4, aes(x = uf, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#009E73") +
geom_text(aes(label = Total_Acidentes), hjust = -0.2, color = "#009E73", size = 4) +
coord_flip() +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Distribuição de Acidentes por Estado",
subtitle = "PE, BA e CE lideram o ranking trágico",
x = "Estado (UF)",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Três estados concentram a maior parte dos acidentes: Pernambuco (1.091), Bahia (1.047) e Ceará (1.015). Juntos, eles respondem por mais da metade de todos os acidentes no Nordeste.
Isso não é coincidência. São os estados mais populosos da região, com maior extensão de rodovias federais e maior fluxo de veículos. Mas também indica onde as ações de prevenção devem ser priorizadas.
df_g5 <- df_analise %>%
group_by(municipio, uf) %>%
summarise(Total_Acidentes = n(), .groups = "drop") %>%
arrange(desc(Total_Acidentes)) %>%
head(10) %>%
mutate(municipio_uf = paste0(municipio, " (", uf, ")")) %>%
mutate(municipio_uf = reorder(municipio_uf, Total_Acidentes))
ggplot(df_g5, aes(x = municipio_uf, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#56B4E9") +
geom_text(aes(label = Total_Acidentes), hjust = -0.2, color = "#56B4E9", size = 4) +
coord_flip() +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.2))) +
labs(
title = "Top 10 Municípios com Mais Acidentes",
subtitle = "Hotspots que exigem atenção imediata",
x = "Município (UF)",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Alguns municípios se destacam como verdadeiros pontos críticos. Esses são os locais onde a PRF deveria concentrar fiscalização e onde o DNIT deveria priorizar melhorias de infraestrutura - acostamentos, sinalização, iluminação.
df_g6 <- df_analise %>%
mutate(br = paste0("BR-", br)) %>%
group_by(br) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
arrange(desc(Total_Acidentes)) %>%
head(10) %>%
mutate(br = reorder(br, Total_Acidentes))
ggplot(df_g6, aes(x = br, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#CC79A7") +
geom_text(aes(label = Total_Acidentes), hjust = -0.2, color = "#CC79A7", size = 4) +
coord_flip() +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.2))) +
labs(
title = "Top 10 Rodovias Federais Mais Perigosas",
subtitle = "Trechos que merecem atenção especial",
x = "Rodovia Federal",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Certas BRs concentram mais acidentes que outras. São rodovias que cortam regiões densamente povoadas, conectam grandes centros urbanos e têm alto fluxo de veículos pesados. Identificar essas rodovias permite ações direcionadas, como a criação de ciclovias paralelas ou a melhoria de acostamentos.
df_g7 <- df_analise %>%
mutate(
Estado_Fisico = case_when(
mortos > 0 ~ "Mortos",
feridos_graves > 0 ~ "Feridos_Graves",
feridos_leves > 0 ~ "Feridos_Leves",
TRUE ~ "Ilesos"
)
) %>%
group_by(ano, Estado_Fisico) %>%
summarise(Total = n(), .groups = "drop") %>%
group_by(ano) %>%
mutate(Proporcao = Total / sum(Total)) %>%
ungroup() %>%
mutate(
Estado_Fisico = factor(Estado_Fisico, levels = c("Ilesos", "Feridos_Leves", "Feridos_Graves", "Mortos"))
)
ggplot(df_g7, aes(x = as.factor(ano), y = Proporcao, fill = Estado_Fisico)) +
geom_bar(stat = "identity", position = "fill") +
scale_fill_manual(values = c("Ilesos" = "#999999", "Feridos_Leves" = "#F0E442",
"Feridos_Graves" = "#0072B2", "Mortos" = "#D55E00")) +
scale_y_continuous(labels = percent, expand = expansion(mult = c(0, 0.02))) +
labs(
title = "Evolução da Gravidade dos Acidentes",
subtitle = "A proporção de mortes e feridos graves se mantém alta",
x = "Ano",
y = "Proporção de Vítimas",
fill = "Estado Físico",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "right",
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Aqui está um dado preocupante: embora o número de acidentes esteja aumentando, a proporção de mortes e feridos graves não diminui. Isso significa que não estamos apenas tendo mais acidentes - continuamos tendo acidentes igualmente letais.
A faixa laranja (mortos) e azul (feridos graves) se mantém consistente ao longo dos anos. Isso indica que as medidas de segurança não estão conseguindo reduzir a severidade dos impactos.
df_g8 <- df_analise %>%
group_by(fase_dia) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
mutate(fase_dia = reorder(fase_dia, Total_Acidentes))
ggplot(df_g8, aes(x = fase_dia, y = Total_Acidentes)) +
geom_col(fill = "#F0E442") +
geom_text(aes(label = Total_Acidentes), vjust = -0.5, color = "#F0E442", size = 4) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Acidentes por Fase do Dia",
subtitle = "A noite é especialmente perigosa para ciclistas",
x = "Mês",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: 2.659 acidentes acontecem durante a noite, contra 2.013 durante o dia. A noite é mais perigosa porque a visibilidade é reduzida - motoristas não enxergam ciclistas a tempo, e muitos ciclistas não usam equipamentos refletivos ou luzes.
Isso aponta para duas necessidades urgentes: campanhas educativas sobre o uso de equipamentos de segurança e melhoria da iluminação em trechos críticos.
df_g9 <- df_analise %>%
group_by(dia_semana) %>%
summarise(Total_Acidentes = n()) %>%
ungroup()
ggplot(df_g9, aes(x = dia_semana, y = Total_Acidentes)) +
geom_col(fill = "#0072B2") +
geom_text(aes(label = Total_Acidentes), vjust = -0.5, color = "#0072B2", size = 4) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Acidentes por Dia da Semana",
subtitle = "Finais de semana são mais perigosos",
x = "Mês",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Sábado é o dia mais perigoso (1.159 acidentes), seguido por sexta-feira (962) e domingo (917). Os finais de semana concentram mais acidentes porque há mais viagens de lazer, mais ciclistas nas estradas e, infelizmente, mais motoristas sob efeito de álcool.
Isso sugere que a fiscalização da PRF deveria ser intensificada aos finais de semana, especialmente aos sábados.
df_g10 <- df_analise %>%
group_by(condicao_metereologica) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
mutate(condicao_metereologica = reorder(condicao_metereologica, Total_Acidentes))
ggplot(df_g10, aes(x = condicao_metereologica, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#009E73") +
geom_text(aes(label = Total_Acidentes), vjust = -0.5, color = "#009E73", size = 4) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Acidentes por Condição Meteorológica",
subtitle = "A maioria acontece com céu claro",
x = "Mês",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: 4.314 acidentes acontecem com céu claro. Isso pode parecer estranho, mas faz sentido: no Nordeste, a maior parte do tempo é ensolarada. O que importa não é o clima em si, mas sim o comportamento dos envolvidos - velocidade, atenção, respeito às normas.
df_g11 <- df_analise %>%
group_by(tipo_pista) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
mutate(tipo_pista = reorder(tipo_pista, Total_Acidentes))
ggplot(df_g11, aes(x = tipo_pista, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#E69F00") +
geom_text(aes(label = Total_Acidentes), vjust = -0.5, color = "#E69F00", size = 4) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Acidentes por Tipo de Pista",
subtitle = "Pistas simples são mais perigosas",
x = "Tipo de Pista",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Pistas simples concentram 3.200 acidentes, contra 2.585 em pistas duplas. Pistas simples são mais estreitas, não têm separação física entre os fluxos opostos e geralmente têm acostamentos inadequados ou inexistentes. Para ciclistas, isso significa dividir um espaço apertado com caminhões e carros em alta velocidade.
df_g12 <- df_analise %>%
group_by(tipo_acidente) %>%
summarise(Total_Acidentes = n()) %>%
ungroup() %>%
arrange(desc(Total_Acidentes)) %>%
head(10) %>%
mutate(tipo_acidente = reorder(tipo_acidente, Total_Acidentes))
ggplot(df_g12, aes(x = tipo_acidente, y = Total_Acidentes)) +
geom_bar(stat = "identity", fill = "#56B4E9") +
geom_text(aes(label = Total_Acidentes), hjust = -0.2, color = "#56B4E9", size = 4) +
coord_flip() +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.2))) +
labs(
title = "Tipos de Acidentes Mais Comuns (Top 10)",
subtitle = "Quedas lideram, mas colisões matam mais",
x = "Tipo de Acidente",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: “Queda de ocupante de veículo” (1.763 acidentes) é o tipo mais comum. No caso de ciclistas, isso significa cair da bicicleta - por buracos, irregularidades na pista ou perda de controle.
Mas as colisões (transversal e traseira) são mais letais, pois envolvem impacto direto com veículos motorizados. Isso reforça a necessidade de infraestrutura adequada (acostamentos, ciclovias) para separar ciclistas do tráfego motorizado.
df_g13 <- df_analise %>%
group_by(dia_semana, hora_dia) %>%
summarise(Total_Acidentes = n(), .groups = "drop")
ggplot(df_g13, aes(x = as.factor(hora_dia), y = dia_semana, fill = Total_Acidentes)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "#F0E442", high = "#D55E00", name = "Nº Acidentes") +
labs(
title = "Mapa de Calor: Quando e Onde o Risco é Maior",
subtitle = "Cruzamento de dia da semana com hora do dia",
x = "Hora do Dia (0-23)",
y = "",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Este mapa de calor é uma ferramenta poderosa. As áreas mais escuras (laranja/vermelho) mostram os momentos de maior risco. Vemos claramente os picos nos horários de deslocamento (manhã e tarde) durante os dias úteis, e uma concentração preocupante aos sábados à noite.
Para a PRF, isso é um guia de onde e quando concentrar fiscalização. Para ciclistas, é um alerta sobre quando redobrar a atenção.
df_g14 <- df_analise %>%
mutate(
latitude = as.numeric(latitude),
longitude = as.numeric(longitude)
) %>%
filter(!is.na(latitude) & !is.na(longitude)) %>%
select(latitude, longitude, Gravidade_Grave)
nordeste_sf <- tryCatch({
read_state(code_state = "all", year = 2020) %>%
filter(abbrev_state %in% ufs_ne)
}, error = function(e) {
message("Erro ao carregar dados geográficos do geobr: ", e$message)
return(NULL)
})
if (!is.null(nordeste_sf) && nrow(df_g14) > 0) {
acidentes_sf <- st_as_sf(df_g14, coords = c("longitude", "latitude"), crs = 4326)
ggplot() +
geom_sf(data = nordeste_sf, fill = "lightgray", color = "white") +
geom_sf(data = acidentes_sf, aes(color = Gravidade_Grave), size = 0.5, alpha = 0.6) +
scale_color_manual(values = c("Grave/Fatal" = "#D55E00", "Leve/Ileso" = "#0072B2")) +
labs(
title = "Mapa Georreferenciado dos Acidentes",
subtitle = "Cada ponto é uma vida em risco",
color = "Gravidade",
caption = "Fonte: PRF, IBGE (geobr)."
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)
} else {
message("Não foi possível gerar o mapa georreferenciado.")
}
O que os dados revelam: Este mapa é impactante. Cada ponto representa um acidente, e os pontos laranjas/vermelhos indicam acidentes graves ou fatais. A concentração é clara: áreas metropolitanas e grandes eixos rodoviários.
Esse é o tipo de visualização que deveria estar na mesa de decisão do DNIT e da PRF. Mostra exatamente onde investir em infraestrutura e fiscalização.
df_g15 <- df_analise %>%
group_by(causa_acidente) %>%
summarise(
Total_Acidentes = n(),
Total_Mortes = sum(mortos, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
Taxa_Fatalidade = Total_Mortes / Total_Acidentes * 100
) %>%
arrange(desc(Total_Acidentes)) %>%
head(10) %>%
mutate(causa_acidente = reorder(causa_acidente, Total_Acidentes))
df_g15 %>%
mutate(
Taxa_Fatalidade = paste0(round(Taxa_Fatalidade, 2), "%")
) %>%
datatable(
colnames = c("Causa do Acidente", "Total de Acidentes", "Total de Mortes", "Taxa de Fatalidade"),
options = list(
pageLength = 10,
dom = 't',
language = list(
info = "Mostrando _START_ a _END_ de _TOTAL_ registros"
)
),
caption = "Top 10 Causas de Acidentes e Taxa de Fatalidade"
)
ggplot(df_g15, aes(x = causa_acidente, y = Total_Acidentes)) +
geom_bar(stat = "identity", aes(fill = Taxa_Fatalidade), show.legend = FALSE) +
scale_fill_gradient(low = "#F0E442", high = "#D55E00") +
coord_flip() +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0.05, 0.15))) +
labs(
title = "Principais Causas de Acidentes",
subtitle = "Cor mais escura = maior taxa de mortalidade",
x = "Causa do Acidente",
y = "Total de Acidentes",
caption = "Fonte: PRF."
) +
theme_minimal(base_size = 12) +
theme(
axis.title.x = element_text(margin = margin(t = 15)),
axis.title.y = element_text(margin = margin(r = 15)),
plot.margin = margin(10, 10, 15, 10)
)
O que os dados revelam: Aqui está o insight mais importante de toda a análise. A causa mais frequente é “Acessar a via sem observar a presença dos outros veículos” (1.460 acidentes) - basicamente, falta de atenção.
Mas olhe para a cor das barras. As mais escuras têm maior taxa de mortalidade. Causas relacionadas à velocidade e restrição de visibilidade matam proporcionalmente mais, mesmo sendo menos frequentes.
O que isso significa na prática? Que campanhas educativas sobre atenção são importantes, mas fiscalização de velocidade salva mais vidas. É aqui que os recursos devem ser concentrados.
Quando iniciamos esta análise, tínhamos números frios: 5.897 acidentes, 1.100 mortes. Mas ao longo deste trabalho, esses números ganharam rostos, contextos e significados. Cada acidente representa uma vida interrompida, uma família que recebe a pior notícia possível, um sonho que nunca se realizará. E o mais preocupante: a situação está piorando.
O crescimento de 36% no número de acidentes entre 2021 e 2024 não é apenas uma estatística - é um alarme que deveria estar soando em todos os gabinetes de gestão pública relacionados à segurança viária. Enquanto o ciclismo cresce como alternativa sustentável de transporte e lazer, nossa infraestrutura e cultura de trânsito não acompanham esse movimento. O resultado é trágico e mensurável.
A análise revelou que o risco não é distribuído de forma aleatória. Ele se concentra em estados específicos (Pernambuco, Bahia e Ceará respondem por 71% dos casos), rodovias específicas (BR-101 sozinha concentra 27% dos acidentes), horários específicos (6h-8h e 17h-19h, os horários de deslocamento casa-trabalho), dias específicos (sábados são 26% mais perigosos que a média) e causas específicas (velocidade incompatível tem taxa de fatalidade muito superior à média).
Essa concentração é, na verdade, uma boa notícia do ponto de vista estratégico. Significa que ações focalizadas podem ter impacto desproporcional. Não precisamos resolver todos os problemas de uma vez - podemos começar pelos pontos críticos e salvar vidas imediatamente.
A decisão de usar dados abertos da PRF e aplicar técnicas de análise exploratória de dados foi acertada. Conseguimos transformar milhares de registros brutos em uma narrativa clara, visual e, acima de tudo, acionável. Os gestores públicos não precisam ser cientistas de dados para entender os gráficos e mapas apresentados aqui - eles falam por si.
O uso do R e do ecossistema tidyverse foi fundamental.
Ferramentas como dplyr permitiram manipular grandes volumes
de dados com eficiência, enquanto ggplot2 transformou
números em visualizações que contam histórias. A adição de mapas
georreferenciados com geobr e sf trouxe uma
dimensão espacial que é impossível de capturar apenas com tabelas.
Mas o diferencial metodológico mais importante foi a análise cruzada de frequência com gravidade. Não basta saber qual causa é mais comum - precisamos saber qual mata mais. Descobrir que acidentes por velocidade incompatível, embora menos frequentes, têm taxa de fatalidade muito superior, muda completamente a prioridade das intervenções. É a diferença entre agir com base em achismos e agir com base em evidências.
A criação de variáveis derivadas (hora do dia, dia da semana, classificação de gravidade) e a construção de visualizações como o mapa de calor horário revelaram padrões que não seriam óbvios apenas olhando os dados brutos. É isso que a ciência de dados faz: encontra ordem onde parece haver apenas caos, e transforma informação em conhecimento acionável.
Três descobertas se destacam como prioridades absolutas para ação imediata:
1. Velocidade mata desproporcionalmente: Esta é a descoberta mais importante. Embora “velocidade incompatível” não seja a causa mais frequente de acidentes, ela está associada a uma taxa de mortalidade muito superior à média. Isso significa que cada real investido em fiscalização de velocidade tem retorno muito maior em vidas salvas do que investimentos em outras áreas. Radares, lombadas eletrônicas e fiscalização intensiva em trechos críticos deveriam ser implementados imediatamente.
2. Horários de pico são janelas de oportunidade para prevenção: Os dados mostram claramente que os horários de deslocamento casa-trabalho (6h-8h e 17h-19h) concentram acidentes. Isso não é coincidência - são os momentos em que as rodovias estão mais congestionadas, motoristas mais apressados e, consequentemente, menos atentos. A PRF poderia implementar operações de fiscalização intensiva nesses horários, com foco em controle de velocidade e distância segura. Campanhas educativas poderiam alertar motoristas sobre a presença de ciclistas justamente nesses períodos.
3. Concentração geográfica permite ação focalizada: Pernambuco, Bahia e Ceará concentram mais da metade dos acidentes. A BR-101 sozinha responde por mais de um quarto de todos os casos. Municípios como Jaboatão dos Guararapes têm números alarmantes. Essa concentração é, paradoxalmente, uma oportunidade. Recursos limitados podem ser direcionados para onde terão maior impacto. Um quilômetro de ciclovia na BR-101 em Pernambuco salva mais vidas do que o mesmo investimento pulverizado em rodovias com baixa incidência.
Além dessas três prioridades, outros insights merecem atenção:
Sábados são críticos: A fiscalização de fim de semana, especialmente aos sábados, precisa ser intensificada. O aumento de acidentes coincide com maior consumo de álcool e viagens de lazer.
A noite é perigosa: Mais da metade dos acidentes ocorre à noite ou ao amanhecer. Campanhas sobre uso de equipamentos refletivos e iluminação adequada nas bicicletas são urgentes. Melhorias na iluminação de trechos críticos também são necessárias.
Pistas simples são armadilhas: A diferença entre pistas simples e duplas é significativa. Onde não for possível construir ciclovias, ao menos acostamentos largos e bem sinalizados deveriam ser obrigatórios em pistas simples.
Os dados não servem de nada se não gerarem ação. Aqui estão recomendações específicas e acionáveis para cada grupo de interesse:
Para a Polícia Rodoviária Federal (PRF):
A PRF está na linha de frente da segurança viária e pode implementar mudanças imediatas que salvarão vidas. Recomendamos:
Operações focalizadas: Concentrar fiscalização nos horários de pico (6h-8h e 17h-19h), especialmente aos sábados, nas rodovias críticas (BR-101, BR-232, BR-116). Os dados mostram exatamente onde e quando agir.
Prioridade à velocidade: Intensificar o controle de velocidade, que tem impacto desproporcional na redução de fatalidades. Radares móveis nos trechos com maior incidência de acidentes graves.
Campanhas educativas direcionadas: Usar os dados para criar campanhas específicas - por exemplo, alertas sobre atenção a ciclistas nos horários de pico, distribuição de equipamentos refletivos em pontos críticos.
Monitoramento contínuo: Estabelecer indicadores de desempenho baseados nos padrões identificados e acompanhar mensalmente a evolução dos números.
Para o Departamento Nacional de Infraestrutura de Transportes (DNIT):
O DNIT tem o poder de mudar a infraestrutura física das rodovias. Investimentos direcionados podem ter impacto duradouro:
Priorização de investimentos: Usar o mapa de hotspots para priorizar onde construir ciclovias, alargar acostamentos e melhorar sinalização. A BR-101 deveria ser prioridade absoluta.
Iluminação em trechos críticos: Dado que mais da metade dos acidentes ocorre à noite, melhorar a iluminação nos trechos com maior incidência é investimento de alto retorno.
Sinalização específica para ciclistas: Placas alertando motoristas sobre a presença de ciclistas, especialmente em trechos de pista simples e nos municípios com maior incidência.
Projetos-piloto: Implementar melhorias em trechos específicos (por exemplo, 10 km da BR-101 em Jaboatão dos Guararapes) e medir o impacto antes de escalar para outras áreas.
Para Associações de Ciclistas e ONGs:
As organizações da sociedade civil têm papel fundamental em pressionar por mudanças e educar a comunidade:
Advocacy baseado em dados: Usar os números desta análise para pressionar governos estaduais e federal por políticas públicas. Dados concretos são mais persuasivos que apelos emocionais.
Campanhas de conscientização: Focar em educar ciclistas sobre os momentos de maior risco - evitar horários de pico quando possível, usar equipamentos de segurança, especialmente à noite.
Parcerias com poder público: Propor projetos conjuntos com PRF e DNIT, oferecendo-se para distribuir equipamentos de segurança, realizar blitze educativas, etc.
Monitoramento cidadão: Criar canais para que ciclistas reportem trechos perigosos, complementando os dados oficiais.
Para Ciclistas (População em Geral):
Enquanto aguardamos mudanças estruturais, cada ciclista pode tomar decisões mais informadas:
Evite horários de pico: Se possível, evite pedalar nas rodovias entre 6h-8h e 17h-19h, especialmente aos sábados.
Equipamentos de segurança são obrigatórios: Use roupas refletivas, luzes dianteira e traseira, especialmente à noite. Não é questão de estilo, é questão de sobrevivência.
Conheça os trechos perigosos: Evite, quando possível, trechos críticos como a BR-101 em áreas metropolitanas. Busque rotas alternativas.
Atenção redobrada: Assuma que motoristas não o veem. Dirija defensivamente, sinalize suas intenções com antecedência, mantenha-se no acostamento sempre que possível.
Para Motoristas:
Motoristas são parte fundamental da solução. Pequenas mudanças de comportamento salvam vidas:
Reduza a velocidade: Especialmente em trechos com presença de ciclistas. A diferença entre 80 km/h e 60 km/h pode ser a diferença entre a vida e a morte.
Atenção nos horários de pico: Nos horários de deslocamento, redobrar a atenção. Ciclistas estão mais vulneráveis quando o tráfego está intenso.
Distância segura: Ao ultrapassar ciclistas, mude de faixa completamente. Não basta “dar uma espaçada” - ciclistas precisam de espaço real.
Paciência: Ciclistas têm o mesmo direito de usar a via que você. Alguns segundos de atraso não valem uma vida.
Como toda análise baseada em dados, esta tem limitações que precisam ser reconhecidas. A principal delas é a ausência de dados sobre exposição ao risco. Não sabemos quantos ciclistas trafegam em cada trecho, em cada horário. Isso impede calcular taxas de risco verdadeiras - estamos analisando números absolutos de acidentes, não a probabilidade de um ciclista individual sofrer um acidente.
Por exemplo, pode ser que Pernambuco tenha mais acidentes simplesmente porque tem muito mais ciclistas nas rodovias, não necessariamente porque suas rodovias são mais perigosas. Idealmente, precisaríamos de dados de volume de ciclistas para calcular taxas como “acidentes por 100 mil ciclistas-quilômetro”. Infelizmente, esses dados não existem de forma sistemática.
Outra limitação é a falta de informações detalhadas sobre infraestrutura. Não temos dados estruturados sobre quais trechos têm acostamento, qual a largura desses acostamentos, onde há iluminação adequada, onde há sinalização específica para ciclistas. Integrar dados do DNIT sobre infraestrutura com os dados de acidentes da PRF permitiria análises muito mais sofisticadas sobre o impacto de diferentes tipos de intervenção.
Também não temos informações sobre o perfil dos ciclistas envolvidos - idade, experiência, se usavam equipamentos de segurança, se a bicicleta tinha problemas mecânicos. Essas informações ajudariam a desenhar campanhas educativas mais efetivas.
Finalmente, esta é uma análise descritiva, não preditiva. Identificamos padrões no passado, mas não construímos modelos que prevejam onde e quando acidentes provavelmente ocorrerão no futuro. Técnicas de machine learning poderiam ser aplicadas para criar modelos preditivos que auxiliassem na alocação preventiva de recursos.
Os próximos passos para aprofundar esta análise seriam:
Integrar dados de infraestrutura do DNIT: Cruzar informações sobre tipo de pista, largura de acostamento, presença de iluminação, etc., com os dados de acidentes para identificar quais características de infraestrutura estão mais associadas a acidentes.
Desenvolver modelos preditivos: Usar técnicas de machine learning para prever probabilidade de acidentes em diferentes trechos e horários, permitindo alocação preventiva de recursos.
Análise de séries temporais: Estudar a sazonalidade e tendências de longo prazo com mais profundidade, identificando se intervenções específicas (como campanhas ou mudanças de infraestrutura) tiveram impacto mensurável.
Estudos de caso antes-e-depois: Acompanhar trechos onde melhorias foram implementadas e medir o impacto real na redução de acidentes, criando evidências sobre quais intervenções funcionam.
Análise qualitativa complementar: Entrevistar ciclistas, motoristas, agentes da PRF e gestores do DNIT para capturar nuances que os dados quantitativos não revelam.
Expansão geográfica: Replicar esta análise para outras regiões do Brasil, permitindo comparações e identificação de boas práticas.
Mas mesmo com essas limitações, os dados já contam uma história clara e urgente: precisamos agir agora. Não podemos esperar ter dados perfeitos para começar a salvar vidas. As evidências apresentadas aqui já são suficientes para justificar ações imediatas nos pontos críticos identificados.
Cada dia de inação significa mais ciclistas em risco. Cada decisão adiada pode custar vidas. Os dados estão na mesa. As recomendações são claras. Agora é hora de agir.
[1] Portal de Dados Abertos da Polícia Rodoviária Federal (PRF). Dados de Acidentes de Trânsito. Disponível em: https://www.gov.br/prf/pt-br/acesso-a-informacao/dados-abertos/dados-abertos-da-prf