python关联分析引擎_PowerBI x Python 之关联分析(上)
前言
據(jù)說,全球零售業(yè)巨頭沃爾瑪在對(duì)消費(fèi)者購(gòu)物行為分析時(shí)發(fā)現(xiàn),男性顧客在購(gòu)買嬰兒尿片時(shí),常常會(huì)順便搭配幾瓶啤酒來犒勞自己,于是嘗試推出了將啤酒和尿布擺在一起的促銷手段。沒想到這個(gè)舉措居然使尿布和啤酒的銷量都大幅增加了。這個(gè)“啤酒+尿布”的購(gòu)物籃組合,就是關(guān)聯(lián)分析的一個(gè)經(jīng)典應(yīng)用場(chǎng)景。簡(jiǎn)單來說,關(guān)聯(lián)分析就是在大量數(shù)據(jù)中找到最常出現(xiàn)的組合。
關(guān)于Power BI如何做關(guān)聯(lián)分析,網(wǎng)上已經(jīng)有不少文章(如馬老師之前的推文,以以及power bi星球等等),其中的核心是合并及userelationship。但以往這些PowerBI的案例里,純用dax和PQ的技巧,只做出了兩兩之間的關(guān)聯(lián)度,難以求出三個(gè)或者更多產(chǎn)品之間的關(guān)聯(lián)度。所以本文介紹如何在PowerBI里借助Python快速求出頻繁項(xiàng)集(關(guān)聯(lián)度較大的組合)。
解決方案
對(duì)于本案,在PowerBI中使用Python有兩種方法:一種是使用Py可視化控件,在控件里用Python直接作圖;另一種是在PQ里處理數(shù)據(jù),求出所需的頻繁項(xiàng)集,再用PowerBI的原生控件進(jìn)行可視化。本文先講解前者。
本案的數(shù)據(jù)(BreadBasket,面包購(gòu)物籃)結(jié)構(gòu)如下。前兩列是購(gòu)物時(shí)間,Transaction是購(gòu)物單編號(hào),Item是物品。
首先選取Py可視化控件,拖動(dòng)到畫布上,然后再選中所需的字段,結(jié)果如下:
在Power Bi的下方出現(xiàn)了一個(gè)新的窗口(編輯器)。選中字段后,編輯器生成6行代:意味著Pandas和matplotlib兩個(gè)庫(kù)默認(rèn)導(dǎo)入,同時(shí)生成了包含所選字段的數(shù)據(jù)幀dataset。接下來,即可在編輯器中編輯代碼。只要本地安裝了庫(kù),都可以導(dǎo)入。而該控件要求代碼最后必須顯示圖表,否則會(huì)提示出錯(cuò)。
Python進(jìn)行關(guān)聯(lián)分析有幾個(gè)好用的庫(kù)。在輸入和輸出數(shù)據(jù)的便捷性上,個(gè)人認(rèn)為Mlxtend最合適。具體代碼如下:
from mlxtend.frequent_patterns import apriori
from mlxtend.preprocessing import TransactionEncoder
import pandas as pd
import matplotlib.pyplot as plt
data=dataset
data.Item=data.Item.str.lower()
data=data.drop(data[data["Item"]=='none'].index) #刪除無(wú)物品的記錄
# 將數(shù)據(jù)集進(jìn)行格式轉(zhuǎn)換
orders_series = data.set_index("Transaction")["Item"]
transactions = []
temp_index = 0
for i, v in orders_series.items():
if i != temp_index:
temp_set = set()
temp_index = i
temp_set.add(v)
transactions.append(temp_set)
else:
temp_set.add(v)
# 數(shù)據(jù)轉(zhuǎn)碼
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df = pd.DataFrame(te_ary, columns=te.columns_)
# 求頻繁項(xiàng)集
frequent_items=apriori(df,min_support=0.02,use_colnames=True) # 支持度為0.02
frequent_items["itemsets"]=frequent_items["itemsets"].apply(lambda x:[x for x in x]) # 頻繁項(xiàng)集frozenset轉(zhuǎn)list
frequent_items["itemsets"]=frequent_items["itemsets"].apply(lambda x:','.join(x)) # 頻繁項(xiàng)集list轉(zhuǎn)str
frequent_items=frequent_items.sort_values(["support"],ascending=False) # 按支持度降序排序
fi=frequent_items[frequent_items["itemsets"].str.contains(",")] # 篩選出多于1個(gè)物品的頻繁項(xiàng)集
# 作圖
x=fi["itemsets"]
y=fi["support"]
y_label = ["{:.3f}".format(_y) for _y in y] # 橫坐標(biāo)標(biāo)簽
plt.bar(fi["itemsets"],fi["support"], align='center', alpha=0.5) # 作圖
plt.xticks(x, rotation=60) # 設(shè)置標(biāo)簽旋轉(zhuǎn)角度
# 添加橫坐標(biāo)
for a, b, label in zip(x, y, y_label):
plt.text(a, b, label, ha='center', va='bottom')
plt.show()
點(diǎn)擊運(yùn)行,我們就得到以頻繁項(xiàng)集為橫坐標(biāo),支持度(出現(xiàn)概率)為縱坐標(biāo)的柱狀圖:
優(yōu)缺點(diǎn)
正如上文提到,本方法直接求出的是出現(xiàn)概率最大的物品組合,組合中物品數(shù)量2個(gè)起,上不封頂。在整體層面的指導(dǎo)意義更大。此外,使用可視化Py控件,可以直接參與不同控件之間的聯(lián)動(dòng)。如下圖所示,增加了日期切片器,數(shù)據(jù)可以即時(shí)變化。
不足的地方主要在于Python作圖的風(fēng)格與Power BI的整體風(fēng)格不一致,而且調(diào)整難度比較大。而且只能被動(dòng)聯(lián)動(dòng),而不能主動(dòng)聯(lián)動(dòng)。下一篇將介紹PQ的方法,能更好地克服控件法的這些不足。
總結(jié)
以上是生活随笔為你收集整理的python关联分析引擎_PowerBI x Python 之关联分析(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人信用贷款10万条件 满足这几点要
- 下一篇: websocket python爬虫_p