Usando IA para prever o consumo de energia no Brasil com Python

Neste exemplo mostramos o poder da IA, especificadamente o uso de modelos de Machine Learning de Séries Temporais, para prever os valores da Curva de Carga Horária de Energia Elétrica do Sudeste disponibilizada pela ONS. Para realizar as previsões, além dos modelos, empregamos métodos de machine learning já conhecidos, como cross-validation, usando a biblioteca MlForecast do Python.

Introdução

Algumas séries temporais são geradas a partir de dados de frequência muito baixa. Esses dados geralmente exibem múltiplas sazonalidades. Por exemplo, dados horários podem exibir padrões repetidos a cada hora (a cada 24 observações) ou a cada dia (a cada 24 * 7, horas por dia, observações). Esse é o caso da carga elétrica. A carga elétrica pode variar por hora, por exemplo, durante as noites, no Brasil, espera-se uma queda no consumo de eletricidade. Mas também, a carga elétrica varia por semana. Talvez no caso brasileiro, fins de semana haja uma queda na atividade elétrica.

Outro aspecto crucial a ser observado em séries temporais de carga de energia é a tendência. No contexto brasileiro, observa-se claramente uma tendência ascendente, em grande parte devido ao contínuo crescimento econômico do país.

Quando lidamos com séries temporais que exibem tais padrões, torna-se imperativo empregar modelos capazes de identificá-los com precisão. Modelos de Machine Learning voltados para análise de Séries Temporais, como LightGBM ou até mesmo Prophet, destacam-se como as opções mais adequadas para abordar esses cenários complexos.

Portanto, neste exercício criamos diferentes modelos com a biblioteca MLForecast, usando como features valores da própria série para prever a carga de energia elétrica.

Para obter o código e o tutorial deste exercício faça parte do Clube AM e receba toda semana os códigos em R/Python, vídeos, tutoriais e suporte completo para dúvidas.

Bibliotecas

Neste exemplo, utilizaremos as seguintes bibliotecas:

  • mlforecast. Previsões precisas e rápidas com modelos clássicos de aprendizado de máquina.
  • utilsforecast. Biblioteca com diferentes funções para avaliação de previsões.

Dados

Utilizamos os dados de Carga Horária de Eletricidade Nacional do Sudeste medido pela ONS (em MW). Os valores estão em periodicidade horária, de Jan/2000 até Dez/2023.

Código
ds unique_id y
0 2000-01-01 00:00:00 SUDESTE 21183.000
1 2000-01-01 01:00:00 SUDESTE 20409.900
2 2000-01-01 02:00:00 SUDESTE 19787.400
3 2000-01-01 03:00:00 SUDESTE 19089.000
4 2000-01-01 04:00:00 SUDESTE 18589.100
... ... ... ...
210365 2023-12-31 19:00:00 SUDESTE 45826.886
210366 2023-12-31 20:00:00 SUDESTE 44883.742
210367 2023-12-31 21:00:00 SUDESTE 41328.082
210368 2023-12-31 22:00:00 SUDESTE 38135.522
210369 2023-12-31 23:00:00 SUDESTE 36060.076

210370 rows × 3 columns

Observamos claramente que a série temporal exibe padrão sazonal, bem com há também um claro padrão de tendência. A série possui 210370 observações.

Vamos dividir nossa série para criar um conjunto de treinamento e teste. O modelo será testado usando as últimas 24 horas da série temporal.

Analisando Tendência e Sazonalidades

Primeiro, devemos visualizar a tendência e as sazonalidades do modelo. Como mencionado anteriormente, a carga elétrica apresenta sazonalidades a cada 24 horas (por hora) e a cada 24 * 7 (diariamente) horas. Portanto, usaremos [24, 24 * 7] como as sazonalidades para o modelo. No caso da tendência, supomos que possamos lidar com esse componente através da primeira diferença.

Como podemos ver, ao extrair a diferença de 1 em SUDESTE_1 a série parece estar limpa da tendência. Em relação a sazonalidade usamos 24 (diariamente) em SUDESTE_1_24, e a série parece estabilizar, pois os picos parecem mais uniformes em comparação com a série original SUDESTE.

Quando extraímos a diferença de 24 * 7 (semanal) em SUDESTE_168, podemos ver que há mais periodicidade nos picos em comparação com a série original.

Finalmente, podemos ver o resultado combinado da subtração de todas as diferenças SUDESTE_all_diff.

Para a modelagem, vamos usar todas as diferenças para a previsão, portanto, estamos configurando o argumento target_transforms do objeto MLForecast igual a [Differences([1, 24, 24*7])].

Seleção de Modelo com cross-validation

Podemos testar vários modelos simultâneamente usando MLForecast com o método de cross_validation. Importamos diferentes modelos (Lasso, LinearRegression, Ridge, KNN, MLP e Random Forest, juntamente com o LightGBM) e realizamos a combinação deles, conjuntamente com diferentes transformações do variável resposta (tal como criamos anteriormente).

Podemos criar um modelo de referência ingênuo que utiliza a carga elétrica da última hora como atraso de previsão (lag1).

Como features adicionais, usamos a 1, 12 e 24 defasagens, medidas de suavização com média, e as datas.

Agora plotamos cada modelo e a janela (fold do CV) para verificar os seus respectivos comportamentos.

Métricas de Acurácia

Examinar visualmente as previsões pode nos dar alguma ideia de como o modelo está se comportando, mas para avaliar o desempenho, precisamos avaliá-las por meio de métricas. Para isso, usamos a biblioteca utilsforecast, que contém muitas métricas úteis e uma função de avaliação.

Verificamos que os melhores modelos nesse caso foram LGBM e RandomForest.

Conjunto de Teste

Agora vamos comparar os dados previsto do conjunto de treinamento no conjunto de teste, de forma a compreender qual modelo melhor realizou a previsão. Adicionamos intervalos de confiança para cada previsão.

Na matriz abaixo temos as métricas de erros para o conjunto de teste. Vemos que novamente LGBM e RandomForest apresentaram as melhores medidas de acurácia.

O gráfico abaixo também auxilia na compreensão dos resultados.

Quer aprender mais?

Clique aqui para fazer seu cadastro no Boletim AM e baixar o código que produziu este exercício, além de receber novos exercícios com exemplos reais de análise de dados envolvendo as áreas de Data Science, Econometria, Machine Learning, Macroeconomia Aplicada, Finanças Quantitativas e Políticas Públicas diretamente em seu e-mail.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise do Censo Demográfico com o R

Como podemos analisar dados do Censo Demográfico para produzir pesquisas e implementar políticas públicas? Mostramos nesta postagem o resultado de uma breve análise dos dados preliminares do Censo Demográfico de 2022 usando o R.

Deploy de modelos com Python + Shinylive + GitHub gastando ZERO reais

Colocar modelos em produção pode ser um grande desafio. Lidar com custos monetários, infraestrutura operacional e complexidades de códigos e ferramentas pode acabar matando potenciais projetos. Uma solução que elimina todos estes obstáculos é a recém lançada Shinylive. Neste artigo mostramos um exemplo com um modelo de previsão para o preço do petróleo Brent.

Como automatizar tarefas repetitivas usando Python? Um exemplo para largar o Excel

Manter relatórios diários com dados e análises atualizados é um desafio, pois envolve várias etapas: coleta de dados, tratamento de informações, produção de análises e atualização de relatório. Para superar este desafio algumas ferramentas como Python + Quarto + GitHub podem ser usadas para automatizar tudo que for automatizável. Neste artigo mostramos um exemplo com dados do mercado financeiro.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.