XYZ и другие буквы алфавита

Не будьте слишком мудрыми,
но будьте мудрыми в меру.

кажется, апостол Павел.

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

Итак, вспомним, зачем это делается. Постановка задачи:

Common

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

  1. Наиболее вероятную величину потребления за время реакции системы.
  2. Оценку величины разброса потребления за время реакции системы (между точкой заказа и моментом соответствующей ей поставки).

Нарисуем график скорости потребления (шт/день):

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

Стандартный подход в оценке неопределенности состоит в предположении, что кривая распределения, изображенная на рис.1, представляет из себя нормальное распределение. А значит разброс значений проще всего описывать коэффициентом вариации. Как мы можем узнать его величину? Единственное, что у нас есть, это имеющиеся наблюдения цикла пополнения, уже случившиеся в прошлом — история продаж как она произошла. Следовательно, взяв достаточно много таких циклов (если весьма теоретически, то чем больше, тем лучше), мы получим выборку значений величины спроса за длину нашего цикла (очень важно, оно же - время реакции системы!) и после статистической обработки получим значения среднего и среднеквадратического отклонения этой выборки.

Обозначения.

(1) среднее значение генеральной совокупности

(2) среднее значение выборки

(3) среднеквадратическое отклонение генеральной совокупности

(4) среднеквадратическое отклонение выборки

Лирическое отступление.

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

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

Гипотетически же продажи могли получиться другими, с другими результатами. Мы имели возможность пронаблюдать лишь малую часть случившегося из всего бесконечного многообразия вариантов. Продажи, которые случатся в будущем, нам также неизвестны. Наша задача — получить из имеющихся цифр оценку именно первой пары, так как наш прогноз будущего должен опираться именно на природу, внутренние закономерности процесса. Фактически мы должны описать все возможные пути течения процесса как в прошлом, так и в будущем и их вероятности. Так вот, теория утверждает, что несмещенной оценкой отклонения генеральной совокупности является именно (4). Или, говоря простым языком, внутренняя, присущая природе процесса вариация наиболее ожидаемо описывается формулой (4). Мне, к сожалению, не удалось найти в литературе освещения данного вопроса, как правило применяется формула (3), что на мой взгляд не совсем корректно.

Вывод 1. Поскольку n всегда заметно больше 1, разница в итоговых значениях представляет интерес только для теоретиков.

Вывод 2. Поскольку значения вариативности, по которым будут проводиться границы категорий, все равно будут назначаться методом экспертного волюнтаризма, нет никакой разницы, какую формулу использовать.

Вывод 3. Если Вы используете Excel, формуле (3) соответствует функция СТАНДОТКЛОНП, формуле (4) — СТАНДОТКЛОН.

Предварительные замечания.

Если мы еще не забыли, нас интересует разброс значений на длине периода, соответствующем времени реакции системы. Проще говоря, как далеко может отклониться траектория запаса от предполагаемой. Поскольку для всех продуктов, рассматриваемых в статье, срок реакции системы поставок составляет приблизительно 1 месяц, мы выгрузили продажи из Информационной Системы, просуммированные помесячно. Кроме того, поскольку специфика бизнеса такова, что количество рабочих дней сильно колеблется от месяца к месяцу, внося дополнительный вклад в случайную составляющую, при экспорте данных продажи были отнормированы по количеству рабочих дней в месяце. К примеру, разброс может составлять от 18 до 25 рабочих дней, значит сумму продаж каждого месяца мы поделим на количество рабочих дней — фактически перейдем к среднедневным. Заметили? Мы сделали первый шаг по очистке наших данных, выделив неслучайную (известную нам) компоненту и тем самым уменьшив вариацию ряда. Ну и, исходя из врожденной паранойи, были сделаны кое-какие преобразования (все ряды были умножены на количество пятен на Солнце, наблюдавшихся Пулковской обсерваторией в ночь с ноября по март 1986г., а затем умножены на случайное число в промежутке [0;1E-5] в случайной степени [1;10] ), так что значения ряда выражены в условных табуретках. Чисто чтобы не разглашать коммерческую тайну об объемах продаж :)

Приступим, пожалуй.

Пример 1. Топор.

Возьмем данные о продажах 11 продуктов и рассчитаем коэффициенты вариации, как нам предписывают учебники:

(5)

Табл.1

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

Теперь еще немного рассуждений. Вспомним, о чем мы говорили вначале. О том, что мы пытаемся оценить непредсказуемость поведения временного ряда. Что эта фраза означает с точки зрения прогнозирования? Попытаемся поточнее сформулировать задачу, которую мы решаем. У нас есть временной ряд продаж. На основе этого знания мы хотим предсказать поведение этого ряда «на хоть сколько-нибудь приличный срок». Для решения этой задачи мы делаем как минимум следующие предположения:

  1. поведение ряда продаж описывается моделью
    где - известная нам функция
    - шум, результат влияния неизвестных нам факторов
  2. поведение ряда в будущем будет описываться той же моделью

Заметим, что всегда

,

Наша задача — оценить величину статистической ошибки, то есть фактически оценить соотношение и и каким-то образом усреднить по всем данным.

Рис.3

Существует множество вариантов оценки ошибки, но все они, по большому счету сводятся к измерению относительного отклонения факта от модели.

 

Теперь посмотрим, что мы сделали в примере 1. Фактически, мы задали модель как константу, то есть спрос с постоянной интенсивностью

Рис.4

теперь я хочу оценить ошибку такой модели. Для оценки ошибки возьмем разницу факта и модели X(t) - f(t) = e(t)
и просуммируем квадраты, а потом извлечем из суммы корень. Тогда наша ошибка будет выглядеть так:

Вот ведь! Оказывается в качестве параметра, оценивающего вариативность, мы использовали коэффициент вариации ряда X:

(7)

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

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

  • X — до 50%
  • Y — до 80%
  • Z — все, что выше

и для каждой категории определим величину страхового запаса. Или скомбинировать с результатами ABC и сделать двумерную матрицу страховых запасов.

Решение задачи «как выбрать границы категорий и какие правила им сопоставить» так же оставим за скобками, это отдельный разговор. К сожалению, короткий ответ - да как вам кажется правильным. Нет ни одного объективного критерия, все от лукавого. Именно поэтому я считаю сами категории X/Y/Z совершенно бессмысленными с точки зрения страховых запасов.

Частное определение.

Мне кажется, что полученные значения коэффициентов вариации достаточно велики, чтобы создавать соответствующие им запасы. А ведь это к тому же одна из наиболее стабильных групп товара в имеющейся номенклатуре и при этом достаточно финансовоемкая, чтобы было за что бороться. Очевидно, что если «улучшить» модель (подобрать вид функции, более адекватно отражающий поведение реальных данных), удастся уменьшить величину шума и сократить необходимый страховой запас.

Рис.5

Но это потом, а пока

Пример 2. Долото.

Немного маркетинга, или почему компьютер не может управлять запасами.

Вспомним, что отобранный для примера товар неслучаен. Дело в том, что все перечисленные позиции de facto обладают одной потребительской стоимостью. В том самом, изначальном значении этого термина — по Марксу — как «способность удовлетворять какую-либо человеческую потребность». То есть все они предоставляют один и тот же функционал, отличаясь лишь моделями и/или брендами. Для нас отсюда следует важнейший вывод: модели/бренды как в прошлом, так и в будущем ротируются, но суммарный уровень потребления должен быть достаточно предсказуем. Такое поведение часто называют каннибализацией спроса - товары внутри такой группы аналогов конкурируют между собой за благосклонность покупателя.

Что ж, берем сумму продаж по всем позициям, повторяем вычисления и получаем:

Табл.2

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

С другой стороны, мы все равно получаем довольно грустную цифру вариации спроса. Увы, в очередной раз приходится признать, что прогнозирование без участия человека невозможно. Поэтому сделаем то, с чего на самом деле должен был начаться наш анализ. С качественного рассмотрения веселых картинок (закройте лишние сайты, я про другие картинки!). Вот суммарные продажи нашей группы:

