Introducción

En un entorno económico altamente dinámico, las empresas deben contar con herramientas analíticas que les permitan anticiparse a los cambios del entorno y tomar decisiones estratégicas basadas en datos. En este contexto, el presente caso se desarrolla bajo el rol de analistas económicos y financieros de una empresa perteneciente al sector externo de la economía colombiana. El objetivo principal es evaluar la evolución del sector a través del análisis de series temporales, con el fin de extraer señales clave y generar pronósticos que orienten la toma de decisiones empresariales. La empresa seleccionada para este análisis es Baxter, una compañía con participación activa en el comercio internacional de productos farmacéuticos. Para entender mejor el entorno en el que opera, se eligieron tres variables económicas mensuales entre 2013 y 2024: las exportaciones totales de Colombia, la tasa representativa del mercado (TRM) y las exportaciones de productos farmacéuticos. Estas variables permiten analizar la dinámica del sector externo, la influencia del tipo de cambio en las operaciones y el comportamiento específico del subsegmento farmacéutico. A partir de la descomposición de las series temporales y la aplicación del modelo SARIMA, se busca identificar patrones relevantes, proyectar tendencias de corto plazo y generar recomendaciones estratégicas para mejorar el desempeño de Baxter en este entorno económico cambiante.

library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
data_col <- read_excel("d:/Users/juans/Escritorio/fotos eco/data_col.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"))
View(data_col)

PASO INDISPENSABLE: Declarar la (s) variable (s) como serie (s) temporal (es):

Variable 1

# Convertir/declarar variable 1=ENER en serie de tiempo mensual
variable1_ts <- ts(data_col$X, start = c(2012, 1), frequency = 12)
variable1_ts
##          Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep
## 2012 4785773 4999318 5712355 5010929 5403375 4563431 4976905 4570780 4910403
## 2013 4849196 4667767 4617842 4949487 5332470 4870839 4652297 4977706 4849996
## 2014 4808832 4271442 4408181 4316676 5495867 4704814 5048930 4813091 5077247
## 2015 2916976 3160957 3461944 3219706 3381084 3217408 3043778 2868451 2898168
## 2016 1919053 2328723 2334998 2463793 2751470 2780512 2266997 3044377 2797686
## 2017 2785044 2716024 3300421 2697992 3505436 2895612 3125483 3191598 3389679
## 2018 3324889 3027603 3365116 3786537 3719410 3331933 3632055 3684399 3512842
## 2019 3066110 3183071 3344850 3862819 3748342 3096363 3255830 3264261 3067349
## 2020 3419466 2943626 2439036 1864239 2221172 2289482 2551988 2584767 2544874
## 2021 2610936 2938994 3383554 2976372 3096913 3182216 3444158 3465143 3792236
## 2022 3801609 4209198 4780210 5460531 4662521 5497617 5913682 4388737 4778520
## 2023 3733193 4238694 4465372 3739214 4497862 4021419 4167242 3943895 4167719
## 2024 3621124 3811057 3866389 4408818 4450913 3821641 4618276 3844992 4130843
##          Oct     Nov     Dec
## 2012 5432930 4807338 4951628
## 2013 4837983 4948665 5272122
## 2014 4322278 3794686 3794711
## 2015 2815522 2444535 2588994
## 2016 2770014 2833622 3477094
## 2017 3277516 3122237 4014818
## 2018 3768666 3343509 3407819
## 2019 3326497 2943625 3330051
## 2020 2644954 2523372 3028837
## 2021 3799111 4155805 4544551
## 2022 4213182 4562248 4642084
## 2023 4152149 4194634 4447733
## 2024 4311785 4121146 4472387

Variable 2

# Convertir/declarar el ISE en serie de tiempo  mensual
variable2_ts <- ts(data_col$TRM, start = c(2012, 1), frequency = 12)
variable2_ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2012 1847.516 1786.543 1767.793 1773.893 1795.907 1788.877 1784.903 1807.772
## 2013 1770.024 1794.198 1813.454 1830.091 1853.722 1910.188 1900.163 1904.411
## 2014 1964.111 2042.631 2017.022 1936.680 1915.203 1887.066 1858.366 1899.140
## 2015 2400.168 2422.994 2593.465 2492.766 2444.315 2561.667 2743.140 3027.064
## 2016 3287.158 3356.246 3124.169 2992.575 3002.174 2985.018 2971.474 2956.525
## 2017 2941.918 2880.985 2941.717 2876.237 2920.387 2966.522 3034.359 2971.017
## 2018 2866.496 2860.524 2842.387 2765.226 2863.577 2893.081 2885.532 2965.266
## 2019 3160.838 3112.360 3131.566 3158.608 3311.943 3250.837 3212.277 3419.289
## 2020 3321.721 3415.273 3908.308 3973.602 3853.472 3701.386 3659.323 3788.981
## 2021 3494.952 3551.997 3618.259 3654.614 3737.572 3687.401 3835.867 3882.250
## 2022 4002.746 3934.644 3799.549 3800.747 4015.570 3950.261 4389.145 4324.015
## 2023 4715.023 4822.552 4759.074 4530.264 4536.510 4205.262 4054.683 4077.895
## 2024 3922.445 3931.981 3899.277 3871.303 3867.880 4059.680 4038.110 4068.280
##           Sep      Oct      Nov      Dec
## 2012 1802.369 1805.740 1819.583 1791.352
## 2013 1917.924 1884.893 1923.471 1933.276
## 2014 1976.424 2048.908 2133.388 2351.757
## 2015 3074.955 2923.116 3007.221 3243.241
## 2016 2919.149 2938.747 3109.397 3003.960
## 2017 2917.878 2960.133 3014.114 2990.191
## 2018 3033.467 3092.217 3198.373 3216.620
## 2019 3403.978 3431.769 3412.555 3366.764
## 2020 3756.742 3832.831 3674.118 3461.582
## 2021 3823.625 3768.999 3906.607 3969.679
## 2022 4445.920 4726.851 4920.763 4793.103
## 2023 4007.122 4227.934 4035.887 3948.097
## 2024 4193.890 4266.350 4412.060 4386.390

Variable 3

