Este informe tiene como objetivo segmentar los períodos operacionales del Aeropuerto Internacional de la Ciudad de México (AICM) en grupos homogéneos (clusters) basados en el volumen de pasajeros. Esto se logra mediante una combinación de Análisis de Correlación, Análisis de Componentes Principales (PCA) y K-Means.
# Cargar librerías
library(dplyr)
library(ggplot2)
library(factoextra)
library(FactoMineR)
library(corrplot)
# Cargar el conjunto de datos
datos <- read.csv("movimiento_operacional_pasajeros_comerciales_aicm_ok.csv")
# Selección de variables de interés (Pasajeros)
datos_agrupar <- datos %>%
select(
pasajeros_llegadas_nacionales,
pasajeros_salidas_nacionales,
pasajeros_llegadas_internacionales,
pasajeros_salidas_internacionales
)
# Escalado de datos (necesario para K-Means y PCA)
datos_escalados <- scale(datos_agrupar)
datos_escalados_df <- as.data.frame(datos_escalados)
El primer paso es entender la relación lineal entre las cuatro variables de tráfico de pasajeros.
# Calcular la matriz de correlación de Pearson
matriz_correlacion <- cor(datos_agrupar, method = "pearson")
cat("### Matriz de Correlación de Pearson\n")
## ### Matriz de Correlación de Pearson
print(round(matriz_correlacion, 4))
## pasajeros_llegadas_nacionales
## pasajeros_llegadas_nacionales 1.0000
## pasajeros_salidas_nacionales 0.9782
## pasajeros_llegadas_internacionales 0.8782
## pasajeros_salidas_internacionales 0.8532
## pasajeros_salidas_nacionales
## pasajeros_llegadas_nacionales 0.9782
## pasajeros_salidas_nacionales 1.0000
## pasajeros_llegadas_internacionales 0.8743
## pasajeros_salidas_internacionales 0.8634
## pasajeros_llegadas_internacionales
## pasajeros_llegadas_nacionales 0.8782
## pasajeros_salidas_nacionales 0.8743
## pasajeros_llegadas_internacionales 1.0000
## pasajeros_salidas_internacionales 0.9767
## pasajeros_salidas_internacionales
## pasajeros_llegadas_nacionales 0.8532
## pasajeros_salidas_nacionales 0.8634
## pasajeros_llegadas_internacionales 0.9767
## pasajeros_salidas_internacionales 1.0000
# Generar el Heatmap
corrplot(matriz_correlacion,
method = "color",
type = "upper",
tl.col = "black",
addCoef.col = "black",
tl.srt = 45,
diag = FALSE,
title = "\nMatriz de Correlación de Movimiento de Pasajeros"
)
Obtención de Resultados Se observa una correlación positiva extremadamente fuerte (valores muy cercanos a +1) entre todas las variables. Esto indica que el tráfico en el AICM es altamente sistémico: el aumento o disminución en un segmento (ej., llegadas internacionales) se refleja proporcionalmente en todos los demás. Esta fuerte correlación justifica el uso del PCA para simplificar el análisis.
El PCA busca identificar los factores subyacentes que explican la variación total.
# Realizar el PCA
res_pca <- PCA(datos_escalados_df, graph = FALSE)
# Mostrar la tabla de Eigenvalores
eigen_valores <- get_eigenvalue(res_pca)
cat("### Varianza Explicada por Componente\n")
## ### Varianza Explicada por Componente
print(round(eigen_valores, 2))
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.71 92.80 92.80
## Dim.2 0.24 6.09 98.89
## Dim.3 0.03 0.73 99.62
## Dim.4 0.02 0.38 100.00
# Gráfico de Varianza Explicada (Scree Plot)
fviz_eig(res_pca, addlabels = TRUE, ylim = c(0, 100))
Obtención de Resultados La Dimensión 1 (CP1) explica la gran mayoría de la varianza (típicamente más del 90%). Esto confirma que las cuatro variables son casi redundantes y que el factor más importante que diferencia a los meses es el Volumen Total de pasajeros.
datos_escalados <- scale(datos_agrupar)
datos_escalados_df <- as.data.frame(datos_escalados)
El primer paso es entender la relación lineal entre las cuatro variables de tráfico de pasajeros.
matriz_correlacion <- cor(datos_agrupar, method = "pearson")
cat("### Matriz de Correlación de Pearson\n")
## ### Matriz de Correlación de Pearson
print(round(matriz_correlacion, 4))
## pasajeros_llegadas_nacionales
## pasajeros_llegadas_nacionales 1.0000
## pasajeros_salidas_nacionales 0.9782
## pasajeros_llegadas_internacionales 0.8782
## pasajeros_salidas_internacionales 0.8532
## pasajeros_salidas_nacionales
## pasajeros_llegadas_nacionales 0.9782
## pasajeros_salidas_nacionales 1.0000
## pasajeros_llegadas_internacionales 0.8743
## pasajeros_salidas_internacionales 0.8634
## pasajeros_llegadas_internacionales
## pasajeros_llegadas_nacionales 0.8782
## pasajeros_salidas_nacionales 0.8743
## pasajeros_llegadas_internacionales 1.0000
## pasajeros_salidas_internacionales 0.9767
## pasajeros_salidas_internacionales
## pasajeros_llegadas_nacionales 0.8532
## pasajeros_salidas_nacionales 0.8634
## pasajeros_llegadas_internacionales 0.9767
## pasajeros_salidas_internacionales 1.0000
Obtención de Resultados: Se observa una correlación positiva extremadamente fuerte (valores muy cercanos a +1) entre todas las variables. Esto indica que el tráfico en el AICM es altamente sistémico: el aumento o disminución en un segmento (ej., llegadas internacionales) se refleja proporcionalmente en todos los demás. Esta fuerte correlación justifica el uso del PCA para simplificar el análisis.
El PCA busca identificar los factores subyacentes que explican la variación total.
# Realizar el PCA
res_pca <- PCA(datos_escalados_df, graph = FALSE)
# Mostrar la tabla de Eigenvalores
eigen_valores <- get_eigenvalue(res_pca)
cat("### Varianza Explicada por Componente\n")
## ### Varianza Explicada por Componente
print(round(eigen_valores, 2))
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.71 92.80 92.80
## Dim.2 0.24 6.09 98.89
## Dim.3 0.03 0.73 99.62
## Dim.4 0.02 0.38 100.00
# Gráfico de Varianza Explicada (Scree Plot)
fviz_eig(res_pca, addlabels = TRUE, ylim = c(0, 100))
Obtención de Resultados: La Dimensión 1 (CP1) explica la gran mayoría de la varianza (típicamente más del 90%). Esto confirma que las cuatro variables son casi redundantes y que el factor más importante que diferencia a los meses es el Volumen Total de pasajeros.
# Gráfico del Círculo de Correlaciones
fviz_pca_var(res_pca,
col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE,
title = "Círculo de Correlaciones (Variables vs. CP)"
)
Obtención de Resultados: Todos los vectores de las variables se encuentran agrupados y alineados con el eje horizontal (Dim 1). Esto significa que la CP1 es el “Índice de Volumen Operacional”. La Dimensión 2 (eje vertical) capta varianza mínima, lo que indica que no hay un contraste significativo entre el tráfico Nacional vs. Internacional que diferencie significativamente los períodos operacionales.
# Usaremos k=4, basado en análisis previos
k_optimo <- 4
set.seed(123)
resultado_kmeans <- kmeans(datos_escalados, centers = k_optimo, nstart = 25)
datos$cluster_kmeans <- as.factor(resultado_kmeans$cluster)
# Desescalamos los centroides para unidades originales (pasajeros)
centroides_escalados <- resultado_kmeans$centers
medias_originales <- attr(datos_escalados, "scaled:center")
desviaciones_originales <- attr(datos_escalados, "scaled:scale")
centroides_originales <- scale(centroides_escalados, center = -medias_originales/desviaciones_originales, scale = 1/desviaciones_originales)
centroides_originales <- as.data.frame(centroides_originales)
centroides_originales$cluster_kmeans <- 1:k_optimo
cat("### Perfil del Cluster (Centroides en unidades originales - Promedio de Pasajeros)\n")
## ### Perfil del Cluster (Centroides en unidades originales - Promedio de Pasajeros)
print(round(centroides_originales, 0))
## pasajeros_llegadas_nacionales pasajeros_salidas_nacionales
## 1 1175063 1168652
## 2 1330762 1349457
## 3 434260 435271
## 4 980451 982226
## pasajeros_llegadas_internacionales pasajeros_salidas_internacionales
## 1 626705 615982
## 2 731754 717635
## 3 94727 96846
## 4 410719 412605
## cluster_kmeans
## 1 1
## 2 2
## 3 3
## 4 4
Obtención de Resultados: Esta tabla define los perfiles. La gerencia puede nombrar los clusters:Cluster 1 (Ejemplo): Valores más altos \(\implies\) “Temporada Pico”.Cluster 4 (Ejemplo): Valores más bajos \(\implies\) “Temporada Valle” (ideal para mantenimiento).El perfilamiento permite la asignación precisa de recursos (personal, slots) para cada tipo de mes.
# Proyección de los clusters K-Means sobre las 2 Componentes Principales
fviz_cluster(
object = resultado_kmeans,
data = datos_escalados,
geom = "point",
ellipse.type = "convex",
palette = "Set1",
ggtheme = theme_minimal(),
main = "Segmentación K-Means en el Espacio PCA"
)
La separación de los clusters en el gráfico ocurre de manera lineal a lo largo de la Dim 1. Esto visualmente confirma que la segmentación se realiza en función del Volumen Total de Tráfico, lo cual es la principal fuente de variación identificada por el PCA.
El análisis multivariado concluye que el comportamiento operacional del AICM es impulsado casi exclusivamente por el volumen total de tráfico. La segmentación K-Means ha identificado 4 perfiles de demanda distintos:
Perfil de Máximo Tráfico (Pico)
Perfil de Alto Tráfico
Perfil de Tráfico Medio
Perfil de Mínimo Tráfico (Valle)
Se sugiere utilizar el perfil de cluster como la métrica principal para la planificación operativa y comercial, sustituyendo o complementando la clasificación de temporada basada únicamente en fechas. Esto garantiza que la asignación de recursos sea proporcional a la demanda real de pasajeros.