#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)   #timetk simplifica y acelera el análisis exploratorio, visualización, y preparación de datos temporales para modelado. Es ideal para quienes trabajan con series temporales en un flujo de trabajo "tidy" y buscan integrar análisis visuales, detección de patrones y forecasting en un solo paquete.
#Cargar base de datos
library(readxl)
data_col <- read_excel("C:/Users/CRISTIAN/Desktop/ANDRES ANALITICA NEG/MOD 2/caso 2/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"))
#PASO INDISPENSABLE: Declarar la (s) variable (s) como serie (s) temporal (es)
# Convertir/declarar variable 1=M_CERAMICO en serie de tiempo mensual
variable1_ts <- ts(data_col$M_CERAMICO, start = c(2012, 1), frequency = 12)
# Convertir/declarar el ISE en serie de tiempo  mensual
variable2_ts <- ts(data_col$M, start = c(2012, 1), frequency = 12)
# Convertir/declarar las exportaciones de combustibles en serie de tiempo mensual
variable3_ts <- ts(data_col$TRM, start = c(2012, 1), frequency = 12)

1 Introducción

La empresa Grupo Decor S.A.S., con más de 30 años de trayectoria en el mercado colombiano, ha evolucionado significativamente desde que su fundador, Aurelio Grinberg, decidió crear una empresa orientada a ofrecer productos innovadores para personalizar los espacios del hogar. Lo que comenzó como un sueño empresarial se ha transformado en una de las compañías líderes del país en soluciones para obra blanca. Hoy en día, Grupo Decor cuenta con un portafolio de más de 4.500 referencias para pisos, paredes y baños, basado en las tendencias globales de diseño arquitectónico interior y exterior. Este crecimiento sostenido ha sido impulsado por una estrategia comercial enfocada en la calidad, la innovación y una sólida red de proveedores internacionales. Actualmente, el 93% de sus insumos son importados, principalmente desde China, India y España.

El sector de la construcción en Colombia ha demostrado una alta sensibilidad frente a las dinámicas económicas tanto internas como externas, especialmente en lo que respecta a la importación de insumos, la variación del tipo de cambio y la evolución del comercio internacional. Dentro de este ecosistema empresarial, Grupo Decor S.A.S. se ha consolidado como una de las principales compañías proveedoras de soluciones para pisos, paredes y baños, destacándose por su oferta de productos de alta calidad e innovación.

En este contexto, resulta fundamental comprender cómo variables macroeconómica clave han impactado y continúan impactando el comportamiento comercial de empresas altamente importadoras como Grupo Decor. Específicamente, las importaciones de productos cerámicos, frente a las importaciones totales del país y la Tasa Representativa del Mercado (TRM) que son tres indicadores que permiten evaluar la competitividad, capacidad de abastecimiento, estructura de costos y rentabilidad de este tipo de empresas.

Durante el periodo 2012-2024, Colombia ha experimentado importantes fluctuaciones en estos tres aspectos. Las importaciones totales han estado influenciadas por los ciclos económicos globales, los acuerdos comerciales y los precios internacionales, mientras que las importaciones de cerámicos reflejan no solo la demanda interna del sector de la construcción y remodelación, sino también la capacidad de compra del mercado colombiano. Por otra parte, la TRM ha sido un factor determinante en el cálculo de costos para importadores como Grupo Decor, afectando directamente los márgenes de ganancia y precios de venta.

El análisis de estas variables permite construir un marco estratégico de proyección comercial, identificar riesgos económicos relevantes, y anticipar escenarios que impactan la sostenibilidad financiera y operativa de la empresa en el corto y mediano plazo. Así, el presente trabajo tiene como propósito explorar y correlacionar el comportamiento histórico de estas variables con el desempeño de Grupo Decor S.A.S., a fin de proyectar sus posibles impactos en las compras, ventas y operaciones para el año 2025.

Gráfico 1. Importaciones totales de febrero 2023 a febrero 2025

Al hacer un análisis del grafico 1 presentado de las importaciones totales del país durante el periodo comprendido entre 2023 y los primeros meses de 2025, se observa un comportamiento que, desde una óptica financiera, refleja una posible reactivación de compras estratégicas y una recomposición de inventarios. Este patrón guarda estrecha relación con el incremento sostenido de las importaciones en Grupo Decor, lo cual implica una mayor demanda de divisas, pero también evidencia una intensificación en la actividad operativa y comercial. El repunte en los niveles de importación sugiere que las empresas están retomando decisiones de inversión y abastecimiento con horizonte de mediano plazo, lo que revela una mejora en la percepción del riesgo económico y una mayor solidez en los flujos de caja corporativos

Para efectos de evidenciar la representación de la mercancía importada que ingresó a la empresa Grupo Decor en los años 2024 se suministra la siguiente información en la tabla 1:

Tabla 1. Análisis Comparativo de Inventarios 2023-2024 - GRUPO DECOR SAS
2024
2023
Rubro Valor 2024 % Valor 2023 %
Inventario Principal
Mercancía Importada 78.105.065 73% 73.341.080 76%
Mercancía Nacional 7.308.423 7% 11.692.509 12%
Inventario en Tránsito 20.991.640 20% 11.463.362 12%
Subtotal Inventario 106.405.128 99,1% 96.496.951 99,4%
Ajustes al Inventario
Deleznable y VNR 621.229 0,6% 587.406 0,6%
Provision Devoluciones 317.424 0,3%
Total Inventario 107.343.781 100,0% 97.084.357 100,0%
Notas:
VNR: Valor Neto de Realización
Porcentajes calculados sobre el total general
Fuente: Estados financieros Grupo DECOR 2024

