Описание задачи
Требуется на основе статистики продаж за 2 года создать модель прогнозирования спроса на месяц в для ключевых и прочих клиентов в разрезе групп товара. Ключевые клиенты берут товар с постоянной ритмичностью. Состав групп однороден по единицам хранения, ценам. Требуется создать модель предсказания спроса в зависимости от уровня скидок/цен, с учетом сезонности и ритмичности. И если есть зависимость уровня спроса от цен и цены скидки на будущий месяц можно менять, то в модели можно будет использовать цены и скидки в качестве параметром прогнозирования. Т.е. рассчитывать например сколько товара возьмет клиент если дать ему скидку 10%, а сколько если дать 5%.
Внимание! Выбранные показатели модели подбирались для конкретного бизнеса. Применение именно этих же показателей для других предприятий может вызвать отрицательный эффект. Например "Количество в предыдущем периоде" очень специфический показатель, который подходит только если есть определенная ритмичность спроса.
Входные и выходные данные
Для обучения/прогноза были выбраны следующие показатели
Входы:
Номер месяца – с этим все просто. Выраженная сезонность спроса. Собственно, если убрать все остальные входы сети и оставить только "номер месяца", то сеть сделает некую функцию для каждого клиента. Даже хватит одного нейрона. Это вполне можно использовать на замену обычному планированию которое есть в типовых.
Цена/скидка. Попытка построить для каждого клиента что-то наподобие «кривой спроса» (https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D1%81%D0%BF%D1%80%D0%BE%D1%81%D0%B0) на основе статистики и использовать для получения прогноза. Т.е. можно поиграться с параметрами - указывать цены в параметрах и на основе модели получать прогноз продаж. По факту оказалось что более правильным было использовать скидку а не цену, но я оставил «средние цены» - может в каком то другом случае это пригодится. Зависимость от скидки оказалась предсказуемая – чем больше скидка тем больше продажи.
Количество за предыдущий месяц – количество товара купленного покупателем за предыдущий месяц
В обработке нет еще одного важного входа – «Промоакции». Я убрал его так как для его получения требуется дописанный документ которого нет в типовых. Документ фиксирует маркетинговые мероприятия.
Выход: количество продаж группы товаров у клиента за месяц
Как это устроено?
На каждого постоянного покупателя и группу товара (или Родителя) создается 3-х или 4-х- слойный перцептрон (остальные покупателя попадают в группу «Прочие клиенты»). Потом он обучается на истории продаж и все эти сети сохраняются в один файл. А потом на основе этого файла-обученной модели можно выполнять прогнозирование, т.е. решение сети. Сами созданные сети между собой никак не созданы. Данная модель не учитывает зависимость между группами (одного товара берут больше за счет другого). Данная модель предполагает полностью обеспеченный запасами спрос.
Работа с отчетом
- Выбираются общие настройки – показатель цены, ном группа, количество периодов. Начало месяца за котрый надо получить прогноз (при условии что факт по предшествующему периоду присутствует)
- Выбираются постоянные покупатели
- Выбираются параметры обучения – количество слоев, количество итераций. При необходимости «2 скрытых слоя». Это подбирается экспериментально. Также можно встретить различные подходы. Например, в этой ветке (https://stats.stackexchange.com/questions/181/how-to-choose-the-number-of-hidden-layers-and-nodes-in-a-feedforward-neural-netw) есть вот такой метод
Или вот такой (как видно совсем другой подход) http://mei06.narod.ru/sem7/iis/shpora/page2_9.htm
Выбор количества слоев зависит от свойств аппроксимируемой зависимости. Считается что 4-х слойный перцептрон (2 скрытых слоя) теоретически может аппроксимировать любую функцию. С одним скрытым слоем обучение проходит быстрее, но ориентироваться надо конечно на погрешность результата. Я не пишу тут про риски переобучения и другие сложности, так как это тема для отдельной статьи и в интернете их множество.
- Нажимается кнопка «Запустить обучение». Оно может быть долгим – до пары часов.
- После того как сеть обучена она с прочими параметрами хранится в файле. Это позволяет обращаться к ней и выполнять расчет быстро.
- Для получения прогноза нужно указать начало месяца прогноза
- Можно установить цены/скидки вручную которые планируется использовать в предстоящем периоде. Или можно поиграться ценами и посмотреть что будет со спросам при разных уровнях скидок.
- Сформировать отчет.
Проверка эффективности
Для проверки эффективности я оставил пару последних месяцев для того чтобы сравнить расчет с фактом. Т.е. например в ноябре я делал расчет на 1 сентября, чтобы потом сделать прогноз на Сентябрь, а так как сентябрь уже завершился то проверить насколько не сошелся факт с тем что показал прогноз. Для этого я в отчете добавил колонки Факт, Отклонение и Отклонение в %. Получил отклонения как на картинке в пределах 10-15%. Конечно это ни о чем не говорит и для оценки погрешности, мат. ожидания нужно больше наблюдений, но в целом результат приемлем учитываю непредсказуемость нашей экономической обстановки.