Caso de estudio 5
Análisis de series de tiempo: Variación anual en la generación de energías renovables
En el presente caso de estudio se analizará como varía el cambio con respecto a la generación de energías renovables anualmente en México, para ello se realizará un análisis de series de tiempo en base a los datos obtenidos de “Our World in Data” y con estos se intentará predecir como es que estos se podrían comportar en un futuro cercano, creando un modelo independiente de los datos en base a los datos reales. Para ello se utilizarán los modelos ARIMA o SARIMA dependiendo de la estacionalidad de los datos en cuestión.
Energías renovables
Paquetes
library(pacman)
p_load("tidyverse", "lubridate", "forecast", "TTR", "MLmetrics", "tseries", "fpp", "TSstudio", "xfun")
Pre procesamiento de datos
Se importará el conjunto de datos que nos dice la variación anual en la generación de energías renovable. Estos datos son obtenidos del sitio ‘Our World in Data’, donde hay una gran cantidad de bases de datos de muchos paises, pero en este caso tomamos los datos de ‘Annual change in renewable energy generation’.
También filtramos los datos para obtener solamente los datos de México.
datos <- read.csv("annual-change-renewables.csv")
datosMexico <- filter(datos, datos$Entity == "Mexico")
Importando datos de variación en generación de energías en México de 1966 a 2019
En este espacio se realiza una serie del tiempo que va desde el año 1966 al 2019, donde la cantidad de teravatios (TW) por hora varía de forma constante como se puede apreciar en la grafica.
datosEnergia= ts(datosMexico$Renewables, start = c(1966), end = c(2019), frequency = 2)
plot(datosEnergia, main ="Variación anual en la generación de energías renovables", xlab="Año", ylab="TWh")
Verificar si existen datos faltantes
anyNA(datosEnergia)
## [1] FALSE
Esto quiere decir que no hay datos faltantes.
Decomponer una serie de tiempo en sus partes principales
datosEnergia_dc <- datosEnergia %>%
decompose(type = "multiplicative") %>%
autoplot()
datosEnergia_dc
División de los datos para validación cruzada
test_Energia <- tail(datosEnergia, 10) #20% para pruebas
train_Energia <- head(datosEnergia, length(datosEnergia)-10) #80% para entrenamiento
Ajuste del modelo - Holt-Winters
Según el resultado de descomposición, los datos de los cambios en las energías renovables tienen una tendencia y estacionalidad.
Debido a esto, a continuación se realizara una optimización exponencial de Holt-Winters con tendencia y componente estacional multiplicativo.
energia_ses <- HoltWinters(train_Energia, seasonal = "multiplicative",)
## Warning in HoltWinters(train_Energia, seasonal = "multiplicative", ):
## optimization difficulties: ERROR: ABNORMAL_TERMINATION_IN_LNSRCH
energia_ses
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = train_Energia, seasonal = "multiplicative")
##
## Smoothing parameters:
## alpha: 0.2999959
## beta : 0.1000123
## gamma: 0.1000123
##
## Coefficients:
## [,1]
## a -0.62371316
## b -0.05701795
## s1 25.39949948
## s2 -22.94420966
Forecasting
energia_forecast <- forecast(object = energia_ses, h = 8)
Visualizando resultados
datosEnergia %>%
autoplot(series = "Datos reales") +
autolayer(energia_forecast$fitted, series = "Datos de entrenamiento") +
autolayer(energia_forecast$mean, series = "Datos de prueba") +
theme_minimal()
## Warning: Removed 2 row(s) containing missing values (geom_path).
Evaluar la precisión del modelo
eval_ses <- accuracy(energia_forecast, test_Energia)
eval_ses
## ME RMSE MAE MPE MAPE MASE
## Training set 1.5361783 16.39795 11.82929 507.7006 585.8764 0.8304925
## Test set 0.1915736 17.49300 16.62951 -176.3348 292.7458 1.1674992
## ACF1 Theil's U
## Training set -0.2226714 NA
## Test set -0.3520285 1.947473
De acuerdo con el análisis de precisión tenemos un error medio de: 292.7
Utilizando el modelo SARIMA o ARIMA
Los modelos SARIMA captan el comportamiento puramente estacional de una serie, en forma similar, como hemos visto, se realiza para la componente regular o no estacional. Una serie con influencia solamente por la componente estacional puede ser descrito por un modelo SARIMA.
Empezamos haciendo una prueba al conjunto de datos:
Esta prueba (dickey-fuller) sirve para en función del valor de P, determinar si los datos SON o NO SON estacionarios.
adf.test(datosEnergia)
## Warning in adf.test(datosEnergia): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: datosEnergia
## Dickey-Fuller = -6.3293, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
De acuerdo con esta prueba los datos NO son estacionarios.
Análisis de diferencial entre ciclos (estaciones)
energia_diff <- datosEnergia %>%
diff(lag=10) %>%
diff(lag=1)
energia_diff %>%
autoplot()
Análisis de la serie de tiempo por medio de un modelo SARIMA
energia_auto <- auto.arima(y= train_Energia, seasonal = T)
summary(energia_auto)
## Series: train_Energia
## ARIMA(1,0,0)(1,0,0)[2] with non-zero mean
##
## Coefficients:
## ar1 sar1 mean
## -0.5666 -0.5109 2.2394
## s.e. 0.0923 0.0934 0.4198
##
## sigma^2 = 96.63: log likelihood = -358.14
## AIC=724.29 AICc=724.72 BIC=734.59
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.01730181 9.676745 7.0043 67.8721 92.30666 0.4917471 0.03564477
Visualizando la grafica de resultados de datos reales versus las predicciones (forecasting) del modelo SARIMA
train_Energia %>%
autoplot(series="Datos reales") +
autolayer(energia_auto$fitted, series ="SARIMA auto") +
theme_minimal()
Conclusión
Cuando hablamos de los datos reales relacionados con la variación anual en la generación de las energías renovables, podemos ver que en realidad no existe un patrón muy explícito, sino que más bien se pueden ver subidas y bajadas bastante abruptas como si se tratase de unas pulsaciones. Quizá esto se puede deber a que los recursos eólicos, solares e hídricos son variables por naturaleza, y provoca que los gobiernos o empresas mejor inviertan en las energías tradicionales. Esta variabilidad causa que a la hora de realizar el modelo predictivo, obtengamos una gráfica algo similar, pero no una que nos permita predecir con certeza como se comportara la variación en años venideros; sin embargo, si nos da una idea de como podría ser el comportamiento, debido a que se basa en el patrón.
Descarga del código
xfun::embed_file("A10U1.Rmd")
Descarga los datos
xfun::embed_file("annual-change-renewables.csv")