La Tasa representativa del mercado (TRM) es otra variable financiera, que afecta directamente financieramente a la empresa grupo DECOR A diciembre del año 2023 la TRM cerró en $COP3,822.05 y al cierre de diciembre 2024 se encontraba en $COP $COP4.409,15 cabe destacar que Para Grupo Decor, que importa gran parte de su mercancía, una subida prolongada de la TRM podría impactar negativamente en la compra de productos, dado que la diferencia en cambio en la adquisición de estos se suma a gastos representativos que afectan directamente a la utilidad de la compañía a continuación mostramos el aumento de la TRM en periodo de 2 años y lo que esto a afectado al estado de resultados de la empresa.

Gráfico 2. Tasa representativa del mercado (TRM) PESO/USD ENERO 2023 - ENERO 2025

Tabla No.2 Grupo Decor: Variación diferencia en cambio* año 2023-2024

INGRESOS POR DIFERENCIA EN CAMBIO
Concepto Diciembre 2024 Diciembre 2023
Diferencia en cambio (6.497.166) (9.461.316)
Valoración de forward (181.196)
Total Ingresos (6.678.362) (9.461.316)
GASTOS POR DIFERENCIA EN CAMBIO
Concepto Diciembre 2024 Diciembre 2023
Diferencia en cambio 9.174.371 6.038.352
Devaluación de créditos
142.884
Valorización de forward
987.783
Total Gastos 9.174.371 7.169.020
RESULTADO NETO
Concepto Diciembre 2024 Diciembre 2023
Neto Diferencia en cambio 2.496.009 (2.292.296)

Notas:

    • Diferencia en cambio: Refiere a las fluctuaciones en el valor de los activos y pasivos en moneda extranjera debido a variaciones del tipo de cambio.
    • Cuando estas variaciones resultan en ganancias, se registran como ingreso; cuando resultan en pérdidas, se reconocen como gasto.
    • Fuente: Estados financieros Grupo DECOR 2024

2 Extracción de señales

Gráfico inicial de las variables a analizar en niveles -Original
  • M_CERAMICO: Importaciones de productos cerámicos (miles de USD).
  • M: Importaciones totales (miles de USD).
  • TRM: Tasa representativa del mercado (pesos colombianos por USD).
library(plotly)
library(dplyr)

# 1. Convertir series de tiempo a numéricas
data_col$variable1 <- as.numeric(variable1_ts)
data_col$variable2 <- as.numeric(variable2_ts)
data_col$variable3 <- as.numeric(variable3_ts)

# 2. Crear columna de fechas (asumiendo datos mensuales desde 2012-01-01)
data_col$Fecha <- seq.Date(
  from = as.Date("2012-01-01"),
  by = "month",
  length.out = nrow(data_col)
)

# 3. Crear gráficos individuales para cada variable
plot_var1 <- plot_ly(data_col, x = ~Fecha) %>%
  add_lines(y = ~variable1, name = "M_CERAMICO", line = list(color = "blue")) %>%
  layout(yaxis = list(title = "M_CERAMICO"))

plot_var2 <- plot_ly(data_col, x = ~Fecha) %>%
  add_lines(y = ~variable2, name = "M", line = list(color = "red")) %>%
  layout(yaxis = list(title = "M"))

plot_var3 <- plot_ly(data_col, x = ~Fecha) %>%
  add_lines(y = ~variable3, name = "TRM", line = list(color = "green")) %>%
  layout(yaxis = list(title = "TRM"),
         xaxis = list(title = "TIEMPO"))

# 4. Combinar en un solo gráfico con subplots verticales
grafico_combinado <- subplot(
  plot_var1, 
  plot_var2, 
  plot_var3,
  nrows = 3,
  shareX = TRUE,    # Compartir eje X
  titleY = TRUE     # Mostrar títulos en eje Y
) %>% 
  layout(
    title = "Grafíco 3. Series originales de las variables de análisis",
    hovermode = "x unified"  # Muestra info de todas las series al mismo tiempo
  )

# 5. Mostrar el gráfico interactivo
grafico_combinado

El gráfico 3 muestra el comportamiento de las variables a analizar, se concluye que:

  • El comportamiento de las Importaciones Totales (M) es volatil: Las importaciones totales son sensibles a la TRM y al ciclo económico.

  • Las importaciones de productos ceramicos M_CERAMICO sigue la misma tendencia cíclica que M, pero con mayor amplitud en sus fluctuaciones. Los bienes no esenciales (como cerámicos) son más sensibles a la contracción del gasto.

  • La TRM muestra una tendencia alcista sostenida desde 2012, con saltos significativos por diferentes crisis.

  • TRM vs. Importaciones (M y M_CERAMICO): Existe correlación negativa fuerte, ya que cuando la TRM sube, las importaciones tienden a caer.Un dólar caro encarece los productos importados, reduce la demanda interna y fomenta sustitución por bienes locales. Ejemplo: Pico de TRM en 2016 → desplome de M y M_CERAMICO.

Extracción señales

La descomposición de series temporales facilita una comprensión más profunda del comportamiento de los datos, lo que permite realizar predicciones más precisas y tomar decisiones con mayor fundamento. Esta técnica es esencial en el análisis de datos para negocios, especialmente en contextos donde las variaciones en el tiempo pueden influir directamente en decisiones de inversión, diseño de políticas económicas o planificación estratégica empresarial.

A continuación se analizará las variables anteriormente mencionadas individualmente, se extraen los siguientes datos:

  • Estacional: Patrones repetitivos a intervalos regulares.
  • Residuo: Variaciones irregulares no explicadas.
  • Serie Original: Datos brutos observados.
  • Tendencia: El comportamiento general o patrón persistente que muestra una serie de datos a lo largo del tiempo, ya sea de forma creciente, decreciente o constante.

Extracción de señales variable M_CERAMICO - Importaciones de productos cerámicos

# 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 4. Descomposición temporal de la variable M_CERAMICO",
       x = "Tiempo",
       y = "Valor")

# Convertir a gráfico interactivo con plotly
ggplotly(p)

El gráfico 4 muestra la descomposición de la serie temporal de M_CERAMICO - importación de productos cerámicos (miles de USD):

Estacionalidad (patrones cíclicos): Tiene una amplitud significativa que Oscila entre -1,000 y +1,000 mil USD. Hay picos altos en los meses enero, febrero, julio, diciembre coincide con temporada alta de construcción ya que hay clima seco y además por cierre fiscal podrían haber compras anticipadas. Por otro lado se presentan caidas en los meses marzo,septiembre, noviembre, debido a menor actividad constructora por lluvias y ajustes presupuestarios.

Residuos: Existieros una serie de eventos anómalos destacados: En 2013–2016 Colombia experimentó una crisis exportadora, con una disminución del 50% en el valor de las exportaciones,este declive afectó negativamente la capacidad adquisitiva del país, reduciendo la demanda de productos importados, incluidos los cerámicos. En 2015–2016 alta caida por crisis económica por caída del petróleo. En 2020 hubo paralización por COVID-19. 2022-2023 hubo picos positivos Reactivación postpandemia y compras especulativas ante inflación.

Tendencia: Hubo un declive sostenido de 2015 a 2020 por efecto acumulado de la depreciación del peso (TRM alt) lo que ocasiona encarecimiento de importaciones. Además, hubo contracción del sector construcción post-crisis económica (2016) y pandemia Covid-19 (2020). Para el año 2021 existe un efecto rebote por la pandemia pero hacía 2022-2024 se ve un leve ascenso pero sin retornar a niveles pre-crisis, es señal de una demanda aún frágil en el sector cerámico y/o competencia creciente de productos locales.

Extracción de señales variable M - Importaciones totales

# 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 5. Descomposición temporal de la variable M",
       x = "Tiempo",
       y = "Valor")

# Convertir a gráfico interactivo con plotly
ggplotly(p)

El gráfico 5 muestra la descomposición de la serie temporal de M - importaciones totales (miles de USD):

Estacionalidad (patrones cíclicos): Se observan picos máximos en para el segundo semestre: Alineado con cierre fiscal y temporada alta de consumo.Por otro lado, hay caidas hacia el primer semestre por reducción post-festividades y ajustes presupuestarios. A diferencia de la variable M_CERAMICO, esta tiene menor volatilidad, debido a que las importaciones totales incluyen bienes esenciales (menos sensibles a estacionalidad). Existe un patrón mas estable.

Residuo: Al igual que la variable M_CERAMICO existieros una serie de eventos anómalos destacados: En 2014–2016 Colombia experimentó una crisis exportadora que afectó significativamente las importaciones. En 2015–2016 alta caida por crisis económica por caída del petróleo. En 2020 hubo paralización por COVID-19. 2022-2023 hubo picos positivos por sobre-compras por cuellos de botella en cadenas globales.

Tendencia: En el periodo 2012-2014 hay una fase de expasión, se presenta estabilidad económica, auge minero-energético, y demanda interna sólida. Posteriormente, hay desacelaracón para los periodos 2015-2016 se presenta depreciación del peso frente al dolar. Luego hacia 2017-2019 se empieza a recuperar, hay un crecimiento sostenido debido a la reactivación de inversión extranjera y consumo, que se ve entorpercido en 2020 a causa de la pandemia. Desde 2021 hasta 2024 se observa una recuperación acelerada llegando a un nuevo maximo historico, lo cual es señal de reactivación económica robusta y mayor dependencia de insumos importados en la industria.

Extracción señales variable TRM - Tasa Representativa del Mercado

# 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 6. Descomposición temporal de la variable TRM",
       x = "Tiempo",
       y = "Valor")

# Convertir a gráfico interactivo con plotly
ggplotly(p)

El gráfico 6 muestra la descomposición de la serie temporal de TRM - Tasa Representativa del Mercado (pesos colombianos por dólar):

Estacionalidad (patrones cíclicos): Muestra patrones estacionales influenciados por flujos de divisas. En el primer semestre, se observa una menor presión sobre el tipo de cambio (caida) debido a mayores ingresos por remesas y la liquidación de exportaciones agrícolas y mineras. En cambio, en el segundo semestre se registra una mayor demanda de dólares asociada con pagos de dividendos al exterior y ciertas necesidades corporativas, lo que puede presionar al alza la tasa de cambio. No obstante, estos patrones pueden verse alterados por factores externos como condiciones internacionales, precios del petróleo o decisiones de política monetaria.

Residuo: Se reflejan los eventos anómalos destacados de las anteriores variables, 2015-2016 Crisis petrólera, 2020 Pánico pandémico, año 2022 Alzas tasas FED (Sistema de la Reserva Federal es el banco central de los Estados Unidos) ademas de la guerra Rusia-Ucrania, por otro lado la incertidumbre por el posicionamiento de Gustavo Petro en la presidencia de Colombia y en 2023 guerra Israel- Palestina.

Tendencia: Presenta una tendencia alcista de largo plazo, con episodios de aceleración más marcados después de crisis como las de 2016, 2020 y 2022. Estos eventos han generado saltos abruptos en la tasa de cambio, reflejando una intensificación en la depreciación del peso. No obstante, esta tendencia no es constante, sino que alterna fases de estabilidad o incluso apreciación temporal, determinadas por factores económicos globales y locales.

#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"]
Análisis de series originales VS ajustadas por estacionalidad
#Ahora si se puede graficar las series originales versus la ajustada por estacionalidad
#Gráfico serie original VS ajustada Variable 1
# Crear vector de fechas correctamente alineado con la serie
fechas_var1 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable1_ts))

# Gráfico mejorado con fechas en el eje X
grafico_ajustada_var1 <- ggplot() +
  geom_line(aes(x = fechas_var1, y = variable1_ts), color = "grey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var1, y = variable1_sa), color = "black", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Gráfico 7. M_CERAMICO:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("miles de dolares") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización

# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var1)

Se observa en el gráfico 7 que en la Variable M_CERAMICO los valores de estacionalidad no representan mayor variabilidad con la serie original, a excepción de los picos, ya que muestra que el verdadero nivel de importaciones de ceramica es más bajo de lo que parece.

Hacía a un periodoactual como en 2024, las series tienen comportamiento divergente, ya que las dos líneas se separan, es ciertos periodos difieren en dirección.

# Crear vector de fechas correctamente alineado con la serie
fechas_var2 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable2_ts))

# Gráfico mejorado con fechas en el eje X
grafico_ajustada_var2 <- ggplot() +
  geom_line(aes(x = fechas_var2, y = variable2_ts), color = "grey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var2, y = variable2_sa), color = "black", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Gráfico 8. M:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("miles de dolares") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización

# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var2)

Se observa en el gráfico 8 que en la Variable M los valores de estacionalidad son suaves, aún hay subidas y bajadas pero no tan marcadas como en cerámica. En la pandemia (2020) si quitamos la estacionalidad no se refleja mayor cambio.

Hacía a un periodo actual como en 2024, las series tienen comportamiento convergente es decir, ambas líneas se mueven juntas. Puede indicar que el crecimiento es sólido y real, no solo por temporadas. Las importaciones totales son sanas.

# Crear vector de fechas correctamente alineado con la serie
fechas_var3 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable3_ts))

# Gráfico mejorado con fechas en el eje X
grafico_ajustada_var3 <- ggplot() +
  geom_line(aes(x = fechas_var3, y = variable3_ts), color = "grey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var3, y = variable3_sa), color = "black", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Gráfico 9. TRM:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("Pesos por dólar estadounidense") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización

# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var3)

El gráfico 9 muestra que quitando la estacionalidad, no hay mayor cambio en la serie. No obstante, para un periodo actual como 2024 en la serie original muestra bajas temporales en la TRM en diciembre (por remesas/exportaciones), pero la serie ajustada confirma que el dólar sigue subiendo fuertemente. Tiene comportamiento divergente, las líneas se cruzan y separan.

De acuerdo a lo observado en los gráficos 5, 6 y 7, se concluye que: - M_CERAMICO es una variable mas debil: Cae MÁS RÁPIDO que M cuando hay problemas. - M es una variable mas fuerte: Resiste mejor las crisis, ya que se incluyen otros productos esenciales. - TRM vs. Importaciones tien una relación inversa fuerte.

Análisis de series originales VS tendencia - niveles
#Ahora graficamos serie original vs tendencia
#Primero se debe obtener la tendencia de cada variable y luego graficarla
library(ggplot2)
library(plotly)

# Convertir la serie a un vector numérico
variable1_vec <- as.numeric(variable1_ts)
tendencia_var1 <- as.numeric(stl_decomp_var1$time.series[, "trend"])

# Asegurar que 'fechas' tenga la misma longitud
fechas <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable1_ts))

# Gráfico interactivo de la serie original vs tendencia
grafico_tendencia_var1 <- ggplot() +
  geom_line(aes(x = fechas, y = variable1_vec, color = "Serie Original"), size = 0.7, linetype = "solid") +
  geom_line(aes(x = fechas, y = tendencia_var1, color = "Tendencia"), size = 0.8, linetype = "solid") +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  ggtitle("Gráfico 10. Variable M_CERAMICO: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("miles de dolares") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas del eje X

# Convertir a gráfico interactivo con plotly
ggplotly(grafico_tendencia_var1)

El gráfico 10 muestra que el comportamiento de la tendencia de la variable M_CERAMICO es en declive desde 2015, exceptuando los picos de alta y caida registrados en 2020 y 2021 por pandemia y el efecto rebote de la misma llegando a un maximo historico. pero en 2023 empieza a desacelararse rapidamente, no obstante para el periodo actual 2024 se ha estado recuperando. Comportamiento que comparte con la serie original.

library(ggplot2)
library(plotly)

# Convertir la serie a un vector numérico
variable2_vec <- as.numeric(variable2_ts)
tendencia_var2 <- as.numeric(stl_decomp_var2$time.series[, "trend"])

# Asegurar que 'fechas' tenga la misma longitud
fechas <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable2_ts))

