做者|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
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/