Jak prognozować na podstawie zagregowanych danych w nieregularnych odstępach czasu?

10

Staram się prognozować sprzedaż produktów w automatach. Problem polega na tym, że maszyna jest napełniana w nieregularnych odstępach czasu i przy każdym napełnieniu możemy rejestrować tylko zagregowaną sprzedaż od ostatniego napełnienia maszyny (tj. Nie mamy danych o codziennej sprzedaży). Zasadniczo mamy dane dotyczące zagregowanej sprzedaży w nieregularnych odstępach czasu. Odstępy zwykle wynoszą od 2 dni do 3 tygodni. Oto przykładowe dane dla jednego automatu i jednego produktu:

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

Nasz obecny naiwny algorytm polega na obliczaniu średniej sprzedaży na dzień poprzez podzielenie całkowitej ilości sprzedanej w ciągu ostatnich 90 dni przez 90.

Czy masz pomysł, jak poprawić prognozę sprzedaży na dzień? Muszę przewidzieć, co będzie sprzedawane przy następnej wizycie maszyny. Czy można zastosować algorytm wygładzania wykładniczego ze względu na charakter naszych danych?

Z góry dziękuję!

AKTUALIZACJA: Wielkie dzięki za wszystkie odpowiedzi i komentarze. Pozwólcie, że spróbuję podać nieco więcej kontekstu (uzasadnienie biznesowe pytania - oczywiście bardzo uproszczone). Mamy setki automatów. Każdego dnia musimy decydować, które z nich odwiedzić w celu uzupełnienia. W tym celu staramy się przewidzieć, jaki jest obecny stan maszyn i wybrać „najbardziej opróżnione” 20 maszyn. Dla każdej maszyny i produktu obliczamy średnią sprzedaż na dzień (SPD) przy użyciu naiwnego algorytmu opisanego powyżej. Następnie mnożymy SPD przez liczbę dni od ostatniego napełnienia maszyny, a wynikiem jest przewidywana sprzedana ilość.

Iwan Dimitrow
źródło
Myślę, że to interesujące pytanie. Moja odpowiedź na dokładne pytanie i zestaw danych brzmi: czy to ma znaczenie? i: uzyskaj więcej danych. Myślę też, że warto wiedzieć, jaka jest pojemność automatu.
Adam
@Adam Pojemność tego produktu wynosi 50 butelek. Może mój opis problemu nie jest wystarczająco jasny. Spróbuję go trochę edytować, aby dać więcej kontekstu. Zasadniczo szukam pomysłów na rozwiązanie ogólnego problemu i jestem bardzo wdzięczny za wszystkie dotychczasowe komentarze. Konkretny zestaw danych podano jako przykładowy wygląd danych. W przypadku innych automatów mogę dostarczać dane przez znacznie dłuższy okres.
Ivan Dimitrov
@IvanDimitrov: Czym dokładnie jest druga kolumna w twoich danych?
Kyle Brandt
@KyleBrandt Kolumna druga to liczba butelek sprzedanych od ostatniej wizyty w automacie. Tak więc liczba 48 w górnym rzędzie oznacza, że ​​48 butelek zostało sprzedanych między 17/02 a 27/02
Ivan Dimitrov

Odpowiedzi:

11

Skupmy się na problemie biznesowym, opracujmy strategię rozwiązania tego problemu i zacznijmy wdrażać tę strategię w prosty sposób. Później można go poprawić, jeśli wysiłek to uzasadnia.

Problemem biznesu jest maksymalizacja zysków, oczywiście. Odbywa się to poprzez równoważenie kosztów napełniania maszyn z kosztami utraconej sprzedaży. W obecnym składzie koszty ponownego napełniania maszyn są stałe: 20 można uzupełniać każdego dnia. Koszt utraconej sprzedaży zależy zatem od częstotliwości, z jaką maszyny są puste.

Koncepcyjny model statystyczny tego problemu można uzyskać, opracowując sposób oszacowania kosztów dla każdej maszyny na podstawie wcześniejszych danych. oczekiwanodzisiejszy koszt nieobsługiwania maszyny w przybliżeniu równa się szansie, że skończy jej się razy szybkość, z jaką jest używana. Na przykład, jeśli maszyna ma dziś 25% szans na opróżnienie i średnio sprzedaje 4 butelki dziennie, jej oczekiwany koszt wynosi 25% * 4 = 1 butelka utraconej sprzedaży. (Przetłumacz to na dolary, jak chcesz, nie zapominając, że jedna utracona sprzedaż wiąże się z niematerialnymi kosztami: ludzie widzą pustą maszynę, uczą się na niej nie polegać itp. Możesz nawet dostosować ten koszt do lokalizacji maszyny; niejasne maszyny działają przez chwilę pusto, co może wiązać się z niewielkimi kosztami niematerialnymi.) Można założyć, że ponowne napełnienie maszyny natychmiast zresetuje oczekiwaną stratę do zera - rzadkie jest, aby maszyna była opróżniana codziennie (nie chcesz). ..). W miarę upływu czasu,