# Convertir/declarar las exportaciones de combustibles en serie de tiempo mensual
variable3_ts <- ts(data_col$X_FARM, start = c(2012, 1), frequency = 12)
variable3_ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2012 30866.08 31201.81 35073.98 31236.37 47114.54 40872.38 37928.60 44090.24
## 2013 32982.42 33047.83 36742.37 45570.57 50076.22 37647.50 42939.04 35874.27
## 2014 27577.40 33093.68 35979.74 38725.26 36207.35 42135.52 53066.43 52943.66
## 2015 40647.48 37439.11 44846.02 46380.14 39037.91 41750.36 43346.04 40079.76
## 2016 31501.10 45613.97 30214.52 32193.38 47148.73 40418.88 31883.61 42675.52
## 2017 37974.57 24146.87 29157.52 24988.92 32522.89 28054.94 25003.15 30553.69
## 2018 24332.31 33228.06 26394.72 31633.08 28689.26 25855.53 28236.30 30363.93
## 2019 35485.77 26388.01 24547.20 29922.18 29126.22 28548.19 32801.24 33409.54
## 2020 29049.36 23261.16 25861.58 29251.21 29397.88 32996.85 32300.99 33823.50
## 2021 22737.49 32804.09 30552.39 31165.81 21591.93 30083.50 37372.74 38892.07
## 2022 24802.28 30476.69 36427.95 31097.24 33951.30 35407.70 36742.86 40209.63
## 2023 21225.33 32798.15 43848.19 34651.26 39220.18 37164.14 37777.37 36308.79
## 2024 27035.48 32147.70 31530.17 32096.56 31396.61 30654.33 37280.95 31479.79
##           Sep      Oct      Nov      Dec
## 2012 35031.76 39094.29 44623.81 44313.99
## 2013 39475.39 50484.93 47136.55 45283.53
## 2014 48469.44 57627.01 51326.48 47064.84
## 2015 46257.74 35898.94 44420.09 43862.54
## 2016 31674.94 33541.09 28530.40 31548.08
## 2017 30616.47 34201.09 27140.10 27370.49
## 2018 31473.70 30669.10 34125.29 25628.15
## 2019 28696.09 32135.25 27088.89 31565.08
## 2020 33616.14 32437.10 27072.15 32438.04
## 2021 37749.63 30234.40 33545.74 44899.67
## 2022 32493.53 33110.03 37845.26 33805.70
## 2023 38338.46 40430.77 31725.26 41053.85
## 2024 35679.90 32718.02 31849.44 42099.30

Extracción de señales

Gráfico inicial de la variable 1 en niveles -Original

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
# 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 = "lightblue", linewidth = 0.4) +  # Cambiado 'size' por 'linewidth'
  geom_point(color = "black", size = 0.1) +
  ggtitle("Variable 1: Serie original") +
  xlab("Tiempo") +
  ylab("Unidad Variable 1") +
  theme_minimal()

ggplotly(grafico_serie)

Extracción señales variable 1

# 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 variable 1",
       x = "Tiempo",
       y = "Valor")

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

Variable 1: Exportaciones Totales Colombianas (en miles de USD)

Las exportaciones totales de Colombia muestran un patrón altamente volátil a lo largo del período analizado, con cambios estructurales significativos entre 2013 y 2025. Observamos una caída pronunciada alrededor de 2015, probablemente vinculada a la crisis de los precios de commodities que afectó severamente a la economía colombiana, país altamente dependiente de las exportaciones de petróleo y minerales. Este descenso marcó el inicio de un período de valores más bajos que se extendió hasta 2020, cuando se registró otra caída notable atribuible a la pandemia de COVID-19, que interrumpió las cadenas globales de suministro y redujo la demanda internacional. Lo destacable es la fuerte recuperación que se observa a partir de 2021, cuando las exportaciones comenzaron a repuntar hasta alcanzar nuevamente niveles similares a los registrados antes de 2015. En esta serie, se identifican meses donde las exportaciones tienden a subir o bajar de manera predecible, hay fluctuaciones estacionales, pero lo más relevante sigue siendo la tendencia estructural. El componente tendencial muestra ese valle profundo alrededor de 2020 antes de iniciar su recuperación, mientras que el componente residual (irregular) evidencia algunos choques impredecibles en el mercado que no siguen patrones regulares. La serie ajustada por estacionalidad permite apreciar que las exportaciones colombianas siguen patrones estacionales recurrentes y predecibles a lo largo del año. La diferencia entre ambas líneas representa precisamente este componente estacional, que puede estar relacionado con ciclos agrícolas, períodos de demanda internacional, o dinámicas propias de los sectores exportadores colombianos. Para Baxter (la empresa esocgida), estas tendencias en las exportaciones totales indican que opera en un sector externo volátil sujeto a cambios estructurales significativos. La caída de 2015 refleja un entorno económico desafiante para todos los sectores exportadores, mientras que la disminución de 2020 representa los desafíos específicos de la pandemia. La recuperación posterior a 2020 sugiere condiciones de exportación mejoradas que beneficiarían las operaciones de Baxter orientadas a mercados internacionales. Como empresa del sector farmacéutico con componente exportador, Baxter debe estar atenta a estas fluctuaciones generales de la economía, aunque su sector específico puede comportarse de manera diferente a las exportaciones totales del país.

Extracción señales variable 2

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

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

Variable 2: TRM (Tasa Representativa del Mercado, Peso Colombiano/USD) La serie temporal de la TRM muestra una tendencia claramente alcista desde 2013 hasta 2025, reflejando una depreciación persistente del peso colombiano frente al dólar estadounidense. Se observan fases de depreciación acelerada alrededor de 2015 y 2020, coincidiendo con períodos de crisis económica tanto interna como internacional. La serie alcanza su punto máximo alrededor de 2022, seguido por cierta estabilización en los años posteriores, aunque manteniendo valores históricamente altos. Los patrones estacionales tienen una influencia limitada en comparacion con la tendencia general, que domina el comportamiento de la serie. Resulta interesante notar el estrecho alineamiento entre la serie original y la serie ajustada por estacionalidad, lo que confirma que las fluctuaciones del tipo de cambio responden principalmente a factores estructurales y coyunturales de largo plazo, mas que a patrones estacionales predecibles.

Extracción señales variable 3

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

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

Después de la descomposición temporal de cada variable, se extrae la variable ajustada por estacionalidad para graficarla junto con la serie original:

Se crea la variable1 ajustada por estacionalidad

# Extraer los componentes de la descomposición
variable1_sa <- variable1_ts - stl_decomp_var1$time.series[, "seasonal"]

Se crea la variable2 ajustada por estacionalidad

# Extraer los componentes de la descomposición
variable2_sa <- variable2_ts - stl_decomp_var2$time.series[, "seasonal"]

Se crea la variable3 ajustada por estacionalidad

# Extraer los componentes de la descomposición
variable3_sa <- variable3_ts - stl_decomp_var3$time.series[, "seasonal"]

