Skip to content

Previsão das vendas das próximas seis semanas das lojas da empresa Rossmann com um modelo de regressão

Notifications You must be signed in to change notification settings

lavinomenezes/Rossmann_store_sales

Repository files navigation

Rossmann Store Sales

Problema de negócio

Rossmann é uma rede de drogarias com mais de 50 anos de atuação e que conta com mais de 4000 lojas espalhadas em sete países europeus. Para planejar e custear o orçamento para uma futura reforma de algumas dessas lojas o CFO requisitou para a equipe de dados uma previsão de faturamento de cada loja para as próximas seis semanas. Será entregue uma lista contendo a previsão de vendas de cada uma das lojas no conjunto de dados, esses valores também poderão ser acessados por um chatbot no aplicativo de mensagens Telegram.

O dataset com as informações foi disponibilizado pela própria empresa no kaggle, que contá com informações de 1115 lojas.

Dataset overview

Variable Meaning
id an Id that represents a (Store, Date) duple within the test set
Store a unique Id for each store
Sales the turnover for any given day (this is what you are predicting)
Customers the number of customers on a given day
Open an indicator for whether the store was open: 0 = closed, 1 = open
StateHoliday indicates a state holiday. Normally all stores, with few exceptions, are closed on state holidays. Note that all schools are closed on public holidays and weekends. a = public holiday, b = Easter holiday, c = Christmas, 0 = None
SchoolHoliday indicates if the (Store, Date) was affected by the closure of public schools
StoreType differentiates between 4 different store models: a, b, c, d
Assortment describes an assortment level: a = basic, b = extra, c = extended
CompetitionDistance distance in meters to the nearest competitor store
CompetitionOpenSince(Month/Year) gives the approximate year and month of the time the nearest competitor was opened
Promo indicates whether a store is running a promo on that day
Promo2 Promo2 is a continuing and consecutive promotion for some stores: 0 = store is not participating, 1 = store is participating
Promo2Since(Year/Week) describes the year and calendar week when the store started participating in Promo2
PromoInterval describes the consecutive intervals Promo2 is started, naming the months the promotion is started anew. E.g. "Feb,May,Aug,Nov" means each round starts in February, May, August, November of any given year for that store

Questões do negócio

Previsão de vendas para as próximas 6 semanas de cada loja para que o valor previsto possa ser usado para programar reformas nas unidades.

Premissas do negócio

  • A variedade do tipo de lojas “Store Type” e do sortimento “assortment” não está balanceadas e isso num momento inicial pode mascarar o comportamento das vendas totais quando comparadas as categorias;
  • A lista final contará apenas com lojas que estavam abertas (open == 1) e que tiveram vendas (sales >0). Assim, é possível que uma loja específica, quando solicitada, não tenha resposta dos valores;
  • As informações estão limitadas numa faixa de 3 anos indo de janeiro de 2013 até julho de 2015;
  • Como o ano de 2015 está incompleto, a comparação de vendas de datas e feriados entre os anos apresenta comportamento diferente;
  • Quando a loja não possui informação de distância pro competidor mais próximo “competition_distance” foi definido o valor de 200.000 metros para simular que a loja não possui competidores próximos.

Planejamento da Solução

Neste projeto foi aplicado o método CRISP-DM (Cross-Industry Standard Process for Data Mining) adaptado para os processos de ciência de dados que se tornou o CRIS-DS.

Modelo crisp-dm

