本文蘊(yùn)藏殺機(jī)拒课,PowerBI DAX 設(shè)計(jì)的諸多精華盡在一個(gè)模型徐勃,推薦仔細(xì)閱讀。上篇文章寫(xiě)得少得可憐早像,很多戰(zhàn)友提出嚴(yán)重抗議僻肖,要求繼續(xù)揭示這其中的奧秘,好吧卢鹦,你吩咐臀脏,我照辦。
先看效果吧:
下面詳細(xì)解讀冀自。
自從2018.5《PowerBI 全動(dòng)態(tài) RFM 模型 1.0》發(fā)布以及2019.6《PowerBI 全動(dòng)態(tài) RFM 模型 2.0》發(fā)布揉稚,收到強(qiáng)烈反響,并收到很多戰(zhàn)友的反饋熬粗。集中表現(xiàn)在:
- 要求再?gòu)?qiáng)調(diào)一下核心理念
- 要求再解釋下 2.X 版的重大更新
- 指出了內(nèi)藏的業(yè)務(wù)邏輯優(yōu)化問(wèn)題
因此搀玖,我們今天發(fā)布 2.2 版,并簡(jiǎn)單解釋?xiě)?zhàn)友提出的問(wèn)題驻呐。
首先給出2.2版本的樣子灌诅,如下:
與其對(duì)照的 2.0(2.1)版本,如下:
從展現(xiàn)來(lái)說(shuō)暴氏,是沒(méi)有任何差異的,而其實(shí)卻做了非常多的優(yōu)化绣张,讓我們一起來(lái)欣賞這個(gè)過(guò)程答渔。
核心理念
關(guān)于什么是RFM,這里就不再介紹侥涵,可以參考1.0版的文章或自行搜索相關(guān)概念沼撕,這里不再贅述。要強(qiáng)調(diào)的是:在PowerBI中實(shí)現(xiàn)RFM模型芜飘,可以充分利用DAX計(jì)算的動(dòng)態(tài)性务豺,根據(jù)用戶(hù)的選擇實(shí)時(shí)做出計(jì)算,這與完全交給IT計(jì)算或在純Excel中計(jì)算都不同嗦明。
- 完全交給IT計(jì)算笼沥,往往是固定不變的邏輯,由IT使用SQL等底層數(shù)據(jù)庫(kù)技術(shù)完成娶牌;
- 完全在Excel中計(jì)算奔浅,則計(jì)算的能力有限,以及配套的可視化有限诗良。
在 PowerBI 中使用 DAX 計(jì)算汹桦,則完全由分析師完成,它可以平衡靈活性和計(jì)算能力鉴裹。這在全動(dòng)態(tài) ABC 模型中也有一樣的效果。
對(duì)照上圖蚜枢,我們指出這里的一些已有亮點(diǎn)魔市。
動(dòng)態(tài)計(jì)算類(lèi)別后再篩選
這個(gè)特性太兇殘了,如果你看懂了脆霎,那就真正理解到DAX的精華了,如下:
以及:
首先赂蠢,任意客戶(hù)的RFM分類(lèi)并不是預(yù)先存在的绪穆,而是要?jiǎng)討B(tài)實(shí)時(shí)計(jì)算的;熟悉DAX數(shù)據(jù)模型的人都知道只有預(yù)先存在的模型中的列才能篩選與之相關(guān)的表虱岂;而這里玖院,我們完全破除了這個(gè)限制,讓動(dòng)態(tài)計(jì)算完的元素可以被繼續(xù)篩選第岖,這種動(dòng)態(tài)中的動(dòng)態(tài)难菌,可以稱(chēng)之為連環(huán)動(dòng)態(tài)篩選,非常殘忍蔑滓。
三維轉(zhuǎn)二維的全動(dòng)態(tài)
我們都知道RFM模型的示意圖是這樣的:
而在PowerBI中是沒(méi)有這種3D空間型可視化的郊酒,即使有,也很難標(biāo)記各種元素键袱,因此燎窘,我們做了一個(gè)有意義的轉(zhuǎn)換:
- 取RFM中任意兩個(gè)指標(biāo),分別作為X蹄咖,Y褐健;
- 取RFM中剩余的指標(biāo),作為大欣教馈蚜迅;
- 再用元素本身的RFM分類(lèi)繪制顏色。
這樣俊抵,就可以繪制散點(diǎn)圖谁不,如下:
這里采用了X對(duì)應(yīng)于R,而Y對(duì)應(yīng)于F徽诲,M自然對(duì)應(yīng)于點(diǎn)的大小刹帕,并繪制顏色。注意上面的標(biāo)題是動(dòng)態(tài)的谎替,可以顯示各個(gè)坐標(biāo)軸和點(diǎn)的含義轩拨。
如果反選X,Y軸院喜,其表現(xiàn)為:
當(dāng)然亡蓉,我們可以用R,M來(lái)表示X喷舀,Y砍濒,將得到:
反選后淋肾,又將得到:
好神奇啊,當(dāng)然爸邢,還可以使用F樊卓,M表示X,Y杠河,則有:
反選后碌尔,又將得到:
換言之,這里將3D的信息券敌,充分投影到2D空間唾戚,投影的方式完全自定,相當(dāng)?shù)貧埧帷?/p>
我知道你有好奇心待诅,就是想選個(gè)特別的叹坦,來(lái)滿(mǎn)足你,看吧:
如果你將X卑雁,Y選擇成一樣的募书,標(biāo)題會(huì)動(dòng)態(tài)地提示你這是錯(cuò)誤的。
這樣的3D轉(zhuǎn)2D测蹲,這樣的顏色分類(lèi)莹捡,這樣的任意選擇,這樣的溫馨提示扣甲,堪稱(chēng)完美得無(wú)懈可擊篮赢,有點(diǎn)兇殘。
如果你認(rèn)為這算炫技文捶,我們也絕不否認(rèn)荷逞,這就是在炫技媒咳,但還沒(méi)有結(jié)束粹排。
日期區(qū)間的動(dòng)態(tài)性
首先,這并不是對(duì)全局所有時(shí)間進(jìn)行計(jì)算涩澡,而是針對(duì)分析人員所選的日期區(qū)間進(jìn)行計(jì)算顽耳,如下:
這點(diǎn)就是商業(yè)智能完全碾壓傳統(tǒng)SQL的地方,這種計(jì)算是實(shí)時(shí)指定的妙同,而不是預(yù)先指定射富,每指定一次,去SQL查詢(xún)一次粥帚。
M指標(biāo)KPI的動(dòng)態(tài)性
到底用什么來(lái)指定一個(gè)客戶(hù)的M指標(biāo)呢胰耗,是銷(xiāo)售額,利潤(rùn)還是購(gòu)買(mǎi)數(shù)量芒涡,抑或是利潤(rùn)率柴灯,寫(xiě)SQL沒(méi)法知道這種動(dòng)態(tài)性卖漫,而在商業(yè)智能中,PowerBI卻可以讓用戶(hù)實(shí)時(shí)指定赠群,有點(diǎn)殘忍了羊始。
R算法的動(dòng)態(tài)性
R在RFM中表示最近的購(gòu)買(mǎi)指標(biāo),到底怎么算最近呢查描,我們可以用若干個(gè)月來(lái)界定突委,也可以用其他的日期計(jì)算方式來(lái)界定,這個(gè)地方就是用來(lái)給出這種可能性冬三,讓我們知道我們不會(huì)被限制匀油,我們來(lái)看看不同指定方式的效果差異。
首先來(lái)看看固定的10個(gè)月區(qū)間法长豁,效果如下:
由于按月數(shù)計(jì)算钧唐,離散度很大,所以所有的點(diǎn)都會(huì)聚集到某些整數(shù)得分上匠襟,這是一種非常簡(jiǎn)單快速的劃分方式钝侠。再來(lái)看看按照實(shí)際日期長(zhǎng)度的劃分,效果是:
可以看出酸舍,這就立刻表現(xiàn)出了交疊的連續(xù)性帅韧。使用哪種形態(tài)可以完全由分析師動(dòng)態(tài)決定了,有點(diǎn)兇猛的啃勉。
客戶(hù)的可搜索性
這里還充分考慮了由于客戶(hù)很多忽舟,我們就是想知道某個(gè)特定客戶(hù)的分類(lèi)歸屬,我們可以直接搜索淮阐,如下:
這樣非常方便地提供了查找客戶(hù)的能力叮阅。
客戶(hù)的動(dòng)態(tài)計(jì)算范圍
細(xì)心的伙伴可以發(fā)現(xiàn),這里的計(jì)算范圍也是可以動(dòng)態(tài)設(shè)定的泣特,例如:
如果按照全局計(jì)算浩姥,那客戶(hù)白嬋是一般保持客戶(hù),即使過(guò)濾到只剩她一個(gè)也如此状您,如下:
但此時(shí)如果選擇【按所選客戶(hù)】計(jì)算勒叠,則會(huì)出現(xiàn):
既然是按所選范圍計(jì)算,那么膏孟,只有一個(gè)人的時(shí)候眯分,就相當(dāng)于在這個(gè)人是計(jì)算范圍,自然就只能是重要價(jià)值客戶(hù)柒桑,我們可以多選幾個(gè)來(lái)看弊决,如下:
由于多選,重新按照這個(gè)所選范圍計(jì)算魁淳,客戶(hù)的分類(lèi)就改變了飘诗。值得注意的是傅联,全局的分布如下:
可以看出平均值F=25正好是上述兩個(gè)客戶(hù)的平均值,而非四個(gè)客戶(hù)疚察,因?yàn)橛袃蓚€(gè)客戶(hù)不符合參與FRM計(jì)算的條件而被排除蒸走。天呢,太靈活了貌嫡,太可怕了比驻。怎么可能精細(xì)地控制到這個(gè)Level。
精雕細(xì)琢 臻于完美
如果您認(rèn)為這就算結(jié)束岛抄,那就錯(cuò)了别惦,我們看到:
自然可以提出,希望可以在圖中標(biāo)出不同的客戶(hù)夫椭,因?yàn)榇藭r(shí)只有少數(shù)幾個(gè)點(diǎn)掸掸,我們已經(jīng)準(zhǔn)備了【顯示標(biāo)簽】按鈕,點(diǎn)擊即可蹭秋,效果如下:
點(diǎn)的標(biāo)簽顯示出來(lái)扰付,同時(shí)按鈕呈現(xiàn)【隱藏標(biāo)簽】字樣,意思說(shuō)還可以隱藏標(biāo)簽仁讨,是的羽莺,如果標(biāo)簽過(guò)多,就會(huì)是這樣:
這是無(wú)法辨識(shí)的洞豁,因此需要點(diǎn)擊【隱藏標(biāo)簽】來(lái)隱藏所有標(biāo)簽盐固,如下:
太人性化了,太殘暴了丈挟,如此雕琢刁卜,如同打造一件奢侈品。如果您認(rèn)為這就結(jié)束了曙咽,那就又大錯(cuò)特錯(cuò)了蛔趴。
到此,一切才剛剛開(kāi)始桐绒。
2.X 重大更新
從 2.0 版本夺脾,往后都稱(chēng)為 2.X 版之拨。目前當(dāng)前版本為 2.2 版茉继,目前認(rèn)為是該模型的穩(wěn)定版。在該版本中蚀乔,我們主要更新了三個(gè)方面:
- 利用了PowerBI及DAX的最新能力烁竭,如:動(dòng)態(tài)染色,動(dòng)態(tài)標(biāo)題等吉挣。
- 更新了設(shè)計(jì)模式派撕。
- 平衡了靈活性與性能婉弹。
具體說(shuō)來(lái),在設(shè)計(jì)模式方面终吼,這里借鑒了軟件工程中 MVC 設(shè)計(jì)模式以及 依賴(lài)注入 設(shè)計(jì)思想镀赌,尤其是2.2中對(duì)此有重要體現(xiàn),如下:
RFM模型包括三個(gè)度量值文件夾:
- Core际跪,盛放RFM核心框架業(yè)務(wù)邏輯商佛,屬于不需要改變的部分。
- View姆打,盛放視圖層的計(jì)算邏輯良姆,與業(yè)務(wù)無(wú)關(guān),實(shí)現(xiàn)動(dòng)態(tài)染色或建立可視化幔戏。
- 依賴(lài)注入玛追,盛放RFM各分量的實(shí)際業(yè)務(wù)計(jì)算邏輯。
值得說(shuō)明的是闲延,這三個(gè)文件夾幾乎是任何通用了標(biāo)準(zhǔn)模型的標(biāo)配痊剖,因?yàn)槟P偷耐ㄓ眯裕厝淮嬖谝粋€(gè)框架性的業(yè)務(wù)邏輯垒玲;而實(shí)際的邏輯是以實(shí)際為準(zhǔn)的邢笙,則必然由依賴(lài)注入完成;邏輯的最終體現(xiàn)通常是可視化侍匙,而在PowerBI中的報(bào)表層氮惯,則是DAX驅(qū)動(dòng)的,因此想暗,具有View妇汗。
重要業(yè)務(wù)邏輯優(yōu)化及完備性
有戰(zhàn)友提出了一個(gè)非常有價(jià)值的問(wèn)題:該模型的計(jì)算是否可以只針對(duì)老客戶(hù)進(jìn)行? 當(dāng)時(shí)我們給了實(shí)現(xiàn)的建議说莫,由于該建議的合理性和重要性杨箭,這里給出標(biāo)準(zhǔn)實(shí)現(xiàn)以供參考。
業(yè)務(wù)邏輯的合理性論證
將原子計(jì)算指定為用于老用戶(hù)储狭,這具有非常重要的現(xiàn)實(shí)意義互婿,對(duì)于所選區(qū)間的新用戶(hù)是不存在RFM的。因此辽狈,準(zhǔn)確地講慈参,RFM是對(duì)老客戶(hù)進(jìn)行分類(lèi)的進(jìn)一步方法。也就是說(shuō)刮萌,對(duì)于對(duì)客戶(hù)的分類(lèi)法驮配,可以認(rèn)為:
- 首先,將客戶(hù)分為新客戶(hù)和老客戶(hù);
- 其次壮锻,再將老客戶(hù)按RFM分為8種類(lèi)型分別運(yùn)營(yíng)琐旁。
整個(gè)運(yùn)營(yíng)邏輯結(jié)構(gòu)如下:
從運(yùn)營(yíng)的角度看,重復(fù)購(gòu)買(mǎi)幾乎被認(rèn)定為商業(yè)模式是否成功的必要判斷標(biāo)準(zhǔn)猜绣,因此灰殴,合理有效的老客戶(hù)就非常重要,而對(duì)于不同類(lèi)型的老客戶(hù)需要采取的運(yùn)營(yíng)策略和資源又會(huì)不同掰邢,因此验懊,RFM幾乎是一種自然而然地標(biāo)準(zhǔn)分類(lèi)法則,而這應(yīng)該是基于老客戶(hù)進(jìn)行的尸变。
DAX 設(shè)計(jì)與實(shí)現(xiàn)
因此义图,這里對(duì) RFM 的核心邏輯植入這一業(yè)務(wù)邏輯,其核心業(yè)務(wù)邏輯如下:
- 對(duì)于所選的日期區(qū)間召烂,計(jì)算其中的老客戶(hù)集合碱工;
- 對(duì)于任意其中的老客戶(hù),實(shí)施RFM分類(lèi)及計(jì)算奏夫。
DAX如下:
VAR OldCustomers = FILTER( VALUES( 'Order'[客戶(hù)ID] ) , CALCULATE( MIN( 'Order'[訂單日期] ) , ALL( 'Model.Date' ) ) < MIN( 'Model.Date'[Date] ) )
RETURN
IF( SELECTEDVALUE( User[客戶(hù)ID] ) IN OldCustomers ,
< 真正的計(jì)算邏輯 >
)
其中怕篷,<真正的計(jì)算邏輯>
由依賴(lài)注入給出,這也是充分體驗(yàn)設(shè)計(jì)模式的地方酗昼。在實(shí)際的實(shí)現(xiàn)中廊谓,則是:
RFM.Item.M =
VAR OldCustomers = FILTER( VALUES( 'Order'[客戶(hù)ID] ) , CALCULATE( MIN( 'Order'[訂單日期] ) , ALL( 'Model.Date' ) ) < MIN( 'Model.Date'[Date] ) )
RETURN IF( SELECTEDVALUE( User[客戶(hù)ID] ) IN OldCustomers , [RFM.Item.M.Action] )
其中,依賴(lài)注入項(xiàng)為[RFM.Item.M.Action]
麻削,其實(shí)現(xiàn)為:
RFM.Item.M.Action =
[KPI.Auto] / MAXX( ALL( User[客戶(hù)名稱(chēng)] ) , [KPI.Auto] ) * 100
而全局平局的值則為:
RFM.Aver.M =
AVERAGEX( ALLSELECTED( User[客戶(hù)名稱(chēng)] ) , [RFM.Item.M] )
因此蒸痹,整個(gè)邏輯就非常清晰了。
設(shè)計(jì)的巧妙之處
確實(shí)出現(xiàn)了非常細(xì)心的戰(zhàn)友伙伴呛哟,問(wèn)道叠荠,如果一個(gè)人沒(méi)有銷(xiāo)售記錄,出現(xiàn)空值扫责,如何處理榛鼎?在計(jì)算整體平均時(shí),是否考慮出現(xiàn)空值的客戶(hù)鳖孤?
由于核心的業(yè)務(wù)邏輯框架改用了老客戶(hù)版本者娱,那么當(dāng)前日期區(qū)間必然存在購(gòu)買(mǎi)記錄,否則就不是老客戶(hù)了苏揣。而對(duì)于不是老客戶(hù)的人黄鳍,其RFM得分也是空。最巧妙地計(jì)算就在于整體平均計(jì)算會(huì)忽略這些空值腿准,使得整個(gè)計(jì)算結(jié)果是合理有效的际起。
這種巧妙地設(shè)計(jì)要精通DAX的每個(gè)細(xì)節(jié),因?yàn)檫@些計(jì)算上的巧合使得整個(gè)模型多一寸嫌多吐葱,少一寸嫌少街望,剛剛好的感覺(jué)很棒。
RFM 模型的完備性
一般在數(shù)學(xué)領(lǐng)域會(huì)用完備性來(lái)描述一個(gè)框架的完整性弟跑,而該模型就滿(mǎn)足一種完備性灾前。
經(jīng)過(guò)上述的調(diào)整,我們得到了無(wú)懈可擊的完美RFM模型如下:
Core孟辑,實(shí)現(xiàn)了RFM的核心邏輯:
- 分別計(jì)算任意元素的R哎甲,F(xiàn),M分量值饲嗽;
- 分別計(jì)算任意元素的R炭玫,F(xiàn),M分量分類(lèi)貌虾;
- 分別計(jì)算整體的R吞加,F(xiàn),M均值尽狠;
- 計(jì)算任意元素的RFM分類(lèi)衔憨;
- 計(jì)算任意元素的RFM分類(lèi)顏色;
- 計(jì)算任意元素的RFM定量加權(quán)總計(jì)袄膏;
- 計(jì)算在不同RFM分類(lèi)下的客戶(hù)數(shù)践图;
其中,R沉馆,F(xiàn)码党,M分量的計(jì)算由依賴(lài)注入項(xiàng)(度量值)給出。
整個(gè)邏輯框架斥黑,完美得無(wú)懈可擊闽瓢,太兇殘了,多一個(gè)嫌多心赶,少一個(gè)嫌少扣讼,剛剛好。
靈活與性能的平衡
這樣的完美模型缨叫,怎能不去平衡下性能呢椭符,其實(shí)為了保持性能,我們并沒(méi)有將模型的動(dòng)態(tài)性發(fā)揮到極致耻姥。這也不斷在向伙伴們展示销钝,在我們可以駕馭任意級(jí)別的動(dòng)態(tài)性之后,我們?nèi)匀豢梢宰匀绲幕赝说揭粋€(gè)平衡的位置琐簇,為什么沒(méi)有2.0.0版蒸健,其實(shí)伙伴們直接拿到的2.1版座享,本次發(fā)布的是2.2版,這是因?yàn)?.0版的設(shè)計(jì)考慮了極致的動(dòng)態(tài)性似忧,導(dǎo)致核心散點(diǎn)圖計(jì)算需要15秒渣叛,而完全優(yōu)化后達(dá)到了0.8秒,當(dāng)然盯捌,2.2版由于加入了少許復(fù)雜的計(jì)算淳衙,性能略有下降,我們實(shí)測(cè)結(jié)果如下:
可以這么歸納:
- 極致動(dòng)態(tài)饺著,犧牲性能 需15秒
- 平衡動(dòng)態(tài)箫攀,平衡性能 需0.8秒
- 進(jìn)階動(dòng)態(tài),合理性能 需1.8秒
合理可接受幼衰,因此靴跛,我們最終采用這一版本。
總結(jié)
整體說(shuō)來(lái)渡嚣,RFM模型整體如下:
整體設(shè)計(jì)采用MVC設(shè)計(jì)模式汤求,并通過(guò)依賴(lài)注入提供靈活擴(kuò)展,并采用了規(guī)范化的命名系統(tǒng)严拒。
最終形成效果:
該模型設(shè)計(jì)在八個(gè)維度下全量動(dòng)態(tài)計(jì)算扬绪,模型同時(shí)兼具了業(yè)務(wù)能力強(qiáng),邏輯嚴(yán)密裤唠、靈活擴(kuò)展挤牛、性能強(qiáng)大,展現(xiàn)精巧种蘸,設(shè)計(jì)規(guī)范墓赴,精致細(xì)節(jié)等特色,是非常經(jīng)典的商業(yè)智能范例航瞭,也是目前世界范圍內(nèi)最強(qiáng)大的(沒(méi)有之一)PowerBI DAX RFM 商業(yè)智能案例實(shí)現(xiàn)诫硕。充分展示了PowerBI及DAX的能力,毫不夸大地說(shuō)刊侯,這是無(wú)懈可擊的完美模型章办,該 RFM2.2 模型 既可以直接套用,又特別適合用來(lái)研習(xí)PowerBI及DAX的精華滨彻,對(duì)于PowerBI用戶(hù)來(lái)說(shuō)藕届,是絕對(duì)不可錯(cuò)過(guò)的,希望大家可以照此練習(xí)亭饵,建議對(duì)照1.0版休偶,2.1版,2.2版學(xué)習(xí)辜羊,您會(huì)看到一個(gè)模型是如何一步步從初始狀態(tài)優(yōu)化成為一個(gè)無(wú)懈可擊的完美模型踏兜。也歡迎戰(zhàn)友伙伴們提出更多好的想法词顾,優(yōu)化是永無(wú)止境的。周末又到了碱妆,戰(zhàn)友們肉盹,盡情享用吧。