# Gráfico interactivo de la serie original vs tendencia
grafico_tendencia_var2 <- ggplot() +
  geom_line(aes(x = fechas, y = variable2_vec, color = "Serie Original"), size = 0.7, linetype = "solid") +
  geom_line(aes(x = fechas, y = tendencia_var2, color = "Tendencia"), size = 0.8, linetype = "solid") +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  ggtitle("Gráfico 11. Variable M: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("miles de dolares") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas del eje X

# Convertir a gráfico interactivo con plotly
ggplotly(grafico_tendencia_var2)

El gráfico 11 muestra el comportamiento de la tendencia de la variable M, aunque hubo caídas en 2016 y 2020, por las crisis anteriormente mencionadas, las importaciones totales crecen significativamente, aun despues de la pandemia, contrario a lo ocurrido con las importaciones de ceramica. En un periodo actual como 2024,llega a un máximo histórico; comparando la serie original va muy alineada con la tendencia, es decir hay convergencia, lo que indica que este crecimiento es real y sostenible.

library(ggplot2)
library(plotly)

# Convertir la serie a un vector numérico
variable3_vec <- as.numeric(variable3_ts)
tendencia_var3 <- as.numeric(stl_decomp_var3$time.series[, "trend"])

# Asegurar que 'fechas' tenga la misma longitud
fechas <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable3_ts))

