1. Contextualización sector y variables

Introducción del sector y la empresa:

Por medio de este trabajo se estudiara el sector automotriz Colombiano, se analizaran los resultados, características y aspectos más importantes encontrados en las variables, de este forma como analistas financieros y económicos de la empresa Casa Toro, uno de los concesionarios más grandes del país, desde 1934 se ha consolidado con el paso del tiempo y ha aumentado su portafolio hasta ser el distribuidor oficial de muchas marcas (Mazda, Renault, Ford, Volkswagen etc.), además de haber incrementado sus servicios incluyendo ventas de vehículos usados, mantenimiento, servicio postventa entre otros más.

Pero ¿Por qué consideramos importante que el sector automotriz sea analizado?, primero que nada, es un sector que es sumamente importante para la economía, por medio de su estado podemos darnos cuenta de la evolución de procesos como importaciones, comercialización, financiamiento, y el mantenimiento de vehículos.

Aparte, este ha aumentado en los últimos años, con un crecimiento del 23,2% en 2025 comparación con el 2024 con 23.791 unidades de vehículos vendidas (Informe del Sector Automotor a Junio a 2025. (2025, julio 1). Fenalco. https://www.fenalco.com.co/blog/gremial-4/informe-del-sector-automotor-a-junio-de-2025-8178), se conoce además que este sector muestra la confianza que el consumidor ha aumentado para justamente acceder a un vehículo, por lo que con este trabajo se puede entender las tendencias de compra y el acceso a financiamiento de los colombianos.

Variables seleccionadas:

Para llegar al propósito expresado en la introducción hemos seleccionado 5 variables que consideramos relevantes y relacionados con el sector escogido, las cuales son:

  1. Tasa de cambio (pesos/dólar) TRM

  2. Índice de Confianza del Consumidor ICC

  3. Ventas de vehículos nuevos del Valle VEH_V

  4. Ventas de vehículos nuevos de Cali VEH_CALI

  5. Depósitos de ahorros DAH

Descripción y justificación de elección de variables:

En el caso de la Tasa de cambio (pesos/dólar) TRM, esta es el valor del peso colombiano frente al dólar, en el caso del sector automotriz incluyendo la empresa, ya que el proceso de exportación es fundamental en este sector, al existir muchas marcas extranjeras, en el caso de Casa Toro, las marcas de las cuales es distribuidor oficial son extranjeras, una fluctuación en la tasa de cambio puede afectar tanto positiva como negativamente la demanda de los vehículos, por lo que es una variable a considerar para conocer el estado del sector.

El Índice de confianza al consumidor ICC permite conocer la despectiva de los hogares en relación a la situación económica actual o futura, en el caso de la comercialización de vehículos, al ser un bien durable y una inversión más grande, la confianza del consumidor permite conocer si se estaría dispuesta a ser una compra mayor o si se decide abstener, “Si bien la economía colombiana ha registrado un crecimiento moderado, la mejoría en la confianza del consumidor ha sido un factor determinante para que cada vez más hogares tomen la decisión de renovar su vehículo o decidan acceder a uno por primera vez” (Informe del Sector Automotor a Junio a 2025. (2025, julio 1). Fenalco. https://www.fenalco.com.co/blog/gremial-4/informe-del-sector-automotor-a-junio-de-2025-8178)

Las ventas de vehículos nuevos en el Valle del cauca VEH_V es directamente relacionada con el propósito del trabajo, al conocer el número de vehículos nuevos, empresas como Casa Toro puede conocer el comportamiento del mercado y determinar sus siguientes movimientos, el Valle del Cauca es una de las regiones con mayor actividad comercial, el conocer su estado puede, entre otras cosas, ayudar a determinar la cantidad de demanda que se va a tener entre otras cosas.

Las ventas de vehículos nuevos en Cali VEH_CALI, muy parecido con las ventas del valle del Cauca, permite conocer el potencial del mercado, esta vez de una manera más específica y local, es una ciudad con un mercado automotriz importante y es uno de los principales centros económicos del suroccidente de Colombia, por lo que es una variable directamente relacionada con el propósito del trabajo.

Finalmente, los depósitos de ahorro DAH, esta variable mide el dinero que los hogares colombianos mantienen en el sistema financiero, esta variable conocer su capacidad financiera y la liquidez de los potenciales consumidores, lo que ayuda a predecir la demanda, un mayor nivel de ahorro facilita el proceso de compra de los vehículos, al tener el poder adquisición y acceso al crédito.

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("D:/STV/Stv/Apv/Caso Ejemplo/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):

TRM

# Convertir/declarar variable 1=ENER en serie de tiempo mensual
variable1_ts <- ts(data_col$TRM, start = c(2012, 1), frequency = 12)

ICC INDICE DE CONFIANZA DEL CONSUMIDOR

# Convertir/declarar variable en serie de tiempo mensual
variable2_ts <- ts(data_col$ICC, start = c(2012, 1), frequency = 12)

Ventas de vehiculos nuevos

# Convertir/declarar variable en serie de tiempo mensual
variable3_ts <- ts(na.omit(data_col$VEH), start = c(2014,1), frequency = 12)

Ventas de vehiculos nuevos en el valle

# Convertir/declarar variable en serie de tiempo mensual
variable4_ts <- ts(data_col$VEH_V, start = c(2012, 1), frequency = 12)

CART Cartera del sector bancario

# Convertir/declarar variable 1=ENER en serie de tiempo mensual
variable5_ts <- ts(data_col$CART, start = c(2012, 1), frequency = 12)

2. Extracción de señales

Gráfico inicial TRM -Original

library(ggplot2)
library(plotly)

# Convertir la serie temporal a un vector numérico para lograr graficar con ggplot2
data_col$variable1 <- as.numeric(variable1_ts)

# Crear el gráfico
grafico_serie <- ggplot(data_col, aes(x = seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = nrow(data_col)), 
                                      y = variable1)) +
  geom_line(color = "grey", linewidth = 0.4) +  # Cambiado 'size' por 'linewidth'
  geom_point(color = "black", size = 0.1) +
  ggtitle("TRM: Serie original") +
  xlab("Tiempo") +
  ylab("Pesos por dólar estadounidense") +
  theme_minimal()

ggplotly(grafico_serie)

La Serie Original Ha tenido un crecimiento sustancial, duplicando su valor en apenas una década. Hemos visto cómo ha llegado a probar niveles por encima de los \(5.000\) en momentos de mucha tensión, para luego buscar soportes más bajos. Para evidenciar con mayor claridad el comportamiento real de la variable dada la volatilidad realizamos la descomposición.

Extracción señales TRM

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

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

DescomposiciónTRM:

Tendencia: Lo que vemos es un cambio de piso definitivo. Pasamos de una TRM estable de \(3.000\) antes de 2019 a una realidad donde la tendencia se ha consolidado por encima de los $4.000. Es una pendiente alcista que ha redefinido los costos de toda la economía.

Estacionalidad: Existen presiones cambiarias que ocurren siempre en las mismas fechas, con rangos que van desde los -$40 hasta los $80 pesos. Es un ciclo recurrente que ayuda a predecir cuándo el dólar tiende a encarecerse por factores estacionales.

Residuo: Aquí se hacen evidentes los choques fuertes, especialmente en 2020 y entre 2022-2023, con desviaciones de más de $200 pesos que rompen cualquier previsión y responden puramente a la incertidumbre del momento.

Gráfico inicial del ICC -Original

library(ggplot2)
library(plotly)

# Convertir la serie temporal a un vector numérico para lograr graficar con ggplot2
data_col$variable2 <- as.numeric(variable2_ts)

# Crear el gráfico
grafico_serie <- ggplot(data_col, aes(x = seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = nrow(data_col)), 
                                      y = variable2)) +
  geom_line(color = "grey", linewidth = 0.4) +  # Cambiado 'size' por 'linewidth'
  geom_point(color = "black", size = 0.1) +
  ggtitle("ICC: Serie original") +
  xlab("Tiempo") +
  ylab("Indice") +
  theme_minimal()

ggplotly(grafico_serie)

Dado que la serie original del ICC suele presentar fluctuaciones muy bruscas mes a mes, es fundamental descomponerla para entender qué parte responde a un sentimiento real de largo plazo y qué es simple ruido momentáneo.

Extracción señales ICC

# 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 (son 4 componentes)
  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 = "Descomposición temporal del ICC",
       x = "Tiempo",
       y = "Valor")

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

