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

10

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

27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2

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

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

Заранее спасибо!

ОБНОВЛЕНИЕ: Большое спасибо за все ответы и комментарии. Позвольте мне попытаться дать немного больше контекста (экономическое обоснование вопроса - конечно, очень упрощенное). У нас есть сотни торговых автоматов. Каждый день мы должны решить, какие 20 из них посетить для пополнения. Для этого мы пытаемся предсказать, каково текущее состояние машин, и выбрать «самые пустые» 20 машин. Для каждой машины и продукта мы рассчитываем средние продажи за день (SPD), используя наивный алгоритм, описанный выше. Затем мы умножаем SPD на количество дней с момента последней заправки машины, и в результате получаем прогнозируемое количество проданного товара.

Иван Димитров
источник
Я думаю, что это интересный вопрос. Мой точный ответ на ваш вопрос и набор данных: имеет ли это значение? и: получить больше данных. Кроме того, я думаю, что полезно знать, какова вместимость торгового автомата.
Адам
@ Adam Емкость для этого продукта составляет 50 бутылок. Может быть, мое описание проблемы недостаточно ясно. Я постараюсь немного его отредактировать, чтобы придать больше контекста. В основном я ищу идеи, как решить общую проблему, и я очень благодарен за все комментарии до сих пор. Конкретный набор данных приводится в качестве примера того, как выглядят данные. Для других торговых автоматов я могу предоставить данные за гораздо более длительный период.
Иван Димитров
@IvanDimitrov: Что именно столбец два в ваших данных?
Кайл Брандт
@KyleBrandt Колонка два - это количество бутылок, проданных с момента последнего посещения торгового автомата. Таким образом, число 48 в верхнем ряду означает, что 48 бутылок были проданы между 17/02 и 27/02
Иван Димитров

Ответы:

11

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

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

Концептуальная статистическая модель для этой проблемы может быть получена путем разработки некоторого способа оценки затрат для каждой из машин на основе предыдущих данных. ожидаетсяСтоимость необслуживания машины сегодня приблизительно равна вероятности ее истечения, умноженной на скорость ее использования. Например, если сегодня у машины есть 25% шансов опустошиться и в среднем продается 4 бутылки в день, ее ожидаемая стоимость равна 25% * 4 = 1 бутылка в потерянных продажах. (Переведите это в доллары, как хотите, не забывая, что одна потерянная продажа сопряжена с нематериальными затратами: люди видят пустую машину, они учатся не полагаться на нее и т. Д. Вы даже можете отрегулировать эту стоимость в соответствии с местоположением машины; Некоторое время машины работают пустыми, что может повлечь за собой несколько нематериальных затрат.) Справедливо предположить, что заправка машины немедленно обнулит ожидаемые потери до нуля - редко случается, чтобы машина опустошалась каждый день (не так ли. ..). Со временем,

θxθx

x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

Фактическое против соответствия

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

t

Потеря со временем

50/1.85=27

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

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

θ^=1.871.8506

1-POISSON(50, Theta * A2, TRUE)

для Excel ( A2это ячейка, содержащая время с момента последнего пополнения и Thetaпредполагаемый ежедневный уровень продаж) и

1 - ppois(50, lambda = (x * theta))

для Р.)

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

θ

Whuber
источник
1
Для меня предположение о том, что продажи / события не зависят друг от друга, может показаться нелогичным, поскольку это измерения, сделанные с течением времени на одной и той же машине. Как ваш подход будет работать с автоматически коррелированными данными о продажах, которые могли изменить уровень? Просто любопытно ?
IrishStat
1
Я полагаю, что наметил путь к оценке и рассмотрению возможных форм «автокорреляции». Они не будут проявляться как таковые в традиционном анализе временных рядов, даже если имеются регулярно расположенные данные. Временная корреляция будет результатом корреляции внешних факторов, таких как недельные или сезонные циклы. Интересная форма может возникнуть из временной группировки покупок (например, сразу после обеда или в выходные дни). «Чистые изменения уровня» могут быть обработаны, если необходимо, подгонкой тренда, но простое использование скользящего среднего значения будет иметь дело с этим автоматически.
whuber
4

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

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

library("xts")
library("forecast")

x = read.table(text="27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2")

#Convert the data into an XTS object which works with irregular time series 
x.xts = xts(x[,2], as.POSIXct(x[,1], format="%d/%m/%Y"))

#Conver to a daily rate by taking the observed data and dividing it by 
#the number of days between observations
daily_rate <- lag(x.xts) / diff(index(x.xts))

#Generate a daily time series for the dates
dummy_dates <- seq(from=index(x.xts)[1], to=tail(index(x.xts), 1), by="day")

#Combine daily series with observered daily rate
m.xts <- merge(daily_rate, dummy_dates)

#Interpolate the daily sales -- kind of evil because we "invent" data
m.xts.interpolate <- na.approx(m.xts)

#Convert to regular time series
m.ts <- ts(m.xts.interpolate, freq=365, start=c(2011, 336))
#Clean up dimnames in case of stl forecast (just an R thing when converting from dataframes)
dim(m.ts) <- NULL

#Fit TS to an ETS model (Rudely ignoring IrishStat's advice that it is a bad model, but this is just an example)
fit <- ets(m.ts)

#Forecast and Plot
plot(forecast(fit, h=30))

В результате получается сюжет:

введите описание изображения здесь

Кайл Брандт
источник
Читали ли вы мой ответ "Мы решили это путем преобразования спроса в ставку путем деления фактического спроса на количество дней в интервале между обслуживанием". Вместо того, чтобы принимать модель такой, какая вы есть, я определил полезную модель. Ваши прогнозы являются взрывоопасными, поскольку они считают недавние "аномальные показатели", а не подстраиваются под них.
IrishStat
2
@IrishStat: Да, у меня даже есть комментарий в моем коде, указывающий на тот факт, что вы сказали, что это плохая модель, я просто подумал, что некоторый R-код может помочь людям, давая основу для экспериментов.
Кайл Брандт
1

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

ДОПОЛНИТЕЛЬНЫЙ АНАЛИЗ:

Когда я смоделировал Rate как функцию от Interval, я получил следующее. Используя прогноз ИНТЕРВАЛ, используя его прошлое, это уравнение может затем предсказать скорость, которую можно использовать для прогнозирования спроса. Этот тип модели позволяет вводить авторегрессивную структуру в скорости, а также учитывать пульсы, сдвиги уровней и / или локальные тренды времени в скорости.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) ОШИБКА ЗНАЧЕНИЕ ЗНАЧЕНИЕ

 Differencing                  1                                            
1CONSTANT                          .295       .840E-01   .0246     3.51

ИНТЕРВАЛ INPUT SERIES X1

 Differencing                  1                                            
2Omega (input) -Factor #  1    0   .685E-01   .346E-01   .1193     1.98

ВХОДНАЯ СЕРИЯ X2 I ~ P00002 12/03/11 ИМПУЛЬС

 Differencing                  1                                            
3Omega (input) -Factor #  2    0   1.43       .168       .0010     8.52

ВХОДНАЯ СЕРИЯ X3 I ~ P00007 12/08/11 ИМПУЛЬС

 Differencing                  1                                            
4Omega (input) -Factor #  3    0  -.935       .168       .0051    -5.57

ВХОДНАЯ СЕРИЯ X4 I ~ P00010 12/11/11 ИМПУЛЬС

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27
IrishStat
источник
1
Я думаю, что это немного неправильно понимает вопрос: у него нет прерывистого спроса, он периодически наблюдал спрос, и он, очевидно, рад принять постоянный базовый спрос в день. Действительно, подход с передаточной функцией, кажется, в общем и целом является тем, который он пытается здесь, хотя и с предположением о линейности, окном 90 дней и без ковариат. FWIW, регрессирующий спрос по отношению к (экзогенным) дням с момента последнего чтения, дает около 2,2 пунктов, требуемых в день, но высокая неопределенность в отношении этой оценки.
конъюнктура
@ConjugatePrior Он не может наблюдать фактическую потребность в день и выборки с нечастыми интервалами, таким образом, де-факто эквивалентен периодической проблеме спроса. Его «скорость» может быть охарактеризована как случайное блуждание с 3 исключениями (импульсами) в 12/16; 2 / 02; 2/27. Наша идея здесь состоит в том, чтобы смоделировать ставку как функцию от интервала, затем предсказать интервал и затем предсказать спрос. Вы, по-видимому, смоделировали спрос как функцию от интервала, получая простую среднюю ставку, которая в этом случае сильно / неблагоприятно осуществляется с помощью 3 аномальных точек данных и не отражает авторегрессионную структуру.
IrishStat
2
Конечно, это не может быть случайной прогулкой, потому что продажи могут только расти или оставаться неизменными (эквивалентно, акции могут только падать или оставаться на том же уровне), что больше похоже на процесс обновления. Также я не уверен, как вы выяснили, что именно 3 балла являются выбросами. (Между прочим, «анализ», который я предложил, является лишь его собственной обобщенной версией с неустойчивым допущением линейности, поэтому я лично не был бы доволен этим.)
сопряженный
@ConjugatePrior Показатель как функция интервала показал, что показатель сильно зависит от предыдущих показателей и также подвержен влиянию трех «необычных показателей». Никаких сдвигов уровня не выявлено. То, что я должен был сказать, было то, что скорость была случайной прогулкой без константы, поэтому нет заметной тенденции.
IrishStat
1
@IrishStat Большое спасибо за ответ. Я буду читать о прерывистом спросе, используя функцию передачи. Одно небольшое исправление: нам не нужно прогнозировать ИНТЕРВАЛ. Мы должны решить, когда посетить машину на основе прогноза скорости. Например, одним бизнес-правилом может быть «посещать машину, когда она пуста на 60%»
Иван Димитров