A divisão dos passos utilizados no projeto foi:

  1. Entendimento de negócio: Entender um pouco mais sobre a rede de lojas Rossmann e discutir o que motivou a requisição da previsão de vendas, assim, entendendo melhor o problema para apresentar a solução mais eficiente no menor tempo possível.
  2. Coleta de dados: Todos os dados estavam disponíveis na plataforma, sendo esta disponibilizada pela própria empresa.
  3. Análise descritiva: Uma breve análise dos dados para adquirir familiaridade com os mesmo, incluindo o tamanho do data frame que estamos lidando assim como os tipo de dados que vamos processar, aplicando estatística descritiva sobre as informações para conhecer o comportamento dela.
  4. Dados faltantes: Com a análise descritiva encontrar e preencher dados de colunas que estejam em falta, tomando essas decisões baseados na importância da informação e derivando alguns dados de outras colunas.
  5. Feature engineering: Criação de novos atributos derivados dos que já existiam para ajudar a ter uma melhor compreensão do comportamento dos dados e para melhorar o desempenho dos modelos de machine learning. Os atributos criados foram:
    • year;
    • month;
    • day;
    • week_of_year;
    • year_week;
    • competition_since;
    • Competition_time_month;
    • promo_since;
    • season;
    • promo_time_week.
  6. Filtragem de dados: Remoção de colunas que não tem impacto no modelo e as que foram criadas como auxiliares no processo de feature engineering. Remoção de linhas que não contribuem com o modelo. Sendo eles:
    • Colunas removidas: 'customers','open','promo_interval', 'month_map';
    • Linhas removidas: Lojas que não estão abertas (open==0) e aquelas que apresentaram vendas no valor de zero ( sales<0).
  7. Análise exploratória de dados: Criar e validar hipóteses de negócio para melhor entendimento do comportamento dos dados em relação a variável alvo e como elas se influenciam, e definir quais atributos são importantes para o modelo.
  8. Preparação dos dados: Manipular os dados para se adequarem melhor num modelo de machine learning.
    • Aplicando a normalização na variável target “sales” para aproximar sua distribuição da normal;
    • Re-escala dos atributos numéricos para não força o modelo a trabalhar com valores muito altos;
    • Encoding das variáveis categorias. por fim para atributos cíclicos como dia e dia da semana entre outros foi aplicado transformação de natureza cíclica.
  9. Feature selection: Neste primeiro ciclo do CRISP foi utilizado o algoritmo boruta para definir os atributos que iremos utilizar no treinamento.
  10. Modelos de machine learning: Nesta etapa foram aplicados quatro algoritmos de machine learning para definir qual tinha melhor resultados e se adequa melhor ao comportamento dos dados. Sendo eles:
    • Linear regression Model;
    • Linear Regression Regularized Model - Lasso;
    • Random Forest Regressor;
    • XGboost Regressor.
  11. Fine tuning: Após a escolha do modelo foi aplicado o random search para encontrar os melhores parâmetros do modelo de machine learning.
  12. Deploy: Nesta última etapa, já tendo aplicado o modelo final no dataset de teste e observado os valores gerados, o modelo foi colocado em produção online na plataforma heroku, utilizando uma API desenvolvido com a biblioteca Flask para que o CFO da empresa possa ter a qualquer momento os valores de previsão de cada loja por meio de um bot no aplicativo de mensagens Telegram.

Os principais insights de negócio

Lojas com competidores com até 1000 metros de distância representam 33,26 % das vendas

Com esse número diminuindo conforme a distância aumenta, ou seja, quanto mais perto competidores maiores são as vendas.

Provavelmente pelo fato de lojas geralmente serem construídas em centros de consumo, consequentemente existe a presença de mais competidores e as lojas que não possuem concorrência próxima devem estar em locais de baixo consumo. é necessário dados geográficos para ir mais afundo nessa conclusão.

Lojas com um certo período de venda vendem menos após um período de promoção.

Esse fenômeno pode ser causado por dois principais motivos:

  • Devido a promoção os clientes já compraram o necessário para se manterem abastecidos por um maior período de tempo
  • Devido a promoção se estender por muito tempo o preço promocional se torna o padrão, subjetivamente, diminuindo o interesse em adquirir o produto.

Lojas com mais promoções consecutivas vendem menos

Provavelmente ocorre pelos mesmo motivos da hipótese anterior.