Рис.6

Теперь понятно, почему выбор в качестве модели среднего значения дает такую большую вариацию. Применение такой модели даст предположительно хороший результат лишь для стационарного процесса. Или, говоря простым языком, без выраженного тренда и сезонности. Я намеренно только теперь показал график продаж. Слишком уж часто люди пользуются готовой формулой, не утруждая себя пониманием, что же они на самом деле рассчитывают. Именно это мы сделали в первых двух примерах. А теперь попробуем улучшить модель, понимая, чем нас не устраивает простейшая.

Пример 3. Бронебойный (из пушки по гусям).

На основе поведения временного ряда и знания особенностей бизнеса и товара, я готов выдвинуть гипотезу:

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

Внимание! Здесь просто необходимо отвлечься от наших баранов и посмотреть на вопрос с более высокой колокольни. Почему я выбрал именно эту модель поведения? Потому, что я помню категорический императив прогнозирования — никакая составляющая модели не может быть использована, если мы не можем объяснить ее применение на уровне здравого смысла (хотя мне больше нравится выражение «физический смысл»), касается ли это формы сезонности или влияния внешнего фактора. В данном случае консультации с нужными специалистами дали мне следующую информацию:

  1. Общий товарооборот товарной категории растет приблизительно линейно. Несмотря на то, что некорректно отображать впрямую на отдельную группу, в качестве рабочей гипотезы принимаем линейный тренд.

  2. Товар по своей природе имеет сезонность, связанную с температурой окружающей среды. Естественно предположить, что чем больше клиентская база (см. п.1), тем больше размах сезонных колебаний. Принимаем мультипликативную сезонность с 12ю периодами в году.

Рис.7

Здесь мы видим результат моделирования с помощью экспоненциального сглаживания по алгоритму Холта-Винтерса (Holt, Winters).

Нет, я вовсе не призываю использовать пакеты статистического анализа каждый раз, когда нужно нарисовать план продаж. Я реалист и прекрасно понимаю, что это неоправданно, да и физически невозможно в связи с дикими трудозатратами (именно в такой последовательности, невозможно — это еще не повод отказываться). Другой вопрос, если у вас в наличии имеется специальный софт, способный за пару минут построить эти прогнозы по всем сотням тысяч рядов (такой в природе есть, уверяю вас). Здесь эта картинка по двум причинам. Первая — просто в качестве красивой иллюстрации, если угодно, из любви к искусству. Вторая — одним из результатов метода является вычисление наиболее вероятных коэффициентов сезонности. А вот это уже результат, вполне ценный с практической точки зрения:

Табл.3

В результате мы имеем профиль сезонности продукта (цифра — мультипликатор в процентах)

Рис.8

Почему это для меня так ценно? Мне не хочется возиться с реальной моделью и делать нестандартные расчеты — для этого понадобится писать хоть какой-то код обработки, будь то отдельная программа или макрос в Excel'е. Я имею намерение путем преобразования ряда продаж привести его к стационарному и вновь использовать арифметику, изложенную в примере 1. Для этого я сначала уберу влияние сезонности, разделив (напомню, у нас мультипликативная модель, для аддитивной пришлось бы вычитать) реальные значения на коэффициенты сезонности. Теоретически я получу нечто, близкое к прямой. Затем я подберу тренд, отражающий поведение этой прямой и вычту его из данных, очищенных от сезонности. Вот тогда уже я получу ряд, являющийся стационарным (горизонтальным), который я буду оценивать по коэффициенту вариации.

Важно отметить, что единожды полученный профиль сезонности не требуется корректировать каждый раз, поскольку он является характеристикой, свойством продукта. Его достаточно аккуратно рассчитать (определить иным способом, хоть экспертным) один раз, хранить и использовать. В случае нашего продукта пока влияние глобального потепления не сильно сказалось на профиле. Оценка тренда — вещь гораздо более изменчивая, поскольку зависит от тенденции рынка и нашей доли на нем, так что учет этого гораздо более трудоемок. Но есть и хорошие новости. У нас стоит задача относительно краткосрочного планирования, а на малом горизонте влияние тренда как правило настолько невелико, что им можно просто пренебречь. Исключение составят лишь продукты, находящиеся на начальном участке жизненного цикла. Hо в этом случае сам метод планирования будет совсем другим, так что этот вопрос мы оставим в стороне, обсудим его в другой раз. А пока займемся сезонной декомпозицией наших баранов.

Табл.4

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

Рис.9

Как видим, ряд отнюдь не является стационарным.

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

 

Результат:

Табл.6

Пример 4. Снайперский.

Уже хорошо, но мы тут упустили один момент. Обратим внимание на рис.9. Весьма заметен перелом ситуации в районе конца 2004г. Чтобы убедиться в этом, посмотрим на график скорректированных относительно тренда данных:

Рис.10

Действительно, имеется излом тренда. Бросаем нашу арифметику и идем общаться с нужными людьми. Действительно, выясняется, что в это время началось бурное развитие сбытовой сети. Значит, реально нам бы следовало строить 2 тренда, до и после. Поэтому при корректировке мы попробуем использовать лишь данные начиная с 2005г. Фактически мы признаем, что более ранние данные — не более, чем преданья старины глубокой, существовашее тогда бизнес-окружение более недействительно, поэтому нам не следует использовать те данные для предсказания процесса в будущем.

Табл.7

Табл.8

Теперь можно составлять прогноз, используя нашу модель. Из (7) следует

Заметим, что для модели, использованной в примере 1,

В качестве оценки ожидаемых продаж на январь 2008г. используем простое среднее плюс среднее значение шума модели - 124641.47. Теперь добавляем тренд — 3398.56, предполагая, что он сохранится. Затем умножаем результат на коэффициент сезонности января — 1.10. Результат -

(124641.47 + 3398.56) * 1.10 = 140844.

Попробуем оценить доверительный интервал полученного прогноза. К примеру для уровня надежности 99% уровень продаж составит не более 157227 (NORMINV(0,99;140844;0,05*140844)). Отсюда можно планировать уровень страхового запаса.

Строго говоря, это корректно если предположить как минимум

  1. нормальность распределения
  2. неизменность дисперсии ряда — гомоскедастичность
  3. отсутствие автокорреляции остатков

Ой. совсем забыл, о чем идет речь. Мы ведь говорили про XYZ. Ну давайте присвоим какую-нибудь букву. Например, X, поскольку для коэффициента вариации значение 0.05 — это очень мало. И в соответствии с неким соглашением назначим для всей группы X правило формирования страхового запаса. Вне зависимости от действительной величины вариации. Что ж, можно и так.


Заключения.

Какой вариант правильный? Любой. Просто не надо забывать, чем они отличаются и пользоваться, имея это в виду. Не забывать, что вариация ряда и соответствующая буква - вещь не абсолютная, а зависит от вида модели, которую мы выбрали.

На каком шаге остановиться? Не знаю. Тогда, когда улучшение точности приносит меньше пользы, чем тратится сил. Единственное, что можно сказать с уверенностью — рассчитать профили сезонности имеет смысл в любом случае и по возможности точно. Даже и без оценки вариативности спроса это понадобится для определения ожидаемой цифры продаж, используя только простой метод прогнозирования типа экспоненциального сглаживания (к тому же в таком методе можно не сильно заботиться о трендовой корректировке). Да и делать это нужно едва ли не единожды в жизни, причем профиль как правило распространяется на большое число позиций.

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

Честно говоря, меня сильно удивляет итоговая цифра. Она подозрительно мала. А может это оттого, что мало кто (и я в том числе) и редко идет до такой степени очистки исходных данных от влияния известных факторов, относя это влияние к случайности? Не знаю.

Не нужно бояться объема вычислений. Львиная доля их поддается автоматизации, а по ночам компьютеры обычно не спят. Нужно только заботиться о том, чтобы результаты вашей работы по очистке данных не оставались в вашей личной табличке, а хранились в информационной системе — вам спасибо скажут («я успеваю улыбнуться, я видел, кто придет за мной»).