Prosty model statystyczny wzdłuż tych linii proponuje wahania używać urządzenia pojawiają się losowo. Sugeruje to model Poissona . W szczególności możemy założyć, że maszyna ma dzienną stawkę sprzedaży butelek i że liczba sprzedana w okresie dni ma rozkład Poissona z parametrem . (Inne modele mogą być sformułowane tak, aby obsłużyć możliwości skupień sprzedaży; ten zakłada, że ​​sprzedaż jest indywidualna, przerywana i niezależna od siebie).x θ xθxθx

W niniejszym przykładzie zaobserwowane czasy trwania wynoszą a odpowiadająca sprzedaż wyniosła . Maksymalizacja prawdopodobieństwa daje : ta maszyna sprzedaje około dwóch butelek dziennie. Historia danych nie jest wystarczająco długa, aby zasugerować, że potrzebny jest bardziej skomplikowany model; jest to odpowiedni opis tego, co zaobserwowano do tej pory.y = ( 4 , 14 , 4 , 16 , 16 , 12 , 7 , 16 , 24 , 48 ) θ = 1,8506x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

Rzeczywiste vs dopasowanie

Czerwone kropki pokazują sekwencję sprzedaży; niebieskie kropki są szacunkami opartymi na szacunkowym maksymalnym prawdopodobieństwie typowego wskaźnika sprzedaży.

Uzbrojeni w szacunkową szybkość sprzedaży, możemy dalej obliczyć prawdopodobieństwo, że maszyna może być pusta po upływie dni: wynika ona z uzupełniającej funkcji skumulowanej dystrybucji (CCDF) rozkładu Poissona, ocenianej na podstawie wydajności maszyny (zakładanej mieć 50 na następnym rysunku i przykładach poniżej). Mnożenie przez szacowany współczynnik sprzedaży daje wykres oczekiwanej dziennej straty sprzedaży w funkcji czasu od ostatniego uzupełnienia:t

Strata w czasie

Oczywiście krzywa ta rośnie najszybciej w pobliżu dni, kiedy maszyna najprawdopodobniej się skończy. To, co dodaje do naszego zrozumienia, polega na pokazaniu, że znaczny wzrost zaczyna się tydzień wcześniej. Inne maszyny o innych stawkach będą miały bardziej stromy lub płytszy wzrost: będą to przydatne informacje.50/1.85=27

Biorąc pod uwagę taki wykres dla każdej maszyny (której wydaje się, że jest ich kilkaset), możesz łatwo zidentyfikować 20 maszyn, które obecnie odczuwają największą oczekiwaną stratę: ich obsługa jest optymalną decyzją biznesową. (Należy pamiętać, że każda maszyna będzie miała własną szacunkową szybkość i będzie w swoim punkcie wzdłuż swojej krzywej, w zależności od tego, kiedy była ostatnio serwisowana). Nikt tak naprawdę nie musi patrzeć na te wykresy: identyfikacja maszyn do obsługi na tej podstawie jest łatwa zautomatyzowane za pomocą prostego programu lub nawet arkusza kalkulacyjnego.

To dopiero początek. Z czasem dodatkowe dane mogą sugerować modyfikacje tego prostego modelu: możesz wziąć pod uwagę weekendy i święta lub inny przewidywany wpływ na sprzedaż; może istnieć cykl tygodniowy lub inne cykle sezonowe; w prognozach mogą pojawić się długoterminowe trendy. Być może warto wyśledzić odległe wartości reprezentujące nieoczekiwane jednorazowe uruchomienia na maszynach i uwzględnić tę możliwość w szacunkach strat itp. Wątpię jednak, że trzeba będzie się bardzo martwić szeregową korelacją sprzedaży: trudno myśleć jakiegokolwiek mechanizmu powodującego taką rzecz.

Och, tak: jak uzyskać oszacowanie ML? Użyłem optymalizatora numerycznego, ale generalnie zbliżysz się po prostu dzieląc całkowitą sprzedaż w ostatnim okresie przez długość okresu. W przypadku tych danych, czyli 163 butelek sprzedawanych od 12.09.2011 do 27.02.2012, okres 87 dni: butelki dziennie. Wystarczająco blisko do i niezwykle prosty w implementacji, dzięki czemu każdy może od razu rozpocząć te obliczenia. (Między innymi R i Excel z łatwością obliczą CCDF Poissona: modelują następnie obliczenia 1,8506θ^=1.871.8506

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

dla programu Excel ( A2to komórka zawierająca czas od ostatniego uzupełnienia i Thetajest szacunkową dzienną stawką sprzedaży) oraz

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

dla R.)

Bardziej wymyślne modele (które uwzględniają trendy, cykle itp.) Będą musiały wykorzystywać regresję Poissona do swoich oszacowań.

NB Dla miłośników: Celowo unikam dyskusji o niepewnościach w szacowanych stratach. Ich obsługa może znacznie skomplikować obliczenia. Podejrzewam, że bezpośrednie wykorzystanie tych niepewności nie zwiększyłoby wartości decyzji. Przydatna może być jednak świadomość niepewności i ich rozmiarów; które mogą być przedstawione za pomocą pasm błędów na drugim rysunku. Na zakończenie chciałbym jeszcze raz podkreślić charakter tej liczby: drukuje liczby, które mają bezpośrednie i jasne znaczenie biznesowe; mianowicie oczekiwane straty; nie przedstawia bardziej abstrakcyjnych rzeczy, takich jak przedziały ufności wokół , które mogą być interesujące dla statystyk, ale będą po prostu tak dużym hałasem dla decydentów.θ

Whuber
źródło
1
Wydaje mi się, że założenie, że sprzedaż / zdarzenia są od siebie niezależne, wydaje się nielogiczne, ponieważ są to pomiary dokonywane w czasie na tym samym nachine. W jaki sposób Twoje podejście poradziłoby sobie z automatycznie skorelowanymi danymi sprzedaży, które mogły mieć zmianę poziomu? Po prostu ciekawy?
IrishStat,
1
Wydaje mi się, że naszkicowałem drogę do oceny i radzenia sobie z prawdopodobnymi formami „autokorelacji”. Nie pojawiałyby się jako takie w tradycyjnej analizie szeregów czasowych, nawet jeśli byłyby dostępne regularnie rozmieszczone dane. Korelacja czasowa wynikałaby z korelacji czynników zewnętrznych, takich jak cykle tygodniowe lub sezonowe. Ciekawa forma pojawiłaby się w przypadku czasowego grupowania zakupów (np. Tuż po obiedzie lub w weekendy). W razie potrzeby „zmianami netto poziomu” można sprostać poprzez dopasowanie trendu, ale po prostu użycie średniej biegłej rozwiązałoby to automatycznie.
whuber
4

Myślę, że zazwyczaj będziesz miał pierwszy krok do przejścia na zwykłe szeregi czasowe. Powiedziałeś, że bierzesz średnio 90 dni. Ponieważ masz dane, które są częstsze, myślę, że rozsądniej jest wykorzystać większość tego, co masz, biorąc dni między każdą obserwacją i dzieląc je przez liczbę przedmiotów sprzedanych w tym okresie (zakładając, że druga kolumna to).

Jako zrzeczenie się jestem całkowitym amatorem, więc chcesz skorzystać z porady eksperta takiego jak IrishStat w sprawie następującego kodu (na przykład powiedział, że ETS jest złym modelem, więc traktuj to tylko jako przykład zabawki), ale z nadzieją że oszczędza to trochę czasu, oto kod R, z którym możesz grać:

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

Powstały wykres to:

wprowadź opis zdjęcia tutaj

Kyle Brandt
źródło
Czy przeczytałeś moją odpowiedź „Rozwiązaliśmy to, przekształcając popyt na stawkę, dzieląc rzeczywiste zapotrzebowanie przez liczbę dni w odstępie między serwisami”. Zamiast zakładać model taki, jakim jesteś, zidentyfikowałem przydatny model. Twoje prognozy są wybuchowe, ponieważ uważają, że ostatnie „anomalne stopy” raczej się nie dostosowują.
IrishStat
2
@IrishStat: Tak, mam nawet komentarz w moim kodzie wskazujący na fakt, że powiedziałeś, że to zły model, pomyślałem, że jakiś kod R może pomóc ludziom, dając podstawę do eksperymentowania.
Kyle Brandt
1

To, co masz, to „przerywany problem z popytem”. Rozwiązaliśmy ten problem, przeliczając popyt na stopę, dzieląc rzeczywiste zapotrzebowanie przez liczbę dni w odstępie między serwisami. Szybkość tę można następnie modelować jako funkcję przenoszenia, aby przewidzieć szybkość, biorąc pod uwagę przewidywany przedział. Ta przewidywana stawka może być następnie przeliczona na żądanie. Należy dołożyć starań, aby wykryć zmiany strukturalne w częstości za pomocą wykrywania interwencji. Spróbuj googlować „Podejście modelowania przerywanego popytu przy użyciu metodologii funkcji przenoszenia”. Odsuńcie się bardzo od modelowego podejścia Croston lub Exponential Smoothing, ponieważ są one dość niedostateczne.

DODATKOWA ANALIZA:

Kiedy modelowałem Szybkość jako funkcję Interwału, otrzymałem następujące. Korzystając z prognozy INTERWAŁU z wykorzystaniem jej przeszłości, to równanie może następnie przewidzieć szybkość, którą można wykorzystać do przewidywania popytu. Ten rodzaj modelu pozwala na włączenie struktury autoregresyjnej w częstości, a także pozwala na częstości pulsów, przesunięć poziomów i / lub lokalnych trendów czasowych.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) WARTOŚĆ BŁĘDU

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

INTERWAŁ WEJŚCIA SERII X1

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

WEJŚCIA SERII X2 I ~ P00002 12/03/11 IMPULS

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

SERIA WEJŚĆ X3 I ~ P00007 12/08/11 IMPULS

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

WEJŚCIA SERII X4 I ~ P00010 12/11/11 IMPULS

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27
IrishStat
źródło
1
Myślę, że to nieco źle rozumie pytanie: nie ma sporadycznego popytu, sporadycznie obserwował popyt i najwyraźniej chętnie przyjmuje stały podstawowy popyt dziennie. Rzeczywiście, podejście do funkcji przenoszenia wydaje się zasadniczo tym, którego tutaj próbuje, aczkolwiek z założeniem liniowości, 90-dniowym przedziałem czasowym i bez zmiennych towarzyszących. FWIW regresuje popyt w stosunku do (egzogenicznych) dni od ostatniego czytania daje około 2,2 pozycji wymaganych na dzień, ale wysoka niepewność wokół tych szacunków.
conjugateprior
@ ConjugatePrior Nie jest w stanie obserwować rzeczywistego zapotrzebowania na dzień, a próbki w rzadkich odstępach czasu są de facto równoważne sporadycznemu problemowi z zapotrzebowaniem. Jego „szybkość” można scharakteryzować jako chodzenie losowe z 3 wyjątkami (impulsami) o wartości 12/16; 2 / 02; 2/27. Naszym pomysłem jest modelowanie stopy jako funkcji przedziału, a następnie przewidywanie przedziału, a następnie przewidywanie zapotrzebowania. Wygląda na to, że modelowałeś popyt jako funkcję przedziału, uzyskując prostą średnią stawkę, która w tym przypadku jest poważnie / niekorzystnie wywołane przez 3 anomolowe punkty danych i nie odzwierciedla struktury autoregresji.
IrishStat
2
Z pewnością nie może to być przypadkowy spacer, ponieważ sprzedaż może tylko wzrosnąć lub pozostać na tym samym poziomie (równoważne zapasy mogą tylko spaść lub pozostać na tym samym poziomie) - coś bardziej jak proces odnowy. Nie jestem też pewien, jak doszedłeś do wniosku, że dokładnie 3 punkty są wartościami odstającymi. (BTW „sugerowana przeze mnie„ analiza ”jest jedynie jego uogólnioną wersją, z założeniem niezrównoważonej liniowości, więc osobiście nie byłbym z tego zadowolony).
sprzężony przed
@ConjugatePrior Stawka jako funkcja interwału pokazała, że ​​stawka była silnie zależna od poprzednich stawek, a także miała wpływ na trzy „nietypowe stawki”. Nie stwierdzono przesunięć poziomów. Powinienem był powiedzieć, że stawka była losowym marszem bez stałej, więc nie ma zauważalnego trendu.
IrishStat
1
@IrishStat Dziękuję bardzo za odpowiedź. Przeczytam o przerywanym żądaniu za pomocą funkcji przenoszenia. Jedna mała poprawka: nie musimy przewidywać INTERWAŁU. Musimy zdecydować, kiedy odwiedzić maszynę na podstawie prognozy stawki. Na przykład jedną z reguł biznesowych może być „odwiedzaj maszynę, gdy jest ona w 60% pusta”
Ivan Dimitrov