Todas as hipóteses testadas podem ser vistas no notebook para ver a descrição total, ou um breve resumo em Hipóteses

Performance do modelo de Machine learning

Em todos os casos o método de Cross-validation foi aplicado para generalizar os resultados de performance evitando que um modelo tenha melhor resultado por coincidência.

Para este projeto as métricas para avaliação foram:

  • MAE (Mean absolute error);
  • MAPE (Mean absolute Percentage error);
  • RMSE (Root mean square erro).
O modelo que obtive o melhor resulta foi a Random forest, mas, para fins de estudos e pelo fato do arquivo do modelo treinado ser menor, seguiremos com o XGboost.

 

Modelo MAE CROSS_VAL MAPE CROSS_VAL RMSE CROSS_VAL
Linear Regression Cross_val 1927.09 +/- 95.13 0.30 +/- 0.02 2724.09 +/- 178.86
Lasso Cross_val 1925.39 +/- 98.72 0.30 +/- 0.01 2728.38 +/- 183.60
Random forest Regressor Cross_val 740.40 +/- 124.21 0.11 +/- 0.02 1108.45 +/- 185.80
XGBoost Regressor Cross_val 6786.51 +/- 318.43 0.95 +/- 0.0 7410.61 +/- 364.41

 

Na etapa de fine tuning o XGboost apresentou uma melhora considerável em relação ao inicial, após a mudança nos parâmetros as métricas do modelo já aplicadas no dataset de teste ficam:

Modelo MAE MAPE RMSE
XGBoost Regressor 759.25335 0.1156 1083.2738

Performance de previsão

Nos gráficos acima é possível o comportamento da previsão em comparação aos nossos dados de testes, onde temos o valor bruto para comparar, o erro de previsão e a taxa de erro. Neles é possível ver que, em média, o modelo apresenta boa previsão, mas em contrapartida, também apresenta valores muito discrepantes em algumas lojas o que pode ser prejudicial.

Esses é um dos pontos que tem que ser melhorados num próximo ciclo do projeto.

Resultados financeiros

Com o modelo em produção é possível obter os valores de vendas de cada loja, incluindo as possíveis flutuações para melhor e pior. Como no exemplo a seguir.

Loja Previsão de vendas Melhor cenário Pior cenário MAE MAPE
132 242412.5625 243484.0242 241341.1007 1071.4617 0.1401
75 230443.890625 230957.3021 229930.4791 513.4114 0.0783
458 273112.5000 274157.0225 272067.9774 1044.5225 0.1289
34 297427.5625 297992.9834 296862.14156 565.4209 0.0670
998 168223.2187 168712.8448 167733.5926 489.6260 0.1088

Com isso temos o montante total de vendas de todas as lojas para as próximas 6 semanas.

Previsão de vendas Melhor cenário Pior cenário
288,028,928.00 € 288,878,591.11 € 287,179,218.78 €

Conclusão

Neste projeto foi feita uma previsão de vendas das próximas seis semanas de lojas selecionadas. Também foram testadas hipóteses para entender melhor o comportamento das vendas e o resultado foi entregue para o CFO. As previsões das vendas estão disponíveis no aplicativo de mensagens Telegram no canal Rossmann_predict_sales_bot para serem acessados pelo CFO há qualquer momento.

telegram bot

Próximos passos

  • Testar mais hypotheses;
  • Aplicar bayesian search no fine tuning;
  • Testar outros algoritmos de machine learning.
  • Melhorar a performace do modelo em lojas que apresentaram erro acima da média

Ferramentas utilizadas

  • Jupyter notebook
  • Pycharm communit
  • Git
  • Python
  • Pandas
  • Numpy
  • Sklearn
  • Seaborn
  • XGBoost
  • Flask
  • Heroku

About

Previsão das vendas das próximas seis semanas das lojas da empresa Rossmann com um modelo de regressão

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published