1 Utilizando uma abordagem dividida em passos

Antes de iniciar a análise para o projeto Time-Series-Analysis, alguns importantes passos foram realizados para preparação da fonte de dados. Estes passos foram descritos a seguir:


2 Funções criadas

Para realização deste trabalho, algumas funções foram criadas para otimizar atividades e procedimentos repetitivos. Estas funções também podem, futuramente, serem reusadas em outros projetos ou mesmo serem adicionadas uma library R.

2.2 Funções de séries temporais

# this function will define all required dates for the time series, including 
# train and test periods based on the percentage desired to split these datasets
GetTimeSeriesDateParameters <- function (target_base_date, percentage){

  split_index <- round(length(target_base_date) * percentage)
  
  parameters <- list()
  parameters$start       <- c(as.numeric(format(as.Date(min(target_base_date), format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(min(target_base_date), format="%d/%m/%Y"),"%m")))
  parameters$end         <- c(as.numeric(format(as.Date(max(target_base_date), format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(max(target_base_date), format="%d/%m/%Y"),"%m")))
  parameters$start_year  <-   as.numeric(format(as.Date(min(target_base_date), format="%d/%m/%Y"),"%Y"))
  parameters$end_year    <-   as.numeric(format(as.Date(max(target_base_date), format="%d/%m/%Y"),"%Y"))
  parameters$train_start <- c(as.numeric(format(as.Date(min(target_base_date), format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(min(target_base_date), format="%d/%m/%Y"),"%m")))
  parameters$train_end   <- c(as.numeric(format(as.Date(target_base_date[split_index], format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(target_base_date[split_index], format="%d/%m/%Y"),"%m")))
  parameters$test_start  <- c(as.numeric(format(as.Date(target_base_date[split_index + 1], format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(target_base_date[split_index + 1], format="%d/%m/%Y"),"%m")))
  parameters$test_end    <- c(as.numeric(format(as.Date(max(target_base_date), format="%d/%m/%Y"),"%Y")),
                              as.numeric(format(as.Date(max(target_base_date), format="%d/%m/%Y"),"%m")))
  parameters$test_sample_size <- length(target_base_date) - split_index
  
  return(parameters)
}
}

2.4 Funções de modelos lineares

# this function generates and saves all linear time series models to the
# model's directory for later consuming
GenerateLinearTimeSeriesModels <- function (train_ts, 
                                            test_ts, 
                                            test_sample_size, number_of_periods_for_forecasting = 6) {
  
  max_ylim <-  max(train_ts, test_ts)
  
  # Tendência Linear
  model_trend <- RunLinearTimeSeriesModel(train_ts,
                                          test_ts,
                                          formula_train = "train_ts ~ trend",
                                          formula_final = "target_ts ~ trend", 
                                          test_sample_size,
                                          number_of_periods_for_forecasting = 
                                            number_of_periods_for_forecasting,
                                          title = "ts_linear_model_trend")
  saveRDS(model_trend, paste0('../models/', model_trend$title,'.rds'))
  SaveFitPlot(model_trend, max_ylim)
  
  # Tendência Quadrática
  model_trend_square <- RunLinearTimeSeriesModel(train_ts,
                                                 test_ts,
                                                 formula_train = "train_ts ~ trend + I(trend^2)", 
                                                 formula_final = "target_ts ~ trend + I(trend^2)", 
                                                 test_sample_size,
                                                 number_of_periods_for_forecasting = 
                                                   number_of_periods_for_forecasting,
                                                 title = "ts_linear_model_trend_square")
  saveRDS(model_trend_square, paste0('../models/', model_trend_square$title,'.rds'))
  SaveFitPlot(model_trend_square, max_ylim)

  # Sazonalidade
  model_season <- RunLinearTimeSeriesModel(train_ts,
                                           test_ts,
                                           formula_train = "train_ts ~ season", 
                                           formula_final = "target_ts ~ season", 
                                           test_sample_size,
                                           number_of_periods_for_forecasting = 
                                             number_of_periods_for_forecasting,
                                           title = "ts_linear_model_season")
  saveRDS(model_season, paste0('../models/', model_season$title,'.rds'))
  SaveFitPlot(model_season, max_ylim)
  
  # Tendência Linear com Sazonalidade
  model_trend_season <- RunLinearTimeSeriesModel(train_ts,
                                                 test_ts,
                                                 formula_train = "train_ts ~ trend + season", 
                                                 formula_final = "target_ts ~ trend + season", 
                                                 test_sample_size,
                                                 number_of_periods_for_forecasting = 
                                                   number_of_periods_for_forecasting,
                                                 title = "ts_linear_model_trend_season")
  saveRDS(model_trend_season, paste0('../models/', model_trend_season$title,'.rds'))
  SaveFitPlot(model_trend_season, max_ylim)
  
  # Tendência Quadrática com Sazonalidade
  model_trend_square_season <- RunLinearTimeSeriesModel(train_ts,
                                                        test_ts,
                                                        formula_train = "train_ts ~ season + trend + I(trend^2)", 
                                                        formula_final = "target_ts ~ season + trend + I(trend^2)", 
                                                        test_sample_size,
                                                        number_of_periods_for_forecasting = 
                                                          number_of_periods_for_forecasting,
                                                        title = "ts_linear_model_trend_square_season")
  saveRDS(model_trend_square_season, paste0('../models/', model_trend_square_season$title,'.rds'))
  SaveFitPlot(model_trend_square_season, max_ylim)
  
  # performing result's consolidation
  consolidation <- tibble(Model = character(), MAPE_Train = numeric(), MAPE_Test = numeric())
  
  consolidation <-  add_row(consolidation, 
                            Model = model_trend$title, 
                            MAPE_Train = model_trend$accuracy["Training set",'MAPE'],
                            MAPE_Test = model_trend$accuracy["Test set",'MAPE'])
  
  consolidation <-  add_row(consolidation,
                            Model = model_trend_square$title, 
                            MAPE_Train = model_trend_square$accuracy["Training set",'MAPE'],
                            MAPE_Test = model_trend_square$accuracy["Test set",'MAPE'])
  
  consolidation <-  add_row(consolidation,
                            Model = model_season$title, 
                            MAPE_Train = model_season$accuracy["Training set",'MAPE'],
                            MAPE_Test = model_season$accuracy["Test set",'MAPE'])
  
  consolidation <-  add_row(consolidation,
                            Model = model_trend_season$title, 
                            MAPE_Train = model_trend_season$accuracy["Training set",'MAPE'],
                            MAPE_Test = model_trend_season$accuracy["Test set",'MAPE'])
  
  consolidation <-  add_row(consolidation,
                            Model = model_trend_square_season$title, 
                            MAPE_Train = model_trend_square_season$accuracy["Training set",'MAPE'],
                            MAPE_Test = model_trend_square_season$accuracy["Test set",'MAPE'])
  
  return(consolidation)
}```

## Funções de suavização (MA)

2.5 Funções de suavização exponencial