В конце прошлого года поступил запрос на рассмотрение интересного кейса: спрогнозировать объем продаж продукта на рынке при динамическом ценообразовании. Помимо ответа на основной вопрос, следовало определить экономическую целесообразность применения динамического изменения цен для максимизации выручки, просчитать различные сценарии на рынке и выдвинуть гипотезы об объемах реализации продукта в сетях-конкурентах. Сложность данной задачи заключается в том, что при отсутствии исходных данных за предыдущие периоды не получится с ходу применить популярные подходы Data Science. Следовательно, необходимо сначала симулировать поведение покупателей, а только затем приступать к оценке адекватности полученной информации. Забегая вперед, стоит оговориться, что построить модель, достоверно и просто описывающую поведение потребителей на рынке полумиллионного города, не получилось, поэтому мне остается лишь познакомить читателей с промежуточными результатами, которые возможно натолкнут кого-то на более плодотворные изыскания в данной области. Для того, чтобы рассуждения не носили пространный характер, принцип работы модели будет проиллюстрирован на примере такого продукта как сыр.
На мой взгляд решение данной задачи должно проходить в семь этапов:
сбор предварительной информации из открытых источников,
формирование сценариев ценообразования как своей компании, так и компаний-конкурентов,
построение дерева решений, которое максимально точно отражает логику принятия решения о покупке,
написание кода симулятора,
запуск симулятора для генерации датасета с покупками,
проверка полученных данных на экономическую правдоподобность,
загрузка информации в BI-систему для построения управленческого отчета и поиска инсайтов.
Какие стартовые данные нам необходимы для формирования модели? Во-первых, это среднедушевое потребление продукта в год и процентное соотношение разных видов сыров в потребительской корзине. Эти показатели можно найти в Интернете. Далее можно рассчитать дневную норму потребления. Во-вторых, процентное соотношение одиноких и семейных людей, а также распределение типов семей. Эти данные нам необходимы, так как общее число населения города и количество людей, с которыми ритейлеры контактируют в торговом зале не равно. Следовательно, необходима грубая прикидка потенциального количества покупателей, которые будут приобретать товар на всю семью. В-третьих, необходимо установить основных ритейлеров региона и долю, которую они занимают на рынке. Учет магазинов, входящих в сети местного значения, равно как и отдельных торговых мест, реализующих сыр, представляется более трудоемкой задачей, так как сложно оценить валовые продажи продукта в данном сегменте, а также адекватно спрогнозировать их ценовую политику в течение всего года. Лучше всего сгруппировать данные хозяйствующие сегменты в отдельный кластер и установить для него относительно рандомное ценообразование.
Проработка ценовой политики на предстоящий год. На данном этапе вместе с отделом ценообразования формируем график изменение цен в торговых залах. Возможно создать несколько сценариев, чтобы лучше проработать все торговые стратегии. Сказать заранее, как поведут себя компании-конкуренты при том или ином развитии ситуации практически невозможно, поэтому для них можно поставить либо цифры исходя из их политики за предыдущие периоды, либо подбирать цены, которые будут максимально целесообразными в их положении. Вариант, что конкуренты выберут заведомо проигрышный путь, в сценариях лучше не учитывать. После того, как таблицы с ценами заполнены, их можно выгружать в отдельные текстовые файлы.
На следующем шаге вместе с отделом маркетинга нужно тщательно проработать дерево принятия решения при покупке товара. В идеале оно должно достаточно точно отражать логику, которой руководствуются реальные люди в торговом зале. Если алгоритм получается достаточно сложным, то лучше его описать в виде диаграммы. Это минимизирует шанс упустить одну из ветвей при написании кода.
Все предварительные операции выполнены, можно приступать непосредственно к написанию кода. В отдельном модуле описываем все многообразие признаков клиентов (количество человек в семье, уровень благосостояния, основной вид сыра, чувствительность к маркетинговым акциям, готовность на время отказаться от покупки товара и т.д.) и их предполагаемую частотность. Генерируем необходимое количество клиентов, начальные запасы сыра у покупателей и стартовые цены, по которым были совершены покупки. Можно запускать симуляцию. Она представляет собой цикл, в котором для каждого покупателя принимается ежедневное решение – покупает он товар или нет согласно дереву принятия решений. Если покупка совершается, то помимо корректировки баланса сыра нужно изменить данные о последней цене, по которой приобретался товар. Ознакомиться с кодом модели можно здесь. Все скрипы я старался снабдить максимальным количеством комментариев, чтобы весь ход расчетов был “прозрачен” для стороннего читателя.
Первоначальный вариант модели предполагал использование БД, но запросы не могут быть “бесплатными” по времени, поэтому скрипты отрабатывали настолько медленно, что не позволяли проводить в разумные сроки симуляцию более чем для нескольких сотен человек. Было принято решение переписать их так, чтобы вся информация на этапе принятия решения о покупке хранилась в синтаксических конструкциях Python. Это позволило использовать в расчетах уже несколько тысяч человек.
После сбора датасетов в итоговый файл можно провести быстрый EDA анализ. При этом полученную информацию лучше всего рассматривать через призму экономики компании. То есть в первую очередь следует учитывать суммарную выручку от продаж за выбранный период, структуру реализации в натурном выражении по видам продукции и, конечно, среднедушевое потребление сыра. Получить точно такие же данные, как и у органов государственной статистики, вряд ли получится, но расхождение должно быть в рамках разумного. Если сценарий будет выдавать кратный рост потребления в регионе, то такие расчеты следует поставить под сомнение. А вот к статистическим тестам в данном случае нужно относиться по-философски. Даже если удастся настроить код так, чтобы он выдавал результат, который будет удовлетворять всем условиям для применения тестов, нужно понимать, что покупки сгенерированы искусственно и на практике все может быть по-другому.
Если в компании есть практика применения BI-платформы для финального анализа данных, то на основе файла csv можно построить управленческий отчет для визуального контроля принимаемого решения.
Выводы по итогам проделанной работы.
Плюсы подобной симуляции
Возможность запуска модели даже на холодном старте, то есть не нужны исторические данные
Возможность видеть в динамике как свою позицию на рынке, так и конкурирующих фирм
Возможность видеть, как изменение в ценах отражается на объемах продаж (в кг и руб.)
Минусы подобной симуляции
Сложность (или невозможность) применения при большой номенклатуре
Невозможность применения для товаров ситуационного спроса
Необходимость переработки модели для товаров сезонного спроса
Необходимость относительно точного угадывания ценовой политики конкурентов
Ресурсоемкость выполнения расчетов для большой группы клиентов