Não é segredo que os métodos de aprendizado de máquina começaram a penetrar em várias áreas de negócios em todos os lugares, otimizando, melhorando e até criando novos processos de negócios. Uma das áreas importantes é a questão de definir o preço dos produtos e, aqui, com dados suficientes, o MO ajuda a fazer o que antes era difícil de alcançar - para restaurar a curva de demanda multifatorial a partir dos dados. Graças à curva de demanda restaurada, tornou-se possível criar sistemas de precificação dinâmicos que permitem a otimização de preços, dependendo da finalidade da precificação - aumentar a receita ou o lucro. Este artigo é uma compilação de minha dissertação, na qual o modelo dinâmico de preços LSTM-ANN foi desenvolvido e testado na prática por 4 semanas para um dos produtos do varejista de artigos para o lar.
Quero observar imediatamente que, neste artigo, não divulgarei o nome da empresa em que o estudo foi realizado (no entanto, essa é uma das empresas da lista nas instalações), em vez disso, vou simplesmente chamá-lo de varejista.
Antecedentes
Há um líder de preços no mercado de varejo de artigos para o lar, Leroy Merlin. Os volumes de vendas dessa rede permitem que eles mantenham uma estratégia de preço mínimo para toda a gama de produtos, o que leva a pressão de preço sobre outros participantes do mercado.
Receitas e lucros dos principais varejistas em São Petersburgo em 31 de dezembro de 2017

Nesse sentido, o varejista usa uma abordagem diferente para determinar o preço:
- O preço é fixado no menor dos concorrentes;
- Restrição ao preço abaixo: preço de compra + prêmio mínimo, refletindo custos aproximados por unidade de mercadoria.
Essa abordagem é uma combinação do método de precificação caro e da concorrência. No entanto, não é perfeito - não leva diretamente em consideração a demanda do consumidor.
Devido ao fato de o modelo de precificação dinâmica levar em consideração muitos fatores (demanda, sazonalidade, promoções, preços dos concorrentes) e também permitir que você imponha restrições ao preço proposto (por exemplo, de baixo para cima, cobrindo os custos), esse sistema potencialmente se livra de toda a unilateralidade e desvantagens de outros métodos de precificação.
Dados
Para o estudo, a empresa forneceu dados de janeiro de 2015 a julho de 2017 (920 dias / 131 semanas). Esses dados incluíam:
- Vendas diurnas, incluindo finais de semana, para 470 produtos (16 grupos de produtos);
- Dias de promoções na loja;
- Dias em que foram oferecidos descontos em mercadorias;
- Preços para cada um dos 470 produtos;
- Dados diários sobre o número de verificações em toda a rede em São Petersburgo;
- Preços dos principais concorrentes para a maioria dos 470 produtos (dados foram gravados uma vez por semana).
Além desses dados, também adicionei variáveis fictícias do calendário:
- Estação do ano (outono / inverno / verão / primavera);
- Mês
- Trimestre;
- Dia da semana;
- Feriados;
Além disso, variáveis climáticas:
- Precipitação - manequim;
- Temperatura
- O desvio de temperatura da média na estação.
Ao analisar diretamente as vendas diárias de mercadorias, descobri que:
Apenas cerca de 30% dos produtos foram vendidos o tempo todo, todos os outros foram colocados à venda depois de 2015 ou removidos da venda antes de 2017, o que levou a uma restrição significativa na escolha dos produtos para pesquisa e experimento de preços. Isso também nos leva ao fato de que, devido à constante mudança de mercadorias na linha da loja, torna-se difícil criar um sistema integrado de preços de mercadorias, no entanto, existem algumas maneiras de contornar esse problema, que serão discutidas mais adiante.
Sistema de preços
Para construir um sistema de recomendações de preços para as mercadorias para o próximo período de tempo com base em um modelo que prediz demanda, criei o seguinte esquema:

