PUNTO A
energy_mensual <- energy %>%
summarise_by_time(.date_var = Fecha, .by = "month",
demanda_real = mean(demanda_real, na.rm = TRUE))
ts_energy <- ts (energy_mensual$demanda_real, start = c(2000, 1),
end = c(2023, 9), frequency = 12)
ts_plot(ts_energy, slider = T,
title = "Demanda mensual de energía en Sincelejo 2000-2023",
Ytitle = "Demanda real",
Xtitle = "Año")
ts_decompose(ts_energy, type = "both")
demanda_descom <- decompose(ts_energy, type = "additive")
Al analizar el ciclo de la gráfica de la demanda real mensual de
energía en mwh de la ciudad de Sincelejo del mercado no regulado
(enero-2000 hasta septiembre-2023), no se logra observar a simple vista
presencia de estacionalidad de la serie, debido que no hay evidencia de
un patrón recurrente de comportamientos en períodos específicos, pero sí
picos anormales en ciertos periodos, a excepción de una pequeña
tendencia ascendente en el consumo de energía durante los meses de
verano, enero, febrero y marzo.
En el 2002 se observa un descenso debido a un apagón causado por una
falla de una subestación de energía, que dejó sin suministro eléctrico a
18 departamentos. En 2006 al 2007 se presenta un pico negativo
influenciado por los efectos climáticos del fenómeno de El niño, según
un reporte presentado por el banco de la república, en ese año la
prolongada sequía aumentó el costo de los servicios y como consecuencia
se generó una disminución en el consumo energético. (Mejía A., 2007,
#)
Posteriormente, en 2020, se registró un incremento abrupto en la
demanda de energía. Éste aumento estuvo relacionado con las medidas de
confinamiento y salubridad pública adoptadas durante la pandemia de
COVID-19 (OPS, 2020). Tras la crisis sanitaria y la reactivación
económica, el consumo de energía no retornó a los niveles previos a la
pandemia, sino que se mantuvo elevado pues las personas siguieron su
nueva dinámica de consumo adoptada en la pandemia.
PUNTO B
demanda_des <- ts_energy - demanda_descom$seasonal
demanda <- data.frame("demanda_ob" = as.numeric(ts_energy))%>%
mutate(demanda_des = as.numeric(demanda_des),
Fecha = energy_mensual$Fecha)
ts_plot(demanda, slider = T,
title = "Demanda mensual de energía en Sincelejo \n normal y desestacionalizada \n 2000-2023",
Ytitle = "Demanda real",
Xtitle = "Año")
Al aplicar el proceso de desestacionalización a la serie temporal y
analizar la gráfica desestacionalizada con la normal, observamos que no
se obtuvo mucha diferencia con la original, ya que las gráficas son
similares en muchos puntos e indica que no se obtuvo una reducción del
efecto calendario.
PUNTO C
df <- ur.df(ts_energy, type = "trend", lags = 0)
summary(df)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression trend
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -43.699 -2.332 -0.471 1.914 53.296
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.349890 0.862926 -0.405 0.6854
## z.lag.1 -0.016088 0.011675 -1.378 0.1693
## tt 0.016660 0.007653 2.177 0.0303 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.97 on 281 degrees of freedom
## Multiple R-squared: 0.01712, Adjusted R-squared: 0.01012
## F-statistic: 2.447 on 2 and 281 DF, p-value: 0.0884
##
##
## Value of test-statistic is: -1.3781 2.2545 2.4469
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau3 -3.98 -3.42 -3.13
## phi2 6.15 4.71 4.05
## phi3 8.34 6.30 5.36
par(mfcol = c(1, 2))
acf(ts_energy, )
pacf(ts_energy)

dwtest(df@testreg)
##
## Durbin-Watson test
##
## data: df@testreg
## DW = 2.0209, p-value = 0.5228
## alternative hypothesis: true autocorrelation is greater than 0
# Se aplica primera diferencia para volver la serie estacionaria
ts_energy_diff <- diff(ts_energy, differences = 1)
Tras una revisión previa de manera a priori en el punto A, se
determinó que la serie no es estacionaria. observamos en el ACF que
existe una disminución a medida que se aleja en el tiempo pero no es
cercano a cero, por lo que la serie no es estacionaria. En el PACF vemos
que hay un solo rezago significativo mientras que los demás no lo
son.
Dickey Fuller
Según este test, por medio de la prueba de hipótesis de
significancia individual del coeficiente, tenemos que:
Ho = ઠ = 0 ó p = 1 No es estacionaria.
Ho = ઠ ≠ 0 ó p ≠ 1 Es estacionaria
En este caso el resultado del coeficiente de demanda de energía es
de 0.1693, no es significativo y por lo tanto no es estacionaria.
Para volver una serie no estacionaria a estacionaria se hace una
diferenciación, y si sigue dando no estacionaria, se diferencia por
segunda vez hasta que sea estacionaria.
PUNTO D
df_diff <- ur.df(ts_energy_diff, type = "trend", lags = 0)
options(scipen = 999)
summary(df_diff)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression trend
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44.168 -2.159 -0.369 1.873 54.277
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.747230 0.835254 -0.895 0.372
## z.lag.1 -1.020706 0.059707 -17.095 <0.0000000000000002 ***
## tt 0.009245 0.005119 1.806 0.072 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.999 on 280 degrees of freedom
## Multiple R-squared: 0.5107, Adjusted R-squared: 0.5072
## F-statistic: 146.1 on 2 and 280 DF, p-value: < 0.00000000000000022
##
##
## Value of test-statistic is: -17.0951 97.4168 146.1252
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau3 -3.98 -3.42 -3.13
## phi2 6.15 4.71 4.05
## phi3 8.34 6.30 5.36
par(mfcol = c(1, 2))
acf(ts_energy_diff, )
pacf(ts_energy_diff)

# Estimar el modelo ARIMA(0,1,1)
arima_ma1 <- arima(ts_energy, c(0, 1, 1),
seasonal = list(order = c(0,1,1), period = 12))
stargazer(arima_ma1, type = "html")
|
|
Dependent variable:
|
|
|
|
ts_energy
|
|
ma1
|
0.045
|
|
(0.069)
|
|
|
sma1
|
-1.000***
|
|
(0.077)
|
|
|
|
Observations
|
272
|
Log Likelihood
|
-916.639
|
sigma2
|
43.057
|
Akaike Inf. Crit.
|
1,839.279
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
El modelo ARIMA (0,1,1), resulta ser el más eficiente ya que muestra
la dinámica de la serie de tiempo, esta serie al ya ser diferenciada se
volvió estacionaria, esta necesito una sola diferenciación (d=1), además
el ACF nos muestra un comportamiento de media móvil de orden 1 (q=1) por
otro lado el PACF no muestra la necesidad de un componente
autorregresivo (p=0), así este modelo es el más parsimonioso y además,
evita el sobre ajuste, lo que nos permite una interpretación mejor y un
pronóstico más exacto de esta serie.
PUNTO E
demanda <- demanda %>%
mutate(resid = arima_ma1$residuals,
demanda_est = as.numeric(demanda_ob-resid))%>%
select(demanda_ob, demanda_est, Fecha)
ts_plot(demanda, slider = T,
title = "Demanda mensual de energía en Sincelejo \n normal y ajustada \n 2000-2023",
Ytitle = "Demanda real",
Xtitle = "Año")
par(mfcol = c(1, 2))
hist(arima_ma1$residuals)
qqnorm(arima_ma1$residuals)
qqline(arima_ma1$residuals, col = "red")

jarque.bera.test(arima_ma1$residuals)
##
## Jarque Bera Test
##
## data: arima_ma1$residuals
## X-squared = 6658.9, df = 2, p-value < 0.00000000000000022
# Version automatica
modelo_arima <- auto.arima(ts_energy, trace = T)
##
## Fitting models using approximations to speed things up...
##
## ARIMA(2,1,2)(1,0,1)[12] with drift : Inf
## ARIMA(0,1,0) with drift : 1910.797
## ARIMA(1,1,0)(1,0,0)[12] with drift : 1924.82
## ARIMA(0,1,1)(0,0,1)[12] with drift : 1913.399
## ARIMA(0,1,0) : 1910.62
## ARIMA(0,1,0)(1,0,0)[12] with drift : 1921.764
## ARIMA(0,1,0)(0,0,1)[12] with drift : 1911.378
## ARIMA(0,1,0)(1,0,1)[12] with drift : 1918.505
## ARIMA(1,1,0) with drift : 1913.599
## ARIMA(0,1,1) with drift : 1912.805
## ARIMA(1,1,1) with drift : 1915.305
##
## Now re-fitting the best model(s) without approximations...
##
## ARIMA(0,1,0) : 1914.516
##
## Best model: ARIMA(0,1,0)
demanda <- demanda %>%
mutate(resid = modelo_arima$residuals,
demanda_est = as.numeric(demanda_ob-resid))%>%
select(demanda_ob, demanda_est, Fecha)
ts_plot(demanda, slider = T,
title = "Demanda mensual de energía en Sincelejo \n normal y ajustada \n 2000-2023",
Ytitle = "Demanda real",
Xtitle = "Año")
par(mfcol = c(1, 2))
hist(modelo_arima$residuals)
qqnorm(modelo_arima$residuals)
qqline(modelo_arima$residuals, col = "red")

jarque.bera.test(modelo_arima$residuals)
##
## Jarque Bera Test
##
## data: modelo_arima$residuals
## X-squared = 9670.1, df = 2, p-value < 0.00000000000000022
# Pronosticamos con el modelo ARIMA(0,1,1)
futureval <- forecast(arima_ma1, h = 5, level = c(0.95))
print(futureval)
## Point Forecast Lo 95 Hi 95
## Oct 2023 227.8084 214.6709 240.9459
## Nov 2023 226.3940 207.3944 245.3936
## Dec 2023 227.4301 203.9913 250.8688
## Jan 2024 223.1286 195.9668 250.2905
## Feb 2024 230.3347 199.9072 260.7621
par(mfcol = c(1, 1))
plot(futureval)

Modelo ARIMA (0,1,1)
Estudiando la normalidad de los errores en este modelo obtuvimos
como resultado el valor estadístico Jarque-Bera es de 6658.9, lo que
indica una desviación significativa de la normalidad, pues este valor
está bastante alejado de cero.Además, su p-value (0.00000000000000022)
es inferior a 0.05, lo que indica que los residuos no siguen una
distribución normal.
El histograma muestra una alta concentración en el centro con
valores extremos, mientras que el gráfico Q-Q plot revela desviaciones
en las colas. Estos hallazgos confirman el test de Jarque-Bera,
rechazando la normalidad.
AUTO-ARIMA (0,1,0)
Al momento de aplicar el auto-arima, el modelo se ajusta un poco más
al gráfico, se nota que la serie estimada se asemeja más a la serie
original. En cuanto al test de Jarque Bera, los resultados del X-squared
(9670.1) un valor grande alejado de cero y su p-value
(0.00000000000000022) menor a 0,05, esto indica los errores no siguen
una distribución normal.
En el histograma se observa una gran cantidad residuos que se
encuentran muy cerca de cero, esto indica la existencia de valores
atípicos. En el Q-Q Plot los datos presentan distorsión en los extremos,
lo que indica que los residuos no se distribuyen de manera normal.
Pronóstico del modelo ARIMA (0,1,1):
Dado que ambos modelos no presentaron normalidad en los errores,
procedimos a realizar el pronóstico utilizando el modelo con menor
cantidad de rezagos, que fue el modelo ARIMA (0,1,1), éste modelo se usó
para pronosticar los valores de los próximos 5 meses. Éste muestra
valores estables que oscilan entre 226 y 230 de MWh, sin una tendencia
clara hacia el crecimiento o decrecimiento del consumo. En octubre de
2023, se espera un consumo de 227.8 MWh, con un intervalo entre 214.67
MWh y 240.95MWh, según el pronóstico se espera que este patrón se
mantenga en los meses de fin de año noviembre y diciembre, como también
se espera que la demanda de consumo tenga cierta tendencia al aumento a
principios del año 2024, por el inicio de la temporada de verano.