La serie temporal analizada corresponde al número total de pasajeros transportados mensualmente por el Metro de Medellín (incluyendo las líneas principales 1 y 2). Este conjunto de datos permite observar la dinámica de la demanda de transporte público en el área metropolitana
La elección de esta serie se justifica por su utilidad para el modelado y la predicción de la demanda. Al presentar una clara tendencia creciente y una fuerte estacionalidad anual
Los datos tienen una frecuencia mensual (1M), cubriendo el periodo desde principios de 2011 hasta finales de 2019.
metro <- read.csv("C:/Users/USUARIO/Downloads/metro_a.csv")
metro_tsibble <- metro |>
mutate(periodo = yearmonth(periodo)) |>
as_tsibble(index = periodo)
metro_tsibble |>
ggplot(aes(x = periodo, y = valor)) +
geom_line(color = "blue") +
labs(title = "Serie temporal mensual de pasajeros de metro",
x = "Periodo",
y = "Pasajeros") +
scale_y_continuous(labels = scales::label_comma(accuracy = 1)) +
theme_minimal()
Análisis: La serie muestra una clara tendencia creciente de 2011 a 2017, lo que indica un aumento sostenido en el uso del servicio. Además, presenta una fuerte estacionalidad, con picos y valles recurrentes dentro de cada año. La variabilidad (la amplitud de los picos) parece aumentar a medida que la tendencia sube, sugiriendo heterocedasticidad (varianza no constante).
metro_tsibble |>
gg_subseries(valor) +
labs(title = "Subseries mensuales de pasajeros de metro",
x = "Mes", y = "Pasajeros") +
scale_y_continuous(labels = scales::label_comma(accuracy = 1))
## Warning: `gg_subseries()` was deprecated in feasts 0.4.2.
## ℹ Please use `ggtime::gg_subseries()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Análisis: La gráfica de subseries confirma una fuerte estacionalidad mensual. Se observa que los meses de inicio y final de año (particularmente enero y diciembre, y los meses de vacaciones) presentan consistentemente los picos más altos de pasajeros, mientras que los meses intermedios tienden a mostrar valores promedio más bajos. La línea horizontal para cada mes muestra que la tendencia creciente afecta a todos los meses por igual.
metro_tsibble %>%
gg_season(valor) +
labs(title = "Estacionalidad mensual de pasajeros de metro",
x = "Mes", y = "Pasajeros") +
scale_y_continuous(labels = scales::label_comma(accuracy = 1))
## Warning: `gg_season()` was deprecated in feasts 0.4.2.
## ℹ Please use `ggtime::gg_season()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Análisis: El gráfico estacional refuerza que la demanda de pasajeros es altamente cíclica con un ciclo anual bien definido. El mes de enero se destaca como el pico más alto en la mayoría de los años. Los meses intermedios, como abril a septiembre, muestran una variabilidad estacional menor y un nivel de pasajeros promedio más bajo, lo cual es fundamental para la planificación operativa de recursos y mantenimiento.
Los patrones visibles en la serie son:
Tendencia Positiva: Crecimiento sostenido hasta 2017.
Estacionalidad: Fuerte patrón cíclico de 12 meses.
No Estacionariedad: La serie es no estacionaria tanto en la media (debido a la tendencia) como posiblemente en la varianza (heterocedasticidad).
metro_tsibble |>
ACF(valor, lag_max = 25) |>
autoplot() +
labs(title = "Función de autocorrelación (ACF) - Pasajeros de metro (hasta 36 meses)",
x = "Rezago (meses)",
y = "Autocorrelación") +
theme_minimal()
Análisis de la ACF: La Función de Autocorrelación (ACF) muestra un decaimiento extremadamente lento y positivo en los primeros rezagos, lo que es una fuerte tendencia no estacionaria. Además, se observan picos significativos en los rezagos 12, 24, lo que confirma la presencia de una fuerte estacionalidad anual.
metro_tsibble |>
PACF(valor) |>
autoplot() +
labs(title = "Función de autocorrelación parcial (PACF) - Pasajeros de metro",
x = "Rezago (meses)",
y = "Autocorrelación parcial") +
theme_minimal()
Análisis de la PACF: La Función de Autocorrelación Parcial (PACF) muestras un pico muy alto y significativo en el rezago 1 (cercano a 0.8), lo que corrobora la fuerte tendencia ya identificada en la serie.
Discusión sobre estacionariedad o no estacionariedad de la serie
La serie es claramente no estacionaria. Esta conclusión se basa en tres evidencias clave:
Tendencia: La media de la serie cambia con el tiempo (es creciente).
Varianza: La varianza de las fluctuaciones parece aumentar con el nivel de la serie.
ACF: El decaimiento lento y positivo de la ACF.
Por lo tanto, la serie requiere de transformaciones matemáticas para estabilizar la varianza
metro_transform <- metro_tsibble |>
mutate(
Logaritmo = log(valor),
Raiz_cuadrada = sqrt(valor)
)
metro_transform |>
autoplot(valor) +
labs(title = "Serie original - Pasajeros de metro",
x = "Periodo", y = "Número de pasajeros") +
scale_y_continuous(labels = scales::label_comma(accuracy = 1)) +
theme_minimal()
metro_transform |>
autoplot(Logaritmo) +
labs(title = "Serie transformada - Logaritmo",
x = "Periodo", y = "Log(Pasajeros)") +
theme_minimal()
4.1 Logaritmo: La transformación logarítmica estabilizó notablemente la varianza, haciendo que la amplitud de las fluctuaciones sea más constante a lo largo del tiempo, aunque la tendencia persiste.
metro_transform |>
autoplot(Raiz_cuadrada) +
labs(title = "Serie transformada - Raíz cuadrada",
x = "Periodo", y = "Raíz cuadrada(Pasajeros)") +
theme_minimal()
4.2 Raíz cuadrada: Al igual que con el logaritmo, esta transformación ha ayudado a reducir la dispersión y hacer que la varianza sea más constante que en la serie original. La tendencia positiva y la estacionalidad siguen siendo características predominantes de la serie. Visualmente, el efecto en la estabilización de la varianza es menos marcado que el de la transformación logarítmica.
lambda_opt <- metro_tsibble |>
features(valor, features = guerrero) |>
pull(lambda_guerrero)
lambda_opt
## [1] 0.4692848
metro_tsibble <- metro_tsibble |>
mutate(
Valor_BoxCox = box_cox(valor, lambda = lambda_opt)
)
metro_tsibble |>
autoplot(Valor_BoxCox) +
labs(
title = paste0("Serie transformada - Box-Cox (λ = ", round(lambda_opt, 3), ")"),
x = "Periodo",
y = "Pasajeros transformados"
) +
theme_minimal()
4.3 Box-Cox (lambda = 0.469): La transformación Box-Cox con el parámetro óptimo de \(\lambda = 0.469\) logra la mejor estabilización visual de la varianza. Este valor, cercano a la raíz cuadrada (lambda = 0.5), indica que la corrección para la heterocedasticidad es moderada.
metro_stl <- metro_tsibble |>
model(stl = STL(valor ~ trend(window = 7) + season(window = "periodic")))
components <- metro_stl |> components()
components |>
autoplot() +
labs(title = "Descomposición STL de la serie de pasajeros del metro",x ="Periodo") + scale_y_continuous(labels = scales::label_comma(accuracy = 1)) +
theme_minimal()
## Ignoring unknown labels:
## • colour : ".model"
## • fill : ".model"
Aanálisis de los componentes
Componente de Tendencia: Confirma el fuerte crecimiento de la demanda entre 2011 y 2017. Es notable que la tendencia alcanza un máximo alrededor de 2017 y muestra un ligero estancamiento o descenso hacia el final del periodo.
Componente Estacional: Muestra un patrón periódico anual claro y constante, con picos y valles consistentes dentro de cada año, lo que corrobora la fuerte estacionalidad.
Componente Residual: Representa el ruido. Los residuos oscilan alrededor de cero, lo cual es indicativo de que el STL ha capturado la mayor parte de la estructura de la serie.
La descomposición STL es la confirmación visual de que la serie combina un comportamiento cíclico de 12 meses con una tendencia de largo plazo.
metro_ma <- metro_tsibble |>
mutate(
`3-MA` = slide_dbl(valor, mean, .before = 1, .after = 1, .complete = TRUE),
`6-MA` = slide_dbl(valor, mean, .before = 2, .after = 3, .complete = TRUE)
)
metro_ma |>
autoplot(valor) +
geom_line(aes(y = `3-MA`), colour = "red") +
geom_line(aes(y = `6-MA`), colour = "green") +
labs(
y = "Número de pasajeros",
title = "Pasajeros del metro con medias móviles",
subtitle = "Rojo = 3-MA, Verde = 6-MA"
) + scale_y_continuous(labels = scales::label_comma(accuracy = 1))
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 5 rows containing missing values or values outside the scale range
## (`geom_line()`).
Análisis: La Media Móvil de 3 periodos (3-MA, Roja) ofrece una suavización limitada, siguiendo de cerca los movimientos estacionales de la serie original. La Media Móvil de 6 periodos (6-MA, Verde) proporciona una mejor visualización de la tendencia subyacente, atenuando de manera más efectiva el ruido mensual y revelando claramente el patrón de crecimiento y el posterior estancamiento/descenso.
Discusión sobre la capacidad para capturar la tendencia: Las medias móviles son un método de suavizamiento primario que logran identificar la tendencia (especialmente la 6-MA). Sin embargo, al ser métodos retrospectivos, rezagan el seguimiento de los cambios y no son predictivos por sí mismos, por lo que son principalmente herramientas de análisis exploratorio para confirmar la dirección a largo plazo de la serie.
Resumen del comportamiento de la serie: La serie de pasajeros del metro es un ejemplo claro de una serie no estacionaria caracterizada por:
Tendencia: Fuerte crecimiento que culmina en 2017.
Estacionalidad: Un patrón anual (12 meses) muy fuerte y constante.
Varianza: Creciente (heterocedasticidad), lo que requirió la aplicación de una transformación Box-Cox (\(\lambda \approx 0.47\)).
Hallazgos clave (Correlación)
metro2 <- read.csv("C:/Users/USUARIO/Downloads/metro_b.csv")
metro2_tsibble <- metro2 |>
mutate(periodo = yearmonth(periodo)) |>
as_tsibble(index = periodo)
metro_total <- metro_tsibble |>
select(periodo, valor) |>
rename(L1 = valor) |>
left_join(
metro2_tsibble |> select(periodo, valor) |> rename(L2 = valor),
by = "periodo"
)
metro_total |>
autoplot(L1, colour = "blue") +
geom_line(aes(y = L2), colour = "red") +
labs(title = "Comparación de pasajeros entre Línea 1 y Línea 2",
x = "Periodo", y = "Pasajeros",
subtitle = "Azul = Línea 1, Rojo = Línea 2") +
scale_y_continuous(labels = scales::label_comma(accuracy = 1)) +
theme_minimal()
correlacion_lineas <- cor(metro_total$L1, metro_total$L2, use = "complete.obs")
correlacion_lineas
## [1] 0.9279947
ggplot(metro_total, aes(x = L1, y = L2)) +
geom_point(color = "darkgreen") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Diagrama de dispersión entre Línea 1 y Línea 2",
x = "Pasajeros Línea 1",
y = "Pasajeros Línea 2") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Análisis de Correlación entre Línea 1 y Línea 2: El coeficiente de correlación de \(0.9279947\) indica una relación lineal extremadamente fuerte y positiva entre el tráfico de pasajeros de ambas líneas. El diagrama de dispersión confirma que los movimientos de ambas líneas están sincronizados
Fuente de los datos
https://www.kaggle.com/datasets/draorz/movilidad-mensual-metro-de-medellin