Ahora si se puede graficar las series originales versus la ajustada por estacionalidad

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 = "pink", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var1, y = variable1_sa), color = "darkblue", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Variable 1:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("Unidad de medida variable 1") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in geom_line(aes(x = fechas_var1, y = variable1_ts), color = "pink", :
## Ignoring unknown parameters: `name`
## Warning in geom_line(aes(x = fechas_var1, y = variable1_sa), color =
## "darkblue", : Ignoring unknown parameters: `name`
# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var1)
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

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 = "black", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var2, y = variable2_sa), color = "red", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Variable 2:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("Unidad de medida variable 2") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización
## Warning in geom_line(aes(x = fechas_var2, y = variable2_ts), color = "black", :
## Ignoring unknown parameters: `name`
## Warning in geom_line(aes(x = fechas_var2, y = variable2_sa), color = "red", :
## Ignoring unknown parameters: `name`
# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var2)
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

Variable 2: TRM (Tasa Representativa del Mercado, Peso Colombiano/USD)

La serie temporal de la TRM muestra una tendencia claramente alcista desde 2013 hasta 2025, reflejando una depreciación persistente del peso colombiano frente al dólar estadounidense. Se observan fases de depreciación acelerada alrededor de 2015 y 2020, coincidiendo con períodos de crisis económica tanto interna como internacional. La serie alcanza su punto máximo alrededor de 2022, seguido por cierta estabilización en los años posteriores, aunque manteniendo valores históricamente altos. Los patrones estacionales tienen una influencia limitada en comparacion con la tendencia general, que domina el comportamiento de la serie. Resulta interesante notar el estrecho alineamiento entre la serie original y la serie ajustada por estacionalidad, lo que confirma que las fluctuaciones del tipo de cambio responden principalmente a factores estructurales y coyunturales de largo plazo, mas que a patrones estacionales predecibles.

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 = "darkgrey", size = 0.5, linetype = "solid", name = "Serie Original") +
  geom_line(aes(x = fechas_var3, y = variable3_sa), color = "darkblue", size = 0.6, linetype = "solid", name = "Serie Ajustada") +
  ggtitle("Variable 3:Serie Original vs Serie Ajustada por Estacionalidad") +
  xlab("Tiempo") +
  ylab("Unidad de medida variable 3") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar etiquetas para mejor visualización
## Warning in geom_line(aes(x = fechas_var3, y = variable3_ts), color =
## "darkgrey", : Ignoring unknown parameters: `name`
## Warning in geom_line(aes(x = fechas_var3, y = variable3_sa), color =
## "darkblue", : Ignoring unknown parameters: `name`
# Convertir a gráfico interactivo
ggplotly(grafico_ajustada_var3)
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

Las exportaciones farmacéuticas de Colombia presentan una volatilidad significativa con un comportamiento diferenciado respecto a las exportaciones totales del país, lo que refleja dinámicas propias de esta industria. Se observa un pico notable alrededor de 2015, seguido por un período de declinación que no muestra un patrón de recuperación claro alineado con las exportaciones totales. Este comportamiento sugiere que el sector farmacéutico exportador colombiano responde a factores específicos de la industria, como políticas regulatorias internacionales, patentes, innovación en productos o competencia global especializada, más que simplemente reflejar las tendencias generales de exportación del país. La descomposición temporal muestra un componente estacional con fluctuaciones regulares que probablemente corresponden a ciclos de demanda internacional de productos farmacéuticos. El componente tendencial ha mostrado relativa estabilidad desde 2020, sin la marcada recuperación que se observa en las exportaciones totales.Sin embargo ,lo más relevante sigue siendo la tendencia estructural. La comparación entre la serie original y la serie ajustada por estacionalidad de las exportaciones farmacéuticas colombianas revela la influencia considerable de los patrones estacionales en el comportamiento del sector. Las diferencias más pronunciadas entre ambas series alcanzan hasta 5,000 miles de dólares en ciertos períodos.

Ahora graficamos serie original vs tendencia

Primero se debe obtener la tendencia de cada variable y luego graficarla

Tendencia Variable 1

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" = "black", "Tendencia" = "red")) +
  ggtitle("Variable 1: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("Unidad de medida Variable 1") +
  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)

Análisis de Variable 1: Serie Original vs Tendencia de Exportaciones Totales

Esta gráfica que compara la serie original de exportaciones totales colombianas (en miles de dólares) con su componente tendencial ofrece una perspectiva esclarecedora sobre la evolución estructural del sector exportador del país. La línea negra, que representa la serie original, muestra la alta volatilidad característica de las exportaciones colombianas, con fluctuaciones pronunciadas que reflejan la sensibilidad del sector a choques externos e internos. Por otra parte, la línea roja representa el componente tendencial, eliminando las fluctuaciones estacionales y aleatorias para revelar la dirección fundamental que ha seguido el sector exportador. Esta tendencia muestra claramente tres grandes períodos: una fase de relativa estabilidad con ligero descenso hasta mediados de 2015, seguida por una pronunciada caída que continuó hasta finales de 2016, estabilizándose en niveles más bajos hasta inicios de 2020, cuando se produjo otra caída significativa coincidente con la pandemia, y finalmente una fase de recuperación acelerada hasta mediados de 2022, estabilizándose posteriormente en niveles superiores a los de la fase 2016-2020, pero sin recuperar completamente los valores anteriores a 2015.

La comparación entre la serie original y la tendencial revela momentos específicos donde las exportaciones se desviaron significativamente de su comportamiento normal como los picos en 2022 que superaron considerablemente la línea tendencial, lo que sugiere que hubo condiciones excepcionales que favorecieron las exportaciones en ese período. Este análisis de tendencia es crucial para comprender los cambios estructurales en el entorno macroeconómico donde opera Baxter. La fuerte caída tendencial entre 2015 y 2016 coincide con el colapso de los precios internacionales del petróleo, evidenciando la alta dependencia de la economía colombiana de las exportaciones de materias primas. El componente tendencial también revela que la recuperación posterior a 2020 ha sido significativa pero incompleta, estabilizándose en aproximadamente 4.1-4.2 millones de miles de dólares mensuales, por debajo de los niveles previos a 2015 que rondaban los 5 millones.

Para Baxter, esta información sobre tendencias de exportaciones totales es valiosa para contextualizar sus propias perspectivas de crecimiento dentro de la economía colombiana. Aunque la empresa opera en el sector farmacéutico con dinámicas propias, el desempeño general exportador del país afecta variables macroeconómicas como tipo de cambio, condiciones de financiamiento e inversión extranjera, que impactan indirectamente en su operación. La tendencia de recuperación desde 2020, aunque incompleta, sugiere un entorno macroeconómico generalmente favorable para actividades exportadoras, lo que Baxter podría aprovechar para expandir su presencia en mercados internacionales. Sin embargo, la estabilización en niveles inferiores a los máximos históricos sugiere un “nuevo normal” para la economía exportadora colombiana, lo que debería moderar las expectativas de crecimiento acelerado y enfatizar estrategias de eficiencia y diferenciación competitiva

Tendencia Variable 2

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" = "darkgrey", "Tendencia" = "purple")) +
  ggtitle("Variable 2: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("Unidad de medida Variable 2") +
  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)

La gráfica de la variable 2, que representa la Tasa Representativa del Mercado (TRM) o tipo de cambio peso colombiano/dólar estadounidense, permite ver de forma clara la diferencia entre la serie original y su tendencia general, lo cual es clave para entender cómo ha cambiado el entorno cambiario en el que opera Baxter en Colombia. Se observa una tendencia claramente alcista desde 2013 hasta 2025, lo que muestra una depreciación constante del peso colombiano frente al dólar a lo largo de más de una década. Lo más llamativo es la fuerte aceleración de esta caída entre 2014 y 2016, cuando la TRM pasó de unos 1.800 a cerca de 3.000 pesos por dólar, lo que representa un aumento de más del 65% en poco tiempo, principalmente por la crisis de precios del petróleo que afectó fuertemente a la economía colombiana. Luego, entre 2016 y 2019, hubo una etapa de relativa estabilidad con la TRM moviéndose cerca de los 3.000 pesos por dólar, pero entre 2020 y 2022 volvió a subir, esta vez por la incertidumbre económica global causada por la pandemia del COVID-19. En ese periodo, la TRM alcanzó niveles históricos, superando los 4.800 pesos por dólar. Al final del periodo analizado, se nota una leve recuperación del peso, aunque se mantiene en niveles altos, con una estabilización que ronda entre los 4.200 y 4.400 pesos por dólar. Para Baxter, la constante depreciación del peso colombiano tiene implicaciones estratégicas importantes. Por un lado, le favorece en su actividad exportadora, ya que los costos laborales y operativos en Colombia, al convertirlos a dólares, se han reducido bastante, lo que mejora la competitividad de sus productos en el mercado internacional. Que la TRM haya pasado de unos 1.800 a más de 4.000 pesos por dólar le da a Baxter una ventaja frente a otros competidores globales que operan en países con monedas más fuertes o estables. Sin embargo, esta misma apreciación hace que importar insumos, equipos o tecnología para producir medicamentos sea mucho más caro, lo que puede afectar los márgenes de ganancia si la empresa no logra compensar esos costos subiendo precios o mejorando su eficiencia en otras partes de su cadena de valor. Por otro lado, como recientemente la TRM se ha estabilizado, aunque sigue alta, Baxter puede planear a mediano plazo con un poco más de certeza. Esto le permitirá hacer mejores planes de compras, inversiones y ventas al exterior, ya sin tanta presión por la volatilidad cambiaria que hubo en años anteriores. Esta estabilización también representa una buena oportunidad para aplicar estrategias de cobertura cambiaria más baratas y eficientes, protegiendo sus márgenes frente a cambios leves en el tipo de cambio.

Tendencia Variable 3

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" = "pink", "Tendencia" = "black")) +
  ggtitle("Variable 3: Serie Original vs Tendencia") +
  xlab("Tiempo") +
  ylab("Unidad de medida Variable 3") +
  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)

Análisis de Variable 3: Serie Original vs Tendencia (Exportaciones Farmacéuticas)

La gráfica de la variable 3 muestra patrones importantes para entender cómo ha cambiado el sector en el que Baxter desarrolla sus operaciones. En los datos originales se ve bastante volatilidad, con muchas subidas y bajadas que reflejan la sensibilidad del sector farmacéutico. Pero cuando se analiza la tendencia general, se puede ver que la primera fase va desde 2013 hasta mediados de 2015, donde la tendencia fue creciente hasta llegar a un pico en 2015 con exportaciones cercanas a los 47.000 miles de dólares mensuales. Este fue el mejor momento del sector, posiblemente gracias a condiciones favorables en el mercado internacional, políticas de impulso al sector o ventajas competitivas que tenía el país en ese tiempo. La segunda fase, de mediados de 2015 hasta inicios de 2020, muestra una caída fuerte en las exportaciones, llegando a un mínimo de unos 29.000 miles de dólares al mes, lo que representa una caída de alrededor del 38% respecto al pico de 2015. Esto podría deberse a que el sector perdió competitividad, a cambios en las reglas internacionales o a nuevas formas de consumo en el mercado global. Finalmente, la tercera fase va de 2020 a 2025 y muestra una recuperación, aunque no completa. En 2023 se llega a un nuevo pico local, con exportaciones de unos 36.000 miles de dólares al mes, y luego se estabiliza hacia 2025 alrededor de los 33.000. Esta mejora parcial sugiere que el sector se está reorganizando, pero con un “techo” más bajo que el que tuvo en su mejor momento en 2015. Para Baxter, las tendencias del sector farmacéutico exportador tienen implicaciones estratégicas clave. La empresa está en un sector que, después de 2015, tuvo una caída importante y aunque ha mostrado cierta recuperación desde 2020, no ha vuelto a alcanzar los niveles máximos que tuvo antes. Esto significa que ahora el entorno es más competitivo y menos dinámico, por lo que para crecer o ganar mercado, Baxter tendría que aplicar estrategias más agresivas de diferenciación e innovación. La reciente estabilización en un nivel medio sugiere que el sector ha encontrado un nuevo punto de equilibrio, lo cual es positivo para la planeación, pero también deja claro que el tamaño del mercado es menor que durante su época de mayor auge. Algo que llama la atención es que, a diferencia de las exportaciones totales de Colombia, que se recuperaron con fuerza después de 2020, las exportaciones farmacéuticas no han seguido ese mismo ritmo. Esto indica que el sector enfrenta retos propios que no tienen que ver solo con la economía del país en general. Además, aunque el tipo de cambio alto (como se vio en la variable 2) debería beneficiar las exportaciones, en este caso no se ha reflejado en un crecimiento proporcional del sector.

Ahora calculamos la tasa de crecimiento de la serie original vs tendencia:

Tasa de crecimiento de la serie de tendencia y original para la variable 1

#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var1 <- (variable1_ts[(13:length(variable1_ts))] / variable1_ts[1:(length(variable1_ts) - 12)] - 1) * 100
tasa_tendencia_var1 <- (tendencia_var1[(13:length(tendencia_var1))] / tendencia_var1[1:(length(tendencia_var1) - 12)] - 1) * 100

# Crear vector de fechas corregido, es decir que inicie desde enero 2013
fechas_corregidas_var1 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var1))

