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:

departure destination n
BSB GRU 7
GIG GRU 7
CWB POA 6
BEL STM 5
BPS CNF 5
BSB CGB 5
BSB CNF 5
BSB GIG 5
CGB BSB 5
CGB GRU 5
CGH SDU 5
CNF BSB 5
CNF GRU 5
CWB BSB 5
FOR BSB 5
GRU BSB 5
GRU CGB 5
GRU CWB 5
GRU FLN 5
GRU GIG 5
GRU POA 5
GRU REC 5
GRU SSA 5
GRU UDI 5
MAO GRU 5
POA GRU 5
REC GRU 5
SDU CGH 5
SSA CGH 5
SSA GRU 5
STM MAO 5

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