Quem Voa - Análise dos vôos da FAB com autoridades do Estado

De Ícaro ao Tesla Roadster, voar sempre foi a vontade de muitos. Há quem diga que tem medo, e não duvido, embora acredite que o medo está não na altura ou no voar, mas nos possíveis acidentes que podem decorrer disso. De uma forma ou de outra, o céu brasileiro está cada vez mais povoado com a democratização do preço dos vôos, da quantidade de trechos disponíveis e da necessidade de chegar mais rápido em algum lugar.

Pensando nisso, e pesquisando os dados abertos do governo brasileiro, descobri um repositório da Força Aéreea Brasileira com bancos de dados de todas as autoridades que voaram de abril de 2019 até setembro desse ano. A primeira vez que vi esses arquivos, no mês passado, eles iam somente até agosto, e hoje já temos o banco com os dados de setembro. Logo, espero que continuem fazendo a manutenção dos mesmos e continuem disponibilizando dados de interesse do cidadão.

Antigamente, os vôos da FAB ficavam disponíveis somente no site da mesma, aqui, e os dados não podiam ser exportados, pois vinham em formato PDF, separados por dia. Era possível raspar os PDFs, mas o trabalho seria um pouco custoso. De toda forma, agora, todos os vôos estão disponíveis em formato .csv e são de fácil acesso e processamento.

Como exercício, farei uma breve análise exploratória desses bancos, e me proponho a manter a análise atualizada conforme os próximos meses forem consolidados no arquivo.

Clonando o repositório em nossa máquina, é preciso listar todos os arquivos em .csv, para então formar o banco. Para acelerar esse processo, depois de carregar os pacotes que utilizarei, vou juntar todos os arquivos de uma vez e já direcionar ao banco, para não ter que importar um a um dentro do R.

pacman::p_load(tidyverse, hrbrthemes, knitr, kableExtra, janitor, ggalt)

files <- list.files("~/Documents/Datasets/QuemVoa/", pattern = ".csv$", full.names = T)

names_vars <- c("autoridade", "origem", "orig_data_hora",
                "destino", "dest_data_hora", "motivo",
                "n_pass", "compartilhado" )

fab <- bind_rows(lapply(files, read.csv2, 
                        header = F, encoding = "latin1", 
                        col.names = names_vars))

Explicando o código acima: criei um objeto chamado files que listava todos os arquivos em .csv da pasta. O uso de $, em regex, significa “termina com”. No caso, tudo que termina com .csv, a extensão dos arquivos utilizados.

Em seguida, criei um vetor chamado names_vars. A explicação é que os arquivos da FAB não vem com os nomes da variáveis, logo, para facilitar nosso trabalho, criei um vetor nomes identificáveis que permitirão uma melhor compreensão e execução.

Já o objeto de nome fab é o banco em si, que, a partir da função bind_rows e um lapply, abre todos os arquivos da lista e direciona para o objeto, consolidando todos de uma só vez, na codificação correta (latin1) e com os nomes de variáveis anteriormente especificados.

Agora, vamos dar uma olhada no banco:

glimpse(fab)
## Rows: 849
## Columns: 8
## $ autoridade     <chr> "Presidente da Câmara dos Deputados", "Presidente da Câ…
## $ origem         <chr> "Brasília", "Rio de Janeiro (Santos Dumont)", "São Paul…
## $ orig_data_hora <chr> "01/04/2019 - 07:10", "01/04/2019 - 11:05", "01/04/2019…
## $ destino        <chr> "Rio de Janeiro (Santos Dumont)", "São Paulo (Congonhas…
## $ dest_data_hora <chr> "01/04/2019 - 08:40", "01/04/2019 - 11:55", "01/04/2019…
## $ motivo         <chr> "Residência", "Serviço", "Residência", "Serviço", "Serv…
## $ n_pass         <int> 9, 9, 9, 9, 25, 12, 14, 14, 14, 14, 12, 5, 4, 14, 12, 1…
## $ compartilhado  <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "",…

Temos 849 observações, ou vôos, com 8 variáveis, que vão desde a autoridade que utilizou a aeronave, passando pela origem e destino, o motivo, o número previsto de passageiros e se o vôo foi compartilhado ou não com outra autoridade. Como pode ser visto, esse banco não nos facilita muito em nossa análise, principalmente pelo fato do dia e da hora estarem em uma mesma variável. É importante separá-los ao máximo para que possamos tornar esse banco o mais tidy possível.