Como, após treinar o modelo com os dados, obtemos um modelo que restaurou a curva de demanda multifatorial, fornecendo vários preços de bens ao insumo, receberemos as vendas estimadas, dependendo desse preço. Assim, podemos realizar a otimização de preços para alcançar o resultado desejado - maximizar a receita esperada ou o lucro esperado. Resta apenas treinar um modelo capaz de prever vendas.
O que não deu certo
Depois de escolher um dos produtos para pesquisa, usei o XGBoost, antes de passar diretamente para o modelo LSTM.
Fiz isso na expectativa de que o XGBoost me ajude a descartar muitos fatores desnecessários (isso acontece automaticamente), e os demais devem ser usados nos modelos LSTM. Usei essa abordagem conscientemente, porque, para evitar questões desnecessárias na defesa da dissertação, queria obter uma justificativa forte e, ao mesmo tempo, simples da escolha dos fatores para o modelo, por um lado, e por outro lado, simplificação do desenvolvimento. Além disso, recebi um modelo pronto e aproximado, no qual foi possível testar rapidamente várias idéias no estudo. E depois disso, tendo chegado a um entendimento final do que funcionará e do que não funcionará, faça o modelo final do LSTM.
Para entender o problema de previsão, darei uma programação de vendas diária para o primeiro produto selecionado:

Toda a série temporal de vendas no gráfico foi dividida em vendas médias do período, para não revelar valores reais, mas manter a aparência.
Em geral, muito barulho, embora haja rajadas pronunciadas - é a realização de promoções no nível da rede.
Como para mim foi a primeira experiência na construção de modelos de aprendizado de máquina, tive que gastar bastante tempo em vários artigos e documentação, de modo que, em última análise, algo funcionou para mim.
Uma lista inicial de fatores que presumivelmente afetam as vendas:
- Dados sobre vendas diárias de outros produtos deste grupo, vendas totais do grupo em pedaços e número de cheques para todas as lojas em São Petersburgo com defasagens 1, 2, 3, 7, 14, 21, 28;
- Dados sobre preços de outros produtos do grupo;
- A proporção do preço do produto investigado com os preços de outros bens do grupo;
- O preço mais baixo entre todos os concorrentes (os dados foram coletados uma vez por semana, e assumi que esses preços serão válidos para a próxima semana);
- A proporção do preço do produto investigado com o menor preço dos concorrentes;
- Defasagens de vendas por grupo (em pedaços);
- Média simples e RSI com base nas defasagens de vendas de mercadorias do grupo, no total de vendas do grupo e no número de cheques.
Um total de 380 fatores. (2,42 observações por fator). Assim, o problema de eliminar fatores insignificantes era realmente alto, no entanto, o XGBoost ajudou a lidar com isso, reduzindo significativamente o número de fatores para 23 (40 observações por fator).
O melhor resultado que eu consegui usando a pesquisa por ganância é o seguinte:

R ^ 2-adj = 0,4 na amostra de teste
Os dados foram divididos em amostras de treinamento e teste sem mistura (uma vez que se trata de uma série temporal). Como métrica, usei o indicador R ^ 2 ajustado conscientemente, pois a apresentação dos resultados finais do trabalho tinha que ser realizada antes da comissão, incl. constituído por representantes comerciais, portanto, foi usado como o mais famoso e mais fácil de entender.
Os resultados finais diminuíram minha crença no sucesso, porque o resultado de R ^ 2-adj 0.4 significava apenas que o sistema de previsão não seria capaz de prever a demanda no dia seguinte muito bem, e a recomendação para o preço não seria muito diferente do sistema "dedo no céu".
Além disso, decidi verificar a eficácia do uso do XGBoost para prever vendas diárias para um grupo de mercadorias (em piadas) e prever o número de verificações em geral na rede.
Vendas por grupo de produtos:

R ^ 2-adj = 0,71
Verificações:

R ^ 2-adj = 0,86
Penso que a razão pela qual os dados de vendas de um determinado produto não puderam ser previstos está clara nos gráficos apresentados - ruído. As vendas individuais de mercadorias mostraram-se muito suscetíveis ao acaso, portanto, o método de construção de uma regressão não foi eficaz. Ao mesmo tempo, agregando os dados, removemos a influência da aleatoriedade e obtivemos boas capacidades preditivas.
Para finalmente garantir que prever a demanda com um dia de antecedência seja um exercício inútil, usei o modelo SARIMAX (pacote statsmodels para python) para as vendas diárias:


De fato, os resultados não diferem de forma alguma daqueles obtidos com o XGBoost, o que sugere que o uso de um modelo complexo nesse caso não se justifica.
Ao mesmo tempo, também quero observar que nem os fatores climáticos XGBoost nem SARIMAX foram significativos.
Construindo o modelo final
A solução para o problema da qualidade da previsão foi agregar dados semanalmente. Isso nos permitiu reduzir a influência de fatores aleatórios, no entanto, reduziu significativamente a quantidade de dados observados: se houvesse 920 dados diários, apenas 131 dados semanais. A situação piorou porque o número de fatores permaneceu praticamente inalterado (manequins para os dias da semana foram excluídos), mas o número de observações da variável-alvo diminuiu bastante.
Além disso, minha tarefa foi complicada pelo fato de que, na época, a empresa decidiu alterar o produto que o experimento seria aplicado usando o modelo, então tive que desenvolver um modelo a partir do zero.
A mudança de mercadorias ocorreu nas mercadorias com uma sazonalidade pronunciada:

Devido à mudança para as vendas semanais, surgiu uma questão lógica: é adequado usar o modelo LSTM com uma quantidade tão pequena de dados? Decidi descobrir na prática e, antes de tudo, reduzir o número de fatores (mesmo que fosse um dano potencial na redução de informações significativas). Joguei fora todos os fatores que são calculados com base em defasagens de vendas (média, RSI), fatores climáticos (nos dados diários, o clima não importava e a transferência para o nível semanal, ainda mais, perdia algum sentido). Depois disso, tradicionalmente usei o XGBoost para eliminar outros fatores insignificantes. Posteriormente, compartimentei vários outros fatores com base no modelo LSTM, simplesmente excluindo os fatores um por um, treinando o modelo novamente e comparando os resultados.
A lista final de fatores é a seguinte:
- A relação entre o preço por quilograma do produto investigado e o primer CERESIT ST 17 10 l.;
- A relação entre o preço do produto investigado e o produto e o primer CERESIT ST 17 10 l;
- A relação entre o preço do produto investigado e o primer EURO PRIMER 3 l;
- A relação entre o preço do produto investigado e o preço mínimo dos concorrentes;
- Variáveis simuladas para três promoções no nível da rede;
- Variáveis fictícias da primavera, verão e outono;
- Registra 1 - 5 vendas semanais do produto investigado.
Apenas 15 fatores (9 observações por fator).
O modelo final de LSTM foi escrito usando Keras, incluindo 2 camadas ocultas (25 e 20 neurônios, respectivamente), e o ativador era um sigmóide.
O código para o modelo LSTM final usando Keras:
model = Sequential() model.add(LSTM(25, return_sequences=True, input_shape=(1, trainX.shape[2]))) model.add(LSTM(20)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=40, batch_size=1, verbose=2) model.save('LSTM_W.h5')
Resultado:


A qualidade da previsão na amostra de teste parecia bastante convincente em termos de métricas, no entanto, na minha opinião, ainda não atingiu o ideal, porque, apesar da determinação bastante precisa do nível médio de vendas, as explosões em semanas individuais podem se desviar fortemente de " nível médio de vendas ", que deu um forte desvio da previsão de vendas da realidade em dias individuais (até 50%). No entanto, usei esse modelo diretamente para o experimento na prática.
Também é interessante ver como é a curva de demanda restaurada em termos de preço. Para fazer isso, passei o modelo pela faixa de preço e, com base nas vendas previstas, construí uma curva de demanda:

Um experimento
A cada semana, a rede fornecia dados de vendas da semana anterior em São Petersburgo, além de preços dos concorrentes. Com base nesses dados, realizei a otimização de preços para maximizar os lucros esperados, disse o preço que a rede deveria fixar para a próxima semana, o que foi. Isso continuou por 4 semanas (o prazo foi acordado com o varejista).
A maximização do lucro foi realizada com restrições: o preço mínimo foi o preço de compra + correção. sobretaxa, o preço máximo foi limitado pelo preço do primer do mesmo fabricante, apenas em uma embalagem de 10 litros.
Os resultados experimentais são apresentados nas tabelas abaixo (todos os números são divididos por um determinado valor para não revelar os valores absolutos):
Previsão de vendas:

Previsão de lucro:

Para avaliar o impacto do novo sistema de preços nas vendas, comparei as vendas no mesmo período, apenas nos anos anteriores.
Resultados resumidos de 4 semanas:

Como resultado, temos uma imagem dupla: previsões completamente irrealistas sobre vendas, mas, ao mesmo tempo, resultados puramente positivos sobre indicadores econômicos (tanto em termos de lucro quanto de receita).
A explicação, na minha opinião, é que, nesse caso, o modelo, prevendo incorretamente as vendas, pegou a idéia correta - a elasticidade do preço desse produto estava abaixo de 1, o que significa que o preço poderia ser aumentado, sem medo de uma queda nas vendas, o que vimos (as vendas em unidades permaneceram aproximadamente no mesmo nível que no anterior e no ano anterior).
Mas não se esqueça que 4 semanas é um período de curto prazo e o experimento foi realizado em apenas um produto. A longo prazo, o preço excessivo de mercadorias em uma loja leva, em regra, a uma queda nas vendas da loja como um todo. Para confirmar meu palpite sobre isso, decidi, usando o XGBoost, verificar se os consumidores têm uma "memória" de preços para períodos anteriores (se no passado era mais caro "em geral" do que os concorrentes, o consumidor vai para os concorrentes). I.e. se o nível de preço médio para o grupo nos últimos 1, 3 e 6 meses será fornecido para vendas por grupos de produtos.

De fato, a conjectura foi confirmada: de uma forma ou de outra, o nível médio de preços dos períodos anteriores afeta as vendas no período atual. Isso significa que não é suficiente realizar a otimização de preços no período atual para um único produto - também é necessário levar em consideração o nível geral de preços a longo prazo. O que, em geral, leva a uma situação em que as táticas (maximização dos lucros agora) são contrárias às estratégias (sobrevivência na competição). Isso, no entanto, já é melhor deixar para os profissionais de marketing.
Dado os resultados e a experiência, na minha opinião, da melhor maneira, um sistema de preços baseado em uma previsão de vendas poderia ser assim:
- Ir um passo além da linha de produtos é conduzir uma análise de cluster e agrupar chaves de fenda condicionais por similaridade e previsão de vendas e definir o preço não de uma única chave de fenda, mas deste subgrupo, para evitar o problema de remover e adicionar constantemente nomenclaturas de produtos.
- Realização da otimização de preços no complexo - não apenas para subgrupos individuais de mercadorias, mas também levando em consideração os efeitos a longo prazo. Para fazer isso, você pode usar o modelo que prevê vendas como um todo na rede; felizmente, ele se mostrou impressionantemente preciso, mesmo nas vendas diárias.
Resumindo os resultados do trabalho realizado, quero dizer que foi difícil para mim, como não uma pessoa experiente em desenvolvimento em geral, e nos métodos de MO em particular, no entanto, tudo acabou sendo viável. Também foi interessante verificar por si mesmo como esses métodos são aplicáveis na realidade. Depois de ler muitos artigos antes, meus olhos ardiam com o fato de que eu tentava fazer tudo sozinho e esperava que obtivesse excelentes resultados. A prática acabou sendo dura - um pequeno número de mercadorias com um longo histórico de vendas, dados diários barulhentos, falhas na previsão dos volumes de vendas, o uso de modelos complexos nem sempre é justificado. No entanto, tive uma experiência inesquecível e aprendi o que significa colocar a análise em prática.
→ Com base no trabalho realizado, preparei um projeto no meu
repositórioNo repositório, você encontrará um conjunto de dados gerado com base em dependências extraídas de dados reais, bem como um script python que permite realizar um experimento virtual com esses dados gerados, oferecendo a você a sorte e a superação do modelo de acordo com seu lucro, definindo o preço do produto. Tudo que você precisa é baixar e executar o script.
Espero que minha experiência ajude a determinar os limites do uso de métodos MO e mostre que paciência e perseverança podem alcançar resultados, mesmo que você não seja um profissional em qualquer área.