Identificación de la serie económica

Serie de tiempo seleccionada: Índice de Precios al Consumidor - IPC. índice y variación mensual, año corrido y anual del IPC sin alimentos (Enero de 2014 a Diciembre de 2023)

Periodo para entrenamiento del modelo (Train): 2014-2022

Periodo para prueba del modelo (test): 2023

Fuente: Departamento Nacional de Estadísticas - DANE

Instalar librerías

library(readxl)
library(forecast)
library(tseries)
library(ggplot2)
library(moments)
library(nortest)

Cargar los datos

datos <- read_excel("Taller2_Yesenia_Castro_Cely.xlsx", sheet = "train")

x <- datos

x <- ts(x, start = c(2014,1), end = c(2022,12), frequency=12)
x
##            Jan       Feb       Mar       Apr       May       Jun       Jul
## 2014  80.89064  81.44025  81.69391  81.98985  82.16601  82.34921  82.40558
## 2015  83.47661  84.22351  84.51945  84.80834  85.21702  85.41432  85.68912
## 2016  88.10598  89.17700  89.76184  89.90981  90.38895  90.81172  91.05130
## 2017  92.73534  93.78523  94.36302  94.94786  95.22266  95.46223  95.41291
## 2018  97.01240  97.91432  98.18912  98.56257  98.88670  99.09808  99.14741
## 2019 100.46000 101.10000 101.44000 101.84000 102.10000 102.27000 102.41000
## 2020 103.82000 104.47000 104.75000 104.55000 104.14000 103.70000 103.86000
## 2021 104.74000 105.45000 105.86000 106.18000 106.34000 106.50000 106.83000
## 2022 109.43000 110.83000 111.47000 112.48000 113.25000 113.78000 114.61000
##            Aug       Sep       Oct       Nov       Dec
## 2014  82.53241  82.63106  82.82835  82.96223  83.22999
## 2015  85.99915  86.41488  86.76015  87.15474  87.52818
## 2016  91.24154  91.53044  91.65727  91.78410  92.02368
## 2017  95.63134  95.84977  95.96956  96.18799  96.63191
## 2018  99.29538  99.40812  99.59837  99.74634 100.00000
## 2019 102.54000 102.73000 102.87000 103.09000 103.45000
## 2020 103.94000 104.34000 104.33000 104.13000 104.52000
## 2021 107.17000 107.50000 107.32000 107.64000 108.12000
## 2022 115.56000 116.45000 117.14000 117.84000 118.92000
class(x)
## [1] "ts"

Visualizar los datos

plot(x, 
     main = "Serie de tiempo",
     xlab = "Años",
     ylab = "IPC sin alimentos",
     type = "l",
     col="blue")

summary(x)
##      indice      
##  Min.   : 80.89  
##  1st Qu.: 89.87  
##  Median : 99.12  
##  Mean   : 97.77  
##  3rd Qu.:104.48  
##  Max.   :118.92
print(x)
##            Jan       Feb       Mar       Apr       May       Jun       Jul
## 2014  80.89064  81.44025  81.69391  81.98985  82.16601  82.34921  82.40558
## 2015  83.47661  84.22351  84.51945  84.80834  85.21702  85.41432  85.68912
## 2016  88.10598  89.17700  89.76184  89.90981  90.38895  90.81172  91.05130
## 2017  92.73534  93.78523  94.36302  94.94786  95.22266  95.46223  95.41291
## 2018  97.01240  97.91432  98.18912  98.56257  98.88670  99.09808  99.14741
## 2019 100.46000 101.10000 101.44000 101.84000 102.10000 102.27000 102.41000
## 2020 103.82000 104.47000 104.75000 104.55000 104.14000 103.70000 103.86000
## 2021 104.74000 105.45000 105.86000 106.18000 106.34000 106.50000 106.83000
## 2022 109.43000 110.83000 111.47000 112.48000 113.25000 113.78000 114.61000
##            Aug       Sep       Oct       Nov       Dec
## 2014  82.53241  82.63106  82.82835  82.96223  83.22999
## 2015  85.99915  86.41488  86.76015  87.15474  87.52818
## 2016  91.24154  91.53044  91.65727  91.78410  92.02368
## 2017  95.63134  95.84977  95.96956  96.18799  96.63191
## 2018  99.29538  99.40812  99.59837  99.74634 100.00000
## 2019 102.54000 102.73000 102.87000 103.09000 103.45000
## 2020 103.94000 104.34000 104.33000 104.13000 104.52000
## 2021 107.17000 107.50000 107.32000 107.64000 108.12000
## 2022 115.56000 116.45000 117.14000 117.84000 118.92000
class(x)
## [1] "ts"

