前言
据说,全球零售业巨头沃尔玛在对消费者购物行为分析时发现,男性顾客在购买婴儿尿片时,常常会顺便搭配几瓶啤酒来犒劳自己,于是尝试推出了将啤酒和尿布摆在一起的促销手段。没想到这个举措居然使尿布和啤酒的销量都大幅增加了。这个“啤酒+尿布”的购物篮组合,就是关联分析的一个经典应用场景。简单来说,关联分析就是在大量数据中找到最常出现的组合。
关于Power BI如何做关联分析,网上已经有不少文章(如马老师之前的推文,以以及power bi星球等等),其中的核心是合并及userelationship。但以往这些PowerBI的案例里,纯用dax和PQ的技巧,只做出了两两之间的关联度,难以求出三个或者更多产品之间的关联度。所以本文介绍如何在PowerBI里借助Python快速求出频繁项集(关联度较大的组合)。
解决方案
对于本案,在PowerBI中使用Python有两种方法:一种是使用Py可视化控件,在控件里用Python直接作图;另一种是在PQ里处理数据,求出所需的频繁项集,再用PowerBI的原生控件进行可视化。本文先讲解前者。
本案的数据(BreadBasket,面包购物篮)结构如下。前两列是购物时间,Transaction是购物单编号,Item是物品。
首先选取Py可视化控件,拖动到画布上,然后再选中所需的字段,结果如下:
在Power Bi的下方出现了一个新的窗口(编辑器)。选中字段后,编辑器生成6行代码:意味着Pandas和matplotlib两个库默认导入,同时生成了包含所选字段的数据帧dataset。接下来,即可在编辑器中编辑代码。只要本地安装了库,都可以导入。而该控件要求代码最后必须显示图表,否则会提示出错。
Python进行关联分析有几个好用的库。在输入和输出数据的便捷性上,个人认为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) #删除无物品的记录
# 将数据集进行格式转换
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)
# 数据转码
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df = pd.DataFrame(te_ary, columns=te.columns_)
# 求频繁项集
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]) # 频繁项集frozenset转list
frequent_items["itemsets"]=frequent_items["itemsets"].apply(lambda x:','.join(x)) # 频繁项集list转str
frequent_items=frequent_items.sort_values(["support"],ascending=False) # 按支持度降序排序
fi=frequent_items[frequent_items["itemsets"].str.contains(",")] # 筛选出多于1个物品的频繁项集
# 作图
x=fi["itemsets"]
y=fi["support"]
y_label = ["{:.3f}".format(_y) for _y in y] # 横坐标标签
plt.bar(fi["itemsets"],fi["support"], align='center', alpha=0.5) # 作图
plt.xticks(x, rotation=60) # 设置标签旋转角度
# 添加横坐标
for a, b, label in zip(x, y, y_label):
plt.text(a, b, label, ha='center', va='bottom')
plt.show()
点击运行,我们就得到以频繁项集为横坐标,支持度(出现概率)为纵坐标的柱状图:
优缺点
正如上文提到,本方法直接求出的是出现概率最大的物品组合,组合中物品数量2个起,上不封顶。在整体层面的指导意义更大。此外,使用可视化Py控件,可以直接参与不同控件之间的联动。如下图所示,增加了日期切片器,数据可以即时变化。
不足的地方主要在于Python作图的风格与Power BI的整体风格不一致,而且调整难度比较大。而且只能被动联动,而不能主动联动。下一篇将介绍PQ的方法,能更好地克服控件法的这些不足。