Introdução Link para o cabeçalho

O Kaggle possui um conjunto de dados super interessante chamado Airline Routes (92k+) and Airports (9k+) Dataset. Nele é possível encontrar várias rotas aéreas e informações de latitude e longitude de vários aeroportos no mundo. Neste post mostro como utilizar estas informações para visualizar as rotas aéreas mais comuns no país.

Preparação Link para o cabeçalho

Como sempre, o primeiro passo em uma análise feita no R é carregar os pacotes e o conjunto de dados a ser analisado.

# pacotes necessarios

library(rvest)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()         masks stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag()            masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(knitr)

Como no Kaggle não há informação sobre o país de cada aeroporto, eu fiz um webscraping na Wikipedia em Português, pegando os códigos de todos os aeroportos nacionais.

url <- "https://pt.wikipedia.org/wiki/Lista_de_aeroportos_do_Brasil_por_c%C3%B3digo_aeroportu%C3%A1rio_IATA"

tabelas <- url %>%
  read_html() %>%
  html_table(fill=TRUE)

aeroportos <- tabelas[[1]]

for (j in 2:5){
  aeroportos <-
    aeroportos %>%
    bind_rows(tabelas[[j]])
}

aeroportos <- clean_names(aeroportos)

aeroportos <- 
  aeroportos %>%
  rename(id = codigo_iata)

write.csv(aeroportos, 
          file = "dados/aeroportos_br.csv", 
          quote = FALSE, 
          row.names = FALSE)

Em seguida, é preciso ler os dados:

library(tidyverse)
theme_set(theme_bw())
library(brazilmaps)
library(janitor)

# leitura dos dados

aeroportos_br <- clean_names(read.csv(file = "dados/aeroportos_br.csv"))
aeroportos    <- clean_names(read.csv(file = "dados/Full_Merge_of_All_Unique Airports.csv"))
rotas         <- clean_names(read.csv(file = "dados/Full_Merge_of_All_Unique_Routes.csv"))

Com os dados lidos, é preciso juntar três conjuntos de dados: os códigos dos aeroportos brasileiros, a latitude e longitude deles e as rotas entre cada um. O primeiro passo é manter apenas as rotas aéreas dentro do Brasil:

# manter apenas as rotas dentro do brasil

rotas_br <-
  rotas %>%
  filter(departure %in% aeroportos_br$id) %>%
  filter(destination %in% aeroportos_br$id)

É fácil colocar as rotas e as localizações dos aeroportos no mesmo data frame:

# juntar rotas e localizacao dos aeroportos

rotas_br <- 
  rotas_br %>%
  rename(id = departure) %>%
  left_join(aeroportos, by = "id") %>%
  select(departure = id, destination, latitude_dep = latitude, longitude_dep = longitude) %>%
  rename(id = destination) %>%
  left_join(aeroportos, by = "id") %>%
  select(departure, destination = id, latitude_dep, longitude_dep, latitude_des = latitude, longitude_des = longitude)

Por fim, contei o número de voos por rota. Não é uma medida direta do número de voos, mas sim do número de companhias que operam estas rotas.

# numero de voos por rota

rotas_br <- 
  rotas_br %>%
  group_by(departure, destination) %>%
  count() %>%
  left_join(rotas_br, by = c("departure", "destination")) %>%
  arrange(n)

Visualização Link para o cabeçalho

O pacote brazilmaps tem todas as informações necessárias para criar um mapa do Brasil. Resolvi usar as divisões estaduais para poder visualizar melhor o que está acontecendo. O resultado final está abaixo:

# mapa

mapa_br <- get_brmap("State")

ggplot(mapa_br) +
  geom_sf(fill = "white") +
  geom_segment(data = rotas_br, aes(x = longitude_dep, y = latitude_dep, xend = longitude_des, yend = latitude_des, colour = as.factor(n))) +
  labs(x = "Latitude", y = "Longitude", colour = "Qtde", caption = "marcusnunes.me") +
  scale_color_viridis_d() + 
  theme_void()
## old-style crs object detected; please recreate object with a recent sf::st_crs()
## old-style crs object detected; please recreate object with a recent sf::st_crs()
## old-style crs object detected; please recreate object with a recent sf::st_crs()

É fácil ver que as duas rotas mais comuns são Brasília (BSB) - São Paulo (GRU) e Rio de Janeiro (GIG) - São Paulo (GRU). Na verdade, as rotas com cinco ou mais comapanhias operando são 31, dadas pela tabela abaixo:

departuredestinationn
BSBGRU7
GIGGRU7
CWBPOA6
BELSTM5
BPSCNF5
BSBCGB5
BSBCNF5
BSBGIG5
CGBBSB5
CGBGRU5
CGHSDU5
CNFBSB5
CNFGRU5
CWBBSB5
FORBSB5
GRUBSB5
GRUCGB5
GRUCWB5
GRUFLN5
GRUGIG5
GRUPOA5
GRUREC5
GRUSSA5
GRUUDI5
MAOGRU5
POAGRU5
RECGRU5
SDUCGH5
SSACGH5
SSAGRU5
STMMAO5

O código completo desta análise, bem como seus dados, está disponível em meu github.