Методы - теория и практика

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

ABC анализ с использованием нескольких критериев

ABC анализ. Опять.

 

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

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

 

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

 

Пример 1. Конфетки, бараночки.

 

Розничная торговля. Планирование поставок.

 

Критерий 1.

Прибыль, которую принес товар за рассматриваемый период. Тут особо комментировать нечего, ради этой самой прибыли мы и трудимся. Вопрос лишь в том, какие возможности имеет учетная система для вычисления этой прибыли. Будем считать, что любая система маржинальный доход считать умеет. Если же мы не в состоянии оценить даже маржу, придется довольствоваться хотя бы оборотом. «За неимением гербовой пишем на клозетной».

 

Критерий 2.

Частота покупок товара. Оно же по-научному - количество требований на поставку. То есть частота появления строчки этого товара в отгрузочных документах (накладной или кассовом чеке — неважно). То есть количество расходных транзакций. Как ни называй, по сути — это сколько раз данный продукт понадобился нашему клиенту за период вне зависимости от количества купленных единиц. Для нашего примера параметр очень важный — он определяет то, насколько мы утратим лояльность нашего клиента, если допустим отсутствие этого товара на полке. А значит мы понимаем, что данный параметр оказывает косвенное воздействие на первый в более-менее долгосрочной перспективе. С другой стороны, именно потому, что «косвенное» и «в долгосрочной перспективе» и в некотором «целом», никакой корреляции между первым и вторым параметрами нам обнаружить не удастся. Посему для нас это два разных параметра. Почему мы не учитываем количество купленных единиц товара? Мы просто не хотим попасть в ловушку. Дело в том, что у продукта часто проявляется свойство «характерной кратности потребления». И если за период продано 100 комплектов щеток стеклоочистителя и 400 колес для автомобиля ВАЗ-2101, это не значит, что колеса в 4 раза более востребованы, просто их покупают по 4 шт. И ловушка вторая — зависимость от системы учета. Мы могли те же самые щетки учитывать не по комплектам, а поштучно — тогда продажи составили бы 200 шт.

 

Критерий 3.

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

 

Пример 2. Не так страшен черт, как его малютка.

 

Склад и его малю грузооборот.

 

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

 

Критерий 1.

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

 

Критерий 2.

Частота появления позиции в отгрузочном документе.

 

Критерий 3.

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

 

 

Итак, попробуем что-нибудь с этим сделать. Для простоты и наглядности будем использовать Пример 1 и только два критерия — Доходность и Востребованность.

 

 

 

Вариант 1.

 

Предположим, мы уже умудрились сделать ABC анализ по каждому из критериев независимо. В результате для каждой товарной позиции мы получили ее место в рейтинге доходности и место в рейтинге востребованности. То есть каждая позиция может быть представлена в виде двумерного (в данном случае) вектора. Для наглядности нарисуем то, что получается:

 

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

Первым естественным побуждением будет объединить это безобразие в матрицу 3х3 и получить 9 категорий товара.

 

Подход с одной стороны подкупает своей простотой реализации. Но с другой... Мы получили 9 групп. А если исходно делалось ABCD? А если мы хотим скомбинировать с XYZ? Фактически мы дискредитируем саму идею классификации номенклатуры на несколько (3-4) групп.

 

Вариант 2.

 

Будем объединять получившиеся клеточки в более крупные. Например, так:

 

Тогда мы получим искомые несколько групп — красная, зеленая, синяя. Или, по традиции, A, B, C.

Плохо то, что в этом есть отчетливый волюнтаризм и некоторая утеря простого жизненного смысла.

 

Вариант 3.

 

Чисто интуитивно есть желание порезать картинку по-другому. Например, так:

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

 

Const = ax + by

 

То есть мы вводим некий третий критерий, включающий в себя (комбинирующий) исходные. В данном случае два, но кто нам мешает добавлять третий-четвертый? Причем мы не могли использовать исходные критерии, так как в общем случае они имеют совершенно разную природу и, следовательно, разные единицы измерений. Просто не удастся сравнить штуки, рубли и килограммы. А вот рейтинг позиции (безразмерная величина) на промежутке [0;1] уже вполне можно сравнивать. Осталось только определиться с величинами a и b.

 

Заметим, мы здесь уже нигде не используем исходные категории по первоначальным критериям, мы взяли только числа нарастающего итога.

 

Одно условие лежит на поверхности: поскольку мы имеем намерение по полученному синтетическому критерию провести стандартный ABC анализ, лучше сразу условиться, что a+b=1. Хотя это условие вовсе не обязательно, просто так уж нам привычнее — видеть значения в промежутке [0;1].

 

Второе условие — определиться с соотношением коэффициентов. Мне в данном конкретном примере кажется, что доходность для меня важнее, чем востребованность, на 50%. Вот такая цифра с потолка. Главное, что мое мнение поддержали другие управленцы и акционеры в результате проведенной экспертной оценки.

 

Итак, наш синтетический критерий — рейтинг позиции в общей матрице =

0.6 * рейтинг_по_доходности + 0.4 * рейтинг_по_востребованности

 

Проведя ABCD анализ по введенному критерию, получаем такую картинку:

 

Каждой категории здесь соответствует свой цвет позиции.

 

Заключение.

 

Поскольку нет пределов совершенству, можно вспомнить про наше представление о позиции как о векторе и в качестве метрики использовать его длину:

Const = x2+y2

получим границы в виде дуги окружности

 

а можно к этому добавить и вес фактора:

Const = ax2+by2

получим границы в виде дуги эллипса.

 

В общем, метрик вектора можно придумать множество. Надо ли?

 


Всякая задача имеет простое красивое неправильное решение

 

Станислав Архипов,

Санкт-Петербург, апреля 23го числа, 2008г.

 

ABC анализ. Заботимся о пищеварении

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

 

 

 

Отчего-то так получилось, что ABC-анализ считается едва ли не первейшим методом, чуть ли не аспирином в аптечке первой помощи в управлении запасами. Всеобщее забалдение от этой аббревиатуры приняло уже какой-то гротескный оттенок. Упоминание ее в резюме логиста - обязательный атрибут, любой анализ запаса начинают по завету печатных гуру с ABC. Только забавно потом слышать "ABC сделал, а ЧО дальше?" Оно и понятно, коли слепо исполнять методику, не особенно раздумывая, что она означает и какие выводы позволяет сделать.

Я лично вполне серьезно считаю ABC анализ профанацией серьезной работы в области управления запасами, потрепанной тряпкой, которую "массы" несут в виде знамени. Не замечая, впрочем, что на знамени этом за древностию лет уже нельзя разобрать ни одного знака, ни одной надписи. Однако, дабы быть последовательным, для начала мы sine ira et studio разберем по косточкам анатомию анализа и постараемся обратить внимание на смысл наших действий, а не единственно их математическую форму.

Может быть, у нас вместе и получится избавиться от несварения желудка при употреблении блюда, приготовленного по вычитанному где-то рецепту (см. эпиграф).

Анатомия ABC анализа

- Еда, Иван Арнольдович, штука хитрая. Есть нужно уметь, и, представьте себе, большинство людей вовсе этого не умеет. Нужно не только знать, что съесть, но и когда и как. (Филипп Филиппович многозначительно потряс ложкой.) И что при этом говорить. Да-с. Если вы заботитесь о своем пищеварении, вот добрый совет - не говорите за обедом о большевизме и о медицине. И, боже вас сохрани, не читайте до обеда советских газет.

- Гм... Да ведь других нет?

- Вот никаких и не читайте.

 

 

Итак, попробуем препарировать эту древнюю мумию под названием ABC анализ...

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

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

Сформулирую Утверждение, на которое я буду неоднократно ссылаться в дальнейшем:
ABC-анализ, как и любой классифицирующий механизм, появляется тогда, когда мы не в состоянии в реальном времени работать с каждым объектом индивидуально. Мы вынуждены вместо индивидуальных объектов рассматривать группы. В применении к нашей задаче это означает, что как только товаров у нас становится больше, чем мы в состоянии "обработать", так сразу мы вынуждены свести их к небольшому количеству групп, разбитых по нашему показателю. Затем наши решения будут применены к группе в целом.

Отсюда следует первое правило анализа: в зависимости от того, что понимается под словом "работать", должен выбираться и показатель, характеристика объекта. Скажем, при контроле состояния запаса доходность вполне может быть ключевым признаком, тогда как при складских операциях гораздо важнее грузооборот. Более того, в реальной задаче сплошь и рядом может быть несколько ключевых показателей, но это непринципиально, желающие могут почитать про ЭТО здесь.

Как только мы определились, что является показателем для анализа, отсортируем таблицу "объект - показатель" по убыванию последнего. Очевидно, что в начале таблицы для нас более важные объекты, в конце - менее. Но этот тривиальный вывод нам мало что дает в практическом смысле. Ведь наша задача - свести весь этот список к более-менее короткому. Например, мы не можем разместить весь свой прайс-лист в небольшом рекламном баннере, да это и бессмысленно - человек не может воспринять своим мозгом такое количество информации (заметьте, "мы" в данном случае - человек, "обработать" - оценить уровень цен), но чем-то похвастаться хочется. Поэтому возьмем и отрежем от полного списка верхушку - так любимый многими "топ-100". Заметим, что в качестве показателя мы здесь скорее всего выберем не доходность, правда?

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

Если пользоваться электронными таблицами, в итоге получим примерно следующее:

 

Вид данной кривой достаточно характерен. Эмпирически давно замечено, что какие бы объекты ни были взяты для анализа, какие бы показатели ни использовались, почти всегда кривая имеет подобный вид, если объектов достаточно много. Именно здесь корень известного правила Парето - "большую часть результата дает меньшая часть объектов".Часто даже называется пропорция - 20% / 80%. На этой идее и основывается ABC-анализ. Если взять часть списка, обеспечивающую 80% результата (дохода в данном случае), список позиций будет много короче и с ним "работать" имеет смысл более плотно (некоторые звери равнее, помните?). В классическом виде этого показалось мало, и эти 80% результата были также поделены на две части, например, по уровню 50%. В итоге весь перечень оказывается поделен на границах 50% и 80%, а чтобы формализовать результат, мы эти товары покрасим в разный цвет или пометим специальными буковками A,B,C, а в дальнейшем будем применять к ним разные политики управления.

Придется все-таки немного остановиться на выборе границ деления групп, ибо бессмысленные споры о едином способе нахождения этих значений ведутся постоянно. Споры эти сродни священному джихаду, при котором уже ни одна из сторон не помнит, зачем это нужно и каков же будет смысл результата войны. "Я дерусь потому, что я дерусь" - вполне достойная позиция и внушает уважение. Мое личное мнение - нет никаких канонических границ типа золотого сечения и нет соответствующих методов их "вычисления". Если вспомнить про то, что каждый анализ делается под определенную задачу, то оказывается, что под эту конкретную задачу лучше бы выбрать границы 20 - 50, а не 50 - 80 по совсем другим, житейским причинам. Так что эту тему мы здесь закроем, есть куча других мест, где ее периодически сладострастно пережевывают.

А пока для целей удобства и возможности сравнивать перейдем в нашей таблице к относительным величинам. Абсолютный номер позиции в списке заменим на шаг = 1/(всего позиций в списке), а доход нарастающим на его долю = (доход нарастающим) / (суммарный доход). Так мы получим и по горизонтали, и по вертикали диапазон значений от 0 до 1 и сможем делать отсечки в процентном выражении.
 

Теперь расставим метки по нашим границам - 50% и 80%:
 

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

В результате в моем примере оказалось, что разброс ключевого показателя в группе А составляет 34 раза, а разница между последним А и первым В менее 0.5%!
 


Я не возьму на себя смелость утверждать, что это однозначно плохо. В некоторых задачах классификация, даже такая грубая, очень помогает. Но следует все-таки отдавать себе отчет в той потере информации, которая происходит в рамках классификации. А также и в том, что сама идея перехода к нескольким группам даже ценой ошибки родилась в эпоху отсутствия технологий, позволяющих обрабатывать большие массивы информации. В ситуации, когда складская карточка - кусок картона в деревянном ящике, когда поднять статистику продаж и обсчитать ее на листке бумаги вручную - задача просто физически трудоемкая, волей-неволей начнешь жертвовать точностью ради экономии времени-денег. "За неимением гербовой придется писать на клозетной". Сегодня же в области управления запасами задач, при которых лучше огрубить данные, весьма немного. Если они вообще есть. Ибо сегодня в нашем распоряжении есть нечто получше, чем арифмометр "Феликс". Об этом поговорим в продолжении.

Заботимся о пищеварении. Мифы ABC анализа. Аперитив.

- Ново-благословенная? - Осведомился он.
- Бог с вами, голубчик, - отозвался хозяин. - Это спирт. Дарья Петровна
сама отлично готовит водку.
- Не скажите, Филипп Филиппович, все утверждают, что очень приличная -
30 градусов.
- А водка должна быть в 40 градусов, а не в 30, это во-первых, - а
во-вторых, - бог их знает, чего они туда плеснули. Вы можете сказать - что
им придет в голову?
- Все, что угодно, - уверенно молвил тяпнутый.

 

Ох, сколько разговоров и споров вокруг ЭТОГО! Между тем, если внимательно читать, можно заметить несколько характерных особенностей.
Во-первых, существующие рекомендации по использованию ABC анализа кочуют из одной книги в другую, из книг в статьи, из статей в обсуждения. Если пройтись частым бреднем по информационным просторам, оказывается, что львиная доля - просто переписывается одним автором у другого, подчас даже не заморачиваясь перефразированием.

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

Миф первый.
Цитата: "чтобы выделить наиболее важные позиции ".

 

Замечательно. Цель, достойная мыслящего человека. Только мне бы хотелось обратить внимание на то, что как только мы выделили показатель объекта и стали считать его ключевым в нашей задаче, мы автоматически определили эти так называемые "наиболее важные". Хорошо, для наглядности можно "сортирнуть" это дело, сверху более важные, снизу - менее. Теперь нам говорят, что надо где-то провести границы. А зачем, спрошу я вас? Я вижу только одно объяснение: как только мы проведем границы и раскрасим товарный перечень, так сразу сможем отчитаться перед начальством или перед собой, что "ABC анализ проведен". Можно поставить галочку и взять с полки пирожок, а дальше-то что?
Вооот. Отчего и звучит этот вопрос с незавидной регулярностью, что цель подразумевает действие, которое будет осуществлено на основании анализа, а значит, вот это "чтобы выделить" не может быть целью, а лишь вспомогательным шагом для какой-то другой цели. Поэтому говорить тут боле и не о чем, цель эта - чистейший миф.
 

Заботимся о пищеварении. Мифы ABC анализа. Горячие закуски

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

 

 

 

 

Миф второй. Учет и контроль – вот главное, что требуется для «налажения», для правильного функционирования первой фазы коммунистического общества. (Ленин В.И.)

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

С входного потока и начнем. Цитата:
Ежедневное обновление данных в базе данных. То есть для таких номенклатурных позиций необходимо использование системы с непрерывным обновлением данных о запасах.

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

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

(Заметим, что это измерение в каком-то смысле смешанное - оно контролирует точность входных данных, но путем измерения промежуточного результата).
Очевидно, что для B и C все это делается как-то пореже.

Ну не знаю, я предпочитаю считать ошибку прогноза по всем позициям, а не по 20%. И делать это с периодичностью, равной составлению этого самого прогноза. В зале хор голосов: да он с ума спрыгнул, у нас тут тысячи позиций, нам на все времени никогда не хватит! Ясный пень не хватит, если использовать такой подход, как рекомендовано в цитате! - Каждый раз смотреть ошибку прогноза даже по паре сотен позиций - это мазохизм, а если точнее - совершенно бесполезная трата денег работодателя. А все потому, что мы давно не вспоминали Утверждение. Пока "мы" - человек с его ограниченными вычислительными возможностями, а "обработать" - оценить адекватность показателей по целому списку, без классификации никак. Я предлагаю немного другой путь. Для расчета по всей номенклатуре и предварительной фильтрации я буду задействовать компьютер, а человеку подсовывать уже отфильтрованный короткий список. Чтобы фильтровать ненужную информацию я задействую несколько иной вид классификации под названием "нормирование". В первом приближении будем считать, что пока позиция в каком-то смысле показывает хороший результат (показатель находится в установленных пределах), мы ее "в упор не замечаем". А в "список провинившихся" попадают только те позиции, которые вышли за рамки и требуют принятия мер. Такой подход под названием "контроль по отклонениям" позволит нам действительно ловить только проблемные позиции. Но для этого нужно правильно определить показатель для нормирования (оно же допуск в терминах контроля качества). Вот мой сценарий решения:

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

В соответствии с рекомендацией "красная зона" выглядит так:

Недостаток такого подхода состоит в том, что насколько бы точно мы ни научились прогнозировать, все равно каждый раз нам предлагается просмотреть весь список А. Совершенно неэффективный способ. Из соображений здравого смысла разумней было бы определить красную зону как "имеющие оборот более, чем XX И ошибку более, чем YY":

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

(Оборот) * (Ошибка прогноза)

Тогда наша красная зона может быть описана областью (Оборот) * (Ошибка прогноза) > Норматив:

Все, что выше и правее этой гиперболы, попадает в виде отчета под ясны очи человеку.


Что в итоге? Мы нарисовали механизм контроля точности прогнозирования. При этом нигде не использовали Сочетание Из Трех Или Более Латинских Букв, да к тому же и сделали его более производительным и тонким.

И еще один важный момент. Данный механизм позволяет быть очень гибким. Как уже упоминалось, в варианте контроля по группе А мы вынуждены каждый раз просматривать один и тот же список полностью. В реальности же человек может быть ограничен ресурсом, поэтому норматив изначально выбирается таким образом, чтобы список можно было на самом деле обработать и принять решения (например, в отчет выдать лишь 50 позиций, не уложившихся в допуск). А далее есть варианты: либо мы начинаем укладываться в допуск и берем с полки пирожок, либо, следуя заветам Деминга, занимаемся непрерывным улучшением - постепенно ужесточаем норматив.

Заботимся о пищеварении. Мифы ABC анализа. Приступим к первому

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

 

 

 
 
Миф третий.

Так называемые "политики управления".

Цитата:

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

Очевидно, здесь имеется в виду классификация по обороту. Мы люди грамотные, так что эта рекомендация de facto означает максимизацию оборачиваемости. Однако, как мы знаем, высокая оборачиваемость сама по себе отнюдь не означает максимальную прибыльность. Более того, оптимальная оборачиваемость определяется такими характеристиками, как стоимость размещения заказа, издержки хранения и замораживания средств, плановая наценка, штрафы непоставки и другие штрафы, план реализации и его точность. А вовсе не только оборотом и буквой, которую мы назначили этой позиции. Так что эта т.н. "рекомендация" - вредительство и саботаж, передайте это общему собранию.

Непосредственно к этой теме относится и следующая цитата:

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

Надо заметить, что примерно в половине источников присутствует прямо противоположная рекомендация: для класса C не нужно обеспечивать высокий страховой запас (и, как следствие, высокий уровень обслуживания). Давайте отнесемся снисходительно к таким, с позволения сказать, "разночтениям". Просто первую рекомендацию дают производственники, для которых срыв производства из-за недостатка предположительно дешевых комплектующих смерти подобен, а вторую - "торгаши", для которых стокаут по мало продающейся позиции погоды не делает.

В целом мы уже отметили, что размер страхового запаса определяется совсем не теми критериями, которые сюда притягивают за уши. Но вышеуказанное разночтение весьма показательно: если вспомнить, что штраф за недопоставку в торговле мизерный, то потеря прибыли в случае производства может многократно превышать любые издержки, связанные с хранением запаса дешевых комплектующих, так что на качественном уровне все очень похоже на правду. Однако нигде в этих рекомендациях не присутствует ответ на единственный практический вопрос: "большой", "высокий" - это сколько (в граммах)? То есть опять разговоры ни о чем, все равно придется либо волевым усилием назначить эти величины ДЛЯ ГРУППЫ В ЦЕЛОМ вне зависимости от всех прочих влияющих параметров, либо честно считать экономику определения оптимального страхового запаса.
Заметьте, даже привлечение сюда вдобавок к ABC еще и XYZ точно так же не спасает ситуацию, ибо мы тут тоже не знаем точных значений вариативности, а лишь "масть" позиции, ее букву в соответствии с собственными представлениями.

Миф четвертый.

Инвентаризация.

Цитату приводить не буду, суть в следующем: для группы A текущая инвентаризация должна делаться чаще, для C - реже. Видимо, подразумевается, что в группе A как правило более дорогие позиции и контролировать их наличие лучше бы почаще. Помимо того, что предположение о стоимости ммм... несколько спорно, будем все же считать, что средний запас на складе все-таки сильно коррелирует с оборотом по позиции. В денежном выражении, разумеется. Тогда такая политика инвентаризации кажется достаточно осмысленной, однако и тут есть недостатки. Во-первых, как уже было замечено, разброс показателя внутри группы A у нас составил 34 раза, так что возникает крамольная мысль, а не логичнее ли все-таки почаще считать самую "голову"? Во-вторых, возникает систематическая проблема, когда всем прекрасно известно, что когда будет пересчитываться, а, значит, возникает латентная почва для злоупотреблений.

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

На графике мы нарисовали по горизонтали весь доход, полученный от продажи этих 6 позиций, но каждая позиция занимает часть отрезка, пропорциональную ее вкладу. Теперь если мы сгенерируем случайное число из отрезка [0;Суммарный доход], мы попадем в область, принадлежащую одной из позиций. А так как функция RAND гарантирует равномерное рапределение результата на интервале, то частота попадания в область будет прямо пропорциональна ее размеру, а, значит, нашему ключевому параметру - доходу. Таким образом, мы одним выстрелом убиваем двух зайцев - существует вероятность проверки любой позиции в любой момент, но вероятность тех, кто "равнее" - выше, причем прямо пропорционально показателю.


Справка. Функция RAND является встроенной не только в электронные таблицы, но и в любой язык программирования. В 1С она тоже есть, так чта... ABC нам здесь напрочь не нужен, мы сделали все в полностью автоматическом режиме и гораздо изящней.

Заботимся о пищеварении. Мифы ABC анализа. Пожалуйте горяченького

- Слуга покорный,- трубил Амвросий,- представляю себе твою жену, пытающуюся соорудить в кастрюльке в общей кухне дома порционные судачки а натюрель! Ги-ги-ги!.. Оревуар, Фока! - и, напевая, Амвросий устремлялся к веранде под тентом.
Эх-хо-хо... Да, было, было!.. Помнят московские старожилы знаменитого Грибоедова! Что отварные порционные судачки! Дешевка это, милый Амвросий! А стерлядь, стерлядь в серебристой кастрюльке, стерлядь кусками, переложенными раковыми шейками и свежей икрой? А яйца-кокотт с шампиньоновым пюре в чашечках? А филейчики из дроздов вам не нравились? С трюфелями? Перепела по-генуэзски? Десять с полтиной! Да джаз, да вежливая услуга! А в июле, когда вся семья на даче, а вас неотложные литературные дела держат в городе, - на веранде, в тени вьющегося винограда, в золотом пятне на чистейшей скатерти тарелочка супа-прентаньер? Помните, Амвросий? Ну что же спрашивать! По губам вашим вижу, что помните. Что ваши сижки, судачки! А дупеля, гаршнепы, бекасы, вальдшнепы по сезону, перепела, кулики? Шипящий в горле нарзан?! Но довольно, ты отвлекаешься, читатель! За мной!..

 

Что ж, пора перейти к контролю по обратной связи. Помните, мы говорили про информационные потоки? Вооот. Мы как-то работали, получился результат в виде существующего на данный момент запаса. Хорошо бы оценить его "качество" как показатель качества нашей работы.

Миф очередной.
Со счета я сбился, поэтому ну его. Опять же цитировать не буду, объясню суть.

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

В примитивном варианте можно регулярно делать снимок склада и вычислять долю позиций, находящихся в ситуации out of stock. В каком-то смысле это будет показателем. Я думаю, недостатки такого индикатора (который, кстати, называется уровнем обслуживания 1-го рода, помните?) лежат на поверхности. Один из недостатков - случайность момента снятия остатков - может быть легко устранен. Стоит лишь взять эти остатки не на текущую дату, а за какой-то промежуток времени и усреднить, как мы этот элемент случайности убираем.

Однако в любом случае остается другой недостаток - то, что это "средняя температура по больнице".
Неплохо бы учесть неравенство позиций в матрице. И тут часто всплывает... правильно, ABC анализ. Предлагается сделать его по той же прибыльности (в крайнем случае, по обороту, если прибыль посчитать не можем) и затем измерить уровень обслуживания отдельно по каждой из групп. Это лучше? Безусловно, кто б спорил. Главное - считать прибыль за достаточно большой период, дабы нивелировать прошлые стокауты. Только получается, что мы сделали кучу работы, а полностью недостаток опять не устранили - стокаут по позициям, которые отличаются в 34 раза, оценивается по-прежнему одинаково.
К тому же теперь нам вместо одного норматива придется контролировать три, значит, возникает множество, мягко выражаясь, нюансов. Скажем, если мы привязываем мотивацию закупщика к такому нормативу, как оценивать такой результат:

A - норматив +1%
B - норматив -4%
C - норматив +10%

С такими цифрами я сразу представляю споры на тему "хорошо или плохо" в стиле "Ханумы"
- Да у нее же одна нога короче другой!
- Зато другая длиннее. Намного длиннее!!!

Этак придется придумывать дополнительно еще какую-нибудь хитрую формулу, которая оценит ситуацию интегрально. Типа "1% группы А соответствует 5% группы Б". Почему такое соотношение, никому непонятно, но так порешили, цифры ровные и красивые.
В результате схема мотивации окончательно перестает быть прозрачной для исполнителя, и значит на мотивации можно ставить крест. Если не хуже.

Возникает вопрос, а за шо рубились? Не правильнее ли будет изначально создавать показатель, который даст интегральную оценку? Как обычно, про латинские буквы я забуду.
В самом первом примере мы для каждой позиции i создали показатель
δi = 0, если отсутствует
δi = 1, если присутствует
а затем расчитали долю присутствующих в общем числе

Пусть я получил 95%. Что это означает? Лично для меня практически ничего. Ну да, 95% позиций имеются в наличии, а о чем это говорит с точки зрения бизнеса, то бишь денег? Только если все позиции продаются достаточно часто и равномерно, это видимо каким-то образом влияет на лояльность клиента - если поднять эту цифру, лояльность в дальней перспективе вырастет. Но уж как-то это все смутно...

Хотелось бы более "монетарного" смысла. Поэтому для каждой позиции i я буду учитывать ее рейтинг Ri. Мне кажется, в данном случае правильно в качестве рейтинга взять именно прибыль. Тогда для каждой позиции показателем будет служить δiRi, где δi имеет тот же смысл, что и ранее. Очевидно, что это произведение имеет четкий смысл - это прибыль, приносимая позицией в том случае, если она присутствует. Теперь я расчитаю интегральный показатель как

Пусть я опять получил 95%. Что это означает? О, вот тут вполне все понятно, особенно если обратить внимание на знаменатель - общую прибыль за период. Эта цифра с большой точностью приближения (опять же, если мы брали большой период, когда доля стокаутов по всем позициям не сильно отличается) описывает уровень обслуживания 2-го рода, т.е. при сохранении текущей ситуации мы будем напрямую терять приблизительно 5% прибыли из-за неудовлетворенного спроса.

ABC анализ. Заботимся о пищеварении. Перемена блюд.

 

- Ну - с, Кузьма Павлович, мы угощаем знаменитого артиста! Сооруди сперва водочки... К закуске чтобы банки да подносы, а не кот наплакал.
- Слушаю-с.
- А теперь сказывай, чем угостишь.
- Балычок получен с Дона... Янтаристый... С Кучугура. Так степным ветерком и пахнет...
- Ладно. Потом белорыбка с огурчиком...
- Манность небесная, а не белорыбка. Иван Яковлевич сами на даче провешивали. Икорка белужья парная... Паюсная ачуевская - калачики чуевские. Поросеночек с хреном...
- Я бы жареного с кашей, - сказал В. П. Далматов. -
Так холодного не надо-с? И мигнул половому.


 

 

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

Дело в том, что даже при стабильной общей картине отдельные позиции в матрице с течением времени смещаются. Какие-то начинают приносить больше прибыли, а какие-то - меньше. Это нормальная ситуация, причин может быть множество. Нам бы хотелось отлавливать ситауции, когда такие смещения являются неслучайными, обусловленными сдвигами рынка. Из общих соображений кажется, что сигналом такой неслучайности может быть в каком-то смысле "сильное" смещение. Таким образом, наша задача сводится к механизму определения, что же считать сильным смещением, дабы начинать реагировать. Попробуем с помощью Гиляровского порешать эту задачу, стараясь не сильно переедать.

- Так, а чем покормишь?
- Конечно, тестовскую селянку, - заявил О. П. Григорович.
- Селяночку - с осетриной, со стерлядкой... живенькая, как золото желтая, нагулянная стерлядка, мочаловская.
- Расстегайчики закрась налимьими печенками..
- А потом я рекомендовал бы натуральные котлетки а ля Жардиньер. Телятина, как снег, белая. От Александра Григорьевича Щербатова получаем-с, что - то особенное...
- А мне поросенка с кашей в полной неприкосновенности, по - расплюевски, - улыбается В. П. Далматов.
- Всем поросенка... Да гляди, Кузьма, чтобы розовенького, корочку водкой вели смочить, чтобы хрумтела.
- А вот между мясным хорошо бы лососинку Грилье, - предлагает В. П. Далматов.
- Лососинка есть живенькая. Петербургская... Зеленцы пощерботить прикажете? Спаржа, как масло...
- Ладно, Кузьма, остальное все на твой вкус... Ведь не забудешь?

Миф опять же очередной.
ABC анализ позволяет позволяет контролировать изменение структуры сбыта.

 

Делается это так. Проводится стандартным образом ABC анализ, неважно, одно- или многомерный. Мы для простоты будем считать, что делаем одномерный анализ по прибыли, для нескольких измерений ничего не меняется. Естественно, чтобы засечь сдвиги, анализ делается на регулярной основе и результат фиксируется. По каждой позиции анализируется, не изменила ли она свою буковку. Ой, простите, группу. Если поменяла, это считается тем самым сильным сдвигом. Конечно, тут есть варианты. Можно, например, считать, что переходы B<->C не являются критическими и не обращать на них внимания.

Думаю, те, кто читал предыдущие части, уже понимают, насколько ущербен такой подход. Как говорят математики, тут зарыта вероятность двух типов ошибки.
Первая - сдвиг произошел, но мы его прозевали, поскольку буква не поменялась. Возвращаясь к нашим тестовым данным, мы можем вспомнить, что пока позиция "плавает" в пределах с 1-й по 247-ю, при этом меняя прибыль в 34 раза, она все еще остается в группе А, так что мы этого не заметим.
Вторая - не было никакого сдвига, позиция просто располагалась близко к границе групп и при малейшем дуновении ветерка переехала. Такой вариант, конечно, не так страшен, но нам придется потратить на его рассмотрение время-деньги, более того, вся эта команда приграничных позиций будет постоянно свинговать туда-сюда, отвлекая нас от действительно нужных занятий. Сразу вспоминаю одного начальника, который по подобному поводу уверенно провозгласил "ну и пусть разбираются, один хрен дурью маются!" Пусть его, мало кто из больших начальников имеет несмутное представление о нашей деятельности. Мы лучше попытаемся создать методику, работающую более эффективно и одновременно требующую меньших затрат.

В тот же миг два половых тащат огромные подносы. Кузьма взглянул на них и исчез на кухню. Моментально на столе выстроились холодная смирновка во льду, английская горькая, шустовская рябиновка и портвейн Леве No 50 рядом с бутылкой пикона. Еще двое пронесли два окорока провесной, нарезанной прозрачно розовыми, бумажной толщины, ломтиками. Еще поднос, на нем тыква с огурцами, жареные мозги дымились на черном хлебе и два серебряных жбана с серой зернистой и блестяще - черной ачуевской паюсной икрой. Неслышно вырос Кузьма с блюдом семги, украшенной угольниками лимона.

Начали попервоначалу "под селедочку".
- Для рифмы, как говаривал И.Ф. Горбунов: водка - селедка.
Потом под икру ачуевскую, потом под зернистую с крошечным расстегаем из налимьих печенок, по рюмке сперва белой холодной смирновки со льдом, а потом ее же, подкрашенной пикончиком, выпили английской под мозги и зубровки под салат оливье...

Как и ранее, повторим первый этап ABC-анализа, т.е. отсортируем по ключевому показателю, перейдем к нарастающему итогу и относительному положению каждой номенклатурной позиции. В итоге мы опять же для каждого товара получаем две "координаты" - X% положение товара в рейтинге и Y% доли в прибыли:

 

А теперь мы не будем расставлять буковки, а вместо этого начнем фиксировать и контролировать любой из этих показателей (а то и оба). С точки зрения "подобия ABC" следует контролировать координату X, однако из рисунка видно, что в этом случае наиболее чувствительными к отклонению будут как раз позиции, находящиеся в конце списка, т.е. наименее доходные. Поэтому с точки зрения эффективности логичнее контролировать как раз Y, т.е. саму доходность. Далее процесс очевиден: необходимо директивно ввести в компании нормативы на отклонение и правила реакции персонала на превышение этих нормативов. К примеру, можно считать, что изменение показателя Y в пределах 5%, не считаются критическими и не требуют принятия мер.

 



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

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

- Селяночки-с!..

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

Bullwhip Effect или эффект хлыста

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

Итак, что же это такое, Bullwhip Effect?

 

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

 

Каковы же внутренние причины такого поведения?

Возьмем простейший пример:
1 магазин, текущий запас 1000 ед., прогноз продаж 1000 ед. за период.
1 поставщик, текущий запас 1000 ед.
суммарное время реакции поставщика — 3 периода.

Тогда сбалансированный план будет выглядеть следующим образом:

 

Предположим, что в этот момент по каким-то причинам меняется спрос — становится 500 ед. Тогда магазин в течение 4 периодов не будет заказывать вообще. Сравним заказы, поступающие на эти два уровня:

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

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

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

А далее мы будем играть. В интересную игру, изобретенную в Massachusetts Institute of Technology где-то в 60х годах 20го века. Уж не знаю, из каких соображений они выбрали именно такое название, но называется она

The beer distribution game

 

Правила игры.

Играют 4 участника:

0.Магазин
1.Оптовик
2.Дистрибьютор
3.Производитель

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

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

На каждом шаге считаются общие издержки содержания цепочки:
Стоимость хранения единицы товара везде одинакова и составляет 0.5 условного лаптя (далее — улап). Штраф за недопоставку составляет 1 улап за единицу товара.

Цель игры — минимизировать совокупные издержки при заданном (но неизвестном участникам!) поведении спроса конечных потребителей.

Стандартный сценарий игры:
25 ходов обычно достаточно для показательных результатов
начальные значения у всех уровней одинаковые:
запас — 12 ед.
в пути — 1 транспорт (4 ед.) с временем прибытия на следующем ходу и 1 траспорт (4 ед.) под разгрузкой на складе.
Заказ — 4 ед.

а теперь запускаем процесс: спрос конечных потребителей — по 4 ед. в первые 5 ходов, далее по 8 ед. Не забываем, что эта информация игрокам неизвестна!

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

Типичные результаты представлены на графиках

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

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

То есть полное отсутствие стокаутов, начиная с некоторого шага запасы отсутствуют (просто JIT какой-то получается!).

Не давайте себя запутать! Как авторам публикаций о Bullwhip effect, так и ведущим всяческих семинаров. Заметьте, как подобраны исходные данные для игры. Ошибка прогноза составляет 4 ед., что при умножении на время реакции в 3 хода дает в точности 12 ед. начального запаса. Измени хоть одну цифру или модифицируй входной поток заявок от конечного потребителя — и вся эта «стратегия» летит ко всем чертям. Я уж не говорю о том, что работать без страхового запаса — это надо знать, что дальше все будет абсолютно ровно.

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

По оси X отложена стоимость хранения, по оси Y — штраф за недопоставку. Поскольку результат игры — сумма этих цифр, серая линия показывает прямую одинаковых результатов.

Лучший результат, как мы уже говорили, показал компьютер — 228 улап.

Результаты с участием людей как правило лежат в пределах 600-900. Впрочем, зафиксирован рекорд в 4000 улап. Причем, чем больше людей в игре, тем результат хуже. Каковы же причины того, что люди в целом показывают худшие результаты, чем роботы? Исследователи отмечают две крайние тенденции «улучшательства», которые четко видны:

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

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


Итак, каковы же причины возникновения эффекта хлыста? Перечислим их еще раз

  • Наличие времени реакции системы - как времени прохождения информации по цепочке, так и времени прохождения материального потока
  • Ошибки в прогнозе потребления
    • в том числе увеличение страховых запасов из-за ошибки прогноза
    • в том числе из-за неучета промоактивности (распродаж, рекламных мероприятий) — увеличение размаха колебаний
    • увеличение размаха колебаний из-за существования минимальных партий поставки
    • увеличение размаха колебаний из-за ажиотажного спроса в период отсутствия товара у поставщика (и частой отменой заказов после появления такого запаса)
  • Отсутствие общей информации о состоянии цепочки

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

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

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

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

Рис.4

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

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

(7)

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

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

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

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

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

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

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

Рис.5

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

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

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

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

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

Табл.2

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

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

Рис.6

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

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

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

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

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

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

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

Рис.7

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

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

Табл.3

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

Рис.8

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

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

Табл.4

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

Рис.9

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

Попробуем очистить данные от тренда. В качестве оценки используем общее приращение на всем объеме наблюдений. Подсказка для тех, кто любит использовать Excel или аналогичные продукты: нужно вычислить приращение объема продаж относительно предыдущего значения, а затем вычислить среднее значение полученных разностей. Это нам даст наклон линии тренда, причем сразу в абсолютных единицах (на картинке - T0). Затем над рядом, очищенным от сезонности, провести обратную операцию — вычитание на каждом шаге полученной добавки. Примерно так:

Табл.5

Результат:

Табл.6

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

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

Рис.10

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

Табл.7

Табл.8

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

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

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

В качестве оценки ожидаемых продаж на январь 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 правило формирования страхового запаса. Вне зависимости от действительной величины вариации. Что ж, можно и так.

 


Заключения.

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

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

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

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

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


Всякая задача имеет простое красивое неправильное решение

Удачи вам всем,
Станислав Архипов, Санкт-Петербург, февраля 21го числа, 2008г.

Все права принадлежат автору. Никакая часть статьи не может быть использована в какой-либо форме без письменного разрешения.

Задача об эскалаторе или чем еще отличаются две столицы.

Дело в том, что Ваш покорный слуга достаточно часто по делам посещает белокаменную и волей-неволей замечает некоторые отличия от дождливого Питера. Шут с ними, бордюрами/поребриками, это лишь терминологические заморочки, сегодня речь пойдет о некоторых стереотипах поведения homo sapiens.

Стоя в "пробках" при входе на эскалатор, имеешь некоторое время для отвлеченных размышлений, и в очередной московской очереди я задумался над очевидным различием. Дело в том, что в Питере на подъем эскалатор забивается в два ряда, а в Москве стоят только в правом ряду, оставляя левый для поднимающихся пешком. И попробуйте только встать слева, услышите о себе некоторые интересные вещи - если не словесно (москвичи - очень культурные люди), то уж взглядом точно.

И тогда я подумал, что это вообще неплохая учебная задача. Есть логистический канал со своими характеристиками, было бы интересно просчитать его пропускную способность при разных стратегиях использования. Давайте прикидывать физические параметры канала. Порывшись (неглубоко, надо сказать) в инете, я взял следующие значения:
Характерная длина эскалатора - 100м.
Скорость движения лестницы может варьироваться 0.5-0.75, но оценка 0.66 м/с вполне правдоподобна, да и цифры покруглей получаются.
Первый результат - время подъема 100/0.66=150 с.

Теперь будем топать ножками. Даже если Вы - хорошо тренированный человек, выдержать среднюю скорость на всем протяжении подъема более, чем 1 ступенька в секунду, Вам вряд ли удастся, пусть это будет ~0.3 м/с.
Второй результат - время подъема 100/0.96=104 с, то есть мы экономим 46 с. Заметим, что при этой стратегии москвич экономит от силы полторы минуты за весь путь на работу. Критично? Что ж, готов поверить...

Но давайте все же оценивать пропускную способность. Для начала расставим грузовые единицы справа в один ряд. Как известно, каждая единица занимает ровно две ступеньки или ~0.6 м. При таком грузопотоке канал пропускает через себя 0.66/0.6=1.1 чел/с.
При "питерской" схеме через канал движется максимум два таких потока параллельно, то есть результат - 2.2 чел/с.
При "московской" схеме остается один поток, но параллельно с ним движется поток поднимающихся. Каково расстояние между ними? Давайте прикидывать. По моим наблюдениям, подъем ножками выбирает от силы каждый двадцатый пассажир. Хорошо, будем закладываться по максимуму, пусть будет каждый десятый. Тогда расстояние оказывается 2 ступеньки * 10 человек = 12 м. Отсюда интенсивность этого потока (0.66+0.3)/12 = 0.08 чел/с, а общая пропускная способность - 1.18.

Вывод 1. В метрополитене работают неглупые люди, раз дежурные по станции везде просят пассажиров на подъеме вставать в два ряда.
Вывод 2. Как и в случае автомобильных пробок, мы частенько сами их и создаем.

Зачем нужны Распределительные Центры? игрушечный case study.

Сегодня я решил заняться раскрытием великой тайны. Зачем сетевые структуры используют схему поставок с распределительными центрами?
Ответы в стиле "так все делают", или же более круто-изящное "that's of the best practices" меня обычно не устраивают в силу благоприобретенного цинизма и врожденной мизантропии. Впрочем, те, кто почитывает мои опусы, уже давно в курсе.

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

Постановка задачи.

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

Будем рассматривать два варианта топологии - когда каждый магазин снабжается от поставщика независимо, и когда в регионе покрытия ставится РЦ, через который идет весь поток. Для определенности я выбрал следующие параметры модели (мне они показались очень похожими на реальность):

  • поставки от поставщика происходят раз в 30 дней (log.cycle)
  • разброс по срокам поставки ±4 дня, что соответствует примерно СКО=2 (sl)
  • заявку на поставку я должен разместить не позднее, чем за 10 дней до даты оприходования, так что срок реакции составит 40 дней (ml)
  • эти условия не меняются при "вставке" РЦ в цепочку
  • прогноз спроса в магазине 100 ед/день (mq)
  • СКО спроса в день 50 ед (sq)
  • поставки в магазин с РЦ осуществляются ежедневно (log.cycle=1)
  • развозка РЦ-магазин осуществляется всегда вовремя (sl=0)
  • время реакции звена РЦ-магазин составляет 2 дня (ml=2)
  • коэффициент страховых k_SL=2.5

Вот результат:

 

Как видим, при данных параметрах экономия наблюдается, и весьма заметная. Однако при других параметрах суммарный запас вполне может вырасти, так что можно себе задать вопрос "а зачем все это?" Тут весь фокус в том, что запасы, даже если они увеличиваются, по большей части начинают храниться не в магазине, а на РЦ, где собственно стоимость хранения может оказаться сильно меньше.

Отдельный вопрос - изменение структуры и стоимости транспортных потоков. Это вообще вопрос отдельного рассмотрения, суммарные затраты могут как вырасти, так и упасть.

Если внимательно поразглядывать формулы и поиграться с параметрами цепочки, можно сделать несколько выводов.

  • чем больше количество магазинов, тем выгоднее РЦ
  • чем больше уровень сервиса, тем выгоднее РЦ
  • чем дальше поставщик от рынка сбыта, тем выгоднее РЦ
  • чем дороже площадь в магазине, тем выгоднее РЦ

 

Минимальная оборачиваемость товарных активов

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

Итак, предположим, что у нас имеется небольшой кусочек денег, который мы хотим вложить в дело и желательно при этом получать прибыль. То есть для нас задача на самом деле ставится именно как «заработать с вложенного рубля не ниже XX копеек». Нет, XX мало, пусть будет XXX. С точки зрения математики выражение будет выглядеть как

(1)

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


Наш капитал в общем случае раскладывается на основной (издержки функционирования структуры за период: зарплаты, аренды, амортизация и пр. и пр.) и оборотный (непосредственно вложения в товар)

(2)
 

Для дальнейшего расчета нам необходимо знать структуру наших инвестиций. Будем считать, что доля оборотного капитала в общей сумме составляет



                   ( )


Тогда      

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

 


, где - торговая наценка, V – реализация за период в учетной себестоимости, - стоимость денег.

Небольшое замечание. В данном случае я сознательно не включаю в пассив издержки «обслуживания запаса» - считаю их условно-постоянными (то есть отнесенными к основному капиталу). К этому вопросу мы еще вернемся.

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


Неравенство сводится к  

С другой стороны, наш оборотный капитал можно представить как

X – собственно средний за период товарный запас,
Кред — средняя за период кредиторская задолженность,
Деб — средняя за период дебеторская задолженность,
баланс задолженности БЗ= Кред-Деб

(3) 

что характерно, все эти выражения безразмерны и имеют четкий физический смысл

есть не что иное как оборачиваемость

есть не что иное как коэффициент привлеченных средств

  есть не что иное как рентабельность оборотных средств


В качестве иллюстрации для параметров = 0.35 и =0.05 построим диаграммы зависимости оставшихся трех параметров при разных значениях БЗ.

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

  1. Ограничения (прежде всего по объему).

  2. Корреляция (влияние наличия одной позиции на V другой).

  3. Уровень обслуживания (частота продаж).

Кроме того, если на макроуровне мы знаем уровень затрат (мы его ввели как капитал Косн), то определить долю затрат на содержание единицы продукции представляется весьма затруднительным.

Об этом мы поговорим в следующей серии...

Оборачиваемость, средний запас...

Оборачиваемость, средний запас...

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

На самом деле полезно почаще вспоминать о том, что сами по себе эти цифры ничего не говорят об эффективности управления запасами. Потому что управление запасами — 'it's all about money'. Деньги — вот единственный и универсальный измеритель, а отнюдь не килограммы, штуки, кубометры, паллеты и прочие грузоместа. Так что пусть меня простят те, кто гордо себя величают «логистами», логистика — это несколько шире, нежели задача коммивояжера.

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

Давайте сделаем два предположения, которые на практике недалеки от истины.
Первое — в целом по компании инвестиции в запас с течением времени меняются крайне медленно и в весьма небольших пределах. Одни товары продаются, другие поставляются, сумма остатков "в среднем по больнице" постоянна даже в пределах товарных групп. Несмотря на то, что запас каждой отдельной позиции меняется быстро и в широких пределах, освобождающиеся деньги сразу же реинвестируются в другую продукцию (на самом деле не сразу, но об этом чуть ниже). Таким образом, размер инвестиций в каждую конкретную позицию можно заменить средним значением ее запаса в деньгах — Инвестиции = S (Средний запас) * c (себестоимость). Еще более точным такой подход становится, если брать достаточно большой период усреднения.
Второе — для любого товара Прибыль = r (коэффициент наценки) * c (себестоимость) * V (объем продаж). Тогда наш показатель
 

где Tоборачиваемость, отношение объема отгрузок к среднему запасу.

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

Из формулы видно, что увеличение оборачиваемости — прямая задача управления запасами. Поскольку на r мы повлиять можем в весьма небольших пределах — цена на рынке ограничивает нас с одной стороны, а с другой — это получение минимальной себестоимости за счет лучших входных цен и уменьшения операционных издержек (логисты, привет!).
Однако отметим для себя, что все-таки сама по себе оборачиваемость ни о чем не говорит, важно именно произведение rT. Так что если при анализе мы встречаем две позиции с сильно разной оборачиваемостью, мы не будем спешить и размахивать шашкой. Еще не факт, что плохая оборачиваемость означает плохое управление.

Теперь попробуем разобраться, как же нам посчитать эту самую оборачиваемость. С объемом продаж все понятно, это факт, данный нам в объективных ощущениях учетной системой. Так что тут разночтений почти не возникает. Другое дело — средний запас. Пусть мы хотим посчитать средний запас на промежутке времени [t1;t2] и знаем, что динамика запаса была такой:

Задача нахождения среднего запаса состоит в том, чтобы найти такое значение x0, что площадь под кривой запаса в точности совпадает с площадью под средней линией x=x0. Отсюда формула

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

площадь под кривой на промежутке полного цикла пополнения =
(t2-t1)*страховой запас + (t2-t1)/2 *рабочий запас, а

средний запас есть сумма страхового и половины рабочего запаса - правило, постоянно звучащее, но не всегда выполняемое.

Конечно, если потребление неравномерно, такая простая формула уже не работает:

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

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

Из картинки видно, что теоретически чем чаще мы будем снимать показания, чем точнее будет результат. Но тут возникает

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

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

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

Но мы пойдем дальше. Что если у нас цикл планирования 1 месяц, а товар таков, что оборачивается как правило 1 раз в три месяца (T~1/3)? По соображениям здравого смысла нам бы следовало взять большой период усреднения, иначе мы рискуем не захватить достаточное количество отгрузок и само понятие усреднения теряет свой смысл. Посмотрим повнимательнее на формулу. При достаточно больших N сумма отгрузок растет приблизительно пропорционально N (длине периода измерения). Совершенно аналогично ведет себя и сумма остатков, а значит T/N — приблизительная константа, характеризующая наш поток. Если мы снимали значения запаса ежедневно, эту дробь можно назвать «среднедневная оборачиваемость». И физический смысл ее как раз в этом — отношение Среднедневных отгрузок к Среднедневным остаткам, но при этом усреднение делалось на большом промежутке времени. Пример.

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

Тогда

N=365
Сумма отгрузок = 4
Сумма остатков = (365-4*5)*1 = 345 (средний запас = 345/365)

Годовая оборачиваемость = 365*4/345 ~ 4.23
Среднедневная оборачиваемость = 4/345 ~ 0.012

Более того, как только я посчитал среднедневную оборачиваемость, я могу в любой момент пересчитать ее в любой период. К примеру, среднемесячная оборачиваемость по данной позиции в предположении 30-дневного месяца будет

T/N*30 ~ 0.35 (ну да, примерно раз в три месяца, как и предполагалось).

Однако вернемся к нашему универсальному измерителю, а то мы увлеклись техникой расчета. То бишь зачем все это было надо? Есть искушение контролировать управление запасами по такому простому показателю, как оборачиваемость.

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

Второй подход будет ближе тем, кто любит делать классификации.

Возьмем всю номенклатуру компании и распишем

Теперь поделим всю номенклатуру на группы с близкими значениями r. Как уже говорилось в начале, очень часто внутри товарных категорий норма рентабельности одинаковая, так что для такой группы можно написать

В числителе мы видим объем продаж по всей группе в деньгах, а в знаменателе — средний запас по группе в деньгах. Дробь таким образом суть Оборачиваемость по группе:

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

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

тогда Средняя рентабельность по компании

Средняя оборачиваемость по компании

Тогда и в целом по компании можно написать

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

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

Оптимальный размер заказа в стиле fashion

Залача, которую мы здесь будем решать — определение оптимального размера заказа. Но в данном случае это будет не классический EOQ (Economic Order Quantity), который решался Уилсоном. В классической постановке de facto решается задача оптимизации периода между поставками, или, что то же самое, оптимизация рабочего запаса.

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

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

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

Итак, наша картинка динамики запаса внутри периода выглядит примерно так:

здесь

S — искомый размер закупки
S0 — матожидание спроса за период
z — два варианта траектории запасов
f(z) — плотность вероятности рапределения спроса за период

Начнем оценивать наши потенциальные потери. Как известно, матожидание случайной величины Z(z) есть

Количество непроданного товара составляет (см. рисунок)

0, если z>S
(S-z), если z<S

Количество товара, которого не хватило, составляет (см. рисунок)

0, если z<S
(z-S), если z>S

Пусть h — потери от одной оставшейся в конце периода газеты,
d — недополученная прибыль на нехватку одной газеты,
r — стоимость кредитования на покупку одной газеты за весь период, тогда полная функция потерь

Для нахождения минимума этой функции нужно решить уравнение L'(S)=0

Для данного случая решение уравнения выглядит как

где F(S) — интегральная функция распределения спроса за весь период.

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

Цена закупки 20р
Цена продажи 28р
Остатки на следующий день я смогу пристроить на свиноферму по 16р
Стоимостью денег на таком коротком промежутке я буду пренебрегать

h=20-16=4
d=28-20=8

F(S)=0.67

Пусть дневной спрос распределен по нормальному закону с параметрами S0=300, σ=50.
Тогда, пользуясь таблицей значений функции Лапласа, находим соответствующее значение аргумента

S=322.

А теперь попробуем осмыслить результат. При данном распределении спроса нам наиболее выгодно (принесет максимальную прибыль) закупать ежедневно 322 штук. И это при том, что рассчитываем мы продать 300. Эти 22 — не что иное, как страховой запас, который мы создаем на случай увеличения спроса. И размер его мы определили, соотнеся риски потерь при колебаниях спроса в ту или иную сторону.

Из этой математики видно, что при высоких штрафах за непроданные остатки страховой запас может оказаться отрицательным, т.е. мы сознательно должны планировать дефицит как наиболее выигрышную стратегию. Это происходит при условии F(S)<0.5. В частности, если не учитывать стоимость денег, это произойдет при h>d. Если предположить, что у нас нет под боком свинофермы в нашем примере,

h=20-0=20
F(S)=0.29
S=272


Ну и напоследок. Мы рассматривали очень короткий период, когда стоимостью денег можно пренебречь. Но как только мы начинаем заниматься fashion industry, где длина функционального цикла составляет 6-12 месяцев, без этого уже не обойтись.

to be continued...

 

Продолжаем считать оптимальный страховой запас

Итак, продолжим рассмотрение задачи нахождения оптимального запаса.

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

 

Будем считать, что периодичность поставок у нас определена. Каким способом, нас в данной задаче не интересует. Это может быть по объективным условиям, как в задаче газетчика, когда газеты выходят ежедневно вне зависимости от желаемой для нас экономики. Это может быть определено условиями контракта с поставщиком по другим причинам. В конце концов, мы могли оценить желаемый период исходя из наиболее дешевого для нас варианта методом, аналогичным расчету Вилсона. Одним словом, общее время реакции системы поставок для нас задано.

Пусть по-прежнему
S — искомый размер запаса после поставки
S0 — матожидание спроса за период
z — два варианта траектории запасов
f(z) — плотность вероятности рапределения спроса за период

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

потери, связанные с остатками непроданного товара в количестве

потери из-за упущенной прибыли, связанные с нехваткой запаса в количестве

потери, связанные с кредитованием бизнеса и общими операционными затратами, которые определяются максимальным запасом S

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

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

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

Будем рассматривать издержки, связанные с

а) хранением запаса:
стоимость хранения одной единицы в день * длину периода в днях * средний запас за период
б) обслуживанием кредита
кредитная ставка в день * длину периода в днях* средний запас за период
в) штрафом за непроданный товар

матожидание непроданного товара мы уже считали:

тогда матожидание проданного будет соответственно

Нам остается только посчитать матожидание среднего за период запаса. Для этого посмотрим еще раз на картинку:

Если за T обозначить длину периода,
при z<S площадь под траекторией запаса вычисляется как
T*(S+(S-z))/2, а средний запас соответственно как S-z/2.
при z>S площадь под траекторией запаса вычисляется как
S*(S*T/z)/2, а средний запас соответственно как S2/2z.

Итого матожидание среднего запаса

Пусть h — потери от одной единицы, оставшейся в конце периода,
d — прибыль при продаже одной единицы,
r — стоимость кредитования на покупку одной единицы за весь период,
e - стоимость обслуживания единицы запаса за весь период

тогда чистая прибыль за период составит

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


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

Ну а те немногие, кто смог продраться сквозь все эти муторные интегралы, получают бонус - они могут самостоятельно поиграться с моделями здесь

 

Прогнозирование спроса и продаж. Записки дилетанта

Прогнозирование спроса...

читать графики справа налево все мастера


Краеугольный камень в управлении запасами и огромная головная боль управляющего. Как это делать на практике?

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

Впрочем, как и везде на этом сайте всячески приветствуется участие - добавляйте, исправляйте, критикуйте...

Общие рассуждения о прогнозировании

Общие рассуждения о прогнозировании.

 

Того, кто не задумывается о далеких трудностях, непременно поджидают близкие неприятности

Конфуций

 

 

 

 

 

 

 

 

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

 

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


Однако человечество все-таки хочет большего. Поэтому появляется понятие случайности как меры нашего незнания. Отсюда следует один важный практический вывод: чем больше мы сможем идентифицировать факторов, влияющих на поведение случайной величины, тем меньше будет мера этого незнания, этой самой случайности. Фактически именно за этот процесс определения границ познанного и платят деньги прогнозисту. В простом случае — за фразу «вероятность выпадения 6 составляет ровно 1/6». Но на практике скорее за фразу «поскольку данная кость имеет смещение центра тяжести на XX мм под углом YY, распределение вероятностей будет следующим...». Именно в таком выводе содержится вполне практическая ценность, именно здесь казино зарабатывают свои деньги, хоть и не пользуются «кривыми» костями.

 

Практическая постановка задачи

 

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

 

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

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

зависимый спрос — остальные поправки, связанные с внешними воздействиями.

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

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

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

 

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

 

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

 

Прогнозирование. Постановка задачи

Любой прогноз всегда ошибочен. Весь вопрос в том, насколько он ошибочен.

 

Итак, у нас в распоряжении есть данные о продажах. Пусть это выглядит так:

 

Дата

23.01

24.01

25.01

26.01

27.01

28.01

29.01

кол-во

145

127

113

156

173

134

144

 

На языке математики это называется временным рядом:

 

 

145

127

113

156

173

134

144

 

Временной ряд обладает двумя критическими свойствами

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

  • подразумевается, что значения в ряду — это результат измерения через одинаковые фиксированные промежутки времени; прогнозирование поведения ряда означает получение «продолжения» ряда через те же самые промежутки на заданный горизонт прогнозирования

 

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

 

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

Впрочем, это не является такой уж сложной проблемой — давайте просто приведем эти данные к среднедневным.

 

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


, где

 

Y(t) — значение нашего ряда (например, объем продаж) в момент времени t

f(t) — некая функция, описывающая внутреннюю логику процесса. Ее в дальнейшем будем называть прогнозной моделью

e(t) — шум, ошибка, связанная со случайностью процесса. Или, что то же самое, связанная с нашим незнанием, неумением учесть другие факторы в модели f(t).

 

Теперь наша задача состоит в том, чтобы отыскать такую модель, чтобы величина ошибки была заметно меньше наблюдаемой величины. Если мы отыщем такую модель, мы можем считать, что процесс в будущем пойдет примерно в соответствии с этой моделью. Более того, чем точнее модель будет описывать процесс в прошлом, тем больше у нас уверенности, что она сработает и в будущем.

 

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


была в каком-то смысле минимально возможной. Эту величину как правило называют «остатками» (residuals), поскольку это то, что осталось после вычитания модели из фактических данных, то, что не удалось описать моделью. Для оценки того, насколько хорошо модель описывает процесс, необходимо посчитать некую интегральную характеристику величины ошибки. Наиболее часто для вычисления этой интегральной величины ошибки используют среднее абсолютное или среднеквадратическое величины остатков по всем t. Если величина ошибки достаточно велика, пытаются «улучшить» модель, т.е. выбрать более сложный вид модели, учесть большее количество факторов. Нам, как практикам, следует в этом процессе строго соблюдать как минимум два правила:

  • использование определенной модели должно быть однозначно объяснимо с точки зрения здравого смысла. Мы можем попробовать ввести в модель продаж холодильников в Бобруйске в качестве фактора погоду в Гондурасе. И, не исключено, получим модель с меньшей ошибкой. Но до тех пор, пока мы не можем сформулировать, какова может быть причинно-следственная связь между этими величинами, такой фактор вводить нельзя.

  • Работа по улучшению качества прогноза (улучшению модели) стоит вполне ощутимых денег. Поэтому всегда необходимо отдавать себе отчет в том, что начиная с какого-то момента эти усилия попросту перестают окупаться. Как и в некоторых других случаях, лучше вовремя остановиться. Есть и другие противопоказания к применению сложных моделей. Дело в том, что как правило модель для каждого ряда создается и настраивается единожды, затем лишь иногда проверяется и корректируется, тогда как прогнозы по этой модели создаются на регулярной основе. Какой смысл, если при каждом цикле составления прогноза продаж нам придется заново исследовать поведение каждого продукта и заново создавать для него модели? Нормальный системный подход состоит в том, чтобы автоматически контролировать величину ошибки прогнозирования и по определенным правилам корректировать лишь некоторые модели. Например, только те, у которых величина относительной ошибки выше определенного порога И одновременно объем продаж выше определенного уровня.  Или просто визуально оценивать диаграмму, подобную этой, где по вертикали отложена величина ошибки, а по горизонтали - цена продукта.



    Поскольку мы живем в изменяющемся мире, понятно, что единожды разработанные модели со временем перестают нормально работать. И тут фокус состоит в том, что более простые модели могут оказаться более устойчивыми к изменениям даже несмотря на бОльшую изначальную ошибочность. И еще одна суровая реальность. Я приведу отрывок из книги «Business Forecasting, Hanke, Reitsch, Wichern», тут мне просто нечего добавить:
     

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

     

 

Наивные методы прогнозирования

Наивные методы

 

Простое среднее

 

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

 

 

Скользящее среднее

 

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

 


Взвешенное скользящее среднее

 

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

 

 

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


Результаты прогнозирования на 5 периодов вперед по этим трем алгоритмам приведены в таблице

Простое экспоненциальное сглаживание

Простое экспоненциальное сглаживание

В англоязычной литературе часто встречается аббревиатура SES — Simple Exponential Smoothing

 

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

Пусть мы делаем прогноз на момент времени t+1 (на следующий период). Обозначим его как

 

Здесь мы берем в качестве основы прогноза прогноз последнего периода, и добавляем поправку, связанную с ошибкой этого прогноза. Вес этой поправки будет определять, насколько «резко» наша модель будет реагировать на изменения. Очевидно, что

 

Считается, что для медленно меняющегося ряда лучше брать значение 0.1, а для быстро меняющегося — подбирать в районе 0.3-0.5.

 

Если переписать эту формулу в другом виде, получается

 

Мы получили так называемое рекуррентное соотношение — когда последующий член выражается через предыдущий. Теперь мы прогноз прошлого периода выражаем тем же способом через позапрошлое значение ряда и так далее. В итоге удается получить формулу прогноза

 

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

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


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

Составляющие прогнозной модели

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

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

 

Тренд

На рис. показан тот же ряд в предположении приблизительно линейного роста

 


 

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

 

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

 

Сезонность

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

 

Так возникает в прогнозировании понятие «сезонности» - любое повторяющееся через строго определенные промежутки времени изменение величины. Например, всплеск продаж елочных игрушек в последние 2 недели года можно рассматривать как сезонность. Как правило, подъем продаж супермаркета в пятницу и субботу в сравнении с остальными днями можно рассматривать как сезонность с недельной периодичностью. Хоть и называется эта составляющая модели «сезонность», необязательно она связана именно с сезоном в бытовом понимании (весна, лето). Любая периодичность может называться сезонностью. С точки зрения ряда сезонность характеризуется прежде всего периодом или лагом сезонности — числом, через которое происходит повторение. Например, если у нас ряд месячных продаж, мы можем предполагать, что период составляет 12.

 

Различают модели с аддитивной и мультипликативной сезонностью. В первом случае сезонная поправка добавляется к исходной модели (в феврале продаем на 350 ед. меньше, чем в среднем)

 

во втором — происходит умножение на коэффициент сезонности (в феврале продаем на 15% меньше, чем в среднем)

 

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

 

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

Ситуация, когда в модели присутствует M статистически независимых (!) параметров, в прогнозировании называется моделью с M степенями свободы. Так что если вам встретится специальный софт, в котором как правило необходимо в качестве входных параметров задать число степеней свободы, это отсюда. Например, модель с линейным трендом и периодом 12 месяцев, будет иметь 13 степеней свободы — 11 от сезонности и 2 от тренда.

 

Как жить с этими составляющими ряда, рассмотрим в следующих частях.

Классическая сезонная декомпозиция

Декомпозиция ряда продаж.

 

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

 

Процедура выделения неслучайных компонент модели из фактических данных называется декомпозицией.

 

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

 

Сглаживание ряда

 

Сглаживанием называется процесс, при котором исходный ряд заменяется другим, более плавным, но основанным на исходном. Целью такого процесса является оценка общих тенденций, тренда в широком смысле. Методов (как и целей) сглаживания существует много, наиболее распространенные

  • укрупнение временных интервалов. Очевидно, что ряд продаж, агрегированный помесячно, ведет себя более гладко, чем ряд, основанный на дневных продажах

  • скользящее среднее. Мы уже рассматривали этот метод, когда говорили о наивных методах прогнозирования

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

 

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

 

В качестве иллюстрации наш исходный ряд, сглаженный по 5 и 12 точкам:

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

 

К чему это я все веду?

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

 

Два момента, которые важно отметить.

 

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

 

На картинке результат повторного сглаживания:

 

Теперь делим факт на гладкий ряд:



 

К сожалению, у меня были данные лишь за 36 месяцев, а при сглаживании по 12 точкам один год, соответственно, теряется. Поэтому на данном этапе я получил коэффициенты сезонности лишь по 2 на каждый месяц. Но делать нечего, это лучше, чем ничего. Будем усреднять эти пары коэффициентов:

 

Теперь вспоминаем, что сумма мультипликативных коэффициентов сезонности должна быть =12, поскольку смысл коэффициента — отношение продаж месяца к среднемесячному. Именно это делает последняя колонка:

 

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

 

Теперь построим на графике данные с устраненной сезонностью, проведем линейный тренд и составим для интереса прогноз на 12 периодов вперед как произведение значения тренда в точке на соответствующий коэффициент сезонности


 

Выводы.

 

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

 

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

 

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

Экспоненциальное сглаживание с учетом тренда и сезонности. Метод Холта-Винтерса

Возвращаясь к экспоненциальному сглаживанию...

 

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

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

 

Метод получил название Холта-Винтерса по именам разработчиков: Холт предложил метод учета тренда, Винтерс добавил сезонность.

 

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

,

где Lt — усредненный по известному правилу «общий уровень», то при наличии тренда появляется поправка


,

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


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

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

  2. Берем первые несколько точек (штук 5), проводим линию регрессии (ax+b). Начальный уровень задаем как b, начальный тренд как a.

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


На этом рисунке показаны результаты сглаживания при двух выборах начальных значений. Здесь хорошо видно, что большая ошибка второго варианта связана с тем, что начальное значение тренда (взятое по 5 точкам) получилось явно завышенным, поскольку мы не учитывали рост, связанный с сезонностью.

 

Поэтому (вслед за господином Винтерсом) усложним модель и будем делать прогноз с учетом сезонности:


В данном случае мы, как и раньше, предполагаем мультипликативную сезонность. Тогда наша система уравнений сглаживания получает еще одну составляющую:




где s — лаг сезонности.

 

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

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

  1. Берем первые 12 точек ряда, чтобы нивелировать сезонность.

  2. Проводим линию регрессии

  3. Задаем начальное значение уровня 1021,41

  4. Задаем начальное значение тренда 26,24

  5. Задаем начальные значения 12ти сезонных коэффициентов как факт, деленный на значение регрессии в точке

 

Теперь начальные значения определены.

 

  1. Идем по процедуре, получая сглаженный уровень

  2. Для интереса нарисуем модель с учетом сезонности

  3. Создаем прогноз уровня на 12 точек вперед

  4. И прогноз с учетом сезонности

 

Результаты всего этого безобразия:


Заключение



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

Прогнозирование редких продаж. Метод Кростона

Прогнозирование редких продаж.

Суть проблемы.

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

А что делать, если продажи выглядят следующим образом?

Каждый столбик здесь - продажи за период, между ними продаж нет, хотя товар присутствует.
О каких "трендах" здесь можно говорить, когда около половины периодов имеют нулевые продажи? И это еще не самый клинический случай!

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

Формулировка задачи.

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

Метод Кростона.

Анализируя физическую природу процесса, Кростон (Croston, J.D.) предположил, что

  • все продажи статистически независимы
  • случилась продажа или нет, подчиняется распределению Бернулли
    (с вероятностью p событие происходит, с вероятностью 1-p нет)
  • в случае, если событие продажи произошло, размер покупки распределен нормально

Это означает, что результирующее распределение имеет такой вид:

Как видим, от "колокола" Гаусса эта картинка сильно отличается. Более того, вершина изображенного холма соответствует покупке 25 единиц, тогда как если мы "в лоб" посчитаем среднее по ряду продаж, получим 18 единиц, а расчет СКО дает 16. Соответствующая "нормальная" кривая нарисована здесь зеленым.

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

Теперь поделим исходный ряд на два ряда по следующим принципам.

исходный период размер
0    
0    
0    
0    
0    
0    
0    
0    
0    
0    
4 11 4
0    
0    
4 3 4
5 1 5
... ... ...

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

  • ожидаемый период между покупками 5.5 дней
  • ожидаемый размер покупки 3.7 единиц

следовательно недельный прогноз продаж составит 3.7/5.5*7=4.7 единиц.

Вообще-то это все, что нам дает метод Кростона - точечную оценку прогноза. К сожалению, этого недостаточно для расчета потребного страхового запаса.

Метод Кростона. Уточнение алгоритма.

Недостаток метода Кростона.

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

Другое дело - прогнозирование редких событий, когда матожидание размера покупки имеет малое значение, а СКО при этом вполне может оказаться как минимум такого же порядка:

Чтобы уйти от такой очевидной погрешности, было предложено пользоваться логнормальным распределением, как более "логично" описывающим картину мира:

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

Метод Кростона и страховой запас. Функция распределения спроса.

 

Сел я тут и задумался... Ну хорошо, получил я характеристики потока спроса:
ожидаемый период между покупками 5.5 дней
ожидаемый размер покупки 3.7 единиц
ожидаемая интенсивность спроса 3.7/5.5 единиц в день...
пусть я даже получил СКО дневного спроса для ненулевых продаж - 2.7. А что там насчет страхового запаса?

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

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

В случае редких продаж функция распределения может быть записана следующим образом:

где

q - вероятность нулевого исхода
p=1-q - вероятность ненулевого исхода
f(x) - плотность распределения размера покупки

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

предположим, что f(x) - нормальная.
предположим, что в области x<=0 вероятности, описываемые функцией очень низкие, т.е.

тогда интеграл в нашей формуле ищется по таблице Лапласа.

в нашем примере p = 1/5.5, так что

 

 

q=

.8182

p=

.1818

 

 

k

f(k)

z=k*2.7+3.7

p*f(k)

F(z)

1-p*L(z)

0

.5000

3.7000

.0909

.9091

.9275

0.5

.6915

5.0500

.1257

.9439

.9640

1

.8413

6.4000

.1530

.9712

.9849

1.5

.9332

7.7500

.1697

.9879

.9947

2

.9772

9.1000

.1777

.9959

.9985

2.5

.9938

10.4500

.1807

.9989

.9996

3

.9987

11.8000

.1816

.9998

.9999

алгоритм поиска становится очевидным - задав SL, наращиваем k, пока F не превысит заданный уровень.

 

Кстати, в последней колонке что? Правильно, уровень обслуживания второго рода, соответствующий заданному запасу. И тут, как я уже говорил, сидит некоторый методологический казус. Давайте представим себе, что продажи происходят приблизительно с частотой один раз в ... ну пусть будет 50 дней. И еще представим себе, что мы держим нулевой запас. Какой уровень обслуживания будет? Вроде как нулевой - нет запаса, нет и обслуживания. Ту же цифру нам даст и система контроля запаса, поскольку наблюдается постоянный out of stock. Но ведь с точки зрения банальной эрудиции в 49 случаях из 50 продажа точно соответствует спросу. То есть не приводит к потерям прибыли и лояльности клиентов, а ни для чего другого уровень сервиса и не предназначен. Этот несколько вырожденный случай (чую, спор начнется) является просто иллюстрацией того, почему даже очень малый запас при редком спросе дает высокие уровни сервиса.

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

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

Итак, функция распределения спроса за один день и все ее параметры нам известны:

По-прежнему результат одного дня статистически независим от любого другого.
Пусть случайное событие состоит в том, что за n дней случилось ровно m фактов ненулевых продаж. Согласно закону Бернулли (да ладно, я ж сижу и с учебника списываю!) вероятность такого события

 

где - число сочетаний из n по m, а p и q - опять те же вероятности.
Тогда вероятность того, что сумма проданного за n дней в результате ровно m фактов продаж не превысит величины z, составит

где - распределение суммы проданного, то есть свертка m одинаковых распределений.
Ну и поскольку искомый результат (суммарные продажи не превышают z) может быть получен при любых m, осталось просуммировать соответствующие вероятности:

(первое слагаемое соответствует вероятности нулевого исхода всех n испытаний).

 

Что-то дальше мне лень со всем этим возиться, желающие могут самостоятельно построить таблицу, аналогичную вышеприведенной в применении к нормальной плотности вероятности. Для этого надо только вспомнить, что свертка m нормальных рапределений с параметрами (a,s2) дает нормальное же распределение с параметрами (ma,ms2).
 

Прогнозирование редких продаж. Метод Виллемейна.

Что плохого в методе Кростона?

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

Ну да бог с ним. Для нас самое важное - реальные продажи даже близко не выглядят нормальными. Именно эта мысль сподвигла Виллемейна (Thomas R. Willemain) и компанию к созданию более универсального способа. А потребность в таком методе была продиктована чем? Правильно, необходимостью прогнозировать потребность в запасных частях, в особенности в автомобильных запчастях.

Метод Виллемейна.

Суть подхода состоит в применении процедуры бутстраппинга (bootstrapping). Словечко это родилось из старой поговорки "pull oneself over a fence by one's bootstraps", что почти буквально соответствует нашему "вытащить себя за собственные волосы". Компьютерный термин boot, кстати, тоже отсюда. И смысл этого слова в том, что некая сущность содержит в себе необходимые ресурсы, чтобы саму себя перевести в другое состояние, и при необходимости такую процедуру возможно запустить. Именно такой процесс происходит с компьютером, когда мы нажимаем на определенную кнопку.

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

По условиям нашей задачи время реакции системы 7 дней. Мы НЕ знаем и НЕ ПЫТАЕМСЯ предположить вид и параметры кривой распределения.
Вместо этого мы из всего ряда 7 раз случайно "выдергиваем" дни, суммируем продажи этих дней и записываем результат.
Повторяем эти действия, каждый раз записывая сумму продаж за 7 дней.
Желательно произвести опыт достаточно много раз, чтобы получить наиболее адекватную картинку. 10 - 100 тысяч раз будет очень неплохо. Здесь очень важно, чтобы дни выбирались случайно РАВНОМЕРНО во всем анализируемом диапазоне.
В итоге мы должны получить "как бы" все возможные исходы продаж ровно семи дней, причем с учетом частоты появления одинаковых результатов.

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

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

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

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


 

Напоследок (в очередной уже раз) хочется спросить: "а почему мы уровень обслуживания основываем на ABC-анализе?" Казалось бы, в нашем случае оптимальный уровень сервиса первого рода составляет 91% вне зависимости от того, в какой из групп товар находится. Тайна сия велика есть...

Модификация метода Виллемейна для оптовых и похожих рынков

 

Некоторые замечания об оптовых и похожих рынках.

 

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

 

0

1

3

0

0

2

0

0

1

1

 

такой

 

0

1

3

0

0

2

0

0

1

2

 

и даже такой

 

0

1

3

0

0

2

0

0

1

6

 

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

 

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

 

0

1

3

0

0

2

0

0

1

4

 

0

1

3

0

0

2

0

0

1

2

 

0

1

3

0

0

2

0

0

1

1

 

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

Но тут есть и недостаток. Дело в том, что мы получаем гораздо меньше наблюдений. Для окна в 7 дней за год можно получить 365-7 наблюдений, тогда как при случайной выборке 7 из 365 - это число сочетаний 365! / 7! / (365-7)! Считать лень, но это намного больше.

А малое число наблюдений означает ненадежность оценок, так что копите данные - они лишними не бывают!

Расчет страхового запаса по эмпирическому распределению ошибки прогноза спроса

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

Пусть в результате обработки файла ошибок прогноза была получена таблица частот, приведенная в таблице 1.8. Количество наблюдений равно 103.

Таблица 1.8 – Эмпирическое распределение ошибки прогноза оптового спроса на растворимый кофе в килограммах

Интер-
валы значе-
ний ошибки прогноза
спроса
-17 –
-12
-12 –
-7
-7 –
-2
-2 –
3
3 –
8
8 –
13
13 –
18
18 –
23
23 –
28
28 –
33
Часто-
ты
11
19
22
23
11
8
5
2
1
1
Отно-
ситель-
ные частоты
0,107
0,184
0,214
0,223
0,107
0,078
0,049
0,019
0,01
0,01

Соответствующая этим данным гистограмма распределения ошибки приведена на рисунке 1.13. По оси абсцисс отложены интервалы значений ошибки прогноза. По оси ординат – число попаданий в каждый интервал.

Среднее квадратическое отклонение ошибки прогноза, рассчитанное по этим данным, составило 9,5. Среднее значение ошибки оказалось равным –0,97, но для упрощения рассуждений мы будем считать его равным нулю.

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

где R – точка заказа,

– прогноз спроса за время пополнения;
SS – страховой запас.

От величины страхового запаса зависит средний (ожидаемый) дефицит в каждом цикле пополнения; чем больше страховой запас, тем меньше дефицит. Величина дефицита является случайной, зависящей от спроса за время пополнения: 

 где SL – величина дефицита;

d – спрос за время пополнения, случайная величина.

Подставим сюда выражение для точки заказа R и получим:

где разность между фактическим спросом d и его прогнозом  – это и есть ошибка прогноза Δd, эмпирическое распределение которой приведено в таблице 1.8. Перепишем это выражения, используя для ошибки прогноза ее обозначение:

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

 

где  – математическое ожидание дефицита (средний дефицит) при значении точки заказа, равном R;
Δd – ошибка прогноза спроса за время пополнения;
 – величина дефицита при значении ошибки прогноза, равном Δd;
 – вероятность (относительная частота) появления значения Δd.
Наша непрерывная случайная величина – ошибка прогноза – стала дискретной по той причине, что при построении эмпирического распределения мы группируем значения непрерывной случайной величины по интервалам (см. таблицу 1.8) и всем наблюдениям, попавшим в определенный интервал, присваивается значение, равное середине этого интервала.

Подставим в (1.14) выражение для дефицита (1.13) и получим:

 

 

В качестве значений ошибки прогноза Δd следует брать середины интервалов на оси абсцисс гистограммы распределения ошибки прогноза. В таблице 1.8 этими серединами будут –14,5; –9,5; –4,5; 0,5; 5,5; 9,5; 10,5; 15,5; 20,5; 25,5; 30,5. Вычисление дефицита  будем проводить для значений SS, равных левой (нижней) границе каждого интервала гистограммы, то есть для SS = –17, –12, –8 и т. д. Результаты вычислений приведены в таблице 1.9. Обозначения в таблице:
, эмпир. – средний дефицит, вычисленный с использованием эмпирического распределения ;
, норм. – средний дефицит, вычисленный с использованием нормального распределения ошибки прогноза, он равен σE(Z);
 – страховой запас, отнесенный к среднеквадратическому отклонению ошибки прогноза (используется для расчета ожидаемого дефицита при нормальном распределении ошибки прогноза);
Pд, эмпир. – вероятность дефицита, вычисленная с использованием эмпирического распределения ;
Рд, норм. – вероятность дефицита, вычисленная с использованием нормального распределения ;
SL %, эмпир. – уровень обслуживания, вычисленный с использованием эмпирического распределения ;
SL, %, норм. – уровень обслуживания, вычисленный с использованием нормального распределения.
Таблица 1.9 – сравнение вероятностей дефицита и уровней обслуживания, вычисленных с использованием нормального и эмпирического распределений
SS
-17
-12
-7
-2
3
8
13
18
23
28
15,95
11,21
7,21
4,20
2,28
1,19
0,56
0,24
0,10
0,02
Z
-1,79
-1,26
-0,74
-0,21
0,32
0,84
1,37
1,89
2,42
2,95
σE(Z)
17,23
12,36
8,37
4,81
2,54
1,05
0,39
0,10
0,03
0,00
Pд, эмпир.
1,00
0,894
0,710
0,496
0,273
0,166
0,088
0,039
0,020
0,010
Рд, норм.
0,963
0,896
0,770
0,583
0,377
0,200
0,085
0,029
0,007
0,002
SL %, эмпир.
81,2
86,8
91,5
95,0
97,3
98,6
99,3
99,7
99,90
99,98
SL, %, норм.
79,7
85,4
90,1
94,3
97,0
98,8
99,5
99,90
99,96
99,99
Объем заказа Q = 85, среднеквадратическое отклонение ошибки прогноза равно 9,5.
Распределение ошибки прогноза весьма заметно отличается от нормального. Тем не менее сравнение вычисленных вероятностей дефицита для эмпирического распределения и для нормального распределения показывает, что с практической точки зрения эти вероятности мало отличаются. В самом деле, между вероятностями отсутствия дефицита (это 1 – Pд) нет заметной разницы при всех значениях страхового запаса SS, начиная с 13 и выше. Так, для SS = 13 эти вероятности равны 0,912 и 0,915. Это значит, что дефицита не будет наблюдаться в среднем в 912 циклах пополнения из 1000 или в 915. Столь же незначительно отличаются и уровни обслуживания, вычисленные с использованием эмпирического и нормального распределений. Конечно, при меньших размерах заказа различие в уровнях обслуживания может оказаться существенным. Но в нашем примере размер заказа Q равен 85, среднеквадратическая ошибка прогноза равна 9,5, а их отношение равно 8,94. Очевидно, что при больших значениях этого отношения совпадение будет еще лучше.
 

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

 

Уровень обслуживания. Какие они бывают?

Уровень обслуживания. Уровень сервиса. Service Level.

 

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

 

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

 

Для краткости в дальнейшем я буду использовать сокращения:

SLService Level, уровень обслуживания

SSSafety Stock, страховой запас

LT — Lead Time, общее время на исполнение заказа

T — периодичность пополнения

Q — ожидаемая величина спроса за время T

f(z) — плотность вероятности стандартного нормального распределения

F(z) — функция стандартного нормального распределения

 

Постановка задачи.

 

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

 

Уровень сервиса.

Type 1. (я поимел наглость именно этот вариант обозвать уровнем обслуживания 1го рода)

α-level.

Cycle Service Level.

 

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

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

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


где z определяется из уравнения


Уравнение решается, используя таблицы значений функции Лапласа. К примеру, для уровня в 95% ищем значение 2*0.95-1=0.9. Находим в таблице ближайшее значение. В нашем случае одинаково близко находятся два варианта:

0.8990 ⇒ z=1.64

0.9011 ⇒ z=1.65

Впринципе, можно взять посередине z=1.645.

В случае, если спрос распределен по логнормальному закону, последовательность действий следующая:

Аналогично предыдущему случаю находим z, используя таблицы.

Затем пересчитываем его в новое значение, используя формулу



где

Уровень сервиса.

Type 2. (я поимел наглость именно этот вариант обозвать уровнем обслуживания 2го рода)

β-level.

Unit Fill.

В отличие от первого варианта, данный способ измерения оценивает не просто вероятность возникновения события OOS (Out Of Stock), но оценивает ожидаемое количество упущенного спроса. Оценка «размера» зоны риска делается как соотношение матожидания спроса, не удовлетворяемого из наличного запаса к матожиданию всего спроса клиентов. Соответственно уровень обслуживания определяется как доля спроса, удовлетворенного из наличных запасов:

 

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

В общем виде мне лично известно лишь решение для нормального распределения спроса. Доля потерь в этом случае определяется


Функция L известна как «функция потерь», часто встречается «partial expectation of back orders», «partial expectation function», «partial loss function». Аналитического выражения для этой функции не существует, как правило пользуются таблицей ее значений.

 

Самостоятельно получить таблицу значений можно по формуле

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

где z определяется из уравнения

Существует также приближенный метод нахождения z. Он основан на аппроксимации функции потерь следующего вида:

коэффициенты выбираются в зависимости от значения L:

L(z) α β γ δ
≤0.0561025 1.94519891 -0.06100591 -2.70426890 0.50840810
0.1428794 ≥ L > 0.0561025 1.83513389 -0.06567952 -2.6970236 0.54505649
> 0.1428794 1.82268153 -0.06609373 -2.65829265 0.56235517

Я лично никогда этим методом не пользовался и его корректность не проверял.

Интересный факт: всегда выполняется

 

Уровень сервиса.

Order Fill.

Другая разновидность уровня обслуживания 2-го рода состоит в том, что принимается во внимание тот факт, что требование на поставку приходит не на один товар независимо, а в рамках целого списка — клиентского заказа. Для некоторых видов бизнеса критичным считается удовлетворение всего такого заказа полностью. Считается, что если хотя бы одна строка заказа не может быть удовлетворена из наличного запаса, следует весь заказ считать неудовлетворенным. Очевидно, это гораздо более жесткий критерий, известный под названием «order fill».

Принимая во внимание среднее значение строк в заказах, где встречается данный товар, для нормального распределения спроса можно привести данный тип уровня обслуживания к типу unit fill:

и далее по уже показанной методике через функцию потерь.

Если спрос распределен по Пуассону, мне встречалась следующая методика:

фактор страхового запаса z определяется из таблицы

SL z
≤ 0.5 0
0.75 0.7
0.80 0.8
0.85 1.0
0.90 1.3
0.95 1.7
0.98 2.1
0.99 2.3
0.999 3.1

Промежуточные значения определяются при помощи линейной интерполяции. Размер страхового запаса далее вычисляется по формуле

где

Уровень сервиса.

γ-уровень

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

 

При данном подходе считается, что имеет значение не только величина отложенного спроса, но и длительность задержки с поставкой. То есть размер зоны риска определяется как произведение величины потерь на длину промежутка, а относительная величина потерь (1-SL) фактически является отношением площадей двух треугольников:

Матожидание площади синего треугольника = QT

Матожидание площади красного треугольника =

Пользуясь подобием треугольников


получаем

Желающие могут взять этот интеграл и написать сюда результат. Я лично не имею ни малейшего желания, поскольку не вижу практического применения этому результату. Даже западные источники крайне редко упоминают об этом варианте, а те, которые упоминают, скромно указывают на его «крайне редкую» применяемость.

Формула общей дисперсии при случайном спросе с учетом неопределенности функционального цикла

статья с описанием откуда взялась формула для общей дисперсии (используется при расчёте страхового запаса).

Прикрепленный файлРазмер
Вывод формулы дисперсии суммы.pdf70.11 кб

Еще раз о суммарной дисперсии

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

Будем рассматривать нашу любимую картинку:

На самом деле, в этой классической пиле мы нарисовали лишь то, как может "уплыть" спрос за время реакции системы поставок (в данном случае, LT+T). Проблема же состоит в том, что у нас имеется еще один источник неопределенности - само время исполнения заказа LT (а значит и общее время реакции) является неопределенным и определяется дисциплиной поставщика. Тогда наша картинка должна выглядеть немного сложнее:

Заштрихованный параллелограмм показывает область, где может оказаться запас в конце цикла с определенной вероятностью. Наша задача - математически описать эту ситуацию. Подход в данном случае очень простой. Для определеннсти будем оперировать дневным расходом товара, тогда суммарный расход за время реакции есть сумма дневных:
Qsum = Q1 + Q2 + ... + QL, но само количество дней L - величина случайная.
То есть мы имеем случайную сумму случайных величин Qi.

  1. Если все Qi независимы и имеют одинаковое распределение с параметрами mq и sq
  2. Если L не зависит от Q и имеет распределение с параметрами mL и sL

то теория вероятностей нам сообщает, что распределение Q будет иметь параметры

Строгий математический вывод формулы нам здесь предоставил inkerman, там добавить нечего.

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

  1. Несмотря на то, что параметры распределения определяются математически строго, вид итогового распределения остается неизвестным. Переходя в практическую плоскость, это означает, что на основании этих цифр вообще говоря рассчитать страховой запас нельзя, почти все общеизвестные методы предусматривают нормальное распределение. К счастью, в большинстве случаев суммарное распределение спроса за время реакции достаточно часто оказывается нормальным. В частности, если Q распределены нормально, то и любая сумма будет нормальной. Более того, если даже в распределении Q не наблюдается нормальности, но L достаточно велико, можно считать суммарное распределение приблизительно нормальным.
  2. Прямо из описания задачи следует, что существует жесткая связь между точностью определения L и Q. Поясню. Из нашего рассуждения следует, что L - это не промежуток времени, это всегда натуральное число. В том случае, если оно имеет смысл количества дней, значит как отклонения в сроке поставки мы должны измерять в днях, так и дисперсию спроса мы должны знать для дневных отгрузок. Если вам известна дисперсия только понедельного спроса (которая, естественно, сильно меньше), значит сроки поставок и их дисперсии вы тоже обязаны выражать в неделях и никак иначе. В этом случае учесть отклонение в два-три дня нельзя, лишь в целом числе недель.

Ограничения формулы общей дисперсии

Итак, мне хочется продолжить разговор о вычислении степени вариации спроса. Ну свербит у меня, что тут поделаешь... А если серьезно, то ведь вопрос до неприличия важный. Давайте прикинем "на пальцах". Есть известная экспертная рекомендация: "если не можете честно расчитать страховой запас, держите его приблизительно равным половине расхода за время реакции". Что это означает? Мы планируем, что если все пойдет, как мы предполагаем, ПОЛОВИНА денег, вложенных в запас, будет лежать мертвым грузом и не приносить прибыли. И все равно по факту получим и дефицит, и сверхнормативные запасы, такова наша планида.

Если смотреть на проблему с такой точки зрения, становится понятным, отчего не жалко тратить усилия на более точное решение задачи - слишком высока "цена вопроса".

В прошлой статье мы остановились на том, что вывели матожидание и дисперсию спроса
Qsum = Q1 + Q2 + ... + QL при выполнении двух условий:

  1. Если все Qi независимы и имеют одинаковое распределение с параметрами m и s
  2. Если L не зависит от Q и имеет распределение с параметрами mL и sL

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

И что со всем этим делать, если "ровный" спрос бывает только в сказке?
Видимо, придется обложиться математическими справочниками и попытаться решить задачу в более общем виде.

Как написано в учебнике, для всякого L распределение Qsum будет вычисляться как свертка распределений всех QL.

а общее распределение спроса соответственно

Допущение 1. Будем считать, что все Qi распределены нормально со своими параметрами

тогда из свойства нормальности распределение суммы спроса за L периодов будет также нормальным с параметрами

Для начала попробуем посчитать матожидание суммарного спроса. По определению это

подставим сюда g(Q) и получим

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

С дисперсией все несколько сложнее. По определению


Для вычисления интеграла распишем аналогично дисперсию распределения fL

тогда

Не мешало бы проверить результат в случае стационарного спроса. Пусть все Qi имеют одинаковые параметры распределения (m,s2). Тогда

 

Получили знакомую уже формулу, так что будем надеяться, нигде не проврались. Еще никого не тошнит от всего этого безобразия? Мне лично от таких многоэтажек становится грустно. А главное, непонятно, какую практическую пользу можно из этого извлечь...

И, кстати, во всех формулах ошибка. В индексах суммирования везде вместо i=0 следует читать i=1. Ну, вы же понимаете...

не мысленный эксперимент

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

Прикрепленный файлРазмер
summ_disp.xls21.5 кб

Функция потерь. Как величина страхового запаса влияет на уровень обслуживания

автор: Юрий aka INKERMAN

 

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

Прикрепленный файлРазмер
reserve_stocks.doc77.5 кб

Моделирование запаса при фиксированном уровне обслуживания

Как мы будем моделировать величину страхового и полного запаса:

 

 

Перепишем формулу общей дисперсии


V — среднедневная реализация

 

учитывая, что


,

TL - время, требуемое для обнаружения потребности, составления заявки, отправки, согласования, доставки и приходования. Для краткости будем называть это временем процессинга.

T0 — периодичность заказа,





(коэффициент вариации дневных продаж)

в виде


отсюда видно, что при условии T0>>TL интегральная вариация падает пропорционально корню из T0, а при условии T0<<TL — пропорционально T0. Формула для функции потреь выглядит как


Величина страхового запаса


Величина рабочего запаса

Как видим, интенсивность потребления V задает только масштаб этих значений, не меняя качественной картины, поэтому при расчетах будем принимать V=1, и тогда полный запас


Таким образом, мы будем исследовать зависимость TS от T0.

 

Методика:

 

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

 

Поскольку очень важное значение имеет соотношение величин T0 и TL, диапазон изменения T0 будет выбираться автоматически как [TL/10;TL*10], точки измерения будут расставлены более часто в начале диапазона (размещение точек сделано по логарифмической шкале).

 

На последнем графике строится зависимость интегральной вариации от T0 при разных значениях вариации дневных продаж — это просто для информации.

 

Первый график содержит зависимость SS от T0 для всех уровней сервиса из заданного диапазона с заданным шагом. Зависимость


получена путем линейной интерполяции табличной функции потерь.

 

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

 

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

 

Результаты

 

Для меня лично весьма неожиданные.