1. Contexto del análisis

El presente análisis busca identificar señales económicas del sector construcción colombiano mediante variables relacionadas con la industria cementera.

Empresa seleccionada: Cementos Argos.

Variables analizadas:

  • PNCEM: Producción nacional de cemento.
  • DECEM: Despachos nacionales de cemento.
  • LICC: Licencias de construcción.

El objetivo es analizar tendencias, estacionalidad y realizar un pronóstico de corto plazo mediante un modelo ARIMA/SARIMA.

2. Librerías necesarias

library(readxl)
library(forecast)

3. Carga de datos

datos <- read_excel(
  "Base Caso1.xlsx",
  sheet = "Caso2"
)

head(datos)
## # A tibble: 6 × 62
##   FECHA                PNCEM   DECEM CONCRETO   LICC  POLLO  HUEVO PNCAFE PICAFE
##   <dttm>               <dbl>   <dbl>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 2012-01-01 00:00:00 868474 823284.  526136. 1.50e6 91722. 52929.    535 8.75e5
## 2 2012-02-01 00:00:00 865408 846615.  584897. 1.73e6 94142. 52870.    571 8.26e5
## 3 2012-03-01 00:00:00 998847 950453.  634905. 1.43e6 88748. 52979.    576 7.28e5
## 4 2012-04-01 00:00:00 852138 789542.  550290. 1.39e6 92013. 52633.    580 7.03e5
## 5 2012-05-01 00:00:00 919675 904691.  639649. 1.96e6 93279. 52466.    689 6.70e5
## 6 2012-06-01 00:00:00 906243 879219.  620338. 1.96e6 91315. 52665.    714 5.93e5
## # ℹ 53 more variables: PECAFE <dbl>, XCAF <dbl>, M <dbl>, X <dbl>, TRM <dbl>,
## #   M_CEREAL <dbl>, M_CERAMICO <dbl>, M_FARM <dbl>, X_COMB <dbl>, X_AZU <dbl>,
## #   X_PREALIM <dbl>, X_FARM <dbl>, X_QUIM <dbl>, X_PAPEL <dbl>,
## #   X_CERAMICO <dbl>, IPIR <dbl>, IPIR_PAPEL <dbl>, IPIR_FARM <dbl>,
## #   IPIR_PREALIM <dbl>, MIN <dbl>, ICC <dbl>, VEH <dbl>, CART <dbl>, DAH <dbl>,
## #   ENER <dbl>, BRENT <dbl>, IPC <dbl>, TO <dbl>, TD <dbl>, ISE <dbl>,
## #   CAN <dbl>, AZUCAR <dbl>, CEM_V <dbl>, COR_V <dbl>, M_V <dbl>, X_V <dbl>, …
names(datos)
##  [1] "FECHA"           "PNCEM"           "DECEM"           "CONCRETO"       
##  [5] "LICC"            "POLLO"           "HUEVO"           "PNCAFE"         
##  [9] "PICAFE"          "PECAFE"          "XCAF"            "M"              
## [13] "X"               "TRM"             "M_CEREAL"        "M_CERAMICO"     
## [17] "M_FARM"          "X_COMB"          "X_AZU"           "X_PREALIM"      
## [21] "X_FARM"          "X_QUIM"          "X_PAPEL"         "X_CERAMICO"     
## [25] "IPIR"            "IPIR_PAPEL"      "IPIR_FARM"       "IPIR_PREALIM"   
## [29] "MIN"             "ICC"             "VEH"             "CART"           
## [33] "DAH"             "ENER"            "BRENT"           "IPC"            
## [37] "TO"              "TD"              "ISE"             "CAN"            
## [41] "AZUCAR"          "CEM_V"           "COR_V"           "M_V"            
## [45] "X_V"             "IPIR_V"          "MIN_V"           "ICC_V"          
## [49] "VEH_V"           "PEAJE_V"         "ENER_V"          "CART_V"         
## [53] "POLLO_V"         "ENER_CALI"       "LICC_CALI"       "VEH_CALI"       
## [57] "X_CALI"          "OCUP_HOTEL_CALI" "ICC_CALI"        "PEAJE_CALI"     
## [61] "DAH_CALI"        "IPIR_CALI"

4. Organización de datos

datos$FECHA <- as.Date(datos$FECHA)

datos <- datos[order(datos$FECHA),]

head(datos)
## # A tibble: 6 × 62
##   FECHA       PNCEM   DECEM CONCRETO    LICC  POLLO  HUEVO PNCAFE  PICAFE PECAFE
##   <date>      <dbl>   <dbl>    <dbl>   <dbl>  <dbl>  <dbl>  <dbl>   <dbl>  <dbl>
## 1 2012-01-01 868474 823284.  526136. 1498909 91722. 52929.    535 874863.   256.
## 2 2012-02-01 865408 846615.  584897. 1728147 94142. 52870.    571 826220.   246.
## 3 2012-03-01 998847 950453.  634905. 1425267 88748. 52979.    576 727565.   226.
## 4 2012-04-01 852138 789542.  550290. 1388134 92013. 52633.    580 703033.   215.
## 5 2012-05-01 919675 904691.  639649. 1960736 93279. 52466.    689 670335.   210.
## 6 2012-06-01 906243 879219.  620338. 1956173 91315. 52665.    714 592504.   186.
## # ℹ 52 more variables: XCAF <dbl>, M <dbl>, X <dbl>, TRM <dbl>, M_CEREAL <dbl>,
## #   M_CERAMICO <dbl>, M_FARM <dbl>, X_COMB <dbl>, X_AZU <dbl>, X_PREALIM <dbl>,
## #   X_FARM <dbl>, X_QUIM <dbl>, X_PAPEL <dbl>, X_CERAMICO <dbl>, IPIR <dbl>,
## #   IPIR_PAPEL <dbl>, IPIR_FARM <dbl>, IPIR_PREALIM <dbl>, MIN <dbl>,
## #   ICC <dbl>, VEH <dbl>, CART <dbl>, DAH <dbl>, ENER <dbl>, BRENT <dbl>,
## #   IPC <dbl>, TO <dbl>, TD <dbl>, ISE <dbl>, CAN <dbl>, AZUCAR <dbl>,
## #   CEM_V <dbl>, COR_V <dbl>, M_V <dbl>, X_V <dbl>, IPIR_V <dbl>, …
tail(datos)
## # A tibble: 6 × 62
##   FECHA         PNCEM   DECEM CONCRETO   LICC  POLLO  HUEVO PNCAFE PICAFE PECAFE
##   <date>        <dbl>   <dbl>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 2025-07-01 1262045.  1.20e6  695647. 2.11e6 1.62e5 97217.  1373. 2.37e6   324.
## 2 2025-08-01 1257261.  1.10e6  620780. 1.47e6 1.68e5 97949.  1243. 2.76e6   353.
## 3 2025-09-01 1237727.  1.18e6  681625. 1.79e6 1.68e5 98401.  1142. 2.97e6   406.
## 4 2025-10-01 1271214.  1.20e6  709834. 1.70e6 1.73e5 98883.  1208. 2.95e6   402.
## 5 2025-11-01 1226494.  1.11e6  636589. 1.42e6 1.80e5 99416.  1266. 2.89e6   408.
## 6 2025-12-01 1200230.  1.07e6  596981. 1.94e6 1.73e5 99503.  1233. 2.75e6   385.
## # ℹ 52 more variables: XCAF <dbl>, M <dbl>, X <dbl>, TRM <dbl>, M_CEREAL <dbl>,
## #   M_CERAMICO <dbl>, M_FARM <dbl>, X_COMB <dbl>, X_AZU <dbl>, X_PREALIM <dbl>,
## #   X_FARM <dbl>, X_QUIM <dbl>, X_PAPEL <dbl>, X_CERAMICO <dbl>, IPIR <dbl>,
## #   IPIR_PAPEL <dbl>, IPIR_FARM <dbl>, IPIR_PREALIM <dbl>, MIN <dbl>,
## #   ICC <dbl>, VEH <dbl>, CART <dbl>, DAH <dbl>, ENER <dbl>, BRENT <dbl>,
## #   IPC <dbl>, TO <dbl>, TD <dbl>, ISE <dbl>, CAN <dbl>, AZUCAR <dbl>,
## #   CEM_V <dbl>, COR_V <dbl>, M_V <dbl>, X_V <dbl>, IPIR_V <dbl>, …

5. Construcción de series temporales

