Previsão de Séries Temporais com “Prophet”

Previsão de Séries Temporais com “Prophet”

Na era da informação, as Organizações – sejam elas pequenas, médias ou grandes, públicas ou privadas – vêm tomando decisões com base em dados, e em muitas situações é preciso fazer a previsão do comportamento de um indicador no futuro. Com a empresa Facebook (atual Meta), não foi diferente.

Devido a necessidade de realizar previsões, a empresa Facebook criou em 2017 o Prophet, um framework para previsões de séries temporais, acessível através de API tanto em R quanto em Python e que segue o princípio de uma série temporal poder ser decomposta em 4 componentes: tendência, sazonalidade, uma componente que comporte as variações devido a feriados, e os erro como quarta. De acordo com o site oficial do Prophet:

O “Prophet” é um procedimento de previsão implementado em Python e R. É rápido e fornece previsões totalmente automatizadas que podem ser ajustadas manualmente por cientistas e analistas de dados.

Facebook

O modelo de previsão do “Prophet” é definido como:

y(t) = g(t) + d(t) + h(t) + e(t)

Em que:

  • g(t) é a função de tendência que modela mudanças não periódicas no valor da série temporal;
  • s(t) representa mudanças periódicas (por exemplo, sazonalidade semanal e anual);
  • h(t) representa os efeitos dos feriados que ocorrem em horários potencialmente irregulares ao longo de um ou mais dias.
  • e(t) representa quaisquer mudanças idiossincráticas que não são acomodadas pelo modelo.

O artigo que apresenta toda teoria do modelo de previsão do Prophet pode ser lido no  link https://peerj.com/preprints/3190v2/.

Vamos utiliar a API do Prophet para Python, que por ser tão importante já vem inclusa no Google Colab, dispensando a necessidade de instalar biblioteca, basta importá-la.

Neste post trago um guia para realizar previsões de séries temporais utilizando o Prophet. E, para exemplificar, utilizamos um conjunto de dados sobre vendas semanais em 45 lojas de uma grande rede varejista, que atua em diversos países do mundo, o Walmart. O conjunto de dados está disponível em formato .csv em um repositório em meu GitHub, para facilitar a importação direto do Python.

E aí, animado para prever séries temporais de forma fácil, rápida e automática com o Prophet?


Primeiro, acesse o Google Colab – https://colab.research.google.com/ – e crie um novo notebook.

Como a biblioteca já vem instalada no Google Colab basta importá-la. Também vamos importar o pandas que será útil para fazer ingestão e transformações nos dados.

# Importando bibliotecas necessárias
import pandas as pd
from fbprophet import Prophet

Em seguida, é preciso Carregar o conjunto de dados no Python. Para isso, utilizamos o read_csv do pandas:

# Importando o conjunto de dados
vendas = pd.read_csv(
    filepath_or_buffer = 'https://raw.githubusercontent.com/jonates/opendata/master/vendas_walmart/sales_walmart_dataset.csv', 
    sep=',',
    decimal='.'
)

Pronto! Vamos dar uma espiadinha no conjunto de dados bem como em sua estrutura:

# Espiando o conjunto de dados
vendas.tail(5)

O conjunto de dados tem 421.570 registros e 5 atributos contendo as seguintes informações:

  • Store: Número de identificação da loja;
  • Dept: Número de identificação do departamento;
  • Date: Data (representa uma semana);
  • Weekly_Sales: Vendas da semana;
  • IsHoliday: A semana contém feriado (False ou True).

Para construir a série temporal de vendas, precisamos realizar 2 transformações. Primeiro, transformar a variável Date no tipo datetime:

# Transformação de Date em formato de datetime
vendas['Date'] = pd.to_datetime(vendas.Date, infer_datetime_format=True) 

