Tag

avaliar modelo Archives - Análise Macro

Modelagem e Previsão em 6 Passos: fluxo de trabalho com séries temporais

By | Data Science

Produzir modelos preditivos para séries temporais é uma tarefa difícil e bastante valorizada no mercado de trabalho. São diversos os procedimentos que um profissional dessa área precisa sempre ter no radar e, se generalizarmos isso em um fluxo, a distância entre a idealização do modelo e sua implementação pode ser mais curta e menos árdua. Neste texto descrevemos resumidamente o dia a dia de um profissional que trabalha com previsões e mostramos um exemplo de rotinas em R!

Fluxo de trabalho

O processo de desenvolver modelos preditivos para séries temporais pode ser generalizado e dividido em 6 etapas:

Fonte: Hyndman and Athanasopoulos (2021)

Este fluxo, em resumo, descreve como é o dia a dia de trabalho de modelagem e previsão em algumas etapas organizadas. São elas:

Preparar os dados

O primeiro passo é preparar os dados no formato correto para uso em modelos. Esse processo pode envolver a coleta e importação de dados, a identificação de valores ausentes, agregação/sumarização/ajustes/filtros nas séries e outras tarefas de pré-processamento (veja um post sobre coleta de dados aqui). O objetivo será, em geral, construir uma matriz de variáveis onde cada variável terá sua própria coluna, cada linha formará uma observação e os valores são armazenados nas células. Esse é o princípio de dados "tidy". A facilidade que o pacote {tsibble} e outros do {tidyverse} oferecem simplifica consideravelmente esta etapa usando o R.

Vale dizer que muitos modelos têm pressupostos e requisitos diferentes, sendo que você precisará levar isso em consideração ao preparar os dados. Alguns exigem que a série seja estacionária, outros exigem que não haja valores ausentes. Dessa forma, você precisará conhecer bem os seus dados enquanto os prepara e a análise exploratória é outra etapa que caminhará lado a lado.

Visualizar os dados

A visualização é uma etapa essencial para a compreensão dos dados. Suas séries temporais apresentam tendência? Possuem sazonalidade? Há quebras ou observações extremas nas séries (outliers)? Observar seus dados, através de uma análise exploratória (veja um post sobre aqui no blog) permite identificar estes padrões comuns e, posteriormente, especificar um modelo apropriado. Essa etapa pode andar em conjunto com a etapa de preparação dos dados, de modo que após entender os dados você talvez precise voltar a um passo anterior e aplicar uma transformação, por exemplo, nas séries. Os pacotes {ggplot2}, {feasts}, {fabletools} e outros oferecem formas elegantes e práticas de visualizar seus dados.

Definir o modelo

Existem muitos modelos de séries temporais diferentes que podem ser usados para previsão. Especificar um modelo apropriado para os dados é essencial para produzir previsões. Nesse sentido, além de conhecer os seus dados você precisará ter conhecimento sobre os modelos que pretende trabalhar. Papers publicados são, em geral, boas fontes para buscar esse conhecimento técnico.

Grande parte dos modelos econométricos é descrita em Hyndman and Athanasopoulos (2021) e podem ser implementados pelo pacote {fable} através de funções específicas como ARIMA(), TSLM(), VAR(), etc., cada uma usando uma interface de fórmula (y ~ x). As variáveis de resposta são especificadas à esquerda da fórmula e a estrutura do modelo, que pode variar, é escrita à direita. Para outros modelos fora do escopo do {fable} a lógica e sintaxe é semelhante, quase sempre utilizando uma interface de fórmula.

Estimar o modelo

Uma vez que um modelo apropriado é definido, passamos à estimação do modelo com os dados. Uma ou mais especificações de modelo podem ser estimadas usando a função model() do pacote {fabletools} — framework que contempla grande parte dos modelos econométricos; para outros modelos há pacotes e funções específicas, mas com sintaxe semelhante.

Avaliar a performance

