PowerBI x Python 之关联分析(上)

前言
据说,全球零售业巨头沃尔玛在对消费者购物行为分析时发现,男性顾客在购买婴儿尿片时,常常会顺便搭配几瓶啤酒来犒劳自己,于是尝试推出了将啤酒和尿布摆在一起的促销手段。没想到这个举措居然使尿布和啤酒的销量都大幅增加了。这个“啤酒+尿布”的购物篮组合,就是关联分析的一个经典应用场景。简单来说,关联分析就是在大量数据中找到最常出现的组合。

关于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的方法,能更好地克服控件法的这些不足。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值