PNCEM <- ts(
  datos$PNCEM,
  start=c(2012,1),
  frequency=12
)

DECEM <- ts(
  datos$DECEM,
  start=c(2012,1),
  frequency=12
)

LICC <- ts(
  datos$LICC,
  start=c(2012,1),
  frequency=12
)

6. Análisis de señales

Producción nacional de cemento

plot(
PNCEM,
main="Producción nacional de cemento PNCEM 2012-2025",
xlab="Año",
ylab="Toneladas"
)

Despachos de cemento

plot(
DECEM,
main="Despachos nacionales de cemento DECEM 2012-2025",
xlab="Año",
ylab="Toneladas"
)

Licencias de construcción

plot(
LICC,
main="Licencias de construcción LICC 2012-2025",
xlab="Año",
ylab="Área aprobada"
)

7. Crecimiento interanual YoY

DECEM_YOY <- 100*(DECEM/lag(DECEM,-12)-1)

plot(
DECEM_YOY,
main="Crecimiento interanual de despachos DECEM",
ylab="Porcentaje"
)

8. Estacionalidad

monthplot(
DECEM,
main="Comportamiento mensual de los despachos de cemento"
)

9. Descomposición temporal

descomposicion <- stl(
DECEM,
s.window="periodic"
)

plot(descomposicion)

10. Modelo SARIMA

La variable seleccionada para el pronóstico es DECEM porque representa la demanda efectiva del mercado.

División entrenamiento-validación

train <- window(
DECEM,
end=c(2024,12)
)

test <- window(
DECEM,
start=c(2025,1)
)

Selección automática del modelo

modelo <- auto.arima(
train,
seasonal=TRUE,
stepwise=FALSE,
approximation=FALSE
)

modelo
## Series: train 
## ARIMA(1,1,1)(1,0,0)[12] 
## 
## Coefficients:
##          ar1      ma1    sar1
##       0.4859  -0.9439  0.2263
## s.e.  0.0903   0.0435  0.0796
## 
## sigma^2 = 8.324e+09:  log likelihood = -1989.53
## AIC=3987.07   AICc=3987.34   BIC=3999.24

11. Diagnóstico del modelo

checkresiduals(modelo)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,1)(1,0,0)[12]
## Q* = 10.755, df = 21, p-value = 0.9673
## 
## Model df: 3.   Total lags used: 24

12. Validación predictiva

prediccion <- forecast(
modelo,
h=12
)

plot(prediccion)

accuracy(
prediccion,
test
)
##                    ME     RMSE      MAE        MPE     MAPE     MASE
## Training set  8375.07 90060.37 61598.39 -0.8299535 7.443890 0.776646
## Test set     41325.96 92623.51 81776.83  3.1853859 7.475947 1.031060
##                     ACF1 Theil's U
## Training set -0.01721159        NA
## Test set      0.12945726 0.8148546

13. Modelo final

modelo_final <- auto.arima(
DECEM,
seasonal=TRUE,
stepwise=FALSE,
approximation=FALSE
)

modelo_final
## Series: DECEM 
## ARIMA(1,1,1)(1,0,0)[12] 
## 
## Coefficients:
##          ar1      ma1    sar1
##       0.4784  -0.9467  0.2355
## s.e.  0.0856   0.0399  0.0772
## 
## sigma^2 = 8.279e+09:  log likelihood = -2143.21
## AIC=4294.42   AICc=4294.66   BIC=4306.89

14. Pronóstico enero-marzo 2026

pronostico_2026 <- forecast(
modelo_final,
h=3
)

pronostico_2026
##          Point Forecast    Lo 80   Hi 80    Lo 95   Hi 95
## Jan 2026        1036864 920256.8 1153471 858528.9 1215199
## Feb 2026        1055883 923817.5 1187948 853906.4 1257859
## Mar 2026        1078856 942003.9 1215708 869558.8 1288153
plot(
pronostico_2026,
main="Pronóstico de despachos de cemento enero-marzo 2026"
)

15. Conclusiones empresariales

El análisis permite transformar información histórica del sector construcción en señales útiles para Cementos Argos.

Los resultados del modelo permiten apoyar decisiones relacionadas con:

  • Planeación de producción.
  • Gestión de inventarios.
  • Estrategia comercial.
  • Seguimiento del comportamiento del sector.