Introdução

1.1 Declaração do Problema

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.

1.2 Proposta e Metodologia

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.

A metodologia seguiu três etapas:

  1. 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.

  2. 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.

  3. 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:

    • Quando os acidentes acontecem? (padrões temporais)
    • Onde eles se concentram? (hotspots geográficos)
    • Por que ocorrem? (causas e fatores de risco)

1.3 Abordagem e Técnica Adotada

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.

1.4 Clientes e Benefícios da Análise

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.

Pacotes Requeridos

2.1 Carregamento e Finalidade

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.

Preparação dos Dados

3.1 Fonte Original e Coleta

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.

3.2 Descrição dos Dados de Origem

Cada acidente registrado pela PRF contém dezenas de informações:

  • Quando aconteceu: Data e hora exatas
  • Onde aconteceu: Estado, município, rodovia (BR), quilômetro
  • Como aconteceu: Tipo de acidente (colisão, atropelamento, queda), causa (velocidade, falta de atenção)
  • Condições: Clima, fase do dia, tipo de pista
  • Consequências: Número de mortos, feridos graves, feridos leves e ilesos

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.

3.3 Etapas de Importação e Limpeza (ETL)

O processo de preparação dos dados seguiu estas etapas:

  1. Leitura dos Arquivos: Carregamos os CSVs de cada ano (2021-2025)
  2. Filtragem: Mantivemos apenas acidentes com bicicletas nos 9 estados do Nordeste
  3. Conversão de Tipos: Transformamos textos em datas (ymd()) e horários (hms())
  4. Criação de Variáveis: Extraímos ano, mês, dia da semana e hora para análise temporal
  5. Classificação de Gravidade: Criamos categorias para facilitar a análise (Grave/Fatal vs. Leve/Ileso)
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()
  )

3.4 Conjunto de Dados Final e Resumo

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:

Total de Acidentes Período Total de Mortes Total de Feridos Graves Taxa de Mortalidade (%)
5897 2021 a 2025 1100 2074 18.65

Entre 2021 e 2025, foram 5.897 acidentes envolvendo ciclistas, com 1.100 mortes. Isso significa que aproximadamente 1 em cada 5 acidentes resulta em morte, uma taxa alarmante que evidencia a vulnerabilidade dos ciclistas nas rodovias.

Análise Exploratória de Dados (AED)

4.1 Visão Geral e Estrutura da Análise

Agora vamos contar a história que os dados revelam. Organizamos a análise em três perguntas fundamentais:

  1. QUANDO os acidentes acontecem? (Análise Temporal)
  2. ONDE eles se concentram? (Análise Geográfica)
  3. POR QUÊ ocorrem? (Análise Causal)

Cada seção traz visualizações que transformam números em narrativas compreensíveis.

4.2 Análise Temporal: Quando os Acidentes Ocorrem?

Gráfico 1: A Tendência Preocupante

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.

Gráfico 2: Os Meses Mais Perigosos

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.

Gráfico 3: Os Horários Críticos

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.

4.3 Análise Geográfica: Onde os Acidentes Ocorrem?

Gráfico 4: Os Estados Mais Perigosos

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.

Gráfico 5: Os Municípios Críticos

df_g5 <- df_analise %>%
  group_by(municipio, uf) %>%
  summarise(Total_Acidentes = n()) %>%
  ungroup() %>%
  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.

Gráfico 6: As Rodovias Mais Perigosas

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.

4.4 Análise de Gravidade e Condições Ambientais

Gráfico 7: A Gravidade Não Diminui

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()) %>%
  ungroup() %>%
  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.

Gráfico 8: O Perigo da Noite

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.

Gráfico 9: O Padrão Semanal

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.

Gráfico 10: O Clima Não é o Vilão

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.

Gráfico 11: O Tipo de Pista Importa

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.

4.5 Fatores Causais e Tipos de Acidente

Gráfico 12: Como os Acidentes Acontecem

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.

Gráfico 13: O Mapa de Calor do Risco

df_g13 <- df_analise %>%
  group_by(dia_semana, hora_dia) %>%
  summarise(Total_Acidentes = n()) %>%
  ungroup()

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.

Gráfico 14: Onde Estão os Hotspots

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.

4.6 O Fator Causal: Por Que Acontece?

Gráfico 15: As Causas e Suas Consequências

df_g15 <- df_analise %>%
  group_by(causa_acidente) %>%
  summarise(
    Total_Acidentes = n(),
    Total_Mortes = sum(mortos, na.rm = TRUE)
  ) %>%
  ungroup() %>%
  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.

Conclusões

5.1 O Problema é Real e Está Crescendo

A segurança dos ciclistas nas rodovias federais do Nordeste não é apenas uma preocupação - é uma emergência. Entre 2021 e 2025, foram 5.897 acidentes e 1.100 mortes. E a situação está piorando: o número de acidentes cresceu 36% no período.

Os dados revelam que o risco não é aleatório. Ele se concentra em estados específicos (PE, BA, CE), horários específicos (6h-8h e 17h-19h), dias específicos (sábados) e causas específicas (velocidade, falta de atenção).

5.2 A Metodologia Funcionou

Usar dados abertos da PRF e técnicas de análise exploratória nos permitiu transformar milhares de registros em uma narrativa clara e acionável. O R e o tidyverse foram fundamentais para manipular e visualizar os dados de forma eficiente.

A criação de variáveis de gravidade e a análise cruzada de causas com mortalidade revelaram insights que não seriam óbvios apenas olhando tabelas brutas. É isso que a ciência de dados faz: encontra padrões onde parece haver apenas caos.

5.3 Insights que Podem Salvar Vidas

Três descobertas se destacam:

  1. Velocidade mata: Embora não seja a causa mais frequente, acidentes por velocidade incompatível têm taxa de mortalidade muito maior. Fiscalização de velocidade deve ser prioridade.

  2. Horários de pico são críticos: Os horários de deslocamento casa-trabalho (6h-8h e 17h-19h) concentram acidentes. Fiscalização intensiva nesses períodos pode prevenir tragédias.

  3. Concentração geográfica: PE, BA e CE concentram mais da metade dos acidentes. Recursos devem ser direcionados prioritariamente para esses estados.

5.4 O Que Fazer com Essas Informações

Para a PRF: Intensificar fiscalização nos horários de pico, aos sábados e nas BRs mais perigosas. Focar em controle de velocidade, que tem maior impacto na redução de mortalidade.

Para o DNIT: Investir em infraestrutura nos trechos críticos identificados - acostamentos largos, ciclovias, iluminação adequada, sinalização específica para ciclistas.

Para Associações de Ciclistas: Usar esses dados para pressionar por políticas públicas e educar ciclistas sobre os momentos de maior risco.

Para ciclistas: Redobrar atenção nos horários de pico, usar equipamentos de visibilidade (especialmente à noite) e, sempre que possível, evitar rodovias nos horários e dias mais perigosos.

5.5 Limitações e Próximos Passos

Esta análise tem limitações. Não temos dados sobre o volume de ciclistas em cada trecho, o que impede calcular taxas de risco mais precisas. Também não temos informações detalhadas sobre a infraestrutura (presença de acostamentos, ciclovias, iluminação).

Os próximos passos seriam:

  1. Integrar dados do DNIT sobre infraestrutura das rodovias
  2. Desenvolver modelos preditivos para estimar probabilidade de acidentes graves
  3. Acompanhar o impacto de intervenções (antes e depois de melhorias de infraestrutura)

Mas mesmo com essas limitações, os dados já contam uma história clara: precisamos agir agora.

Referências

[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