El informe tiene como propósito analizar la evolución y dinámica de un sector específico de la economía colombiana a través de herramientas estadísticas y de modelado de series temporales. En el contexto actual, marcado por transformaciones económicas y cambios estructurales tanto a nivel nacional como global, las empresas necesitan contar con información estratégica que les permita anticipar tendencias y tomar decisiones fundamentadas en datos.
Para este análisis, se ha seleccionado el sector de la construcción, específicamente la producción de concreto, representado por la empresa Argos, la cual opera activamente en dicho entorno económico. Este sector ha mostrado una evolución significativa en los últimos años, con ciclos de expansión y contracción, siendo sensible a factores macroeconómicos como la inflación y factores políticos como los subsidios.
Con el fin de evaluar su desempeño y entender mejor las fuerzas que lo afectan, se han seleccionado tres variables económicas mensuales (enero 2012 - diciembre 2024) que representan directa e indirectamente la actividad del sector y de la empresa. Las variables elegidas para el análisis son:
Variable 1. Producción de concreto premezclado Argos es una de las principales productoras de concreto en Colombia. Esta variable está relacionada directamente con la activiad productiva de la empresa, por lo tanto, analizar su comportamiento en el tiempo, permite identificar tendencias, estacionalidades y realizar pronósticos que guían la planeación operativa y financiera.
Variable 2. Licencias de construcción en Colombia Las licencias de construcción son un indicador líder del sector. Es decir, se otorgan antes de que inicie la obra, y por tanto anticipan la demanda de insumos como concreto y cemento. A nivel nacional, muestran la tendencia general del mercado constructor, lo que permite entender el contexto macroeconómico para Argos.
Variable 3. Licencias de construcción en Cali
Argos tiene presencia fuerte en el suroccidente del país, y Cali es una ciudad clave para su operación.
Gráfico 1. Unidades de vivienda nueva vendidas-principales
departamentos 2022-2024
La gráfica anterior, corresponde a viviendas nuevas por regiones principales. Esta información es un indicador indirecto pero sólido del sector de la construcción por región, que está ligada al número de licencias aprobadas. Por lo tanto, se puede evidenciar que el Valle del Cauca resgistró un crecimiento del 3.8% en viviendas nuevas entre 2023 y 2024, mientras que otras regiones como Bogotá y Antioquia presentaron caídas. Esto sugiere que Cali y su entorno metropolitano, presentan un impulso sostenido en proyectos de vivienda lo cual implica un aumento o estabilidad en las licencias de construcción para vivienda y con esto, una mayor demanda proyectada de materiales de contrucción.
Para analizar el comportamiento del sector de la construcción en Colombia, y en particular su impacto sobre la empresa Argos, se utilizaron dos herramientas estadísticas fundamentales para el análisis de series temporales: la descomposición STL y el modelo ARIMA/SARIMA. Estas metodologías permiten descomponer las series en componentes interpretables y realizar pronósticos que apoyen la toma de decisiones estratégicas.
La descomposición STL fue aplicada a las tres variables seleccionadas:
Producción de concreto premezclado (variable directamente relacionada con la operación de Argos).
Licencias de construcción aprobadas en Colombia (variable indirecta que indica la demanda potencial del sector a nivel nacional).
Licencias de construcción aprobadas en Cali (variable indirecta como indicador local, relevante por la ubicación del análisis y operaciones de Argos en la región).
La descomposición STL permite separar cada serie temporal en tres componentes clave:
-Tendencia: Muestra la evolución estructural de la variable en el tiempo, sin ruido ni efectos estacionales. Es fundamental para detectar ciclos de expansión o contracción en el sector.
-Estacionalidad: Captura patrones que se repiten regularmente cada año, comunes en la construcción debido a factores climáticos, políticas públicas y ciclos de inversión.
-Residuo: Refleja las variaciones no explicadas por la tendencia o la estacionalidad. Puede incluir choques externos o eventos atípicos.
Este enfoque facilita una comprensión detallada del comportamiento de cada variable y permite comparar tendencias ajustadas entre ellas, lo cual es clave para identificar señales estratégicas para la empresa.
Para anticipar el comportamiento del sector a corto plazo, se eligió como variable objetivo la producción de concreto premezclado, por su vínculo directo con la operación productiva y comercial de Argos. Esta variable representa la demanda efectiva del insumo principal que produce la empresa y, por tanto, es clave para la planificación operativa y financiera.
Se aplicaron dos tipos de modelos ARIMA:
ARIMA automático estándar: Utiliza algoritmos para identificar los mejores parámetros (p, d, q) sin incorporar estacionalidad explícita.
SARIMA automático: Una extensión del modelo ARIMA que incluye componentes estacionales (P, D, Q, s) para capturar mejor los ciclos anuales que suelen afectar a la construcción.
Ambos modelos fueron entrenados con datos mensuales desde enero de 2012 hasta diciembre de 2024, y se utilizaron los meses octubre, noviembre y diciembre de 2024 como set de prueba del pronóstico. Posteriormente, se compararon los resultados del modelo con los valores reales y se discutió el impacto esperado del pronóstico sobre la operación de la empresa.
El análisis conjunto de estas herramientas permite no solo observar la evolución histórica del sector, sino también anticipar comportamientos futuros y generar recomendaciones estratégicas basadas en datos concretos.
Instalar/Cargar librerias necesarias para el análisis
#Cargar librerías necesarias
library(readxl) # Para leer archivos Excel
library(tseries) # Para pruebas de estacionariedad
library(forecast) # Para modelado ARIMA y pronósticos
library(ggplot2) # Para visualización de datos
library(plotly) # Para gráficos interactivos
library(timetk)
Cargar base de datos
library(readxl)
data_col <- read_excel("Base Caso2.xlsx",
col_types = c("date", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric"))
Declarar las variables como series temporales
Variable 1: Producción de concreto premezclado
# Convertir/declarar variable 1=CONCRETO en serie de tiempo mensual
variable1_ts <- ts(data_col$CONCRETO, start = c(2012, 1), frequency = 12)
variable1_ts
## Jan Feb Mar Apr May Jun Jul Aug
## 2012 526135.5 584896.7 634905.0 550290.4 639649.5 620337.5 621040.8 640026.3
## 2013 553389.8 601934.0 577620.9 663616.0 668222.6 646338.8 709693.1 664980.0
## 2014 581032.9 663333.4 709935.8 692234.9 752105.4 649168.4 786839.1 698542.2
## 2015 588921.1 689289.9 735713.6 709793.6 771679.8 741080.6 834848.6 772132.9
## 2016 596128.0 733812.5 685446.2 738887.0 689904.8 721605.8 628366.5 697717.5
## 2017 537905.3 630653.8 695564.2 569457.8 629803.1 607064.4 594304.3 621530.5
## 2018 500863.0 567671.1 574867.9 589132.2 589787.6 590334.9 588338.9 621400.5
## 2019 518830.1 621271.6 655183.7 581143.7 643375.5 578861.6 651512.4 631085.4
## 2020 474608.7 575767.6 404111.7 30559.2 298568.0 439428.8 513111.8 509440.8
## 2021 391223.4 505824.3 572461.8 457335.7 398756.9 485677.2 544203.4 547982.0
## 2022 560312.2 680482.4 741457.3 653098.7 684290.7 672862.1 690243.0 760621.3
## 2023 569093.4 686987.3 743434.9 626058.5 731515.5 696036.4 683440.9 722865.7
## 2024 536390.1 676447.7 628717.1 680562.9 673810.8 615566.0 679577.3 681989.0
## Sep Oct Nov Dec
## 2012 618164.0 636544.0 613992.7 540217.9
## 2013 688418.0 737172.5 664587.9 610667.7
## 2014 743102.9 740833.7 662678.4 650640.8
## 2015 810193.7 787664.6 725788.4 705681.8
## 2016 687122.5 663349.2 635103.6 626942.7
## 2017 609339.2 616166.9 612336.1 553678.9
## 2018 610543.8 641974.6 611400.8 551577.8
## 2019 605898.1 624728.9 585884.5 548756.3
## 2020 534261.6 539360.1 483381.0 457110.3
## 2021 588808.4 569810.6 563315.5 545342.7
## 2022 752821.1 728060.0 738940.1 707833.2
## 2023 749036.2 700717.6 715122.4 641701.1
## 2024 632938.1 682140.0 638772.9 608304.9
Variable 2: Licencias de construcción en Colombia
# Convertir/declarar variable 2=LICC en serie de tiempo mensual
variable2_ts <- ts(data_col$LICC, start = c(2012, 1), frequency = 12)
variable2_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep
## 2012 1498909 1728147 1425267 1388134 1960736 1956173 1890780 1802859 1910242
## 2013 2094058 2205691 1843902 1904198 2397117 1757329 1794134 2141280 2366607
## 2014 1852424 2245434 2324692 2366411 2289778 1865683 2676808 1613517 1625911
## 2015 2047371 2169494 2113458 2424498 1595093 2318565 2185818 1857652 2375383
## 2016 1547135 1669062 1673598 1729128 2126223 1537734 1588860 1742770 1806840
## 2017 1361372 1674360 1765535 1581355 1620579 1474165 1551403 1760635 1824302
## 2018 1454410 1472991 1086990 1806498 1713273 1438738 1687364 1579630 1595654
## 2019 1320654 1521559 1559022 1375196 1767713 1500038 1512004 1392231 1395518
## 2020 1598506 1681914 896291 278982 760289 1070765 1143823 1024511 1598312
## 2021 1164319 1708030 1439976 1473196 1561833 1705955 1451379 1688041 1489381
## 2022 1460116 1715165 1859815 1819122 1575094 2346884 3428147 2919277 2391248
## 2023 1820444 1271995 1207070 979307 1646999 1181368 959692 1699442 1442325
## 2024 1234954 972515 967991 1374365 1148535 1016621 989385 1379670 1391058
## Oct Nov Dec
## 2012 1560556 1645891 2456199
## 2013 1951388 2050465 2089402
## 2014 2304708 1503624 2524944
## 2015 2051518 1761102 4139543
## 2016 2011801 1982363 2628670
## 2017 1690922 1823182 1971060
## 2018 1629967 1797697 1616273
## 2019 1435841 1580802 3265490
## 2020 1071214 1161663 1942476
## 2021 1058146 1392092 1998939
## 2022 1729225 2122610 2371657
## 2023 1407828 1771536 2563269
## 2024 974136 1490060 1850318
Variable 3: Licencias de construcción en Cali
# Convertir/declarar variable 3=LICC_CALI en serie de tiempo mensual
variable3_ts <- ts(data_col$LICC_CALI, start = c(2012, 1), frequency = 12)
variable3_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct
## 2012 71805 60566 97722 95605 54599 54973 89373 44998 78956 33455
## 2013 152387 97536 44843 76594 49377 81634 84303 42598 74694 56031
## 2014 28448 98519 114292 164931 50526 37327 89171 67132 75410 125968
## 2015 55073 113587 164005 234899 116301 48847 55186 86771 61653 47181
## 2016 13364 114627 75687 75611 45872 140400 33014 11855 22809 111787
## 2017 31790 109663 107744 60793 123043 65067 55042 93129 85417 119096
## 2018 52420 99170 26132 116420 101887 65117 116501 130790 92571 44916
## 2019 65719 148543 31719 160053 93591 97518 33469 81590 44469 134061
## 2020 66979 61801 19021 0 63388 48113 48631 87371 210101 48962
## 2021 85260 42721 102691 69494 103849 119921 110293 96274 42320 62253
## 2022 53922 97923 79289 37366 124519 179589 292808 15418 58632 57887
## 2023 73275 6524 25370 67227 92930 15383 25136 91412 91505 28756
## 2024 72289 47026 40573 68625 32175 27412 44648 30689 114493 52297
## Nov Dec
## 2012 68701 286286
## 2013 78194 57952
## 2014 48978 228091
## 2015 146785 120084
## 2016 92533 122807
## 2017 157617 216280
## 2018 103810 25489
## 2019 63171 207037
## 2020 55016 104677
## 2021 48052 49940
## 2022 64364 51096
## 2023 181664 172502
## 2024 163377 326535
Gráfico inicial de la variable 1, 2 y 3 en niveles -Original
En esta gráfica se puede observar un comportamiento similar a lo largo del tiempo, que oscila entre los 391.223m3 (valor más bajo) de concreto y 834.848m3 (valor más alto). Sin embargo, en 2020 se presenta una caía de producción hasta 30.559m3 producto de la pandemia.
# Cargar librerías necesarias
library(ggplot2)
library(plotly)
library(tidyr)
library(dplyr)
# Paso 1: Crear la columna de fechas
data_col$fecha <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = nrow(data_col))
# Paso 2: Convertir las series temporales en vectores numéricos
data_col$variable1 <- as.numeric(variable1_ts) # Concreto premezclado
data_col$variable2 <- as.numeric(variable2_ts) # Licencias Colombia
data_col$variable3 <- as.numeric(variable3_ts) # Licencias Cali
# Paso 3: Convertir a formato largo
data_long <- pivot_longer(data_col,
cols = c(variable1, variable2, variable3),
names_to = "variable",
values_to = "valor")
# Paso 4: Crear gráfico con líneas y puntos
grafico_series <- ggplot(data_long, aes(x = fecha, y = valor, color = variable)) +
geom_line(linewidth = 0.4) +
geom_point(size = 0.1) +
labs(title = "Gráfico 2. Series originales del sector construcción",
x = "Tiempo",
y = "Valor mensual",
color = "Variable") +
scale_color_manual(values = c("variable1" = "darkblue",
"variable2" = "darkgreen",
"variable3" = "firebrick"),
labels = c("Concreto premezclado",
"Licencias en Colombia",
"Licencias en Cali")) +
theme_minimal()
# Paso 5: Hacerlo interactivo con plotly
ggplotly(grafico_series)
La figura 1 muestra la evolución mensual entre enero de 2012 y diciembre de 2024 de las tres variables elegidas para el análisis del sector. El concreto premezclado es un indicador directo de la actividad constructiva, las licencias de construcción en Colombia refleja la intención de iniciar nuevos proyectos en el país y las licencias de construcción en Cali muestra evidencia específica de la dinámica local en la ciudad de Cali.
Las licencias de construcción suelen anticipar la producción de concreto con algunos meses de desfase pues a más licencias, más obras, más concreto. Si las licencias disminuyen, es probable que la demanda de concreto también disminuya.
Se identifica que en 2020, el año de la pandemia, hay una caída abrupta en la producción de concreto, lo cual se puede observar también en las licencias de construcción expedidas.
# Cargar librerías necesarias
library(ggplot2)
library(plotly)
# Descomposición de la serie temporal
stl_decomp_var1 <- stl(variable1_ts, s.window = "periodic")
# Convertir la descomposición a un data frame para graficar con ggplot2
stl_df_var1 <- data.frame(
Time = rep(time(variable1_ts), 4), # Tiempo repetido para cada componente (son 4 componentes)
Value = c(stl_decomp_var1$time.series[, "seasonal"],
stl_decomp_var1$time.series[, "trend"],
stl_decomp_var1$time.series[, "remainder"],
variable1_ts),
Component = rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), each = length(variable1_ts))
)
# Crear gráfico con ggplot2
p <- ggplot(stl_df_var1, aes(x = Time, y = Value, color = Component)) +
geom_line() +
facet_wrap(~Component, scales = "free_y", ncol = 1) +
theme_minimal() +
labs(title = "Gráfico 3. Descomposición temporal de la variable 1",
x = "Tiempo",
y = "Valor")
# Convertir a gráfico interactivo con plotly
ggplotly(p)
De la gráfica de descomposición temporal de la variable 1 producción de concreto, se puede observar que la estacional, representa fluctuaciones periódicas que se repiten de forma regular cada año con caídas a inicios de año. Esto, probablemente asociadas a la disminución de actividad durante la temporada de fin de año y vacaciones. De igual manera, se evidencian picos recurrentes en agosto, lo que sugiere una concentración de obras en la segunda mitad del año.
El componente de residuo muestra picos aislados en el año 2020 (pandemia), son eventos que tienen una causa externa y que afectaron puntualmente la producción. Fuera de estos episodios, el residuio es relativamente bajo, indicando un comportamiento predecible de la serie.
El componente de tendencia, muestra un comportamiento fluctuante durante el periodo analizado, con un punto de inflexión en el año 2020 (pandemia).
# Cargar librerías necesarias
library(ggplot2)
library(plotly)
# Descomposición de la serie temporal
stl_decomp_var2 <- stl(variable2_ts, s.window = "periodic")
# Convertir la descomposición a un data frame para graficar con ggplot2
stl_df_var2 <- data.frame(
Time = rep(time(variable2_ts), 4), # Tiempo repetido para cada componente
Value = c(stl_decomp_var2$time.series[, "seasonal"],
stl_decomp_var2$time.series[, "trend"],
stl_decomp_var2$time.series[, "remainder"],
variable2_ts),
Component = rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), each = length(variable2_ts))
)
# Crear gráfico con ggplot2
p <- ggplot(stl_df_var2, aes(x = Time, y = Value, color = Component)) +
geom_line() +
facet_wrap(~Component, scales = "free_y", ncol = 1) +
theme_minimal() +
labs(title = "Gráfico 4. Descomposición temporal de la variable 2",
x = "Tiempo",
y = "Valor")
# Convertir a gráfico interactivo con plotly
ggplotly(p)
De la gráfica de descomposición temporal de la variable 2 licencias de construcción en Colombia, se puede observar que la estacional, representa fluctuaciones periódicas que se repiten de forma regular cada año con subidas en 917. Esto, probablemente asociadas a la aprobación de proyectos antes de cortes presupuestales semestrales. De igual manera, se evidencian caídas a los inicios de año lo que puede estar asociado a cierres fiscales o menor actividad administrativa en entidades territoriales.
El componente de residuo muestra variaciones significativas en ciertos periodo por la pandemia y la incertidumbre macroecnómica referente a los subsidios mi casa ya. Esto indica que, aunque existe regularidad anual, el otorgamiento de licencias también responde a eventos no recurrentes y de alto impacto.
El componente de tendencia, muestra un comportamiento similar al de la variable 1, fluctuante durante el periodo analizado, con un punto de inflexión en el año 2020 (pandemia).
# Cargar librerías necesarias
library(ggplot2)
library(plotly)
# Descomposición de la serie temporal
stl_decomp_var3 <- stl(variable3_ts, s.window = "periodic")
# Convertir la descomposición a un data frame para graficar con ggplot2
stl_df_var3 <- data.frame(
Time = rep(time(variable3_ts), 4), # Tiempo repetido para cada componente
Value = c(stl_decomp_var3$time.series[, "seasonal"],
stl_decomp_var3$time.series[, "trend"],
stl_decomp_var3$time.series[, "remainder"],
variable3_ts),
Component = rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), each = length(variable3_ts))
)
# Crear gráfico con ggplot2
p <- ggplot(stl_df_var3, aes(x = Time, y = Value, color = Component)) +
geom_line() +
facet_wrap(~Component, scales = "free_y", ncol = 1) +
theme_minimal() +
labs(title = "Gráfico 5. Descomposición temporal de la variable 3",
x = "Tiempo",
y = "Valor")
# Convertir a gráfico interactivo con plotly
ggplotly(p)
Al analizar esta gráfica de descompisicón temporal de la variable 3: licencias de construcción en Cali, se puede observar que los componentes ilustrados tienen un componente similar al de la variable 3 excepto la gráfica de tendencia. Para esta variable, la gráfica de tendencia un poco más estable.
Después de la descomposición temporal de cada variable, se extrae la variable ajustada por estacionalidad para graficarla junto con la serie original:
Se crea la variable1 ajustada por estacionalidad
# Extraer los componentes de la descomposición
variable1_sa <- variable1_ts - stl_decomp_var1$time.series[, "seasonal"]
Se crea la variable2 ajustada por estacionalidad
# Extraer los componentes de la descomposición
variable2_sa <- variable2_ts - stl_decomp_var2$time.series[, "seasonal"]
Se crea la variable3 ajustada por estacionalidad
# Extraer los componentes de la descomposición
variable3_sa <- variable3_ts - stl_decomp_var3$time.series[, "seasonal"]
Ahora si se puede graficar las series originales versus la ajustada por estacionalidad
library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)
# Crear vector de fechas
fechas <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable1_ts))
# Crear data frame con nombres consistentes
data_sa <- data.frame(
Fecha = fechas,
Concreto_Original = as.numeric(variable1_ts),
Concreto_Ajustado = as.numeric(variable1_sa),
LicenciasCOL_Original = as.numeric(variable2_ts),
LicenciasCOL_Ajustado = as.numeric(variable2_sa),
LicenciasCali_Original = as.numeric(variable3_ts),
LicenciasCali_Ajustado = as.numeric(variable3_sa)
)
# Transformar a formato largo
data_larga <- data_sa %>%
pivot_longer(
cols = -Fecha,
names_to = c("Variable", "Tipo"),
names_sep = "_",
values_to = "Valor"
)
# Opcional: poner etiquetas más legibles
data_larga$Variable <- recode(data_larga$Variable,
"Concreto" = "Concreto Premezclado",
"LicenciasCOL" = "Licencias en Colombia",
"LicenciasCali" = "Licencias en Cali"
)
# Crear gráfico
grafico_completo <- ggplot(data_larga, aes(x = Fecha, y = Valor, color = Tipo, linetype = Tipo)) +
geom_line(size = 0.5) +
facet_wrap(~ Variable, scales = "free_y", ncol = 1) +
scale_color_manual(values = c("Original" = "grey", "Ajustado" = "black")) +
scale_linetype_manual(values = c("Original" = "solid", "Ajustado" = "dashed")) +
labs(title = "Gráfico 6. Series Originales vs Ajustadas por Estacionalidad",
x = "Fecha",
y = "Valor",
color = "Tipo de Serie",
linetype = "Tipo de Serie") +
theme_minimal() +
theme(legend.position = "bottom")
# Hacer gráfico interactivo
ggplotly(grafico_completo)
En la Figura 5 se presentan las tres variables del análisis con sus respectivas versiones originales (línea gris continua) y ajustadas por estacionalidad (línea negra segmentada), luego de aplicar el método de descomposición STL. La comparación permite observar cómo la eliminación de la componente estacional facilita el análisis de tendencias y fluctuaciones reales.
Para la variable 1, la serie original muestra estacionalidad moderada, con picos recurrentes a mitad de año y caídas en los últimos meses de cada año. La serie ajustada suaviza estos patrones estacionales, lo que permite ver con mayor claridad la caída abrupta en 2020 (pandemia) y la recuperación después de esto.
Para la variable 2, la estacionalidad es más marcada.La serie ajustada permite ver más claramente las caídas en 2020-2021 y la leta recuperación posterior.
Para la variable 3, la estacionalidad se comporta como la de la variable 2, pero con menor magnitud por el tamaño del mercado (variable 2 es nacional, variable 3 es cali). Tiene picos anuales consistentes, especialmente a finales de cada año. La serie ajustada muestra una tendencia más estable lo que es útil para identificar cambios bruscos como la aceleraciónen la emisión de licencias en 2024, que se puede vincular con nuevas inversiones o cambios en poíticas públicas.
A partir del gráfico 5 se puede concluir que, la seria justada elimina el ruido estacional, lo que permite visualizar la tendencia a largo plazo con más claridad. Además, se observa que en todas las variables se observa una caída en 2020, que corresponde al impacto de la pandemia y a partir del 2022 hay una recuperación.
Ahora graficamos serie original vs tendencia
Primero se debe obtener la tendencia de cada variable y luego graficarla
library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)
# Crear vector de fechas
fechas <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable1_ts))
# Extraer los componentes de tendencia de cada descomposición
tendencia_var1 <- as.numeric(stl_decomp_var1$time.series[, "trend"])
tendencia_var2 <- as.numeric(stl_decomp_var2$time.series[, "trend"])
tendencia_var3 <- as.numeric(stl_decomp_var3$time.series[, "trend"])
# Convertir las series originales a vectores
var1 <- as.numeric(variable1_ts)
var2 <- as.numeric(variable2_ts)
var3 <- as.numeric(variable3_ts)
# Crear data frame en formato largo para las tres variables
data_tendencia <- data.frame(
Fecha = rep(fechas, 6),
Variable = rep(c("Concreto Premezclado", "Concreto Premezclado",
"Licencias en Colombia", "Licencias en Colombia",
"Licencias en Cali", "Licencias en Cali"), each = length(fechas)),
Tipo = rep(c("Original", "Tendencia"), times = 3, each = length(fechas)),
Valor = c(var1, tendencia_var1,
var2, tendencia_var2,
var3, tendencia_var3)
)
# Graficar con ggplot2 y facet_wrap
grafico_tendencias <- ggplot(data_tendencia, aes(x = Fecha, y = Valor, color = Tipo, linetype = Tipo)) +
geom_line(size = 0.7) +
facet_wrap(~ Variable, scales = "free_y", ncol = 1) +
scale_color_manual(values = c("Original" = "grey", "Tendencia" = "black")) +
scale_linetype_manual(values = c("Original" = "solid", "Tendencia" = "solid")) +
labs(title = "Gráfico 7. Serie Original vs Tendencia: Variables del Sector Construcción",
x = "Tiempo",
y = "Valor",
color = "Tipo de Serie",
linetype = "Tipo de Serie") +
theme_minimal() +
theme(legend.position = "bottom")
# Convertir a gráfico interactivo
ggplotly(grafico_tendencias)
La gráfica representa la evolución de tres variables clave para el sector de la construcción en Colombia, producción de concreto premezclado, licencias de construcción a nivel nacional, licencias de construcción en cali, eliminando efectos estacionales.
Variable 1: producción de concreto - La serie original muestra un comportamiento ciclico, con picos recurrentes y caídas típicas de los ciclos de obra civil. - La línea de tendencia, muestra un crecimiento desde 2012 hasta 2015, seguido por una caída prolongada desde el 2015 hasta el 2020 que es el año de la pandemia. Posteriormente, hay una recuperación desde el 2021 hasta el 2022. - En el año 2020 y desde el 2022 en adelante el patrón refleja impactos de choques macroeconómicas como la pandemia y posibles restricciones presupuestales y cambios en inversión pública como los subsidios Mi casa ya.
Variable 2: Licencias de construcción en Colombia. -La línea de tendencia de las licencias a nivel nacional muestra una tendencia similar a la producción de concreto (como ya se mencionó antes, tienen relación directa).
Variable 3: Licencias de construcción en Cali. - A diferencia de la tendencia nacional, Cali muestra un patrón más estable con una caída en 2020. La recuperación en 2022 es más alta, indicando que Cali tuvo una reactivación más rápida que el promedio nacional. Sin embargo, la recuperación a partir del 2023 ha tenido una reactivación más lenta que el promedio nacional.
Ahora calculamos la tasa de crecimiento de la serie original vs tendencia:
Tasa de crecimiento de la serie de tendencia y original para la variable 1
#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var1 <- (variable1_ts[(13:length(variable1_ts))] / variable1_ts[1:(length(variable1_ts) - 12)] - 1) * 100
tasa_tendencia_var1 <- (tendencia_var1[(13:length(tendencia_var1))] / tendencia_var1[1:(length(tendencia_var1) - 12)] - 1) * 100
# Crear vector de fechas corregido, es decir que inicie desde enero 2013
fechas_corregidas_var1 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var1))
# Verificar longitudes
print(length(fechas_corregidas_var1))
## [1] 144
print(length(tasa_crecimiento_var1))
## [1] 144
print(length(tasa_tendencia_var1))
## [1] 144
Ahora calculamos la tasa de crecimiento de la serie original vs tendencia: variable 2
#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var2 <- (variable2_ts[(13:length(variable2_ts))] / variable2_ts[1:(length(variable2_ts) - 12)] - 1) * 100
tasa_tendencia_var2 <- (tendencia_var2[(13:length(tendencia_var2))] / tendencia_var2[1:(length(tendencia_var2) - 12)] - 1) * 100
# Crear vector de fechas corregido
fechas_corregidas_var2 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var2))
# Verificar longitudes
print(length(fechas_corregidas_var2))
## [1] 144
print(length(tasa_crecimiento_var2))
## [1] 144
print(length(tasa_tendencia_var2))
## [1] 144
Ahora calculamos la tasa de crecimiento de la serie original vs tendencia: variable 3
#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var3 <- (variable3_ts[(13:length(variable3_ts))] / variable3_ts[1:(length(variable3_ts) - 12)] - 1) * 100
tasa_tendencia_var3 <- (tendencia_var3[(13:length(tendencia_var3))] / tendencia_var3[1:(length(tendencia_var3) - 12)] - 1) * 100
# Crear vector de fechas corregido
fechas_corregidas_var3 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var3))
# Verificar longitudes
print(length(fechas_corregidas_var3))
## [1] 144
print(length(tasa_crecimiento_var3))
## [1] 144
print(length(tasa_tendencia_var3))
## [1] 144
library(ggplot2)
library(plotly)
library(dplyr)
# Calcular tasas de crecimiento anual (%)
calc_growth_rate <- function(series) {
tasa <- (series[(13:length(series))] / series[1:(length(series) - 12)] - 1) * 100
return(tasa)
}
# Aplicar la función a las series originales y tendencias
tasa_var1 <- calc_growth_rate(as.numeric(variable1_ts))
tasa_trend1 <- calc_growth_rate(as.numeric(stl_decomp_var1$time.series[, "trend"]))
tasa_var2 <- calc_growth_rate(as.numeric(variable2_ts))
tasa_trend2 <- calc_growth_rate(as.numeric(stl_decomp_var2$time.series[, "trend"]))
tasa_var3 <- calc_growth_rate(as.numeric(variable3_ts))
tasa_trend3 <- calc_growth_rate(as.numeric(stl_decomp_var3$time.series[, "trend"]))
# Crear vector de fechas desde enero 2013
fechas_crecimiento <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_var1))
# Unir todos los datos en un solo data frame en formato largo
data_crecimiento <- data.frame(
Fecha = rep(fechas_crecimiento, 6),
Variable = rep(c("Concreto Premezclado", "Concreto Premezclado",
"Licencias en Colombia", "Licencias en Colombia",
"Licencias en Cali", "Licencias en Cali"), each = length(fechas_crecimiento)),
Tipo = rep(c("Original", "Tendencia"), times = 3, each = length(fechas_crecimiento)),
Tasa = c(tasa_var1, tasa_trend1,
tasa_var2, tasa_trend2,
tasa_var3, tasa_trend3)
)
# Gráfico con facet_wrap
grafico_crecimiento <- ggplot(data_crecimiento, aes(x = Fecha, y = Tasa, color = Tipo, linetype = Tipo)) +
geom_line(size = 0.7) +
facet_wrap(~ Variable, scales = "free_y", ncol = 1) +
scale_color_manual(values = c("Original" = "grey", "Tendencia" = "black")) +
scale_linetype_manual(values = c("Original" = "solid", "Tendencia" = "dashed")) +
labs(title = "Gráfico 8. Tasa de Crecimiento Anual (%) de la Serie Original vs Tendencia",
x = "Tiempo",
y = "Crecimiento Anual (%)") +
theme_minimal() +
theme(legend.position = "bottom")
# Gráfico interactivo
ggplotly(grafico_crecimiento)
Para la variable 1, la serie original no presenta oscilaciones significativas sino hasta el año 2021 que presenta una recuperación. Sin embargo, en los demás datos la tendencia tiene un comportamiento más estables. Ese pico en la serie original, pueden corresponder a efectos estacionales como la recuperación post-pandemia.
Para la variable 2, se presentan fuertes fluctuaciones especialmente en 2017 y 2019 para la serie original.
Para la variable 3, la tasa de crecimiento fue más estable. La tendencia muestra una disminución más lenta que a nivel nacional, pero persistente. Como se observó en la Figura 6. la diferencia de la tendencia nacional con la local sugiere que Cali tardó más en resentir la desaceleración del sector, aunque muestra una débil recuperación desde el 2022.
Insights clave generales
Al analizar las líneas de tendencia, podemos comentar que el crecimiento de la variable 1 no será sostenible ya que las licencias son un indicador adelantado de la actividad futura de la producción de concreto y la tendencia nos está mostrando una reducción en la generación de nuevos proyectos.
El crecimiento anual de la variable 1 producción de concreto, considera que la producción de concreto actual está alimentada por proyectos iniciados en años o periodos anteriores, es decir, que al analizar la variable 2 y 3 (áreas aprobadas de licencias en Colombia y Cali), compromete la producción de concreto del futuro y permite abrir una ventana de tiempo para optimizar la operación actual, diversificar geograficamente hacia zonas con mayor dinamismo en licencias y/o explorar en segmentos de mercado como infraestructura pública.
Se recomienda a Argos, monitorear frecuentemente las licencias de construcción, especialmente en mercados clave como Cali.
Al presentarse un pico fuerte en el año 2021 que es el año después de pandemia, se opta por mostrar el comportamiento del crecimiento en otra gráfica a partir del año 2022 hasta el 2025. A continuación se presenta la gráfica.
library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)
# Crear los dataframes individuales
df_var1 <- data.frame(
fecha = fechas_corregidas_var1,
crecimiento = tasa_crecimiento_var1,
tendencia = tasa_tendencia_var1,
variable = "Concreto Premezclado"
)
df_var2 <- data.frame(
fecha = fechas_corregidas_var2,
crecimiento = tasa_crecimiento_var2,
tendencia = tasa_tendencia_var2,
variable = "Licencias Cali"
)
df_var3 <- data.frame(
fecha = fechas_corregidas_var3,
crecimiento = tasa_crecimiento_var3,
tendencia = tasa_tendencia_var3,
variable = "Licencias Colombia"
)
# Unir en un solo dataframe
df_completo <- bind_rows(df_var1, df_var2, df_var3)
# Filtrar entre enero 2022 y diciembre 2024
df_filtrado <- df_completo %>%
filter(fecha >= as.Date("2022-01-01") & fecha <= as.Date("2024-12-31"))
# Convertir a formato largo para graficar
df_long <- df_filtrado %>%
pivot_longer(cols = c("crecimiento", "tendencia"),
names_to = "Serie", values_to = "Valor")
# Etiquetas
labels_leyenda <- c(
crecimiento = "Crecimiento Anual (%)",
tendencia = "Tendencia Anual (%)"
)
# Colores
colores_leyenda <- c(
crecimiento = "gray",
tendencia = "black"
)
# Graficar con ggplot
grafico <- ggplot(df_long, aes(x = fecha, y = Valor, color = Serie, linetype = Serie)) +
geom_line(size = 0.8) +
facet_wrap(~variable, scales = "free_y", ncol = 1) +
scale_color_manual(values = colores_leyenda, labels = labels_leyenda) +
scale_linetype_manual(values = c("crecimiento" = "solid", "tendencia" = "dashed"), labels = labels_leyenda) +
labs(
title = "Crecimiento Anual y Tendencia por Variable (2022–2024)",
x = "Fecha",
y = "% de Crecimiento"
) +
theme_minimal() +
theme(
legend.position = "top",
legend.title = element_blank(),
axis.text.x = element_text(angle = 45, hjust = 1)
)
# Hacerlo interactivo con plotly
ggplotly(grafico)
Aánalisis de la gráfica
Varaible 1: Producción de concreto premezclado La tasa de crecimiento es relativamente estable oscilando entre -5% y 20%. La línea de tendencia muestra una aceleración leve durante 2022, estabilidad en 2023 y un leve repunte en 2024. El mercado del concreto premezclado parece resistente a las varaiciones y ha matenido una evolución favorable.
Variable 3: Licencias de construcción en Cali La tendencia tuvo
en repunte en 2022, pero desde mediados de 2023 cae de forma sostenida
hasta cerrar con tasas negativas en 2024.
Esto puede indicar una saturación del mercado local o dificultades
institucionales o políticas como la reducción del subisio Mi casa Ya que
afectan la aprobación de licencias.Adicionalmente, aunque hubo meses con
comportamientos atípicos al alza, la tendencia sugiere una
desaceleración en la aprobación de licencias, lo que estaría impactando
negativamente la demanda de concreto.
Variable 2: Licencias de construcción en Colombia En la gráfica se observa una tendencia general descendente desde 2022 hasta finales de 2024. La serie original es más estable que la de Cali. Este comportamiento confirma una reletización del sector de la construcción, lo cual es coherente con el panoráma económico y político actual. La baja de presupuesto para el sector en los subisidios Mi casa Ya es una prueba de ello.
Insights clave generales
-Las licencias en Colombia y en Cali tienen alta variabilidad, reflejando sensibilidad a decisiones de inversión, normaticas o incertidumbre económica. Con estas variables, es posible anticipar el comportamiento de la producción de concreto.
-La caída en licencias de Cali desde 2023 puede anticipar una futura disminución en la demanda de concreto. Sin emabrgo, para finales de 2024 el comportamiento de las variables, es estable.
Para realizar el pronostico de corto plazo mediante el modelado ARIMA, se eligió la producción de concreto premezclado como variable objetivo. La selección de esta variable está fundamentada en:
Relación directa con la actividad operativa de la empresa Argos: la producción de concreto es una variable directamente asociada a la fuente del negocio. Además, la producción de concreto representa ejecución real de proyectos y genera ingresos inmediatos para la empresa.
Mayor relevancia para decisiones estratégicas operativas: predecir la producción de concreto permite a la empresa anticipar las necesidades logísticas, ajustar niveles de inventario, plantear turnos de producción. Es importante mencionar que a pesar de que las licencias son indicador adelantado, su impacto sobre la producción no es inmediato ni uniforme, ya que entre la expedición de una licencia y la ejecución real de obras puede existir meses o años de desfase.
División en conjunto de entrenamiento y prueba para la variable 1 que es la elegida para pronosticar
El código siguiente divide una serie temporal (variable1_ts) en dos subconjuntos:
Conjunto de entrenamiento (train): Datos desde enero de 2012 hasta septiembre de 2024. Conjunto de prueba (test): Datos desde octubre de 2024 hasta diciembre de 2024.
Esto se hace para evaluar el desempeño de modelos de predicción en datos no vistos.
# Esta división idealmente podria se 80%-70% de los datos para entrenamiento y 20%-30% para prueba o test
# En este ejemplo el conjunto de entrenamiento es: Enero 2012-Septiembre 2024 y el conjunto de prueba o test: noviembre 2024-diciembre 2024
train_size <- length(variable1_ts) - 3 # Se deja fuera los últimos 3 valores para usarlos como set de prueba.
train_ts <- window(variable1_ts, end = c(2024, 9)) # Entrenamiento hasta septiembre 2024
test_ts <- window(variable1_ts, start = c(2024, 10)) # Prueba inicia desde oct2024
Identificación automática del modelo ARIMA
library(forecast)
# Ajustar un modelo ARIMA automático sin estacionalidad, por eso se pone seasonal=FALSE
auto_arima_model_no_seasonal <- auto.arima(train_ts, seasonal = FALSE)
# Mostrar el modelo seleccionado
summary(auto_arima_model_no_seasonal)
## Series: train_ts
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## 0.4168 -0.8006
## s.e. 0.1228 0.0798
##
## sigma^2 = 4.509e+09: log likelihood = -1904.31
## AIC=3814.62 AICc=3814.78 BIC=3823.69
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 2002.492 66490.08 48170.62 -9.069187 16.93914 0.6518442 0.01118962
Estimación del modelo identificado automático y validación de significancia de coeficientes
library(lmtest)
# Evaluar la significancia estadística de los coeficientes del modelo ARIMA
coeftest(auto_arima_model_no_seasonal)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.416814 0.122757 3.3954 0.0006852 ***
## ma1 -0.800561 0.079841 -10.0270 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Ajuste del modelo ARIMA(1,1,1) automático sin parte estacional y crearlo como variable darima_auto para luego poder graficarlo y crear la tabla
darima_auto <- Arima(train_ts,
order = c(1, 1, 1)) # Especificamos directamente (p=1, d=1, q=1)
# Mostrar resumen del modelo ajustado
summary(darima_auto)
## Series: train_ts
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## 0.4168 -0.8006
## s.e. 0.1228 0.0798
##
## sigma^2 = 4.509e+09: log likelihood = -1904.31
## AIC=3814.62 AICc=3814.78 BIC=3823.69
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 2002.492 66490.08 48170.62 -9.069187 16.93914 0.6518442 0.01118962
Validación de residuales o errores del modelo
# Diagnóstico del modelo (los residuos deben ser ruido blanco)
checkresiduals(darima_auto) # Verificar si los residuos son aleatorios y no presentan patrones
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,1)
## Q* = 45.881, df = 22, p-value = 0.002048
##
## Model df: 2. Total lags used: 24
Evaluación de los residuos del modelo ARIMA
La gráfica de la serie temporal de los residuos nos muestra que la mayoría de los residuos oscilan alrededor de cero. La gráfica presenta variabilidad y picos notorios hacia el final. En el año 2020 (pandemia) hay un valor atípico.
La gráfica ACF de los residuos, muestra que hay varios puntos que están fuera de las bandas azules, mostrando autocorrelación significativa no explicada.
El histograma de los residuos, es aproximadamente simétrica, no tan precisa.
Pronóstico modelo ARIMA automático
# Generar pronóstico para el conjunto de prueba
forecast_arima_auto <- forecast(darima_auto, h = length(test_ts)) # Predecir los valores futuros
# Crear dataframe para gráfico interactivo del pronóstico
forecast_data_auto <- data.frame(Tiempo = time(forecast_arima_auto$mean),
Pronostico = as.numeric(forecast_arima_auto$mean),
Observado = as.numeric(test_ts))
# Graficar pronóstico junto con los valores observados reales
p4auto <- ggplot(forecast_data_auto, aes(x = Tiempo)) +
geom_line(aes(y = Pronostico, color = "Pronóstico")) +
geom_line(aes(y = Observado, color = "Observado")) +
ggtitle("Gráfico 9. Pronóstico vs Observado") +
xlab("Tiempo") + ylab("M3 concreto producido")
ggplotly(p4auto) # Convertir el gráfico en interactivo
Se observa que el modelo ARIMA pronostica un ligero aumento en la producción de concreto, mientras que en los datos reales muestra una caída pronunciada en ese mismo periodo. Se capturan los puntos de quiebre. En cuanto a la precisión, el modelo subestima la caída observada. Se recomienda realizar análisis con modelo SARIMA para mejorar el pronóstico.
Pronostico automático dentro del set de prueba conmutable
# Cargar librerías necesarias
library(forecast)
library(dplyr)
# Generar pronóstico con el modelo ARIMA identificado
arima_forecast_auto <- forecast(auto_arima_model_no_seasonal, h = length(test_ts))
# Crear un dataframe con los valores observados y pronosticados
forecast_table_auto <- data.frame(
Tiempo = time(arima_forecast_auto$mean), # Extraer las fechas del pronóstico
Observado = as.numeric(test_ts), # Valores reales
Pronosticado = as.numeric(arima_forecast_auto$mean) # Valores pronosticados
)
# Mostrar la tabla
print(forecast_table_auto)
## Tiempo Observado Pronosticado
## 1 2024.750 682140.0 644982.2
## 2 2024.833 638772.9 650002.3
## 3 2024.917 608304.9 652094.8
Ahora pronosticamos con el modelo fuera
Es decir, le sumamos al periodo de prueba una observación más. Es decir, se estan pronosticando 4 observaciones o trimestres.
# Cargar librerías necesarias
library(forecast)
# Hacer un pronóstico para el siguiente trimestre (1 período adicional)
next_forecast_auto <- forecast(auto_arima_model_no_seasonal, h = length(test_ts) + 1)
# Extraer el pronóstico del próximo trimestre
next_month_forecast_auto <- data.frame(
Tiempo = time(next_forecast_auto$mean), # Extraer la fecha del pronóstico
Pronostico = as.numeric(next_forecast_auto$mean) # Valor pronosticado
)
# Mostrar el pronóstico completo
print(next_month_forecast_auto)
## Tiempo Pronostico
## 1 2024.750 644982.2
## 2 2024.833 650002.3
## 3 2024.917 652094.8
## 4 2025.000 652966.9
# Extraer solo el valor del trimestre adicional (último de la tabla)
next_month <- tail(next_month_forecast_auto, 1)
print(paste("Pronóstico para enero 2025:", next_month$Tiempo, "=", next_month$Pronostico))
## [1] "Pronóstico para enero 2025: 2025 = 652966.933078824"
Este modelo podría ser una solución o mejora al modelo arima tradicional ya que recoge el efecto estacional de las variables, es recomendable por tanto para datos que si tienen un componente estacional fuerte.
El modelo ajustado en este análisis es un SARIMA(1,1,1)(0,0,1)[12], lo que significa:
(1,1,1): Parte ARIMA no estacional: 0 términos autorregresivos (AR). 1 diferenciación (d), lo que indica que la serie fue diferenciada una vez para hacerla estacionaria. 1 término de media móvil (MA).
(0,0,1)[12]: Parte estacional con periodicidad 12 (mensual si los datos son mensuales): 1 término autorregresivo estacional (SAR). 0 diferenciaciones estacionales. 0 términos de media móvil estacionales (SMA).
El modelo SARIMA(1,1,1)(0,0,1)[12] sugiere que:
Identificación automática del modelo SARIMA
# Identificación automática del mejor modelo ARIMA
auto_arima_model <- auto.arima(train_ts) # Busca automáticamente los mejores parámetros del modelo ARIMA
print(auto_arima_model)
## Series: train_ts
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## 0.4363 -0.8087 0.3375
## s.e. 0.1409 0.0964 0.0810
##
## sigma^2 = 4.007e+09: log likelihood = -1895.53
## AIC=3799.06 AICc=3799.33 BIC=3811.15
A continuación, se crea el objeto darima para luego poder graficar los valores reales y observados:
# Cargar el paquete necesario
library(forecast)
# Ajustar el modelo SARIMA(1,1,1)(0,0,1)[12] Modelo identificado en el paso anterior
darima <- Arima(train_ts,
order = c(1, 1, 1), # (p,d,q) -> (1,1,1)
seasonal = list(order = c(0, 0, 1), # (P,D,Q) -> (0,0,1)
period = 12)) # Periodicidad estacional de 12 meses
# Mostrar resumen del modelo ajustado
summary(darima)
## Series: train_ts
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## 0.4363 -0.8087 0.3375
## s.e. 0.1409 0.0964 0.0810
##
## sigma^2 = 4.007e+09: log likelihood = -1895.53
## AIC=3799.06 AICc=3799.33 BIC=3811.15
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 1381.24 62469.75 44480.52 -8.552401 15.84795 0.6019099
## ACF1
## Training set -0.0008884059
Validación de residuales del modelo automatico SARIMA
En el correlograma de residuos siguiente se observa que, mejora la correlación de los residuos frente a los dos modelos anteriores. Además, al comparar los valores reales VS pronosticados se determina dos coincidencias en 2 valores.
# Diagnóstico del modelo (los residuos deben ser ruido blanco)
checkresiduals(darima) # Verificar si los residuos son aleatorios y no presentan patrones
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,1)(0,0,1)[12]
## Q* = 16.518, df = 21, p-value = 0.7399
##
## Model df: 3. Total lags used: 24
Evaluación de los residuos del modelo SARIMA
La gráfica de la serie temporal de los residuos nos muestra que la mayoría de los reisudos oscilan alrededor de cero. Hay un pico al rededor del año 2020 (pandemia). Los residuos son relativamente estables, lo que indica que el modelo logra capturar la mayoría de los patrones de la serie.
La gráfica ACF de los residuos, muestra que la mayoría de los puntos están dentro de las bandas azules, mostrando ausencia de autocorrelación significativa.
El histograma de los residuos, es aproximadamente simétrica y centrada en cero, lo que indica una distribución cercana a la normal.
Pronóstico con el modelo SARIMA dentro del set de prueba
# Generar pronóstico para el conjunto de prueba
forecast_arima <- forecast(darima, h = length(test_ts)) # Predecir los valores futuros
# Crear dataframe para gráfico interactivo del pronóstico
forecast_data <- data.frame(Tiempo = time(forecast_arima$mean),
Pronostico = as.numeric(forecast_arima$mean),
Observado = as.numeric(test_ts))
# Graficar pronóstico junto con los valores observados reales
p4 <- ggplot(forecast_data, aes(x = Tiempo)) +
geom_line(aes(y = Pronostico, color = "Pronóstico")) +
geom_line(aes(y = Observado, color = "Observado")) +
ggtitle("Gráfico 10. Pronóstico vs Observado") +
xlab("Tiempo") + ylab("M3 Concreto producido")
ggplotly(p4) # Convertir el gráfico en interactivo
Para el modelo SARIMA, comparado con el anterior, capta mejor la forma de la serie. Aunque subestima la caída observada, el pronóstico refleja un cambio de tendencia descendente hacia el final del periodo. La curva de pronóstico cambia de dirección, lo que indica que el modelo reconoce un patrón estacional o estructural. La serie observada sigue cayendo más rápido que lo estimado por el modelo, lo que nos indica que aunque SARIMA mejora el ajuste, todavía no anticipa completamente la magnitud del descenso que se observa en la realidad.El modelo copia dos de las 3 datos tomados.
Pronóstico del modelo automatico SARIMA en el set de prueba- Tabla
# Cargar librerías necesarias
library(forecast)
library(dplyr)
# Generar pronóstico con el modelo ARIMA identificado
arima_forecast <- forecast(auto_arima_model, h = length(test_ts))
# Crear un dataframe con los valores observados y pronosticados
forecast_table <- data.frame(
Tiempo = time(arima_forecast$mean), # Extraer las fechas del pronóstico
Observado = as.numeric(test_ts), # Valores reales
Pronosticado = as.numeric(arima_forecast$mean) # Valores pronosticados
)
# Mostrar la tabla
print(forecast_table)
## Tiempo Observado Pronosticado
## 1 2024.750 682140.0 634432.1
## 2 2024.833 638772.9 645271.3
## 3 2024.917 608304.9 626579.4
El modelo SARIMA logra una mejor representación del comportamiento reciente de la producción de concreto que el modelo ARIMA. Mientras ARIMA proyectaba una tendencia creciente, el modelo SARIMA detecta una desaceleración. Sin embargo, ambos modelos subestiman la fuerte caída observada, lo cual indica que probablemente existen factores externos no incluidos en el modelo, como reducciones en inversión pública o una disminución inesperada en nuevas licencias de construcción.
En la siguiente tabla, podemos observar que para el primer dato que corresponde al mes de octubre, el dato que más se acerca es en el modelo ARIMA. Sin embargo, para los otros dos datos, de noviembre y diciembre los pronósticos más cercanos a lo real fueron los del modelo SARIMA.
# Crear la tabla de comparación de valores reales y pronosticados
tabla_comparacion_modelos <- data.frame(
Fecha = as.Date(time(test_ts)),
Observado = as.numeric(test_ts),
ARIMA = as.numeric(forecast_arima_auto$mean), # modelo sin estacionalidad
SARIMA = as.numeric(forecast_arima$mean) # modelo con estacionalidad
)
# Mostrar la tabla
print(tabla_comparacion_modelos)
## Fecha Observado ARIMA SARIMA
## 1 2024-10-01 682140.0 644982.2 634432.1
## 2 2024-11-01 638772.9 650002.3 645271.3
## 3 2024-12-01 608304.9 652094.8 626579.4
Por lo tanto, para el pronóstico se elige el modelo SARIMA.
Pronóstico del modelo automático SARIMA fuera de muestra
Es decir, le sumamos al periodo de prueba una observación más o sea que, se están pronosticando 4 observaciones o 4 meses.
# Cargar librerías necesarias
library(forecast)
# Hacer un pronóstico para el siguiente mes (1 período adicional)
next_forecast <- forecast(auto_arima_model, h = length(test_ts) + 1)
# Extraer el pronóstico del próximo mes
next_month_forecast <- data.frame(
Tiempo = time(next_forecast$mean), # Extraer la fecha del pronóstico
Pronostico = as.numeric(next_forecast$mean) # Valor pronosticado
)
# Mostrar el pronóstico completo
print(next_month_forecast)
## Tiempo Pronostico
## 1 2024.750 634432.1
## 2 2024.833 645271.3
## 3 2024.917 626579.4
## 4 2025.000 609284.8
# Extraer solo el valor del trimestre adicional (último de la tabla)
next_month <- tail(next_month_forecast, 1)
print(paste("Pronóstico para enero 2025:", next_month$Tiempo, "=", next_month$Pronostico))
## [1] "Pronóstico para enero 2025: 2025 = 609284.820216773"
Dado el resultado anterior, el pronóstico para enero 2025 fue de 609284.82m3 de concreto producido por Argos en Colombia.
Para la tendencia reciente, se observa una clara tendencia decreciente entre octubre y diciembre 2024. El modelo SARIMA proyecta que en enero 2025 se mantendrá en un nivel muy similar al de diciembre 608304.9m3. De esto podemos comentar, que es coherente con el patrón reciente de la serie, pues ha captado correctamente la tendencia de desaceleración.
El pronóstico de la producción de concreto en Colombia por valor de 609284.82m3 representa un volumen considerable para el inicio del año. Al comparar con los valores históricos de enero, este valor indica un aumento o mantenimiento a nivel de demanda del cierre de 2024.
Impactos para la empresa Argos
El pronóstico nos sugiere una demanda de concreto sostenida para el mes de enero incluso cuando este es tradicionalmente bajo. Esto puede exigir una planificación logística anticipada donde se asegure inventarios de materia prima, mantenimiento de plantas operativas y disponibilidad de personal desde el inicio del año. Un pronóstico estable o creciente, puede reflejar la confianza del mercado y la continuidad de proyectos de construcción, lo que apoya las decisiones de inversión en el sector.
Por otro lado, para el sector de la construcción, una demanda alta de concreto puede anticipar una aceleración de obras nuevas o en ejecución, especialmente si se relaciona con el incremento reciente en las licencias de construcción.
Por último, las empresas constructoras, contratistas y proveedores pueden anticipar sus actividades para que la logística del sector no se limite por los tiempos de espera y la demana y además, puede darles seguridad de que el sector sigue estable.
Estrategias y acciones para la empresa Argos
Con base en el pronóstico para Argos, se proponen las siguientes estrategias:
Asegurar la disponibilidad de materias primas desde finales del año 2024 hasta inicios de 2025 para responder a tiempo.
Reforzar las capacidades logísticas de las plantas de producción de concreto. Esto se refiere a las flotas de trasnporte, personal operativo, etc.
Realizar monitoreo del mercado y revisión continua de pronóstico para planear la operación del primer trimestre del año y revisar las licencias de construcción nuevas para anticiparse a los cambios.
Realizar campañas comerciales que muestren la estabilidad del sector de la construcción, y con esto impulsar el cierre de contratos anuales con constructoras.