Viajes más Frecuentes

En esta parte, utilizaremos los datos de Origen y Destino y la frecuencia de de viaje de un lugar a otro, es decir la cantidad de veces que un Origen esta relacionado con un Destino.

Para esto, vamos a utilizar grafos, y los visualizaremos tanto con grafos dirigidos como grafos no dirigidos. Estos se ara con las librerias del paquete ggraph.

# Corro las librerias necesarias
library(ggraph)
## Loading required package: ggplot2
library(ggplot2)
# library(ggthemes)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union

# Leo el csv con los datos
df.vuelos <- read.csv("./csv/vuelos_2021.csv")

df.vuelos

El dataset ya esta ordenado por Origen y Destino.

Ahora, añadimos una columna contando la frecuencias de estos viajes.

frec.viajes <- df.vuelos %>% select(Origen, Destino) %>% group_by(Origen,Destino) %>% summarise(n=n())
## `summarise()` has grouped output by 'Origen'. You can override using the `.groups` argument.
frec.viajes

Habiendo tomado las freciencias de los viajes segun origen y destino, ya tenemos la información necesaria para podes visualizar lo que pasa con algun tipo de grafo.

Grafo NO dirigido

Tomemos los datos y produscamos un grafo no dirigido donde el ancho del hilo de unión entre dos aeropuertos represente la cantidad de vuelos que hay entre estos dos aeropuertos.

# Tomo el dataframe del grafo y pido que no sea dirigido
grafo <- graph.data.frame(frec.viajes, directed = F)


plot.igraph( grafo, 
             vertex.frame.color = "Forestgreen",
             vertex.size=degree(grafo, mode = "out"),
             vertex.label.cex=c(2,2.5,3), 
             vertex.label.dist=0,
             edge.color="black",
             edge.curved = F, 
             edge.width = E(grafo)/30)

En el grafo se puede visualizar que la mayoria de los viajes salen o de EZE o de AER. Entonces, tendria sentido preguntarse si hay alguna diferencia entre los vuelos que salen de EZE (o llegan) y los de AER.

Para esto, se pueden hacer grafos centrandonos solo en los vuelos que salen de EZE y de AER.

## La idea de este codigo es que cuando ustedes lo tengan a mano
## si oueden correrlo con , fig.show='animate' ouedan ver la 
## Secuencia de como esta cada uno relacionado con todos.
## A mi me falto tener instalado ffmep en windows cosa 
## que se me complico instalar antes de la entrega
grafica.grafo.origen <- function(df, filtro){
  # Filtra el dataset  
  dt <- df %>% filter(Origen == filtro)
  # crea el grafo
  gf <- graph.data.frame(dt, directed = F)
  
  # Dibuja el grafo
  plot.igraph( gf, 
             vertex.frame.color = "Forestgreen",
             vertex.label.cex=c(1.5,1,0.5), 
             vertex.label.dist=0,
             edge.color="black",
             edge.curved = F, 
             edge.width = E(gf)/30)
  }

# nombres <- names(table(frec.viajes$Origen))

#for (i in (1:4)){
#  grafica.grafo.origen(frec.viajes, nombres[i])  
#}

grafica.grafo.origen(frec.viajes, 'EZE')

grafica.grafo.origen(frec.viajes, 'AER')

En estos grafos, la frecuencia esta identificada por el tamaño de las letras.

¿Como montar en un mapa un grafo?

Necesitaria agregar las coordenadas de origenes y destino.

coord.origen <- df.vuelos %>% select(Origen, long.origen, lat.origen)
orig  <- table(coord.origen$Origen)
longs <- table(coord.origen$long.origen)

dim(orig)
## [1] 35
dim(longs)
## [1] 36
orig
## 
##  AER  BAR  BCA  CAT  CBA  CHP  CRR  CRV  DOZ  DRY  ECA  ESQ  EZE  GAL  GRA  IGU 
## 5458 1645  149   21 1504  138  115  348 1022   11  486   80 4693  226   83  519 
##  JUA  JUJ  MDP  NEU  OSA  PAR  POS  ROS  SAL  SDE  SIS  SRA  SVO  TRC  TRE  TUC 
##  187  311  338  659   51   50  210  352  675  151  174   68   56   52  268  513 
##  UIS  USU  VIE 
##   68  681   65
longs
## 
## -72.0530451840514 -71.1593078789764 -71.1406808520164  -71.136651782164 
##               486              1638               138                79 
## -69.3079189026267 -68.7938610497928 -68.4187752541459 -68.4031998682355 
##               226              1021               183                71 
## -68.3081049861187 -68.1544361990665 -67.7530829770762 -67.4655327946096 
##               684               673                83               347 
## -66.7923488935793 -66.3562805328339 -65.7527107900176 -65.4843872446955 
##                 2                70                21               677 
## -65.2686989064158 -65.1034976908493 -65.1022544666745 -65.0991094243988 
##               269                11               512               315 
## -64.3100211158383 -64.2748450739449 -64.2692882582764 -64.2082032341871 
##               150                51                53              1482 
## -62.9992672145635 -62.1537984793454 -60.8118014885171 -60.7852315547043 
##                71               147                58               352 
##  -60.480481255287 -59.0572367358005 -58.7620000607308 -58.5424618655614 
##                52               180               117              4697 
##        -58.413428 -57.5740449979357 -55.9712220853889 -54.4758314486937 
##              5435               340               211               525

Vemos que, al parecer, tenemos algunos problemas con las coordenadas, pues no tenemos iguales longitudes de origenes con longitudes de origenes (Deberiamos ver porque pasa esto).

Tomemos entonces el archivo viejo sobre coordenadas en ANAC para unirlo con el dataset de frecuencias.

data.coordenadas <- read.csv("./csv/sna_abril_2021_fixed_encoding.csv", encoding = 'UTF-8')
data.coordenadas <- data.coordenadas %>%
  select(fna, ana, x, y) %>%
  rename(
    aeropuerto  = fna,
    codigo.ANAC = ana,
    longitud = x,
    latitud  = y
    )

df.origen <- merge( x=frec.viajes, y=data.coordenadas, 
                    by.x='Origen', by.y='codigo.ANAC')

df.destino <- merge(x=frec.viajes, y=data.coordenadas,
                    by.x='Destino', by.y='codigo.ANAC')

df.destino <- df.destino %>% arrange(Origen, n )
df.origen  <- df.origen  %>% arrange(Origen, n )

new.df.frec.viajes <- df.origen %>% 
  mutate(
    lat.des  = df.destino$latitud,
    long.des = df.destino$longitud
  ) %>%
  rename(
    lat.or  = latitud,
    long.or = longitud,
  )

new.df.frec.viajes

Ahora si tenemos todo como queriamos. Sabiendo que tenemos \(35\) Origenes posibles, intentemos armar los grafos para cada aeropuerto representandolo en un mapa. Esto nos permitira visualizar de una mejor manera lo que pasa entre los enlaces de aeropuetos.


library(ggmap)
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
library(maps)
library(mapdata)
library(geosphere)

# Tomo datos coordenados de argentina, segun el dataframe dado por map_data
arg <- map_data("world", region = "Argentina")

# Limites coordenados aproximados de Argentina
# los calculo como el maximo y el minimo de las coordenadas en el dataframe
xlim <- c(min(arg$long), max(arg$long))
ylim <- c(min(arg$lat), max(arg$lat))



# Origen (string) identificara el origen segun el dataframe que tenemos
# El color (string) sera un color que represente a este origen
ploteo <- function(origen, color) {
  
  df.Origen <- new.df.frec.viajes %>% 
    filter( Origen == origen ) %>%
    select( long.or, lat.or, long.des, lat.des, n)
  
    
  for (i in (1:length(df.Origen$long.or))){
    
    # LLamo a la funcion gcIntermediate  la cual permite identificar
    # y dibujar tanto los puntos de origen destino como cualquier cosa
    # dado un radio n dentre del mapa+
    inter <- gcIntermediate(c(df.Origen$long.or[i], df.Origen$lat.or[i]), 
                            c(df.Origen$long.des[i], df.Origen$lat.des[i]), 
                            n = 1000, 
                            addStartEnd=TRUE,
                            breakAtDateLine=T, sp=TRUE
                          )
    
    # Dibujo la linea que conecta a los aeropuertos
    # donde el ancho de esta tomara en valor reducido en 
    # proporciones iguales y asi identificar con su ancho la frecuencia
    # de vuelos existentes entre estos tramos.
    lines(inter, col=color, lwd=df.Origen$n[i]/70) 
  }
  
}



Dibujar.Mapa <- function(vector.origenes) {
  # Creo un mapa para la Argentina
  maps::map('world', col="#ebeded", fill=TRUE, bg="white", lwd=0.05, xlim=xlim, ylim=ylim)

  # Creo un vector con los origenes segun la variable orig usada mas arriba

  colores <- c()
  
  for (i in (1:length(vector.origenes))){
    
    colores <- c(colores, colors()[i*5])
    ploteo(vector.origenes[i], colors()[i*5])
  
  }

  legend('topleft', 
          legend=c(vector.origenes),
          col=c(colores), 
          lty = 1:2, cex=1.3)

  points(x=new.df.frec.viajes$long.des, 
         y=new.df.frec.viajes$lat.des, 
         col="slateblue", cex=2, pch=20)

  text(new.df.frec.viajes$Destino, 
        x=new.df.frec.viajes$long.des, 
        y=new.df.frec.viajes$lat.des,  
        col="#ff8142", cex=1, pos=4)
}

# Creo un vector con todos los origenes segun la variable utilizada
# en el chunk anterior
vec.origenes <- names(orig)

# LLamo a la funcion encargada de dibujar el mapa
# Pasandole todos los origenes que se relacionan
Dibujar.Mapa(vec.origenes)

Con la misma idea que en el grafo, aca solo utilizamos el ancho de la linea para identificar que viaje tiene mas frecuencia.

Se puede ver claramente, que el vuelo mas requerido dentro de los vuelos regulares internos en el 2021 fue el viaje a bariloche, tanto desde EZE como de AER.

Si quisiesemos solo ver que pasa con un origen en particular (es decir que pasa con un solo aeropuerto), solo debemos utilizar la función Dibujar.Mapapasandole solo el origen requerido.

En este caso, al igual que antes, comparemos como se relacionan los aeropuertos con EZE y AER


Dibujar.Mapa(c("AER", "EZE"))

Este es mucho mas util para ver que vuelos son requeridos por un aeropuerto en particular o para comparar entre dos aeropuertos, como hicimos en este caso.

Se puede ver claramente que si bien hay una gran frecuencia de viajes desde AER \(\rightarrow\) BAR la frecuencia con la que estos viajes es requerido es mayo a la relacion EZE \(\rightarrow\) BAR. La misma tendencia se ve en los viajes a Cordoba. Sin embargo, se nota la tendencia inversa respecto de los viajes a Ushuaia.