Descomposición ICC :

Serie Original: Se mueve en un rango bastante amplio, oscilando entre los \(+30\) y \(-40\) puntos. Lo que más llama la atención es cómo los mínimos históricos de 2020 y 2021 marcaron un antes y un después, dejando la serie atrapada mayoritariamente en terreno negativo.

Tendencia: Aquí es donde se ve el cambio real. Desde 2015, el consumidor colombiano dejó atrás el optimismo y entró en una etapa de contracción estructural. Actualmente, la tendencia parece estancada entre los \(-10\) y \(-20\) puntos, sin señales claras de querer volver a niveles positivos.

Estacionalidad: El comportamiento cíclico es muy predecible, con variaciones de \(\pm 4\) unidades que se repiten con precisión casi matemática. El optimismo cada fin de año y el impacto rezagado de los primeros trimestres de año cuando toca responder por las obligaciones adquiridas en el auge de diciembre, reflejando los momentos del calendario donde las familias se sienten tradicionalmente más o menos seguras financieramente.

Residuo: En este apartado destacan los picos de volatilidad atípica entre 2020 y 2022. Son movimientos que no responden ni a la tendencia ni al ciclo anual, sino a eventos externos que sacudieron la confianza de forma imprevista.

Gráfico inicial Ventas de vehículos nuevos-Original

library(ggplot2)
library(plotly)

# 1. Filtramos data_col para que tenga las mismas 132 filas que variable3_ts
# Usamos tail para tomar los datos más recientes que coincidan con la serie
data_col_grafico <- tail(data_col, length(variable3_ts))

# 2. Asignamos la serie convertida a numérica a la columna variable3
data_col_grafico$variable3 <- as.numeric(variable3_ts)

# 3. Crear el gráfico con los nombres y unidades solicitados
grafico_serie <- ggplot(data_col_grafico, aes(x = seq.Date(from = as.Date("2014-01-01"), 
                                                          by = "month", 
                                                          length.out = nrow(data_col_grafico)), 
                                              y = variable3)) +
  geom_line(color = "grey", linewidth = 0.4) + 
  geom_point(color = "black", size = 0.1) +
  # Actualización de Títulos y Unidades
  ggtitle("Venta de Vehículos Nuevos: Serie original") +
  xlab("Tiempo") +
  ylab("Unidades vendidas") + 
  theme_minimal()

# Convertir a interactivo
ggplotly(grafico_serie)

El mercado automotriz está lleno de picos y valles. Por esa razon no miramos unicamente al serie original sino que Descomponemos las ventas. esto nos ayuda a ver si el sector realmente está creciendo o si solo está viviendo de momentos específicos del año.

Extracción señales Vehiculos Nuevos

# Cargar librerías necesarias
library(ggplot2)
library(plotly)

# 1. LIMPIEZA TOTAL: Convertimos a numérico y eliminamos posibles NA
# Esto asegura que stl() reciba datos puros
valores_limpios <- as.numeric(variable3_ts)
valores_limpios[is.na(valores_limpios)] <- mean(valores_limpios, na.rm = TRUE)

# 2. RECONSTRUCCIÓN: Forzamos la frecuencia mensual (12) desde 2014
# Sin esto, stl() siempre lanzará error
variable3_ts_clean <- ts(valores_limpios, start = c(2014, 1), frequency = 12)

# 3. DESCOMPOSICIÓN
# Usamos la serie limpia recién creada
stl_decomp_var3 <- stl(variable3_ts_clean, s.window = "periodic")

# 4. DATAFRAME PARA GRAFICAR
stl_df_var3 <- data.frame(
  Time = rep(as.numeric(time(variable3_ts_clean)), 4), 
  Value = c(as.numeric(stl_decomp_var3$time.series[, "seasonal"]),  
            as.numeric(stl_decomp_var3$time.series[, "trend"]),     
            as.numeric(stl_decomp_var3$time.series[, "remainder"]), 
            as.numeric(variable3_ts_clean)),
  Component = factor(rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), 
                         each = length(variable3_ts_clean)),
                     levels = c("Serie Original", "Tendencia", "Estacional", "Residuo"))
)

# 5. GRÁFICO
p <- ggplot(stl_df_var3, aes(x = Time, y = Value, color = Component)) +
  geom_line(show.legend = FALSE) + 
  facet_wrap(~Component, scales = "free_y", ncol = 1) + 
  theme_minimal() +
  labs(title = "Descomposición temporal: Venta de Vehículos Nuevos",
       x = "Año",
       y = "Unidades / Variación")

ggplotly(p)

Descomposición Ventas de Vehículos Nuevos (Nacional):

Serie Original: Es una montaña rusa. Hemos visto meses de 40.000 unidades y otros donde el registro fue casi nulo. En los últimos meses de 2024, la serie parece haber encontrado un equilibrio cerca de las 22.000 unidades.

Tendencia: El mercado ha perdido gran parte de su dinamismo mostrado en su pico registrado en 2016, la actividad comenzó a declinar y hoy se estabiliza en torno a las 20.000 unidades mensuales. Es una cifra que evidencia, con claridad, cuánto se ha reducido la capacidad de absorción del sector en comparación con la de hace ocho años.

Estacionalidad: Los finales de año son determinantes, con saltos de hasta \(5.000\) unidades por encima del promedio, lo que demuestra que el sector depende críticamente de lo que suceda en el último trimestre.

Residuo: El dato más fuerte aquí es la caída de 2022, donde el residuo negativo fue de 10.000 unidades. Es la prueba de que un choque externo puede frenar en seco la inercia de ventas, sin importar qué tan buena sea la temporada.

Gráfico inicial de las Ventas de vehiculos nuevos en el valle -Original

library(ggplot2)
library(plotly)

# Convertir la serie temporal a un vector numérico para lograr graficar con ggplot2
data_col$variable4 <- as.numeric(variable4_ts)

# Crear el gráfico
grafico_serie <- ggplot(data_col, aes(x = seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = nrow(data_col)), 
                                      y = variable4)) +
  geom_line(color = "grey", linewidth = 0.4) +  # Cambiado 'size' por 'linewidth'
  geom_point(color = "black", size = 0.1) +
  ggtitle("Ventas de vehículos nuevos del Valle: Serie original") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  theme_minimal()

ggplotly(grafico_serie)

A nivel regional, el Valle suele seguir la corriente nacional, pero con matices propios que solo se ven cuando limpiamos la serie de ruidos locales.

Extracción señales Venta de vehiculos nuevos en el valle

# Cargar librerías necesarias
library(ggplot2)
library(plotly)

# Descomposición de la serie temporal
stl_decomp_var4 <- stl(variable4_ts, s.window = "periodic")

# Convertir la descomposición a un data frame para graficar con ggplot2
stl_df_var4 <- data.frame(
  Time = rep(time(variable4_ts), 4),  # Tiempo repetido para cada componente (son 4 componentes)
  Value = c(stl_decomp_var4$time.series[, "seasonal"], 
            stl_decomp_var4$time.series[, "trend"], 
            stl_decomp_var4$time.series[, "remainder"], 
            variable4_ts),
  Component = rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), each = length(variable4_ts))
)

# Crear gráfico con ggplot2
p <- ggplot(stl_df_var4, aes(x = Time, y = Value, color = Component)) +
  geom_line() +
  facet_wrap(~Component, scales = "free_y", ncol = 1) + 
  theme_minimal() +
  labs(title = "Descomposición temporal de Ventas de vehículos nuevos del Valle",
       x = "Tiempo",
       y = "Valor")

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

Descomposición Ventas de Vehículos Nuevos (Valle del cauca):

Serie Original: El rango de movimiento en el departamento suele estar entre las 1.000 y 3.500 unidades. Visualmente camina de la mano con el total nacional, aunque con pequeñas variaciones que son propias de la dinámica regional.

Tendencia: Se nota un agotamiento. La tendencia en el Valle no ha logrado recuperar el nivel de las 2.500 unidades que tenía antes de la pandemia y, de hecho, muestra una ligera inclinación hacia abajo al cerrar 2024, situándose cerca de las 1.500 unidades.

Estacionalidad: Los ciclos son constantes, con variaciones de unos \(\pm 250\) vehículos. Esto confirma que el comprador en el Valle responde exactamente a los mismos estímulos de fin de año que el resto del país.

Residuo: Al igual que en el nacional, los residuos negativos de 2020 y 2022 fueron marcados, llegando a caídas de 1.000 unidades que se explican por situaciones coyunturales que afectaron la logística y el comercio local.

library(ggplot2)
library(plotly)

# Convertir la serie temporal a un vector numérico para lograr graficar con ggplot2
data_col$variable5 <- as.numeric(variable5_ts)

# Crear el gráfico
grafico_serie <- ggplot(data_col, aes(x = seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = nrow(data_col)), 
                                      y = variable5)) +
  geom_line(color = "grey", linewidth = 0.4) +  # Cambiado 'size' por 'linewidth'
  geom_point(color = "black", size = 0.1) +
  ggtitle("Cartera del Sector Bancario: Serie original") +
  xlab("Tiempo") +
  ylab("Pesos") +
  theme_minimal()

ggplotly(grafico_serie)

Al ser una variable que acumula saldos, la cartera puede parecer siempre al alza. Por eso, descomponerla es vital para notar el comportamiento real

Extracción señales Venta de Cartera del sector bancario

# Cargar librerías necesarias
library(ggplot2)
library(plotly)

# Descomposición de la serie temporal
stl_decomp_var5 <- stl(variable5_ts, s.window = "periodic")

# Convertir la descomposición a un data frame para graficar con ggplot2
stl_df_var5 <- data.frame(
  Time = rep(time(variable5_ts), 4),  # Tiempo repetido para cada componente (son 4 componentes)
  Value = c(stl_decomp_var5$time.series[, "seasonal"], 
            stl_decomp_var5$time.series[, "trend"], 
            stl_decomp_var5$time.series[, "remainder"], 
            variable5_ts),
  Component = rep(c("Estacional", "Tendencia", "Residuo", "Serie Original"), each = length(variable4_ts))
)