fab <- fab %>% 
  separate(orig_data_hora, c("orig_dia", "orig_mes", "orig_ano"), sep = "/") %>% # Separando uma coluna em 3
  separate(dest_data_hora, c("dest_dia", "dest_mes", "dest_ano"), sep = "/") %>% # Separando uma coluna em 3
  mutate(dest_ano = str_replace(dest_ano, " - ", " "), # Tirando o " - " que ficou na coluna
         orig_ano = str_replace(orig_ano, " - ", " "), # Tirando o " - " que ficou na coluna
         dest_ano = str_replace(dest_ano, ": ", ":")) %>% # Uma linha tinha um erro (um espaço depois de :)
  separate(dest_ano, c("dest_ano", "dest_hora"), sep = " ") %>% # Separando em 2
  separate(orig_ano, c("orig_ano", "orig_hora"), sep = " ") %>% # Separando em 2
  mutate_if(is.character, as.factor) # Strings como fatores

meses <- c("Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro") # Salvando um vetor com os nomes dos meses


glimpse(fab)
## Rows: 849
## Columns: 14
## $ autoridade    <fct> "Presidente da Câmara dos Deputados", "Presidente da Câm…
## $ origem        <fct> Brasília, Rio de Janeiro (Santos Dumont), São Paulo (Con…
## $ orig_dia      <fct> 01, 01, 01, 01, 01, 02, 02, 02, 02, 02, 03, 03, 03, 04, …
## $ orig_mes      <fct> 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, …
## $ orig_ano      <fct> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 20…
## $ orig_hora     <fct> 07:10, 11:05, 17:25, 19:05, 14:35, 10:15, 08:10, 16:55, …
## $ destino       <fct> Rio de Janeiro (Santos Dumont), São Paulo (Congonhas), R…
## $ dest_dia      <fct> 01, 01, 01, 01, 01, 02, 02, 02, 02, 02, 03, 03, 03, 04, …
## $ dest_mes      <fct> 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, 04, …
## $ dest_ano      <fct> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 20…
## $ dest_hora     <fct> 08:40, 11:55, 18:10, 20:35, 16:00, 11:35, 10:20, 19:20, …
## $ motivo        <fct> Residência, Serviço, Residência, Serviço, Serviço, Servi…
## $ n_pass        <int> 9, 9, 9, 9, 25, 12, 14, 14, 14, 14, 12, 5, 4, 14, 12, 14…
## $ compartilhado <fct> "", "", "", "", "", "", "", "", "", "", "", "", "", "", …

Pronto! Agora podemos iniciar a nossa análise.

# Quais as principais origens dos vôos?
fab %>% 
  tabyl(origem) %>% 
  top_n(n = 10) %>% 
  ggplot()+
  geom_col(aes(x = reorder(origem, n), y = n),
           fill = "#2d543d")+
  coord_flip()+
  labs(title = "Top 10 origens de vôos da FAB",
       subtitle = "Com autoridades do Estado",
       x = "Cidade de Origem",
       y = "Nº de Vôos",
       caption = "Fonte: GABAER/FAB")+
  theme_ipsum_tw()

# Qual o principal destino dos vôos?
fab %>% 
  tabyl(destino) %>% 
  top_n(n = 10) %>% 
  ggplot()+
  geom_col(aes(x = reorder(destino, n), y = n),
           fill = "#d175b8")+
  coord_flip()+
  labs(title = "Top 10 destinos de vôos da FAB",
       subtitle = "Com autoridades do Estado",
       x = "Cidade de Destino",
       y = "Nº de Vôos",
       caption = "Fonte: GABAER/FAB")+
  theme_ipsum_tw()

Ok, faz sentido que Brasília esteja no topo: as autoridades que podem utilizar os vôos da FAB trabalham majoritariamente lá. Vamos remove Brasília, então, para ver como as outras cidades se comportam.

# Principais origens (sem contar com BSB)
fab %>% 
  filter(origem != "Brasília") %>% 
  tabyl(origem) %>% 
  top_n(n = 10) %>% 
  ggplot()+
  geom_col(aes(x = reorder(origem, n), y = n),
           fill = "#2d543d")+
  coord_flip()+
  labs(title = "Top 10 origem de vôos da FAB",
       subtitle = "Com autoridades do Estado, sem vôos de Brasília",
       x = "Cidade de Destino",
       y = "Nº de Vôos",
       caption = "Fonte: GABAER/FAB") +
  theme_ipsum_tw()