# Verificar longitudes
print(length(fechas_corregidas_var1))
## [1] 144
print(length(tasa_crecimiento_var1))
## [1] 144
print(length(tasa_tendencia_var1))
## [1] 144

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 = "orange", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var1, y = tasa_tendencia_var1), color = "black", size = 0.8, linetype = "dashed") +
  ggtitle("Variable1: Tasa de crecimiento anual % de la serie Original y la tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var1)

Análisis de la Variable 1: Exportaciones Totales de Colombia

El gráfico de las exportaciones totales de Colombia muestra una volatilidad considerable que refleja los ciclos económicos del país y el impacto de eventos globales. Entre 2015 y 2016 se observa una caída marcada, con tasas de crecimiento negativas que llegaron hasta el -40%, debido a la caída en los precios del petróleo y otras materias primas que son clave en las exportaciones colombianas. Luego, entre 2016 y 2018, se ve una fuerte recuperación, con tasas de crecimiento que alcanzaron casi el 50%, lo que sugiere una mejora en los mercados internacionales y una posible diversificación de la canasta exportadora. Con la llegada del COVID-19 en 2019-2020, hubo otra caída drástica, con tasas negativas cercanas al -50%, como resultado de restricciones comerciales, cierres de fronteras y problemas en las cadenas de suministro. Lo más llamativo es la impresionante recuperación entre 2020 y 2022, donde las tasas de crecimiento superaron el 70%, mostrando una reactivación rápida del comercio internacional tras la pandemia. En los últimos años (2022-2024) se nota una estabilización, con tasas de crecimiento moderadas y ligeramente positivas, lo que indica que las condiciones comerciales se han ido normalizando. Para la empresa, estas fluctuaciones han tenido un impacto directo. En los momentos de caída, especialmente en 2020, es probable que haya enfrentado problemas en su cadena de suministro, retrasos logísticos y una menor demanda en el exterior. Sin embargo, la fuerte recuperación posterior representó una gran oportunidad para ampliar su presencia en el mercado internacional, aprovechar la mayor demanda y posicionarse mejor frente a competidores menos preparados. La actual estabilización representa un escenario más predecible que le permite a Baxter planear mejor sus inversiones, reducir riesgos y consolidar su estrategia exportadora desde Colombia.

Ahora calculamos la tasa de crecimiento de la serie original vs tendencia: variable 2

#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var2 <- (variable2_ts[(13:length(variable2_ts))] / variable2_ts[1:(length(variable2_ts) - 12)] - 1) * 100
tasa_tendencia_var2 <- (tendencia_var2[(13:length(tendencia_var2))] / tendencia_var2[1:(length(tendencia_var2) - 12)] - 1) * 100

# Crear vector de fechas corregido
fechas_corregidas_var2 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var2))