# Crear gráfico con ggplot2
p <- ggplot(stl_df_var5, aes(x = Time, y = Value, color = Component)) +
  geom_line() +
  facet_wrap(~Component, scales = "free_y", ncol = 1) + 
  theme_minimal() +
  labs(title = "Descomposición temporal de la Cartera del sector bancario",
       x = "Tiempo",
       y = "Valor")

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

Descomposición Cartera del Sector Bancario:

Serie Original: Tuvo una subida constante hasta 2022, llegando un poco más de 5 billones de pesos. Sin embargo, lo más reciente muestra que ese volumen se ha estancado e incluso ha empezado a bajar ligeramente.

Tendencia:Tuvo una subida constante hasta 2022, llegando un poco más de 5 billones de pesos. Sin embargo, lo más reciente muestra que ese volumen se ha estancado e incluso ha empezado a bajar ligeramente.

Estacionalidad: Aunque no parezca, el crédito también tiene temporadas. Hay movimientos cíclicos de hasta 4 billones de pesos, esto se presenta en el ultimo trimestre del año, lo cualnos dice en qué en estos meses se concentran los desembolsos y es cuándo hay más recaudo de cartera.

Residuo: La volatilidad aquí es menor que en las ventas de carros, pero los ruidos han crecido en los últimos años. Esto sugiere que el sistema bancario ha tenido que lidiar con más imprevistos relacionados con las tasas y el comportamiento de pago de los clientes.

Extracción de las variables ajustada por estacionalidad

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"]

Se crea la variable4 ajustada por estacionalidad

# Extraer los componentes de la descomposición
variable4_sa <- variable4_ts - stl_decomp_var4$time.series[, "seasonal"]

Se crea la variable5 ajustada por estacionalidad

# Extraer los componentes de la descomposición
variable5_sa <- variable5_ts - stl_decomp_var5$time.series[, "seasonal"]

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("TRM:Serie Original vs Ajustada") +
  xlab("Tiempo") +
  ylab("Pesos por dolar estadunidense") +
  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)

Gráfico serie original VS ajustada Variable 2

# 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("ICC:Serie Original vs Ajustada") +
  xlab("Tiempo") +
  ylab("Índice") +
  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)

Gráfico serie original VS ajustada Variable 3

# 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("Ventas de vehículos nuevos:Serie Original vs Ajustada") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  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)
# Crear vector de fechas correctamente alineado con la serie
fechas_var4 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable4_ts))

# Gráfico mejorado con fechas en el eje X
grafico_ajustada_var4 <- ggplot() +
  geom_line(aes(x = fechas_var4, y = variable4_ts), color = "grey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var4, y = variable4_sa), color = "black", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Ventas de vehículos nuevos en el Valle:Serie Original vs Ajustada") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  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_var4)
# Crear vector de fechas correctamente alineado con la serie
fechas_var5 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable5_ts))

# Gráfico mejorado con fechas en el eje X
grafico_ajustada_var5 <- ggplot() +
  geom_line(aes(x = fechas_var5, y = variable5_ts), color = "grey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var5, y = variable5_sa), color = "black", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Ventas de vehículos nuevos:Serie Original vs Ajustada") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  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_var5)
library(ggplot2)
library(plotly)

variable1_vec <- as.numeric(variable1_ts)
tendencia_var1 <- as.numeric(stl_decomp_var1$time.series[, "trend"])
fechas1 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable1_ts))

grafico_tendencia_var1 <- ggplot() +
  geom_line(aes(x = fechas1, y = variable1_vec, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas1, y = tendencia_var1, color = "Tendencia"), linewidth = 0.9) +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "#7030A0")) +
  ggtitle("Tasa de Cambio (TRM): Serie Original vs Tendencia", subtitle = "Fuente: DANE") +
  xlab("Tiempo") +
  ylab("Pesos por dólar") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(grafico_tendencia_var1)
variable2_vec <- as.numeric(variable2_ts)
tendencia_var2 <- as.numeric(stl_decomp_var2$time.series[, "trend"])
fechas2 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable2_ts))

grafico_tendencia_var2 <- ggplot() +
  geom_line(aes(x = fechas2, y = variable2_vec, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas2, y = tendencia_var2, color = "Tendencia"), linewidth = 0.9) +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "#7030A0")) +
  ggtitle("Índice de Confianza del Consumidor (ICC)", subtitle = "Fuente: FEDESARROLLO-ANDI") +
  xlab("Tiempo") +
  ylab("Índice") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(grafico_tendencia_var2)
variable3_vec <- as.numeric(variable3_ts)
tendencia_var3 <- as.numeric(stl_decomp_var3$time.series[, "trend"])
# Ajustado a 2014 según tu requerimiento previo
fechas3 <- seq.Date(from = as.Date("2014-01-01"), by = "month", length.out = length(variable3_ts))

