Что ещё инструмент видит в ваших периодах

Что ещё инструмент видит в ваших периодах

Почему одного коэффициента вариации мало

XYZ-анализ меряет одно число — насколько продажи разбегаются вокруг своего среднего. Это честный ответ на честный вопрос, но у него есть предел: разброс не говорит, откуда он взялся.

Возьмём четыре позиции из демонстрационной выгрузки. Все четыре по XYZ попадают в один класс — Z:

  • соус соевый, коэффициент вариации 44,7 %: продажи растут почти каждый месяц, с 156 штук в январе до 739 в декабре;
  • кофе зерновой смесь 60/40, 76,8 %: зимой около 1200 штук в месяц, в июле 8581 — ровно в семь раз больше, к декабрю снова 1051;
  • сахар белый, 81,5 %: девять месяцев спада со 199 штук до 26, последние три месяца — ноль;
  • крупа кускус, 111,5 %: пять месяцев нулей, потом продажи с 29 до 259 штук.

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

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

Тренд: прямая по точкам и доверие к ней

Первое, что можно вытащить из ряда, — направление. По точкам проводится прямая методом наименьших квадратов:

xᵢ = a + β · tᵢ

xᵢ
продажи в периоде номер i
tᵢ
номер периода, от 0 до N − 1
a
свободный член, уровень в начале ряда
β
наклон: на сколько штук в среднем меняются продажи за период

Сам наклон в штуках сравнивать между позициями нельзя: +50 штук в месяц для позиции, которая продаётся тысячами, — это шум, а для той, что расходится десятками, — взрывной рост. Поэтому наклон делится на среднее и превращается в проценты за период: β / μ. Именно это число инструмент и называет трендом.

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

R² = 1 − SSres / SStot

SSres
сумма квадратов отклонений точек от прямой, то, что прямая не объяснила
SStot
сумма квадратов отклонений точек от среднего, весь разброс целиком
доля объяснённого разброса: 1 — точки лежат на прямой, 0 — прямая не объясняет ничего

Пороги по умолчанию такие. Тренд вообще считается от трёх периодов и только при ненулевом среднем. Направление признаётся при R² не меньше 0,5: ниже — прямая объясняет меньше половины разброса, и инструмент говорит «направления нет». Дальше смотрится сам наклон: рост — больше +5 % за период, спад — меньше −5 %, между ними — ровно.

На демонстрационной выгрузке это видно на двух позициях. У соуса соевого наклон +12,8 % за месяц при R² 0,97 — прямая проходит почти по точкам, и позиция признаётся растущей. У кофе наклон тоже положительный, +1,2 % за месяц, но R² равен 0,00: летний горб и зимний провал прямая не объясняет вовсе. Направление не признаётся — и правильно, потому что никакого роста там нет.

Из 120 позиций выгрузки направление признано ровно у трёх: две растут, одна затухает. Остальные 117 — «ровно», и это нормальный результат: у большинства позиций тренда действительно нет.

Сезонность: самое «жирное» непрерывное окно

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

Поэтому по ряду скользит непрерывное окно, и считается доля объёма, попавшая в самое «жирное» из них:

P = Sw / S

P
доля пика: сколько объёма собралось в лучшем окне
Sw
объём лучшего окна: самого «жирного» отрезка подряд идущих периодов
S
объём за весь ряд: сумма всех периодов строки

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

У кофе из выгрузки в окно июнь–август попало 56,3 % годовых продаж — это сезонная позиция, и именно поэтому её нельзя планировать по среднему за год.

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

Следствие видно на той же выгрузке. Флаг сезонности получают три позиции, и только у одной он про сезон:

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

Инструмент частично себя страхует: в подсказку про пик мёртвый запас не попадает, поэтому сахар до неё не доходит. А новинка доходит — и читать её карточку нужно вместе с карточкой про новинки.

Мёртвый запас и новинка: одинаковые нули, разные решения

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

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

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

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

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

Концентрация портфеля: насколько неровно устроен список

Предыдущие метрики смотрят на одну строку. Эта — на весь список сразу и отвечает на вопрос, насколько неравномерно распределён вклад.

Считаются четыре числа:

  • сколько позиций набирают 80 % объёма — в демонстрационной выгрузке 24 позиции из 120, то есть 20 % списка. Это почти буквальное правило 80/20;
  • доля самой крупной позиции — 7,0 %;
  • доля топ-10 % позиций — двенадцать самых крупных дают 57,4 % объёма;
  • коэффициент Джини — 0,735. Это мера неравенства: ноль означал бы, что все позиции продаются одинаково, а предел для списка из 120 позиций — 0,992, когда всё держится на одной строке.

Сами по себе эти числа ничего не предписывают — они говорят, какого рода у вас ассортимент. Если 80 % набираются двумя позициями, вы зависите от двух поставок. Если восьмьюдесятью — хвост слишком длинный, и работа с ним по одной позиции не окупится. Именно эти числа стоят за подсказками вроде «структура сбалансирована» или «раздутый хвост».

Где это видно в интерфейсе

Панель рекомендаций под отчётом: карточки с пометкой уровня и значком фильтра

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

Как устроена панель:

  1. Список плоский и отсортирован по важности, а не сгруппирован по уровню: сначала критичное, потом остальное по величине вклада. Группировка увела бы важную находку вниз, под общие рассуждения о структуре.
  2. По умолчанию видны первые четыре карточки, остальные — за кнопкой «Показать ещё». На демонстрационной выгрузке инструмент выдал 24 подсказки, то есть под кнопкой остаётся двадцать.
  3. На каждой карточке помечен уровень — «Портфель», «По классам» или «По позициям».
  4. Карточку со значком фильтра можно нажать, и таблица под ней покажет только те строки, о которых карточка говорит. Нажимаются те, за которыми стоит конкретный набор строк: на этой выгрузке 21 карточка из 24. Не нажимаются три, которые говорят про структуру списка целиком, — фильтровать там нечего, это весь список.

О чём бывают подсказки

Перечислять все не нужно — важнее понимать, на каких трёх уровнях они бывают.

Про портфель целиком. Сколько процентов ассортимента в классе Z, какую долю занимает хвост, близка ли структура к правилу 80/20, не раздут ли класс C. Это разговор о форме списка, и решения по ним стратегические: сокращать ассортимент, менять политику запасов.

Про классы и ячейки. Что делать с классом A, с классом X, с ячейкой AZ, с ячейкой CZ. Здесь подсказка повторяет то, что разобрано в статье про матрицу XYZ+ABC, но уже с вашими числами: сколько позиций в ячейке и какую долю результата они дают.

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

Набор карточек зависит от ваших данных: если в выгрузке нет ни одной новинки, карточки про новинки не будет. Поэтому две разные выгрузки дают разные панели, и число 24 из примера выше — про этот файл, а не про инструмент.

Чего инструмент не делает

Список короткий, но важный — он очерчивает границу доверия.

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

Как этим пользоваться

Порядок, который работает.

  1. Сначала прочитать портфельные карточки — они дают картину целиком и заодно подсказывают, стоит ли вообще менять пороги анализа.
  2. Потом нажать позиционные и посмотреть сами строки. Карточка «кандидаты на вывод — 1 позиция» полезна ровно тем, что за ней стоит конкретная позиция, а не совет вообще.
  3. Проверить каждую находку своим знанием. Инструмент не знает, что кускус — новинка, которую вы завели месяц назад под конкретного клиента; он знает только, что нули стоят в начале. Совпало с вашей картиной мира — действуйте, не совпало — ищите причину в данных.
  4. Не принимать решения по одной карточке. «Позиция в CZ» и «позиция растёт» могут относиться к одной и той же строке и предлагать противоположное. Это не противоречие инструмента, а два разных среза одной ситуации, и выбирать между ними — ваша работа.

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

Что дальше

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

Посмотрите на свой файл

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

Открыть XYZ+ABC-анализ