Прогнозирование временных рядов по одному из ключевых показателей эффективности розничной цепочки поставок — уровню логистических услуг — с использованием одного из популярных в последнее время алгоритмов машинного обучения Facebook’s Prophet.

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

Уровень обслуживания используется в логистике для описания процента заказов клиентов, которые удовлетворяются запасами. Другими словами, это мера того, насколько хорошо компания способна удовлетворить спрос клиентов с точки зрения как времени доставки, так и количества. [1]

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

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

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

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

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

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

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

Итак, что такое пророк?

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

модель прогнозирования такая

Теперь давайте перейдем к коду на Python. (все используемые наборы данных и блокнот Jupyter будут доступны по ссылке ниже)

Во-первых, мы собираемся установить Пророка, если вы еще этого не сделали.

Установка библиотеки

pip install prophet

Нам понадобятся панды для манипулирования данными и сама библиотека Prophet.

import pandas as pd
from prophet import Prophet

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

Загрузить набор данных

df_order = pd.read_csv("dataset_order.csv")
df_order.head()

df_receiving = pd.read_csv("dataset_receiving.csv")
df_receiving.head()

Предварительная обработка данных

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

df_receiving = df_receiving.pivot_table(
    index = "ord_date",
    columns = ['Store'],
    values='rec_qty',
    aggfunc = 'sum'
).reset_index().rename(columns = {'Store1':'rec_qty'})
df_receiving.head()

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

df = df_order.merge(df_receiving, on='ord_date', how='left')
df.head()

Теперь мы собираемся рассчитать уровень обслуживания. po_qty — количество заказов, rec_qty — количество полученных заказов.

df['service_level'] =  df["rec_qty"] / df["po_qty"] * 100

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

Как видите, минимальный уровень обслуживания составляет 20%, а самый высокий — 100%. минимальный созданный заказ составляет 24 шт., а максимальный - 624 шт. для количества полученных заказов минимальное количество составляет 24 шт., а максимальное - 624 шт.

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

df = df[['ord_date','service_level']].rename(columns={'ord_date':'ds','service_level':'y'})
df

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

Моделирование

m = Prophet() #saving the machine learning algorithm into m variable
model = m.fit(df) #fitting 
future = model.make_future_dataframe(periods=30, freq='D') #periods is how many days we are going to forecast into the future, and freq is for daily (since the data we are using is daily data.
forecast = model.predict(future) #predicting

Вот и все! так просто использовать алгоритм Facebook Prophet. теперь мы собираемся изучить фрейм данных прогнозируемых данных.

forecast[['ds', 'yhat']].tail()

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

forecasted_service_level = model.plot(forecast, uncertainty=True)

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

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

plot_components = model.plot_components(forecast)

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

Заключение

  • Мы можем использовать пророка Facebook для прогнозирования уровня обслуживания.
  • То, что мы можем прогнозировать, — это не только уровень обслуживания, но и многое другое, если это данные временного ряда. (Самая распространенная вещь для прогнозирования — продажи).
  • Пророк Facebook прост в использовании даже для тех, у кого нет опыта программирования.

Исходный код :

https://github.com/ariefkurniawan95/ServiceLevelForecastingWithProphet

Использованная литература :

[1]. https://scmedu.org/servicelevel/

[2]. https://www.tableau.com/learn/articles/time-series-analysis

[3]. https://www.geeksforgeeks.org/time-series-analysis-using-facebook-prophet/