grafico_tendencia_var3 <- ggplot() +
  geom_line(aes(x = fechas3, y = variable3_vec, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas3, y = tendencia_var3, color = "Tendencia"), linewidth = 0.9) +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "#7030A0")) +
  ggtitle("Ventas de Vehículos Nuevos (Nacional)", subtitle = "Fuente: FENALCO") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(grafico_tendencia_var3)
variable4_vec <- as.numeric(variable4_ts)
tendencia_var4 <- as.numeric(stl_decomp_var4$time.series[, "trend"])
fechas4 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable4_ts))

grafico_tendencia_var4 <- ggplot() +
  geom_line(aes(x = fechas4, y = variable4_vec, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas4, y = tendencia_var4, color = "Tendencia"), linewidth = 0.9) +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "#7030A0")) +
  ggtitle("Ventas de Vehículos Nuevos (Valle del Cauca)", subtitle = "Fuente: FENALCO") +
  xlab("Tiempo") +
  ylab("Número de vehículos") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(grafico_tendencia_var4)
variable5_vec <- as.numeric(variable5_ts)
tendencia_var5 <- as.numeric(stl_decomp_var5$time.series[, "trend"])
fechas5 <- seq.Date(from = as.Date("2012-01-01"), by = "month", length.out = length(variable5_ts))

grafico_tendencia_var5 <- ggplot() +
  geom_line(aes(x = fechas5, y = variable5_vec, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas5, y = tendencia_var5, color = "Tendencia"), linewidth = 0.9) +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "#7030A0")) +
  ggtitle("Cartera del Sector Bancario", subtitle = "Fuente: SUPERFINANCIERA") +
  xlab("Tiempo") +
  ylab("Pesos ($)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(grafico_tendencia_var5)

Tasa de crecimiento de la serie original vs tendencia:

# Cálculo de la tasa de crecimiento anual - Variable 1
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

# Vector de fechas (Enero 2013)
fechas_corregidas_var1 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var1))

# Gráfico Variable 1
grafico_crecimiento_var1 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var1, y = tasa_crecimiento_var1, color = "Serie Original"), size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var1, y = tasa_tendencia_var1, color = "Tendencia"), size = 0.8, linetype = "dashed") +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  ggtitle("TRM (DANE): Tasa de crecimiento anual %") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

ggplotly(grafico_crecimiento_var1)

Señales Convergentes y Fiabilidad: En el tramo final de 2024, la serie original y la tendencia muestran una dirección ascendente sincronizada, lo que otorga una alta fiabilidad a la señal de presión devaluacionista actual. Esta convergencia sugiere que el peso colombiano está enfrentando una pérdida de valor estructural frente al dólar hacia el cierre del periodo.

Puntos de Inflexión y Cambios de Régimen:

2015: Se identifica un punto de inflexión crítico donde la TRM rompió el soporte histórico de los \(\$2.000\). Este salto se explica por el desplome de los precios internacionales del petróleo, que redujo drásticamente el ingreso de divisas al país.

2022-2023: La tendencia alcanzó un máximo histórico cercano a los $5.000. Este régimen de alta volatilidad estuvo impulsado por la incertidumbre política interna tras las elecciones presidenciales y el endurecimiento de la política monetaria en Estados Unidos (alza de tasas de la FED).

Ruido y Eventos Atípicos: El componente de residuo revela choques que rompen el comportamiento usual, especialmente en 2020 (inicio de la crisis global por pandemia) y durante la volatilidad política de 2022. Estas desviaciones, que superan los $200 pesos, representan momentos donde factores no sistémicos dominaron la formación del precio.

Serie Original vs. Ajustada: Dada la volatilidad residual observada en las gráficas, se recomienda trabajar con la serie ajustada (tendencia) para el análisis de costos a largo plazo. La serie original, aunque útil para el flujo de caja inmediato, está “contaminada” por ruidos especulativos que no reflejan necesariamente la salud real del tipo de cambio.

# 1. Cálculo de la diferencia anual en PUNTOS (no porcentual)
# Esto evita las divisiones por valores cercanos a cero
diff_anual_var2 <- diff(variable2_ts, lag = 12)

# Extraer la tendencia de la descomposición previa (stl_decomp_var2)
# Usamos los mismos periodos para que coincidan
tendencia_var2 <- stl_decomp_var2$time.series[, "trend"]
diff_tendencia_var2 <- diff(tendencia_var2, lag = 12)

# 2. Ajustar fechas (empezando 12 meses después del inicio de la serie)
fechas_grafico <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(diff_anual_var2))

# 3. Crear el DataFrame para ggplot
df_crecimiento <- data.frame(
  Fecha = fechas_grafico,
  Variacion = as.numeric(diff_anual_var2),
  Tendencia = as.numeric(diff_tendencia_var2)
)

