Este trabajo contiene el reporte descriptivo del dataset “S5_ASA_estadisticasPasajeros.csv” que contiene información sobre el número de pasajeros en vuelos internacionales y nacionales de vuelos registrados en distintos aeropuertos de México.

Comenzaremos este reporte describiendo el dataset para su posterior análisis

datos <- read.csv("S5_ASA_estadisticasPasajeros.csv")
head(datos)
##   Anio.mes Codigo.IATA       Descripcion       Estado Pasajeros.nacionales
## 1   201501         CEN    Ciudad Obregon       Sonora                17149
## 2   201501         CLQ            Colima       Colima                 8486
## 3   201501         CME Ciudad del Carmen     Campeche                56079
## 4   201501         CPE          Campeche     Campeche                13264
## 5   201501         CTM          Chetumal Quintana Roo                13153
## 6   201501         CVM   Ciudad Victoria   Tamaulipas                 4695
##   Pasajeros.internacionales
## 1                       721
## 2                       124
## 3                      3126
## 4                       215
## 5                         0
## 6                       139

En las primeras 5 filas podemos visualizar que contamos con 5 variables las cuales son:

Anio.mes: Año y mes del vuelo Descripcion: el municipio donde se registró el vuelo Estado: Estado donde se registraron los pasajeros Pasajeros.nacionales: Número de pasajeros en vuelos nacionales Pasajeros.internacionales: Número de pasajeros en vuelos internacionales

Es decir que el primer registro puede leerse como: En enero de 2015 se registraron 17,149 pasajeros en vuelos nacionales y 721 en vuelos internaciones en el aeropuerto de Ciudad Obregón Sonora.

Para su correcto análisis estadístico necesitaremos verificar la estructura del dataset y, en caso necesario, limpiar el mismo.

str(datos)
## 'data.frame':    216 obs. of  6 variables:
##  $ Anio.mes                 : int  201501 201501 201501 201501 201501 201501 201501 201501 201501 201501 ...
##  $ Codigo.IATA              : chr  "CEN" "CLQ" "CME" "CPE" ...
##  $ Descripcion              : chr  "Ciudad Obregon" "Colima" "Ciudad del Carmen" "Campeche" ...
##  $ Estado                   : chr  "Sonora" "Colima" "Campeche" "Campeche" ...
##  $ Pasajeros.nacionales     : int  17149 8486 56079 13264 13153 4695 1315 1050 6684 5609 ...
##  $ Pasajeros.internacionales: int  721 124 3126 215 0 139 386 2684 61 10 ...

Observamos que las variables “Codigo.IATA”, “Descripcion” y “Estado” que son en principio variables categóricas están guardadas como texto. Adicionalemente la variable Anio.mes esta guardada como entero pero debe ser un registro categórico ordinal. Realizaremos los cambios pertinentes:

datos1 <- datos %>% mutate(
    Anio.mes = as.yearmon(as.character(Anio.mes), "%Y%m"),
    Codigo.IATA = as.factor(Codigo.IATA),
    Descripcion = as.factor(Descripcion),
    Estado = as.factor(Estado)
)

str(datos1)
## 'data.frame':    216 obs. of  6 variables:
##  $ Anio.mes                 : 'yearmon' num  ene. 2015 ene. 2015 ene. 2015 ene. 2015 ...
##  $ Codigo.IATA              : Factor w/ 18 levels "CEN","CLQ","CME",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Descripcion              : Factor w/ 18 levels "Campeche","Chetumal",..: 4 6 3 1 2 5 7 8 9 11 ...
##  $ Estado                   : Factor w/ 12 levels "Baja California  Sur",..: 10 3 2 2 8 11 10 1 11 11 ...
##  $ Pasajeros.nacionales     : int  17149 8486 56079 13264 13153 4695 1315 1050 6684 5609 ...
##  $ Pasajeros.internacionales: int  721 124 3126 215 0 139 386 2684 61 10 ...

Ahora veremos un resumen estadístico rápido de los datos

summary(datos1["Pasajeros.nacionales"])
##  Pasajeros.nacionales
##  Min.   :   63       
##  1st Qu.: 1198       
##  Median : 7947       
##  Mean   :10608       
##  3rd Qu.:14884       
##  Max.   :56418
summary(datos1["Pasajeros.internacionales"])
##  Pasajeros.internacionales
##  Min.   :   0.0           
##  1st Qu.:   7.0           
##  Median : 107.0           
##  Mean   : 818.2           
##  3rd Qu.: 584.0           
##  Max.   :7042.0

