Оптимальный размер заказа в стиле 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...

 

Очень интересное решение. К сожалению, разобраться не так уж просто :(    

F(S)=0.67 - я дошёл до этого пункта - дальше не совсем понятно, куда двигаться.

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

Пусть дневной спрос распределен по нормальному закону с параметрами S0=300, σ=50.

S0=300, σ=50 откуда берутся? 

И откуда появляется 0,44

Если Вам не сложно, можно объяснить поподробней?

In reply to by Дмитрий_Л

прошу прощения за задержку, был в отпуске.

мы получили оптимальное значение

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

где Ф - уже стандартная функция распределения, а ее значения табулированы. Поскольку 0.67=0.5+0.17 (то есть ищем площадь в 0.17 справа от центра) - смотрим в таблицу например http://www.mathauto.ru/calc/tfl.htm и обнаруживаем, что такая площадь обеспечивается при значении аргумента 0.44.

Рекомендую внимательно смотреть на таблицы функции Лапласа - в одних справочниках (как в данной ссылке) дается значение площади на промежутке [0,z], в других - на промежутке [-z,z], то есть ровно вдвое больше.

In reply to by stanley

Теперь намного понятнее :) 

Пусть дневной спрос распределен по нормальному закону с параметрами S0=300, σ=50 - я Вас ещё немножко помучаю.

У меня есть экспертные данные. Как найти мат. ожидание по статистике. В формуле мат. ожидания непрерывной случайной величины присутствует х - результат случайной величины и f(x) - и 1-я производная от функции рапределения, она же плотность распределения.  Мы принимает условие, что распределение нормальное, т.е.  известны и F(x) и f(x).  Простите за глупый вопрос, как зная всё это самым простым способом найти Мо и СКО ?

 

In reply to by Дмитрий_Л

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

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

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

а дисперсии

In reply to by stanley

Благодарю Вас, за разъяснение :) 

Вот думаю....

 Обычно я беру период 13 недель расход и дефектуру (отсутствие остатка), далее подбираю 7 основных трендов + к ним: холт-винтерс, arma и arima - выбираю по минимальной ошибке. За 3 года не беру, поскольку при заказе на 5-10 дней нет смысла оценивать, последние данные итак влияют на тренд. Если нет непрерывной статистики за последние 4 недели, то оцениваю только последний месяц по дням с расчётом средних по весовым коэффициентам недель и расчётом СКО. Всё это считается по любому массиву данных в matlab.

Qmax я планировал считать, как Qmax = Vsr*(s+d+w) + Vsr*(d+w)*СКО.  Где: Vsr - средняя скорость, расчитанная прогнозом; s - страховой запас в днях для отсутствия дефектуры при задержки поставки; d - кол-во дней доставки с момента заказа; w - интервал в днях между заявками. Система для заказа товара с малыми периодами доставки 3-4 дня. Само СКО я ограничивал в зависимости от группы АВС, например, "А" не более 0,5, "В" не более 0,2 и "С" равным 0.

Теперь хочу использовать подход данной статьи к расчёту Qmax. Как Вы считаете, можно использовать СКО, которое расчитывалось по МНК подбором трендов или другим методам прогнозирования и представить его, как СКО нормального распределения (по определению конечно же нет).

При прогнозировании само СКО показывает на вероятность отклонения прогнозных данных от фактических и в некоторой степени близко к СКО нормального распределения. 

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

In reply to by Дмитрий_Л

очень много в результате неясных моментов.

какие имеются в виду "7 основных трендов" и как они подбираются?
при длине данных в 13 недель нам неоткуда получить сезонность, какие могут быть winters и arima?
фраза "ограничить СКО" мне вообще непонятна, это объективный показатель, причем никак не связанный с ABC.
в формуле d+w в данном случае есть не что иное, как время реакции системы, тогда если переписать в виде
Qmax = Vsr*w + Vsr*(d+s) + Vsr*(d+w)*СКО, фактически первое слагаемое - рабочий запас. значит, все остальное - страховой. непонятно, из каких соображений именно так.

Обычно используется либо опора на СКО, тогда страховой примерно Vsr*(d+w)*СКО*z, где z - фактор, учитывающий вид распределения и уровень сервиса, либо вообще на СКО не смотрят, а добавляют экспертным путем сколько-то дней запаса в виде страхового, как раз то, что у нас под видом d+s. То есть здесь сумма двух методов, причем в обоих чисто экспертное мнение.

так что я бы тут для начала с методологией поразбирался :)

In reply to by stanley

добрый день!  был в ссылке, не мог писать.

По трендам. Основные тренды: линейный, обратная функция, логарифм, степенная, экспонента, парабола, полиномы 2 и 3 и т.д. Некоторое подобие есть в екселе - при пострении графиков добавление трендов. Подбираются все тренды, далее оценивается сезонность (но в данной случае сезонность не оценивается, т.к. период небольшой), далее идёт расчёт ошибки. Про сезонность Вы полностью правы, я написал холт-винтерс автоматом, имеется ввиду только Хольт (т.к. именно Уинтерс или Винтерс добавил сезонность в формулу). arma и arima и расчитывается без сезонности, хотя и сезонность можно тоже учитывать (но в данном случае нет необходимости).

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

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

А вот возможный рост продаж, данный страховой запас не учитывает. Именно поэтому я хотел добавить некий запас по СКО   Vsr*(d+w)*СКО - то есть подержать немножко товара, расчитывая на возможный рост продаж на величину отклонения СКО. Отсюда и мысль привязать к АВС, чтобы не держать такой запас для неходовых позиций, например, держать только для А. АВС пересчитывается по каждой торговой точке 1 раз в неделю.

z - фактор - не совсем понятно, чем он лучше, особенно когда вид распределения не так просто определить через формулы, например, по 6500 позициям по 400 торговым точкам. Учитывая, что дефектура (отсутствие товара) в аптечном ритейле присутствует постоянно. Вы сами писали об определении вида распределения и о ценности математических методов :)

Вот я и хотел подойти к вопросу о "дополнительном запасе", использовав Вашу статью. То есть заменить Vsr*(d+w)*СКО на что-то более интересное. Что заменить надо, это понятно. Хочется оценить именно дополнительный запас с точки зрения колебания спроса и возможных потерь, а не страховой запас созданный для уменьшения дефектуры при сбое поставки, который в аптеке просто должен быть - и это опять практика.

 

 

In reply to by Дмитрий_Л

добрый день!  был в ссылке, не мог писать.

По трендам. Основные тренды: линейный, обратная функция, логарифм, степенная, экспонента, парабола, полиномы 2 и 3 и т.д. Некоторое подобие есть в екселе - при пострении графиков добавление трендов. Подбираются все тренды, далее оценивается сезонность (но в данной случае сезонность не оценивается, т.к. период небольшой), далее идёт расчёт ошибки. Про сезонность Вы полностью правы, я написал холт-винтерс автоматом, имеется ввиду только Хольт (т.к. именно Уинтерс или Винтерс добавил сезонность в формулу). arma и arima и расчитывается без сезонности, хотя и сезонность можно тоже учитывать (но в данном случае нет необходимости).

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

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

я бы скорее обратил внимание именно на сезонность - она там явно есть и вполне объяснима.

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

"нет непрерывной статистики" - под этим подразумевается "грязь" из-за дефектуры или в самом деле нет данных о продажах?

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

А вот возможный рост продаж, данный страховой запас не учитывает. Именно поэтому я хотел добавить некий запас по СКО   Vsr*(d+w)*СКО - то есть подержать немножко товара, расчитывая на возможный рост продаж на величину отклонения СКО. Отсюда и мысль привязать к АВС, чтобы не держать такой запас для неходовых позиций, например, держать только для А. АВС пересчитывается по каждой торговой точке 1 раз в неделю.

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

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

слагаемое Vsr*(d+s), входящее в страховой запас, говорит о том, что у нас всегда поставка опаздывает на s дней.

в слагаемом Vsr*(d+w)*СКО следует (из контекста) под СКО подразумевать безразмерную относительную ошибку СКО/Vsr. так? тогда здесь видимо подразумевается величина отклонения спроса от Vsr, связанная с случайностью - (d+w)*СКО. по смыслу наших рассуждений мы измеряли СКО по дням, значит на самом деле должно быть sqrt(d+w) * СКО...

z - фактор - не совсем понятно, чем он лучше, особенно когда вид распределения не так просто определить через формулы, например, по 6500 позициям по 400 торговым точкам. Учитывая, что дефектура (отсутствие товара) в аптечном ритейле присутствует постоянно. Вы сами писали об определении вида распределения и о ценности математических методов :)

Вот я и хотел подойти к вопросу о "дополнительном запасе", использовав Вашу статью. То есть заменить Vsr*(d+w)*СКО на что-то более интересное. Что заменить надо, это понятно. Хочется оценить именно дополнительный запас с точки зрения колебания спроса и возможных потерь, а не страховой запас созданный для уменьшения дефектуры при сбое поставки, который в аптеке просто должен быть - и это опять практика.

так ведь на самом деле когда вы говорите, что назначаете СКО для группы "А" = 0.5, вы фактически назначаете этот самый z :)

что касается нормальности распределения - в аптечном ритейле его практически нет.

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

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

In reply to by stanley

Добрый день!

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

Страховой запас - Вы правы защита от 2-х рисков.

Под СКО - я подразумевал. После находжения средней скорости, нахожу квадрат разности по каждому дню (не дефектурному), далее суммирую все значения и делю на кол-во значений - 1 - получил дисперсию. из неё извлёк корень - получил стандартное отклонение. Если прогноз делался трендом, то средюю ошибку по всему ряду ошибок данных.  Например Vsr = 5.2 шт. СКО = 0.12 шт. Это СКО относится именно к Vsr и является показателем рассеивания значений среднего. То есть 5.2 шт. * 0.12 шт. = 0.624 шт. - тот кусочек скорости, который выше средней и менно по которой хочется иметь дополнительный запас.

Пример, в аптеке произошёл сбой поставки и одновременно рост продаж. Страховой запас, расчитанный, как 7 дней, закончится раньше 7 дней. В результате - дефектура.

Qmax = Vsr*(s+d+w) + Vsr*(d+w)*СКО - это верхний уровень

Qmin = Vsr*(s+d+w) - это нижний уровень, определяющий точку заказа. Когда меньше данного уровня - заказываем до Qmax.  

по смыслу наших рассуждений мы измеряли СКО по дням, значит на самом деле должно быть sqrt(d+w) * СКО...   -  думаю корень не нужен тут: СКО расчитывается по скорости

Например Qmin = Vsr*(s+d+w) = 5.2 * (7+3+4) = 72.8  - товар на 7 дней (3+4) и страховой запас 7 дней - итого 14 дней. Следующий заказ будет только через 4 дня. И ещё 3 дня доставки - следущий товар прибудет только через 7 дней.

Qmax = Vsr*(s+d+w) + Vsr*(d+w)*СКО = 5.2 * (7+3+4) + 5.2 * (7+3+4)*0.12 = 72.8 + 8.736 = 81.54 шт. То есть 8.736 - именно страховка от дефектуры при росте продаж. 

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