DAX教程:籃子分析2.0

做者|Davis Zhang 編譯|VK 來源|Towards Data Science機器學習

本文旨在利用DAX分析Power-BI中的客戶購買行爲,並深刻了解產品潛力。學習

幾年前,Marco Russo和Alberto Ferrari發表了一篇名爲「籃子分析」的博客.net

https://www.daxpatterns.com/basket-analysis/code

這篇有趣的文章詳細描述瞭如何使用DAX計算任何產品組合下的訂單數量和客戶數量等很是有用的指標。本文能夠看做是「籃子分析」的一個擴展,它考慮了顧客購買不一樣產品的時間順序。blog

與原始的「籃子分析」相比

假設A和B表明兩種不一樣的產品,那麼「籃子分析」計算P(AB),而本文計算P(A|B)和P(B|A)。你能夠比較下面的兩個數字:ci

上圖是「籃子分析」中「兩種產品都有顧客」的衡量標準,顯示72位顧客同時擁有「瓶籠」和「自行車架」的購買記錄。資源

可是,下圖中顯示的數據考慮了客戶購買產品的時間順序。你能夠發現,先購買自行車架後購買瓶、籠的客戶有8家,先購買瓶、籠後購買自行車架的客戶有14家(注:暫時不考慮同時購買A、B的狀況)文檔

爲何這個分析有意義

客戶的訂單記錄反映了一些很是有用的事實,爲產品之間的相關性提供了方向。換言之,「購物籃分析」在分析超市數據時很是有用,由於顧客一般在購物時選擇多種產品,而後到收銀臺一塊兒下訂單。get

在這種狀況下,全部產品都被視爲同時訂購。但事實上,在超市購物過程當中,顧客選擇的不一樣產品的記錄是沒法追蹤的。博客

但若是是在其餘狀況下,好比客戶在電子商務平臺或官網上下單,若是你是店長,你可能想知道A和B是最暢銷的車型,哪一款能夠帶來更多的回頭客,哪一款更容易流失客戶。

所以,咱們須要知道每種產品的回購百分比。例如,全部先購買產品A的顧客,將來會有多少人再回來購買產品,進一步分析,在這些人中,購買的仍然是產品A或其餘產品?各佔多少比例,這是一個值得研究的問題。

計算過程

通過計算過程,咱們最終將獲得以下圖所示的計算結果(注:我使用與「籃子分析」相同的數據集):

如前所述,它顯示了哪些客戶先購買了產品A並有後續的購買記錄,他們中有多少人購買了產品B或產品C等。

所以,爲了達到這個計算結果,這裏有五個步驟:

1.首先,對銷售表中的全部訂單進行分類,在客戶的全部訂單中,一個或多個訂單日期最先的訂單被分類爲第一個訂單,其他的爲「非第一」:

IsFirstOrder = 
VAR
E_Date = 'Sales'[OrderDateKey]
VAR
CUST = 'Sales'[CustomerKey]
RETURN
IF(
    SUMX(
        FILTER('Sales',
        CUST = 'Sales'[CustomerKey]&&
        E_Date > 'Sales'[OrderDateKey]),
        COUNTROWS('Sales'))>0,FALSE,TRUE)

2.過濾銷售中全部產品A的訂單數據,而後進一步過濾哪些訂單被標記爲客戶的第一個訂單。咱們在此過濾表中提取客戶列表,並向其添加一個名爲「ROWS」的虛擬列,獲得虛擬表VT1。

3.使用Sales做爲主表,並使用NATURALLEFTOUTERJOIN()與虛擬表「VT1」關聯,而後使用filter()排除[ROWS]值不等於1的行,其他數據(VT2)是「VT1」返回的全部客戶的全部訂單。最後,對除「一階」外的全部訂單進一步過濾數據,結果命名爲「CustDistinctValue」:

CustDistinctValue = 
VAR
FIRSTORDERPROD = 
IF(HASONEVALUE('Product'[Subcategory]),
    VALUES('Product'[Subcategory]),0)
VAR
VT1 = 
SUMMARIZE(
    FILTER(Sales,
        AND(related('Product'[Subcategory]) = FIRSTORDERPROD,
            'Sales'[IsFirstOrder]=TRUE)),
        'Sales'[CustomerKey],
        "ROWS",
        DISTINCTCOUNT(Sales[CustomerKey]))
VAR
VT2 = 
FILTER(
    NATURALLEFTOUTERJOIN(ALL(Sales),VT1),
    [ROWS] = 1)
RETURN
CALCULATE(
    DISTINCTCOUNT('Sales'[CustomerKey]),
    FILTER(VT2,'Sales'[IsFirstOrder] = FALSE)
)

4.以後,咱們須要確保這些數據能夠按產品進行過濾(在這種狀況下,咱們只使用子類別)。這裏與宏的計算方法基本相同,使用產品表(Filter product)和主表的副本創建非活動關係,而後建立一個度量值,以便其上下文忽略產品表的全部字段,並從其副本(Filter product)接受上下文。

CustPurchaseOthersSubcategoryAfter = 
VAR CustPurchaseOthersSubcategoryAfter = 
CALCULATE (
    'Sales'[CustDistinctValue],
    CALCULATETABLE (
        SUMMARIZE ( Sales, Sales[CustomerKey] ),
        'Sales'[IsFirstOrder] = FALSE,
        ALLSELECTED ('Product'),
        USERELATIONSHIP ( Sales[ProductCode],
             'Filter Product'[Filter ProductCode] )
    )
)
RETURN
IF(NOT([SameSubCategorySelection]),
    CustPurchaseOthersSubcategoryAfter)

注:「SameSubCategorySelection」用於排除選擇相同子類別的數據。此公式還使用宏的方法來完成:

SameSubCategorySelection = 
IF (
    HASONEVALUE ( 'Product'[Subcategory] )
        && HASONEVALUE ( 'Filter Product'[Filter Subcategory] ),
    IF (
        VALUES ( 'Product'[Subcategory])
            = VALUES ( 'Filter Product'[Filter Subcategory] ),
        TRUE
    )
)

5.如今,咱們已經計算出購買產品A的客戶中有多少人首先購買了其餘產品,如今咱們須要計算出這些客戶佔購買產品A的客戶總數的比例,而後纔有購買記錄。如下是計算該比例分母的代碼。

AsFirstOrderCust = 
VAR
FIRSTORDERPROD = 
IF(
    HASONEVALUE('Product'[Subcategory]),
    VALUES('Product'[Subcategory]),0)
VAR
VT1 = 
SUMMARIZE(
    FILTER(Sales,
        AND(
            RELATED('Product'[Subcategory]) = FIRSTORDERPROD,
                'Sales'[IsFirstOrder]=TRUE)),
            'Sales'[CustomerKey]
)
return
CALCULATE(
    DISTINCTCOUNT('Sales'[CustomerKey]),
    VT1)
-------------------------------------------------------------------------------
IsLastOrder = 
VAR
E_Date = 'Sales'[OrderDateKey]
VAR
CUST = 'Sales'[CustomerKey]
RETURN
IF(
    SUMX(
        FILTER('Sales',
        CUST = 'Sales'[CustomerKey]&&
        E_Date < 'Sales'[OrderDateKey]),
        COUNTROWS('Sales'))>0,"F","T")
-------------------------------------------------------------------------------
AsFirstOrderCustRepurchase = 
CALCULATE(
    'Sales'[AsFirstOrderCust],
    'Sales'[IsLastOrder] = "F")

如今咱們獲得了最終的結果:CustPurchaseOthersSubCategoryAfter %,這個度量的名稱很長,由於它的邏輯很複雜,就像上面的計算過程同樣。

CustPurchaseOthersSubCategoryAfter % = 
DIVIDE ( 'Sales'[CustPurchaseOthersSubcategoryAfter],
    'Sales'[AsFirstOrderCustRepurchase])

最終結果

最後,咱們將成功得到以下的最終結果,並選擇使用名爲「CHORD」的自定義視覺效果將其可視化。

如你所見,首先購買公路自行車的顧客中,1853人後來購買了山地自行車,而有趣的是,只有200名顧客在購買了山地自行車以後購買了公路自行車。

附上了PBIX文件,若是你有興趣的話能夠在這裏下載。

https://1drv.ms/u/s!AjpQa2fseaxaoDLeh4yBlBSaa-qx

原文連接:https://towardsdatascience.com/explore-the-potential-of-products-through-customers-purchase-behaviour-in-power-bi-basket-a1f77e8a2bf6

歡迎關注磐創AI博客站: http://panchuang.net/

sklearn機器學習中文官方文檔: http://sklearn123.com/

歡迎關注磐創博客資源彙總站: http://docs.panchuang.net/

相關文章
相關標籤/搜索