Як прогнозувати на основі агрегованих даних через нерегулярні інтервали?


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))

для Р.)

Моднішим моделям (які включають тенденції, цикли тощо) потрібно буде використовувати для своїх оцінок регресію Пуассона.

θ


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

У вас є "проблема з переривчастим попитом". Ми вирішили це шляхом перетворення попиту на ставку, поділивши фактичний попит на кількість днів у проміжку між обслуговуванням. Потім ця швидкість може бути змодельована як функція передачі, щоб передбачити швидкість з урахуванням прогнозування інтервалу. Цю прогнозовану ставку можна потім перетворити на попит. Слід обережно виявити структурні зрушення швидкості за допомогою виявлення втручання. Спробуйте гуглінг "Підхід до моделювання переривчастих попитів з використанням методології функції передачі". Слід чітко зрозуміти модельні підходи Кростона або Експонентне згладжування, оскільки вони досить дефіцитні.

ДОДАТКОВИЙ АНАЛІЗ:

Коли я моделював ставку як функцію інтервалу, я отримав наступне. Використовуючи передбачення INTERVAL, використовуючи минуле, це рівняння може передбачити швидкість, яку можна використовувати для прогнозування попиту. Така модель дозволяє включити авторегресивну структуру швидкості, а також дозволяє імпульси, зміни рівня та / або місцеві тенденції часу.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) ЗНАЧЕННЯ ПОМИЛКИ ЗНАЧЕННЯ

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

ВХОД СЕРІІ 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 PULSE

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

ВХОДНІ СЕРІЇ X4 I ~ P00010 12/11/11 PULSE

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27

1
Я думаю, що це трохи нерозуміє питання: у нього немає попиту, що переривається, він періодично спостерігає попит, і він, мабуть, радий приймати постійний базовий попит на день. Дійсно, підхід до функції передачі є, як правило, таким, який він намагається тут, хоч і з припущенням про лінійність, вікном на 90 днів і без коваріатів. FWIW регресує попит проти (екзогенних) днів з моменту останнього читання дає близько 2,2 запитаних запитів на день, але висока невизначеність навколо цієї оцінки.
кон'югатприор

@ConjugatePrior Він не може спостерігати фактичний попит на день і вибірки з нечастою інтервалом, таким чином, фактично еквівалентний проблемі з переривчастим попитом. Його "швидкість" можна охарактеризувати як випадкову прогулянку за 3 винятками (імпульсами) в 12/16; 2 / 02; 2/27. Наша ідея полягає в тому, щоб моделювати ставку як функцію інтервалу, потім передбачити інтервал і далі передбачити попит. Ви, здається, моделювали попит як функцію інтервалу, отримуючи просту середню швидкість, яка в даному випадку сильно / негативно під впливом 3 аномольних точок даних & не відображає авторегресивну структуру.
IrishStat

2
Безумовно, це не може бути випадкова прогулянка, оскільки продажі можуть лише збільшуватися або залишатись однаковими (еквівалентно запаси можуть лише знижуватися або залишатися на тому ж рівні) - щось більше, як процес відновлення. Також я не впевнений, як ви зрозуміли, що рівно 3 бали - це видатки. (BTW "аналіз", який я запропонував, - це лише його узагальнена версія, з неприйнятним припущенням про лінійність, тому я особисто не був би в задоволенні цим.)
союзником

@ConjugatePrior Швидкість як функція інтервалу показала, що швидкість сильно залежала від попередніх швидкостей, а також вплинула на три "незвичайні ставки". Зміни рівня не виявлено. Що я повинен був сказати, це те, що показник був випадковим кроком без постійних, тому немає помітної тенденції.
IrishStat

1
@IrishStat Дякую за відповідь. Я прочитаю про переривчастий попит за допомогою функції передачі. Одне невелике виправлення: нам не потрібно прогнозувати ІНТЕРВАЛ. Ми маємо вирішити, коли відвідати машину, грунтуючись на передбаченні курсу. Наприклад, одним із правил бізнесу може бути "відвідування машини, коли вона на 60% порожня"
Іван Димитров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.