LSTM - ANN Prix dynamique dans la vente au détail d'articles ménagers

Ce n'est un secret pour personne que les méthodes d'apprentissage automatique ont commencé à pénétrer partout dans le monde, optimisant, améliorant et même créant de nouveaux processus métier. L'un des domaines importants est la question de la fixation du prix des marchandises, et ici, avec suffisamment de données, l'OM aide à faire ce qui était auparavant difficile à réaliser - restaurer la courbe de demande multifactorielle à partir des données. Grâce à la courbe de demande restaurée, il est devenu possible de construire des systèmes de tarification dynamiques qui permettent d'optimiser les prix en fonction de l'objectif de tarification - pour augmenter les revenus ou les bénéfices. Cet article est une compilation de ma thèse, dans laquelle le modèle de tarification dynamique LSTM-ANN a été développé et testé en pratique pendant 4 semaines pour l'une des marchandises du détaillant d'articles de maison.

Je tiens à noter immédiatement que dans cet article, je ne divulguerai pas le nom de la société dans laquelle l'étude a été menée (néanmoins, c'est l'une des sociétés de la liste dans les locaux), je le nommerai simplement - Détaillant.

Contexte


Leroy Merlin est un leader des prix sur le marché de la vente au détail d'articles ménagers. Les volumes de vente de ce réseau leur permettent de maintenir une stratégie de prix minimum pour l'ensemble de la gamme de produits, ce qui entraîne une pression sur les prix des autres acteurs du marché.

Revenus et bénéfices des principaux détaillants de Saint-Pétersbourg au 31 décembre 2017

image

À cet égard, le détaillant utilise une approche différente de la tarification:

  • Le prix est fixé au plus bas des concurrents;
  • Restriction sur le prix ci-dessous: prix d'achat + prime minimale reflétant les coûts approximatifs par unité de marchandise.

Cette approche est une combinaison de la méthode de tarification coûteuse et de la tarification des concurrents. Cependant, il n'est pas parfait - il ne prend pas directement en compte la demande des consommateurs.

Étant donné que le modèle de tarification dynamique prend en compte de nombreux facteurs (demande, saisonnalité, promotions, prix des concurrents), et vous permet également d'imposer des restrictions sur le prix proposé (par exemple, à partir du bas - couvrir les coûts), ce système peut potentiellement se débarrasser de toutes les inconvénients des autres méthodes de tarification.

Les données


Pour l'étude, la société a fourni des données de janvier 2015 à juillet 2017 (920 jours / 131 semaines). Ces données comprenaient:

  • Ventes de jour, y compris le week-end, pour 470 produits (16 groupes de produits);
  • Jours de promotions dans le magasin;
  • Jours durant lesquels des remises sur les marchandises ont été accordées;
  • Prix ​​pour chacun des 470 produits;
  • Données quotidiennes sur le nombre de contrôles sur l'ensemble du réseau à Saint-Pétersbourg;
  • Prix ​​des principaux concurrents pour la plupart des 470 produits (les données ont été prises une fois par semaine).

En plus de ces données, j'ai également ajouté des variables factices de calendrier:

  • Saison de l'année (automne / hiver / été / printemps);
  • Mois
  • Trimestre;
  • Jour de la semaine;
  • Vacances;

En outre, les variables météorologiques:

  • Précipitations - mannequin;
  • La température
  • L'écart de température par rapport à la moyenne de la saison.

En analysant directement les ventes quotidiennes de marchandises, j'ai constaté que:
Environ 30% seulement des marchandises ont été vendues tout le temps, toutes les autres marchandises ont été mises en vente après 2015 ou ont été retirées de la vente avant 2017, ce qui a entraîné une restriction importante du choix des marchandises pour la recherche et l'expérimentation des prix. Cela nous amène également au fait qu'en raison du changement constant de marchandises dans la ligne du magasin, il devient difficile de créer un système intégré de tarification des produits, mais il existe quelques moyens de contourner ce problème, qui sera discuté plus tard.

Système de tarification


Pour construire un système de recommandations de prix pour les marchandises pour la prochaine période de temps sur la base d'un modèle qui prédit la demande, j'ai proposé le schéma suivant:

image

Puisque, après avoir formé le modèle sur les données, nous obtenons un modèle qui rétablit la courbe de demande multifactorielle en fournissant divers prix des marchandises à l'entrée, nous recevrons les ventes estimées, en fonction de ce prix. Ainsi, nous pouvons effectuer une optimisation des prix pour atteindre le résultat souhaité - maximiser les revenus ou les bénéfices attendus. Il ne reste plus qu'à former un modèle qui pourrait bien prévoir les ventes.

