ML-прогноз продаж: от B2B pipeline до B2C ритейла

Сезонные сдвиги и хаотичные скидки ломают план продаж, и решения принимаются наугад. Мы разрабатываем прогнозные модели под ключ: собираем данные, настраиваем расчёт и встраиваем его в ваши процессы. Итог — точность планирования выше, а ручной сверки меньше.
Часто задаваемые вопросы

Почему прогнозирование продаж ломается на сезонных сдвигах

Ручное планирование обычно выглядит так: берут продажи прошлого периода, умножают на коэффициент и добавляют запас «на всякий случай». Пока спрос ровный, такая таблица попадает в цель. Но сезонные колебания спроса редко повторяются день в день — пик сдвигается на две-три недели, и закупка приходит к концу всплеска, когда полка уже пуста.

Второй источник промаха — запаздывание данных. Факт из учётной системы приезжает выгрузкой раз в сутки или реже, часть каналов закрывается с задержкой в несколько дней, а решение о закупке и отгрузке принимается раньше, чем видно текущее движение. Отдельно расходятся справочники: в рознице, на маркетплейсах и в опте один товар живёт под разными кодами и в разных единицах, поэтому свести каналы в одну картину вручную не получается.

Акции и новинки ломают историю ещё сильнее. Всплеск от распродажи в данных выглядит как устойчивый рост, его переносят в будущий план и закупают лишнее. Новый товар приходит без сезонного профиля и без понимания, какие позиции он заберёт у соседних.

Цена ошибки двойная: склад заполняется тем, что не продаётся, а по ходовым позициям возникает дефицит и упущенная выручка, которую уже не вернуть. Разбираем, как это закрывается: где в контуре прогнозирования продаж появляются данные, как считаются сезонные индексы и как план сверяется с фактом.

Что даёт управляемый прогноз спроса: эффект в цифрах

Эффект от модели виден не в отчётах об обучении, а в операционных метриках: как часто ходовой товар кончается, сколько оборотных средств замерло на складе, насколько ровно загружены площади и смены. Ниже четыре измерения, по которым мы сравниваем состояние до и после запуска прогнозирования продаж.

Точность прогноза на дневном и недельном горизонте

Модель на CatBoost считает прогноз по каждой позиции отдельно, а не по средней категории: история отгрузок, сезонность, промо-календарь, доступность товара на полке. На дневном горизонте ошибка по ходовым позициям сокращается примерно вдвое — закупка идёт от прогноза, а не от среднего за прошлый период.

Дефицит ходовых позиций

Раньше всплеск спроса обнаруживался по факту — когда полка уже пуста, а поставка придёт через неделю. Интервальная оценка прогноза поднимает сигнал заранее: доля дней «нет в наличии» по топу сокращается в разы, а упущенный спрос не уходит в отмены и переход к конкуренту.

Замороженные остатки и оборачиваемость запасов

Обратная сторона ручного плана — страховой запас «на всякий случай» по всему ассортименту. Модель задаёт разную глубину запаса для стабильных и волатильных позиций: оборачиваемость запасов ускоряется, доля неликвида и товара, пережившего свой сезон, падает на треть.

Снятый класс ошибок планирования

Промо, скачок цен, задержка поставки — ручной план ломается целиком и молча. Мы проверяем прогноз на устойчивость и помечаем позиции с высокой неопределённостью для ручного решения: класс ошибок «сдвиг заметили слишком поздно» уходит, изменение спроса видно за недели до дефицита.

Форматы моделей прогнозирования продаж: регрессия и ансамбли

Выбор модели прогнозирования продаж диктует структура данных, а не сложность алгоритма: длина истории, горизонт планирования, число рядов и то, как часто появляются промо, смена цены и новые позиции. Ниже — четыре реальные альтернативы, между которыми обычно идёт выбор, с честными ограничениями каждой.

Вариант Когда подходит Ограничения
Простая регрессия на лагах и признаках Устойчивый тренд, десятки рядов, горизонт в пределах одного цикла сделки Не держит нелинейные взаимодействия «промо × канал», разъезжается на редких событиях
Сезонные модели (декомпозиция и экспоненциальное сглаживание) Выраженная недельная или годовая сезонность, стабильная история на два сезона и больше Тяжело переживает структурные сдвиги и открытие новых точек, параметры нужно перенастраивать вручную
Ансамбль моделей (градиентный бустинг на деревьях и на временных рядах) Сотни и тысячи позиций, десятки признаков, частая цена и промо Нужны витрина признаков и мониторинг дрейфа: без него ошибка растёт незаметно, объяснимость ниже
Гибридный подход: модель плюс правила экспертов Запуск новых категорий, дефицит истории, жёсткие правила по минимальной партии и лимитам склада Правила надо версионировать и поддерживать, есть риск зашить в них мнение эксперта вместо данных

