Pareto pravidlo, známe také jako pravidlo 80/20 říká, že obvykle 80 % příčin pramení z 20 % důsledků. Pareto princip můžeme aplikovat na různé oblasti zájmu. V tomto příkladu použijeme pravidlo 80/20 na rozdělení produktů do dvou kategorií s cílem identifikovat ty produkty, jejichž prodeje tvoří 80 % celkových tržeb. Druhá kategorie bude obsahovat produkty, jejichž prodeje tvoří zbylých 20 % tržeb. Počet produktů, které tvoří 80 % tržeb, by měl podle tohoto pravidla tvořit přibližně 20% podíl z celkového počtu produktů.
Pro vytvoření příkladu použijeme cvičnou databázi v Power BI souboru Adventure Works DW 2020.pbix. Soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.
V použitém modelu budeme pracovat pouze se dvěma tabulkami, tabulkou 'Sales' a tabulku 'Product'.
Tabulka 'Sales' obsahuje záznamy o prodejích produktů. V tabulce 'Sales' nás bude zajímat především sloupec 'Sales'[Sales Amount], který obsahuje částky za prodeje produktů. V tabulce 'Product' jsou k dispozici všechny produkty, které chceme rozdělit do dvou kategorií právě podle sumy prodejů pro daný produkt. Nejdříve si tedy vytvoříme měřítko, které bude počítat sumu za prodané produkty v aktuálním kontextu vyhodnocení.
Měřítko:
Měřítko [Suma prodejů] budeme používat ve většině výpočtů a bude představovat hlavní kritérium pro rozdělení produktů do kategorií podle Paretova pravidla.
Pareto analýza v jazyku DAX
Pareto analýza s pomocnými sloupci
1. Vytvoření sloupce se sumou prodejů pro jednotlivé produkty
Počítaný sloupec:
Výsledkem je nový počítaný sloupce se sumou prodejů pro jednotlivé produkty.
Nový počítaný sloupec obsahuje sumu prodejů pro jednotlivé produkty z tabulky 'Sales'. Pokud pro daný produkt není v aktuálním řádku žádná hodnota, znamená to, že daný produkt nemá žádné záznamy o prodejích v tabulce 'Sales'. Druhým krokem je výpočet kumulativních prodejů, od nejvyšší částky po nejnižší.
2. Vytvoření sloupce s kumulativním součtem prodejů, s řazením od nejvyšší částky po nejnižší
Počítaný sloupec:
Výše uvedený výpočet je nejsložitější z celého příkladu. Pro lepší představu, jak výpočet funguje, musíme oddělit první tabulku 'Product', ve které vytváříme nový počítaný sloupec, a druhou tabulku 'Product', kterou filtrujeme ve funkci FILTER(). Jelikož obě dvě tabulky obsahují sloupec 'Product'[Prodeje produktu], musíme použít funkci EARLIER() pro přístup k aktuální hodnotě ze sloupce 'Product'[Prodeje produktu] ve vnější tabulce, ve které tvoříme nový počítaný sloupec. Funkce SUMX() má v každém řádku první tabulky, ve které vytváříme nový počítaný sloupec, k dispozici stejnou tabulku 'Product', která je ale zafiltrovaná podle hodnoty prodejů pro jednotlivé produkty, které jsou větší nebo rovny než hodnota prodejů pro aktuální produkt v tabulce, ve které je výpočet vyhodnocen. V takto zafiltrované tabulce sečteme v každém řádku nového počítaného sloupce všechny dostupné hodnoty ze sloupce 'Product'[Prodeje produktu].
Výsledkem je druhý počítaný sloupec, obsahující kumulativní součet prodejů, seřazený od nejvyšší hodnoty prodejů po nejnižší.
3. Procentuální podíl kumulativních prodejů ve vztahu k celkovým prodejům
Počítaný sloupec:
Funkce DIVIDE() vrací výsledek po dělení prvního argumentu funkce hodnotou ve druhém argumentu funkce. V případě dělení nulou vrací tato funkce hodnotu BLANK(), případně alternativní výsledek, pokud by byl zadaný.
Prvním argumentem funkce je odkaz na sloupec 'Product'[Prodeje kumulativně], čímž v každém řádku tabulky načteme aktuální hodnotu z tohoto sloupce. Druhým argumentem funkce DIVIDE() je výraz SUM('Product'[Prodeje produktu]). V tomto případě nemůžeme použít měřítko [Suma prodejů], protože to by vracelo stejnou hodnotu, jako je hodnota ve sloupci 'Product'[Prodeje produktu], díky funkci CALCULATE() na pozadí každého měřítka. Tím, že použijeme přímo funkci SUM(), která ignoruje kontext řádku, získáme v každém řádku tabulky dělitele se sumou celkových prodejů pro všechny produkty.
4. Rozdělení produktů do dvou kategorií
Počítaný sloupec:
Výsledek je nový počítaný sloupec, díky kterému máme produkty rozdělené do kategorií podle Paretova principu.
Protože je výsledkem celého výpočtu nový počítaný sloupec, můžeme tento sloupec použít v reportech v řádcích tabulky, v grafech nebo v průřezech pro filtrování ostatních vizuálů.
Měřítka:
Nyní můžeme vložit hodnoty ze sloupce 'Product'[Kategorie 80/20] do řádků tabulky, a měřítka [Suma prodejů], [Počet produktů] a [% Počet produktů] do vizuálu tabulky.
Na obrázku výše můžeme vidět jednoduchou tabulku, ze které vyplývá, že 87 produktů z celkového množství 397 produktů tvoří téměř 80 % všech tržeb. Do vizuálu si samozřejmě přidat také samotné produkty a podívat se tak, které produkty patří do které kategorie.
Pohledů bychom mohli vytvořit více, nicméně cílem příkladu je vytvoření samotné analýzy. Podívejme se proto ještě na to, jak vytvořit celý výpočet v jednom kroku v jednom počítaném sloupci.Pareto analýza v jednom kroku
Výše uvedený příklad rozdělený do čtyř navazujících kroků můžeme celý vypočítat v jednom kroku v jednom počítaném sloupci. Pro zjednodušení můžeme použít proměnné, do kterých si jednotlivé mezivýpočty uložíme pro jejich další použití. Definice celého výpočtu v jednom počítaném sloupci může vypadat následovně.
Počítaný sloupec:
Pokud bychom chtěli stejný počítaný sloupec vytvořit bez použití proměnných, výpočet by mohl vypadat následovně.
Počítaný sloupec:
Princip výpočtu bez použití proměnných je pořád stejný, pouze musíme jednotlivé kroky vnořit do sebe. Za zmínku stojí použití funkce EARLIEST(), namísto funkce EARLIER(). Funkce EARLIER(), kterou jsme použili pro přístup k vnější tabulce v případě výpočtu rozděleného do jednotlivých sloupců, vrací hodnotu ze sloupce v předchozí iteraci, než ve které je použita. V počítaném sloupci [Kategorie 80/20 vše v jednom bez proměnných] máme více vnořených iteračních funkcí, které obsahují sloupec 'Product'[ProductKey]. Pokud chceme přeskočit všechny iterační funkce k té nejvíce vnější, můžeme použít právě funkci EARLIEST(). Stejného výsledku bychom dosáhly s funkcí EARLIER(), pouze bychom museli definovat druhý argument této funkce, který by obsahoval počet přeskočených iteračních funkcí. V tomto případě by se jednalo o číslo 2 ve druhém argumentu funkce EARLIER().
Shrnutí
Celý výpočet můžeme použít univerzálně pro různé druhy kritérií. Pokud máme k dispozici potřebná data, můžeme díky Pareto analýze dostat rychlý přehled o konkrétní situaci. S malou úpravou můžeme stejný výpočet použít také pro tzv. ABC analýzu produktů. Současně může být celý příklad dobrým cvičením, jak je možné pracovat s jazykem DAX a jak můžeme stejného výsledku dosáhnout různými způsoby. Zejména technika přístupu k hodnotám ze sloupců v různých úrovních ve vnořených iteracích může být užitečná také v mnoha jiných výpočtech.
Komentáře
Okomentovat