Cargar librerías

library(forecast)
library(dplyr)
library(readr)
library(plotly)

Levantar CSV Plots

demanda <- read_csv("AnalisisSeriesTemporales/datasets/demanda.csv", 
                        col_types = cols(Comercial = col_skip(), 
                                                   `Industrial/Comercial Grande` = col_skip(), 
                                                   Residencial = col_skip()))


names(demanda)=c('Fecha','Demanda')
demanda$Fecha <- as.Date(demanda$Fecha, "%Y-%m-%d")

Crear time series

ts_demanda <- ts(demanda$Demanda, start=c(2013, 1, 1), frequency = 12)

Analisis Exploratorio

plot_ly(data = demanda, x=~Fecha, y=~Demanda ,name='Demanda', type = 'scatter', mode = 'lines', line = list(color = 'steelblue') )

### Descomponer serie de tiempo

tmp1 <- stl(ts_demanda, s.window = "periodic")
stl_df <- as.data.frame(tmp1$time.series)
stl_df <-  bind_cols (stl_df, Fecha=demanda$Fecha, Demanda= demanda$Demanda)

ax <- list( showticklabels = FALSE)

p1 <- plot_ly(data=stl_df , x=~ Fecha,y=~Demanda ) %>% 
  add_lines(   name="Data") 

p2 <- plot_ly(data=stl_df , x=~ Fecha,y=~seasonal ) %>% 
  add_lines(   name="Seasonal") %>% layout(yaxis= ax)

p3 <- plot_ly(data=stl_df , x=~ Fecha,y=~trend ) %>% 
  add_lines(   name="Trend") %>% layout(yaxis= ax)

p4 <- plot_ly(data=stl_df , x=~ Fecha,y=~remainder, type = 'bar', name="Remainders") %>% 
  layout(yaxis= ax)

subplot(p1, p2, p3, p4, nrows = 4, shareX = T    )  %>% layout(title ="Series de Tiempo - Descomposición STL",legend = list(x = 100, y = 0.5))

Creamos dos modelos con HoltWinter usando distintos parámetros

1 - HW CON VALORES POR DEFECTO (alpha = NULL, beta = NULL, gamma = NULL, seasonal = “additive”)

# 1 - modelo por defecto (alpha = NULL, beta = NULL, gamma = NULL, seasonal = "additive") !!!
modelo_demanda_hw_1 <- HoltWinters(ts_demanda)

#obtengo la columna de ajuste
hw_fit_1 <- modelo_demanda_hw_1$fitted[,1]
demanda_hw_1 <- data.frame( "Fecha" = demanda$Fecha[13:nrow(demanda)], 
                       "Demanda" = demanda$Demanda[13:nrow(demanda)], 
                       "HoltWinters" = hw_fit_1)  

#plotear ambas series
  p5 <- plot_ly(data = demanda_hw_1, x=~Fecha, y=~Demanda ,name='Demanda', type = 'scatter', mode = 'lines', line = list(color = 'steelblue') ) %>% 
  add_trace(y = ~hw_fit_1 , name='HW-Default', mode='lines' ,line = list(color = 'green', width = 3)) %>% 
  layout(title = "METODO HOLT WINTERS - Additive, 0, 0, 0")

  
# 2 - Variación de parámetros (a = 1, b = 1, g = 1, seasonal = "multiplicative") !!!

modelo_demanda_hw_2 <- HoltWinters(ts_demanda, 
                            alpha = 1,
                            beta = 1,
                            gamma=1,
                            seasonal = "multiplicative")

#obtengo la columna de ajuste
hw_fit_2 <- modelo_demanda_hw_2$fitted[,1]
demanda_hw_2 <- data.frame( "Fecha" = demanda$Fecha[13:nrow(demanda)], 
                            "Demanda" = demanda$Demanda[13:nrow(demanda)], 
                            "HoltWinters" = hw_fit_2)  

#plotear ambas series
p6 <-   plot_ly(data = demanda_hw_2, x=~Fecha, y=~Demanda ,name='Demanda', type = 'scatter', mode = 'lines', line = list(color = 'steelblue') ) %>% 
  add_trace(y = ~hw_fit_2 , name='HW-Mult,1,1,1', mode='lines' ,line = list(color = 'green', width = 3)) %>% 
  layout(title = "METODO HOLT WINTERS - Multiplicative, 1, 1, 1")


#plotea todo
subplot(p5, p6, nrows = 2, shareX = T )  %>% layout(title ="HoltWinters",legend = list(x = 100, y = 0.5))
## [1] "Suma de los errores cuadráticos para HW por defecto:        16113514844683.6"
## [1] "Suma de los errores cuadráticos para HW con a=1, b=1 y g=1: 64186820632153"

Vemos que el modelo por default tiene mejor desempeño entonces separemos los datos en train y test (7 meses) y entrenemos el modelo :

 train <- demanda %>% filter(Fecha <= '2018-12-01')
 test <- demanda %>% filter(Fecha > '2018-12-01')
 train_ts <- ts(train$Demanda, start=c(2013, 1, 1), frequency = 12)
 
 modelo_hw_final <- HoltWinters(train_ts)

Predecimos sobre test

hw_forecast <- forecast(modelo_hw_final, h=7)
forecast_df <- data.frame( "Fecha" = test$Fecha, 
                           "Demanda" = test$Demanda, 
                           "HoltWinters" = (as.integer(hw_forecast$mean))  
                           )

plot_ly(data = forecast_df, x=~Fecha, y=~Demanda ,name='Demanda', type = 'scatter', mode = 'lines', line = list(color = 'steelblue') ) %>% 
    add_trace(y = ~HoltWinters , name='HoltWinters', mode='lines' ,line = list(color = 'green', width = 3)) %>% 
    layout(title = "METODO HOLT WINTERS")