План продаж с неопределённой конверсией: сценарии Monte Carlo в NumPy
План продаж часто строят одним умножением: ожидаемый трафик на ожидаемую конверсию. Но оба входа могут отклониться от плана. Соберём сценарную модель в NumPy: будем многократно выбирать возможный трафик и конверсию, затем смотреть распределение числа покупателей и достижимость целевого объёма.
Сначала записываем допущения бизнеса
Предположим, команда ожидает от 8 до 12 тысяч посетителей, наиболее вероятный сценарий — 10 тысяч. Для конверсии принимаем диапазон 4–6% с наиболее вероятным значением 5%. Это экспертные предположения для демонстрации. Они не получены автоматически из истории и не являются доверительными интервалами.
Для каждого входа используем треугольное распределение: нижняя граница, наиболее вероятное значение и верхняя граница. Такая форма удобна, когда у команды есть три осмысленных сценария, но недостаточно оснований для более сложной модели. Если реальная история показывает другой рисунок, распределение следует выбирать по данным.
В первой версии считаем трафик и конверсию независимыми. Это существенное решение: расширение закупки дешёвого трафика может одновременно увеличивать объём и снижать конверсию. Для такого бизнеса лучше строить отдельные сценарии по каналам или выбирать исторические пары значений. Независимая модель здесь помогает понять вычислительный механизм и проверить чувствительность плана.
Два источника разброса покупок
Даже при фиксированном числе посетителей и фиксированной вероятности покупки количество покупателей случайно. Поэтому после выбора сценарных входов используем биномиальное распределение: каждый посетитель делает не более одной учитываемой покупки в окне. Если бизнес считает несколько заказов на человека, нужна другая модель частоты.
Сначала получаем сто тысяч возможных пар трафик–конверсия. Затем для каждой пары моделируем число покупателей. На выходе считаем медиану, квантили 10% и 90% и долю сценариев, в которых покупателей не меньше 550. Последняя величина является вероятностью внутри заданной модели. Её качество зависит от обоснованности входных предположений.
Количество посетителей приводим к целому и проверяем допустимость вероятностей. Фиксированное зерно позволяет повторить пример. Увеличение числа симуляций сгладит вычислительный шум, но не исправит неверный диапазон конверсии: неопределённость входов нужно обсуждать с владельцем плана. Для воспроизводимости сохраняйте сами входные параметры и дату согласования сценария.
import numpy as np
rng = np.random.default_rng(2026)
n = 100000
traffic = np.rint(rng.triangular(8000,10000,12000,size=n)).astype(int)
conversion = rng.triangular(0.04,0.05,0.06,size=n)
buyers = rng.binomial(traffic,conversion)
quantiles = np.quantile(buyers,[0.1,0.5,0.9])
target = 550
probability = (buyers>=target).mean()
print({"buyers_p10_p50_p90":quantiles.tolist(),"target":target,"share_meeting_target":float(probability)})
assert traffic.min() >= 8000 and traffic.max() <= 12000
assert ((conversion>=0.04)&(conversion<=0.06)).all()
assert 0 < probability < 1
assert (buyers<=traffic).all()Как использовать диапазон
Медиана показывает середину смоделированных исходов. Интервал от 10-го до 90-го процентиля охватывает центральные 80% сценариев этой модели. Он полезнее одного «плана 500», когда нужно подготовить нагрузку на склад и поддержку. Для закупки можно выбрать иной квантиль в зависимости от цены недопоставки и избыточного остатка.
Доля выполнения цели 550 показывает, насколько амбициозен план при выбранных допущениях. Если она мала, полезно разобрать, что нужно изменить: объём трафика, конверсию или саму цель. Модель делает этот разговор количественным. Поднимать верхнюю границу входов только ради достижения цели бессмысленно: сначала должно появиться действие, способное её обеспечить.
Отдельно проверьте ограничение мощности. Склад, способный обслужить только 520 покупателей, обрежет верхние сценарии. Его можно отразить как минимум между спросом и доступной мощностью, но тогда результатом станут обслуженные покупки, а не исходный спрос. Сохраняйте оба массива, чтобы видеть потерянный объём и оценивать необходимость расширения.
Проверяем чувствительность и обновляем входы
Сравните сценарий только случайных покупок при фиксированном трафике с моделью переменных входов. Так видно, какой разброс создаёт обычная случайность, а какой — неопределённость самого плана. Затем отдельно измените диапазон трафика и диапазон конверсии. Эти проверки покажут, какие данные выгоднее уточнить перед бюджетированием.
После закрытия периода сохраните фактический трафик и конверсию рядом с принятыми диапазонами. Если факты регулярно выходят за границы, пересмотрите модель. Для сезонных месяцев полезны отдельные предположения, а для рекламных каналов — раздельные объёмы и конверсии. Постепенно сценарный расчёт становится воспроизводимым инструментом планирования.
В записку руководителю включите диапазон, долю выполнения цели и три главных входных допущения. Полный список симуляций обычно не нужен для решения, зато исходные параметры позволяют предметно спорить о плане. Если маркетинг меняет оценку трафика, модель можно повторить с новым диапазоном и сразу увидеть последствия для закупки и нагрузки.
После закрытия периода сценарный план нужно сопоставить с наблюдавшимися продажами: План-факт продаж: как сравнить неполный месяц с планом.
Сохраняем смысл целевого показателя
В этой модели цель задана в покупателях, потому что на человека учитывается максимум одна покупка. Если бюджет утверждается в заказах или рублях, добавьте соответствующий этап моделирования частоты покупок или суммы, а не переименовывайте готовый результат.
Продолжить практику
В «Практической аналитике данных» вы учитесь формулировать бизнес-вопрос, выбирать метрику и объяснять ограничения вывода. На учебном магазине разбираются продажи, клиенты и рекламные каналы. Расчёты доступны через pandas или SQL; результат вы оформляете в DataLens и аналитическую записку. Откройте программу курса.
Продолжить на практике
- Практическая аналитика данных ↗
Превратите знания SQL или Python в аналитическую работу: проверяйте данные, считайте бизнес-метрики, стройте дашборды и объясняйте выводы на трёх прикладных кейсах.
