Serie de Tiempo consumo electrico

En este ejercicio buscaremos predecir el consumo electrico de Turquia, la base brinda los datos cada hora, durante el 31 de diciembre del 2015 hasta septiembre del 2020. Se usarán métodos como Holt-Winters, Arima y Redes Neuronales para encontrar una predicción del consumo electrico. Luego de realizar diferentes pruebas nos damos cuenta que el método ARIMA es el que arroja mejores resultados y con base a este hacemos las predicciones. La base de datos se obtuvo del sitio : https://www.kaggle.com/

Lectura de datos

Primero cargamos los datos, inicialmente tenemos las fechas separados, por lo cual lo agrupamos para tenerlo en una única columna.

## 'data.frame':    41232 obs. of  2 variables:
##  $ Date             : POSIXct, format: "2015-12-31 00:00:00" "2015-12-31 01:00:00" ...
##  $ Consumption..MWh.: num  29591 27785 26517 26092 25872 ...

Ahora un proceso fundamental en series de tiempos es revisar que en ningún momento dicha serie tenga vacios o datos nulos, por lo que una revisión de que todas las fechas tengan un dato es lo primero que debemos considerar.

## [1] "2016-03-27 03:00:00 CST"

Observamos que falta una fecha, por lo que pondremos el promedio de las últimas 48 horas, pues si tomamos el promedio general, puede ser un dato brusco en el análisis. Adicionalmente la serie de tiempo cuenta con varios valores de 0, lo cual puede deberse a fallos eléctricos generales o algún error, por lo cual estos valores tomares el mismo suavizado.

Ahora dado que el calculo por hora requiere un alto consumo computacional dado que contamos con más de 40 mil datos, por facilidad de resultados vamos agrupar nuestro analisis a un formato diario, es decir sumaremos lo consumido por día. Esto es únicamente con fines computacionales, pero eventualmente si se requiere más precisión con el consumo por hora, se podría realizar.

Ahora veamos graficamente como se comporta la serie.

Antes de iniciar con la propia creación de los modelos, veamos el cumplimiento de supuestos, esto es más que todo para métodos como ARIMA, que parte de sus supuestos requieren normalidad en la diferencia de la serie.

pearson.test(diff(serie))$p.value
## [1] 5.219748e-171
lillie.test(diff(serie))$p.value
## [1] 6.392955e-75

Tanto a nivel visual como a nivel de pruebas estadísticas obtenemos que se rechaza la hipotesis de normalidad, esto podría afectar eventualmente posibles resultados, pero aún así continuamos a la construcción de modelos.

Ahora a nuestra serie de tiempo la separamos en los diferentes componentes que tiene una serie, como lo son la tendencia, la estacionalidad y un movimiento aleatorio. En el siguiente gráfico, si por ejemplo nuestra data y el movimiento aleatorio tuvieran el mismo comportamiento esto nos daría un indicio que las predicciones no serán muy precisas.

Notamos como si se logra ver una estacionalidad clara, hay una tendencia a que cierto tiempo el consumo sube, luego baja, luego vuelve a subir pero no al mismo nivel que la primera vez y luego se vuelve a repetir este ciclo.

Ahora analizemos la periocidad de nuestra serie.

## [1] 192.000000   6.995951 172.800000

Vemos como mejor periodo se ajusta a las 192 dias o los 7 dias, vamos a tomar el periodo de 7 dias, esto solamente por facilidad de interpretación.

ARIMA

#auto.arima(serie.train)

Los resultados del auto arima arroja lo siguiente:

#Series: serie.train 
#ARIMA(5,1,2) 
#Coefficients:
#         ar1      ar2      ar3      ar4      ar5      ma1     ma2
#      0.0885  -0.6879  -0.2704  -0.2725  -0.5313  -0.3998  0.6290
#s.e.  0.0368   0.0220   0.0265   0.0208   0.0255   0.0474  0.0195
#sigma^2 = 1.741e+09:  log likelihood = -20327.34
#AIC=40670.69   AICc=40670.77   BIC=40714.13

Ahora aplicamos una calibración a fuerza computacional para encontrar un mejor modelo ARIMA, este nos arroja el siguiente resultado

#calibrar.arima(serie.train, serie.test, periodo = 7)

#Call:
#arima(x = datos, order = c(3, 0, 0), seasonal = list(order = c(0, 1, 0), period = 7))

#Coefficients:
#         ar1      ar2      ar3
#      1.0951  -0.2112  -0.1188
#s.e.  0.0243   0.0360   0.0245

#sigma^2 estimated as 997420726:  log likelihood = -19789.96,  aic = 39587.93

Holt-Winters

Al igual que con ARIMA, aplicamos el método brindado por R, pero también aplicamos fuerza computacional y así encontrar el mejor modelo Holt-Winters.

## Holt-Winters exponential smoothing without trend and without seasonal component.
## 
## Call:
## HoltWinters(x = datos, alpha = 0.3, beta = FALSE, gamma = FALSE)
## 
## Smoothing parameters:
##  alpha: 0.3
##  beta : FALSE
##  gamma: FALSE
## 
## Coefficients:
##       [,1]
## a 910442.6

Redes Neuronales

Aqui aplicamos el paquete brindado por R de forecast, que usa la función Nnetar, adicionalmente indicamos 5 nodos. Esto último se puede modificar, pero luego de probar varios nodos, encontramos 5 como el más óptimo.

modelo.redes <- nnetar(serie.train, size = 5)
pred.redes <- predict(modelo.redes, h = 30, PI = T)

Tabla y gráfico de errores

Ahora hagamos una comparación con todos los métodos utilizados, recordemos que buscamos reducir el MSE, tener la correlación más cercana a 1 y el error relativo más bajo.

##                           MSE     RMSE         RE      CORR
## AUTO.ARIMA         1668421462 40846.32 0.03031724 0.7416341
## ARIMA FUERZA BRUTA  149502696 12227.13 0.01019876 0.9710208
## HOLT-WINTERS       4042762184 63582.72 0.05749640 0.1730538
## HW FUERZA BRUTA    2312567770 48089.16 0.03738585        NA
## REDES              3680587001 60667.84 0.05542793 0.7043147

No cabe duda que el modelo encontrado a fuerza computacional por ARIMA es el que mejores resultados arroja.

Gráfico de predicción

Ahora gráficamente vemos un comportamiento interesante, solamente los métodos ARIMA logran captar esa tendencia de estar subiendo y bajando de manera perfecta. Vemos como el método de ARIMA encontrado de manera tradicional, subestima de gran manera esas bajadas de consumo.

Conclusiones

En este trabajo encontramos resultados interesantes usando modelos relacionados con series de tiempo. La más importante es como al confiar en la fuerza computacional, uno podría mejorar de gran manera los resultados encontrados con las funciones que trae por defecto R. Otra cosa importante es siempre utilizar todo los modelos posibles, pues a priori no sabemos cual modelo es mejor, teóricamente uno podría pensar que un método es superior a otros, pero en ejemplos prácticos no siempre es así y por eso debemos utilizar todo lo posible y aprovechar el poder computacional a nuestro favor.