# Gráfico interactivo de la serie original vs tendencia
grafico_tendencia_var3 <- ggplot() +
  geom_line(aes(x = fechas, y = variable3_vec, color = "Serie Original"), size = 0.7, linetype = "solid") +
  geom_line(aes(x = fechas, y = tendencia_var3, color = "Tendencia"), size = 0.8, linetype = "solid") +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  ggtitle("Gráfico 12. Variable TRM: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("Pesos por dólar estadounidense") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas del eje X

# Convertir a gráfico interactivo con plotly
ggplotly(grafico_tendencia_var3)

El Gráfico 12 muestra una tendencia claramente ascendente en la TRM. Desde 2020, esta subida se ha acelerado, lo que indica una intensificación de la TRM tras cada crisis. Además, se observa un comportamiento divergente al alza: la serie original supera la tendencia,, lo que sugiere que las presiones cambiarias han sido más fuertes de lo previsto.

Análisis de series originales VS tendencia - en tasas de crecimiento anual (%)
#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))
#print(length(tasa_crecimiento_var1))
#print(length(tasa_tendencia_var1))
#Gráfico variable original y tendencia variable 1: tasa de crecimiento anual
library(ggplot2)
library(plotly)

# Gráfico de la tasa de crecimiento anual variable 1
grafico_crecimiento_var1 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var1, y = tasa_crecimiento_var1), color = "grey", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var1, y = tasa_tendencia_var1), color = "black", size = 0.8, linetype = "dashed") +
  ggtitle("Gráfico 13. M_CERMAMICO: Tasa crecimiento anual % -serie Original y tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var1)

En el gráfico 13 se observa el comparativo de las tasas de crecimiento anual (%) de la serie original y la tendencia de la variable M_CERAMICO: De 2013 a 2014 presentó un crecimiento moderado, la original y tendencia muy cerca, pero la crisis del petróleo hunde el crecimiento hasta casi -30 % en la original mientras la tendencia cae más moderadamente. A partir de entonces, la original registra vaivenes más bruscos, un valle importante en 2020 refleja el paro industrial que ocasionó la pandemia aunque la tendencia sufre decrecimiento no afectó tan significativamente y por otro lado el repunte alto por la necesidad de reabastecer inventarios, mientras la tendencia marca un alza más moderado. En los años siguientes las tasas se comportan similares y, para 2024, tanto la serie original como la tendencia convergen en un crecimiento moderado cercano, lo que indica que el sector cerámico crece lentamente. No obstante, en el Q4 de 2024 convergen las series hacia una desaceleración, esperando que no se convierta en decrecimiento.

#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))
#print(length(tasa_crecimiento_var2))
#print(length(tasa_tendencia_var2))
# Gráfico de la tasa de crecimiento anual variable 2
grafico_crecimiento_var2 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var2, y = tasa_crecimiento_var2), color = "grey", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var2, y = tasa_tendencia_var2), color = "black", size = 0.8, linetype = "dashed") +
  ggtitle("Gráfico 14.  M: Tasa crecimiento anual % - serie Original y Tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var2)

El Gráfico 14 compara las tasas de crecimiento anual de la serie original y la tendencia de las importaciones totales (M): Se observa que las caídas de 2016 y 2020, aunque significativas en la serie original, presentan menor magnitud que en las importaciones de productos cerámica. Además, la línea de tendencia suaviza aún más estos descensos, mientras la serie original registra -37% en 2020, la tendencia solo alcanza -15%. En 2021, la recuperación postpandémica impulsa la serie original a un máximo del 58%, superando ampliamente el 28% de la tendencia. Posteriormente, entre 2022 y 2023, ambas series muestran una clara desaceleración. Para 2024, aunque inicialmente mantienen crecimiento paralelo, hacia el cuarto trimestre surge una divergencia, la serie original inicia un descenso en su tasa de crecimiento, mientras la tendencia continúa su trayectoria alcista.

#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))
#print(length(tasa_crecimiento_var3))
#print(length(tasa_tendencia_var3))
# Gráfico de la tasa de crecimiento anual variable 2
grafico_crecimiento_var3 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var3, y = tasa_crecimiento_var3), color = "grey", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var3, y = tasa_tendencia_var3), color = "black", size = 0.8, linetype = "dashed") +
  ggtitle("Gráfico 15. TRM: Tasa crecimiento anual % - serie Original y tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var3)

El Gráfico 15 muestra la comparación entre las tasas de crecimiento anual de la serie original y la tendencia de la TRM (Tasa Representativa del Mercado). A lo largo del periodo se destacan varios eventos que marcaron fuertes variaciones. Entre 2015 y 2016, el crecimiento de la TRM se aceleró considerablemente como resultado de la crisis petrolera y la salida de capitales internacionales. En 2020, la incertidumbre generada por la pandemia provocó otro aumento importante. Posteriormente, en 2022, la combinación de la guerra en Ucrania y las alzas de tasas de interés por parte de la Reserva Federal (FED) impulsó un nuevo repunte. En el plano local, la incertidumbre generada por el cambio político tras la elección de Gustavo Petro también sumó presión sobre el tipo de cambio.

Durante 2023, la TRM mostró una desaceleración, e incluso decreció en algunos meses, reflejando una cierta normalización después de los choques anteriores. Sin embargo, para 2024, ambas líneas (la original y la de tendencia) vuelven a alinearse en una trayectoria ascendente, lo que confirma una apreciación sostenida del dólar hacia el último trimestre del año. Esta convergencia sugiere que las presiones cambiarias no han desaparecido y que, pese a los altibajos, se consolida una tendencia de fondo al alza.

3 Pronóstico de variable M_CERAMICO

Después de analizar en profundidad las tres variables consideradas - M_CERAMICO (Importaciones de productos ceramico), M (importaciones totales) y TRM (tasa de cambio)- se decide que la variable más crítica para pronosticar es M_CERAMICO, correspondiente a las importaciones de productos cerámicos en Colombia. Esta decisión se fundamenta en los hallazgos obtenidos durante el análisis de extracción de señales; a diferencia de las importaciones totales, que muestran una tendencia estable o de crecimiento, M_CERAMICO presenta un marcado decrecimiento, evidencia de un sector en alto riesgo y con dinámicas particulares que lo hacen más vulnerable frente a choques económicos y cambiarios.

Este comportamiento convierte a M_CERAMICO en un indicador clave para la toma de decisiones estratégicas en el sector, especialmente para la empresas Grupo DECOR S.A.S., cuya operación depende en gran medida de las importaciones de productos cerámicos. Contar con un pronóstico fiable de esta variable es esencial para anticipar escenarios, ajustar estrategias de compra, diversificar proveedores o considerar una mayor participación de la producción nacional en su portafolio.

Por lo tanto, se prioriza el pronóstico de M_CERAMICO no solo por su relevancia económica general, sino por su impacto directo en la sostenibilidad y competitividad de la compañía en el corto y mediano plazo.

Primero se va a pronósticar el Q4 de 2024 para verificar que el modelo aplicado realmente arroja un pronostico acertado, permitiendo comparar un pronostico de prueba con los datos reales observados. Posteriormente, se realiza el pronóstico para el mes de enero de 2025. Lo anterior bajo el modelo ARIMA (sin factor estacional) y SARIMA (con factor estacional).

3.1 Modelo ARIMA automático

El modelo ARIMA (AutoRegressive Integrated Moving Average) es una técnica estadística avanzada para analizar y pronosticar series temporales (datos recolectados secuencialmente en el tiempo). Su poder radica en que captura patrones complejos de los datos históricos para proyectar comportamientos futuros.

#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

# (sin tener en cuenta el factor estacional)

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(0,1,1) 
## 
## Coefficients:
##           ma1
##       -0.4642
## s.e.   0.0794
## 
## sigma^2 = 9280071:  log likelihood = -1434.6
## AIC=2873.19   AICc=2873.27   BIC=2879.24
## 
## Training set error measures:
##                     ME     RMSE      MAE       MPE    MAPE      MASE       ACF1
## Training set -52.42178 3026.345 2491.164 -2.498897 14.1425 0.5439787 0.05291957

El sistema calcula automaticamente el modelo ARIMA para el pronóstico de la variable M_CERAMICO, el cual da como resultado (0,1,1)

Teniendo en cuenta el valor de AIcc= 2873,27 este valor mas adelante se compará con el modelo SARIMA, entre mas bajo sea este valor mejor es el modelo.

Estimación del modelo identificado automatico 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|)    
## ma1 -0.464162   0.079371  -5.848 4.975e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

De acuerdo al resultado anterior, el coeficiente de este modelo tiene gran significancia estadistica.

# Ajuste del modelo ARIMA(4,1,2) 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(0, 1, 1))  # Especificamos directamente (p=4, d=1, q=2)  

# Mostrar resumen del modelo ajustado
#summary(darima_auto)

Validación de residuales o errores del modelo (0,1,1)

Gráfico 16. validación residuales del modelo ARIMA (0,1,1) variable M_CERAMICO

# 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(0,1,1)
## Q* = 72.667, df = 23, p-value = 4.679e-07
## 
## Model df: 1.   Total lags used: 24

Se observa en el gráfico 16, el gráfico de Autocorrelación de residuos que los datos de correlación se encuentran dentro del intervalo de confianza, muy pocos quedan por fuera. En el gráfico historiograma de residios, las barras se encuentran centradas, en lo principal dentro de la campana, lo que quiere decir que este modelo es aceptable.

Pronóstico modelo ARIMA automático dentro de muestra o en el set de prueba

# 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 17. Pronóstico vs Observado") +
  xlab("Tiempo") + ylab("variable1")

ggplotly(p4auto)  # Convertir el gráfico en interactivo

Pronóstico automático dentro del set de prueba como tabla

# 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  17188.29     18168.77
## 2 2024.833  18380.29     18168.77
## 3 2024.917  19354.60     18168.77

Interpretación modelo automatico (0,1,1):El modelo automático (0,1,1) pronostica de manera incorrecta dentro de la muestra o set de prueba. No se captura puntos de quiebre y los datos no se asemejan, ya que los datos observados tienden a crecer y el pronóstico en linea constante. No es un modelo adecuado para pronótico fuera de muestra o a futuro, por lo tanto este queda descartado.

Ahora pronosticamos con el modelo automatico fuera del periodo de análisis, es decir enero 2025

# 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   18168.77
## 2 2024.833   18168.77
## 3 2024.917   18168.77
## 4 2025.000   18168.77
# 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 = 18168.7742021367"

De igual manera como se pronosticó el cuarto trimestre de 2024, el resultado del pronóstico de enero 2025 arroja el mismo resultado, conservando una constante. Este modelo está descartado, ya que no es acertado su pronóstico.

3.2 Modelo SARIMA automático

Identificación automática del modelo SARIMA

# Identificación automática modelo SARIMA
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(0,1,1)(1,0,0)[12] 
## 
## Coefficients:
##           ma1    sar1
##       -0.3893  0.3536
## s.e.   0.0749  0.0775
## 
## sigma^2 = 8175110:  log likelihood = -1425.22
## AIC=2856.44   AICc=2856.6   BIC=2865.51

Adentrándonos en las proyecciones con el modelo SARIMA (0,1,1)(1,0,0) este tiene un buen comportamiento residual: -Los errores son pequeños, centrados en cero y no presentan patrones claros. -Hay un ligero ruido en autocorrelación, pero no invalida el modelo. -Los residuos se distribuyen aproximadamente normal adecuado para fines de pronóstico. - Comparando el valor AICc= 2856.6 es menor al arrojado por el modelo ARIMA (0,1,1) por lo tanto este es un mejor modelo.

#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(0,1,1)(1,0,0)[12] #Modelo identificado en el paso anterior
darima <- Arima(train_ts, 
                order = c(0, 1, 1),  # (p,d,q) -> (0,1,1)
                seasonal = list(order = c(1, 0, 0),  # (P,D,Q) -> (1,0,0)
                                period = 12))  # Periodicidad estacional de 12 meses

# Mostrar resumen del modelo ajustado
summary(darima)
## Series: train_ts 
## ARIMA(0,1,1)(1,0,0)[12] 
## 
## Coefficients:
##           ma1    sar1
##       -0.3893  0.3536
## s.e.   0.0749  0.0775
## 
## sigma^2 = 8175110:  log likelihood = -1425.22
## AIC=2856.44   AICc=2856.6   BIC=2865.51
## 
## Training set error measures:
##                     ME     RMSE      MAE       MPE     MAPE      MASE
## Training set -17.23937 2831.045 2281.791 -1.820996 13.07022 0.4982594
##                     ACF1
## Training set 0.007372932

Validación de residuales del modelo automatico SARIMA

Gráfico 18. validación residuales del modelo SARIMA (0,1,1) (1,0,0) variable M_CERAMICO

# 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(0,1,1)(1,0,0)[12]
## Q* = 25.303, df = 22, p-value = 0.2828
## 
## Model df: 2.   Total lags used: 24

De acuerdo con la gráfica 18 podemos inferir que:

Serie de residuos en el tiempo

1.Los errores son pequeños, centrados y oscilando alrededor de cero y no presentan patrones sistemáticos visibles. 2. Hay un ligero ruido en autocorrelación, pero no es algo afecte el modelo. 3. Los residuos se distribuyen aproximadamente normal lo cual nos indica que es modelo adecuado para fines de pronóstico.

Autocorrelación de residuos

Según el análisis realizado; algunas barras se encuentran en rezagos que salen del límite, pero la mayoría permanente dentro del intervalo de confianza, dado que, aunque podría haber ligera autocorrelación residual, El valor general es de = 0.0073 es muy bajo, lo cual es positivo.

Histograma de residuos con curva normal

  1. Tiene forma de campana, aunque con ligera asimetría (más ancha a la izquierda).
  2. La curva roja y las barras negras están bastante alineadas.
  3. Por último podemos decir que el histograma muestra que los residuos del modelo SARIMA están aproximadamente distribuidos de forma normal y centrados en cero, lo que valida su uso para pronósticos y análisis. No hay señales de sesgo fuerte ni errores extremos que comprometan su fiabilidad.

Pronóstico con el modelo SARIMA dentro del set de prueba-Gráfico líneas

# 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 19. Pronóstico vs Observado") +
  xlab("Tiempo") + ylab("miles de dolares")

ggplotly(p4)  # Convertir el gráfico en interactivo