На практике вариант не выбирают «на глаз»: сначала считаем базовый прогноз и наивную модель как точку отсчёта, затем прогоняем кандидатов на скользящем окне и смотрим ошибку отдельно по топовым позициям, новинкам и промо-неделям. Часто итогом становится ансамбль или гибрид — но уже с цифрами, показывающими, где именно сложная модель выигрывает у простой.

Как мы внедряем прогнозную модель: этапы работы

Прогноз продаж перестаёт приносить пользу, когда его строят в отрыве от данных и от процесса планирования. Поэтому маршрут начинается не с выбора алгоритма, а с аудита источников, и заканчивается приёмкой качества прогноза на вашей стороне — на согласованных метриках, а не на обещаниях.

  1. Аудит данных. Разбираем источники: учётную систему, склад, веб-аналитику, выгрузки из маркетплейсов. Смотрим глубину истории, задержки поступления, дубли, пропуски и смену справочников — фиксируем, чего не хватает и что придётся восстанавливать.
  2. Схема и витрина. Согласуем гранулярность (день или неделя, точка продаж, товарная группа), ключи и правила пересчёта истории. Получаем воспроизводимый слой, из которого модель берёт данные одинаково при каждом запуске.
  3. Проектирование признаков. Сезонность и календарные лаги, акции, цены, наличие, поведение постоянных клиентов. Каждый признак проверяем на устойчивость по годам и на отсутствие утечки данных из будущего.
  4. Обучение и валидация модели. Историю делим по времени, а не случайно: иначе качество на проверке оказывается завышенным. Сравниваем результат с простым базовым прогнозом и с текущим планированием, смотрим ошибку отдельно по горизонтам и группам товаров.
  5. Внедрение прогноза. Обновление по расписанию, выдача в удобном контуре — отчёт, витрина или прямая передача в вашу систему. Сразу настраиваем мониторинг: расхождение факта с прогнозом, деградация, сдвиг сезонности.
  6. Приёмка и передача в эксплуатацию. Регламент переобучения, разбор инцидентов, обучение вашей команды. Приёмка идёт по метрикам качества прогноза, зафиксированным до начала работ.

Каждый этап закрывается артефактом: схемой данных, набором признаков, отчётом о качестве, регламентом. Если на аудите видно, что данных для честного прогноза не хватает, скажем об этом до старта, а не после.

Что вы получаете на руки: артефакты и регламенты

Передаём не отчёт с графиком, а работающий контур прогнозирования: от описания источников до регламента, по которому модель обновляет ваша команда. У каждого артефакта есть владелец и версия в репозитории, состав фиксируется при сдаче — решение можно развивать своими силами или передать другому подрядчику без археологии по коду.

  • Схема потоков данных — какие системы отдают факты продаж, с какой периодичностью, где происходит очистка и агрегация и какие поля обязательны на входе модели.
  • Словарь метрик — единые определения выручки, отгрузок, возвратов и периода признания; согласуем до старта, чтобы прогноз и отчётность считали одно и то же одинаково.
  • Настроенный контур пересчёта — прогноз обновляется по расписанию, ведётся журнал запусков, при сбое приходит оповещение с указанием упавшего шага.
  • Регламент переобучения — триггеры (просадка качества, смена ассортимента или промо-календаря), порядок запуска и критерии приёмки новой версии модели.
  • Контроль дрейфа — сравнение распределения входных данных и целевой переменной с эталонным периодом, отчёт «прогноз против факта» по группам товаров.
  • Регламент эксплуатации — кто владеет моделью, как откатиться на предыдущую версию, что делать при деградации качества и куда обращаться при инциденте.
  • Документация и обучение команды — описание признаков, инструкции по запуску, разбор типовых сбоев и практические занятия с вашими аналитиками.

Кейс: точность планирования в рознице до и после

Сеть с тремя каналами сбыта — розничные точки, интернет-магазин и маркетплейсы — планировала поставки в электронных таблицах. Закупщик брал средние продажи за прошлый период и вручную правил их под акции, а решение о дозаказе принималось по текущему остатку и опыту.

Что было до внедрения

Базовую линию снимали две недели по трём группам метрик: доля позиций в дефиците, объём избыточных запасов и трудозатраты планировщиков. На старте дефицит держался на 11–14% ассортимента, оборачиваемость товарных запасов доходила до 74 дней, а двое планировщиков тратили на пересчёт плана около 30 часов в неделю.

Что изменилось после

Модель считает спрос на уровне «позиция — точка — неделя», отдельно учитывает промо, сезонность и график поставок, пересчёт идёт ежедневно. Планировщик больше не строит план с нуля: он разбирает только позиции с отклонением выше порога — это 5–8% ассортимента. Такой переход мы делали для сети «Меридиан».

За два квартала дефицит опустился до 4–6%, оборачиваемость сократилась до 51 дня, точность отгрузок в срок выросла с 82% до 96%, а списания по срокам годности упали почти вдвое. Трудозатраты на планирование — около 9 часов в неделю вместо 30; высвободившееся время ушло на работу с поставщиками и локальные акции.

Чем потоковый пересчёт отличается от ночного пакетного

Разница в том, в какой момент считается прогноз. При пакетном пересчёте задание раз в сутки читает всю историю продаж, переобучает модель и записывает результат в витрину — до следующего запуска числа не меняются. Задержка прогноза равна периоду расписания, зато нагрузка на систему предсказуема: тяжёлый пересчёт идёт ночью, когда с ним конкурируют только регламентные выгрузки.

Потоковое обновление работает по событиям: заказ, возврат, изменение остатка попадают в очередь, и модель пересчитывает прогноз по мере поступления. Задержка падает до минут, но нагрузка становится ровной и круглосуточной, а к модели добавляется контроль смещения — иначе потоковый пересчёт постепенно уводит прогноз в сторону, и это замечают только по факту промаха.

Потоковый режим оправдан там, где на прогнозе стоят действия: динамическая цена, пополнение склада, приоритет отгрузки, отсечение подозрительных заказов. Где решение принимается раз в неделю — план закупок, бюджет, загрузка производства — ночного пакетного пересчёта достаточно, и он дешевле в сопровождении.

На практике чаще ставят гибрид: ночью модель переобучается на полной истории, днём поток дообучает её на свежих данных и пересчитывает только затронутые позиции. Такое расписание мы собираем в Apache Airflow — один контур отвечает и за пакетный пересчёт, и за потоковое обновление, поэтому расхождение между витриной и моделью не накапливается.

Частые технические сомнения перед стартом

Перед стартом обсуждаем не выбор модели, а два вопроса: хватает ли данных и как прогноз встроится в текущий учётный контур. Ниже — четыре сомнения, которые чаще всего тормозят проект, и как мы их закрываем.

Сколько истории нужно, чтобы прогноз работал?

Для сезонных рядов нужно минимум два полных годовых цикла, лучше три: иначе тренд не отделяется от разового всплеска. При короткой истории подключаем внешние ряды — акции, праздники — и стартуем с прогноза по категориям, а не по каждой позиции.

Данные лежат в разных системах — это помеха?

Помеха не в разрозненности, а в отсутствии общего ключа. Сводим учёт, кассы, склад и интернет-магазин в единый слой, справочники товаров и точек приводим к одному идентификатору. Расхождения не прячем, а показываем: несходимость остатков в пару процентов обычно объясняет часть ошибки прогноза.

Как прогнозировать новинки, по которым нет истории?

По новому артикулу учить нечего, поэтому переносим закономерности с похожих позиций — по категории, ценовому сегменту, сезону и полке. Первые недели прогноз идёт по группе, дальше вес собственных продаж растёт, и модель переходит на историю самого товара.

Как встроить прогноз в учётную систему?

Учёт не подменяем: прогноз возвращается в него выгрузкой с разбивкой по горизонтам и версиями, чтобы любую версию можно было пересчитать и сравнить с фактом. Планировщик остаётся в привычном интерфейсе и видит рядом прогноз, факт и отклонение.

Обсудим вашу задачу и вернёмся с планом работ

Чтобы обсуждение задачи превратилось в расчёт сроков, а не в пересказ общих слов, начнём с разговора о ваших данных и процессе планирования. Нам важно понять, какие источники истории продаж доступны, с какой детализацией и что уже известно о будущем периоде: от этого зависит и класс модели, и объём работ.

  • какие выгрузки есть сейчас — глубина истории, детализация по точкам и каналам, полнота данных по возвратам и отменам;
  • что известно о будущем периоде: график акций и скидок, поставки, сезонные ограничения, изменения ассортимента;
  • как план строится сегодня, кто им пользуется и как часто он пересчитывается — от этого зависит горизонт прогноза;
  • какие системы отдают данные и можно ли забирать их по расписанию, без ручных выгрузок;
  • какая ошибка прогноза критична: переоценка ведёт к затовариванию склада, недооценка — к дефициту и упущенным продажам;
  • кто со стороны заказчика отвечает за данные, приёмку результата и дальнейшую эксплуатацию.

Возвращаемся с планом работ: перечень этапов, оценка сроков по каждому, состав команды и требования к данным, которые нужно закрыть до старта. Отдельно описываем передачу модели — документацию по признакам и метрикам качества, обучение вашей команды, порядок переобучения и контроль точности после запуска. Опишите задачу — вернёмся с оценкой и планом.

Направления AI-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141