Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Сегодня ваша задача — рассчитать закупку тетрадей на склад к августу 2026 года по выгрузке из 1С за два года.

Казалось бы, что тут сложного? Посмотрел, сколько продали в прошлом году, и заказал столько же. Но есть нюансы.

Дилемма закупщика:

  • Закажешь мало — в сентябре на складе ноль. Школьники уйдут к конкурентам, вы упустите выручку.
  • Закажешь много — в январе склад забит. Вы заморозите деньги в товаре, который не продаётся.

Чтобы найти золотую середину, давайте посмотрим на реальные данные.

Вот выгрузка из 1С за два года.

Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Сумма за два года = 12 572 штуки.

Ловушка №1: посчитать среднюю за базу

Первое, что приходит в голову, — взять среднюю за два года как базу.

Средняя = 12 572 / 24 = 524 штуки

И сразу посчитать коэффициент сезонности для каждого месяца:

Коэфф. = Продажи / Средняя.

Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Казалось бы, всё логично. Но давайте проверим, что это значит.

Коэффициент сентября 6,09 говорит: «сентябрь в 6 раз выше обычного месяца». А январь 0,02 — «в 50 раз ниже нормы». Но правда ли, что «норма» — 524?

Смотрим на распределение 24 месяцев:

  • 15 месяцев — продажи ниже 524;
  • 2 месяца — сентябрь (2900 и 3190) — в 6 раз выше;
  • 7 месяцев — от 524 до 750.

Средняя 524 не соответствует ни одному реальному месяцу. Она «размазана» между январскими нулями и сентябрьскими пиками.

И вот главное: коэффициент сентября 6,09 — занижен. Коэффициент января 0,02 — тоже искажён. Все 12 коэффициентов сдвинуты из-за выбросов в средней.

Решение: медиана

Медиана — это цифра ровно посередине, если выстроить все месяцы по возрастанию. Она игнорирует выбросы.

Выстроим все 24 значения:

10, 10, 100, 105, 130, 150, 260, 275, 280, 286, 290, 294,310, 310, 325, 340, 356, 380, 391, 418, 712, 750, 2900, 3190

Два средних (12-е и 13-е) — 294 и 310. Медиана = (294 + 310)/2 = 302 штуки.

Это наша база: ~302 штуки в обычный месяц.

Теперь коэффициент сезонности для каждого месяца:

Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Вот теперь видно реальную картину:

  • Сентябрь — 10,56 (а не 6). Реальная сезонность в 1,7 раза выше, чем показывала средняя.
  • Январь — 0,03 — в 30 раз ниже нормы. Закупать почти ничего не надо.
  • Февраль-май — около 1,0 — «обычные» месяцы. Ничего особенного.
  • Август — 2,36 — второй пик (родители скупают к школе).
  • Октябрь-декабрь — 1,2–1,4 — чуть выше нормы.

Медиана даёт честную картину для каждого месяца.

Считаем закупку по медиане

Отлично. Теперь у нас есть честная база (302) и честные коэффициенты для каждого месяца. Логично сразу посчитать закупку:

Закупка_2026 = Медиана × Коэф_сезонности = 302 × Коэф_сезонности

Для сентября: 302 × 10,56 = 3190.

Для января: 302 × 0,03 = 10.

Для февраля: 302 × 0,97 = 294.

Стоп. Мы получили те же самые цифры, что были в 2025 году! 302 × 10,56 = 3190 — это ровно продажи сентября 2025. 302 × 0,97 = 294 — ровно продажи февраля 2025.

Почему? Потому что Коэф_сезонности = Продажи / Медиана. Когда мы умножаем медиану на коэффициент, медиана сокращается:

Медиана × (Продажи / Медиана) = Продажи

302 × (3190 / 302) = 3190. Медиана исчезла из формулы. Мы вернулись к тому, с чего начали — к продажам прошлого года.

Вот она, новая ловушка. Мы думали, что медиана поможет посчитать закупку. А она сократилась, и мы снова закупаем «как в прошлом году» — 3190 на сентябрь. Без учёта роста.

Что мы упустили

Медиана дала честную базу и честные коэффициенты. Но закупка — это не «продажи прошлого года». Это продажи прошлого года × рост. А роста нет в формуле — мы его не посчитали.

Смотрим на данные: сентябрь 2024 — 2900, сентябрь 2025 — 3190. Рост 10%. Значит, к сентябрю 2026 нужно не 3190, а 3190 × 1,10 = 3510.

А в формуле 302 × 10,56 = 3190 — роста нет. Мы закупаем на уровне 2025, а бизнес растёт. Недозакупка 10% — упущенная выручка.

Почему это ловушка

Мы думали, что медиана решает задачу. Но она решает только половину: даёт честную базу и честные коэффициенты. А закупка — это не «база × коэффициент». Это «база × коэффициент × рост». Без роста — закупка неверна.

А рост мы не посчитали. Потому что увлеклись медианой и забыли про то, что бизнес меняется.

Что дальше

Рост — это следующий шаг. И для него нужна другая функция — оконная lag, которая смотрит в прошлый год и считает прирост. Медиана не умеет этого — она групповой агрегат, а не оконная функция.

Подождите.

Зачем все эти медианы и lag? У нас же есть данные за 2025 год. Просто берём и добавляем 10% к прошлому году — вот и закупка на 2026. 3190 × 1,10 = 3509. Всё сходится. Зачем усложнять?»

Вопрос честный. И для одного товара — ответ правильный. Если у вас одна тетрадь и один рост (10%), то Продажи × 1,10 — ровно то, что нужно. Медиана не нужна — она сокращается. lag не нужен — рост известен.

Но в реальном магазине — не одна тетрадь. 10 000 товаров. И у каждого — свой рост.

Смотрим на 10 000 товаров

Вот четыре товара из выгрузки за 1 месяц и у каждого — свой рост:

Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Даже если вы хотите учесть рост каждого товара — в Excel это ручная работа:

  1. Для каждого из 10 000 товаров — найти прошлогоднее значение.
  2. Посчитать прирост: (новое − старое) / старое × 100.
  3. Повторить для каждого месяца — 12 раз.

На 10 000 товаров — 120 000 вычислений вручную. Часы работы. И каждая ошибка в формуле — неверная закупка.

Вот как это выглядит в коде ArrayVator.

# 1. Загрузка m = OpenExcelShow() # 2. База — медиана по товару m[:, "База_шт"] = median(m[:, "Продажи"], by m[:, "Товар"]) # 3. Год назад tmp = lag(m[:, "Продажи"], 12, 0, by m[:, "Товар"]) m[:, "Год_назад"] = tmp[2:end, end] # 4. Прирост m[:, "Прирост_%"] = round( (m[:, "Продажи"] - m[:, "Год_назад"]) / m[:, "Год_назад"] * 100, 1 ) # 5. Коэффициент сезонности m[:, "Коэф_сезонности"] = round(m[:, "Продажи"] / m[:, "База_шт"], 2) # 6. Прогноз закупки на 2026 (для 2025 — по приросту; для 2024 — None) m[:, "Закупка_2026"] = round( m[:, "Продажи"] * (1 + m[:, "Прирост_%"] / 100), 0 ) # 7. Отчёт print(m)
  • lag(..., 12, ...) — это и есть то самое «найти прошлогоднее значение», только автоматически.
  • by m[:, "Товар"] — ArrayVator понимает, что «Тетрадь» и «Ручка» — разные товары. Он не сравнивает их между собой.
  • tmp[2:end, end] — берём последний столбец результата без заголовка.
Медиана в аналитике продаж: как найти «честную базу» и не заморозить деньги

Никаких 120 000 формул. Никаких поисков ячейки «прошлогодний сентябрь». Скрипт отрабатывает за секунды. И ему не страшны сортировки или добавление новых строк — он оперирует логикой («12 строк внутри группы»), а не жёсткими ссылками на ячейки вроде B14.

Теперь посчитать закупку — это одна строка:

m[:, "Закупка_2026"] = round( m[:, "Продажи"] * (1 + m[:, "Прирост_%"] / 100), 0 )

Но подождите. А медиана-то где?

Внимательный читатель заметит: в формуле Закупка = Продажи × (1 + Рост) нет медианы. И это правда. Математически она сокращается.

Тогда зачем мы её считали?

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

Вы скажете: «В сентябре спрос в 10 раз выше нормы. Это не ошибка, это сезонность. Поэтому мы закупаем 3509 штук. А в январе спрос в 30 раз ниже нормы — там мы закупаем всего 10 штук, чтобы не заморозить деньги».

Медиана не считает закупку. Медиана объясняет бизнесу, почему цифры такие, какие они есть. Без неё вы принесёте начальнику просто набор чисел. С ней — вы принесёте понимание.

Но когда товаров 10 000 — у ручек свой пик, у альбомов свой, у пластилина свой. Вы физически не можете держать это в голове. Вы получаете 10 000 строк с цифрами — и не понимаете, почему в одной 3509, а в другой 10.

Вот здесь и нужна медиана. Она не считает закупку. Она превращает хаос в картину.

Вы смотрите на Коэф_сезонности = 10.56 и сразу видите: «Сентябрь — пик в 10 раз выше нормы». Смотрите на 0.03 — «Январь — яма в 30 раз ниже». Вам не нужно помнить 10 000 строк. Медиана показывает вам, что происходит.

Скачать можно здесь: Arrayvator

Скачать таблицу можно здесь

11