Big data

Prognozowanie dziennej sprzedaży każdego produktu

Powyższy post ma na celu przybliżenie stosowania ekonometrycznych metod prognozowania szeregów czasowych. Zbiór danych, na których opierają się poniższe przykłady udostępniony został w ramach konkursu „Store Item Demand Forecasting Challenge w serwisie Kaggle. Zawiera dane dotyczące dziennej sprzedaży 50 produktów w 10 sklepach, łącznie 500 szeregów czasowych, w okresie 5 lat. Celem modelowania było przewidzenie dokładnej, dziennej sprzedaży dla każdego przypadku (produkt, sklep) na 3 miesiące w przód.

Maciej Ociepka. Data Scientist w Semantive. Naukowiec zajmujący się danymi, skupiony głównie na eksploracji danych i uczeniu maszynowym. Ma doświadczenie w dziedzinach: computer vision, video analysis, time series forecasting oraz predictive modeling. Szczególnie interesuje się Deep Learning i jego zastosowaniem. Entuzjasta Cloud Computing. Jest magistrem zaawansowanej analityki – Big Data w Szkole Głównej Handlowej w Warszawie. W wolnym czasie lubi jeździć na nartach, podróżować i czytać książki.


Bezpiecznym punktem wyjścia przy używaniu danych historycznych w celu prognozowania szeregów czasowych są modele statystyczne używane od lat w ekonometrii. Modele takie, mają zazwyczaj silne podbudowanie teoretyczne i często ścisłe założenia co do używanych zmiennych zależnych i niezależnych. Dzięki temu umożliwiają one wnioskowanie i interpretacje otrzymanych rezultatów oraz współczynników modelu. Co więcej, modele ekonometryczne wymagają na ogół mniejszych zbiorów danych i pozwalają na łatwe prognozowanie na wielu okresów naprzód. Dobrą praktyką może być zastosowanie kilku typowo statystycznych metod modelowania na początku pracy ze zbiorem danych w celu uzyskania modelu bazowego. Dopiero w dalszej kolejności przejście do innych, bardziej złożonych algorytmów. W wielu przypadkach prostsze modele mogą dostarczyć satysfakcjonujące wyniki.

Radzenie sobie z sezonowością danych

Szeregi czasowe w analizowanym zbiorze mają silnie zauważalną, złożoną sezonowość tygodniową oraz roczną. W całym okresie, sprzedaż w weekend znacząco przewyższała tą z dni powszednich. Średnia sprzedaż miała tendencje do wzrostu podczas wakacji, na krótko wzrastała w listopadzie i spadała w grudniu by od stycznia znów stabilnie wzrastać. Wiele z analizowanych modeli potrafi sobie radzić z prostą sezonowością. Nie są one jednak w stanie wykluczyć złożonej sezonowości o wielu różnych interwałach.

Wykres pudełkowy średniej miesięcznej sprzedaży

Wykres wygładzonej, dziennej sprzedaży. Zwraca uwagę regularność szeregu

Można próbować zastosować różnicowanie w celu zniwelowania sezonowości jednak użycie średnich wydaje się lepszym podejściem w złożonym przypadku. Metoda ta polega na obliczeniu średniej wartość dla interwału każdego sezonu i odejmowaniu go od oryginalnych wartości. Aby pozbyć się tygodniowego komponentu sezonowości można danych treningowych do obliczenia średniej sprzedaży dla każdego dnia tygodnia, a komponent roczny usunąć np. z użyciem średnich dla każdego tygodnia w roku. W przypadku omawianego zbioru takie działanie umożliwia usunięcie złożonej sezonowości z szeregu czasowego. Po więcej informacji warto sięgnąć do naszego zestawu narzędzi do desezonowania szeregów czasowych dostępnego na GitHubie.

Wygładzanie wykładnicze metodą Holta-Wintersa

Jedną z najstarszych technik analizy szeregów czasowych jest użycie tzw. funkcji okna w celu pozbycia się szumów i wygładzenia szeregu. Metoda ta nazywa się wygładzaniem wykładniczym i może być używana do prognozowania przyszłych wartości. Najprostszym wariantem jest użycie pojedynczego wygładzania wykładniczego, jednak aby poradzić sobie zarówno z trendem, jak i sezonowością w zbiorze danych należy użyć potrójnego wygładzania wykładniczego znanego również jako model Holta-Wintersa. Model ten spisuje się dobrze jako model bazowy z powodu swojej prostoty. Został on jednak stworzony do analizy pojedynczego szeregu czasowego, więc jeśli mamy do czynienia z wielowymiarowym szeregiem, zawierającym setki pojedynczych szeregów, obliczenie wszystkich instancji modelu może zająć dużo czasu. Z drugiej strony, metoda ta nie wymaga by analizowany szereg był stacjonarny.

Poniżej przykładowe użycie modelu Holta-Wintersa z pakietu Statsmodels w języku Python

hw_trainer = lambda df: smt.ExponentialSmoothing(endog=df.loc[-365:,'normed'],
                                                 damped=False, trend='add',
                                                 seasonal='add',seasonal_periods=7).fit()

W omawianym przykładzie wartości parametrów modelu można dla uproszczenia zachować takie same dla każdego modelu. Rodzaj trendu i elementu sezonowości występujących w zbiorze kwalifikują się jako „addytywne”. Okres sezonu ustawiony na 7 dni pozwala na wyeliminowanie tygodniowej sezonowości. Z powodu liczby szeregów problem wymaga stworzenia 500 modeli, po jednym dla każdego szeregu i obliczenia prognozy z ich użyciem. Do oceny łącznej dokładności prognoz wszystkich modeli można użyć metryki SMAPE. Finalnie, zbiorczy wynik tak skonfigurowanych modeli na zbiorze testowym Kaggle wynosi 17.198.

Przykładowa 90-dniowa prognoza dla jednego sklepu (nr 6) i jednego produktu (nr 14) z użyciem modelu Holta-Wintersa

SARIMA

Model SARIMA (Seasonal Autoregressive Integrated Moving Average) generalizuje dwa popularne modele AR oraz MA, jak również jest w stanie radzić sobie z pojedynczą sezonowością oraz niestacjonarnością szeregu. Niestety, jako że model ten jest uogólnieniem wspomnianych wyżej modeli zawiera wiele parametrów. Znalezienie ich prawidłowych wartości może być trudne i czasochłonne. Wymaga również wiedzy oraz analizy wykresów autokorelacji i autokorelacji cząstkowej. Inną opcją może być przetestowanie wybranego zakresu wartości parametrów poprzez grid search.

Poniżej przedstawione jest z użycie modelu SARMIA z pakietu pyramid-arima w języku Python, samodzielnie dobierającego swoje parametry.

from pyramid.arima import auto_arima

arima_trainer = lambda df: auto_arima(df.loc[-365:,'sales'], m=7, n_jobs=1, max_p=7, max_q=7,
                                     max_P=7, max_Q=7, max_order=12, trend='c', max_iter=100,
                                     trace=False, error_action='ignore',  stepwise=True)

Model SARMIA radzi sobie jedynie z pojedynczym szeregiem czasowym, w omawianym przypadku należy zatem znaleźć najlepsze parametry modelu osobno dla każdego z 500 szeregów. Wykonywanie tego manualnie byłoby długie i żmudne. Lepszym wyjściem może być co prawda czasochłonne ale automatyczne przeszukiwanie parametrów modelów.

Jako że model SARIMA nie radzi sobie ze złożoną sezonowością niezbędne jest wcześniejsze usunięcie złożonego komponentu sezonowości z szeregów – w omawianym przypadku poprzez usunięcie rocznej sezonowości i pozostawienie tygodniowej. W celu dopasowania i strojenia modelu użyliśmy pakietu pyramid-arima w Pythonie, który to kopiuje dostępną w R funkcjonalność auto.arima przeszukującą automatycznie parametry modelu SARIMA. Ostatecznie, cały proces prognozowania przy omawianym zbiorze zajmuje prawie dwie doby na całkiem przyzwoitym PC. Pozwala jednak zmniejszyć średnie SMAPE do 14.897.

Przykładowa prognoza modelu SARIMA dla jednego sklepu (nr 6) i jednego produktu (nr 14)

VAR

Model wektorowej autoregresji (VAR) jest uogólnieniem modelu AR wspomnianego w poprzednim akapicie. Może on być aplikowany do wielowymiarowych szeregów czasowych i uwzględniać zależności między poszczególnymi zmiennymi modelu. Model ten nie ma silnej podbudowy teoretycznej i może być używany jedynie w celu tworzenia predykcji na temat przyszłych wartości modelu. Nie jest w stanie objaśnić zależności między szeregami czasowymi. Niestety, stosując ten model należy samodzielnie poradzić sobie z ewentualną sezonowością oraz niestacjonarnością szeregów.

Etapy naszego modelowania VAR:

  • Desezonalizacja danych treningowych,
  • Różnicowanie danych treningowych,
  • Modelowanie,
  • Prognozowanie,
  • Operacja sumowania prognozy,
  • Dodawanie sezonowości do prognozy.

W badanym zbiorze danych występuje 1826 obserwacji dla każdej serii czasowej. Nie jest to wystarczająca liczba, by użyć metody VAR do prognozowania wszystkich 500 szeregów na raz. Zamiast tego możliwe są dwa różne podejścia w tworzenia wielu modeli VAR: osobny model VAR dla każdego z sklepu (łącznie 10 modeli), oraz osobny model dla każdego produktu (łącznie 50 modeli). W każdym przypadku przed modelowaniem należy całkowicie usunąć sezonowość i zróżnicować zmienną celu aby pozbyć się niestacjonarności szeregu.

Analogicznie, odwrotne operacje muszą zostać nałożone na otrzymane prognozy. Na zbiorze walidacyjnym, podejścia z 10 oraz 50 osobnymi modelami VAR osiągają SMAPE odpowiednio 15.258 i 14.913. Zatem wybierając drugi, lepszy wariant do sprawdzenia na zbiorze testowym, można osiągnąć na nim wynik SMAPE 15.178.

Rozkład SMAPE na zbiorze walidacyjnym dla 10 modeli VAR – dla każdego sklepu

Rozkład SMAPE na zbiorze walidacyjnym dla 50 modeli VAR – dla każdego produktu

Rekomendacje

Przy prognozowaniu szeregów czasowych model Holta-Wintersa może być bardzo przydatny jako początkowy model bazowy, szczególnie przy niewielkiej liczbie szeregów do analizy. Nadaje się on bezpośrednio do aplikacji przy szeregach czasowych, w których występuje niestacjonarność i sezonowość. Radzi on sobie z nimi bez żadnej uprzedniej obróbki danych. SARIMA, umiejętnie użyta, może być jeszcze lepszym narzędziem do prognozowania i pozwala w dodatku na interpretację rezultatów. Niemniej posiada wiele parametrów i wymaga wiedzy by dobrać ich właściwe wartości.

VAR to technika obowiązkowo warta sprawdzenia przy wielowymiarowych szeregach czasowych. Model ten, mimo że nie radzi sobie z niestacjonarnością szeregów, jest świetnym narzędziem prognostycznym jeśli nie ma potrzeby interpretacji rezultatów. Nie jest on również wymagający obliczeniowo.


Powyższy post miał na celu opisać podstawowe, ekonometryczne metody prognozowania szeregów czasowych, które dobrze sprawdzają się jako modele bazowe lub w przypadku niewielkich zbiorów danych. Jeśli chcecie dowiedzieć się więcej na temat technik uczenia maszynowego oraz sprawdźcie nasz kod na GitHubie.

Artykuł został pierwotnie opublikowany na semantive.com. Zdjęcie główne artykułu pochodzi z unsplash.com.

baner

Wraz z Tomaszem Gańskim jestem współtwórcą justjoin.it - największego job boardu dla polskiej branży IT. Portal daje tym samym największy wybór spośród branżowych stron na polskim rynku. Rozwijamy go organicznie, serdecznie zapraszam tam również i Ciebie :)

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://geek.justjoin.it/prognozowanie-dziennej-sprzedazy-kazdego-produktu/" order_type="social" width="100%" count_of_comments="8" ]