Após termos um modelo estimado, é importante verificar o desempenho dele nos dados. Existem várias ferramentas de diagnóstico disponíveis para verificar o ajuste do modelo, assim como medidas de acurácia que permitem comparar um modelo com outro; o RMSE é a métrica mais comumente utilizada para a maioria dos problemas de previsão. Conforme o diagnóstico do modelo, em seguida possivelmente sejam necessárias readequações, seja na especificação ou até mesmo nos dados utilizados. Em outras palavras, o fluxo de trabalho não é simplesmente um amontoado de procedimentos a serem implementados sequencialmente, mas sim um processo de descobrimento que envolve, na vida real, sucessivas tentativas e erros.

Além disso, se o interesse é previsão, há técnicas como a validação cruzada que auxiliam na tomada de decisão entre mais de um modelo (veja um post sobre isso aqui no blog). É sempre preferível ter mais de um modelo "candidato" potencialmente usado para fazer previsões, além de modelos básicos para simples comparação.

Realizar previsões

Com um modelo especificado, estimado e diagnosticado, é hora de produzir as previsões fora da amostra. Para alguns modelos você poderá simplesmente chamar uma função, como a forecast() ou predict() no R, especificando o número de períodos (horizonte de previsão) que deseja obter previsões; para outros você precisará prover uma tabela com os valores futuros das variáveis regressoras utilizadas no modelo, que servirá para produzir as previsões da variável de interesse, ou seja, você precisará de cenários.

Exemplo no R

Com esse esquema em mente, vamos ilustrar o fluxo de trabalho com um exercício prático e didático: construir um modelo de previsão para a taxa de crescimento anual do PIB brasileiro.

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes:

Preparar os dados

Por conveniência, utilizaremos o dataset global_economy armazenado como um objeto tsibble, trazendo variáveis econômicas em frequência anual para diversos países. Nosso interesse é a série da taxa de crescimento do PIB brasileiro:

Visualizar os dados

Visualização é uma etapa essencial para entender os dados, o que permite identificar padrões e modelos apropriados. No nosso exemplo, primeiro criamos um gráfico de linha para plotar a série do PIB brasileiro usando a função autoplot():

Podemos também plotar os correlogramas ACF e PACF para identificar o processo estocástico da série, obtendo alguns modelos candidatos:

Definir o modelo

Existem muitos modelos de séries temporais diferentes que podem ser usados para previsão, e especificar um modelo apropriado para os dados é essencial para produzir previsões. Nesse exercício didático focaremos em modelos univariados simples para explicar o PIB brasileiro.

Se formos analisar somente pelos correlogramas ACF e PACF, podemos identificar alguns modelos possivelmente candidatos: ARIMA(1,0,2), ARIMA(1,0,0) e ARIMA(0,0,2). Contudo, se nossa leitura estiver incorreta, podemos contar ainda com a tecnologia ao nosso favor utilizando a seleção automatizada da estrutura do modelo. Isso é possível graças ao algoritmo de seleção automatizada da especificação do ARIMA criado pelo prof. Rob Hyndman.

Por fim, além destes possíveis modelos candidatos, também estimaremos um modelo de benchmark na forma de um passeio aleatório, apenas para ter uma base de comparação de previsões dos modelos.

Estimar o modelo

Identificado um modelo (ou mais) apropriado, podemos em seguida fazer a estimação usando a função model()1. Existem diversas funções especiais para definir a estrutura do modelo e em ambos os lados da fórmula podem ser aplicadas transformações. Nesse caso definiremos apenas a estrutura básica do ARIMA; a função ARIMA() também define automaticamente a estrutura sazonal, mas você pode desabilitar isso (consulte detalhes da documentação do {fable}).

O objeto resultante é uma "tabela de modelo" ou mable, com a saída de cada modelo em cada coluna.

Diagnóstico do modelo

Para obter os critérios de informação use a função glance():

Os critérios de informação indicam que, dos modelos estimados, o modelo automatizado ARIMA(1,1,1) apresentou o menor valor de AICc — seguido pelos demais identificados pelos correlogramas ACF e PACF. Com a função gg_tsresiduals() podemos verificar o comportamento dos resíduos deste modelo, indicando que os resíduos se comportam como ruído branco:

Um teste de autocorrelação (Ljung Box) retorna um p-valor grande, também indicando que os resíduos são ruído branco:

Também pode ser interessante visualizar o ajuste do modelo. Utilize a função augment() para obter os valores estimados:

Outros diagnósticos e avaliações podem ser realizados. Se você estiver especialmente interessado em previsão, considere implementar o método de validação cruzada, como explicado neste post.

Realizar previsões

Com o modelo escolhido, previsões podem ser geradas com a função forecast() indicando um horizonte de escolha.

Perceba que os pontos de previsão médios gerados são bastante similares a um processo de passeio aleatório (equivalente a um ARIMA(0,1,0)). O trabalho adicional de especificar termos AR e MA trouxe pouca diferença para os pontos de previsão neste exemplo, apesar de ser perceptível que os intervalos de confiança do modelo auto ARIMA são mais estreitos do que de um passeio aleatório.

Além disso, a previsão fora da amostra gerada ficou bastante aquém dos dados reais para a taxa de crescimento do PIB brasileiro observados no horizonte em questão, configurando apenas um exercício didático.

Saiba mais

Este é apenas um exercício simples e didático demonstrando um fluxo de trabalho de modelagem e previsão. Existem diversos tópicos que podem ser aprofundados e se você quiser saber mais confira o curso de Modelos Preditivos da Análise Macro.

Confira também outros exercícios aplicados com pacotes do {tidyverts}:

Referências

Hyndman, R. J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on 2022-04-01.

 


1A função suporta estimação dos modelos com computação paralela usando o pacote {future}, veja detalhes na documentação e este post para saber mais sobre o tema.

Validação Cruzada de Séries Temporais

By | Data Science

Quando estimamos um modelo para previsão de séries temporais precisamos avaliar sua performance preditiva. Separar os dados em uma amostra de treino e outra de teste é a forma mais simples de verificar como o modelo performa em dados pseudo fora da amostra, através do cálculo do erro de previsão. Entretanto, a escolha das amostras é arbitrária, o que traz a tona um método mais sofisticado: a validação cruzada. Neste exercício abriremos a caixa preta por trás do assunto mostrando como implementar a técnica no R.

Neste método há uma série de amostras de teste, cada uma consistindo em h observações, ou seja, são os períodos usados para gerar previsões a partir do modelo. A amostra de treino correspondente, usada para estimação do modelo, consiste apenas de observações que ocorreram antes das observações que formam a amostra de teste. Assim, nenhuma observação futura pode ser usada na construção da previsão.

O diagrama a seguir ilustra um esquema de validação cruzada de séries temporais, com uma série de amostras de treino e de teste, para quando se deseja avaliar a performance preditiva do modelo em h = 1 períodos à frente, onde as observações azuis formam as amostras de treino e as observações laranja formam as amostras de teste.

Fonte: Hyndman e Athanasopoulos (2021).

Operacionalização

Dado esse esquema de separação de uma série de amostras de treino e de teste de uma série temporal, o método de validação cruzada pode ser resumido como um procedimento recursivo:

  1. Para cada amostra de treino estime o modelo;
  2. Utilize o modelo estimado para gerar previsões h períodos à frente;
  3. Calcule o erro de previsão com a amostra de teste e a saída da etapa 2.

Ao final, obtém-se a métrica de acurácia (ME, RMSE, MAE, etc.) do modelo pela média de cada iteração.

Esse método é relativamente simples, mas bastante útil para validar a performance de modelos independentemente da amostra de treino/teste escolhida, trazendo uma "visão global" do modelo. A validação cruzada é largamente utilizada por praticantes de machine learning, além de ser uma prática comum em papers que tratam de previsão de séries temporais. Vale pontuar que existem variações do método, que deixaremos para explorar em uma outra oportunidade.