Función de autocorrelación

acf(x)

acf(ts(x, frequency=1))

Función de autocorrelación parcial

pacf(x)

pacf(ts(x, frequency=1))

En la gráfica, se observa que los valores están dentro de los intervalos a partir del segundo rezago, se puede concluir que es un modelo AR.

Número de diferencias necesarias para una serie estacionaria

ndiffs(x)
## [1] 1

Hay raíz unitaria, por lo tanto se puede concluir que la serie no es estacionaria

Prueba de Dickey-Fuller

df1<-adf.test(x, k=0)
## Warning in adf.test(x, k = 0): p-value greater than printed p-value
df1
## 
##  Augmented Dickey-Fuller Test
## 
## data:  x
## Dickey-Fuller = 1.1623, Lag order = 0, p-value = 0.99
## alternative hypothesis: stationary
summary(df1)
##             Length Class  Mode     
## statistic   1      -none- numeric  
## parameter   1      -none- numeric  
## alternative 1      -none- character
## p.value     1      -none- numeric  
## method      1      -none- character
## data.name   1      -none- character

En la prueba Dickey-Fuller H0: no es estacionaria (raíz unitaria) p= > 0.05 y H1: es estacionaria p= <0.05. Teniendo el valor-p de 0.99 en la prueba se puede concluir que la serie no es estacionaria en sus datos originales

Modelo inicial con intercepto

modelo1<-Arima(x, order=c(2,0,0), include.drift = TRUE)
summary(modelo1)
## Series: x 
## ARIMA(2,0,0) with drift 
## 
## Coefficients:
##          ar1      ar2  intercept   drift
##       1.6150  -0.6376    79.6330  0.3433
## s.e.  0.0757   0.0767     1.5862  0.0258
## 
## sigma^2 = 0.06092:  log likelihood = -2.42
## AIC=14.85   AICc=15.44   BIC=28.26
## 
## Training set error measures:
##                        ME      RMSE       MAE          MPE      MAPE       MASE
## Training set -0.004159765 0.2422036 0.1805778 -0.005557171 0.1817835 0.04506928
##                     ACF1
## Training set -0.02578281
tsdiag(modelo1) 

