Analýza chování zákazníků v jazyku DAX a Power BI

Úvodní obrázek

Tento příspěvek obsahuje vybrané výpočty v Power BI, které jsou zaměřeny na zákazníky s cílem analyzovat jejich chování. V článku si ukážeme například výpočet průměrné doby mezi nákupy u každého zákazníka, počet dnů, které uplynuly od posledního nákupu, průměrnou útratu na jeden nákup nebo výpočet určený pro nastavení podmíněného formátování, díky kterému dokážeme identifikovat ty zákazníky, u kterých je doba od jejich posledního nákupu delší, než je průměrná doba mezi jednotlivými nákupy.

Všechna tato a některá další měřítka z tohoto příspěvku jsou vytvořena ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.

Analýza chování zákazníků

Než se přesuneme k jednotlivým výpočtům vztaženým k chování zákazníků, vytvoříme si v použitém cvičném Power BI souboru jednoduché měřítko [Prodeje] a zobrazíme si vzorek dat, se kterými budeme pracovat. Měřítko [Prodeje] obsahuje výpočet, který sčítá všechny hodnoty ze sloupce 'Sales'[Sales Amount], ve kterém jsou uloženy částky za prodej produktů. Měřítko [Prodeje] tak bude vracet sumu za prodané produkty v aktuálním kontextu vyhodnocení.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Nové měřítko si můžeme vložit do vizuálu Tabulka. Pokud do řádků stejného vizuálu vložíme také kódy objednávek ze sloupce 'Sales Order'[Sales Order], jména zákazníků, včetně jejich jedinečných identifikátorů, a dále hodnoty ze sloupce 'Sales'[Order Date], který obsahuje datum vystavení každé objednávky, výchozí report může vypadat následovně.

Analýza chování zákazníků v jazyku DAX a Power BI

Na obrázku výše můžeme vidět zleva čísla objednávek, jména zákazníků, datum objednávky a celkovou částku na objednávce. V následující části si postupně ukážeme, jak na základě sloupců použitých ve vizuálu na obrázku výše zjistit počet uskutečněných nákupů každým zákazníkem, průměrnou útratu každého zákazníka, počet dnů mezi prvním a posledním nákupem, průměrný počet dnů mezi nákupy, největší počet dnů mezi dvěma nákupy a počet dnů, které uplynuly od posledního nákupu u každého zákazníka.

Na základě výpočtu průměrného počtu dnů mezi nákupy, nejvyššího počtu dnů mezi dvěma nákupy a počtu dnů, které uplynuly od posledního nákupu zákazníka můžeme následně jednoduchým porovnáním vytvořit podmíněný formát, který bude hlídat, zda některé zákazníky „neztrácíme“, a to právě z důvodu neobvykle dlouhé doby od jejich posledního nákupu.

Poznámka: V zobrazeném reportu na obrázku výše je na levé straně také vizuál Průřez, kde jsou vybráni pouze někteří zákazníci. Tento průřez bude součástí každého reportu zobrazeného v tomto příspěvku, i když nebude vždy zachycen na obrázku. Smyslem tohoto průřezu je pouze omezit počet zobrazených zákazníků ve vizuálech, aby jednotlivé obrázky v tomto příspěvku nezabíraly příliš velký prostor.

Celkový počet nákupů, celkové prodeje a průměrná útrata zákazníka

První měřítko, které si pro účel analýzy chování zákazníků vytvoříme, bude vracet celkový počet objednávek každého zákazníka. Čísla objednávek jsou uložena v tabulce 'Sales Order' ve sloupci 'Sales Order'[Sales Order]. V měřítku budeme sčítat počet objednávek za celé období, za všechny kategorie produktů, přes všechny obchody atd. Jinak řečeno, v měřítku budeme před sečtením objednávek odstraňovat všechny filtry ze všech tabulek, kromě tabulky 'Customer', která obsahuje záznamy o zákaznících. Před zobrazením výsledku výpočtu si ještě pomocí funkce HASONEVALUE() ověříme, zda je měřítko vyhodnoceno v kontextu pouze jednoho zákazníka, aby toto měřítko vracelo prázdnou hodnotu BLANK v případě, kdy by bylo použito v jiném kontextu, než pro který bylo vytvořeno.

Měřítko:

Počet nákupů celkem =
VAR Vypocet =
    CALCULATE
    (
        DISTINCTCOUNT('Sales Order'[Sales Order]),
        ALLEXCEPT(Sales, Customer)
    )
VAR Vysledek =
    IF
    (
        HASONEVALUE(Customer[Zákazník]),
        Vypocet
    )
RETURN
    Vysledek

Jak bylo uvedeno výše, v měřítku [Počet nákupů celkem] odstraňujeme případné vnější filtry ze všech tabulek, kromě tabulky 'Customer'. Toto odstranění filtrů probíhá v proměnné Vypocet pomocí funkce ALLEXCEPT(), a stejný postup odstranění filtrů budeme používat ve všech následujících výpočtech. 

U samotného způsobu odstranění filtrů pomocí funkce ALLEXCEPT() si je nutné si uvědomit, že tabulka 'Sales' obsahuje ve své rozšířené verzi všechny tabulky v celém modelu, protože všechny tabulky jsou s tabulkou 'Sales' ve vztahu ONE-TO-MANY na straně ONE. Odstraněním filtrů z tabulky 'Sales' proto odstraníme filtry ze všech tabulek z celého modelu, kromě tabulky 'Customer', uvedené ve druhém argumentu funkce ALLEXCEPT()

Více informací o funkci ALLEXCEPT() je k dispozici v příspěvku pod tímto odkazem. Konceptu rozšířených tabulek je také věnován samostatný příspěvek dostupný pod tímto odkazem.

Podobný postup jako v případě měřítka [Počet nákupů celkem] použijeme také v dalším měřítku, které bude vracet celkové prodeje pro každého zákazníka. Jedinou změnou bude první argument funkce CALCULATE() v proměnné Vypocet, kde nyní budeme sčítat sumu za prodeje produktů ze sloupce 'Sales'[Sales Amount].

Měřítko:

Prodeje celkem =
VAR Vypocet =
    CALCULATE
    (
        SUM(Sales[Sales Amount]),
        ALLEXCEPT(Sales, Customer)
    )
VAR Vysledek =
    IF
    (
        HASONEVALUE(Customer[Zákazník]),
        Vypocet
    )
RETURN
    Vysledek

Obě nová měřítka můžeme vložit do vizuálu Tabulka, spolu se zákazníky v prvním sloupci.

Analýza chování zákazníků v jazyku DAX a Power BI 2

Na základě měřítka [Prodeje celkem] a měřítka [Počet nákupů celkem] si můžeme jednoduchým dělením vytvořit další měřítko, které bude vracet průměrnou částku utracenou aktuálním zákazníkem za jeden nákup.

Měřítko:

Průměrná útrata =
VAR Vypocet = DIVIDE([Prodeje celkem], [Počet nákupů celkem])
VAR Vysledek =
    IF
    (
        HASONEVALUE(Customer[Zákazník]),
        Vypocet
    )
RETURN
    Vysledek

Nové měřítko si opět vložíme do původního vizuálu a zobrazíme si výsledky.

Analýza chování zákazníků v jazyku DAX a Power BI 3

V prvním řádku ve vizuálu Tabulka na obrázku výše můžeme vidět, že zákaznice "Adriana Gonzalez (12300)" uskutečnila pouze pět objednávek, nicméně oproti zákaznici "Alexandra Jenkins (11632)" ve druhém řádku stejného vizuálu utratila násobně vyšší částku, přestože "Alexandra Jenkins (11632)" realizovala o 11 objednávek více. Je tedy zřejmé, že průměrné částky utracené jednotlivými zákazníky, stejně jako očekávání o budoucích nákupech těchto zákazníků, se budou výrazně lišit, což je možné vidět na hodnotách měřítka [Průměrná útrata]

Další měřítko, které si přidáme do modelu, bude počítat dobu, po kterou byl každý zákazník aktivní.

Počet dnů mezi prvním a posledním nákupem zákazníka

Počet dnů mezi prvním a posledním nákupem vyjadřuje dobu, po kterou je konkrétní zákazník takzvaně aktivní. Tento výpočet je také důležitý pro určení průměrného počtu dnů mezi dvěma nákupy. Logika výpočtu je poměrně přímočará. Nejdříve si do jednotlivých proměnných uložíme první a poslední den, ve kterém došlo k nákupu u každého zákazníka. Jednoduchým odečtením prvního dne s nákupem od posledního dne s nákupem dostaneme počet dnů, ve kterých byl každý zákazník považován za aktivního.

Měřítko:

Počet dnů mezi prvním a posledním nákupem =
VAR PrvniNakup =
    CALCULATE
    (  
        MIN(Sales[Order Date]),
        ALLEXCEPT(Sales, Customer)
    )
VAR PosledniNakup =
    CALCULATE
    (
        MAX(Sales[Order Date]),
        ALLEXCEPT(Sales, Customer)
    )
VAR Vypocet = INT(PosledniNakup - PrvniNakup)
VAR Vysledek =
    IF
    (
        HASONEVALUE(Customer[Zákazník]),
        Vypocet
    )
RETURN
    Vysledek

Nové měřítko si opět můžeme vložit do původního vizuálu a zobrazit si hodnoty tohoto měřítka pro každého zákazníka.

Analýza chování zákazníků v jazyku DAX a Power BI 4

Na základě měřítka [Počet dnů mezi prvním a posledním nákupem] a měřítka [Počet nákupů celkem] si můžeme následně zjistit průměrnou prodlevu mezi dvěma nákupy pro každého zákazníka.

Průměrný počet dnů mezi nákupy

Při výpočtu průměrného počtu dnů mezi dvěma nákupy budeme dělit počet dnů mezi prvním a posledním nákupem celkovým počtem nákupů, od kterého odečteme číslo jedna. Výslednou hodnotu ještě můžeme zaokrouhlit na celé číslo, například pomocí funkce INT(), která zaokrouhluje vždy nahoru.

Měřítko:

Průměrný počet dnů mezi nákupy =
INT
(
    DIVIDE
    (
        [Počet dnů mezi prvním a posledním nákupem],
        [Počet nákupů celkem] - 1
    )
)

Důvod, proč od měřítka [Počet nákupů celkem] odečítáme číslo jedna lze vysvětlit relativně jednoduše. Představme si zákazníka pouze se třemi nákupy. Mezi těmito třemi nákupy jsou dvě období, ze kterých chceme spočítat průměrný počet dnů. První období je mezi prvním a druhým nákupem a druhé období je mezi druhým a třetím nákupem. Proto, i když zákazník realizoval tři nákupy, celkovou dobu mezi prvním a posledním nákupem budeme dělit pouze dvěma, protože mezi třemi nákupy jsou pouze dvě období. Stejně tak mezi čtyřmi nákupy budeme počítat průměr ze třech časových úseků, a tak dále.

Analýza chování zákazníků v jazyku DAX a Power BI 5

Jak můžeme vidět na obrázku výše, průměrný počet dnů mezi nákupy se u jednotlivých zákazníků může výrazně lišit. Současně, pokud daný zákazník realizoval řádově větší počet nákupů, průměrný počet dnů mezi jednotlivými nákupy je obvykle nižší, než je tomu u zákazníků s relativně malým počtem nákupů. Další měřítko, které může být zajímavé pro analýzu chování zákazníků, je měřítko vracející největší počet dnů mezi dvěma nákupy.

Největší počet dnů mezi dvěma nákupy

Výpočet největšího počtu dnů mezi jednotlivými nákupy bude jeden z nejsložitějších výpočtů zobrazených v tomto příspěvku. V prvním kroku si vytvoříme virtuální tabulku s jedním sloupcem, která bude obsahovat všechny dny ve kterých aktuální zákazník realizoval své nákupy. Následně k této tabulce přidáme sloupec pomocí funkce ADDCOLUMNS(), který bude obsahovat rozdíl mezi každým dnem s objednávkou a dnem předchozího nákupu. Z této virtuální tabulky, která obsahuje sloupec s datem objednávek a nový sloupec s počtem dnů mezi aktuální a předchozí objednávkou si pomocí funkce MAXX() vybereme nejvyšší hodnotu ze sloupce s počtem dnů mezi objednávkami. Takto popsaný výpočet může vypadat například následovně.

Měřítko:

Největší počet dnů mezi nákupy =
CALCULATE
(
    VAR DnySNakupy = VALUES(Sales[Order Date])
    VAR NakupySDnyMezi =
        ADDCOLUMNS
        (
            DnySNakupy,
            "@Rozdil",
            VAR AktualniDen = [Order Date]
            VAR DnyPredAktualnim =
                FILTER
                (
                    DnySNakupy,
                    [Order Date] < AktualniDen
                )
            VAR PredchoziDenNakupu =
                MAXX(DnyPredAktualnim, [Order Date])
            VAR Rozdil =
                IF
                (
                    NOT ISBLANK(PredchoziDenNakupu),
                    INT(AktualniDen - PredchoziDenNakupu)
                )
            RETURN
                Rozdil
        )
    VAR NejdelsiDobaMeziNakupy =
        MAXX(NakupySDnyMezi, [@Rozdil])
    VAR Vysledek =
        IF
        (
            HASONEVALUE(Customer[Zákazník]),
            NejdelsiDobaMeziNakupy
        )
    RETURN
        Vysledek,
    ALLEXCEPT(Sales, Customer)
)

Nové měřítko si můžeme přidat do reportu a zobrazit si výsledek.

Analýza chování zákazníků v jazyku DAX a Power BI 6

Jak můžeme vidět na obrázku výše, tak zákaznice "Adriana Gonzalez (12300)" má největší prodlevu mezi dvěma nákupy 607 dnů. To je oproti "Alexandra Jenkins (11632)" ve druhém řádku propastný rozdíl, protože tato zákaznice má největší prodlevu mezi dvěma nákupy 64 dnů. Další měřítko, které bude důležité pro nastavení upozornění, jestli „neztrácíme“ zákazníka kvůli jeho neobvyklé neaktivitě, bude počítat dobu která uplynula od zákazníkova posledního nákupu.

Počet dnů od posledního nákupu

Ke zjištění počtu dnů, které uplynuly od poslední objednávky každého zákazníka, budeme potřebovat zjistit rozdíl mezi aktuálním dnem a posledním dnem, ve kterém daný zákazník nakupoval produkty. Ve cvičném modelu použitém v tomto příkladu jsou historická, neaktualizovaná data. Jako aktuální den proto použijeme poslední den, ve kterém došlo k prodejům produktů.

Měřítko:

Počet dnů od posledního nákupu =
VAR AktualniDen =
    CALCULATE
    (
        MAX(Sales[Order Date]),
        REMOVEFILTERS()
    )
VAR PosledniNakupZakaznika =
    CALCULATE
    (
        MAX(Sales[Order Date]),
        ALLEXCEPT(Sales, Customer)
    )
VAR PocetDnuOdPoslednihoNakupu =
    INT(AktualniDen - PosledniNakupZakaznika)
VAR Vysledek =
    IF
    (
        HASONEVALUE(Customer[Zákazník]),
        PocetDnuOdPoslednihoNakupu
    )
RETURN
    Vysledek

Nové měřítko můžeme použít ve vizuálu Tabulka a podívat se na výsledky.

Analýza chování zákazníků v jazyku DAX a Power BI 7

Na obrázku výše můžeme vidět všechna měřítka z tohoto příspěvku v jednom vizuálu. Tabulka obsahuje navíc podmíněný formát, který zvýrazní oranžově ty zákazníky, jejichž doba od jejich posledního nákupu je větší než je průměrná doba mezi jejich nákupy. Červeně jsou pak zvýrazněny ti zákazníci, kteří mají počet dnů od jejich poslední objednávky větší než je největší prodleva mezi jejich předchozími objednávkami. Tito zákazníci by mohli být kandidáty na případnou pobídku k nákupu, protože se může potencionálně jednat o zákazníky, které ztrácíme, z důvodu jejich neobvykle dlouhé neaktivity.

Měřítko použité pro nastavení podmíněného formátu je jednoduché, a vychází z již dříve vytvořených měřítek.

Měřítko:

Barva pro zvýraznění řádku =
SWITCH
(
    TRUE(),
    [Počet dnů od posledního nákupu] > [Největší počet dnů mezi nákupy], "#FF7A7A",
    [Počet dnů od posledního nákupu] > [Průměrný počet dnů mezi nákupy], "#FFDB9D"
)

Postup jak nastavit podmíněný formát na základě výpočtu v měřítku je nad rámec tohoto příspěvku, nicméně podrobný návod nastavení formátu na základě hodnoty měřítka můžete najít v samostatném příspěvku pod tímto odkazem. Jediným rozdílem je že v odkazovaném článku je pro příklad použitý vizuál Sloupcový graf. Popsaný princip je ale stejný u všech vizuálů.

Shrnutí

Na chování zákazníků může být pohlíženo z mnoha různých úhlů pohledů. Vždy záleží na požadavcích uživatelů reportu a na struktuře dat, která máme k dispozici. Na příkladech v tomto příspěvku jsme však mohli vidět, že i na základě hodnot z pouhých čtyř sloupců můžeme pomocí jazyka DAX získat mnoho dodatečných informací.

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

Komentáře