Previsão de Séries Temporais: Receita dos Canais de Marketing

Nossos cientistas de dados falam sobre o desafio de obter previsões de receita mais assertivas nos canais de marketing

O tema não é novo: “prever a receita”. Nestas 3 palavras, no entanto, estão escondidas complexidades e particularidades que tornam este assunto tão fascinante.

O objetivo proposto era desenvolver um algoritmo que pudesse prever com mais precisão o resultado de faturamento para cada canal de marketing, para que esta área pudesse programar melhor as suas estratégias de investimento por canal.

O Project Owner da Squad de Commercial Analytics, Daniel Youiti Kabata, colocou para a equipe uma primeira visão para a solução deste problema: a utilização de um modelo de regressão por médias móveis, que lidasse com aspectos de sazonalidade, não-estacionariedade (média variável ao longo do tempo) e, ainda, que pudesse contar com o auxílio de uma função exógena (a curva de vendas da Netshoes), para assim explicar as séries de receita por canal de marketing.

O primeiro desafio foi entender de que forma o departamento de marketing já realizava as previsões e também buscar as fontes de dados. O modelo que eles já utilizavam, apesar de simples, apresentava bons resultados.

Passos para a construção do algoritmo

Mãos à obra então! O cientista de dados Rafael Vicente Leite, da Squad de Commercial Analytics, ficou encarregado de desenvolver o algoritmo. Seguem os passos adotados para a elaboração da primeira versão, desenvolvido em Python:

  1. Coleta de dados de input: utilizamos a base histórica de dados de receita por canal de marketing. Para coletar os dados de uma Google Sheets para Python, utilizamos as bibliotecas GSpread (faz a conexão e já permite queries básicas), e a GSpread_dataframe, que converte uma planilha do Google Sheets em um Dataframe pandas. O mesmo procedimento foi realizado para coletar a Curva de Vendas, que seria nossa função exógena.
  2. Tratamento dos dados: o GSpread_dataframe não faz milagres. Ele traz um belíssimo DataFrame de strings! rsrsrsrs Além disso, a base contém algumas linhas duplicadas, datas “puladas”, valores nulos, ou seja, tudo o que faz parte do mundo real. Tudo isso foi tratado no Python com as bibliotecas coringas Pandas e Numpy.
  3. Normalização dos dados: o modelo de autorregressão não exige a normalização de dados, mas essa é uma boa prática, muito bem lembrada pelo PO Daniel Kabata, e que acabou sendo de grande valia para uma futura segunda versão do algoritmo, que se utilizaria de outras técnicas que necessitariam de normalização (Redes Neurais Recorrentes). Vê-se que as boas práticas não existem por acaso ;-)
  4. Determinação dos melhores parâmetros de autorregressão: nosso modelo de autorregressão necessita de diversas variáveis para funcionar de forma ótima e se adequar a cada canal, com suas características particulares de sazonalidade e estacionariedade. Desenvolvemos primeiramente um algoritmo que buscasse esses parâmetros de forma automatizada, para cada canal, para cada espaço de tempo. Este algoritmo era basicamente um GRID Search, que combinava diferentes valores dos parâmetros em faixas determinadas, e selecionava a melhor combinação, ou seja, aquela que resultava melhor “fit”.
  5. Realização das previsões, a parte mais feliz: dados coletados, tratados, normalizados, séries completas, indexadas, melhores parâmetros encontrados, função exógena a postos, todo mundo pronto! O processo de realizar as previsões foi realizado para cada canal, de forma automatizada, e os resultados eram exportados para uma planilha Google Sheets, registrando dados de Backtest (para avaliação da acurácia) e também os tão desejados dados de Forecast.

Primeiros Resultados

A primeira versão estava pronta e agora era hora de avaliar os resultados. Simulamos a utilização do algoritmo para alguns meses e obtivemos excelentes resultados. Comparando os resultados das previsões entre o modelo antigo e o proposto, dia a dia, a média dos erros absolutos percentuais (MAPE) caiu:

Período 01
Período 02
Período 03

Bacana, funcionou! No entanto, no quesito de responder, por exemplo, no dia 05 do mês corrente, qual será a previsão de vendas totais no mês, o modelo ainda não performava melhor. Segue a comparação abaixo:

Otimização do Algoritmo — V2

Precisávamos aprimorar nosso algoritmo. Foi então que o Project Owner da Squad de Personalização, Ricardo Aguilar Leme, sugeriu a implementação de algoritmo de Redes Neurais Recorrentes (RNN), um dos tópicos mais efervescentes de Inteligência Artificial e Aprendizado de Máquina, para a solução do problema.

A ideia era promissora e logo após primeiros testes pudemos perceber que havia melhor desempenho para alguns canais. No entanto, para outros canais, o modelo de autorregressão ainda performava melhor. Solução? Fazer um modelo de Ensembled, combinando os diversos modelos e escolhendo os melhores resultados, exatamente como se faz nas famosas competições da Kaggle.

Resultados — V2

Os resultados se mostraram superiores à primeira versão. Comparando-se os resultados das previsões entre a V1 e a V2 do algoritmo, a média dos erros absolutos percentuais (MAPE) caiu:

Período 01
Período 02
Período 03

E no quesito de responder, por exemplo, no dia 05 do mês corrente, qual será a previsão de vendas totais no mês, também tivemos um ganho significativo:

Conclusão

Conseguimos, assim, vencer em todos os quesitos e atingir nosso objetivo de obter previsões mais acertadas de receita por canal de Marketing.

Autor

Rafael Vicente Leite — Data Scientist

Participantes

Daniel Youiti Kabata — Product Owner (Data Science)

Ricardo Aguilar Leme — Product Owner (Data Science)

Entre para nosso time