Ce qui n'a pas fonctionné
Après avoir choisi l'un des produits pour la recherche, j'ai utilisé XGBoost, avant de passer directement au modèle LSTM.

J'ai fait cela dans l'espoir que XGBoost m'aidera à éliminer de nombreux facteurs inutiles (cela se produit automatiquement), et les autres devraient être utilisés pour les modèles LSTM. J'ai utilisé cette approche consciemment, car, afin d'éviter des questions inutiles sur la défense de la thèse, je voulais obtenir une justification forte et, en même temps, simple du choix des facteurs pour le modèle d'une part, et d'autre part, la simplification du développement. De plus, j'ai reçu un modèle prêt à l'emploi, grossier, sur lequel il a été possible de tester rapidement diverses idées dans l'étude. Et après cela, après avoir acquis une compréhension finale de ce qui fonctionnera et de ce qui ne fonctionnera pas, créez le modèle LSTM final.

Pour comprendre le problème de prévision, je vais donner un calendrier de vente quotidien pour le premier produit sélectionné:

image

La série chronologique complète des ventes sur le graphique a été divisée en ventes moyennes pour la période, afin de ne pas révéler les valeurs réelles, mais de garder le look.

En général, beaucoup de bruit, alors qu'il y a des rafales prononcées - c'est la conduite des promotions au niveau du réseau.

Comme pour moi, c'était la première expérience dans la construction de modèles d'apprentissage automatique, j'ai dû consacrer beaucoup de temps à divers articles et documentation, de sorte que finalement quelque chose a fonctionné pour moi.

Une liste initiale de facteurs qui affectent vraisemblablement les ventes:

  • Données sur les ventes quotidiennes d'autres marchandises de ce groupe, les ventes totales du groupe en pièces et le nombre de chèques pour tous les magasins de Saint-Pétersbourg avec les retards 1, 2, 3, 7, 14, 21, 28;
  • Données sur les prix des autres biens du groupe;
  • Le rapport entre le prix du produit soumis à l'enquête et les prix des autres marchandises du groupe;
  • Le prix le plus bas parmi tous les concurrents (les données ont été prises une fois par semaine, et j'ai fait l'hypothèse que ces prix seront valables pour la semaine prochaine);
  • Le rapport entre le prix du produit étudié et le prix le plus bas de la concurrence;
  • Ventes en retard par groupe (en morceaux);
  • Moyenne simple et RSI sur la base des décalages des ventes de biens du groupe, des ventes totales du groupe et du nombre de contrôles.

Un total de 380 facteurs. (2,42 observations par facteur). Ainsi, le problème de la coupure des facteurs insignifiants était vraiment élevé, cependant, XGBoost a aidé à y faire face, réduisant considérablement le nombre de facteurs à 23 (40 observations par facteur).

Le meilleur résultat que j'ai pu obtenir en utilisant la recherche de cupidité est le suivant:

image
R ^ 2-adj = 0,4 sur l'échantillon d'essai