# 4. Gráfico mejorado
grafico_util <- ggplot(df_crecimiento, aes(x = Fecha)) +
  # Área sombreada para identificar periodos de caída (opcional pero muy visual)
  geom_area(aes(y = Variacion), fill = "lightblue", alpha = 0.3) +
  geom_line(aes(y = Variacion, color = "Variación Anual (Puntos)"), linewidth = 0.7) +
  geom_line(aes(y = Tendencia, color = "Tendencia de Variación"), linewidth = 0.9, linetype = "dashed") +
  # Línea de referencia en cero
  geom_hline(yintercept = 0, linetype = "solid", color = "red", alpha = 0.5) +
  scale_color_manual(values = c("Variación Anual (Puntos)" = "darkgrey", "Tendencia de Variación" = "black")) +
  labs(
    title = "ICC: Variación Anual en Puntos del Índice",
    subtitle = "Diferencia respecto al mismo mes del año anterior",
    x = "Tiempo",
    y = "Diferencia en Puntos",
    color = "Referencia"
  ) +
  theme_minimal()

ggplotly(grafico_util)

Aclaración metodo de calculo: Usamos la diferencia en puntos porque el ICC cruza por cero y tiene valores negativos. Matemáticamente, calcular una tasa de crecimiento (división) cuando la base es cercana a cero genera resultados infinitos o escalas distorsionadas que arruinan la gráfica. La diferencia absoluta permite medir el cambio real en el sentimiento del consumidor sin errores de magnitud.

Puntos de Inflexión y Cambio de Régimen: La serie muestra un quiebre estructural definitivo en 2015. Antes de este año, la tendencia se mantenía en terreno optimista (por encima de los +20 puntos), pero tras una caída abrupta, el índice entró en un régimen de pesimismo persistente del cual no ha logrado salir en una década.

Señales Divergentes (Baja Fiabilidad Actual): Al cierre del periodo, se observa una divergencia preocupante: mientras la serie original muestra pequeños repuntes estacionales, la tendencia continúa anclada en terreno negativo, cerca de los \(-10\) puntos. En este escenario, priorizamos la señal de la tendencia, la cual sugiere que la recuperación de la confianza aún no tiene bases sólidas de largo plazo.

Ruido y Choques Atípicos: El componente residual identifica niveles de ruido extremos en 2020 y 2021. Estas desviaciones (picos de hasta \(+20\) y caídas de \(-20\) en el residuo) reflejan la alta sensibilidad de la confianza a noticias sobre la pandemia y la posterior reactivación, rompiendo cualquier patrón usual de comportamiento.*

Estacionalidad: *Se confirma un ciclo sumamente rígido con impactos positivos recurrentes hacia el cierre de cada año. Este patrón estacional explica por qué, incluso en años de crisis, hay un repunte de ánimo en diciembre que el sector automotriz aprovecha para sus metas de ventas.

Serie Original vs. Ajustada: Debido a la enorme volatilidad y el ruido presente en la serie original (que llega a tocar mínimos de \(-40\) puntos), es imperativo trabajar con la serie ajustada (tendencia) para el análisis estratégico. La original suele sobrerreaccionar a eventos de corto plazo, lo que podría llevar a conclusiones erróneas sobre la salud real del consumo.

library(ggplot2)
library(plotly)
# Cálculo de la tasa de crecimiento anual - Variable 3 (Inicia en 2014, tasa inicia en 2015)
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

fechas_corregidas_var3 <- seq(from = as.Date("2015-01-01"), by = "month", length.out = length(tasa_crecimiento_var3))

# Gráfico Variable 3
grafico_crecimiento_var3 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var3, y = tasa_crecimiento_var3, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas_corregidas_var3, y = tasa_tendencia_var3, color = "Tendencia"), linewidth = 0.8, linetype = "dashed") +
  scale_color_manual(values = c("Serie Original" = "grey50", "Tendencia" = "black")) +
  coord_cartesian(ylim = c(-100, 150)) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  ggtitle("Venta Vehículos a nivel Nacional: Tasa de crecimiento anual %") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

ggplotly(grafico_crecimiento_var3)

Señales Convergentes y Fiabilidad: Al cierre de 2024, tanto la serie original como la tendencia de la tasa de crecimiento muestran una pendiente positiva, lo que otorga alta fiabilidad a la señal de recuperación del sector. Tras tocar fondo en 2023, el mercado ha entrado en una fase de expansión moderada, validando el retorno progresivo de los compradores a los concesionarios.

Puntos de Inflexión y Ciclos:

2016 (Auge): Se observa un punto de inflexión donde la tendencia alcanzó su máximo histórico por encima de las 27.500 unidades mensuales. Este pico estuvo impulsado por condiciones de crédito favorables y la renovación del parque automotor antes de cambios tributarios.

2022 (El Gran Choque): La serie experimentó una caída vertical sin precedentes. Este quiebre se explica por la crisis global de suministros (escasez de microchips) y el encarecimiento drástico de los vehículos debido a la TRM y las tasas de interés.

Estacionalidad: Identificamos un patrón sumamente marcado donde los meses de noviembre y diciembre generan impactos positivos de hasta +5.000 unidades sobre el promedio. En contraste, los primeros meses del año actúan como valles recurrentes, una dinámica que se ha mantenido rígida incluso en los años de post-pandemia.

Serie Original vs. Ajustada: Dado que la serie original presenta picos tan pronunciados por ferias y promociones de fin de año, trabajamos con la serie ajustada (tendencia) para entender la verdadera salud del mercado. La original suele inflar la percepción de éxito en diciembre, ocultando si el mercado estructuralmente está perdiendo o ganando fuerza.

# Cálculo de la tasa de crecimiento anual - Variable 3 (Inicia en 2014, tasa inicia en 2015)
tasa_crecimiento_var4 <- (variable4_ts[13:length(variable4_ts)] / variable4_ts[1:(length(variable4_ts) - 12)] - 1) * 100
tasa_tendencia_var4 <- (tendencia_var4[13:length(tendencia_var4)] / tendencia_var4[1:(length(tendencia_var4) - 12)] - 1) * 100
fechas_corregidas_var4 <- seq(from = as.Date("2015-01-01"), by = "month", length.out = length(tasa_crecimiento_var4))

# Gráfico Variable 4 - Con escala controlada
grafico_crecimiento_var4 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var4, y = tasa_crecimiento_var4, color = "Serie Original"), linewidth = 0.7) +
  geom_line(aes(x = fechas_corregidas_var4, y = tasa_tendencia_var4, color = "Tendencia"), linewidth = 0.8, linetype = "dashed") +
  # Línea en 0 para referencia
  geom_hline(yintercept = 0, color = "red", alpha = 0.3) +
  # LIMITAR EL EJE Y: Ajusta los valores según tus datos (ej. -100% a 200%)
  coord_cartesian(ylim = c(-100, 200)) + 
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  labs(
    title = "Venta de Vehículos en el Valle: Tasa de crecimiento anual %",
    subtitle = "Escala ajustada para omitir valores atípicos de 2021",
    x = "Tiempo",
    y = "% de Crecimiento Anual"
  ) +
  theme_minimal()

ggplotly(grafico_crecimiento_var4)
# Cálculo de la tasa de crecimiento anual - Variable 5
tasa_crecimiento_var5 <- (variable5_ts[13:length(variable5_ts)] / variable5_ts[1:(length(variable5_ts) - 12)] - 1) * 100
tasa_tendencia_var5 <- (tendencia_var5[13:length(tendencia_var5)] / tendencia_var5[1:(length(tendencia_var5) - 12)] - 1) * 100

fechas_corregidas_var5 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var5))

# Gráfico Variable 5
grafico_crecimiento_var5 <- ggplot() +
  geom_line(aes(x = fechas_corregidas_var5, y = tasa_crecimiento_var5, color = "Serie Original"), size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var5, y = tasa_tendencia_var5, color = "Tendencia"), size = 0.8, linetype = "dashed") +
  scale_color_manual(values = c("Serie Original" = "grey", "Tendencia" = "black")) +
  ggtitle("Cartera Bancaria: Tasa de crecimiento anual %") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

ggplotly(grafico_crecimiento_var5)

Señales Divergentes (Cautela en la Proyección): En el cierre del periodo, se observa una clara divergencia: la serie original marca un repunte final, pero la tendencia se lateraliza. Siguiendo el protocolo, tomamos la señal de la tendencia, lo que indica que el mercado en el Valle ha alcanzado un techo en su velocidad de recuperación y el crecimiento estructural está perdiendo el impulso acelerado que traía.

Puntos de Inflexión y Estabilización: Tras superar el desplome crítico de 2022 (donde la tasa rozó el -100%), la serie experimentó un rebote agresivo. Sin embargo, la actual forma lateral de la tendencia sugiere un nuevo punto de inflexión hacia la estabilidad, el mercado está dejando de “recuperarse” para entrar en una fase de crecimiento maduro y constante.

La serie ha pasado de una volatilidad extrema a una zona de normalización. El hecho de que la tendencia logre mantenerse por encima de la línea de cero es una señal positiva de supervivencia del sector, aunque la lateralización actual nos advierte que el margen para nuevas aceleraciones es limitado si no cambian variables externas como las tasas de interés o el ICC.

Recomendaciones estratégicas: