在上一篇中,我讲解了关联规则的原理和实现步骤,如果大家看懂了,其实很好理解。但是说起来容易做起来难,如何通过工具将原始数据处理得到有效可靠的结果还是会存在问题。实际工作是让你解决问题而不只是说出解决思路。本篇就是在理论的基础上,结合实际数据来展示如何使用Python实现关联规则和如何在PowerBI中导入Python脚本生成数据表并以可视化的方式动态展示。

在使用Python解决某个问题时,其实并不是从0到1一步一步搭建,这个过程很繁琐,有时候为了实现一个小小的效果可能得绕很大的弯,所以就跟“调参侠”一样,我们往往使用别的搭好的梯子。这也是为什么Python语言这么受欢迎,因为它有很完善的开源社区和不计其数的工具库库来实现某个目的。我们在实现计算关联规则时,使用的是机器学习库mlxtend中的apriori,fpgrowth,association_rules算法。
apriori 是一种流行的算法,用于在关联规则学习中应用提取频繁项集。apriori 算法旨在对包含交易的数据库进行操作,例如商店客户的购买。如果满足用户指定的支持阈值,则项集被认为是“频繁的”。例如,如果支持阈值设置为 0.5 (50%),则频繁项集被定义为在数据库中至少 50% 的所有事务中一起出现的一组项目。

一、数据集

#导入相关的库
import pandas as pd
import mlxtend  #机器学习库
#编码包
from mlxtend.preprocessing import TransactionEncoder
#关联规则计算包
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowth,association_rules
pd.set_option('max_colwidth',150)  #对pandas显示效果设置,列显示字段长度最长为150个字符          #导入数据集
Order = pd.read_excel("D:/orders.xlsx")
#查看数据集的大小
Order.shape

#查看数据前10行
Order.tail(5)

数据集中有121253条数据,总共有四个字段,SalesOrderNumber是指订单号;ordernumber是指子订单号,下换线加数字表明是订单的第几个子订单,每个订单号下可能有一个或多个子订单,而每个子订单是不重复的,对应一个产品;Product是指商品名称。

二、mlxtend

在实际开始前我们先来了解这个mlxtend中的包怎么用的。在mlxtend官网上演示了如何实现关联规则的计算,我们来看一下总共有三步:
第一步,导入apriori算法包;
第二步,将原始订单数据处理成算法支持的格式;
第三步,计算支持度、置信度、提升度等指标并筛选强规则。

第一步:导入apriori算法包

第二步,将原始订单数据处理成算法支持的格式:

在实际获取到的数据往往是我上一篇中举例那样,订单号后以列表的形式排列商品。所以mlxtend包接受这样数据格式。但是用于计算却不能直接这样用,一是真实数据都是文本,二是apriori算法包需要一个将原始数据转化为商品独热编码的Pandas Dataframe格式。以下是输入数据:

它使用TransactionEncoder包来将输入数据转换成我们需要的形式。以下是转换的代码和结果:

接下来,它将处理好的数据格式喂给apriori算法包,计算频繁项集(itemsets)和支持度。根据自己预先设定的最小支持度为0.6来排除非频繁项集。

然而上面有个问题,上面返回的结果集是数字,其实是df表里每个项(item)的索引,这对于后面处理比较方便,但是如果只想用这个结果。为了增加可读性,可以使用use_colnames=True的参数来显示原本的商品名。

第三步,计算支持度、置信度、提升度

这里没有在apriori算法包里演示第三步,这是为什么呢?因为apriori算法包只是关联规则里的第一步–找频繁项集,当然不会发现强关联规则啦!这一步是在另一个包association_rules里实现的。这里也是很多初学者会容易出现的问题,不知道各个包的用法,不清楚怎么调用包。

这样我们就算出了所有符合最小支持度的频繁项集的支持度、置信度、提升度,上面还出现leverage和conviction,这两个的作用同提升度lift的作用是一样的,之前我讲过最好使用KLUC度量和IR不平衡比例,不过显然mlxtend的开发者更喜欢使用leverage和conviction,这里先不管它。本案例只演示使用支持度lift。

三、Python实现关联规则代码

第一步,生成格式数据

以上是官网给出的关联规则包用法。接下来我用自己的数据集实际操作,并演示如何在PowerBI中导入Python脚本生成数据表并以可视化的方式动态展示。上面已经给出了示例数据。可以看到数据集是每个订单有多个商品,但是一行一行的,不是一个订单后面一行接所以商品的形式。所以这里要想办法从行转换到列。这里使用Pandas中的分组功能,要实现的效果如下:

#使用DataFrame的groupby函数
group_df = Order.groupby(['SalesOrderNumber'])

如果大家会写SQL的话应该知道groupby分组必须与聚合函数一起结合使用,因为它是一个mapreduce的过程。如果按订单号分组而没有使用聚合函数的话,在SQL Server中会报错,在Mysql中只会返回第一行数据。而这里直接使用了groupby分组没有用聚合函数,这不会有什么问题吗?我们来看一下结果group_df:

group_df.head(2) #查看数据集


上面这张图是把groupby后的结果(本以为返回的是数据集),分别去取前2个和前5个来看,结果发现返回的数据不一样和数据集大小也不一样(注意我们最开始查看数据显示的是121253条数据)。实际上这个groupby后的结果是一个生成器,它返回的是动态的分组过程,如果要使用结果可以喂不同的参数来获取实际结果。所以就利用这个功能来实现group_oncat,生成商品列表。

df_productlist = pd.DataFrame({"productlist":group_df['Product'].apply(list)}).reset_index()
df_productlist.head(5)

上面这段代码的意思是生成一张新表,这张表是有按照SalesOrderNumber分组,然后将每个订单组的Product按照列表聚合在一起;这张表只有了两列,一列是分组依据SalesOrderNumber,另一列命名为productlist;最后将原数据标的索引去掉,重置索引,最后得到df_productlist表,这样我们就形成了算法接受的输入数据格式。下面是查看前5行的结果:

#因为只需要频繁项集,所以这里去掉订单号,将productlist转为numpy数组格式。
df_array = df_productlist["productlist"].tolist()
df_array[0:3]  #取前三个查看


可以看到形成了输入数据,我们再使用TransactionEncoder对数据进行处理,生成每个商品(项)的独热编码DataFrame格式:

trans= TransactionEncoder()  #调用编码包
trans_array = trans.fit_transform(df_array)  #将数据集喂进编码包进行转换
df_item = pd.DataFrame(trans_array, columns=trans.columns_)  #将转换好的数据转成DataFrame格式
df_item.head()

第二步,生成频繁项集

生成最终数据格式后,将数据喂给apriori算法包生成频繁项集:

#给定最小支持度为0.01,显示列名
frequent_itemset = apriori(df_item,min_support=0.01,use_colnames=True)
frequent_itemset.tail(5)


算法生成的结果也是DataFrame格式的频繁项集,它会把频繁1项集、频繁2项集、频繁3项集等所有大于等于最小支持度的结果返回。这里显示的是频繁1项集。

实际上为了便于我们查看和筛选,还可以对频繁项集的长度进行计数,从而可以动态索引。

frequent_itemset['length'] = frequent_itemset['itemsets'].apply(lambda x: len(x))
frequent_itemset[ (frequent_itemset['length'] == 2) &(frequent_itemset['support'] >= 0.01) ]

这段代码的意思是找出支持度大于等于0.01的频繁2项集,也就是我们常常关心的顾客买了一个商品,还会买哪个商品的情况。

上面完成了第一步频繁项集的生成之后,下面就是挖掘关联规则。

第三步,计算支持度、置信度、提升度

association = association_rules(frequent_itemset,metric="confidence",min_threshold=0.01)
association.head()


上面这张表显示共找到了169034个可供选择的关联规则,列名分别是什么意思呢?
antecedents:表示先购买的产品(组合),consequents表示后购买的产品(组合);
antecedent support:表示先购买的产品(组合)占所有订单的支持度;
consequent support:表示后购买的产品(组合)占所有订单的支持度;
support:表示同时购买两个产品(组合)的情况占所有订单的支持度;
confidence:表示同时购买两个产品(组合)的情况占所有订单的支持度与antecedent support的比值,也就是规则的置信度;
lift:表示的是confidence与consequent support的比值,也就是提升度,验证先购买的产品(组合)再购买B产品组合的可能性的有效性;

最后我们只关注买了一件再买一件和买了两件再买一件的情况,这是最常见的实际场景需求。所以生成两张表df_BuyAB和df_BuyABC。以下是完整代码,如果你有相同格式的数据集,可以直接跑通这个算法。

import pandas as pd
import mlxtend
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, fpmax, fpgrowth,association_rules
Allorder = pd.read_excel("D:/4_MySQL/AdventureWorksDW2012/Allorder.xlsx")
group_df = Allorder.groupby(['SalesOrderNumber'])
df_productlist = pd.DataFrame({"productlist":group_df['Product'].apply(list)}).reset_index()
df_array = df_productlist["productlist"].tolist()
trans= TransactionEncoder()
trans_array = trans.fit_transform(df_array)
df_association = pd.DataFrame(trans_array, columns=trans.columns_)
frequent_itemset = apriori(df_association,min_support=0.01,use_colnames=True)
association = association_rules(frequent_itemset,metric="confidence",min_threshold=0.01)
BuyAB = association[(association['antecedents'].apply(lambda x :len(x)==1)) & (association['consequents'].apply(lambda x :len(x)==1))]
BuyABC = association[(association['antecedents'].apply(lambda x :len(x)==2)) & (association['consequents'].apply(lambda x :len(x)==1))]

文章开头的视频展示的是如何利用这个Python脚本实现动态可视化,以便于业务人员使用,提高销售业绩。如果文章开头没有视频,可以去我的知乎上查看。

最后欢迎大家关注我,我是拾陆,搜索公众号“二八Data”,更多技术干货持续奉献。

关联规则算法怎么实现?Python代码、PowerBI可视化详细解释给你听(下-实战篇)相关推荐

  1. BPR贝叶斯个性化推荐算法—推荐系统基础算法(含python代码实现以及详细例子讲解)

    BPR贝叶斯个性化排序算法 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式反馈与隐式反馈的比较 2.3 显式反馈与隐式反馈的评价方法 2.3.1 显式反馈数据模 ...

  2. python重点知识归纳_一文了解机器学习知识点及其算法(附python代码)

    一文了解机器学习知识点及其算法(附python代码) 来源:数据城堡 时间:2016-09-09 14:05:50 作者: 机器学习发展到现在,已经形成较为完善的知识体系,同时大量的数据科学家的研究成 ...

  3. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  4. Dijkstra(迪杰斯特拉)求解最短路(附python代码和可视化)

    文章目录 前言 一.最短路模型 二.迪杰斯特拉算法 二.python代码实现 结果展示 前言 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算 ...

  5. 波斯公主选驸马python代码及可视化

    欢迎关注,敬请点赞! 波斯公主选驸马python代码及可视化 思路 代码 结论 前文链接:<波斯公主选驸马> 前文简单介绍了<波斯公主选驸马>的思路和公式推导,此文用pytho ...

  6. 国密算法 SM2公钥密码 SM3杂凑算法 SM4分组密码 python代码完整实现

    包含SM2公钥密码.SM3杂凑算法和SM4分组密码的国密算法完整工具包完成了.此前分别发布过上述三个算法的代码: SM2:国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完 ...

  7. 【实战案例】分享6种常用的信用卡欺诈检测算法(附 Python 代码)

    大家好,本文旨在使用 XGBoost.随机森林.KNN.逻辑回归.SVM 和决策树解决信用卡潜在欺诈的分类问题,内容较长,建议收藏.点赞. 文章目录 技术提升 案例简介 导入相关模块 导入数据 探索性 ...

  8. apriori算法代码python_Apriori算法原理及Python代码

    一.Apriori算法原理 参考:Python --深入浅出Apriori关联分析算法(一)​www.cnblogs.com 二.在Python中使用Apriori算法 查看Apriori算法的帮助文 ...

  9. 密码算法中iv值是什么_?标检测中的?极?值抑制算法(nms):python代码解析

    ⾮极⼤值抑制(Non-Maximum Suppression)原理 ⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值.这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法 ...

最新文章

  1. 计算机病毒攻防技术研究,计算机网络病毒辐射攻防技术研究.pdf
  2. python中文_python自然语言处理中文翻译资料分享
  3. android广告页白屏_android 白屏
  4. RxJS之BehaviorSubject
  5. 与计算机相关的课外活动,课外活动学生论文,关于应用型院校计算机专业课外活动相关参考文献资料-免费论文范文...
  6. android onscrolllistener判断到底部,判断RecyclerView是否滑动到底部
  7. php 一键登录插件,FastAdmin一键管理插件
  8. Linux vi 行尾 ctrl,linux中vi使用技巧常用技巧和高级替换
  9. vscode之调试es6代码
  10. wire routing 网格寻址
  11. docker安装JDK
  12. 基于matlab的信号与系统实验,基于MATLAB的《信号与系统》实验系统
  13. C++编程读取注册表文件
  14. ps—ps,cs6图层面板解释,图层样式详解
  15. 解决通过无线路由上网,但有些网站打不开的问题
  16. 苹果手机应用分身_云手机应用多开app推荐 好用的多开分身软件
  17. 悠悠古舟渡,浅浅时光去
  18. 《软件登记测试报告》可以作为软件第三方检测报告使用吗
  19. 软件包管理工具snap的安装及常用命令
  20. 有限状态机 FSM——Finite State Machine

热门文章

  1. javaswing实现扫雷游戏
  2. js 页面高度 页面宽度
  3. 【文末赠书】用Python实现一个电影订票系统!
  4. 英语字母abcd在计算机内部,abcd字母表
  5. esp01s作为ap,收发数据
  6. 用js制作一个新年倒计时
  7. 如何设计一个基于SSM的旅游网站管理系统
  8. 百度离线地图API2.0 百度离线地图api,已经修改源码
  9. android apk 反编译,修改version后重新打包
  10. 数据总线, 地址总线, 控制总线详解.