Rotas Aéreas no Brasil

Introdução

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

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 packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.5     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.0.2     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter()         masks stats::filter()
## x readr::guess_encoding() masks rvest::guess_encoding()
## x dplyr::lag()            masks stats::lag()
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

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.