# Verificar longitudes
print(length(fechas_corregidas_var2))
## [1] 144
print(length(tasa_crecimiento_var2))
## [1] 144
print(length(tasa_tendencia_var2))
## [1] 144
# 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 = "green", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var2, y = tasa_tendencia_var2), color = "black", size = 0.8, linetype = "dashed") +
  ggtitle("Variable2: Tasa de crecimiento anual % de la serie Original y la Tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var2)

La Tasa Representativa del Mercado (TRM) ha presentado cambios marcados entre 2015 y 2024, reflejando tanto factores internos como externos. Esta volatilidad tiene implicaciones estratégicas clave: si bien la devaluación mejora la competitividad de las exportaciones al reducir los costos en dólares, también encarece la importación de insumos y equipos esenciales para la producción. Además, los cambios abruptos en la TRM dificultan la planeación financiera y pueden afectar la valoración de los activos en Colombia, lo que obliga a las empresas a aplicar estrategias de cobertura cambiaria más sofisticadas para proteger sus márgenes operativos y tomar decisiones de inversión más informadas.

Ahora calculamos la tasa de crecimiento de la serie original vs tendencia: variable 3

#Cálculo de la tasa de crecimiento anual correctamente alineada
tasa_crecimiento_var3 <- (variable3_ts[(13:length(variable3_ts))] / variable3_ts[1:(length(variable3_ts) - 12)] - 1) * 100
tasa_tendencia_var3 <- (tendencia_var3[(13:length(tendencia_var3))] / tendencia_var3[1:(length(tendencia_var3) - 12)] - 1) * 100

# Crear vector de fechas corregido
fechas_corregidas_var3 <- seq(from = as.Date("2013-01-01"), by = "month", length.out = length(tasa_crecimiento_var3))

# Verificar longitudes
print(length(fechas_corregidas_var3))
## [1] 144
print(length(tasa_crecimiento_var3))
## [1] 144
print(length(tasa_tendencia_var3))
## [1] 144
# 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 = "lightblue", size = 0.7) +
  geom_line(aes(x = fechas_corregidas_var3, y = tasa_tendencia_var3), color = "red", size = 0.8, linetype = "dashed") +
  ggtitle("Variable3: Tasa de crecimiento anual % de la serie Original y la tendencia") +
  xlab("Tiempo") +
  ylab("% de Crecimiento Anual") +
  theme_minimal()

# Convertir a gráfico interactivo
ggplotly(grafico_crecimiento_var3)

Análisis de la Variable 3: Exportaciones de Productos Farmacéuticos

El gráfico de la tasa de crecimiento de exportaciones farmacéuticas muestra una volatilidad extrema con frecuentes oscilaciones entre -30% y +50%, reflejando la naturaleza altamente dinámica y sensible del sector farmacéutico internacional. El pronunciado pico de 2015 indica condiciones excepcionales que no fueron sostenibles a largo plazo, posiblemente relacionadas con oportunidades de mercado temporales o demandas extraordinarias. El período de contracción entre 2016 y 2020 representó un desafío industrial significativo que probablemente requirió a las empresas implementar ajustes operacionales profundos, como optimización de portafolio de productos, reorganización de líneas de producción o búsqueda de eficiencias operativas para mantener la rentabilidad. La estabilización reciente en niveles inferiores al pico de 2015 pero superiores al valle de 2016-2020 sugiere un “nuevo normal” al que Baxter debe adaptarse estratégicamente, posiblemente reenfocando sus esfuerzos hacia productos farmacéuticos de mayor valor agregado y especialización, estableciendo alianzas estratégicas con distribuidores internacionales, o buscando certificaciones y aprobaciones regulatorias en mercados emergentes para ampliar su base de clientes.

Modelo ARIMA

División en conjunto de entrenamiento y prueba para la variable 1 que es la elegida para pronosticar

# 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(variable3_ts) - 3 # Se deja fuera los últimos 3 valores para usarlos como set de prueba.
train_ts <- window(variable3_ts, end = c(2024, 9))  # Entrenamiento hasta septiembre 2024
test_ts <- window(variable3_ts, start = c(2024, 10))  # Prueba inicia desde oct2024

Paso 1: Identificación del modelo

Identificar estacionariedad

A continuación se aplica el test ADF para validar estacionariedad en el conjunto de entrenamiento de la variable 1, que es la elegida para pronosticar:

library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# Prueba de estacionariedad con Augmented Dickey-Fuller (ADF)
adf_test <- adf.test(train_ts) #Se aplica el test ADF a la variable 3 (conjunto de entrenamiento)
print(adf_test) # se muestra el resultado del test
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_ts
## Dickey-Fuller = -2.6054, Lag order = 5, p-value = 0.3241
## alternative hypothesis: stationary
#Se crea un nuevo objeto o variable que se llama train_diff, en donde se diferencia la variable 1 , una sola vez:
train_diff <- diff(train_ts, differences = 1) 

Diferenciación en niveles variable 1 A continuación, se realiza el gráfico de la serie original y diferenciada (una vez) de la variable 1 para ver graficamente el cambio o ajuste:

 # Graficar la serie original en un gráfico separado
  p2 <- ggplot(data.frame(Tiempo = time(train_ts), variable1 = as.numeric(train_ts)), aes(x = Tiempo, y = variable1)) +
    geom_line(color = "purple") +
    ggtitle("Variable 3:Serie Original") +
    xlab("Tiempo") + ylab("Gwh")
  
  ggplotly(p2)  # Convertir en gráfico interactivo
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
  # Graficar la serie diferenciada en un gráfico separado
  p3 <- ggplot(data.frame(Tiempo = time(train_ts)[-1], variable1_Diff = as.numeric(train_diff)), aes(x = Tiempo, y = variable1_Diff)) +
    geom_line(color = "red") +
    ggtitle("variable 3:Serie Estacionaria (Una diferenciación)") +
    xlab("Tiempo") + ylab("variable 3 diferenciada")
  
  ggplotly(p3)  # Convertir en gráfico interactivo

Análisis de las Exportaciones Farmacéuticas Colombianas para Baxter

Análisis de la serie diferenciada

La alta volatilidad revelada en la serie diferenciada muestra que Baxter necesita ser más flexible en su producción y manejo de inventarios. Es importante que pueda adaptarse rápido si la demanda cambia, y que sus contratos con proveedores también lo permitan. La fuerte caída en 2020 demuestra que la empresa debe tener reservas financieras y no depender solo de unos pocos países para exportar, ya que eso aumenta el riesgo. Además, como los datos tienen un patrón predecible, Baxter puede usar modelos estadísticos (como ARIMA) para anticipar mejor la demanda. También se identificaron ciclos que se repiten, lo que puede ayudar a planear cuándo producir más, ajustar precios según la temporada y enfocar sus esfuerzos comerciales en los mejores momentos del año.

Ejemplo Diferenciación en logaritmo

A continuación se aplica la diferenciación logarítimica y la varible u objeto ahora se llama train_diff_log

# Si la serie no es estacionaria (p-valor > 0.05), aplicar diferenciación

train_diff_log <- diff(log(train_ts), differences = 1)

Ahora graficamos la serie orignal versus la serie diferenciada una vez con logaritmo

# Graficar la serie original en un gráfico separado
  p2 <- ggplot(data.frame(Tiempo = time(train_ts), variable1 = as.numeric(train_ts)), aes(x = Tiempo, y = variable1)) +
    geom_line(color = "blue") +
    ggtitle("Variable3:Serie Original") +
    xlab("Tiempo") + ylab("Variable3")
  
  ggplotly(p2)  # Convertir en gráfico interactivo
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
# Graficar la serie diferenciada en un gráfico separado
  
  p3 <- ggplot(data.frame(Tiempo = time(train_ts)[-1], micro_Diff = as.numeric(train_diff_log)), aes(x = Tiempo, y = micro_Diff)) +
    geom_line(color = "darkgreen") +
    ggtitle("Variable3:Serie Estacionaria (Una diferenciación en logaritmo)") +
    xlab("Tiempo") + ylab("Variable 3 diferenciada")
  
  ggplotly(p3)  # Convertir en gráfico interactivo

Análisis de la Serie Estacionaria (una diferenciación en logaritmo)

El análisis de la serie estacionaria, obtenida mediante una diferenciación en logaritmo, permite observar con mayor claridad las variaciones proporcionales en el comportamiento mensual de las exportaciones farmacéuticas, eliminando las tendencias de largo plazo y destacando la volatilidad inherente del sector. Las oscilaciones en la serie, que con frecuencia se ubican entre -0.5 y +0.3, evidencian una alta variabilidad estructural, lo cual tiene importantes implicaciones estratégicas para empresas como Baxter. Esta volatilidad no es un fenómeno temporal, sino una característica persistente del sector, como lo demuestra su continuidad a lo largo de todo el periodo analizado, incluyendo los años más recientes. Esto sugiere que, incluso en contextos de aparente estabilización, las exportaciones farmacéuticas colombianas permanecen expuestas a una amplia gama de factores externos, entre ellos los cambios regulatorios en los mercados de destino, las fluctuaciones en la tasa de cambio, alteraciones en la demanda estacional, y disrupciones globales en las cadenas de suministro.

Ahora probamos estacionariedad en la serie diferenciada ( en nivel y logaritmo)

# Segunda prueba de estacionariedad sobre la serie diferenciada en niveles
  adf_test_diff <- adf.test(train_diff)
## Warning in adf.test(train_diff): p-value smaller than printed p-value
  print(adf_test_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_diff
## Dickey-Fuller = -7.0026, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
# Segunda prueba de estacionariedad sobre la serie diferenciada en logaritmo
  adf_test_diff_log <- adf.test(train_diff_log)
## Warning in adf.test(train_diff_log): p-value smaller than printed p-value
  print(adf_test_diff_log)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_diff_log
## Dickey-Fuller = -6.9843, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

Identificación manual de p y q

En el código siguiente se crean los correlogramas para determinar los posibles valores que puedeo tomar el parámetro p** y q:**

library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
# Graficar ACF y PACF
acf_plot <- ggAcf(train_diff, lag.max = 6) + ggtitle("Autocorrelation Function (ACF)-Determinar q")
pacf_plot <- ggPacf(train_diff, lag.max = 6) + ggtitle("Partial Autocorrelation Function (PACF)-Determinar p")

ggplotly(acf_plot)
ggplotly(pacf_plot)

Paso 2. Estimación manual del modelo

Estimación del modelo identificado (1,1,1)

# Cálculo manual de modelo ARIMA
manual_arima_model <- Arima(train_ts, order = c(1,1,1)) #Se va a estimar un modelo Arima de orden (1,1,1)
summary(manual_arima_model)
## Series: train_ts 
## ARIMA(1,1,1) 
## 
## Coefficients:
##          ar1      ma1
##       0.1113  -0.8132
## s.e.  0.1026   0.0598
## 
## sigma^2 = 30411796:  log likelihood = -1524.63
## AIC=3055.26   AICc=3055.42   BIC=3064.33
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE     MAPE      MASE
## Training set 28.09433 5460.356 4261.708 -2.108099 12.62409 0.7644336
##                      ACF1
## Training set -0.002174504

Significancia de coefientes

library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
# Evaluar la significancia estadística de los coeficientes del modelo ARIMA
coeftest(manual_arima_model)
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1  0.111302   0.102574   1.0851   0.2779    
## ma1 -0.813206   0.059846 -13.5883   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Paso 3. Validación de residuos del modelo estimado manual

checkresiduals(manual_arima_model)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,1)
## Q* = 24.27, df = 22, p-value = 0.3333
## 
## Model df: 2.   Total lags used: 24

Paso 4. Pronóstico (modelo manual)

Pronóstico en el test de prueba (oct, nov y dic 2024) y gráfico

#Aquí se crea el pronóstico con el modelo ARIMA manual y se guarda en una nueva riable u objeto "manual_forecast"
manual_forecast <- forecast(manual_arima_model, h = length(test_ts)) #Se generan tantos pronósticos como valores tenga el conjunto de prueba (test_ts).

# Crear dataframe para gráfico interactivo del pronóstico manual
manual_forecast_data <- data.frame(Tiempo = time(manual_forecast$mean), ## Extrae las fechas del pronóstico
                                   Pronostico = as.numeric(manual_forecast$mean), ## Valores pronosticados
                                   Observado = as.numeric(test_ts)) ## Valores reales de la serie

# Graficar pronóstico manual junto con los valores observados reales
p_manual <- ggplot(manual_forecast_data, aes(x = Tiempo)) +
  geom_line(aes(y = Pronostico, color = "Pronóstico Manual")) +
  geom_line(aes(y = Observado, color = "Observado")) +
  ggtitle("Variable1:Pronóstico Manual vs Observado") +
  xlab("Tiempo") + ylab("Variable3")

ggplotly(p_manual)
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

Métricas de evaluación del modelo manual dentro del periodo de prueba (oct,nov y dic2024

# Calcular métricas de evaluación del modelo manual
mae_manual <- mean(abs(manual_forecast$mean - test_ts), na.rm = TRUE)
rmse_manual <- sqrt(mean((manual_forecast$mean - test_ts)^2, na.rm = TRUE))

# Mostrar métricas de evaluación del modelo manual
cat("MAE Manual: ", mae_manual, "\n")
## MAE Manual:  3837.665
cat("RMSE Manual: ", rmse_manual, "\n")
## RMSE Manual:  4999.467

A continuación se calcula la Tabla de pronóstico modelo manual VS los datos reales u observado en oct,nov y dic2024

# Cargar librerías necesarias
library(forecast)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Generar pronóstico con el modelo ARIMA identificado
arima_forecast_manual <- forecast(manual_arima_model, h = length(test_ts))

# Crear un dataframe con los valores observados y pronosticados
forecast_table_manual <- data.frame(
  Tiempo = time(arima_forecast_manual$mean),  # Extraer las fechas del pronóstico
  Observado = as.numeric(test_ts),  # Valores reales
  Pronosticado = as.numeric(arima_forecast_manual$mean)  # Valores pronosticados
)

# Mostrar la tabla
print(forecast_table_manual)
##     Tiempo Observado Pronosticado
## 1 2024.750  32718.02     33959.84
## 2 2024.833  31849.44     33768.40
## 3 2024.917  42099.30     33747.09

Ahora pronosticamos fuera del periodo de análisis: Enero 2025 Es decir, le sumamos al periodo de prueba (oct,nov,dic2024) una observación más (enero 2025). Es decir, se estan pronosticando 4 observaciones o meses:

# Cargar librerías necesarias
library(forecast)

# Hacer un pronóstico para el siguiente mes (1 período adicional)
next_forecast_manual <- forecast(manual_arima_model, h = length(test_ts) + 1)

# Extraer el pronóstico del próximo mes
next_month_forecast_manual <- data.frame(
  Tiempo = time(next_forecast_manual$mean),  # Extraer la fecha del pronóstico
  Pronostico = as.numeric(next_forecast_manual$mean)  # Valor pronosticado
)

# Mostrar el pronóstico completo
print(next_month_forecast_manual)
##     Tiempo Pronostico
## 1 2024.750   33959.84
## 2 2024.833   33768.40
## 3 2024.917   33747.09
## 4 2025.000   33744.72
# Extraer solo el valor del trimestre adicional (último de la tabla)
next_month <- tail(next_month_forecast_manual, 1)
print(paste("Pronóstico para enero 2025:", next_month$Tiempo, "=", next_month$Pronostico))
## [1] "Pronóstico para enero 2025: 2025 = 33744.7177726822"

Otra forma para calcular un valor futuro (fuera de muestra)-Modelo manual, es decir, en caso de que no se haga la dviisón inicial de conjunto de entrenamiento y prueba

# Pronosticar octubre de 2024
future_forecast_manual <- forecast(manual_arima_model, h = 1)

# Extraer el valor específico de octubre 2024
forecast_oct2024 <- future_forecast_manual$mean[1]
print(paste("Pronóstico para oct 2024:", forecast_oct2024))
## [1] "Pronóstico para oct 2024: 33959.8433888923"

Modelo SARIMA automático

# Identificación automática del mejor modelo ARIMA
auto_arima_model <- auto.arima(train_ts)  # Busca automáticamente los mejores parámetros del modelo ARIMA
print(auto_arima_model)
## Series: train_ts 
## ARIMA(1,1,2)(2,0,0)[12] 
## 
## Coefficients:
##          ar1      ma1     ma2    sar1    sar2
##       0.5495  -1.3032  0.3926  0.1887  0.1043
## s.e.  0.7334   0.7504  0.5992  0.0835  0.0892
## 
## sigma^2 = 29402062:  log likelihood = -1520.94
## AIC=3053.88   AICc=3054.45   BIC=3072.02

A continuación, se crea el objeto darima para lueg poder graficar los valores reales y observados:

# Cargar el paquete necesario
library(forecast)

# Ajustar el modelo SARIMA(0,1,1)(1,0,0)[12]
darima <- Arima(train_ts, 
                order = c(1, 1, 2),  # (p,d,q) -> (0,1,1)
                seasonal = list(order = c(2, 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(1,1,2)(2,0,0)[12] 
## 
## Coefficients:
##          ar1      ma1     ma2    sar1    sar2
##       0.5495  -1.3032  0.3926  0.1887  0.1043
## s.e.  0.7334   0.7504  0.5992  0.0835  0.0892
## 
## sigma^2 = 29402062:  log likelihood = -1520.94
## AIC=3053.88   AICc=3054.45   BIC=3072.02
## 
## Training set error measures:
##                    ME     RMSE      MAE      MPE     MAPE     MASE
## Training set 24.24768 5314.983 4217.222 -1.91204 12.41142 0.756454
##                       ACF1
## Training set -5.012729e-05
# Diagnóstico del modelo (los residuos deben ser ruido blanco)
checkresiduals(darima)  # Verificar si los residuos son aleatorios y no presentan patrones

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,2)(2,0,0)[12]
## Q* = 17.132, df = 19, p-value = 0.5809
## 
## Model df: 5.   Total lags used: 24

Análisis de los Residuales del Modelo ARIMA

La imagen muestra los diagnósticos del modelo SARIMA(1,1,2)(2,0,0)[12], aplicado a la serie de exportaciones farmacéuticas en Colombia. Este análisis es clave para evaluar si el modelo se ajusta correctamente a los datos y si sus proyecciones son confiables. En la parte superior, se presenta la evolución de los residuales —es decir, las diferencias entre los valores reales y los estimados por el modelo— desde 2013 hasta 2025. Estos residuales fluctúan entre -15,000 y +15,000 miles de dólares, lo que sugiere que aunque el modelo logra capturar bien la tendencia y los patrones estacionales, hay ciertas irregularidades en el comportamiento del sector que no logra predecir completamente, probablemente debido a eventos externos o coyunturales como cambios regulatorios, crisis sanitarias, o interrupciones logísticas. En la parte inferior izquierda, el gráfico de la función de autocorrelación (ACF) muestra que la mayoría de los rezagos están dentro de los límites de significancia estadística, lo cual es una señal positiva. Esto significa que no hay patrones relevantes que el modelo haya pasado por alto, es decir, los residuales no presentan correlaciones sistemáticas que indiquen una mala especificación. En la parte inferior derecha, el histograma de los residuales muestra una distribución que se aproxima a una normal, con una curva teórica superpuesta en rojo. A pesar de pequeñas desviaciones en las colas, este ajuste a la normalidad refuerza la validez estadística del modelo. En conjunto, estos diagnósticos indican que el modelo SARIMA utilizado es estadísticamente sólido, aunque no infalible, y puede ser una herramienta útil para la toma de decisiones estratégicas en contextos con cierta incertidumbre.

Pronóstico con el modelo SARIMA

# 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("Pronóstico vs Observado") +
  xlab("Tiempo") + ylab("Unidad Variable 1")

ggplotly(p4)  # Convertir el gráfico en interactivo
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

Análisis: Pronóstico vs Valores Observados

La segunda imagen presenta una comparación crucial entre los valores pronosticados y los valores realmente observados para lo que parece ser la Variable 1 (exportaciones totales en miles de dólares) durante un período corto en 2024. Este tipo de análisis comparativo es fundamental para evaluar la precisión del modelo y entender mejor la dinámica reciente del mercado. El gráfico muestra una divergencia significativa entre la predicción y la realidad, particularmente después del punto temporal 2024.85. Los valores observados exhiben una tendencia ascendente pronunciada, alcanzando casi 42,500 unidades al final del período analizado. Este comportamiento ascendente marcado contrasta notablemente con los valores pronosticados, que muestran un patrón más conservador en forma de U suave, fluctuando entre aproximadamente 32,500 y 34,500 unidades durante todo el período mostrado. Esta subestimación sustancial en el pronóstico revela que la actividad exportadora real superó considerablemente las expectativas generadas por el modelo. Esta discrepancia podría atribuirse a diversos factores: cambios inesperados en las condiciones del mercado internacional, modificaciones en las políticas comerciales colombianas que favorecieron las exportaciones, variaciones significativas en la tasa de cambio que hicieron más competitivos los productos colombianos en el exterior, o un aumento repentino en la demanda internacional de productos específicos, incluyendo posiblemente los farmacéuticos.

# 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  32718.02     34395.75
## 2 2024.833  31849.44     33227.48
## 3 2024.917  42099.30     34555.21

Ahora pronosticamos fuera del periodo de análisis

# 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   34395.75
## 2 2024.833   33227.48
## 3 2024.917   34555.21
## 4 2025.000   30592.24
# 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 = 30592.2376415765"

Otra forma para calcular un valor futuro (fuera de muestra)

# Identificación automática del mejor modelo ARIMA
auto_arima_model <- auto.arima(train_ts)  # Busca automáticamente los mejores parámetros del modelo ARIMA
print(auto_arima_model)
## Series: train_ts 
## ARIMA(1,1,2)(2,0,0)[12] 
## 
## Coefficients:
##          ar1      ma1     ma2    sar1    sar2
##       0.5495  -1.3032  0.3926  0.1887  0.1043
## s.e.  0.7334   0.7504  0.5992  0.0835  0.0892
## 
## sigma^2 = 29402062:  log likelihood = -1520.94
## AIC=3053.88   AICc=3054.45   BIC=3072.02
# Pronosticar octubre 2024
future_forecast_sarima <- forecast(auto_arima_model, h = 1)

# Extraer el valor específico de octubre 2024
forecast_oct2024_sarima <- future_forecast_sarima$mean[1]
print(paste("Pronóstico para octubre 2024:", forecast_oct2024_sarima))
## [1] "Pronóstico para octubre 2024: 34395.7460174392"

Recomendaciones Estratégicas:

El análisis realizado sobre las exportaciones farmacéuticas colombianas y su comportamiento temporal revela un entorno caracterizado por alta volatilidad mensual, una recuperación parcial tras 2020 y patrones estacionales estables. Entre las principales ventajas se encuentran un tipo de cambio favorable para exportar, la resiliencia del sector ante crisis globales, y la posibilidad de anticipar ciclos estacionales para mejorar la planificación. Sin embargo, también se identifican desventajas relevantes, como la dependencia de insumos importados afectados por la TRM, la persistente volatilidad estructural, y un crecimiento limitado en comparación con el resto de las exportaciones del país. Estas condiciones indican que el mercado farmacéutico colombiano opera en una “nueva normalidad” con menores volúmenes, pero con oportunidades en nichos especializados y mercados regionales. A partir de estas señales, empresas como Baxter podrían tomar decisiones clave como diversificar mercados de destino, ajustar su portafolio hacia productos de mayor valor agregado, y fortalecer alianzas en mercados emergentes. Además, podrían implementar estrategias de cobertura cambiaria para protegerse de la volatilidad del tipo de cambio, y desarrollar sistemas de planificación por etapas que combinen pronósticos de corto plazo con ajustes tácticos mensuales. El uso de modelos predictivos como el SARIMA permitiría anticipar picos o caídas en la demanda, facilitando la toma de decisiones operativas más precisas. En conjunto, estas acciones permitirían a Baxter responder con mayor agilidad a un entorno cambiante, maximizando oportunidades y minimizando riesgos.