Se observa que únicamente los pasajeros internacionales han registrado en algún caso cero pasajeros internacionales. Observamos que el primer cuartil para pasajeros nacionales es mucho más corto que el segundo cuartil y el tercer cuartil lo cual indica una mayor proporción de vuelos con cantidades altas de pasajeros. Este comportamiento se ve replicado, aunque en mayor medida para vuelos internacionales. Esto podría tener sentido dado que las aerolíneas prefieren vuelos con mayores cupos, posiblemente se pueda explicar con las temporadas vacacionales entre algunos otros factores correspondientes a las fechas.

Adicionalmente se puede afirmar que es mayor el flujo de pasajeros nacionales que internacionales. Ahora haremos tablas de frecuencias para comenzar a profundizar el análisis

table(datos1$Estado)
## 
## Baja California  Sur             Campeche               Colima 
##                   12                   24                   12 
##            Michoacan              Nayarit               Oaxaca 
##                   12                   12                   12 
##               Puebla         Quintana Roo      San Luis Potosi 
##                   24                   12                   12 
##               Sonora           Tamaulipas             Veracruz 
##                   36                   36                   12
table(datos1$Descripcion)
## 
##          Campeche          Chetumal Ciudad del Carmen    Ciudad Obregon 
##                12                12                12                12 
##   Ciudad Victoria            Colima           Guaymas            Loreto 
##                12                12                12                12 
##         Matamoros           Nogales      Nuevo Laredo         Poza Rica 
##                12                12                12                12 
##            Puebla  Puerto Escondido            Tamuin          Tehuacan 
##                12                12                12                12 
##             Tepic           Uruapan 
##                12                12
table(datos1$Codigo.IATA)
## 
## CEN CLQ CME CPE CTM CVM GYM LTO MAM NLD NOG PAZ PBC PXM TCN TPQ TSL UPN 
##  12  12  12  12  12  12  12  12  12  12  12  12  12  12  12  12  12  12
table(datos1$Anio.mes)
## 
## ene. 2015 feb. 2015 mar. 2015 abr. 2015 may. 2015 jun. 2015 jul. 2015 ago. 2015 
##        18        18        18        18        18        18        18        18 
## sep. 2015 oct. 2015 nov. 2015 dic. 2015 
##        18        18        18        18

Notamos que la variable “Estado” no cuenta con datos uniformes lo cual confirma que los registros son por cada aeropuerto en un mes. Esto se ve reforzado con el Código IATA (de la International Air Transport Association) confirma que tenemos 12 registros por cada aeropuerto, dicho de otra forma, la variable “descripcion” es una “replica” de la variable “Codigo.IATA”.

La variable “Anio.mes” nos confirma que contamos con un total de 18 aeropuertos diferentes.

Veamos algunas estadísticas importantes

  1. Máximo por estado
  2. Promedios por aeropuerto
  3. Comportamiento mensual
  4. Aeropuerto Vs suma total
totales <- datos1 %>%
  group_by(Estado) %>%
  summarise(
    Total.nacionales = sum(Pasajeros.nacionales),
    Total.internacionales = sum(Pasajeros.internacionales),
    Total.general = Total.nacionales + Total.internacionales
  ) %>%
  arrange(desc(Total.general))

promedios <- datos1 %>%
  group_by(Descripcion) %>%
  summarise(
    Prom.nacionales = round(mean(Pasajeros.nacionales), 1),
    Prom.internacionales = round(mean(Pasajeros.internacionales), 1)
  ) %>%
  arrange(desc(Prom.nacionales))


mensuales <- datos1 %>%
  group_by(Anio.mes, Estado) %>%
  summarise(
    Total.mensual = sum(Pasajeros.nacionales + Pasajeros.internacionales),
    .groups = "drop"
  ) %>%
  arrange(Estado)

AeropuertoVSSumatotal <- datos1 %>%
  group_by(Descripcion) %>%
  summarise(
    Total.nacionales = sum(Pasajeros.nacionales),
    Total.internacionales = sum(Pasajeros.internacionales)
  )

Ahora visualizaremos los resultados:

totales %>%
  kable(caption = "Totales de pasajeros por estado") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Totales de pasajeros por estado
Estado Total.nacionales Total.internacionales Total.general
Campeche 769864 35041 804905
Puebla 267567 63056 330623
Sonora 253788 11576 265364
Tamaulipas 243126 2662 245788
Oaxaca 181706 3624 185330
Quintana Roo 179259 118 179377
Colima 112656 927 113583
Nayarit 113043 0 113043
Michoacan 95635 14432 110067
Veracruz 60575 0 60575
Baja California Sur 12602 45305 57907
San Luis Potosi 1598 0 1598
promedios %>%
  kable(caption = "Promedio mensual de pasajeros por aeropuerto (Código IATA)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Promedio mensual de pasajeros por aeropuerto (Código IATA)
Descripcion Prom.nacionales Prom.internacionales
Ciudad del Carmen 49262.8 2666.7
Puebla 22062.9 5254.7
Ciudad Obregon 19867.4 590.2
Puerto Escondido 15142.2 302.0
Chetumal 14938.2 9.8
Campeche 14892.5 253.4
Tepic 9420.2 0.0
Colima 9388.0 77.2
Matamoros 8078.9 58.9
Uruapan 7969.6 1202.7
Ciudad Victoria 6124.2 138.8
Nuevo Laredo 6057.3 24.2
Poza Rica 5047.9 0.0
Guaymas 1063.1 344.8
Loreto 1050.2 3775.4
Tehuacan 234.3 0.0
Nogales 218.5 29.6
Tamuin 133.2 0.0
mensuales %>%
  kable(caption = "Evolución mensual de pasajeros por estado") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Evolución mensual de pasajeros por estado
Anio.mes Estado Total.mensual
ene. 2015 Baja California Sur 3734
feb. 2015 Baja California Sur 5162
mar. 2015 Baja California Sur 6211
abr. 2015 Baja California Sur 7084
may. 2015 Baja California Sur 5628
jun. 2015 Baja California Sur 4677
jul. 2015 Baja California Sur 4382
ago. 2015 Baja California Sur 3860
sep. 2015 Baja California Sur 2372
oct. 2015 Baja California Sur 4241
nov. 2015 Baja California Sur 5107
dic. 2015 Baja California Sur 5449
ene. 2015 Campeche 72684
feb. 2015 Campeche 63890
mar. 2015 Campeche 69178
abr. 2015 Campeche 63837
may. 2015 Campeche 68300
jun. 2015 Campeche 64826
jul. 2015 Campeche 69743
ago. 2015 Campeche 63043
sep. 2015 Campeche 60924
oct. 2015 Campeche 67777
nov. 2015 Campeche 65289
dic. 2015 Campeche 75414
ene. 2015 Colima 8610
feb. 2015 Colima 9274
mar. 2015 Colima 8991
abr. 2015 Colima 8768
may. 2015 Colima 8907
jun. 2015 Colima 9138
jul. 2015 Colima 10139
ago. 2015 Colima 9618
sep. 2015 Colima 7327
oct. 2015 Colima 8476
nov. 2015 Colima 11974
dic. 2015 Colima 12361
ene. 2015 Michoacan 9435
feb. 2015 Michoacan 6501
mar. 2015 Michoacan 7625
abr. 2015 Michoacan 8341
may. 2015 Michoacan 8726
jun. 2015 Michoacan 9761
jul. 2015 Michoacan 10750
ago. 2015 Michoacan 10927
sep. 2015 Michoacan 7620
oct. 2015 Michoacan 8827
nov. 2015 Michoacan 9739
dic. 2015 Michoacan 11815
ene. 2015 Nayarit 8116
feb. 2015 Nayarit 7062
mar. 2015 Nayarit 8953
abr. 2015 Nayarit 8664
may. 2015 Nayarit 9437
jun. 2015 Nayarit 9027
jul. 2015 Nayarit 10253
ago. 2015 Nayarit 9767
sep. 2015 Nayarit 7739
oct. 2015 Nayarit 8466
nov. 2015 Nayarit 11416
dic. 2015 Nayarit 14143
ene. 2015 Oaxaca 17334
feb. 2015 Oaxaca 11577
mar. 2015 Oaxaca 15884
abr. 2015 Oaxaca 15894
may. 2015 Oaxaca 11757
jun. 2015 Oaxaca 11203
jul. 2015 Oaxaca 18877
ago. 2015 Oaxaca 18476
sep. 2015 Oaxaca 12871
oct. 2015 Oaxaca 13666
nov. 2015 Oaxaca 15626
dic. 2015 Oaxaca 22165
ene. 2015 Puebla 25670
feb. 2015 Puebla 20105
mar. 2015 Puebla 26338
abr. 2015 Puebla 26544
may. 2015 Puebla 26526
jun. 2015 Puebla 27048
jul. 2015 Puebla 32163
ago. 2015 Puebla 31991
sep. 2015 Puebla 26671
oct. 2015 Puebla 28926
nov. 2015 Puebla 29251
dic. 2015 Puebla 29390
ene. 2015 Quintana Roo 13153
feb. 2015 Quintana Roo 11116
mar. 2015 Quintana Roo 13653
abr. 2015 Quintana Roo 14293
may. 2015 Quintana Roo 13771
jun. 2015 Quintana Roo 14341
jul. 2015 Quintana Roo 15968
ago. 2015 Quintana Roo 16101
sep. 2015 Quintana Roo 14640
oct. 2015 Quintana Roo 15178
nov. 2015 Quintana Roo 18323
dic. 2015 Quintana Roo 18840
ene. 2015 San Luis Potosi 108
feb. 2015 San Luis Potosi 205
mar. 2015 San Luis Potosi 172
abr. 2015 San Luis Potosi 89
may. 2015 San Luis Potosi 158
jun. 2015 San Luis Potosi 89
jul. 2015 San Luis Potosi 162
ago. 2015 San Luis Potosi 187
sep. 2015 San Luis Potosi 139
oct. 2015 San Luis Potosi 63
nov. 2015 San Luis Potosi 91
dic. 2015 San Luis Potosi 135
ene. 2015 Sonora 19865
feb. 2015 Sonora 17708
mar. 2015 Sonora 22979
abr. 2015 Sonora 22122
may. 2015 Sonora 22481
jun. 2015 Sonora 21101
jul. 2015 Sonora 23661
ago. 2015 Sonora 21932
sep. 2015 Sonora 19394
oct. 2015 Sonora 22670
nov. 2015 Sonora 24752
dic. 2015 Sonora 26699
ene. 2015 Tamaulipas 17198
feb. 2015 Tamaulipas 17159
mar. 2015 Tamaulipas 21741
abr. 2015 Tamaulipas 19004
may. 2015 Tamaulipas 19349
jun. 2015 Tamaulipas 21592
jul. 2015 Tamaulipas 21631
ago. 2015 Tamaulipas 20169
sep. 2015 Tamaulipas 21701
oct. 2015 Tamaulipas 24095
nov. 2015 Tamaulipas 21250
dic. 2015 Tamaulipas 20899
ene. 2015 Veracruz 4490
feb. 2015 Veracruz 5368
mar. 2015 Veracruz 5756
abr. 2015 Veracruz 5410
may. 2015 Veracruz 5130
jun. 2015 Veracruz 5450
jul. 2015 Veracruz 5501
ago. 2015 Veracruz 5021
sep. 2015 Veracruz 4276
oct. 2015 Veracruz 4666
nov. 2015 Veracruz 4928
dic. 2015 Veracruz 4579
AeropuertoVSSumatotal %>%
  kable(caption = "Totales de pasajeros por aeropuerto") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Totales de pasajeros por aeropuerto
Descripcion Total.nacionales Total.internacionales
Campeche 178710 3041
Chetumal 179259 118
Ciudad del Carmen 591154 32000
Ciudad Obregon 238409 7083
Ciudad Victoria 73491 1665
Colima 112656 927
Guaymas 12757 4138
Loreto 12602 45305
Matamoros 96947 707
Nogales 2622 355
Nuevo Laredo 72688 290
Poza Rica 60575 0
Puebla 264755 63056
Puerto Escondido 181706 3624
Tamuin 1598 0
Tehuacan 2812 0
Tepic 113043 0
Uruapan 95635 14432

Tomando esto en cuenta comenzaremos un análisis visual de los datos.

ggplot(datos1, aes(x = Pasajeros.nacionales)) +
  geom_histogram(binwidth = 5000, fill = "#4c78a8", color = "white") +
  labs(title = "Distribución de pasajeros nacionales",
       x = "Pasajeros nacionales", y = "Frecuencia") +
  theme_minimal(base_size = 13)

La distribución de los pasajeros conforma nuestra sospecha de que hay una mayor concentración de registros con cantidades pequeñas de pasajeros mensuales registrados.

ggplot(totales, aes(x = reorder(Estado, Total.general))) +
  geom_col(aes(y = Total.nacionales, fill = "Nacionales")) +
  geom_col(aes(y = Total.internacionales, fill = "Internacionales")) +
  scale_fill_manual(values = c("Nacionales" = "#1f77b4", "Internacionales" = "#ff7f0e")) +
  coord_flip() +
  labs(title = "Total de pasajeros por estado",
       x = "Estado", y = "Pasajeros", fill = "Tipo") +
  theme_minimal(base_size = 13)

El total de pasajeros por estado nos muestra que el estado con mayor número de pasajeros registrados es campeche y que, como se especulaba al inicio, es mucho mayor el número de vuelos nacionales que internacionales.

ggplot(promedios, aes(x = reorder(Descripcion, Prom.nacionales))) +
  geom_col(aes(y = Prom.nacionales, fill = "Nacionales")) +
  geom_col(aes(y = Prom.internacionales, fill = "Internacionales")) +
  scale_fill_manual(values = c("Nacionales" = "#1f77b4", "Internacionales" = "#ff7f0e")) +
  coord_flip() +
  labs(title = "Promedio mensual de pasajeros por aeropuerto",
       x = "Código IATA", y = "Pasajeros promedio", fill = "Tipo") +
  theme_minimal(base_size = 13)

Observamos que los aeropuertos aparentan mantener el orden que, en la gráfica anterior, convendría revisar cual es el aporte de pasajeros que dan a su estado correspondiente, para esto haremos un breve inciso:

# Evaluamos la aportación que tiene cada estado al número de pasajeros
aportacion_por_aeropuerto <- datos1 %>%
  group_by(Estado, Descripcion) %>%
  summarise(
    Total.aeropuerto = sum(Pasajeros.nacionales + Pasajeros.internacionales),
    .groups = "drop"
  ) %>%
  left_join(
    datos1 %>%
      group_by(Estado) %>%
      summarise(Total.estado = sum(Pasajeros.nacionales + Pasajeros.internacionales)),
    by = "Estado"
  ) %>%
  mutate(
    Porcentaje = round(100 * Total.aeropuerto / Total.estado, 2)
  ) %>%
  arrange(desc(Total.estado))

# graficamos:

ggplot(aportacion_por_aeropuerto, aes(x = Estado, y = Total.aeropuerto, fill = Descripcion)) +
  geom_col() +
  labs(title = "Aportación de cada aeropuerto al total de pasajeros por estado",
       x = "Estado", y = "Pasajeros", fill = "Aeropuerto") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Ahora observamos como no todos los aeropuertos aportan la misma cantidad, lo cual indica que según sea lo que se explore se debe tomar en cuenta el estado o el aeropuerto.

ggplot(mensuales, aes(x = Anio.mes, y = Total.mensual, color = Estado)) +
  geom_line(size = 1) +
  scale_x_yearmon(n = 12, format = "%b %Y") +
  labs(title = "Evolución mensual de pasajeros por estado",
       x = "Mes", y = "Total mensual de pasajeros", color = "Estado") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

La evolución mensual por estado nos muestra como la cantidad de pasajeros pareciera ser estable con leves picos en la temporada vacacional de julio a agosto así como de noviembre a enero y un leve decaimiento en febrero (posible efecto “cuesta de enero”).

ggplot(datos1, aes(x = as.factor(Anio.mes), y = Pasajeros.nacionales)) +
  geom_boxplot(fill = "#4c78a8", alpha = 0.8) +
  labs(title = "Dispersión mensual de pasajeros nacionales",
       x = "Mes", y = "Pasajeros nacionales") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Los boxplots muestran cómo, ignorando los datos atípicos (posiblemente campeche), se tienen comportamientos de pasajeros muy estables

ggplot(datos1, aes(x = Pasajeros.nacionales, y = Pasajeros.internacionales)) +
  geom_point(alpha = 0.6, color = "#1f77b4") +
  labs(title = "Relación entre pasajeros nacionales e internacionales",
       x = "Pasajeros nacionales", y = "Pasajeros internacionales") +
  theme_minimal(base_size = 13)

La grafica de puntos sugiere una leve correlación entre el número de pasajeros, es decir que los aeropuertos suelen tener la misma proporción de pasajeros internacionales que nacionales, evaluaremos esto rápido con lo siguiente:

datos1 <- datos1 %>%
  mutate(Proporcion = Pasajeros.nacionales / Pasajeros.internacionales) %>%
  filter(is.finite(Proporcion))  # Elimina NA, Inf, -Inf


ggplot(datos1, aes(x = Anio.mes, y = Proporcion)) +
  geom_point(alpha = 0.6, color = "#1f77b4") +
  geom_smooth(method = "loess", se = FALSE, color = "gray40") +
  labs(title = "Proporción internacional/nacional a lo largo del tiempo",
       x = "Mes", y = "Proporción") +
  theme_minimal(base_size = 13)
## Warning: The `trans` argument of `continuous_scale()` is deprecated as of ggplot2 3.5.0.
## ℹ Please use the `transform` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'

si bien observamos datos atípicos aparentemente contamos con proporciones constantes