A segurança na aviação civil é um tema de interesse público crítico. Embora o transporte aéreo seja estatisticamente um dos mais seguros, a ocorrência de acidentes e incidentes gera grande impacto social e econômico. Por que devemos nos interessar? A análise de dados históricos de ocorrências não serve apenas para documentar tragédias, mas é a base da “Cultura de Segurança”: identificar padrões em incidentes menores (como falhas de motor ou colisões com aves) é a única forma estatisticamente viável de prevenir acidentes fatais maiores no futuro. Entender onde, quando e por que falhas ocorrem permite que reguladores e fabricantes atuem preventivamente.
Para endereçar este problema, utilizaremos a base de dados oficial do CENIPA (Centro de Investigação e Prevenção de Acidentes Aeronáuticos). A metodologia consiste no fluxo completo de Ciência de Dados:
A principal técnica adotada será a análise relacional de dados. Ao invés de analisar apenas a tabela de “Ocorrências”, cruzaremos informações de 5 tabelas distintas. Isso permitirá responder a questões complexas que não são autoevidentes em uma única tabela, como: “Existe correlação entre o modelo da aeronave e o tipo de falha relatada?” ou “A sazonalidade de incidentes varia conforme a região do país?”.
Esta análise beneficiará potenciais clientes como:
Os dados utilizados são provenientes do CENIPA e compostos por 5 tabelas:
Para garantir a reprodutibilidade desta análise, listamos abaixo as bibliotecas utilizadas e suas respectivas funções no projeto.
| Pacote | Propósito Principal | Utilização neste Projeto |
|---|---|---|
| tidyverse | Meta-pacote de Ciência de Dados | Carrega o núcleo |
| lubridate | Manipulação de Datas | Conversão de colunas de |
| here | Gestão de Diretórios | Garante que os caminhos dos |
| knitr | Relatórios Dinâmicos | Geração de tabelas formatadas (kable) e renderização do documento final. |
| maps | Dados Geográficos | Fornece as coordenadas poligonais para desenhar o mapa do Brasil e do mundo. |
| rmdformats | Formatação Visual | Provê o tema ‘material’ para uma apresentação profissional do relatório. |
Os dados foram obtidos através do Portal Brasileiro de Dados Abertos.
O conjunto de dados refere-se às ocorrências registradas nos últimos 10 anos. Originalmente, o dado é relacional e normalizado, dividido em 5 arquivos CSV para evitar redundância.
Realizamos a importação tratando o encoding (Latin1) e definindo os valores nulos padronizados.
# Padronização de valores nulos
valores_na <- c("NA", "N/A", "NULL", "***", "")
# Importação
df_ocorrencia <- read_csv2(
here("dados", "ocorrencia.csv"),
na = valores_na,
locale = locale(encoding = "latin1")
)
df_ocorrencia_tipo <- read_csv2(
here("dados", "ocorrencia_tipo.csv"),
na = valores_na,
locale = locale(encoding = "latin1")
)
df_aeronave <- read_csv2(
here("dados", "aeronave.csv"),
na = valores_na,
locale = locale(encoding = "latin1")
)
df_fator_contribuinte <- read_csv2(
here("dados", "fator_contribuinte.csv"),
na = valores_na,
locale = locale(encoding = "latin1")
)
df_recomendacao <- read_csv2(
here("dados", "recomendacao.csv"),
na = valores_na,
locale = locale(encoding = "latin1")
)
# Conversão de chaves para Join
df_ocorrencia <- df_ocorrencia %>%
mutate(codigo_ocorrencia4 = as.numeric(codigo_ocorrencia4))
df_recomendacao <- df_recomendacao %>%
mutate(codigo_ocorrencia4 = as.numeric(codigo_ocorrencia4))Utilizamos left_join para unificar as 5 tabelas em um
único dataframe, mantendo todas as ocorrências originais.
df_completo <- df_ocorrencia %>%
left_join(df_ocorrencia_tipo, by = "codigo_ocorrencia1") %>%
left_join(df_aeronave, by = "codigo_ocorrencia2") %>%
left_join(df_fator_contribuinte, by = "codigo_ocorrencia3") %>%
left_join(df_recomendacao, by = "codigo_ocorrencia4")Criamos colunas derivadas para análise temporal (Ano, Mês, Dia da Semana) e convertemos coordenadas para numérico.
df_limpo <- df_completo %>%
mutate(
ocorrencia_datetime = parse_date_time(
paste(ocorrencia_dia, ocorrencia_hora),
orders = "d/m/Y H:M:S",
tz = "America/Sao_Paulo"
),
ocorrencia_ano = year(ocorrencia_datetime),
ocorrencia_mes = month(ocorrencia_datetime, label = TRUE),
ocorrencia_dia_semana = wday(ocorrencia_datetime, label = TRUE),
ocorrencia_latitude = as.numeric(ocorrencia_latitude),
ocorrencia_longitude = as.numeric(ocorrencia_longitude)
) %>%
select(
codigo_ocorrencia, ocorrencia_classificacao, tipo = ocorrencia_tipo,
taxonomia = taxonomia_tipo_icao, ocorrencia_datetime, ocorrencia_ano,
ocorrencia_mes, ocorrencia_dia_semana, ocorrencia_cidade, ocorrencia_uf,
ocorrencia_pais, ocorrencia_aerodromo, ocorrencia_latitude, ocorrencia_longitude,
aeronave_tipo_veiculo, aeronave_fabricante, aeronave_modelo, aeronave_nivel_dano,
aeronave_fatalidades_total, fator_nome, fator_aspecto, recomendacao_status
)Abaixo, uma visão condensada da estrutura final dos dados limpos pronta para análise.
## Rows: 34,939
## Columns: 22
## $ codigo_ocorrencia <dbl> 87125, 87124, 87123, 87122, 87121, 87118, 8…
## $ ocorrencia_classificacao <chr> "INCIDENTE", "INCIDENTE", "INCIDENTE", "INC…
## $ tipo <chr> "FALHA OU MAU FUNCIONAMENTO DE SISTEMA / CO…
## $ taxonomia <chr> "SCF-NP", "SCF-NP", "SCF-NP", "SCF-PP", "BI…
## $ ocorrencia_datetime <dttm> 2025-05-11 04:20:00, 2025-05-08 14:00:00, …
## $ ocorrencia_ano <dbl> 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2…
## $ ocorrencia_mes <ord> mai, mai, mai, mai, mai, mai, abr, mai, abr…
## $ ocorrencia_dia_semana <ord> dom, qui, sex, dom, sáb, qua, sáb, seg, sex…
## $ ocorrencia_cidade <chr> "JUAZEIRO DO NORTE", "UBERLÂNDIA", "GUARULH…
## $ ocorrencia_uf <chr> "CE", "MG", "SP", "RS", "SP", "DF", "CE", "…
## $ ocorrencia_pais <chr> "BRASIL", "BRASIL", "BRASIL", "BRASIL", "BR…
## $ ocorrencia_aerodromo <chr> "FAER", "SBUL", "SBGR", "SBSM", "SBSR", "SB…
## $ ocorrencia_latitude <dbl> -7.219167, -18.883611, -23.435556, -29.7108…
## $ ocorrencia_longitude <dbl> -39.26944, -48.22528, -46.47306, -53.69222,…
## $ aeronave_tipo_veiculo <chr> "AVIÃO", "AVIÃO", NA, "AVIÃO", "AVIÃO", "AV…
## $ aeronave_fabricante <chr> "EMBRAER", "ATR - GIE AVIONS DE TRANSPORT R…
## $ aeronave_modelo <chr> "ERJ 190-400", "ATR-72-212A (600)", "A320-2…
## $ aeronave_nivel_dano <chr> "NENHUM", "NENHUM", "NENHUM", "NENHUM", "LE…
## $ aeronave_fatalidades_total <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ fator_nome <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ fator_aspecto <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ recomendacao_status <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
O conjunto de dados final contém informações consolidadas. As principais variáveis de interesse para nossa análise são:
ocorrencia_ano e ocorrencia_mes
(categórica ordinal) cobrem o período histórico disponível, permitindo
análise de séries temporais.ocorrencia_classificacao (Níveis:
Acidente, Incidente, Incidente Grave) e fator_nome (texto
descritivo da causa).Para evitar distorções estatísticas causadas pela duplicação de linhas nos joins (relação um-para-muitos), criamos um subconjunto de dados únicos para contagens de eventos.
Observamos o comportamento das ocorrências ao longo dos anos.
df_unicos %>%
count(ocorrencia_ano) %>%
ggplot(aes(x = ocorrencia_ano, y = n)) +
geom_line(color = "#003366", size = 1) +
geom_point(color = "red", size = 2) +
labs(
title = "Evolução das Ocorrências Aeronáuticas",
subtitle = "Total de eventos registrados por ano",
x = "Ano", y = "Total de Ocorrências"
) +
theme_minimal()Análise: Observando o gráfico, é possível perceber que no ano de 2024 houve um aumento significativo de ocorrências aeronáuticas, seguindo a tendência de alta observada em 2023. Já no ano de 2025, nota-se uma queda abrupta, justificada pela ausência da totalidade dos dados até o encerramento do ano corrente.
Comparativo entre Acidentes, Incidentes e Incidentes Graves.
df_unicos %>%
count(ocorrencia_classificacao) %>%
ggplot(aes(x = reorder(ocorrencia_classificacao, n), y = n,
fill = ocorrencia_classificacao)) +
geom_col() +
geom_text(aes(label = n), vjust = -0.5) +
labs(title = "Distribuição por Classificação", x = "Tipo", y = "Qtd") +
theme_minimal() +
theme(legend.position = "none")Análise: A classificação de ocorrências como Incidentes é a mais frequente, registrando 9.184 notificações. Isso indica que a maioria dos eventos notificados não resulta em danos severos à aeronave ou fatalidades, demonstrando a importância da cultura de notificação preventiva.
Os 10 fatores mais recorrentes nas investigações.
df_limpo %>%
filter(!is.na(fator_nome)) %>%
count(fator_nome, sort = TRUE) %>%
slice_head(n = 10) %>%
ggplot(aes(x = reorder(fator_nome, n), y = n)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(title = "Top 10 Fatores Contribuintes", x = "Fator", y = "Ocorrências") +
theme_minimal()Análise: Dentre os fatores contribuintes identificados nas investigações, o Julgamento de Pilotagem destaca-se como o principal fator, seguido de falhas na Aplicação de Comandos de Voo e problemas na Supervisão Gerencial. Isso ressalta a predominância do fator humano na segurança operacional.
Mapeamento dos pontos de ocorrência no território nacional.
mapa_brasil <- map_data("world", region = "Brazil")
df_mapa <- df_unicos %>%
filter(
ocorrencia_latitude < 6 & ocorrencia_latitude > -35,
ocorrencia_longitude > -75 & ocorrencia_longitude < -30
)
ggplot() +
geom_polygon(data = mapa_brasil, aes(x = long, y = lat, group = group),
fill = "lightgray", color = "white") +
geom_point(
data = df_mapa,
aes(x = ocorrencia_longitude, y = ocorrencia_latitude, color = ocorrencia_classificacao),
alpha = 0.6, size = 1.5
) +
coord_fixed(1.3) +
labs(title = "Mapa de Ocorrências no Brasil", color = "Tipo") +
theme_void() +
theme(legend.position = "bottom")Análise: Observando o mapa, verifica-se uma concentração acentuada de ocorrências na região Sudeste, correlacionada com a maior densidade de tráfego aéreo do país. Também é possível notar aglomerados significativos nas regiões Sul e Centro-Oeste, áreas com forte aviação geral e agrícola.
Análise cruzada entre Mês e Dia da Semana.
df_unicos %>%
filter(!is.na(ocorrencia_mes), !is.na(ocorrencia_dia_semana)) %>%
count(ocorrencia_mes, ocorrencia_dia_semana) %>%
ggplot(aes(x = ocorrencia_mes, y = ocorrencia_dia_semana, fill = n)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "lightblue", high = "red") +
labs(title = "Mapa de Calor: Ocorrências", x = "Mês", y = "Dia", fill = "Qtd") +
theme_minimal()Análise: A análise de sazonalidade revela uma concentração maior de ocorrências nos primeiros meses do ano. Em relação aos dias da semana, observa-se uma maior incidência entre quarta-feira e sábado, sugerindo uma correlação com o aumento das operações da aviação geral e instrução nesses períodos.
Através da análise exploratória dos dados do CENIPA, foi possível chegar a importantes conclusões sobre a segurança da aviação civil brasileira:
Limitações e Trabalhos Futuros: