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.
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.
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.Mapa
pasandole 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.