No es ningún secreto que los métodos de aprendizaje automático comenzaron a penetrar en diversas áreas del negocio en todas partes, optimizando, mejorando e incluso creando nuevos procesos comerciales. Una de las áreas importantes es la cuestión de establecer el precio de los bienes, y aquí, con suficientes datos, el MO ayuda a hacer lo que antes era difícil de lograr: restaurar la curva de demanda de múltiples factores a partir de los datos. Gracias a la curva de demanda restaurada, se hizo posible construir sistemas de precios dinámicos que permiten la optimización de precios dependiendo del propósito de los precios, para aumentar los ingresos o las ganancias. Este artículo es una compilación de mi disertación, en la que el modelo dinámico de fijación de precios LSTM-ANN fue desarrollado y probado en la práctica durante 4 semanas para uno de los productos del minorista de artículos para el hogar.
Quiero señalar de inmediato que en este artículo no revelaré el nombre de la compañía en la que se realizó el estudio (sin embargo, esta es una de las compañías de la lista en las instalaciones), en lugar de eso simplemente lo nombraré - Minorista.
Antecedentes
Hay un líder de precios en el mercado minorista de artículos para el hogar, Leroy Merlin. Los volúmenes de ventas de esta red les permiten mantener una estrategia de precio mínimo para toda la gama de productos, lo que lleva a la presión de los precios sobre otros actores del mercado.
Ingresos y ganancias de los principales minoristas en San Petersburgo al 31 de diciembre de 2017

En este sentido, el minorista utiliza un enfoque diferente para la fijación de precios:
- El precio se establece en el más bajo de los competidores;
- Restricción en el precio desde abajo: precio de compra + prima mínima que refleja los costos aproximados por unidad de bienes.
Este enfoque es una combinación del costoso método de fijación de precios y la fijación de precios de la competencia. Sin embargo, no es perfecto, no tiene en cuenta directamente la demanda del consumidor.
Debido al hecho de que el modelo dinámico de fijación de precios tiene en cuenta muchos factores (demanda, estacionalidad, promociones, precios de la competencia), y también le permite imponer restricciones sobre el precio propuesto (por ejemplo, desde la parte inferior, que cubre los costos), potencialmente este sistema se deshace de toda la unilateralidad y desventajas de otros métodos de fijación de precios.
Datos
Para el estudio, la compañía proporcionó datos de enero de 2015 a julio de 2017 (920 días / 131 semanas). Estos datos incluyen:
- Ventas diurnas, incluidos fines de semana, para 470 productos (16 grupos de productos);
- Días de promociones en la tienda;
- Días en que se proporcionaron descuentos en bienes;
- Precios para cada uno de 470 productos;
- Datos diarios sobre el número de controles en toda la red en San Petersburgo;
- Precios de los principales competidores para la mayoría de los 470 productos (los datos se tomaron una vez por semana).
Además de estos datos, también agregué variables ficticias de calendario:
- Temporada del año (otoño / invierno / verano / primavera);
- Mes
- Cuarto;
- Día de la semana;
- Vacaciones
Además, las variables climáticas:
- Precipitación - ficticia;
- Temperatura
- La desviación de la temperatura del promedio en la temporada.
Al analizar directamente las ventas diarias de bienes, descubrí que:
Solo alrededor del 30% de los productos se vendieron todo el tiempo, todos los demás productos se pusieron a la venta después de 2015 o se retiraron de la venta antes de 2017, lo que condujo a una restricción significativa en la elección de productos para la investigación y el experimento de precios. Esto también nos lleva al hecho de que, debido al cambio constante de productos en la línea de la tienda, se hace difícil crear un sistema integrado de fijación de precios de productos básicos, sin embargo, hay algunas formas de solucionar este problema, que se discutirán más adelante.
Sistema de precios
Para construir un sistema de recomendaciones de precios para los bienes para el próximo período de tiempo sobre la base de un modelo que predice la demanda, se me ocurrió el siguiente esquema:

Dado que, después de haber entrenado el modelo en los datos, obtenemos un modelo que restableció la curva de demanda multifactorial al suministrar varios precios de bienes a la entrada, recibiremos las ventas estimadas, dependiendo de este precio. Por lo tanto, podemos llevar a cabo la optimización de precios para lograr el resultado deseado: maximizar los ingresos esperados o las ganancias esperadas. Solo queda entrenar un modelo que bien podría predecir las ventas.
Lo que no funcionó
Después de elegir uno de los productos para la investigación, utilicé XGBoost, antes de pasar directamente al modelo LSTM.
Hice esto con la expectativa de que XGBoost me ayudara a descartar muchos factores innecesarios (esto sucede automáticamente), y los restantes deberían usarse para los modelos LSTM. Utilicé este enfoque conscientemente, porque, para evitar preguntas innecesarias sobre la defensa de la disertación, quería obtener una justificación fuerte y, al mismo tiempo, simple de la elección de factores para el modelo, por un lado, y por otro lado, la simplificación del desarrollo. Además, recibí un modelo ya preparado, en bruto, en el que era posible probar rápidamente varias ideas en el estudio. Y después de eso, habiendo llegado a una comprensión final de lo que funcionará y lo que no, haga el modelo LSTM final.
Para comprender el problema del pronóstico, le daré un cronograma de ventas diario para el primer producto seleccionado:

Toda la serie temporal de ventas en el gráfico se dividió en ventas promedio para el período, a fin de no revelar valores reales, sino mantener el aspecto.
En general, mucho ruido, aunque hay ráfagas pronunciadas: esta es la realización de promociones a nivel de red.
Como para mí fue la primera experiencia en la construcción de modelos de aprendizaje automático, tuve que dedicar mucho tiempo a varios artículos y documentación, por lo que, en última instancia, algo me funcionó.
Una lista inicial de factores que presumiblemente afectan las ventas:
- Datos sobre las ventas diarias de otros bienes de este grupo, las ventas totales del grupo en piezas y el número de cheques para todas las tiendas en San Petersburgo con retrasos 1, 2, 3, 7, 14, 21, 28;
- Datos sobre precios de otros bienes del grupo;
- La relación del precio del producto investigado con los precios de otros bienes del grupo
- El precio más bajo entre todos los competidores (los datos se tomaron una vez por semana, y asumí que tales precios serán válidos para la próxima semana);
- La relación del precio del producto investigado con el precio más bajo de los competidores;
- Retrasos de ventas por grupo (en piezas);
- Promedio simple y RSI basado en los retrasos en las ventas de bienes del grupo, las ventas totales en el grupo y el número de cheques.
Un total de 380 factores. (2.42 observaciones por factor). Por lo tanto, el problema de cortar factores insignificantes era realmente alto, sin embargo, XGBoost ayudó a hacer frente a esto, reduciendo significativamente el número de factores a 23 (40 observaciones por factor).
El mejor resultado que podría lograr con la búsqueda de avaricia es el siguiente:

R ^ 2-adj = 0.4 en la muestra de prueba
Los datos se dividieron en muestras de entrenamiento y prueba sin mezclar (ya que esta es una serie de tiempo). Como medida, utilicé el indicador R ^ 2 ajustado conscientemente, ya que la presentación de los resultados finales del trabajo tuvo que realizarse antes de la comisión, incl. compuesto por representantes comerciales, por lo tanto, se utilizó como el más famoso y fácil de entender.
Los resultados finales disminuyeron mi creencia en el éxito, porque el resultado de R ^ 2-adj 0.4 solo significaba que el sistema de predicción no podría predecir la demanda al día siguiente bastante bien, y la recomendación del precio no diferiría mucho del sistema "dedo en el cielo".
Además, decidí verificar cuán efectivo será el uso de XGBoost para predecir las ventas diarias de un grupo de bienes (en bromas) y el número de controles en general en la red.
Ventas por grupo de productos:

R ^ 2-adj = 0.71
Cheques:

R ^ 2-adj = 0.86
Creo que la razón por la que no se pudieron predecir los datos de ventas de un producto en particular se desprende de los gráficos presentados: ruido. Las ventas individuales de bienes resultaron ser demasiado susceptibles al azar, por lo que el método de construir una regresión no fue efectivo. Al mismo tiempo, al agregar los datos, eliminamos la influencia de la aleatoriedad y obtuvimos buenas capacidades predictivas.
Para finalmente asegurarme de que predecir la demanda con un día de anticipación es un ejercicio inútil, utilicé el modelo SARIMAX (paquete statsmodels para python) para las ventas diarias:


De hecho, los resultados no difieren en modo alguno de los obtenidos con XGBoost, lo que sugiere que el uso de un modelo complejo en este caso no está justificado.
Al mismo tiempo, también quiero señalar que ni los factores climáticos XGBoost ni SARIMAX fueron significativos.
Construyendo el modelo final
La solución al problema de la calidad de predicción fue agregar datos a nivel semanal. Esto hizo posible reducir la influencia de factores aleatorios, sin embargo, redujo significativamente la cantidad de datos observados: si había 920 datos diarios, solo 131 semanales. La situación empeoró por el hecho de que el número de factores permaneció casi sin cambios (se excluyeron los dummies durante días de la semana), pero el número de observaciones de la variable objetivo disminuyó mucho
Además, mi tarea se complicó por el hecho de que en ese momento, la compañía decidió cambiar el producto que el experimento se aplicará utilizando el modelo, por lo que tuve que desarrollar un modelo desde cero.
El cambio de bienes ocurrió en los bienes con una estacionalidad pronunciada:

Debido al cambio a las ventas semanales, surgió una pregunta lógica: ¿es adecuado usar el modelo LSTM con una cantidad tan pequeña de datos? Decidí averiguarlo en la práctica y, en primer lugar, reducir la cantidad de factores (incluso si era un daño potencial en la reducción de información importante). Descarté todos los factores que se calculan sobre la base de los retrasos en las ventas (promedio, RSI), factores climáticos (en los datos diarios, el clima no importó y la transferencia al nivel semanal, más aún, perdió algo de sentido). Después de eso, tradicionalmente, usé XGBoost para cortar otros factores insignificantes. Más tarde, compartí adicionalmente varios factores más basados en el modelo LSTM, simplemente excluyendo los factores uno por uno, entrenando el modelo nuevamente y comparando los resultados.
La lista final de factores es la siguiente:
- La relación del precio por kilogramo del producto investigado y la imprimación CERESIT ST 17 10 l.
- La relación del precio del producto investigado y el producto y la imprimación CERESIT ST 17 10 l;
- La relación del precio del producto investigado y la imprimación EURO PRIMER 3 l;
- La relación del precio del producto investigado y el precio mínimo de los competidores;
- Variables ficticias para tres promociones a nivel de red;
- Variables ficticias de primavera, verano y otoño;
- Registra de 1 a 5 ventas semanales del producto investigado.
Solo 15 factores (9 observaciones por factor).
El último modelo LSTM fue escrito usando Keras, incluía 2 capas ocultas (25 y 20 neuronas, respectivamente), y el activador era un sigmoide.
El código para el modelo LSTM final con 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:


La calidad de la predicción en la muestra de prueba parecía bastante convincente por la métrica, sin embargo, en mi opinión, todavía no alcanzó el ideal, porque, a pesar de la determinación bastante precisa del nivel promedio de ventas, las explosiones en semanas individuales podrían desviarse bastante de " nivel promedio de ventas, que dio una fuerte desviación del pronóstico de ventas de la realidad en días individuales (hasta 50%). Sin embargo, utilicé este modelo directamente para el experimento en la práctica.
También es interesante ver cómo se ve la curva de demanda restaurada en términos de precio. Para hacer esto, ejecuté el modelo sobre el rango de precios y, en función de las ventas previstas, construí una curva de demanda:

Un experimento
Cada semana, la red proporcionó datos de ventas de la semana anterior en San Petersburgo, así como los precios de los competidores. En base a estos datos, realicé la optimización de precios para maximizar las ganancias esperadas, dijo el precio que la red debería establecer para la próxima semana, y lo hizo. Esto continuó durante 4 semanas (el plazo se acordó con el minorista).
La maximización de ganancias se realizó con restricciones: el precio mínimo fue el precio de compra + arreglo. recargo, el precio máximo estaba limitado por el precio de la imprimación del mismo fabricante, solo en un paquete de 10 litros.
Los resultados experimentales se presentan en las tablas a continuación (todos los números se dividen por un cierto valor para no revelar los valores absolutos):
Predicción de ventas:

Predicción de ganancias:

Para evaluar el impacto del nuevo sistema de precios en las ventas, comparé las ventas para el mismo período, solo para años anteriores.
Resultados resumidos de 4 semanas:

Como resultado, obtenemos una imagen doble: predicciones completamente poco realistas sobre las ventas, pero al mismo tiempo, resultados puramente positivos en los indicadores económicos (tanto en términos de ganancias como de ingresos).
La explicación, en mi opinión, es que en este caso, el modelo, al predecir incorrectamente las ventas, sin embargo captó la idea correcta: la elasticidad del precio de este producto era inferior a 1, lo que significa que el precio podría aumentar, sin temor a una caída en las ventas, lo que vimos (las ventas en unidades se mantuvieron en aproximadamente el mismo nivel que en el anterior y el año anterior).
Pero no olvide que 4 semanas es un período a corto plazo y que el experimento se realizó con un solo producto. A la larga, el sobreprecio de los productos en una tienda conduce, por regla general, a una caída en las ventas de la tienda en general. Para confirmar mi presentimiento sobre esto, decidí, usando XGBoost, verificar si los consumidores tienen una "memoria" para los precios de períodos anteriores (si en el pasado era más costoso "en general" que los competidores, el consumidor acude a los competidores). Es decir si el nivel de precio promedio para el grupo durante los últimos 1, 3 y 6 meses se proporcionará para las ventas por grupos de productos.

De hecho, se confirmó la conjetura: de una forma u otra, el nivel de precio promedio para períodos anteriores afecta las ventas en el período actual. Esto significa que no es suficiente llevar a cabo la optimización de precios en el período actual para un solo producto; también es necesario tener en cuenta el nivel general de precios a largo plazo. Lo que, en general, conduce a una situación en la que las tácticas (maximizar las ganancias ahora) son contrarias a las estrategias (supervivencia en la competencia). Esto, sin embargo, ya es mejor dejarlo a los vendedores.
Dados los resultados y la experiencia, en mi opinión, lo más óptimo, un sistema de precios basado en un pronóstico de ventas podría verse así:
- Ir un paso más allá de la gama de productos es realizar un análisis de conglomerados y agrupar destornilladores condicionales por similitud y pronosticar las ventas y establecer el precio no para un solo destornillador, sino para este subgrupo, de modo que evitemos el problema de eliminar y agregar constantemente nomenclaturas de productos.
- Realización de la optimización de precios en el complejo, no solo para subgrupos individuales de bienes, sino también teniendo en cuenta los efectos a largo plazo. Para hacer esto, puede usar el modelo que predice las ventas en general a través de la red, afortunadamente, resultó ser impresionantemente preciso incluso en las ventas diarias.
Resumiendo los resultados del trabajo realizado, quiero decir que fue difícil para mí, ya que no era una persona experimentada en desarrollo en general, y en los métodos de MO en particular, sin embargo, todo resultó ser factible. También fue interesante comprobar por ti mismo cómo estos métodos son aplicables en la realidad. Después de leer muchos artículos antes, me ardieron los ojos por el hecho de que trataría de hacer todo por mí mismo y anticipé que obtendría excelentes resultados. La práctica resultó ser dura: una pequeña cantidad de productos con un largo historial de ventas, datos diarios ruidosos, fallas en la predicción de volúmenes de ventas, el uso de modelos complejos no siempre está justificado. Sin embargo, obtuve una experiencia inolvidable y aprendí lo que significa poner en práctica la analítica.
→ Basado en el trabajo realizado, preparé un proyecto en mi
repositorioEn el repositorio encontrará un conjunto de datos generado sobre la base de dependencias tomadas de datos reales, así como un script de Python que le permite realizar un experimento virtual sobre estos datos generados, ofreciéndole probar suerte y superar el modelo de acuerdo con sus ganancias, estableciendo el precio de los bienes. Todo lo que necesitas es descargar y ejecutar el script.
Espero que mi experiencia ayude a determinar los límites del uso de los métodos de MO y demuestre que la paciencia y la perseverancia pueden lograr resultados, incluso si usted no es un profesional en ningún campo.