Box.test(residuals(modelo1), type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(modelo1)
## X-squared = 0.073806, df = 1, p-value = 0.7859

Modelo inicial sin intercepto

modelo2<-arima(x, order=c(1,0,0))
summary(modelo2) 
## 
## Call:
## arima(x = x, order = c(1, 0, 0))
## 
## Coefficients:
##          ar1  intercept
##       0.9997    99.8676
## s.e.  0.0004    18.6143
## 
## sigma^2 estimated as 0.2239:  log likelihood = -76.12,  aic = 158.25
## 
## Training set error measures:
##                     ME      RMSE       MAE       MPE      MAPE     MASE
## Training set 0.3469711 0.4732296 0.3832574 0.3491848 0.3864819 1.000013
##                   ACF1
## Training set 0.5517327

Serie en diferencias

seriedif<-diff(x, lag=1) 
seriedif
##              Jan         Feb         Mar         Apr         May         Jun
## 2014              0.54960541  0.25366404  0.29594138  0.17615558  0.18320180
## 2015  0.24661781  0.74689966  0.29594138  0.28889515  0.40868095  0.19729425
## 2016  0.57779030  1.07102593  0.58483653  0.14797069  0.47914318  0.42277339
## 2017  0.71166855  1.04988726  0.57779030  0.58483653  0.27480271  0.23957159
## 2018  0.38049605  0.90191657  0.27480271  0.37344983  0.32412627  0.21138670
## 2019  0.46000000  0.64000000  0.34000000  0.40000000  0.26000000  0.17000000
## 2020  0.37000000  0.65000000  0.28000000 -0.20000000 -0.41000000 -0.44000000
## 2021  0.22000000  0.71000000  0.41000000  0.32000000  0.16000000  0.16000000
## 2022  1.31000000  1.40000000  0.64000000  1.01000000  0.77000000  0.53000000
##              Jul         Aug         Sep         Oct         Nov         Dec
## 2014  0.05636979  0.12683202  0.09864713  0.19729425  0.13387824  0.26775648
## 2015  0.27480271  0.31003382  0.41572717  0.34526494  0.39458850  0.37344983
## 2016  0.23957159  0.19024803  0.28889515  0.12683202  0.12683202  0.23957159
## 2017 -0.04932356  0.21843292  0.21843292  0.11978579  0.21843292  0.44391206
## 2018  0.04932356  0.14797069  0.11273957  0.19024803  0.14797069  0.25366404
## 2019  0.14000000  0.13000000  0.19000000  0.14000000  0.22000000  0.36000000
## 2020  0.16000000  0.08000000  0.40000000 -0.01000000 -0.20000000  0.39000000
## 2021  0.33000000  0.34000000  0.33000000 -0.18000000  0.32000000  0.48000000
## 2022  0.83000000  0.95000000  0.89000000  0.69000000  0.70000000  1.08000000
plot(seriedif)

acf(ts(seriedif, frequency=1))#Función de autocorrelación

pacf(ts(seriedif, frequency = 1))#Función de autocorrelación parcial

ndiffs(seriedif)
## [1] 0

No hay raiz unitaria, por lo tanto se puede concluir que la serie es estacionaria.

Prueba de Dickey-Fuller de la serie en diferencias

df2<-adf.test(seriedif, k=0)
## Warning in adf.test(seriedif, k = 0): p-value smaller than printed p-value
df2
## 
##  Augmented Dickey-Fuller Test
## 
## data:  seriedif
## Dickey-Fuller = -4.8865, Lag order = 0, p-value = 0.01
## alternative hypothesis: stationary
summary(df2)
##             Length Class  Mode     
## statistic   1      -none- numeric  
## parameter   1      -none- numeric  
## alternative 1      -none- character
## p.value     1      -none- numeric  
## method      1      -none- character
## data.name   1      -none- character

Teniendo en cuenta el p-valor obtenido en la prueba de Dickey-Fuller (0.01) se identifica que la serie ahora sí es estacionaria.

Modelo 3 con intercepto

modelo3<-Arima(seriedif, order=c(1,1,0), include.drift = TRUE)
summary(modelo3)
## Series: seriedif 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##           ar1   drift
##       -0.2115  0.0049
## s.e.   0.0959  0.0212
## 
## sigma^2 = 0.07127:  log likelihood = -9.43
## AIC=24.86   AICc=25.1   BIC=32.85
## 
## Training set error measures:
##                        ME      RMSE       MAE      MPE     MAPE     MASE
## Training set -0.000526035 0.2631923 0.1932397 35.25268 99.40545 0.844171
##                     ACF1
## Training set -0.02178836
tsdiag(modelo3) 

Box.test(residuals(modelo3), type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(modelo3)
## X-squared = 0.052234, df = 1, p-value = 0.8192

Modelo 4 sin intercepto

modelo4<-arima(seriedif, order=c(1,1,0))
summary(modelo4) 
## 
## Call:
## arima(x = seriedif, order = c(1, 1, 0))
## 
## Coefficients:
##           ar1
##       -0.2112
## s.e.   0.0959
## 
## sigma^2 estimated as 0.06996:  log likelihood = -9.46,  aic = 22.92
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.005321309 0.263258 0.1926913 36.69843 98.06843 0.9742497
##                    ACF1
## Training set -0.0218577

Modelo 5 usando auto.arima

modelo5<- auto.arima(x, seasonal = F, ic="aic", trace = T)
## 
##  ARIMA(2,1,2)            with drift         : 15.04895
##  ARIMA(0,1,0)            with drift         : 58.71349
##  ARIMA(1,1,0)            with drift         : 9.550868
##  ARIMA(0,1,1)            with drift         : 25.18181
##  ARIMA(0,1,0)                               : 145.5466
##  ARIMA(2,1,0)            with drift         : 11.42794
##  ARIMA(1,1,1)            with drift         : 11.44352
##  ARIMA(2,1,1)            with drift         : 13.35279
##  ARIMA(1,1,0)                               : 21.94358
## 
##  Best model: ARIMA(1,1,0)            with drift
summary(modelo5)
## Series: x 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##          ar1   drift
##       0.6301  0.3696
## s.e.  0.0771  0.0633
## 
## sigma^2 = 0.06145:  log likelihood = -1.78
## AIC=9.55   AICc=9.78   BIC=17.57
## 
## Training set error measures:
##                         ME      RMSE       MAE          MPE      MAPE      MASE
## Training set -0.0006774964 0.2444222 0.1816685 -0.003928605 0.1832766 0.0453415
##                     ACF1
## Training set -0.01632017

Determinar la estacionalidad

modelo6 <- auto.arima(x, seasonal = T, ic="aic")
summary(modelo6)
## Series: x 
## ARIMA(1,1,1)(2,0,0)[12] with drift 
## 
## Coefficients:
##          ar1      ma1    sar1    sar2   drift
##       0.8765  -0.3751  0.4185  0.2441  0.4569
## s.e.  0.0737   0.1489  0.1031  0.1112  0.2297
## 
## sigma^2 = 0.0442:  log likelihood = 14.24
## AIC=-16.47   AICc=-15.63   BIC=-0.43
## 
## Training set error measures:
##                       ME      RMSE       MAE         MPE      MAPE       MASE
## Training set 0.006965232 0.2043152 0.1456464 0.004116916 0.1474408 0.03635096
##                    ACF1
## Training set 0.01919086

El resultado (2,0,0) [12] indica que hay estacionalidad en el componente autoregresivo AR cada 12 meses

Seleccionar el mejor modelo empleando RMSE y AIC

summary(modelo1) 
## Series: x 
## ARIMA(2,0,0) with drift 
## 
## Coefficients:
##          ar1      ar2  intercept   drift
##       1.6150  -0.6376    79.6330  0.3433
## s.e.  0.0757   0.0767     1.5862  0.0258
## 
## sigma^2 = 0.06092:  log likelihood = -2.42
## AIC=14.85   AICc=15.44   BIC=28.26
## 
## Training set error measures:
##                        ME      RMSE       MAE          MPE      MAPE       MASE
## Training set -0.004159765 0.2422036 0.1805778 -0.005557171 0.1817835 0.04506928
##                     ACF1
## Training set -0.02578281
summary(modelo2) 
## 
## Call:
## arima(x = x, order = c(1, 0, 0))
## 
## Coefficients:
##          ar1  intercept
##       0.9997    99.8676
## s.e.  0.0004    18.6143
## 
## sigma^2 estimated as 0.2239:  log likelihood = -76.12,  aic = 158.25
## 
## Training set error measures:
##                     ME      RMSE       MAE       MPE      MAPE     MASE
## Training set 0.3469711 0.4732296 0.3832574 0.3491848 0.3864819 1.000013
##                   ACF1
## Training set 0.5517327
summary(modelo3) 
## Series: seriedif 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##           ar1   drift
##       -0.2115  0.0049
## s.e.   0.0959  0.0212
## 
## sigma^2 = 0.07127:  log likelihood = -9.43
## AIC=24.86   AICc=25.1   BIC=32.85
## 
## Training set error measures:
##                        ME      RMSE       MAE      MPE     MAPE     MASE
## Training set -0.000526035 0.2631923 0.1932397 35.25268 99.40545 0.844171
##                     ACF1
## Training set -0.02178836
summary(modelo4) 
## 
## Call:
## arima(x = seriedif, order = c(1, 1, 0))
## 
## Coefficients:
##           ar1
##       -0.2112
## s.e.   0.0959
## 
## sigma^2 estimated as 0.06996:  log likelihood = -9.46,  aic = 22.92
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.005321309 0.263258 0.1926913 36.69843 98.06843 0.9742497
##                    ACF1
## Training set -0.0218577
summary(modelo5) 
## Series: x 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##          ar1   drift
##       0.6301  0.3696
## s.e.  0.0771  0.0633
## 
## sigma^2 = 0.06145:  log likelihood = -1.78
## AIC=9.55   AICc=9.78   BIC=17.57
## 
## Training set error measures:
##                         ME      RMSE       MAE          MPE      MAPE      MASE
## Training set -0.0006774964 0.2444222 0.1816685 -0.003928605 0.1832766 0.0453415
##                     ACF1
## Training set -0.01632017
summary(modelo6) 
## Series: x 
## ARIMA(1,1,1)(2,0,0)[12] with drift 
## 
## Coefficients:
##          ar1      ma1    sar1    sar2   drift
##       0.8765  -0.3751  0.4185  0.2441  0.4569
## s.e.  0.0737   0.1489  0.1031  0.1112  0.2297
## 
## sigma^2 = 0.0442:  log likelihood = 14.24
## AIC=-16.47   AICc=-15.63   BIC=-0.43
## 
## Training set error measures:
##                       ME      RMSE       MAE         MPE      MAPE       MASE
## Training set 0.006965232 0.2043152 0.1456464 0.004116916 0.1474408 0.03635096
##                    ACF1
## Training set 0.01919086
Modelo RSME AIC
Modelo1 - (2,0,0) con intercepto 0.1805778 14.85
Modelo2 - (1,0,0) sin intercepto 0.4732296 158.25
Modelo3 - (1,1,0) con intercepto 0.2631923 24.86
Modelo4 - (1,1,0) sin intercepto 0.263258 22.92
Modelo5 - (1,1,0) autoarima 0.2444222 9.55
Modelo6 - (1,1,1) estacional 0.2043152 16.47

Los mejores modelos son el modelo 1 teniendo en cuenta el Error cuadrático medio (RMSE) con un valor de 0.1805778 y el modelo 5 teniendo en cuenta el criterio de Akaike (AIC) con un valor de 9.55.

Pruebas de normalidad

Para las pruebas de normalidad de los mejores modelos emplado el RMSE y AIC se considera:

H0: La muestra proviene de una distribución normal.

H1: La muestra no proviene de una distribución normal.

El nivel de significancia que se trabajará es de 0.05. Alfa=0.05

Criterio de Decisión

Si P < Alfa Se rechaza Ho

Si p >= Alfa No se rechaza Ho

Pruebas de normalidad del mejor modelo empleando RMSE - modelo 1

#Método del histograma
hist(modelo1$residuals)

plot((density(modelo1$residuals)), ylab="Densidad", col="blue", xlab="Desviaciones estándar", las=1, lwd=4)

#Gráfico Q-Q norm
qqnorm(modelo1$residuals)
qqline(modelo1$residuals, col=2)     

#Coeficientes de asimetría
skewness(modelo1$residuals)
## [1] 0.4539021
#Coeficientes der curtosis
kurtosis(modelo1$residuals)
## [1] 3.682591
#Test de Shapiro Wilks (para tamaños de muestra menores de 50)
shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.97716, p-value = 0.05977
#Test de Komogorov-Smirnov-Lilliefors (para tamños de la muestra mayores a 50)
lillie.test(modelo1$residuals)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  modelo1$residuals
## D = 0.10047, p-value = 0.009234
#Test de Jarque - Bera
jarque.bera.test(modelo1$residuals)
## 
##  Jarque Bera Test
## 
## data:  modelo1$residuals
## X-squared = 5.8052, df = 2, p-value = 0.05488

Asimetría:Distribución asimétrica a la derecha

Curtosis: distribución leptocúrtica

Shapiro-Wilk: Como el p valor (0.05977) es mayor a alfa (0,05), no se rechaza la hipótesis nula. Esto sugiere que no hay evidencia estadística suficiente para concluir que los datos no siguen una distribución normal.

Lilliefors (Kolmogorov-Smirnov): Dado que 0.009234 < 0.05, se rechaza la hipótesis nula. Esto sugiere que hay evidencia estadística suficiente para concluir que los datos no siguen una distribución normal.

Jarque Bera Test: Dado que 0.05488 > 0.05, técnicamente no se rechaza la hipótesis nula. Esto sugiere que no hay evidencia estadística fuerte para concluir que los datos no siguen una distribución normal. En conjunto, estos resultados sugieren que los datos probablemente se desvían de una distribución normal perfecta

Pruebas de normalidad del mejor modelo empleando AIC - modelo 5

#Método del histograma
hist(modelo5$residuals)

plot((density(modelo5$residuals)), ylab="Densidad", col="blue", xlab="Desviaciones estándar", las=1, lwd=4)

#Gráfico Q-Q norm
qqnorm(modelo5$residuals)
qqline(modelo5$residuals, col=2)     

#Coeficientes de asimetría
skewness(modelo5$residuals)
## [1] 0.6657392
#Coeficientes de curtosis
kurtosis(modelo5$residuals)
## [1] 3.878957
#Test de Shapiro Wilks (para tamaños de muestra menores de 50)
shapiro.test(modelo5$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo5$residuals
## W = 0.96373, p-value = 0.004844
#Test de Komogorov-Smirnov-Lilliefors (para tamños de la muestra mayores a 50)
lillie.test(modelo5$residuals)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  modelo5$residuals
## D = 0.10879, p-value = 0.003104
#Test de Jarque - Bera
jarque.bera.test(modelo5$residuals)
## 
##  Jarque Bera Test
## 
## data:  modelo5$residuals
## X-squared = 11.454, df = 2, p-value = 0.003256

Asimetría:Distribución asimétrica a la derecha

Kurtosis: distribución leptocúrtica

Los resultados de las demás pruebas: Shapiro-Wilk normality test p-value = 0.004844, Lilliefors (Kolmogorov-Smirnov) normality test p-value = 0.003104 y Jarque Bera Test p-value = 0.003256 muestran que todos los p-valores son menores que 0.05 (e incluso menores que 0.01), se rechaza la hipótesis nula en todas las pruebas. Esto proporciona una fuerte evidencia estadística para concluir que los datos no siguen una distribución normal.

Pronóstico del siguiente año con el mejor modelo por IAC - modelo 5

pronostico<-forecast(modelo5, h=12, level = 95)
autoplot(pronostico)

Comparar los resultados del pronóstico con los datos reales del IPC sin alimentos año 2023

# Cargar los datos del año 10 de la serie
datos <- read_excel("Taller2_Yesenia_Castro_Cely.xlsx", sheet = "test")

x_test <- datos

ipc_real <- ts(x_test, start = c(1,1), end = c(1,12), frequency=12)
ipc_real
##      Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov
## 1 120.84 122.86 124.20 125.43 126.37 127.00 127.73 128.49 129.12 129.45 130.35
##      Dec
## 1 131.21
# Crear tabla con pronósticos

prediccion <- data.frame(pronostico)

# Crear tabla comparativa 
prueba <- data.frame(cbind(ipc_real, prediccion$Point.Forecast))
prueba
##    ipc_real prediccion.Point.Forecast
## 1    120.84                  119.7372
## 2    122.86                  120.3889
## 3    124.20                  120.9362
## 4    125.43                  121.4178
## 5    126.37                  121.8580
## 6    127.00                  122.2720
## 7    127.73                  122.6697
## 8    128.49                  123.0569
## 9    129.12                  123.4376
## 10   129.45                  123.8142
## 11   130.35                  124.1882
## 12   131.21                  124.5606
# Calcular la diferencia entre valor real y valor pronosticado


prueba["diferencia"]<-(prueba$ipc_real - prueba$prediccion.Point.Forecast)
prueba["diferencia porcentual"]<-(prueba$diferencia / prueba$ipc_real)
colnames(prueba)<-c("IPC real", "Pronóstico", "Diferencia", "Diferencia porcentual")
prueba
##    IPC real Pronóstico Diferencia Diferencia porcentual
## 1    120.84   119.7372   1.102763            0.00912581
## 2    122.86   120.3889   2.471099            0.02011313
## 3    124.20   120.9362   3.263767            0.02627832
## 4    125.43   121.4178   4.012178            0.03198738
## 5    126.37   121.8580   4.512014            0.03570479
## 6    127.00   122.2720   4.727953            0.03722798
## 7    127.73   122.6697   5.060341            0.03961748
## 8    128.49   123.0569   5.433093            0.04228417
## 9    129.12   123.4376   5.682376            0.04400849
## 10   129.45   123.8142   5.635775            0.04353631
## 11   130.35   124.1882   6.161767            0.04727094
## 12   131.21   124.5606   6.649393            0.05067748
plot(prueba$`IPC real`, 
     main = "Serie de tiempo - 2023",
     xlab = "Meses",
     ylab = "IPC sin alimentos",
     xlim = c(1,12),
     type = "l",
     col="blue")
lines(prueba$Pronóstico, col=("red"))
axis(1, at = 1:12, labels = 1:12)
legend("topleft",
       legend = c("IPC real", "Predicción usando el modelo 5"),
       col = c("blue", "red"),
       lty = 1,
       cex = 0.8)

Establecer cinco (5) conclusiones

  1. La serie de tiempo del índice de precios al consumidor en su valores originales sigue un modelo AR al considerar los resultados de la función de autocorrelación parcial.

  2. La serie de tiempo del índice de precios al consumidor en su valores originales presenta una raíz unitaria, es decir, no es estacionaria. Los resultados de la prueba Dickey-Fuller reportan un valor-p de 0.99.

  3. Al realizar la prueba de estacionalidad se identifica que indica que hay estacionalidad en el componente autoregresivo AR (2,0,0) cada 12 meses [12].

  4. Los mejores modelos son el modelo 1 - (2,0,0) con intercepto teniendo en cuenta el Error cuadrático medio (RMSE) con un valor de 0.1805778 y el modelo 5 - (1,1,0) usando autoarima teniendo en cuenta el criterio de Akaike (AIC) con un valor de 9.55.

  5. Al realizar la validación de los valores pronosticados por el modelo 5 (mejor modelo por AIC) comparándolos con los valores reales del IPC sin alimentos del año 2023 se encuentran diferencias menores al 5% para cada uno de los meses. Esto sugiere que el modelo 5 es preciso y ha capturado bien los patrones de la serie.