if (!require("pacman")) install.packages("pacman")
pacman::p_load(fpp3, GGally, feasts, tsibble, lubridate, broom, patchwork, ggplot2, dplyr, tidyr)
# 1. Cargar el conjunto de datos aus_retail
# 2. Filtrar la información correspondiente a la industria Clothing retailing y al estado New South Wales
clothing_nsw <- aus_retail %>%
filter(Industry == "Clothing retailing", State == "New South Wales") %>%
as_tsibble(index = Month)
# 3. Generar un gráfico de subseries estacionales
# 4. Mejorar la legibilidad del gráfico
clothing_nsw %>% gg_subseries(Turnover) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
labs(title = "Subseries estacional: Clothing retailing en New South Wales (Turnover)",
y = "Turnover", x = "Mes")
El gráfico de subseries estacionales para la industria de ropa en New South Wales muestra patrones estacionales claros:
Patrones estacionales evidenciados: Se observa un pico consistente en diciembre (temporada navideña) y una caída notable en enero y febrero, seguida de una recuperación gradual hacia mediados de año. También hay un segundo pico menos pronunciado alrededor de julio-agosto.
Meses con comportamiento diferente: Diciembre muestra consistentemente los valores más altos del año, mientras que febrero tiende a tener los valores más bajos. Enero también muestra valores bajos, probablemente debido al efecto post-navidad.
Tendencia general: Se observa una tendencia creciente a lo largo de los años, con los valores de todos los meses aumentando gradualmente con el tiempo. Los picos de diciembre se han vuelto más pronunciados en los años más recientes.
# 1. Cargar la base de datos aus_retail
# 2. Filtrar los datos para la industria Food retailing y el estado Victoria
food_vic <- aus_retail %>%
filter(Industry == "Food retailing", State == "Victoria") %>%
as_tsibble(index = Month)
# 3. Utilizar la función gg_season() para visualizar el comportamiento estacional
food_vic %>% gg_season(Turnover, labels = "right") +
labs(title = "Patrón estacional de Turnover - Food retailing (Victoria)",
y = "Turnover", x = "Mes") +
theme(axis.text.x = element_text(angle = 90))
El gráfico estacional para la industria de alimentos en Victoria revela varios patrones importantes:
Patrones estacionales observados: Hay un patrón estacional claro con un pico pronunciado en diciembre (temporada navideña). También se observa un ligero aumento en marzo-abril (probablemente relacionado con la Semana Santa) y otro aumento menor en septiembre-octubre.
Meses con comportamiento atípico: Diciembre muestra consistentemente los valores más altos del año, con un aumento significativo respecto a noviembre. Hay una caída pronunciada de diciembre a enero cada año. Los meses de invierno (junio-agosto) muestran valores relativamente estables.
Implicaciones para planificación: Esta información es crucial para la gestión de inventarios y promociones. Se debería aumentar el inventario antes de diciembre para satisfacer la demanda navideña. Las promociones podrían enfocarse en enero-febrero para estimular las ventas en meses bajos. Las campañas de marzo-abril podrían aprovechar el ligero repunte natural de esas fechas.
# 1. Filtrar el dataset para Victoria y la industria Supermarket and grocery stores
supermarket_vic_ts <- aus_retail %>%
filter(State == "Victoria", Industry == "Supermarket and grocery stores") %>%
as_tsibble(index = Month)
# 2. Construir un diagrama de dispersión
autoplot(supermarket_vic_ts, Turnover) +
geom_point() +
labs(title = "Scatter: Turnover en Supermarkets (Victoria)", x = "Mes", y = "Turnover") +
theme(axis.text.x = element_text(angle = 90))
El diagrama de dispersión de ventas en supermercados de Victoria muestra varios patrones importantes:
Patrones visualizados: Se observa una clara tendencia creciente a lo largo del tiempo, con una variabilidad estacional que se repite cada año. La dispersión de los puntos aumenta con el tiempo, indicando mayor volatilidad en valores más altos.
Tendencia y estacionalidad: La tendencia es claramente creciente, con un aumento sostenido de las ventas. Se evidencia estacionalidad con picos que parecen repetirse en períodos similares cada año. Los valores más altos parecen concentrarse en ciertos meses del año.
Anomalías o puntos atípicos: No se observan puntos atípicos claros que se desvíen significativamente del patrón general. Hay algunos puntos con valores más bajos que podrían corresponder a meses específicos (probablemente febrero), pero en general la dispersión parece consistente con el comportamiento esperado de ventas minoristas.
# 1. Filtrar los datos para las industrias Clothing retailing y Food retailing en Victoria
clothing_vic <- aus_retail %>%
filter(State == "Victoria", Industry == "Clothing retailing") %>%
select(Month, Turnover) %>%
rename(Turnover_Clothing = Turnover)
food_vic2 <- aus_retail %>%
filter(State == "Victoria", Industry == "Food retailing") %>%
select(Month, Turnover) %>%
rename(Turnover_Food = Turnover)
# 2. Preparar las series temporales alineadas temporalmente
# 3. Calcular el coeficiente de correlación
corr_join <- left_join(clothing_vic, food_vic2, by = "Month") %>% drop_na()
corr_value <- cor(corr_join$Turnover_Clothing, corr_join$Turnover_Food)
corr_value
## [1] 0.9284541
# 4. Realizar un diagrama de dispersión
ggplot(corr_join, aes(x = Turnover_Clothing, y = Turnover_Food)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(title = paste("Correlación (Pearson) =", round(corr_value, 3)),
x = "Turnover Clothing (Victoria)", y = "Turnover Food (Victoria)")
El coeficiente de correlación entre las ventas de las industrias de ropa y alimentos en Victoria es de aproximadamente 0.928.
Interpretación del coeficiente: Este valor indica una correlación positiva moderada entre las dos industrias. Cuando aumentan las ventas de una industria, también tienden a aumentar las de la otra, aunque no de manera perfecta.
Naturaleza de la correlación: La correlación es positiva (ambas industrias tienden a moverse en la misma dirección) y de fuerza moderada (no es extremadamente fuerte pero sí significativa).
Conclusiones para la toma de decisiones: Esta correlación sugiere que factores económicos comunes afectan a ambas industrias, como el poder adquisitivo de los consumidores o condiciones económicas generales. Esta información puede ser útil para pronosticar ventas basándose en el comportamiento de industrias relacionadas. Las estrategias de marketing podrían coordinarse entre industrias con alta correlación para maximizar el impacto.
# 1. Filtrar los datos para el estado de Victoria y las industrias mencionadas
industries <- c("Clothing retailing", "Food retailing",
"Hardware, building and garden supplies retailing",
"Household goods retailing", "Liquor retailing")
# 2. Transformar los datos para que cada columna corresponda a una industria
# 3. Convertir todas las columnas a variables numéricas y eliminar filas con valores faltantes
vic_industries <- aus_retail %>%
filter(State == "Victoria", Industry %in% industries) %>%
select(Month, Industry, Turnover) %>%
pivot_wider(names_from = Industry, values_from = Turnover) %>%
arrange(Month) %>%
select(-Month) %>%
mutate(across(everything(), as.numeric)) %>%
drop_na()
# 4. Construir la matriz de correlación
GGally::ggpairs(vic_industries)
La matriz de correlación entre las diferentes industrias minoristas en Victoria revela varias relaciones importantes:
# 1. Cargar la serie temporal supermarket_vic_ts (ya cargada en el ejercicio 3)
# 2. Graficar la función de autocorrelación (ACF)
supermarket_vic_ts %>%
ACF(Turnover) %>%
autoplot() +
labs(title = "ACF - Turnover Supermarket (Victoria)")
La función de autocorrelación para las ventas de supermercados en Victoria muestra varios patrones importantes:
¿Cómo se manifiesta la tendencia en la gráfica de ACF?: Los valores de la ACF decrecen lentamente, lo que indica una fuerte dependencia temporal. Los primeros rezagos muestran correlaciones muy altas (>0.8), indicando persistencia en la serie. Esta persistencia sugiere que los valores actuales están fuertemente influenciados por valores pasados.
¿Qué evidencia en la ACF indicar´ıa que existe estacionalidad?: Se observan picos en los rezagos múltiplos de 12 (12, 24, 36, 48), indicando estacionalidad anual. El patrón estacional es claro y consistente a lo largo de los años. La fuerza de la estacionalidad parece mantenerse relativamente constante en el tiempo.
¿Qué diferencia existe en la forma de decaimiento de la ACF entre una serie con tendencia y una con estacionalidad?: El decaimiento lento de la ACF sugiere la presencia de tendencia en la serie. La persistencia de correlaciones positivas incluso en rezagos altos indica no estacionariedad. Para modelar adecuadamente esta serie, sería necesario diferenciarla para eliminar la tendencia y posiblemente aplicar diferenciación estacional.
# 1. Generar la función de autocorrelación con más rezagos
supermarket_vic_ts %>%
ACF(Turnover, lag_max = 60) %>%
autoplot() +
labs(title = "ACF extendida (hasta lag 60) - Supermarket (Victoria)")
La función de autocorrelación extendida con más rezagos permite identificar más claramente los patrones de tendencia y estacionalidad:
Manifestación de la tendencia: La tendencia se manifiesta como un decaimiento muy lento de la autocorrelación. Los valores de ACF permanecen positivos y altos incluso para rezagos grandes. Este patrón de decaimiento lento es característico de series con tendencia. La tendencia indica que la serie no es estacionaria en media.
Evidencia de estacionalidad: La estacionalidad se evidencia por picos repetitivos en intervalos regulares. Se observan picos claros en los rezagos 12, 24, 36, 48, 60. Estos picos corresponden a un patrón estacional anual (12 meses). La altura de los picos estacionales disminuye lentamente con el tiempo, pero permanece significativa.
Diferencia en el decaimiento: En una serie con tendencia, la ACF decae lentamente de forma continua. En una serie con estacionalidad, la ACF muestra picos en los rezagos estacionales. Una serie con ambos componentes (como esta) muestra un decaimiento lento con picos estacionales superpuestos. Para modelar esta serie, se necesitaría diferenciar para eliminar la tendencia y posiblemente aplicar diferenciación estacional.
# 1. Utilizar el conjunto de datos aus_retail
# 2. Filtrar la industria Supermarket and grocery stores en el estado Victoria
# 3. Agrupar los datos por trimestre
# 4. Sumar el Turnover trimestralmente
supermarket_vic_qtr <- aus_retail %>%
filter(State == "Victoria", Industry == "Supermarket and grocery stores") %>%
index_by(Quarter = yearquarter(Month)) %>%
summarise(Turnover = sum(Turnover)) %>%
as_tsibble(index = Quarter)
# 5. Graficar los rezagos del Turnover desde el lag 1 hasta el lag 9
supermarket_vic_qtr %>% gg_lag(Turnover, geom = "point", lags = 1:9) +
labs(title = "Lag plots (lags 1-9) - Turnover trimestral Supermarkets (Victoria)")
Los gráficos de rezagos para las ventas trimestrales de supermercados en Victoria revelan varios patrones importantes:
Patrones evidenciados en los rezagos: Los gráficos de rezagos muestran una fuerte correlación positiva, especialmente en los primeros rezagos. Los puntos en los gráficos de rezagos bajos (1-4) forman patrones lineales claros con pendiente positiva. A medida que aumenta el rezago, la dispersión de los puntos aumenta, indicando menor correlación. Los gráficos de rezagos más altos (7-9) muestran una correlación más débil pero aún positiva.
Dependencia temporal: La fuerte correlación en rezagos bajos indica alta persistencia en la serie. La estructura autocorrelacional decae gradualmente con el tiempo, pero permanece positiva. Esta estructura sugiere que los valores actuales están fuertemente influenciados por valores pasados recientes. La persistencia de correlaciones positivas incluso en rezagos altos indica tendencia en la serie.
Inferencia de estacionalidad o ciclos: No se observa un patrón estacional claro en los gráficos de rezagos trimestrales. Esto podría deberse a que al agregar datos mensuales a trimestrales, se suaviza el patrón estacional mensual. Si existiera estacionalidad trimestral, esperaríamos ver patrones específicos en los rezagos 4, 8, etc. La falta de patrones estacionales claros sugiere que la estacionalidad podría ser mensual más que trimestral.
Comparación con otras series: Comparado con series de la industria textil, los patrones aquí son más consistentes y menos dispersos. La correlación en rezagos altos es más fuerte que en series más volátiles como la de pasajeros. Esto sugiere que las ventas de supermercados son más predecibles y muestran menor variabilidad estacional.
# 1. Generar una serie temporal simulada de 100 observaciones de ruido blanco
set.seed(123)
wn <- tibble(
Month = yearmonth(seq.Date(from = as.Date("2000-01-01"), by = "month", length.out = 100)),
value = rnorm(100, mean = 0, sd = 1)
) %>%
as_tsibble(index = Month) %>%
fill_gaps()
# 3. Graficar la serie temporal
autoplot(wn, value) +
labs(title = "Serie simulada: Ruido blanco", y = "Valor", x = "Tiempo")
# 4. Calcular y graficar la función de autocorrelación (ACF)
wn %>% ACF(value) %>% autoplot() +
labs(title = "ACF - Ruido blanco (sin gaps)")
El análisis de la serie de ruido blanco simulada revela las siguientes características:
# 1. Cargar la base de datos global_economy
# 2. Filtrar la información correspondiente al país United States
# 3. Generar un gráfico de línea del PIB per cápita
us_g <- global_economy %>% filter(Country == "United States") %>% mutate(gdp_per_capita = GDP / Population)
autoplot(us_g, gdp_per_capita) + labs(title = "PIB per cápita - United States", y = "PIB per cápita")
# 4. Filtrar la industria Clothing retailing de aus_retail
# 5. Agrupar los datos por año y calcular el turnover anual
clothing_aust <- aus_retail %>%
filter(Industry == "Clothing retailing") %>%
index_by(Year = year(Month)) %>%
summarise(Annual_Turnover = sum(Turnover))
# 6. Realizar un cruce con la información de global_economy para Australia
aust_econ <- global_economy %>% filter(Country == "Australia") %>% select(Year, CPI)
# 7. Ajustar el turnover anual por inflación
clothing_aust2 <- left_join(clothing_aust, aust_econ, by = "Year") %>% drop_na() %>%
mutate(Adjusted = Annual_Turnover / (CPI / first(CPI)))
# 8. Representar en un gráfico ambos valores
ggplot(clothing_aust2, aes(x = Year)) +
geom_line(aes(y = Annual_Turnover, color = "Original"), linetype = "dashed") +
geom_line(aes(y = Adjusted, color = "Ajustado por inflación")) +
labs(title = "Turnover anual - Clothing (Australia): original vs ajustado por CPI",
y = "Turnover (moneda local)", x = "Año", color = "Serie") +
scale_color_manual(values = c("Original" = "blue", "Ajustado por inflación" = "red"))
El análisis del PIB per cápita y las ventas ajustadas por inflación revela información importante:
# 1. Filtrar la base de datos para Victoria y Clothing retailing
# 2. Crear una nueva tsibble con transformaciones
clothing_vic_full <- aus_retail %>%
filter(State == "Victoria", Industry == "Clothing retailing") %>%
as_tsibble(index = Month) %>%
mutate(sqrt_turnover = sqrt(Turnover),
log_turnover = log(Turnover),
inv_turnover = 1 / Turnover)
# 3. Generar gráficos de la serie original y las transformaciones
p1 <- autoplot(clothing_vic_full, Turnover) + labs(title = "Original")
p2 <- autoplot(clothing_vic_full, sqrt_turnover) + labs(title = "Raíz cuadrada")
p3 <- autoplot(clothing_vic_full, log_turnover) + labs(title = "Logaritmo")
p4 <- autoplot(clothing_vic_full, inv_turnover) + labs(title = "Inversa")
(p1 / p2) | (p3 / p4)
El análisis de las transformaciones matemáticas aplicadas a la serie de ventas de ropa en Victoria revela lo siguiente:
# 1. Cargar la base de datos aus_retail
# 2. Filtrar los datos para Victoria y la industria Hardware, building and garden supplies retailing
# 3. Seleccionar las variables Month y Turnover
hardware_vic <- aus_retail %>%
filter(State == "Victoria", Industry == "Hardware, building and garden supplies retailing") %>%
as_tsibble(index = Month) %>% select(Month, Turnover)
# 4. Generar un gráfico de la serie original
autoplot(hardware_vic, Turnover) + labs(title = "Original: Hardware - Victoria")
# 5. Calcular el valor óptimo de lambda para la transformación Box-Cox
lambda <- hardware_vic %>% features(Turnover, features = guerrero) %>% pull(lambda_guerrero)
lambda
## [1] 0.5542454
# 6. Aplicar la transformación Box-Cox
hardware_vic <- hardware_vic %>% mutate(Turnover_boxcox = box_cox(Turnover, lambda))
# 7. Generar un gráfico de la serie transformada
autoplot(hardware_vic, Turnover_boxcox) + labs(title = paste("Transformada Box-Cox (lambda =", round(lambda,3), ")"))
El análisis de la transformación Box-Cox aplicada a ventas de hardware en Victoria revela lo siguiente:
En este taller hemos explorado diversas técnicas para el análisis de series temporales utilizando R y el paquete fpp3. Los principales aprendizajes incluyen:
Visualización de patrones estacionales: Las herramientas como gg_subseries() y gg_season() permiten identificar patrones recurrentes en los datos, fundamentales para entender la estacionalidad.
Análisis de correlaciones: El estudio de correlaciones entre diferentes industrias y entre valores rezagados de una misma serie proporciona información valiosa sobre las relaciones temporales.
Autocorrelación: La función de autocorrelación (ACF) es una herramienta poderosa para identificar patrones de dependencia temporal, tendencia y estacionalidad.
Transformaciones de datos: Las transformaciones matemáticas y Box-Cox son esenciales para estabilizar la varianza y hacer que los datos cumplan con los supuestos necesarios para muchos modelos estadísticos.
Ajustes económicos: El ajuste por inflación y la normalización por población son cruciales para realizar comparaciones temporales válidas y entender el comportamiento real de las variables económicas.
Estas técnicas constituyen la base para un análisis riguroso de series temporales y son fundamentales para desarrollar modelos de pronóstico precisos y tomar decisiones informadas basadas en datos históricos.