Previsão de demanda para ajuste de estoque

Lucas de Andrade Cerqueira
soma-labs
Published in
4 min readOct 5, 2018

No mercado de moda, uma resposta rápida ao mercado pode fazer toda a diferença. Nesse sentido, uma das soluções que eu e o Artur estamos desenvolvendo no Soma Labs é a predição da venda dos nossos produtos em cada uma de nossas filiais. Essa informação é crucial para que possamos repor nossas lojas de forma otimizada e, assim, minimizar custos de estoque e de falta.

Estamos testando para nossa aplicação o modelo estatístico ARIMA e algumas técnicas de Machine Learning, como LSTM e XGBoost. Neste post, vou falar dos nossos testes com esses modelos, como implementamos e os resultados que obtivemos até o momento.

Os dados que estamos utilizando neste projeto são da Farm, uma das marcas do Grupo Soma, na coleção atual e em coleções passadas. No caso do ARIMA, especificamente, só utilizamos a coleção atual.

Pipeline de execução

1. Atualização dos dados

Um script em Python executa uma série de queries no nosso data lake para obter os dados mais atualizados de vendas, estoque, estoque ideal dos produtos por filial, características dos produtos, etc. Os resultados são salvos em arquivos CSV.

Executando uma query utilizando Pandas.

2. Processamento dos dados

Uma série de operações e transformações é feita nos dados obtidos a partir das queries para obter um dataset da forma que queremos para aplicar os modelos. Mais uma vez utilizamos o Pandas (só amor ❤) de forma que cada linha do dataset é uma série temporal junto de informações do produto, filial, estoque, etc.

3. Treinamento dos modelos

Uma vez que temos um dataset pronto, são executados os treinamentos dos modelos que precisam dessa etapa, como LSTM e o XGBoost. O ARIMA não precisa ser treinado, é um modelo puramente estatístico.

4. Previsão das vendas

Nesta etapa, é onde a mágica acontece. Depois de a LSTM e o XGBoost serem treinados, eles são utilizados para prever as próximas vendas. No caso do ARIMA, um modelo é ajustado para cada série temporal e a predição é feita no nível SKU-filial.

5. Mudança no estoque regulador

Baseado na previsão dos modelos, filtramos onde são necessárias mudanças no estoque regulador e forçamos uma reposição alterando o estoque ideal de um produto em uma dada filial para suprir a previsão. Depois disso, o estoque ideal retorna ao seu valor inicial.

Modelos

1. ARIMA

ARIMA (Autoregressive integrated moving average) é um modelo estatístico que é utilizado para entender melhor o comportamento de dados temporais e prever pontos futuros. Ele é uma generalização do modelo ARMA (Autoregressive moving average), que também é utilizado para as mesmas aplicações, porém sua parte integrativa permite trabalhar com séries temporais não estacionárias, ou seja, cuja média e variância mudam com o tempo.

A parte auto-regressiva (AR) do ARIMA indica que os dados são ajustados utilizando amostras de instantes de tempo anteriores. A ação integrativa (I) faz com que uma amosta da série temporal em um dado instante t seja substituído pela diferença entre seu valor atual e o valor no instante anterior: y’(t) = y(t)-y(t-1). Por fim, sua parte de média móvel (Moving Average, MA) serve para suavizar a série temporal.

O ARIMA possui 3 parâmetros p, d e q que definem sua ordem (p, d, q):

  • p está associado à parte auto-regressiva do modelo;
  • d está associado à parte integrativa do modelo, que vai afetar a ordem de diferenciação aplicada à serie temporal;
  • q está associado à parte da média móvel do modelo.

Para implementar o ARIMA em Python, usamos a classe ARIMA definida pela biblioteca statsmodels. Dada uma série temporal, a previsão para 7 dias é feita como no exemplo abaixo. No nosso caso, não temos um csv para cada série, mas sim um DataFrame onde cada linha é uma série temporal.

Resultados

Nessa última semana de setembro e início de outubro, eu e o Artur fechamos o pipeline com o ARIMA, faltando implementar o XGBoost e buscar uma solução para o treinamento da LSTM, que é muito custoso e demorado.

O ARIMA não mostrou resultados tão satisfatórios ao fixar um modelo de mesma ordem para todas as séries temporais. Por esse motivo, busquei por como determinar a melhor ordem de um modelo ARIMA e encontrei a biblioteca Pyramid, que implementa a função auto_arima . Ela utiliza de critérios estatísticos para determinar a ordem ideal a partir da série temporal. Apesar de fazer essa busca de parâmetros, ainda é rápido. Para 1000 séries temporais, levou cerca de 3 minutos, sendo que possuímos em torno de 15000. Além disso, é bem fácil de adicionar fatores de sazonalidade no modelo.

Preciso fazer mais testes com o auto_arima , além de implementar o XGBoost e um outro modelo sugerido pela Thrive, o Catboost.

--

--