Analýza nákupního košíku v DAX

Analýza nákupního košíku v DAX

Jedním z příkladů z kategorie analýzy nákupního košíku může být kvantifikace produktů, které zákazníci nakupují společně v rámci jednoho nákupu. V tomto příspěvku si ukážeme jeden ze způsobů, jak lze pomocí jazyka DAX identifikovat závislost dvou produktů z pohledu výskytu těchto produktů na společných objednávkách. Power BI soubor s vyřešeným příkladem je dostupný ke stažení níže pod tímto příspěvkem.

Popis výpočtu a příprava modelu

Cílem příkladu je vytvořit výpočet pomocí DAX funkcí, který bude popisovat vztah mezi produkty z pohledu jejich výskytu ve stejném nákupním košíku. Nákupní košík v použitém cvičném modelu představuje číslo objednávky. Čísla objednávek jsou uložena v tabulce 'Sales Order'. Na každé objednávce pak muže být jeden nebo více produktů. Jaké produkty se vyskytují na objednávkách je zaznamenáno v tabulce 'Sales' ve sloupci 'Sales'[ProductKey]. Ve výpočtech budeme rozlišovat mezi produktem A (v řádcích vizuálu na úvodním obrázku), což je aktuálně vybraný produkt, a produktem B (ve sloupcích vizuálu na úvodním obrázku), který představuje produkt určený k porovnání s produktem A. K dosažení požadovaného výsledku budeme potřebovat postupně vytvořit následující výpočty:

1) Počet objednávek s produktem A.
2) Počet objednávek s produktem A na kterých je i produkt B.
3) Podíl hodnot z předchozích dvou kroků (Objednávky A s B/Objednávky A).

Než přistoupíme k samotným výpočtům, vytvoříme si v modelu dvě nové tabulky, které budou obě obsahovat stejné sloupce z originální tabulky 'Product'. Tyto dvě tabulky se od sebe budou lišit pouze názvem. Jedna tabulka bude zastupovat produkty A (vybrané produkty), druhá tabulka bude představovat produkty B (porovnávané produkty). Novou tabulku s produkty A si můžeme vytvořit pomocí následujícího DAX výrazu.

Počítaná tabulka:

_Produkt A =
SELECTCOLUMNS
(
    'Product',
    "Key", 'Product'[ProductKey],
    "Produkt", 'Product'[Product],
    "Kategorie", 'Product'[Category],
    "Podkategorie", 'Product'[Subcategory]
)

Stejný postup pak použijeme i pro vytvoření druhé tabulky, pouze změníme název tabulky na '_Produkt B'.

Počítaná tabulka:

_Produkt B =
SELECTCOLUMNS
(
    'Product',
    "Key", 'Product'[ProductKey],
    "Produkt", 'Product'[Product],
    "Kategorie", 'Product'[Category],
    "Podkategorie", 'Product'[Subcategory]
)

Nové tabulky jsou nyní součástí modelu, nicméně nebudeme je propojovat relacemi s ostatními tabulkami v modelu. Díky tomu, že jsou tabulky odpojené od ostatních tabulek v modelu, může být samotný DAX výpočet vytvořen relativně jednoduše, bez nutnosti odstraňovat a složitě manipulovat s filtry, které jsou všudypřítomné v každém reportu.

Analýza nákupního košíku v DAX 2

Nyní, když máme připravený model, můžeme přistoupit k samotným DAX výpočtům.

Analýza nákupního košíku v jazyku DAX

Všechna měřítka vytvořená v tomto příkladu vychází z předpokladu, že budou vyhodnocena v kontextu filtru konkrétního produktu z tabulky '_Produkt A', a v kontextu filtru konkrétního produktu určeného pro porovnání, tedy produktu z tabulky '_Produkt B'. Pokud budeme vycházet z tohoto předpokladu, výpočet počtu objednávek produktu A může vypadat následovně.

Měřítko:

Počet objednávek (A) =
VAR VybranyProduktA = SELECTEDVALUE('_Produkt A'[Produkt])
VAR ObjednavkyProduktuA =
    CALCULATETABLE
    (
        VALUES('Sales Order'[Sales Order]),
        'Product'[Product] = VybranyProduktA
    )
VAR Vysledek = SUMX(ObjednavkyProduktuA, 1)
RETURN
   Vysledek

Výpočet počtu objednávek s konkrétním produktem je relativně jednoduchý. V první proměnné (VybranyProduktA) načteme název aktuálního produktu, který je následně použit jako filtr objednávek ve druhé proměnné (ObjednavkyProduktuA).  Jakmile máme tabulku s objednávkami, na kterých je vybraný produkt, zbývá sečíst počet řádků v této tabulce (proměnná Vysledek). Nové měřítko můžeme vložit do vizuálu Tabulka, s názvy produktů z tabulky '_Produkt A' v řádcích.

Analýza nákupního košíku v DAX 3

Výsledek představuje v každém řádku tabulky počet objednávek, na kterých se nachází produkt uvedený v aktuálním řádku vizuálu. Produkty ve vizuálu jsou zafiltrované pouze na produkty z podkategorie "Road Bikes", díky filtru nastaveném v průřezu nad tabulkou. 

Nyní můžeme přistoupit k druhému kroku, ve kterém budeme zjišťovat, na kolika objednávkách se nachází dva konkrétní produkty. Nejprve musíme určit, které dva produkty chceme porovnávat. První produkt se nachází v konkrétním řádku vizuálu tabulky (produkty z tabulky '_Produkt A'). Druhý produkt určený k porovnání můžeme vybrat například v průřezu. Tento produkt určený k porovnání budeme vybírat z tabulky '_Produkt B'.

Analýza nákupního košíku v DAX 4

Jakmile máme v průřezu vybraný konkrétní produkt pro porovnání, můžeme tento produkt použít ve filtru ve funkci CALCULATE() a zjistit tak počet společných objednávek obou produktů.

Měřítko:

Počet společných objednávek (A i B) =
VAR VybranyProduktA = SELECTEDVALUE('_Produkt A'[Produkt])
VAR VybranyProduktB = SELECTEDVALUE('_Produkt B'[Produkt])
VAR ObjednavkyProduktuA =
    CALCULATETABLE
    (
        VALUES('Sales Order'[Sales Order]),
        'Product'[Product] = VybranyProduktA
    )
VAR ObjednavkyProduktuAsProduktemB =
   CALCULATETABLE
   (
       VALUES('Sales Order'[Sales Order]),
       ObjednavkyProduktuA,
       'Product'[Product] = VybranyProduktB
   )
VAR Vysledek =
    SUMX(ObjednavkyProduktuAsProduktemB, 1)
RETURN
    Vysledek

Výpočet společných objednávek obou produktů je založen na podobném principu jako výpočet počtu objednávek produktu A. Hlavní rozdíl je možné vidět v proměnné ObjednavkyProduktuAsProduktemB. V této proměnné je jako filtr použita tabulka s objednávkami produktu A (ObjednavkyProduktuA) a filtr s názvem produktu B, který je uložený v proměnné VybranyProduktB. Tím získáme pouze objednávky, na kterých se vyskytují oba produkty. Nové měřítko si můžeme vložit do původního vizuálu.

Analýza nákupního košíku v DAX 5

V průřezu nad tabulkou je vybrán produkt "Classic Vest, M". Tento produkt slouží k porovnání s produkty v řádcích tabulky. Ve zvýrazněném řádku tak můžeme vidět, že produkt "Road-250 Black, 44" byl na 705 objednávkách, a 97 z těchto objednávek obsahovalo také produkt vybraný v průřezu. Pokud měřítko [Počet společných objednávek (A i B)] nevrací žádnou hodnotu, znamená to, že aktuální produkt v řádku tabulky není na žádné objednávce společně s produktem vybraným v průřezu. Získat procentuální podíl společných objednávek již je se znalostí předchozích výpočtů jednoduchá záležitost.

Měřítko:

% (A s B) / A =
VAR VybranyProduktA = SELECTEDVALUE('_Produkt A'[Produkt])
VAR VybranyProduktB = SELECTEDVALUE('_Produkt B'[Produkt])
VAR ObjednavkyProduktuA =
    CALCULATETABLE
    (
        VALUES('Sales Order'[Sales Order]),
        'Product'[Product] = VybranyProduktA
    )
VAR ObjednavkyProduktuAsProduktemB =
   CALCULATETABLE
   (
       VALUES('Sales Order'[Sales Order]),
       ObjednavkyProduktuA,
       'Product'[Product] = VybranyProduktB
   )
VAR PocetObjednavekProduktA = SUMX(ObjednavkyProduktuA, 1)
VAR PocetObjednavekProduktAsProduktemB = SUMX(ObjednavkyProduktuAsProduktemB, 1)
VAR Vysledek =
    DIVIDE
    (
        PocetObjednavekProduktAsProduktemB,
        PocetObjednavekProduktA
    )
RETURN
   Vysledek

Měřítko [% (A s B) / A] obsahuje jak výpočet počtu objednávek produktu A, tak výpočet počtu společných objednávek produktu A s produktem B.  Následně je v proměnné Vysledek vypočítán podíl společných objednávek produktů A s produktem B na celkovém množství objednávek s produktem A. Nové měřítko můžeme vložit do původního vizuálu a zobrazit si výsledek.

Analýza nákupního košíku v DAX 6

Pokud se podíváme na první řádek v zobrazené tabulce, díky výpočtu  v měřítku  [% (A s B) / A] můžeme říci, že pokud byl na objednávce produkt "Road-350-W Yellow, 42", tak v 21,98 % případů byl na této objednávce také produkt "Classic Vest, M". Porovnávaný produkt v průřezu můžeme samozřejmě změnit, nicméně procházet každý produkt jednotlivě nemusí být pro prvotní analýzu příliš pohodlné. Vytvořit tak můžeme vizualizaci s produkty A v řádcích a s produkty určenými k porovnání, tedy produkty z tabulky B, ve sloupcích. Pro tento vizuál si ještě měřítko [% (A s B) / A] mírně upravíme.

Měřítko:

Analýza nákupního košíku =
VAR VybranyProduktA = SELECTEDVALUE('_Produkt A'[Key])
VAR VybranyProduktB = SELECTEDVALUE('_Produkt B'[Key])
VAR ObjednavkyProduktuA =
    CALCULATETABLE
    (
        VALUES('Sales Order'[Sales Order]),
        Sales[ProductKey] = VybranyProduktA
    )
VAR ObjednavkyProduktuAsProduktemB =
   CALCULATETABLE
   (
       VALUES('Sales Order'[Sales Order]),
       ObjednavkyProduktuA,
       Sales[ProductKey] = VybranyProduktB
   )
VAR PocetObjednavekProduktA = SUMX(ObjednavkyProduktuA, 1)
VAR PocetObjednavekProduktAsProduktemB = SUMX(ObjednavkyProduktuAsProduktemB, 1)
VAR ProcentualneProduktAsProduktemB =
    DIVIDE
    (
        PocetObjednavekProduktAsProduktemB,
        PocetObjednavekProduktA
    )
VAR Vysledek =
    IF
    (
        VybranyProduktA <> VybranyProduktB,
        ProcentualneProduktAsProduktemB
    )
RETURN
   Vysledek

Namísto názvů produktů jsou ve výpočtu použity hodnoty ze sloupců s jedinečnými identifikátory produktů. V proměnné Vysledek je pak navíc podmínka, která omezuje zobrazení výpočtu pouze na produkty, které nejsou stejné, protože v těchto případech je výsledek vždy 100 %. Nyní můžeme vložit jedinečný identifikátor produktů A do řádků vizuálu, a jedinečný identifikátor produktů k porovnání, tedy produktů z tabulky B, do sloupců vizuálu. Výsledek může vypadat následovně.

Analýza nákupního košíku v DAX 7

V takto vytvořeném vizuálu můžeme relativně rychle identifikovat produkty, které jsou na sobě více či méně závislé, co se týká společných prodejů. Opět si ovšem musíme dát pozor na interpretaci výsledků. Vždy porovnáváme produkty v řádcích (Produkty z tabulky A) s produkty ve sloupcích (Produkty z tabulky B), a ne obráceně. 

Zaměřme se například na produkt s číslem 374 ve druhém řádku vizuálu na obrázku výše. Tento produkt byl ve vybraném měsíci prodán společně s produktem číslo 378 ve 48,83 % případech. Jinak řečeno, když si někdo v prosinci 2019 koupil produkt číslo 374, ve 48,83 % případů si k tomuto produktu zakoupil také produkt číslo 378.
Ve čtvrtém řádku vizuálu je pak zvýrazněna buňka, která zastupuje stejné produkty, ale má jiný význam. V tomto případě porovnáváme, v jakém procentu nákupů produktu 378 byl na stejné objednávce také produkt 374.

Pokud by tato interpretace byla pro uživatele příliš složitá, můžeme použít dříve vytvořený pohled, ve kterém může být význam vybraného produktu a produktu k porovnání více zřejmý.

Analýza nákupního košíku v DAX 6

Pohledů, jak se dívat na výsledky výpočtů uvedených v tomto příspěvku, může být samozřejmě více, v závislosti na požadavcích uživatelů reportu. Soubor s řešením z tohoto příspěvku si můžete stáhnout kliknutím na níže uvedený odkaz. Další příklady DAX výpočtu jsou dostupné na stránce DAX - Příklady.

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

Komentáře