E a segunda transformação é agrupar as vendas por semana, ou seja, por data. Atenção, o Prophet espera que a série temporal que vai alimentar o modelo seja um conjunto de dados com duas colunas:

  • ds: que significa (datastamp) deve ter um formato de datetime esperado pelo Pandas, preferencialmente no formato AAAA-MM-DD se for somente a data ou AAAA-MM-DD HH:MM:SS se for data e hora.
  • y: deve ter os dados observados nas datas e que se pretende prever, e ser numérica.
# Tabela com acessos por mês e ano
vendas_semanal = vendas[['Date','Weekly_Sales']]\
  .groupby(['Date'], as_index = True)\
  .sum()\
  .reset_index()\
  .sort_values(['Date'], ascending=True)\
  .rename(columns={"Date": "ds", "Weekly_Sales": "y"})

# Espiando o resultado do agrupamento
vendas_semanal.head()

Tudo certo até aqui? Ótimo 🥳! Agora já temos o conjunto de dados no formato esperado pelo Prophet. Agora vamos verificar o comportamento da série temporal de treino através de uma visualização destes dados:

# Gerando o gráfico da série temporal
vendas_semanal.plot(x = 'ds', y = 'y', figsize = (15,6), marker='o');

Agora vamos iniciar a utilização do Prophet para ajustar o modelo. Primeiro vamos criar uma instância do modelo Prophet e em seguida ajustar o modelo aos dados de treino:

# Instanciando o modelo
modelo = Prophet()

# Ajustando o modelo aos dados
modelo.fit(vendas_semanal)

Agora é preciso criar o dataframe que vai receber as previsões através da função ‘make_future_dataframe’, onde devemos colocar quantos períodos à frente dos dados de treino, a frequência dos dados (se anual , mensal, diário, ou no caso dos dados que estamos trabalhando semanal), e também definir se deseja estimar o dados através do modelo no período de treino (o default é True):

# Criando dataframe com os períodos futuros para as previsões
st_futuro = modelo.make_future_dataframe(
    periods= 8, 
    freq = 'w', 
    include_history = True

)

Agora, com o dataframe que vai receber as previsões já criado, realizamos as previsões:

# Realizando as previsões
previsao_Prophet = modelo.predict(st_futuro)

Quase instantaneamente as previsões foram geradas. O conjunto de dados gerado tem diversas informações como os valores estimados (yhat) bem como os valores dos intervalos de confiança para as previsões (yhat_lower e yhat_upper). Esses resultados podem ser exportados para um arquivo ou armazenados no banco de dados da organização para serem utilizados em outras aplicações, servindo como base para as tomadas de decisão.

Podemos também utilizar o método ‘.plot()’ para gerar um gráfico com os valores reais e as previsões:

# Fazendo grafico da previsao
grafico_previsao_Prophet = modelo.plot(previsao_Prophet)
grafico_previsao_Prophet.show()

Veja que o modelo conseguiu captar o padrão dos dados levando em consideração os efeitos dos feriados de novembro e de dezembro, demonstrando o quanto o modelo de previsão Prophet é poderoso, mesmo quando não se faz muitos ajustes nos parâmetros.


Hoje, vamos ficar por aqui! O Notebook com todos os códigos deste post está disponível no meu GitHub.

Sugiro que leia a documentação do Prophet (https://facebook.github.io/prophet/) e faça ajustes nos parâmetros e compare os resultados finais das predições. Utilize também em outros conjuntos para consolidar seu aprendizado.

Bons estudos, e divirta-se com séries temporais!

Tags: | | | | | | | | |

Sobre o Autor

Jonatas Silva Espirito Santo
Jonatas Silva Espirito Santo

Estatístico com ampla experiência em projetos de dados. Líder de projetos de pesquisas no Governo da Bahia. Desenvolvedor na linguagem R e Python. Tem conhecimentos SQL e Spark. Busca continuamente conhecimento na área de modelagem de dados e processamento de big data. Doutorando em Computação. Mestre e Bacharel em Estatística. Proativo, Flexível, Criativo e Inovador, de Boa comunicação, tem capacidade de adaptação e Liderança.

0 Comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *