Modul: Výpočet sezónnosti¶
Manažerský popis¶
Velká část algoritmů ve STOCKu je založená na funkčnostech, které dokáží předpovídat budoucí vývoj, popřípadě „vysvětlují“ vývoj minulý. Například dokáží odhadnout, kolik kusů zboží by se bylo prodalo v případě, že by v minulosti nedošlo k výpadku zásob tohoto zboží.
Aby toto X mělo relevantní vypovídající hodnotu, je velmi důležité zohlednit, v jakém období k danému výpadku došlo. Pokud by se například jednalo o pivo a výpadek by nastal v létě, potom bude X podstatně větší, než kdyby nastal výpadek uprostřed února.
Aby se v rámci analýzy výpadků nemusely provádět všechny výpočetní algoritmy, byl vytvořen zvláštní modul, který je na tyto výpočty vyhrazen a ostatní algoritmy jeho výsledky již jen používají.
Výpočet je založen na principu, který se snaží co nejpřesněji odhadnout sezónnost na skladové položce. Pokud nemá dostatek informací o položce, určuje postupně sezónnost celého produktu, kategorie, popřípadě celého portfolia společnosti. Vše je nastavitelné.
Algoritmus dokáže identifikovat i případy extrémních sezón, jako například Vánoce, popřípadě extrémně sezónní položky jako jsou velikonoční vajíčka.
Další úlohou modulu je také identifikace a potlačení tzv. falešných sezón, což jsou náhodně vysoké prodeje, které proběhly v rámci sezóny daného roku.
Funkční popis¶
Vstup sezónního algoritmu¶
Vstupem algoritmu jsou následující data v závislosti, zda jde o produkt na skladě nebo o samotný produkt napříč sklady:
- Produkt na skladě
- Časová řada produktu na skladě
- Časová řada produktu, do které patří daný produkt na skladě
- Časová řada nastavitelné kategorie, do které patří daný produkt na skladě
- Časová řada všech prodejů
- Produkt
- Časová řada produktu
- Časová řada nastavitelné kategorie, do které patří daný produkt
- Časová řada všech prodejů
Libovolnou vstupní časovou řadu lze v konfiguraci vypnout. Lze také v konfiguraci nastavit, která kategorie se použije pro určení sezónnosti.
Výstup algoritmu¶
Výstupem algoritmu jsou sezónní indexy všech produktů na skladě. Sezónními indexy se rozumí pole o velikosti 12, které pro každý měsíc určuje, jak velké byly prodeje v daném měsíci oproti ostatním. Sezónní index měsíce je poměr daného měsíce k průměru za všechny měsíce.
Pro sezónní index S tedy platí:
- S < 1 - měsíc byl podprůměrný
- S = 1 měsíc byl průměrný
- S > 1 měsíc byl nadprůměrný
Z definice indexů vyplývá, že součet všech sezónních indexů dává hodnotu 12.
Shrnutí průběhu algoritmu sezónnosti¶
Pro vysvětlení algoritmů účastnících se sezónnosti si shrňme celý algoritmus sezónnosti jeho znázorněním v diagramu:

Popis jednotlivých sezónních indexů:
- Ostré indexy - nevyhlazené sezonní indexy bez horního a dolního omezení.
- Silné indexy - vyhlazené sezonní indexy bez horního a dolního omezení.
- Slabé indexy - vyhlazené sezonní indexy s horním dolním omezením.
Princip algoritmu sezónnosti¶
Algoritmem prochází vstupní časové řady ve výše popsaném pořadí, dokud časová řada nemá dostatek dat. Algoritmus tedy stoupá po úrovních dokud nemá dostatek dat. Podmínka pro dostatek dat časové řady je definována takto:
- Řada musí mít alespoň daný počet měsíců (nyní 14 měsíců).
- Řada má alespoň 5 prodejních měsíců (měsíce s počtem prodaných kusů > 0).
- Řada má méně než 5 prodejních měsíců, ale některý kalendářní měsíc obsahuje více než 85% všech prodejů.
Po vybrání úrovně se přejde k určení sezónních indexů. Tyto indexy jsou určovány pouze na základě časové řady vybrané úrovně. Pro určení indexů jsou nyní používány dva algoritmy - algoritmus detekující ostré sezóny a klasický algoritmus. Jelikož ostré sezóny jsou náchylné na vyhlazení, které je používané v “klasickém algoritmu”, je nejprve časová řada předložena algoritmu detekující ostré sezóny. Potvrdí-li se ostrá sezóna, jsou použity indexy tohoto algoritmu. V opačném případě se předloží řada klasickému algoritmu a použijí se jeho indexy. Algoritmus ostré sezóny je nastaven tak, aby spínal pouze na jistých sezonách, typicky Velikonoce nebo Vánoce. Většina časových řad je tedy určena “klasickým algoritmem”.
Popis “algoritmu ostré sezóny”¶
U tohoto algoritmu je časová řada nejprve upravena následujícími kroky:
- Oříznutí na 3 roky historie (pouze je-li delší).
- Narovnání trendem, aby nebyly znevýhodněny slabší roky.
Takto upravená řada se “přeloží po rocích přes sebe” a pomocí průměrů se určí sezónní indexy. Například sezónní index měsíce ledna se tedy spočte jako průměr všech lednových měsíců v časové řadě za všechny roky.
Následně je pro časovou řadu a sezónní indexy spočteno skóre sezónnosti, které je použito i v dalších výpočtech. Skóre sezónnosti je tedy jakási metrika, která udává, do jaké míry odpovídají sezónní indexy dané časové řadě. Pro metriku platí, že čím je větší, tím více sezónní indexy odpovídají dané časové řadě. Se skórem sezónnosti se v systému běžně pracuje na základě tresholdů, například:
- x < -1 - nesezónní
- x >= -1 && x < 0.8 - nedefinovaná sezónnost
- x >= 0.8 - sezonní
Přesný postup měření skóre sezónnosti
Vstupem pro výpočet skóre sezónnosti jsou hodnoty upravené časové řady a výsledné sezónní indexy pro jednotlivé kalendářní měsíce. Pro popsání algoritmu bude používána následující notace:
- Gi - množina seskupených hodnot za daný kalendářní měsíc, například G2 obsahuje všechny únorové hodnoty časové řady.
- AVGi - sezónní index v i-tém kalendářním měsíci, značení AVG bylo použito pro naznačení výpočtu sezónních indexů. Ty jsou počítány pomocí průměrů z množin Gi.
- STDi - standardní odchylka i-tého kalendářního měsíce vypočítána z množiny Gi .
Každý sezónní index I patří {1..12} přispěje skóre sezónnosti svým příspěvkem addi. Ten se spočte následujícím způsobem:
Jestliže platí následující podmínka pokračuje se ve výpočtu příspěvku dále popsaným způsobem. V opačném případě je příspěvek sezónního indexu addi = 0.
- Gi je velká alespoň 2
- Musí platit alespoň jedna z podmínek:
- Počet nulových sezónních indexů AVGi je menší nebo roven 4
- AVGi - STDi > 0
Je-li podmínka pro pokračování výpočtu splněna, je příspěvek sezónního indexu určen následujícím způsobem:
- Jestliže AVGi > = 1, pak příspěvek sezónního indexu je addi = AVGi - STDi - 1
- Jestliže AVGi < 1, pak příspěvek sezónního indexu je addi = 1 - (AVGi + STDi)
Výsledné skóre sezónnosti je rovno součtu všech příspěvků sezónních indexů, které jsou shora omezeny číslem 5. Skóre sezónnosti se spočte tedy jako:
I patří {1..12}
S = sumi(min(addi,5))
Použití sezónních indexů ostré sezóny
Sezonní indexy spočtené v algoritmu ostré sezóny jsou použity v případě, že platí jedna z následujících podmínek:
- Podmínka pro Velikonoce
- Časová řada obsahuje alespoň 500 prodejů.
- Časová řada musí mít alespoň dvě velikonoční sezony. Tzn. ve velikonočním měsíci se prodává a v měsíci poté jsou slabé prodeje.
- Standardní podmínka
V textu této podmínky je sezónními indexy myšleno výsledné pole o velikosti 12, kde i-tý index odpovídá sezonnímu indexu i-tého kalendářního měsíce.
- Skóre sezónnosti (viz výše) je větší než treshold (nyní 4.0).
- Alespoň jeden sezónní index je vetší než treshold (nyní 4.0).
- Alespoň 8 sezonních indexů je menší než treshold (nyní 0.5).
- Sezonní indexy obsahují pouze jeden „kopec“. Tzn. všechny indexy větší než treshold (nyní 0.05) vytvoří jeden souvislý blok bez mezery, nebo vytvoří dva souvislé bloky bez mezery, z nichž jeden začíná lednem a druhý končí prosincem. Druhá podmínka umožňuje vytvořit i „kopec“ mezi prosincem a lednem.
Popis “klasického algoritmu”¶
U tohoto algoritmu je časová řada nejprve upravena následujícími kroky:
- Oříznutí na 3 roky historie (pouze je-li delší).
- Očištění od velmi malých hodnot.
- Vyhlazení váženým klouzavým průměrem (0.25, 0.50, 0.25).
- Narovnání trendem, aby nebyly znevýhodněny slabší roky.
Takto upravená řada se “přeloží po rocích přes sebe” a pomocí průměrů se určí sezónní indexy. Například sezónní index měsíce ledna se tedy spočte jako průměr všech lednových měsíců v časové řadě za všechny roky.
Výše popsané sezónní indexy jsou spočteny pro všechny časové řady, ale u všech nemusí být konečné. U nesezónních řad s náhodnými vysokými prodeji se vyskytují příliš vysoké indexy, které mají špatný vliv na chod některých algoritmů. Proto je časová řada ještě vystavena testu na potvrzení sezónnosti. Je-li test úspěšný, jsou výsledkem celého algoritmu silné indexy v opačném případě slabé indexy.
- Silné indexy - jsou syrové indexy tak, jak byly určeny. Žádné úpravy na ně nebyly aplikovány.
- Slabé indexy - indexy určené algoritmem jsou upraveny tak, aby nabývaly pouze definovaných hraničních hodnot (nyní 0,7 - 1,3). Vliv sezónnosti je u těchto indexů potlačen, nevymizí však úplně. To, že nevymizí úplně, je výhodou například u časových řad, kde je sezónnost na hranici. Omezení indexů naopak pomáhá u nesezónních a sporadických časových řad.
Potvrzení sezónnosti u klasického algoritmu
Výsledkem celého algoritmu sezónnosti jsou tedy buď silné nebo slabé indexy. Které indexy jsou použity, určuje algoritmus na potvrzení sezónnosti. Tento algoritmus se standardně řídí následujícími pravidly:
- Nejprve vybere všechny vrcholy „kopců“ v sezónních indexech, které jsou vyšší než definovaná mez (nyní 2,0).
- Aby byla sezónnost potvrzena, musí pro každý vrchol (kopce) existovat alespoň dva roky s - sezónní index ve vrcholném měsíci byl vyšší než definovaná prahová hodnota (nyní nastavená na 1,5). - tržby ve špičce musí být vyšší než jedna pětina největších prodejů v daném měsíci v jednom z let: tím je zajištěno, že náhodný malý prodej není akceptován jako sezóna.
Existuje však výjimka pro potvrzení sezónnosti pro definované měsíce v konfiguraci. Pro nastavené měsíce v konfiguraci platí slabší pravidla pro potvrzení sezónnosti. Například stačí pouze jedna potvrzená sezóna. Této konfigurace se využívá například k lepšímu odchycení sezónnosti o Vánocích.
Konfigurace¶
Nejdůležitější součástí konfigurace jsou dvě nastavení.
Prvním je stanovení typu kategorie, která bude uplatněna při určování sezónnosti dle kategorií. Je možné zvolit libovolnou produktovou kategorii, ideálně co nejníže v produktovém stromu, aby bylo zaručeno, že produkty dané kategorie mají stejné sezónní vlastnosti. Například v automotive nemůžeme zvolit kategorii pneumatiky, ale až podkategorii, která se dělí na letní a zimní.
Další důležité nastavení je nastavení, které z měsíců jsou považovány ze sezónní, i když algoritmicky měsíce nevykazují všechny charakteristické znaky sezónnosti. Standardně je nastaven prosinec - Vánoce, únor a březen - Velikonoce. V případě, že prodáváme hračky, a některý z produktů vykazuje v prosinci silný prodej, tak to není dílem náhody, ale je to fakt, který je nutné akceptovat i přes to, že v loňském roce byl prodej stejného produktu slabý.