Introdução

Durante o ano de 2018 durante a preparação de uma viagem de volta ao mundo, me deparei com um aspecto até então desconhecido por mim sobre passagens aéreas. Que o preço por km voado diminui conforme a distância. Apesar de facilmente compreensível sobre o ponto de vista de custo para as empresas. A variação me surpreendeu, e resolvi investigar mais o assunto.

Percebi que o valor por km voado em voos de longa distância (maiores que 5000Km) sempre se aproximavam de R$0,20 (USD 0,06 em valores da época).

Logo após isso, surgiram varias dúvidas. Seria possível calcular o valor mínimo de uma passagem aérea? Ou prever a ocorrência de uma faixa de preço? Até onde o valor das passagens pode ir? qual a chance real de comprar uma nos 5% mais barato? Seria essa, uma maneira de saber o que seria uma passagem barata, pela relação custo benefício? Levei prejuízo ou me dei bem?

Sobre os dados e tratamento

Os dados utilizados foram obtidos do Escritório de estatisticas de Transporte do Departamento de Transporte DOT(EUA), os dados são referentes a 2018. Este foi o maior banco de dados encontrado e que possuia valores de passagens de longa distância. Apesar de meus valores históricos/experimentais serem de passagens internacionais Europa/Ásia, acredito que devido a globalização e forte concorrência, os valores praticas nos Estados Unidos seja muito similares no mesmo período. As empresas foram: (WN) Southwest Airlines, (DL) Delta Air Lines, (AA) American Airlines, (UA) United Air Lines, (B6, JetBlue Airways, (AS) Alaska Airlines, (NK) Spirit Air Lines, (G4) Allegiant Air, (F9) Frontier Airlines, (HA) Hawaiian Airlines, (SY) Sun Country Airlines, (VX) Virgin America.

Todo o processamento foi realizado em R e RStudio com uso de Dplyr e ggplot.

Foi criado uma tabela a partir do arquivo original de aproximadamente 9 Milhões de linhas e 700 Megabytes de tamanho:

library(readr)
library(tidyverse)
Flights <- read_csv("/mnt/DADOS/Data Science/Viagens/Cleaned_2018_Flights.csv")

Calculo do valor por Km voado

Vamos calcular o valor por km voado, criando a variável “PricePerKm” e sumarizar os dados com distâncias (Miles), valores por km voado (PricePerKm) e preços totais(PricePerTicket):

Flights <- Flights %>% mutate(PricePerKm= PricePerTicket/(Miles*1.8))
summary(Flights$PricePerKm)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##  0.005839  0.065521  0.103591  0.143329  0.175479 13.232323
summary(Flights$Miles)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      11     679    1028    1202    1609    5095
summary(Flights$PricePerTicket)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    50.0   133.9   197.2   232.4   290.0  1000.0

A média de todos os 9 milhões de registros disponíveis é de 0,14USD/km, uma distância de 1202 Milhas(2200km) e um preço de 232USD por ticket.

Visualizando a distribuição dos dados plotando Distância x Valor por Km. Isso vai responder se os valores diminuem conforme a distancia voada, ou seja, voos mais longos são proporcionalmente mais baratos?

g <- ggplot(Flights,aes(Miles,PricePerKm))
g + geom_point(aes(color=Origin,alpha=0.01),show.legend = FALSE)
g


Gráfico de custo de USD/Km voado versus distância

Vemos na Figura 1 que é inconclusivo, existem muitos valores extremos. Fazendo a compressão dos eixos utilizando a escala logarítmica (base 10) para facilitar a visualização:

g +scale_y_continuous(trans="log10") + scale_x_continuous(trans="log10")


Mesmo que o anterior, porém em escalar logarítimica (Base 10)

A Figura 2 mostra um resultado bem mais interessante e com limites de preços bem claros na correlação entre valor por Km e distancia voada. Porem, essa correlação e inclinação são devido ao fato de uma das variáveis ser diretamente dependente de outra.

Onde o valor por km é mais baixo

Analisando agora (com histogramas de frequência) a distribuição dos preços conforme a distância voada(eixo X é Valor por Km voado e o Y, a frequência de voos nesse valor), primeiro abaixo de 500 milhas (900 km, aproximadamente 1 hora de voo) e separando cada companhia aérea por cor:

ggplot(filter(Flights,Flights$Miles <=500),aes(PricePerKm))+geom_histogram(aes(fill=AirlineCompany))
+scale_x_continuous(trans="log10")+geom_vline(xintercept=0.06, linetype="solid", color = "blue") 

Histograma de frequência com dados de voos abaixo de 500 milhas, eixo X é valor USD/Km, Y é a frequencia de ocorrência

A linha azul da figura 3 representa o valor prático/experimental de 0,06 USD/km, neste caso, voos curtos possuem valores bem mais caros. Mesmo com a transformação logarítmica os dados se mostram bastante assimétricos.

Agora, quanto a voos longos, acima de 4000 milhas (7500km, aproximadamente 8 horas de voo):

 ggplot(filter(Flights, Miles >= 4000),aes(PricePerKm,fill=AirlineCompany))
+geom_histogram()+scale_x_continuous(trans="log10")+
+geom_vline(xintercept=0.06, linetype="solid", color = "blue")  

Histograma de frequências de valores por Km voado para trajetos acima de 4000 milhas

A figura 4 mostra que a média é praticamente em 0,06USD/Km! Ou seja, minha experiência foi bastante mediana em termos de conseguir uma passagem barata. A distribuição e praticamente dominada por voos da America Airlines. Mas vamos ver um sumário de todos os voos acima de 4000 Milhas e ver como esses valores se distribuem:

summary(subset(Flights$PricePerKm,Flights$Miles >= 4000))
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.005839 0.048663 0.059851 0.062382 0.073558 0.132250

Sim, fiquei bem em cima da média. Apesar de 50% das passagens serem mais baratas, 25% delas (2º Quartil) começam em 0,048USD/Km o que é só 20% mais barato do que paguei, o que pode ser explicado por outra variável como ausência de franquia de bagagem (Que foi adquirida no meu caso)

Vamos investigar qual o valor máximo pago pelas 5% menores tarifas. Selecionando os 5% inferiores nos voos acima de 4000 milhas:

cinco <- subset(Flights,Flights$Miles >= 4000)
quantile(cinco$PricePerKm,0.05)
##         5% 
## 0.03612282

Os 5% mais sortudos (ou não, pois, não está claro que pode ter sido usados cupons de desconto) pagaram um equivalente a 3,6 centavos de dólar por km voado. 60% do meu valor prático/histórico.

Investigando agora os valores conforme as empresas aéreas usando boxplots:

Flights %>% filter(Miles >= 4000) %>% ggplot(aes(PricePerKm, AirlineCompany))
+geom_boxplot(aes(fill=AirlineCompany))+scale_x_continuous(trans="log10") +geom_vline(xintercept=0.06, linetype="solid", color = "blue")  

Boxplots de voos acima de 4000 milhas, separados por empresa aérea



Cada linha de boxplot na figura 5 representa uma empresa aérea, a caixa central engloba 50% dos valores por km voado em cada empresa (2º e 3º Quartil, 50% e 75%). A linha central dentro de cada caixa é a mediana. As linhas horizontais compreendem o primeiro e ultimo quartil(25% e 100%). Os pontos fora dessas ultimas são considerados outliers.

Mesmo separando as empresas aéreas é possível notar que as medianas se aproximam muito e que apenas a Virgin America(low cost) e American Airlines (a maior do mundo em volume de passageiros) não apresentam muitos outliers na faixa inferior de preço.

Vamos verificar agora, se um mesmo valor por Km voado pode incluir alguma concentração de empresa aérea ou trechos, vamos usar os valores entre 0,12 e 0,16USD/Km como exemplo:

Dez <- subset(Flights,PricePerKm > 0.12 & PricePerKm <0.16 )
ggplot(Dez) +geom_histogram(aes(Miles, fill=AirlineCompany))+scale_x_continuous(trans="log10")
ggplot(Dez) +geom_histogram(aes(Miles, fill=AirlineCompany))+scale_x_continuous(trans="log10")
+facet_wrap(~AirlineCompany)

Distribuição de voos na faixa entre 0,12 e 0,14USD por Km

Distribuição de voos na faixa entre 0,12 e 0,14USD/Km, separados por empresa aérea


Na figura 6 os valores parecem normalmente distribuídos ao longo da faixa. Na figura 7 se pode ver a separação pelas empresas aéreas. Vamos ver agora se a distribuição total de voos ao longo das distancias é constante ou se existem muito mais voos curtos do que longos.

Histograma de fequência de todos os voos conforme distancia



A figura 8 mostra que número de voos aumenta de acordo com a distância até atingir um máximo e depois diminuir.

Vamos criar um sumário com todos os valore médios de valores por Km voado porém agrupando pela distância já que a mesma é fixa entre as companhias aéreas (cada distância representa um trajeto). Isso nos vai ajudar a tentar ver uma correlação entre o número de voos e a diminuição de preço.

F1 <- aggregate(Flights, list(Flights$Miles), mean)
ggplot(F1, aes(Miles,PricePerKm))+geom_line()+scale_x_continuous(trans="log10")+
+scale_y_continuous(trans="log10")

Esta é a média de USD/Km voado para cada distancia(trajeto), clara tendência



Podemos ver os dados consolidados na figura 10.



Distribuição de frequência de voos com os valores decrescentes por Km voado(Vermelho)



Observamos que os valores por Km voado (linha vermelha no gráfico acima) se correlacionam mais com o número de ocorrências de trajetos do que com a distancia em si. Importante salientar que considero que o numero de trajetos (campo “Mile”), representa aproximadamente o número de passageiros na amostragem. Vemos um queda abrupta aproximadamente em 2630 Milhas (Linha azul). Este valor é a distancia média entre as duas costas dos EUA. Distâncias maiores só seriam necessárias em voos específicos como para Alasca, Havaí ou Porto Rico, que ocorrem em menor frequência.

Qual a faixa de variação de uma passagem aérea

Pelo gráfico “PricePerKm x Miles” Já sabemos que a delimitação dos valores é sempre fixa. Vamos agora, achar a razão entre as passagens mais baratas e mais caras filtrando por algumas distâncias, mais especificamente, 200, 500 e 2560 Milhas:

c1 <- subset(Flights,Flights$Miles == 200)
max(c1$PricePerTicket)
## [1] 998
min(c1$PricePerTicket)
## [1] 50
table(max(c1$PricePerTicket)/min(c1$PricePerTicket))
## 
## 19.96 
##     1
c1 <- subset(Flights,Flights$Miles == 500)
max(c1$PricePerTicket)
## [1] 991
min(c1$PricePerTicket)
## [1] 50
table(max(c1$PricePerTicket)/min(c1$PricePerTicket))
## 
## 19.82 
##     1
c1 <- subset(Flights,(Flights$Miles ==2586))
max(c1$PricePerTicket)
## [1] 1000
min(c1$PricePerTicket)
## [1] 50
table(max(c1$PricePerTicket)/min(c1$PricePerTicket))
## 
## 20 
##  1

Sim, os valores por Km voado (em 200, 500 e 2560 milhas) sempre se aproximam de uma razão de 20x entre o mais barato e mais caro.

Conclusão

Confirmamos que os valores por Km voado realmente diminuem conforme a distância. Uma teoria seria que provavelmente ela sofre amortização dos custos fixos na distância maior. Porém, a variável número de voos também parece relacionada, e que poderia ter a mesma causa, mais voos, maior a amortização e concorrência.

Interessante notar que o número de voos aumenta com a distância pelo fato que outras formas de transporte competirem com esse modal. Voos mais longos (acima de 4 horas) dificilmente seriam substituídos por carro ou trem. Ocorre assim o aumento da concorrência e diminuição do custos fixos.

Concluo que apesar de muita pesquisa, comprei minhas passagens por um valor bem próximo da média. Como despachei bagagem, posso considerar que ainda teria a opção de abrir mão desse recurso para reduzir mais um pouco a média do ticket e tentar alcançar o quartil mais baixo (20% menos do que paguei, 0,048 USD/Km) e talvez os 5% mais baixos (40% menos do que paguei ou 0,036 USD/Km)

Outra constatação interessante é que a diferença entre os valores máximos e mínimos estão sempre na faixa de 20x. Ou seja, na véspera de um vôo (quando o valor em geral está no máximo) pode-se considerar que o valor mínimo que poderia ser encontrado seria apenas 5% dele. Este seria um indicativo, não uma regra.

Um outra abordagem prática para minimizar o valor de uma passagem aérea seria calcular a distância do voo e usar a média de 0,058 USD/Km e criar alertas de promoções para voos nesse trajeto usando este valor.

Uma tática arriscada seria testar se aumentando o numero de voos ou conexões, ocorreria o aumento da distancia voada total e consequentemente a diminuição do valor da passagem. Dessa forma o passageiro ao invés de fazer a conexão, sairia do aeroporto, e não embarcaria no último voo. Essa técnica, chamada de Skiplagging (ou hidden city) em inglês já rendeu processo a passageiros e em 2014 um site Norte Americano foi processado pela United Airlines por disseminar a prática. Porém, não seria possível com vôos de ida e volta[3].





Skiplagging: “Pular a ultima perna”



Lufthansa tentando Inibir a prática