Les données ont été divisées en échantillons d'apprentissage et d'essai sans mélange (puisqu'il s'agit d'une série chronologique). Comme mesure, j'ai utilisé l'indicateur R ^ 2 ajusté consciemment, car la présentation des résultats finaux du travail devait avoir lieu devant la commission, incl. composé de représentants d'entreprises, il était donc utilisé comme le plus célèbre et le plus facile à comprendre.

Les résultats finaux ont diminué ma croyance en la réussite, car le résultat de R ^ 2-adj 0.4 signifiait seulement que le système de prédiction ne serait pas en mesure de prédire assez bien la demande le lendemain, et la recommandation pour le prix ne différerait pas beaucoup du système "doigt dans le ciel".

De plus, j'ai décidé de vérifier l'efficacité de l'utilisation de XGBoost pour prédire les ventes quotidiennes d'un groupe de marchandises (dans des blagues) et prédire le nombre de contrôles en général sur le réseau.

Ventes par groupe de produits:

image
R ^ 2-adj = 0,71

Contrôles:

image
R ^ 2-adj = 0,86

Je pense que la raison pour laquelle les données sur les ventes d'un produit particulier n'ont pas pu être prédites est claire d'après les graphiques présentés - le bruit. Les ventes individuelles de marchandises se sont révélées trop sensibles au hasard, de sorte que la méthode de construction d'une régression n'a pas été efficace. Dans le même temps, en agrégeant les données, nous avons supprimé l'influence du hasard et obtenu de bonnes capacités prédictives.

Afin de m'assurer enfin que prédire la demande un jour à l'avance soit un exercice inutile, j'ai utilisé le modèle SARIMAX (package statsmodels pour python) pour les ventes quotidiennes:

image

image

En fait, les résultats ne diffèrent en aucune façon de ceux obtenus avec XGBoost, ce qui suggère que l'utilisation d'un modèle complexe dans ce cas n'est pas justifiée.

Dans le même temps, je tiens également à noter que ni les facteurs météorologiques XGBoost ni SARIMAX n'étaient significatifs.

Construire le modèle final


La solution au problème de la qualité des prévisions était d'agréger les données à un niveau hebdomadaire. Cela nous a permis de réduire l'influence de facteurs aléatoires, mais a considérablement réduit la quantité de données observées: s'il y avait 920 données quotidiennes, seulement 131 données hebdomadaires. considérablement diminué.

De plus, ma tâche a été compliquée par le fait qu'à ce moment-là, la société a décidé de changer le produit que l'expérience sera appliquée en utilisant le modèle, j'ai donc dû développer un modèle à partir de zéro.

Le changement de marchandises s'est produit sur les marchandises avec une saisonnalité prononcée:

image

En raison du passage aux ventes hebdomadaires, une question logique s'est posée: est-il suffisant d'utiliser le modèle LSTM avec une si petite quantité de données? J'ai décidé de me renseigner dans la pratique et, tout d'abord, de réduire le nombre de facteurs (même si c'était un dommage potentiel dans la réduction des informations importantes). J'ai jeté tous les facteurs qui sont calculés sur la base des décalages de vente (moyenne, RSI), des facteurs météorologiques (sur les données quotidiennes, la météo n'a pas d'importance, et le transfert au niveau hebdomadaire, d'autant plus perdu de sens). Après cela, j'ai traditionnellement utilisé XGBoost pour couper d'autres facteurs insignifiants. Plus tard, j'ai également compartimenté plusieurs autres facteurs basés sur le modèle LSTM, excluant simplement les facteurs un par un, entraînant à nouveau le modèle et comparant les résultats.

La liste finale des facteurs est la suivante:

  • Le rapport du prix au kilogramme du produit étudié et de l'apprêt CERESIT ST 17 10 l.;
  • Le rapport du prix du produit étudié et du produit et apprêt CERESIT ST 17 10 l;
  • Le rapport du prix du produit étudié et de l'apprêt EURO PRIMER 3 l;
  • Le rapport entre le prix du produit étudié et le prix minimum pratiqué par les concurrents;
  • Variables factices pour trois promotions au niveau du réseau;
  • Variables factices des saisons de printemps, d'été et d'automne;
  • Enregistre 1 à 5 ventes hebdomadaires du produit étudié.

Seulement 15 facteurs (9 observations par facteur).

Le modèle LSTM final a été écrit en utilisant Keras, comprenait 2 couches cachées (25 et 20 neurones, respectivement), et l'activateur était un sigmoïde.

Le code du modèle LSTM final utilisant 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') 

Résultat:

image

image

La qualité de la prédiction sur l'échantillon de test semblait assez convaincante en termes de métriques, cependant, à mon avis, elle n'atteignait toujours pas l'idéal, car, malgré la détermination assez précise du niveau moyen des ventes, les rafales dans les semaines individuelles pouvaient s'écarter assez fortement de " le niveau moyen des ventes, qui a donné un écart important entre les prévisions de ventes et la réalité sur des jours individuels (jusqu'à 50%). Néanmoins, j'ai utilisé ce modèle directement pour l'expérience en pratique.

Il est également intéressant de voir à quoi ressemble la courbe de demande restaurée en termes de prix. Pour ce faire, j'ai exécuté le modèle sur la fourchette de prix et, en fonction des ventes prévues, j'ai construit une courbe de demande:

image

Une expérience


Chaque semaine, le réseau a fourni les données de vente de la semaine précédente à Saint-Pétersbourg, ainsi que les prix des concurrents. Sur la base de ces données, j'ai effectué une optimisation des prix pour maximiser les bénéfices attendus, a déclaré le prix que le réseau devrait fixer pour la semaine prochaine, ce qu'il a fait. Cela a continué pendant 4 semaines (le terme a été convenu avec le détaillant).

La maximisation des bénéfices a été réalisée avec des restrictions: le prix minimum était le prix d'achat + fix. En supplément, le prix maximum était limité par le prix de l'apprêt du même fabricant, uniquement dans un emballage de 10l.

Les résultats expérimentaux sont présentés dans les tableaux ci-dessous (tous les nombres sont divisés par une certaine valeur afin de ne pas révéler les valeurs absolues):

Prévision des ventes:

image

Prédiction des bénéfices:

image

Afin d'évaluer l'impact du nouveau système de tarification sur les ventes, j'ai comparé les ventes de la même période, uniquement pour les années précédentes.

Résultats sommaires sur 4 semaines:

image

En conséquence, nous obtenons une image double: des prévisions de ventes totalement irréalistes, mais en même temps, des résultats purement positifs sur les indicateurs économiques (tant en termes de bénéfices que de revenus).

L'explication, à mon avis, est que dans ce cas, le modèle, prédisant de manière incorrecte les ventes, a néanmoins saisi l'idée correcte - l'élasticité-prix de ce produit était inférieure à 1, ce qui signifie que le prix pouvait être augmenté, sans crainte d'une baisse des ventes, que nous avons constatée (les ventes en unités sont restées à peu près au même niveau que la précédente et l'année précédente).

Mais n'oubliez pas que 4 semaines est une période à court terme et l'expérience a été menée sur un seul produit. À long terme, la surfacturation des marchandises dans un magasin entraîne, en règle générale, une baisse des ventes pour le magasin dans son ensemble. Pour confirmer mon intuition à ce sujet, j'ai décidé, à l'aide de XGBoost, de vérifier si les consommateurs ont une «mémoire» pour les prix des périodes précédentes (si par le passé c'était plus cher «global» que les concurrents, le consommateur se tournait vers les concurrents). C'est-à-dire si le niveau de prix moyen du groupe pour les 1, 3 et 6 derniers mois sera fourni pour les ventes par groupe de produits.

image

En effet, la conjecture a été confirmée: d'une manière ou d'une autre, le niveau de prix moyen des périodes précédentes affecte les ventes de la période en cours. Cela signifie qu'il ne suffit pas d'effectuer l'optimisation des prix dans la période actuelle pour un seul produit - il est également nécessaire de prendre en compte le niveau général des prix à long terme. Ce qui, en général, conduit à une situation où les tactiques (maximisation des profits maintenant) sont contraires aux stratégies (survie en compétition). Cela, cependant, est déjà mieux laissé aux commerçants.

Compte tenu des résultats et de l'expérience, à mon avis, de manière optimale, un système de tarification basé sur une prévision des ventes pourrait ressembler à ceci:

  1. Aller plus loin dans la gamme de produits consiste à effectuer une analyse de cluster et à regrouper les tournevis conditionnels par similitude et prévisions de ventes et à fixer le prix non pas pour un seul tournevis, mais pour ce sous-groupe, nous éviterons donc le problème de supprimer et d'ajouter constamment des nomenclatures de produits.
  2. Effectuer l'optimisation des prix dans le complexe - non seulement pour des sous-groupes de marchandises individuels, mais également en tenant compte des effets à long terme. Pour ce faire, vous pouvez utiliser le modèle qui prédit les ventes dans son ensemble sur le réseau, heureusement, il s'est avéré d'une précision impressionnante même sur les ventes quotidiennes.

Résumant les résultats du travail accompli, je tiens à dire que cela a été difficile pour moi, en tant que personne non expérimentée dans le développement en général, et dans les méthodes de MO en particulier, cependant, tout s'est avéré réalisable. Il était également intéressant de vérifier par vous-même comment ces méthodes sont applicables dans la réalité. Après avoir lu de nombreux articles auparavant, mes yeux brûlaient du fait que j'essaierais de tout faire moi-même et je m'attendais à obtenir d'excellents résultats. La pratique s'est avérée sévère - un petit nombre de marchandises avec une longue histoire de vente, des données quotidiennes bruyantes, des ratés dans la prévision des volumes de vente, l'utilisation de modèles complexes n'est pas toujours justifiée. Néanmoins, j'ai vécu une expérience inoubliable et j'ai appris ce que signifie mettre l'analytique en pratique.

→ Sur la base du travail effectué, j'ai préparé un projet dans mon référentiel

Dans le référentiel, vous trouverez un ensemble de données généré sur la base de dépendances tirées de données réelles, ainsi qu'un script python qui vous permet de mener une expérience virtuelle sur ces données générées, vous proposant de tenter votre chance et de dépasser le modèle en fonction de votre profit, en fixant le prix du produit. Il vous suffit de télécharger et d'exécuter le script.

J'espère que mon expérience aidera à déterminer les limites de l'utilisation des méthodes MO et montrera que la patience et la persévérance peuvent produire des résultats, même si vous n'êtes pas un professionnel dans aucun domaine.

Source: https://habr.com/ru/post/fr421429/


All Articles