Pronóstico del modelo automático 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  17188.29     18448.96
## 2 2024.833  18380.29     17806.85
## 3 2024.917  19354.60     18870.97

El modelo SARIMA(0,1,1)(1,0,0) supera consistentemente al ARIMA(0,1,1), tanto en ajuste como en capacidad de pronóstico. Su inclusión del componente estacional permite capturar mejor las variaciones periódicas del negocio, reduciendo el error y mejorando la fiabilidad en estratégias basadas en proyecciones. SARIMA No presenta punto de quiebre y aunque en el mes de octubre no se asemejan los datos, si lo hace para noviembre y diciembre, tanto el pronostico como el observado tienden a la alza. Se recomienda adoptarlo como modelo base para pronósticos futuros ya confiable para tomar decisiones de negocio y generar proyecciones sobre las compras y ventas de Grupo DECOR SAS.

Pronóstico del modelo automático SARIMA mes de enero 2025

# 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   18448.96
## 2 2024.833   17806.85
## 3 2024.917   18870.97
## 4 2025.000   20600.84
# 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 = 20600.837694903"

El pronóstico para enero de 2025 proyecta un valor de 20,600.84 mil USD en las importaciones de productos cerámicos (M_CERAMICO), lo cual representa un incremento respecto al valor observado en diciembre de 2024, que fue de 19,354.60 mil USD. Esta proyección resulta coherente con la tendencia ascendente identificada en el gráfico 10, lo que refuerza la validez del comportamiento esperado.

Además, el modelo SARIMA utilizado para generar esta predicción demuestra ser confiable, según los indicadores de ajuste y los residuales analizados. Por lo tanto, se considera que el pronóstico no solo es aceptable, sino también útil para la planificación estratégica de la empresa Grupo DECOR SAS.

4 Conclusiones y recomendaciones:

Conclusiones:

  • Debilidad estructural del sector frente a las importaciones totales, mientras las importaciones totales muestran una recuperación sostenida y saludable tras la pandemia, el segmento cerámico presenta un crecimiento lento, estacional y menos estable. Esto sugiere que el sector no ha logrado adaptarse plenamente al nuevo entorno económico.

  • Las importaciones de cerámica caen sostenidamente desde 2015 por TRM alta, menor inversión en construcción, reflejando una tendencia decreciente. Aunque hubo una recuperación parcial postpandemia en 2021, los volúmenes actuales no superan niveles pre-crisis. Grupo Decor SAS, como importador exclusivo, debe mantener sus compras internacionales pese a estas condiciones, lo que la hace altamente vulnerable a fluctuaciones macroeconómicas.

  • La fuerte relación inversa entre la TRM y las importaciones implica que cada aumento del dólar encarece directamente los productos cerámicos importados, reduciendo su competitividad. Para Grupo Decor SAS, esto se traduce en aumentos de precios obligatorios que disminuyen su posición competitiva en el mercado.

  • El modelo SARIMA se ha seleccionado como herramienta de pronóstico por su alta precisión y capacidad para capturar tendencias y patrones estacionales en las importaciones cerámicas. Para Grupo Decor S.A.S., este modelo es estratégicamente valioso al anticipar comportamientos del mercado que respaldan decisiones críticas de compras, inventario y abastecimiento.

  • Un pronóstico de alza en las importaciones cerámicas para enero de 2025 de 20600.83 mil USD, representa un escenario dual para Grupo Decor SAS, con implicaciones tanto de riesgo como de oportunidad. Por un lado, si la empresa no ajusta su modelo operativo frente a este incremento proyectado, podría enfrentar una compresión en sus márgenes debido al aumento en la oferta, así como costos logísticos elevados y difíciles de sostener en el mediano plazo. Sin embargo, este mismo escenario también ofrece una oportunidad estratégica: si Grupo Decor actúa con anticipación mediante compras planificadas, el uso de instrumentos de cobertura cambiaria y el fortalecimiento de alianzas con proveedores clave, puede posicionarse de manera competitiva y liderar el mercado en un contexto de posible reactivación del sector.

Recomendaciones:

  • Dada la tendencia de la TRM, resulta prioritario que Grupo Decor SAS adopte mecanismos de cobertura cambiaria, como contratos forward o seguros de cambio. Estas herramientas permiten blindar financieramente a la compañía frente a la volatilidad del dólar, asegurando mayor previsibilidad en los costos de importación y una gestión más eficiente del flujo de caja en el momento del pago a proveedores internacionales.

  • Dado que la demanda de productos cerámicos presenta patrones estacionales vinculados al comportamiento del sector construcción, y considerando las proyecciones obtenidas a través del modelo SARIMA, se recomienda una planificación anticipada de inventarios. En particular, es clave prepararse para los picos de demanda observados en los meses de enero, julio y diciembre, con el fin de optimizar costos de adquisición, asegurar la disponibilidad de producto y evitar cuellos de botella en la cadena de suministro.

  • Teniendo en cuenta la tendencia alcista en la importación de productos cerámicos para enero 2025, ya mencionada anteriormente, la empresa podrá: Anticipar aumentos de oferta que presionen precios, permitiendo ajustes comerciales proactivos. Optimizar niveles de inventario para evitar sobrecostos o faltantes. Negociar condiciones favorables con proveedores en ventanas de oportunidad. Alinear estrategias de marketing con expectativas de mercado. Mitigar riesgos cambiarios mediante decisiones informadas de compras internacionales.