ABC analýza v Power BI a v jazyku DAX

Úvodní obrázek

V ABC analýze pracujeme s položkami a kritérii, podle kterých položky zařazujeme do třech kategorií. Uvažujme například produkty jako položky a tržby jako kritérium. Produkty v kategorií A tvoří 70 % kumulativních tržeb, produkty v kategorii B jsou v rozmezí 70 až 90 % a zbylých 10 % tržeb tvoří produkty v kategorii C. V tomto příspěvku si ukážeme různé varianty ABC analýzy v Power BI a v jazyku DAX.

K tomuto tématu je k dispozici také video:

Jak již bylo uvedeno výše, v ABC analýze pracujeme s položkami určenými k zatřídění do kategorií a s kritériem. V tomto příspěvku budeme zařazovat do kategorií produkty podle tržeb za prodeje těchto produktů.

ABC analýza v Power BI a v jazyku DAX

Než se přesuneme k samotným příkladům, můžeme si pomocí následujícího obrázku osvěžit princip ABC analýzy.

ABC analýza v Power BI a v jazyku DAX 2

Jako položky pro zatřídění do kategorií budeme používat produkty a jako kritérium měřítko [Prodeje]. Základem pro výpočet ABC analýzy jsou kumulativní prodeje, a to vždy od produktu s nejvyššími prodeji po produkt s nejnižšími prodeji. Tyto kumulativní prodeje následně převádíme na procentuální vyjádření, a to jednoduchým vydělením kumulativních prodejů aktuálního produktu celkovými prodeji. Procentuální vyjádření kumulativních prodejů je pak kritériem pro zařazení produktů do jednotlivých kategorií. Produkty v kategorii A tvoří maximálně 70 % kumulativních prodejů. Produkty v kategorii B jsou mezi 70 a 90 %. Zbylé produkty nad 90 % jsou v kategorii C.

V první části příspěvku si ukážeme, jak zařadit produkty do jednotlivých kategorií dynamicky pomocí DAX výpočtu v měřítku. V druhé části příspěvku si ukážeme, jak vytvořit měřítko, které bude přímo vracet příslušnou kategorii, do které aktuální produkt v aktuálním řádku vizuálu patří. 

Všechny výpočty zobrazené v tomto příspěvku budou plně dynamické a budou tak reagovat na všechny filtry. To znamená, že pokud vytvoříme v reportu pomocí průřezu filtr například na konkrétní rok, do jednotlivých kategorií budou zařazeny pouze produkty prodávané v tomto vybraném roce, a to podle tržeb ve vybraném období. Stejným způsobem můžeme ovlivňovat výsledek měřítek jakýmkoliv filtrem z jakékoliv tabulky v použitém Adventure Works modelu. 

Soubor s řešením najdete jako obvykle níže pod tímto příspěvkem.

ABC analýza produktů dynamicky v měřítku

V příkladech budeme pracovat s jednoduchým vizuálem matice, který bude v řádcích obsahovat názvy produktů a v hodnotách měřítko [Prodeje].

ABC analýza v Power BI a v jazyku DAX 3

V měřítku [Prodeje] jednoduše sčítáme částky za prodeje produktů ze sloupce 'Sales'[Sales Amount].

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Abychom mohli zobrazovat jednotlivé kategorie v řádcích vizuálů, musíme si tyto kategorie uložit do tabulky nahrané v modelu. To můžeme udělat jednoduše pomocí počítané tabulky.

Počítaná tabulka:

ABC =
SELECTCOLUMNS
(
    {"A", "B", "C"},
    "Kategorie",
    [Value]
)

Nová tabulka má jeden sloupec a tři řádky s názvy kategorií.

ABC analýza v Power BI a v jazyku DAX 4

Tuto parametrickou tabulku nebudeme připojovat k ostatním tabulkám v modelu pomocí relací. Celý vztah mezi jednotlivými kategoriemi a produkty bude zachycen dynamicky v rámci DAX výpočtu v měřítku.

Pokud vložíme hodnoty ze sloupce 'ABC'[Kategorie] na první místo do řádků našeho vizuálu matice, výsledek bude vypadat následovně.

ABC analýza v Power BI a v jazyku DAX 5

Nyní ještě jednotlivé kategorie nijak nefiltrují měřítko [Prodeje] ani produkty v řádcích, protože tabulka 'ABC' je odpojená od modelu. Pod každou kategorií tak vidíme všechny produkty a jejich prodeje.

Měřítko, které bude reagovat na jednotlivé kategorie a zobrazovat prodeje pouze pro ty produkty, které patří do příslušné kategorie, může vypadat například následovně.

Měřítko:

Prodeje ABC =
VAR ProduktyAProdeje =
    ADDCOLUMNS
    (
        ALLSELECTED('Product'[Product]),
        "@Prodeje",
        [Prodeje]
    )
VAR ProdejeVsechnyProdukty = CALCULATE([Prodeje], ALLSELECTED('Product'[Product]))
VAR ProduktyAKategorie =
    ADDCOLUMNS
    (
        ProduktyAProdeje,
        "@ABC",
        VAR ProdejeAktualniProdukt = [@Prodeje]
        VAR ProdejeKumulativne =
            SUMX
            (
                FILTER
                (
                    ProduktyAProdeje,
                    [@Prodeje] >= ProdejeAktualniProdukt
                ),
                [@Prodeje]
            )
        VAR ProdejeKumulativneProcenta = DIVIDE(ProdejeKumulativne, ProdejeVsechnyProdukty)
        VAR ABCKategorie =
            SWITCH
            (
                TRUE(),
                ProdejeKumulativneProcenta <= 0.7, "A",
                ProdejeKumulativneProcenta <= 0.9, "B",
                "C"
            )
        RETURN
            ABCKategorie
    )
VAR VybraneKategorie = VALUES(ABC[Kategorie])
VAR ProduktyVeVybranychKategoriich =
    FILTER
    (
        ProduktyAKategorie,
        [@ABC] IN VybraneKategorie
    )
VAR Vysledek =
    CALCULATE
    (
        [Prodeje],
        KEEPFILTERS(ProduktyVeVybranychKategoriich)
    )
RETURN
    Vysledek

Měřítko [Prodeje ABC] je díky použití proměnných více méně samopopisné. První proměnná s názvem ProduktyAProdeje obsahuje virtuální tabulku se všemi produkty a jejich prodeji. Tato virtuální tabulka je následně použita dvakrát v proměnné ProduktyAKategorie. Poprvé v prvním argumentu funkce ADDCOLUMNS(), a podruhé v proměnné ProdejeKumulativne, kde znovu načítáme všechny produkty a jejich prodeje a sčítáme pouze prodeje za ty produkty, které mají prodeje vyšší nebo rovno aktuálnímu produktu v aktuální iteraci, kterou tvoří funkce ADDCOLUMNS(). Abychom byli schopni zařadit produkty do kategorií, potřebujeme zjistit procentuální podíl kumulativních prodejů vůči prodejům za všechny produkty. Tuto hodnotu získáme v proměnné ProdejeKumulativneProcenta. V proměnné ABCKategorie následně zařazujeme produkty do jednotlivých kategorií pomocí funkce SWITCH().

Tabulka uložená v proměnné ProduktyAKategorie tedy obsahuje všechny produkty, jejich prodeje a kategorie produktů podle ABC pravidla. Tuto virtuální tabulku se třemi sloupci následně filtrujeme v proměnné ProduktyVeVybranychKategoriich pouze na ty produkty, které patří do kategorie nebo kategorií, které jsou dostupné v aktuálním kontextu filtru. Takto zafiltrovaná tabulka je následně použita ve filtru funkce CALCULATE() před vyhodnocením měřítka [Prodeje]

Ačkoliv virtuální tabulka v proměnné ProduktyVeVybranychKategoriich obsahuje tři sloupce - názvy produktů, prodeje a ABC kategorie, pouze sloupec 'Product'[Product] efektivně filtruje model, protože ostatní dva sloupce jsou sloupce vytvořené v rámci DAX výpočtu a nemají tak Lineage Tag shodný s některým ze sloupců nahraných v modelu.

Pokud nové měřítko [Prodeje ABC] vložíme do vizuálu matice namísto měřítka [Prodeje], výsledek bude vypadat následovně.

ABC analýza v Power BI a v jazyku DAX 6

Nyní se jednotlivé produkty zobrazují pod příslušnou kategorií, do které každý produkt patří. To můžeme lépe vidět v případě, kdy použijeme připravené průřezy a zafiltrujeme model pouze na jednu kategorii a jeden rok.

ABC analýza v Power BI a v jazyku DAX 7

Měřítko [Prodeje ABC] je plně dynamické. Pokud tedy filtrujeme model na rok 2018 a na kategorii Clothing, do jednotlivých ABC kategorií jsou zařazeny pouze produkty z vybrané kategorie, a to podle prodejů za příslušný rok vybraný v průřezu. Stejný produkt by tak v jiných letech, nebo obecně v jiném období, mohl patřit do jiné kategorie, opět podle prodejů tohoto produktu v aktuálním období ve vztahu k prodejům za všechny vybrané produkty ve stejném období.

V následující části příspěvku si ukážeme, jak vytvořit měřítko, které bude přímo vracet název kategorie, do které aktuální produkt patří.

Kategorie produktů podle ABC pravidla dynamicky v měřítku

Výhodou měřítka, které bude přímo vracet kategorie produktů podle ABC pravidla je, že nemusíme tvořit parametrickou tabulku a samotný výpočet je také mírně jednodušší než u varianty v předchozí části příspěvku. Nevýhodou pak je, že podle hodnot, které vrací měřítko nemůžeme filtrovat nebo shlukovat jednotlivé produkty.

Měřítko, které bude vracet přímo kategorie produktů podle ABC pravidla, může vypadat například následovně.

Měřítko:

ABC podle prodejů =
VAR ProduktyAProdeje =
    ADDCOLUMNS
    (
        ALLSELECTED('Product'[Product]),
        "@Prodeje",
        [Prodeje]
    )
VAR ProdejeVsechnyProdukty = CALCULATE([Prodeje], ALLSELECTED('Product'[Product]))
VAR ProdejeAktualniProdukt = [Prodeje]
VAR ProdejeKumulativne =
    SUMX
    (
        FILTER
        (
            ProduktyAProdeje,
            [@Prodeje] >= ProdejeAktualniProdukt
        ),
        [@Prodeje]
    )
VAR ProdejeKumulativneProcenta =
    DIVIDE(ProdejeKumulativne, ProdejeVsechnyProdukty)
VAR ABCKategorie =
    SWITCH
    (
        TRUE(),
        ProdejeKumulativneProcenta <= 0.7, "A",
        ProdejeKumulativneProcenta <= 0.9, "B",
        "C"
    )
VAR Vysledek = IF(HASONEVALUE('Product'[Product]), ABCKategorie)
RETURN
    Vysledek

Stejně jako v měřítku [ABC prodeje], tak i v měřítku [ABC podle prodejů] je klíčem k zařazení produktů do jednotlivých kategorií virtuální tabulka s produkty a jejich prodeji v proměnné ProduktyAProdeje.

V proměnné ProdejeKumulativne je tato tabulka použita ve funkci FILTER(), kde je zafiltrována pouze na ty produkty, které mají prodeje vyšší nebo rovno aktuálnímu produktu v aktuálním řádku vizuálu. Následně jsou sečteny prodeje za tyto produkty pomocí funkce SUMX(). Pokud kumulativní prodeje vydělíme prodeji za všechny produkty zobrazené ve vizuálu, dostaneme procentuální vyjádření kumulativních prodejů, což je klíčová hodnota pro zařazení aktuálního produktu do jedné z kategorií. Výsledek měřítka tentokrát dává smysl zobrazovat pouze v kontextu konkrétních produktů, proto ještě před vypsáním výsledku ověřujeme, jestli je měřítko vyhodnoceno v kontextu pouze jednoho produktu.

Měřítko [ABC podle prodejů] již tedy bude vracet přímo kategorie podle ABC pravidla, a proto již nebudeme v řádcích vizuálu používat hodnoty z dříve vytvořené parametrické tabulky 'ABC', která je užitečná pouze při použití s měřítkem [ABC prodeje].

ABC analýza v Power BI a v jazyku DAX 8

V použitém modelu je celá řada produktů, a proto ve vizuálu na obrázku výše vidíme pouze produkty v kategorii A. Protože i měřítko [ABC podle prodejů] je plně dynamické, můžeme si zobrazit výsledky tohoto měřítka pouze pro produkty za jeden rok a jednu kategorii produktů.

ABC analýza v Power BI a v jazyku DAX 9

Jak můžeme vidět na obrázku výše, tak v roce 2018 tvořilo pouze 7 produktů z kategorie Clothing téměř 70 % tržeb z celkových prodejů produktů z této kategorie. Produkty v kategoriích B a C pak tvořili zbylých přibližně 30 % tržeb z celkových prodejů produktů v kategorii vybrané v průřezu za rok 2018.

Shrnutí

Výhodou vytvoření ABC analýzy dynamicky přímo v měřítku je možnost analyzovat položky v různých kontextech filtru. Díky tomu můžeme v jednom reportu vidět, jak jsou například produkty zařazeny do ABC kategorií v různých letech nebo v různých kategoriích.

Nevýhodou tohoto dynamického řešení pak může být rychlost vyhodnocení výpočtů. V použitém cvičném modelu je pouze 295 produktů, a obě varianty výpočtů zobrazených v tomto příspěvku jsou vyhodnoceny v řádu nižších desítek milisekund. Pokud by ale položek pro zařazení do kategorií bylo násobně více, řádově desetitisíce a více, může být rychlost vyhodnocení obou variant výpočtů problém a důvod pro určitou formu optimalizace.

Stáhnout soubor s řešením.
č. 122

Komentáře