Implementação no R

Mostraremos duas formas de implementar validação cruzada de séries temporais no R:

  1. Através da família de pacotes {tidyverts};
  2. Abrindo a caixa preta e escrevendo o código manualmente.

Em ambos os casos utilizaremos modelos univariados simples, apenas para demonstrar o método, aplicados ao principal índice de preços da economia brasileira, o IPCA, com a finalidade de avaliar as previsões 12 períodos à frente. A primeira amostra de validação cruzada conterá 180 observações e será acrescentado 1 observação sucessivamente até o total de observações excluindo as últimas 12.

Antes de começar você deve ter disponível os seguintes pacotes no seu ambiente de R:

O código abaixo prepara os dados de exemplo. Para saber mais sobre coleta de dados macroeconômicos confira este post no blog da Análise Macro.

Exemplo com {tidyverts}

O primeiro exemplo de implementação de validação cruzada utilizará os pacotes da família {tidyverts}, que é um ótimo framework para trabalhar com séries temporais no R (confira este post sobre o assunto). Sendo assim, o primeiro passo que precisamos fazer é criar as amostras de treino de validação cruzada (observações azuis na ilustração). Isso pode ser feito conforme abaixo (note que removemos as últimas 12 observações, para poder calcular o erro de previsão da última amostra corretamente):

Agora temos uma série de amostras, partindo de 180 observações e acrescentando 1 sucessivamente, que utilizaremos para estimar os modelos de exemplo e gerar previsões. Isso é feito conforme o código abaixo. Note que criamos uma coluna para salvar a informação do horizonte temporal da previsão (isso é opcional, sendo útil apenas quando você quer analisar a acurácia por horizonte preditivo).

Por fim, podemos calcular as métricas de acurácia média considerando todas as amostras e previsões geradas, conforme abaixo:

Como resultado podemos gerar a visualização abaixo, onde é possível analisar os modelos em termos de acurácia (RMSE) por horizonte preditivo:

Exemplo manual

Conforme visto, os procedimentos adotados para implementar o método de validação cruzada de séries temporais são extremamente simples utilizando os pacotes do {tidyverts}. Entretanto, nem sempre teremos à disposição, dentro deste ou outros frameworks, todos os modelos de interesse para implementação rápida através de um pacote. Na vida real, é comum que surjam novos modelos ou que os pacotes implementem e disponibilizem apenas uma parcela do que existe por aí. Nestes casos, será seu trabalho escrever um código que implemente a validação cruzada com tal modelo.

Para exemplificar, abaixo escrevo uma função que implementa o esquema de validação cruzada de forma semelhante ao que acabamos de ver. O modelo utilizado é, por conveniência, o ARIMA automatizado e a definições de amostras são idênticas ao exemplo anterior. Note que o código fica significativamente mais complexo, principalmente para iniciantes, mas é um destino natural de todo profissional que deseje se aventurar por estes caminhos.

A função implementa o que foi destacado previamente, referente ao método recursivo da validação cruzada, retornando uma lista com uma tabela do RMSE por horizonte preditivo e outra com as previsões geradas a cada iteração. Fique à vontade para adaptar ou melhorar a função conforme suas necessidades.

Com a função criada, basta utilizá-la junto aos dados para obter os resultados:

Por fim, plotamos os resultados desta abordagem manual com a abordagem anterior. Note que o RMSE calculado difere levemente. Não investiguei o motivo, mas acredito que seja decorrente de alguma parametrização diferente entre o algoritmo de forecast::auto.arima() e fable::ARIMA().

Saiba mais

Este exercício simples é um ponto de partida para você começar a implementar a validação cruzada em seus modelos de previsão de séries temporais. Caso deseje se aprofundar, confira o curso de Modelos Preditivos da Análise Macro, onde implementamos diversos modelos para séries temporais da economia brasileira.

Referências
Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on <2022-05-12>.

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente