Analise de Séries Temporais
IMPORTAÇÃO DOS DADOS
EXPLICAÇÃO
tictoc::tic()
dados_br <- readr::read_csv2(file='https://dadosabertos.aneel.gov.br/dataset/5e0fafd2-21b9-4d5b-b622-40438d40aba2/resource/b1bd71e7-d0ad-4214-9053-cbd58e9564a7/download/empreendimento-geracao-distribuida.csv',
col_types = readr::cols(MdaPotenciaInstaladaKW = readr::col_number()),
locale = readr::locale(decimal_mark = ',', grouping_mark = '.'))
dados_br <- janitor::clean_names(dados_br)
tictoc::toc()## 508.8 sec elapsed
Selecionando as variáveis de interesse referente ao dados de geração distribuida
CRIANDO AS SÉRIES TEMPORAIS
EXPLICAÇÃO
Criando as séries mensais da potência acumulada, número de istalações acumulada e unidades que recebem crédito acumulada, com a abrangência nacional.
library(magrittr)
library(dplyr)
library(lubridate)
# Conversão da coluna de datas
dados_br$dth_atualiza_cadastral_empreend <- as.Date(dados_br$dth_atualiza_cadastral_empreend)
# Processar dados
dados_br_mensal <- dados_br %>%
dplyr::select(dth_atualiza_cadastral_empreend,
mda_potencia_instalada_kw,
qtd_uc_recebe_credito) %>%
dplyr::group_by(dth_atualiza_cadastral_empreend) %>%
dplyr::summarise(potencia = sum(mda_potencia_instalada_kw),
unidades_recebem_credito = sum(qtd_uc_recebe_credito),
count = n()) %>%
dplyr::ungroup() %>%
dplyr::mutate(potencia_acumulada = cumsum(potencia),
unidades_recebem_credito_acu = cumsum(unidades_recebem_credito),
numero_de_instalacoes_acumuladas = cumsum(count)) %>%
dplyr::mutate(ref_data = as.Date(paste0(year(dth_atualiza_cadastral_empreend), '-', month(dth_atualiza_cadastral_empreend), '-01'))) %>%
dplyr::group_by(ref_data) %>%
dplyr::summarise(potencia_acumulada = last(potencia_acumulada),
unidades_recebem_credito_acu = last(unidades_recebem_credito_acu),
numero_de_instalacoes_acumuladas = last(numero_de_instalacoes_acumuladas)) %>%
dplyr::ungroup() %>%
dplyr::select(ref_data,
potencia_acumulada ,
unidades_recebem_credito_acu,
numero_de_instalacoes_acumuladas) %>%
dplyr::mutate(log_potencia = ifelse(potencia_acumulada > 0, log(potencia_acumulada), NA),
log_credito = ifelse(unidades_recebem_credito_acu > 0, log(unidades_recebem_credito_acu), NA),
log_instalacoes = ifelse(numero_de_instalacoes_acumuladas > 0, log(numero_de_instalacoes_acumuladas), NA))
# Visualizar os primeiros registros do resultado
head(dados_br_mensal)## # A tibble: 6 × 7
## ref_data potencia_acumulada unidades_recebem_credit…¹ numero_de_instalacoe…²
## <date> <dbl> <dbl> <int>
## 1 2009-06-01 8.2 1 1
## 2 2009-09-01 187. 24 22
## 3 2009-10-01 197. 25 23
## 4 2010-03-01 227. 26 24
## 5 2010-04-01 228. 27 25
## 6 2010-08-01 234. 29 26
## # ℹ abbreviated names: ¹unidades_recebem_credito_acu,
## # ²numero_de_instalacoes_acumuladas
## # ℹ 3 more variables: log_potencia <dbl>, log_credito <dbl>,
## # log_instalacoes <dbl>
GRÁFICOS DAS SÉRIES
EXPLICAÇÃO
Construindo os gráficos da geração distribuida para o Brasil :
library(magrittr)
library(ggplot2)
grafico_potencia_acumulada_br <-dados_br_mensal %>%
ggplot() +
geom_line(mapping = aes(x = ref_data,
y = potencia_acumulada,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Potência Acumulada: ",
scales::number(potencia_acumulada,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#07020D",
size = 0.5,
linetype = 1) +
geom_point(mapping = aes(x = ref_data,
y =potencia_acumulada,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Potência Acumulada: ",
scales::number(potencia_acumulada,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#3E4F5D",
size = 0.1,
linetype = 1) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(title = 'Serie Temporal Da Potência Acumulada - Brasil - Mensal',
subtitle = 'Número Toral',
x = 'Data',
y = 'kWp')
plotly::ggplotly(grafico_potencia_acumulada_br,tooltip = "text")Fazendo o gráfico referente ao Número de Instalações:
library(magrittr)
library(ggplot2)
grafico_numero_istalacoes_acumulada_br<- dados_br_mensal %>%
ggplot() +
geom_line(mapping = aes(x = ref_data,
y = numero_de_instalacoes_acumuladas,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Número de de Intalaçoes Acumulada: ",
scales::number(numero_de_instalacoes_acumuladas,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#07020D",
size = 0.5,
linetype = 1) +
geom_point(mapping = aes(x = ref_data,
y =numero_de_instalacoes_acumuladas,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Número de de Instalações Acumulada: ",
scales::number(numero_de_instalacoes_acumuladas,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#3E4F5D",
size = 0.1,
linetype = 1) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(title = 'Série Do Número de de Instalações Acumulada - Brasil- Mensal',
subtitle = 'Número Toral',
x = 'Data',
y = 'Número Total')
plotly::ggplotly(grafico_numero_istalacoes_acumulada_br,tooltip = "text")Fazendo o gráfico referente ao Número de Unidades que Recebem Crédito Mensal
library(magrittr)
library(ggplot2)
grafico_unidades_recebem_credito_acumulada_br<- dados_br_mensal %>%
ggplot() +
geom_line(mapping = aes(x = ref_data,
y = unidades_recebem_credito_acu,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Número de Unidades que Recebem Crédito Acumulada: ",
scales::number(unidades_recebem_credito_acu,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#07020D",
size = 0.5,
linetype = 1) +
geom_point(mapping = aes(x = ref_data,
y = unidades_recebem_credito_acu,
group = 1,
text = paste0("Data: ",
format(ref_data, "%d-%m-%Y"),
"<br> ","Número de Unidades que Recebem Crédito Acumulada: ",
scales::number(unidades_recebem_credito_acu,
accuracy =1 ,
decimal.mark = ',',
big.mark = '.'))),
color = "#3E4F5D",
size = 0.1,
linetype = 1) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(title = 'Série Da Quantidade de Unidades que Recebem Cédito Acumulada - Brasil- Mensal',
subtitle = 'Número Toral',
x = 'Data',
y = 'Número Total')
plotly::ggplotly( grafico_unidades_recebem_credito_acumulada_br,tooltip = "text")Trasforamando os dados em séries temporais, iremos trabalhar com os dados `a partir de 2015, pois é quando temos novos dados todos os meses.
MODELO DE HOLT
EXPLICAÇÃO
Rodando os modelos de Holt(série apenas com tendência) para as princiapais variáveis
library(forecast)
# Para a variável Potência Acumulada :
holt_potencia <- HoltWinters(dados_br_st$potencia_acumulada, gamma = FALSE)
plot(holt_potencia) # Gráfico das previsões:
fcast_holt_potencia <- forecast(holt_potencia)
autoplot(x =dados_br_st$ref_data,forecast(holt_potencia, h =12))+
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = " Potência Instalada Acumulada(Kw/h)",
title = "Previsão para a Potência Instalada Acumulada") ## ME RMSE MAE MPE MAPE MASE
## Training set 9628.987 28815.93 13835.32 0.8650939 2.604853 0.009878903
## ACF1
## Training set 0.06044604
# Para a variável Núemro de Instalações Acumulada:
holt_instalacoes <- HoltWinters(dados_br_st$numero_de_instalacoes_acumuladas, gamma = FALSE)
plot(holt_instalacoes) # Gráfico das previsões:
fcast_holt_instalacoes <- forecast(holt_instalacoes )
autoplot(x =dados_br_st$ref_data,forecast(holt_instalacoes , h =12))+
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = " Número de Instalaçoes Acumulada",
title = "Previsão para o Número de Instalaçoes Acumulada") ## ME RMSE MAE MPE MAPE MASE
## Training set 752.539 2957.284 1380.443 0.8923195 1.671878 0.01091528
## ACF1
## Training set -0.02723011
# Para a variável Unidades que Recebem Crédito Acumulada:
holt_credito <- HoltWinters(dados_br_st$unidades_recebem_credito_acu , gamma = FALSE)
plot(holt_credito) # Gráfico das previsões:
fcast_holt_credito <- forecast(holt_credito)
autoplot(x =dados_br_st$ref_data,forecast(holt_credito, h =12))+
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = "Número de Unidades que Recebem Crédito Acumulada",
title = "Previsão para o Número Unidades que Recebem Crédito") ## ME RMSE MAE MPE MAPE MASE
## Training set 1150.202 5299.038 2552.741 0.9612625 2.084086 0.01360287
## ACF1
## Training set -0.04639439
MODELO DE RNA - FEED-FORWARD
EXPLICAÇÃO
Testando um modelo de previsão RNA para as variáveis:
library(forecast)
#Para a variável Potência Instaltada:
fit_rna_potencia <- nnetar(dados_br_st$potencia_acumulada)
fcast_rna_potencia <- forecast(fit_rna_potencia)
autoplot(forecast(fit_rna_potencia, h =12)) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = "Potência Instalada Acumulada(Kw/h)",
title = "Previsão para a Potência Instalada Acumulada")## ME RMSE MAE MPE MAPE MASE
## Training set -133.286 18237.94 10784.85 -9.31372 9.777396 0.007700758
## ACF1
## Training set -0.02696085
# Para a variável Núemro de Instalações Acumulada:
fit_rna_instalacoes <- nnetar(dados_br_st$numero_de_instalacoes_acumuladas)
fcast_rna_instalacoes <- forecast(fit_rna_instalacoes)
autoplot(forecast(fit_rna_potencia, h =12)) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = "Número de Instalaçoes Acumulada",
title = "Previsão para o Número de Instalaçoes Acumulada")## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 7.643359 2147.658 1285.411 -18.30442 19.01892 0.01016386 0.2204762
# Para a variável Unidades que Recebem Crédito Acumulada:
fit_rna_credito <- nnetar(dados_br_st$unidades_recebem_credito_acu )
fcast_rna_credito <- forecast(fit_rna_credito)
autoplot(forecast(fit_rna_credito, h =12)) +
scale_y_continuous(labels = scales::number_format(accuracy = 1,
decimal.mark = ',',
big.mark = '.')) +
labs(x = "Ano", y = "Número de Unidades que Recebem Crédito Acumulada",
title = "Previsão para o Número de Unidades que Recebem Crédito Acumulada")## ME RMSE MAE MPE MAPE MASE
## Training set -0.5148085 3683.755 2092.705 -22.83939 23.78226 0.01115147
## ACF1
## Training set 0.06220853