Vývoj počtu zákazníků v čase v Power BI a v jazyku DAX

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX

Vytvořit v PowerBI report mapující vývoj počtu zákazníků v čase, nebo obecně jakékoliv jiné metriky, pro kterou máme k dispozici data, je relativně jednoduchá úloha. V tomto příspěvku je zobrazen příklad výpočtu počtu zákazníků v různých časových obdobích, porovnání počtu zákazníků s předcházejícím obdobím a výpočet procentuálních rozdílů mezi počty zákazníků v aktuálním a předchozím období pomocí jazyka DAX.

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

Příklady jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix. Soubor s řešením je pak dostupný ke stažení níže pod tímto příspěvkem.

Vývoj počtu zákazníků v čase

V použitém cvičném Power BI souboru budeme pracovat se třemi tabulkami. Tabulka 'Date' je klasická kalendářní tabulka. Tabulka 'Internet Sales' obsahuje záznamy o prodaných produktech, mimo jiné s atributem dne, ve kterém došlo k prodeji. Tabulka 'Customer' představuje tabulku obsahující záznamy o jednotlivých zákaznících, nicméně bez jakéhokoliv časového atributu. To znamená, že v tabulce 'Customer' nejsou k dispozici informace o tom, v jakém čase byl daný zákazník aktivní a nakupoval produkty. Tyto údaje jsou k dispozici v tabulce 'Internet Sales', která obsahuje podrobné informace o každé objednávce, včetně zákazníků a dne uskutečnění nákupu. Tabulky, se kterými budeme v tomto příkladu pracovat, jsou v modelu propojeny relacemi zobrazenými na následujícím obrázku.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 2

Jak je možné vidět na obrázku výše, tabulka 'Date' a tabulka 'Customer' mohou obě filtrovat tabulku 'Internet Sales'. Na druhou stranu, v modelu vytvořené relace neumožňují propagaci filtrů z tabulky 'Date' k tabulce 'Customer'. Pokud bychom chtěli například zobrazit počty zákazníků v jednotlivých letech a měsících, následující výpočet nebude fungovat.

Měřítko:

Počet zákazníků (Nefunkční) = COUNTROWS(Customer)

Jak můžeme vidět na následujícím obrázku, filtr vytvořený hodnotami měsíců a let v řádcích a sloupcích vizuálu Matice neovlivňuje výsledek měřítka [Počet zákazníků (nefunkční)], protože filtr působící na měřítko není propagován přes relace z tabulky 'Date' k tabulce 'Customer'.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 3

Hodnota měřítka je v každé buňce vizuálu stejná, a představuje počet všech zákazníků, kteří mají záznam v tabulce 'Customer'.

Jak už to tak v jazyku DAX bývá, způsobů jak dosáhnout stejného výsledku je obvykle více. Jednou z možností, jak získat počet zákazníků, kteří nakupují v určitém časovém období, je dočasně aktivovat obousměrnou propagaci filtrů mezi tabulkou 'Internet Sales' a tabulkou 'Customer'. Obousměrné filtrování můžeme aktivovat v době vyhodnocení výpočtu ve funkci CALCULATE() pomocí funkce CROSSFILTER() následujícím způsobem.

Měřítko:

Počet zákazníků (crossfilter) =
CALCULATE
(
    COUNTROWS(Customer),
    CROSSFILTER
    (
        'Internet Sales'[CustomerKey],
        Customer[CustomerKey],
        Both
    )
)

Nyní již měřítko vrací správné hodnoty, tedy jedinečný počet zákazníků, kteří uskutečnili alespoň jeden nákup v daném časovém období, kdy období je definované měsícem a rokem v řádcích a sloupcích vizuálu.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 4

Další možností, jak dosáhnout stejného výsledku, je spočítat počet jedinečných hodnot ve sloupci 'Internet Sales'[CustomerKey].

Měřítko:

Počet zákazníků = DISTINCTCOUNT('Internet Sales'[CustomerKey])

Ve výše uvedeném výpočtu již nepracujeme přímo s tabulkou 'Customer'. Počet zákazníků nakupujících produkty v čase totiž můžeme zjistit také z tabulky 'Internet Sales', protože ta obsahuje jedinečný identifikátor každého zákazníka, který nakoupil alespoň jeden produkt. Počet jedinečných identifikátorů každého zákazníka v tabulce 'Internet Sales' vrací stejné výsledky, jako počet řádků z tabulky 'Customer', což byl případ předcházejícího výpočtu v měřítku [Počet zákazníků (crossfilter)].

V našem příkladu pak můžeme použít následující ekvivalentní výpočet počtu jedinečných hodnot ze sloupce 'Internet Sales'[CustomerKey].

Měřítko:

Počet zákazníků = SUMX(VALUES('Internet Sales'[CustomerKey]), 1)

Ve výše uvedeném výpočtu pak nejdříve pomocí funkce VALUES() načteme všechny jedinečné hodnoty ze sloupce 'Internet Sales'[CustomerKey] dostupné v aktuálním kontextu vyhodnocení. V tabulce s jedním sloupcem vytvořené pomocí funkce VALUES() pak následně pomocí funkce SUMX() spočítáme počet řádků.

Výsledek obou výše uvedených výpočtů bude v použitém modelu stejný. Měřítko [Počet zákazníků] ale budeme používat v dalších výpočtech, a zde bude v našem konkrétním příkladu z pohledu výkonu rychleji vyhodnocena druhá varianta výpočtu s použitím funkce SUMX(). I zde ale platí, že pokud vybíráme z více variant stejných výpočtů, měli bychom provést měření a až následně se rozhodnout pro jednu nebo druhou variantu výpočtu, protože rychlost vyhodnocení výpočtů je ovlivněna mnoha faktory.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 5

Nyní, když již dokážeme určit počet zákazníků, kteří nakupují zboží v určitém čase, můžeme si vytvořit odvozené měřítko, které bude vracet v aktuálním období hodnotu měřítka [Počet zákazníků] za předcházející rok. Logika následujícího výpočtu je podrobněji popsána v samostatném příspěvku.

Měřítko:

Počet zákazníků (předchozí rok) =
VAR PosledniDenSProdeji =
    CALCULATE
    (
        MAX('Internet Sales'[Order Date]),
        REMOVEFILTERS()
    )
VAR Vypocet =
    CALCULATE
    (
        [Počet zákazníků],
        CALCULATETABLE
        (
            DATEADD('Date'[Date], -1, YEAR),
            FILTER
            (
                VALUES('Date'[Date]),
                'Date'[Date] <= PosledniDenSProdeji
            )
        )
    )
VAR Vysledek =
    IF
    (
        HASONEVALUE('Date'[Rok]),
        Vypocet
    )
RETURN
    Vysledek

Jak je možné vidět na následujícím obrázku, pokud přesuneme roky ze sloupců vizuálu Matice do řádků, a přidáme nové měřítko [Počet zákazníků (předchozí rok)], můžeme si snadno porovnat počet zákazníků v aktuálním období se stejným obdobím v předchozím roce.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 6

Pokud bychom chtěli vidět přímo rozdíl mezi počtem zákazníků v aktuálním období a počtem zákazníků v minulém roce, můžeme jednoduše vypočítat rozdíl mezi měřítky [Počet zákazníků] a [Počet zákazníků (předchozí rok)].

Měřítko:

Nárůst zákazníků (meziročně) =
VAR PocetZakazniku = [Počet zákazníků]
VAR PocetZakaznikuPredchoziRok = [Počet zákazníků (předchozí rok)]
VAR Vypocet =
    IF
    (
        NOT ISBLANK(PocetZakazniku) &&
        NOT ISBLANK(PocetZakaznikuPredchoziRok) &&
        HASONEVALUE('Date'[Rok]),
        PocetZakazniku - PocetZakaznikuPredchoziRok
    )
RETURN
    Vypocet

Nové měřítko můžeme vložit do vizuálu Matice a na první pohled tak vidět, jaký je rozdíl mezi počtem zákazníků v aktuálním období v porovnání se stejným obdobím v předchozím roce.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 7

Pokud bychom chtěli vidět procentuální růst počtu zákazníků, výpočet bude opět velmi jednoduchý.

Měřítko:

% Nárůst zákazníků (meziročně) =
DIVIDE
(
    [Nárůst zákazníků (meziročně)],
    [Počet zákazníků (předchozí rok)]
)

Pokud nové měřítko vložíme do vizuálu v Power BI reportu, výsledek může vypadat následovně.

Vývoj počtu zákazníků v čase v PowerBI a v jazyku DAX 8

Jak můžeme vidět na obrázku výše, tak například v roce 2019 měl prodejce v použitém modelu každý měsíc více zákazníků, než v předcházejícím roce 2018.

Shrnutí

Jak bylo možné vidět na příkladu v tomto příspěvku, vytvořit report mapující vývoj počtu zákazníků je v Power BI, nebo obecně v jazyku DAX, relativně jednoduchá úloha. Takto vytvoření report je otázkou několika málo minut, a může být vytvořen obdobným způsobem v Power BI, v Excelu nebo v kterémkoliv jiném nástroji, který má k dispozici Tabulární model. Stejně tak může být s malými úpravami výše uvedený postup aplikován na jiné metriky, jako například na počet prodaných produktů, sumu utrženou za prodané produkty, vynaložené náklady na výrobu, a mnohé další, v závislosti na dostupnosti dat a požadavcích uživatelů reportu.

Další příklady můžete najít na stránce DAX příklady nebo na stránce Power BI.

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

Komentáře