Introdução

Declaração do Problema

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.

Metodologia e Abordagem

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:

  • Extração: Importação de múltiplas tabelas relacionais (CSV).
  • Wrangling: Limpeza de dados, tratamento de encoding e junção de tabelas (Left Joins) para enriquecer o dataset principal.
  • Análise Exploratória (EDA): Uso de estatística descritiva e visualização de dados para identificar tendências temporais, espaciais e causais.

Abordagem Técnica Proposta

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?”.

Benefícios da Análise

Esta análise beneficiará potenciais clientes como:

  • Gestores de Aeródromos: Para identificar picos de incidentes e planejar infraestrutura.
  • Escolas de Aviação: Para focar o treinamento nos “Fatores Contribuintes” mais recorrentes (ex: Julgamento de Pilotagem).
  • Seguradoras: Para ajustar modelos de risco baseados em localização e tipo de aeronave

Sobre o Conjunto de Dados (Dataset)

Os dados utilizados são provenientes do CENIPA e compostos por 5 tabelas:

  • Ocorrência
  • Ocorrência Tipo
  • Aeronave
  • Fator Contribuinte
  • Recomendação

Pacotes Necessários

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.
library(tidyverse)
library(lubridate)
library(here)
library(knitr)
library(maps)

Preparação dos Dados

1. Fonte dos Dados

Os dados foram obtidos através do Portal Brasileiro de Dados Abertos.

2. Explicação dos Dados

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.

  • Peculiaridade:
    • Encoding: Os arquivos utilizam o padrão Latin1 (comum em sistemas governamentais brasileiros antigos), o que exige tratamento especial para acentos.
    • Valores Ausentes: Campos vazios são representados de formas variadas como ***, NULL ou NA, exigindo padronização na leitura.
    • Granularidade: Uma única ocorrência pode ter n aeronaves e n fatores contribuintes, o que duplica linhas ao fazer a junção.

3. Importação e Limpeza Inicial

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))

4. Junção das Tabelas

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")

5. Engenharia de Variáveis

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
  )

6. Conjunto de Dados Final

Abaixo, uma visão condensada da estrutura final dos dados limpos pronta para análise.

glimpse(df_limpo)
## 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,…

7. Resumo das Variáveis de Intersse

O conjunto de dados final contém informações consolidadas. As principais variáveis de interesse para nossa análise são:

  • Temporais: ocorrencia_ano e ocorrencia_mes (categórica ordinal) cobrem o período histórico disponível, permitindo análise de séries temporais.
  • Categóricas: ocorrencia_classificacao (Níveis: Acidente, Incidente, Incidente Grave) e fator_nome (texto descritivo da causa).
  • Numéricas/Geográficas: Latitude e Longitude, que permitem o plot espacial.

Análise Exploratória dos Dados

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.

df_unicos <- df_limpo %>% distinct(codigo_ocorrencia, .keep_all = TRUE)

1. Evolução Temporal

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.


2. Classificação

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.


3. Fatores Contribuintes

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.


4. Distribuição Geográfica

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.


5. Sazonalidade (Heatmap)

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.


Conclusão

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:

  • Prevalência de Incidentes: A grande maioria das ocorrências registradas são classificadas como Incidentes (eventos que não resultam em danos graves ou fatalidades), o que demonstra uma cultura de notificação ativa, essencial para a prevenção de acidentes maiores.
  • Fatores Recorrentes: Observou-se que falhas relacionadas ao Julgamento de Pilotagem e Supervisão Gerencial aparecem frequentemente entre os fatores contribuintes, indicando a predominância do “Fator Humano” na segurança de voo.
  • Geolocalização: Como esperado, há uma concentração massiva de ocorrências na região Sudeste, correlacionada diretamente com o maior volume de tráfego aéreo e densidade de aeroportos nesta região.

Limitações e Trabalhos Futuros:

  • A análise foi limitada pela atualização dos dados de 2025 e pela falta de dados de normalização (número total de voos). Como melhoria futura, sugere-se cruzar estes dados com a base da ANAC de “Horas de Voo” para calcular taxas de acidentes por hora voada, criando uma métrica de risco relativa mais precisa.