# Principais destinos (sem contar com BSB)
fab %>% 
  filter(destino != "Brasília") %>% 
  tabyl(destino) %>% 
  top_n(n = 10) %>% 
  ggplot()+
  geom_col(aes(x = reorder(destino, n), y = n),
           fill = "#d175b8")+
  coord_flip()+
  labs(title = "Top 10 destinos de vôos da FAB",
       subtitle = "Com autoridades do Estado, sem vôos para Brasília",
       x = "Cidade de Destino",
       y = "Nº de Vôos",
       caption = "Fonte: GABAER/FAB") +
  theme_ipsum_tw()

Os aeroportos de Congonhas, em São Paulo, e o Santos Dumont, no Rio de Janeiro, lideram a lista de origens e destinos. Sabendo os lugares, podemos analisar agora o mês. Em qual mês houve uma quantidade superior de vôos?

fab %>% 
  tabyl(orig_mes) %>% 
  ggplot()+
  geom_col(aes(x = orig_mes, y  = n, fill = orig_mes),
           show.legend = F)+
  labs(title = "Nº de vôos por mês",
       subtitle = "Com autoridades em aviões da FAB", 
       y = "Qtde. de vôos",
       x = "Mês",
       caption = "Fonte: GABAER/FAB")+
  scale_x_discrete(labels = meses)+
  scale_fill_ipsum()+
  theme_ipsum_tw()

fab %>% 
  tabyl(orig_mes) %>% 
  select(orig_mes, n) %>% 
  kable(col.names = c("Mês", "Nº de vôos")) %>% 
  kable_paper()
Mês Nº de vôos
04 134
05 139
06 127
07 118
08 177
09 154

O mês de agosto aparentemente foi atípico por algum motivo que desconhecemos: 177 vôos foram realizados. Como será que os vôos foram distribuídos ao longo do mês de agosto?

fab %>% 
  filter(orig_mes == "08") %>% 
  ggplot(aes(x = as.numeric(orig_dia)))+
  geom_density(fill = "#2d543d", alpha = 0.75)+
  theme_ipsum_tw()+
  labs(title = "Vôos de Agosto",
       subtitlee = "Densidade da Distribuição",
       y = "Densidade", 
       x = "Dia do mês de Agosto",
       caption = "Fonte: GABAER/FAB")+
  scale_x_continuous(breaks =  seq(1, 31, 3))

É possível perceber que os vôos da FAB foram mais utilizados a partir do dia 20, dado que a curva da densidade é maior em tal recorte temporal. É preciso saber o que houve no final de agosto para entender o aumento no fluxo de vôos.

Continuando, agora é importante saber qual autoridade mais viajou. Como a lista é enorme, vamos verificar só os 9 maiores cargos, pela quantidade de vôos realizados e procurar algum padrão nesses dados:

fab %>% 
  tabyl(autoridade) %>% 
  top_n(9) %>% 
  ggplot()+
  geom_lollipop(aes(x = reorder(autoridade, n), y = n),
           show.legend = F, size = 1.2, color = "#8fd175")+
  coord_flip()+
  scale_color_ipsum()+
  labs(title = "Quem viaja mais?",
       x = "",
       y = "Qtde. de vôos",
       caption = "Fonte: GABAER/FAB")+
  theme_ipsum_tw()
## Selecting by percent

A partir do gráfico acima, podemos perceber que Rodrigo Maia (DEM) é a autoridade que mais viaja em vôos da FAB, na figura de Presidente da Câmara dos Deputados do Brasil.

fab %>% 
  filter(autoridade == "Presidente da Câmara dos Deputados") %>% 
  tabyl(origem) %>% 
  filter(n >= 1) %>% 
  arrange(-n) %>% 
  head(15) %>% 
  ggplot(aes(x = reorder(origem, n), y  = n))+
  geom_lollipop(size = 1.3, color = "steelblue")+
  coord_flip()+
  theme_ipsum_tw()+
  labs(title  = "Vôos de Rodrigo Maia",
       x = "",
       y = "Qtde. de Vôos",
       caption  = "Fonte: GABAER/FAB")

Acima, é notável que Brasília é o principal destino de Rodrigo Maia entre abril e setembro de 2019, e o aeroporto de Congonhas é o segundo destino. Isso seria de se estranhar, dado o fato de que Rodrigo Maia mora no Rio de Janeiro, estado pelo qual é deputado. Entretanto, se somarmos os dois aeroportos do Rio (Santos Dumont e Galeão), percebemos que o número de saídas do Rio é superior ao número de saídas de São Paulo: enquanto 27 vôos são originados em São Paulo (Congonhas + Guarulhos), do Rio, se somarmos os dois aeroportos, teremos 28 vôos.

fab %>% 
  filter(autoridade == "Presidente da Câmara dos Deputados") %>% 
  tabyl(origem) %>% 
  arrange(-n) %>% 
  head(5) %>% 
  select(origem, n) %>% 
  kable(col.names = c("Origem",  "Nº de vôos")) %>% 
  kable_paper()
Origem Nº de vôos
Brasília 50
São Paulo (Congonhas) 24
Rio de Janeiro (Santos Dumont) 22
Rio de Janeiro (Galeão) 6
Guarulhos 3

Uma outra variável oferecida no banco da FAB é a variável denominada motivo, onde estão listados o que as autoridades que voaram alegaram como motivação para tal.

fab %>% 
   mutate(motivo = ifelse(motivo == "Segurança/Serviço", "Serviço/Segurança", 
                          as.character(motivo)),
          motivo = ifelse(motivo == "Serviço/Serviço", "Serviço", as.character(motivo)),
          motivo = ifelse(motivo == "Serviço/ Segurança", "Serviço/Segurança", as.character(motivo))) %>% 
  tabyl(motivo) %>% 
  ggplot(aes(x = reorder(motivo, -n), y  = n))+
  geom_col(fill = "#c9d175")+
  #coord_flip()+
  geom_label(aes(label  = n), vjust = -0.1, size = 3.5)+
  theme_ipsum_tw()+
  labs(title  = "Motivos de viagem",
       subtitle  = "Segundo autoridades em vôos da FAB",
       x = "Motivo",
       y = "Nº de vôos",
       caption = "Fonte: GABAER/FAB")+
  ylim(0, 800)

Como podemos ver, poucos vôos são efetivamente para a residência da autoridade, e a maioria é em serviço, cerca de 740 vôos até então. Percebemos que existiu uma emergência médica, uma de segurança e 26 casos de residência. Vamos analisar:

fab %>% 
  filter(motivo == "Emergência Médica" | motivo == "Segurança") %>% 
  select(autoridade, orig_dia, orig_mes, origem, destino, motivo) %>% 
  kable(col.names = c("Autoridade", "Dia", "Mês", "Origem", "Destino", "Motivo")) %>% kable_paper()
Autoridade Dia Mês Origem Destino Motivo
Ministro do Meio Ambiente 28 08 Brasília São Paulo (Congonhas) Emergência Médica
Ministro da Economia 09 09 Rio de Janeiro (Santos Dumont) Brasília Segurança

Ou seja, Ricardo Salles sofreu uma emergência médica (e ficou hospitalizado), enquanto Paulo Guedes, por motivos de segurança, no dia 09/09/2019, foi do Rio até Brasília.

E quem usa os vôos da FAB para ir para casa? O presidente da Câmara dos Deputados, Rodrigo Maia:

fab %>% 
  mutate(autoridade = as.character(autoridade)) %>% 
  filter(motivo == "Residência") %>% 
  tabyl(autoridade) %>% 
  select(autoridade, n) %>% 
  kable(col.names = c("Autoridade", "Nº de vôos para casa")) %>% 
  kable_styling(bootstrap_options = c("hover", "condensed"))
Autoridade Nº de vôos para casa
Presidente da Câmara dos Deputados 26
fab %>% 
  filter(autoridade == "Presidente da Câmara dos Deputados",
         motivo == "Residência") %>% 
  ggplot(aes(x = orig_mes, y = orig_dia, color = origem))+
  geom_point(size = 2)+
  theme_ipsum_tw()+
  theme(legend.position = "bottom")+
  labs(title = "Quando Rodrigo Maia foi pra casa",
       subtitle  = "Dia e mês de cada vôo do deputado com motivo residencial",
       x = "Mês",
       y  = "Dia", 
       color = "Origem",
       caption = "Fonte: GABAER/FAB")+
  scale_color_ipsum()+
  scale_x_discrete(labels = meses)

Bom, por hoje é só! Enquanto o banco de dados da FAB for disponibilizado e atualizado, manterei esse arquivo em dia. A principal dica é: acessem o portal de Dados Abertos do Brasil e analisem as informações lá disponibilizadas.

Qualquer dúvida, correção ou sugestão pode ser encaminhada para

Mateus Cavalcanti Pestana
Mateus Cavalcanti Pestana
Doutorando e Mestre em Ciência Política

Interessado em ciência de dados, ciência política, política russa, impressão 3D, redes neurais e aprendizado de máquina.

Relacionados