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.