Пакет «smooth» для R. Прерывистый спрос. Часть 1. Введение

Одно из преимуществ функций пакета smooth заключается во встроенной возможности работать с прерывистыми данными и с данными с периодически возникающими нулями.

Прерывистый спрос — это такой спрос на продукцию, который происходит нерегулярно (Svetuknov and Boylan, 2017). Например, продажи зелёной губной помады имеют такой характер: её редко, кто покупает, но это всё-таки происходит время от времени. Данные по продажам такой продукции будут содержать много нулей, и предсказать, когда именно произойдёт продажа такого товара — крайне затруднительно. Может показаться, что я беру в пример какой-то экзотический товар, а значит и проблема прерывистого спроса надумана. Но вообще-то это не так. Если обратиться к тому, что происходит сейчас в сфере ритейла, то на себя обращает внимание увеличение частоты измерений данных. Раньше была возможность только сохранять количество проданных каких-нибудь хлопьев в неделю, сейчас же можно измерять продажи хоть раз в минуту (можно и чаще, но надо ли?). А как предсказать, когда купят хлопья в магазине, когда данные измеряются в такой частоте? В общем, проблема есть, и она вполне реальна.

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

В общем, со всеми этими интересными особенностями как раз и призваны справиться функции пакета smooth. Для этого в нём реализованы так называемые модели со смешанными распределениями.

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

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

Модель

Во-первых, стоит заметить, что всё, что мы будем далее обсуждать основано на идее разделения ряда прерывистого спроса на две части (Croston, 1972):

  1. Появление спроса, которая представлена бинарной переменной (0 — спроса нет, 1 — спрос есть);
  2. Размер спроса, которая отражает, сколько единиц продукции было куплено, если спрос появился.

Математически это всё представляется вот так вот:
\begin{equation} \label{eq:iSS}
y_t = o_t z_t ,
\end{equation}
где \(o_t\) — это бинарная переменная появления, \(z_t\) — это объём спроса и \(y_t\) — это финальная величина, которую мы измеряем. Это уравнение было предложено в Croston, (1972), хотя Кростон ограничился лишь разработкой прогнозного метода, и не занимался стохастической моделью.

В литературе встречается несколько методов для прогнозирования прерывистого спроса: Кростон (Croston, 1972), SBA (Syntetos & Boylan, 2000 — SBA — Syntetos-Boylan Approximation) и TSB (Teunter et al., 2011 — по фамилиям авторов метода). Это всё хорошие методы, которые себя хорошо зарекомендовали. Единственное ограничение — это то, что они «методы», а не «стохастические модели». Модель позволяет достаточно легко включать дополнительные компоненты и переменные, конструировать прогнозные интервалы и возможность осуществлять выбор наилучшей модели среди некоторого пула. Не имея модель, всё это сделать затруднительно. Мы с Джоном Бойланом (John Boylan) разработали модель, которая лежит в основе этих методов (Svetunkov & Boylan, 2017), с помощью \eqref{eq:iSS}. Учитывая то, что все эти методы основаны на простом экспоненциальном сглаживании, мы назвали свою модель «iETS» — «intermittent ETS» — «прерывистая ETS». В статье, которая сейчас находится на стадии рецензирования в International Journal for Forecasting, мы рассматривали частный случай этой модели — iETS(M,N,N), то есть модель с мультипликативной ошибкой, без тренда и сезонности, так как именно эта модель лежит в основе простого экспоненциального сглаживания. Одно из ключевых предположений в нашей модели — это независимость появления спроса от размера спроса. Это, конечно, явное упрощение, которой мы получили по наследству от метода Кростона, но даже с ним модель работает хорошо в большинстве случаев.

Модель iETS(M,N,N) формулируется следующим образом:
\begin{equation} \label{eq:iETS}
\begin{matrix}
y_t = o_t z_t \\
z_t = l_{z,t-1} \left(1 + \epsilon_t \right) \\
l_{z,t} = l_{z,t-1}( 1 + \alpha_z \epsilon_t) \\
o_t \sim \text{Bernoulli}(p_t)
\end{matrix} ,
\end{equation}
где \(z_t\) — это модель ETS(M,N,N), \(l_{z,t}\) это уровень ненулевого спроса, \(\alpha_z\) — постоянная сглаживания, а \(\epsilon_t\) — ошибка модели. Важное допущение в модели — это то, что \(\left(1 + \epsilon_t \right) \sim \text{log}\mathcal{N}(0, \sigma_\epsilon^2) \) — нечто, что мы уже как-то обсуждали. Это допущение важно, так как ограничивает область значений только положительными значениями. Впрочем, если в вашем контексте возможны так же и отрицательные значения, то никто не мешает вместо мультипликативных моделей использовать аддитивные.

К слову, iETS(M,N,N) — это упрощение. На самом деле название модели чуть более сложное, но пока, для объяснения базовой версии, его должно быть достаточно.

Прелесть модели \eqref{eq:iETS} заключается в том, что она может быть легко расширена (в неё можно добавить тренд, сезонность, экзогенные переменные), и то, что все её параметры могут быть оценены путём максимизации функции правдоподобия.

Для моделирования части, отвечающей за появление спроса, мы предложили следующие три модели:

  1. iETS\(_F\) — модель предполагает, что вероятность появления спроса фиксирована (\(p_t = p\)).
  2. iETS\(_I\) — модель предполагает, что вероятность постоянна между появлениями спроса. В этом случае мы прогнозируем длину интервалов между ненулевыми значениями спроса. Это принцип, предложенный Croston (1972).
  3. iETS\(_P\) — вероятность обновляется на каждом шаге с помощью простого экспоненциального сглаживания, где в качестве фактических значений выступает переменная \(o_t\). Такой принцип обновления был предложен в Teunter et al., (2011).

В случае (1) никакой модели для вероятности нет — мы её просто оцениваем и используем это значение в качестве прогноза. В случаях (2) и (3) мы предложили использовать ещё одну модель ETS(M,N,N) для каждого из процессов. Так что в каждом из этих случаев прогноз представляет собой прямую линию. Финальный прогноз для всех этих моделей считается по формуле:
\begin{equation} \label{eq:iSSForecast}
\hat{y}_{t+h} = \hat{p}_{t+h} \hat{z}_{t+h} ,
\end{equation}
где \(\hat{p}_{t+h}\) — это прогнозируемая вероятность, \(\hat{z}_t\) — это прогнозируемый объём спроса, а \(\hat{y}_t\) — это финальный прогноз для прерывистого спроса. Фактически на выходе мы получает некую оценку того, сколько будет продано в среднем за единицу времени.

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

  1. Она расширяема. Это означает, что в неё можно добавлять любые компоненты, которые вы пожелаете. К слову, базовая модель \eqref{eq:iSS} позволяет использовать всё, что угодно для объёма спроса и множество разных моделей для появления спроса;
  2. Модель позволяет выбирать между теми самыми тремя случаями (iETS\(_F\), iETS\(_I\) и iETS\(_P\)) с помощью информационных критериев. Этот механизм работает хорошо на больших выборках, но на малых — не очень. Возможно, для эффективной работы механизма нужно модифицировать информационные критерии, но мы пока до этого не добрались;
  3. Модель позволяет конструировать параметрические прогнозные интервалы на несколько шагов вперёд;
  4. Оценка моделей осуществляется с помощью функции правдоподобия, которая даёт эффективные и состоятельные оценки;
  5. Хотя модель и предполагает непрерывную случайную величину для объёма спроса, мы показали в своей статье, что она часто работает лучше, чем модели целочисленных случайных величин (типа Пуассона или Биномиального распределения).

Что же, посмотрим, как это работает…

Появление спроса

В пакете smooth есть функция iss() (Intermittent State-Space), которая отвечает за модель появления спроса. Так же, в каждой прогнозной функции пакета есть параметр intermittent, который может быть: «none» (никакой модели), «fixed» (iETS\(_F\)), «interval» (iETS\(_I\)), «probability» (iETS\(_P\)), «sba» (это модель iETS\(_I\) с корректировкой, предложенной Syntetos and Boylan, 2001), «auto» (автоматический выбор) и «logistic» (iETS\(_L\) — к этой модели мы перейдём в следующей статье). Пока что нам интересны первые 4 варианта. Рассмотрим их на условном примере:

В этом искусственном временном ряду вероятность и размер спроса меняются ступенчато каждые 25 наблюдений. Сгенерированные данные отражают нечто под названием «вымирающий спрос» или «устаревающий спрос». Построим наши три модели:

Анализируя результаты, можно уже заметить, что модель iETS\(_P\) аппроксимирует ряд лучше остальных (судя по информационным критериям). Это вызвано той самой гибкостью при обновлении вероятности появления спроса. В обеих моделях iETS\(_P\) и iETS\(_I\) постоянная сглаживания близка к 0,1, и в обеих из них стартовая вероятность высока (в случае с iETS\(_I\) стартовый уровень в 1.008 соответствует вероятности в \(\frac{1}{1.008} \approx 0.99 \).

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

Обратите внимание, что разные модели улавливают динамику вероятности по-разному: в то время как iETS\(_F\) всё усредняет, iETS\(_I\) и iETS\(_P\) реагируют на изменения вероятности, но по-разному. Так модель, основанная на интервалах, обновляет вероятность только, когда мы наблюдает ненулевой спрос, а модель с вероятностью изменяется на каждом наблюдении. Вообще-то ни одна из этих моделей правильно спрогнозировать вероятность возникновения не смогла (она должна уменьшаться и приближаться к нулю), но это мы ещё обсудим в следующей статье.

В моём примере последнее ненулевое наблюдение приходится как раз на конец обучающей выборки, так что модели iETS\(_I\) и iETS\(_P\) реагируют на это, хотя и каждая по своему. Если бы на последнем наблюдении был бы нуль, то iETS\(_I\) дала бы более высокий прогноз, а модель iETS\(_P\) — более низкий.

Что же, перейдём к полной модели…

Полная модель

Для того, чтобы дать финальный прогноз для прерывистого спроса, мы можем использовать любую прогнозную функцию из пакета: es(), ssarima(), ces(), gum() — во всех них есть соответствующий параметр intermittent, который по умолчанию равен «none». Для простоты пока будем использовать модель ETS. И для простоты мы будем использовать iETS\(_P\):

Прогноз этой модели — прямая линия, близкая к нулю, что вызвано снижением значений как в объёме спроса, так и в вероятности появления. Однако, зная, что спрос снижается, мы можем использовать модель с трендом для объёма спроса, ETS(M,M,N):

Прогноз в этом случае оказывается ближе к нулю, а уж асимптотически он точно будет нуль… Это означает, что мы имеем дело со стареющим спросом

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

Сравните этот график с графиком чистой аддитивной модели:

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

Здесь нужно сделать важную ремарку. Несмотря на то, что я бы рекомендовал использовать чистые мультипликативные модели, модель ETS(M,M,N) с положительным трендом взрывоопасна. Фактически мы имеем дело с экспонентой, а значит и прогноз может быть в форме взрывного спроса. Пока что решения этой проблемы нет, так что я бы рекомендовал вручную выбирать между ETS(M,N,N) и ETS(M,Md,N) (модель с демпфированным трендом). Я не рекомендую модели с аддитивным трендом, так как в случае с низким уровнем ряда и негативным трендом может получаться всякий бред (отрицательные значения и лош-нормальное распределение — это что-то странное).

В качестве заключения, эксперименты, которые мы проводили с Джоном, показывают, что самой робастной (с точки зрения точности прогнозов) является модель iETS\(_P\). Это вызвано её гибкостью и способностью обновлять вероятность на каждом шаге. Так что, если вы не знаете, к чему обратиться, используйте её.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *