返回介绍

4.4 关联分析

发布于 2024-01-27 22:54:28 字数 14704 浏览 0 评论 0 收藏 0

关联分析通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则,它是从大量数据中发现多种数据之间关系的一种方法;另外,它也可以基于时间序列对多种数据间的关系进行挖掘。关联分析的典型案例是“啤酒和尿布”的捆绑销售,即买了尿布的用户还会同时买啤酒。

常用的关联算法包括Apriori、FP-Growth、PrefixSpan、SPADE、AprioriAll、Apriori-Some等。

关联规则相对其他数据挖掘模型更加简单,易于业务理解和应用。关联模型的典型应用场景是购物篮分析等,通过分析用户同时购买了哪些商品来分析用户购物习惯。这种策略还会应用于捆绑销售、库存管理、商品促销设计、页面促销设计、货架设计、商品陈列设计、页面内容排版、推荐系统、商品价格策略和基于购买的用户特征分析等。网站分析工具Webtrekk中的关联分析报表便应用了关联规则算法。

4.4.1 频繁规则不一定是有效规则

所谓频繁规则指的是关联结果中支持度和置信度都比较高的规则,而有效规则指的是关联规则真正能促进规则中的前/后项的提升。在做关联结果分析时,频繁规则往往会被“想当然”地认为是有效规则,但实际情况却并非总是如此。

假如,数据集有1000条事务数据用来显示购买苹果和香蕉的订单记录,其中有600个客户的订单记录中包含了苹果,有800个客户的订单记录中包含了香蕉,而有400个客户同时购买了苹果和香蕉。假如我们产生了一条关联规则,用来表示购买了苹果的客户中还有很多人购买香蕉,那么该规则可以表示为:苹果→香蕉。

支持度:support=400/1000=40%

置信度:confidence=400/600=67%

如果只是看支持度和置信度,这个规则似乎非常显著的说明了苹果和香蕉之间的频繁关系,买了苹果的客户中有67%的人也会一起购买香蕉。但是,如果忽略购买苹果的事实,只购买香蕉的客户比例会高达是80%(800/1000)!这显示了购买苹果这种条件不会对购买香蕉产生积极的促进作用,反而会阻碍其销售,苹果和香蕉之间是一种负相关的关系。因此,只看支持度和置信度将无法完整体现规则的有效性,通过另一个指标提升度则可以有效应对该问题。

提升度(Lift)指的是应用关联规则和不应用产生结果的比例。在本示例中,Lift=(400)/(800)=0.5(有关联规则的前提下只有400个客户会购买香蕉,没有关联规则的前提下会有800个购买香蕉)。当提升度为1时,说明应用关联规则和不应用关联规则产生相同的结果;当提升度大于1时,说明应用关联规则比不应用关联规则能产生更好的结果;当提升度小于1时,关联规则具有负相关的作用,该规则是无效规则。

在做关联规则评估时,需要综合考虑支持度、置信度和提升度三个指标,支持度和置信度的值越大越好。但需要注意的是,在低频、客单价较高的领域,关联规则会呈现稀疏性,其支持度百分比可能只有几个百分点。对于提升度的评估,通常关注其值大于1的规则。

4.4.2 不要被啤酒尿布的故事紧固你的思维

关联规则的产生来源于“啤酒和尿布”的故事,这是商品销售间的关联分析。除了这种分析模式外,还能将关联分析应用到更多运营分析场景。

1.相同维度下的关联分析

相同维度下的关联分析指的是关联分析的前后项是相同逻辑的内容维度。例如商品——商品,内容——内容。该模式下常见的应用包括:

(1)网站页面浏览关联分析

网站页面浏览关联分析可以帮助我们找到用户在不同页面(包含广告页、活动页、超市页、单品页、帮助页等)之间的频繁访问关系,以分析用户特定的页面浏览模式。这种频繁模式可用于了解不同页面之间的分流和引流关系,尤其是大型落地页的分析;也可以用来做不同页面间的页面浏览推荐,利于提高用户网站体验和转化率。

(2)广告流量关联分析

广告流量关联分析是针对站外广告投放渠道用户浏览或点击的行为分析,该分析主要用于了解用户的浏览和点击广告的模式,例如点击了A广告之后又点击了B广告;浏览了C广告之后又浏览了D广告。这种站外广告曝光和点击的关联分析可以为广告客户的精准投放提供参考。除了用于站外广告分析,还可以用于网站引流的分析,假如公司通过一组整合传播媒体做活动宣传,那么我们可以分析用户通过宣传渠道到达网站的先后关系和频繁模式,可以从中发觉类似于用户从M广告到达网站之后,还会从N媒体点击到达网站,这对于广告媒体的投放组合和整合营销评估具有重要意义。

(3)用户关键字搜索关联分析

分析用户在站内的搜索关键字是发现用户搜索兴趣并了解用户真实需求的方法之一。通过对用户搜索关键字的关联分析,可以得到类似于搜索了苹果之后又搜索了iPhone,搜索了三星之后又搜索了HTC,这种关联模型可用于搜索推荐、搜索联想等场景,有助于改善搜索体验,提高客户的目标转化率。

2.跨维度的关联分析

除了可以做相同维度的关联分析,也可以基于不同维度做关联性分析。在4.3.2节中提到了一种基于属性特征+目标的形式做分类应用。除此之外,还可以有以下用法:

(1)不同场景下的关联分析

不同场景下的关联分析指的是发生的事件处于不同的时间下,但通常都在一个约束时间范围内(例如session、会话)。这种模式可以广泛用于分析运营中关注的要素,例如用户浏览商品与购买商品的关联分析、关注产品价格与购买商品价格的关联分析、用户加入购物车与提交订单的关联分析等。通过这种跨事件的关联分析,可以找到用户不同行为模式之间的关系,尤其可以发掘用户的真实需求和关注(潜在)需求之间的关联和差异性,这些信息可用于针对当前用户行为的个性化推荐,并对后续促销活动的价格策略的制定非常有参考价值。

(2)相同场景下的事件关联

相同场景下的事件关联指发生的事件在一个场景下,但属于不同的时间点。例如用户在同一个页面中点击不同功能、选择不同的应用、下载不同的白皮书等。这类信息可以帮助我们了解用户对于功能应用的先后顺序,有利于做产品优化和用户体验提升;对于不同产品功能组合、开发和升级有了更加明确的参考方向,便于针对用户习惯性操作模式做功能迭代;同时针对用户频繁查看和点击的内容,可以采用打包、组合、轮转等策略,帮助客户尽量缩小内容查找空间和时间,也能提升内容曝光度和用户体验度。

4.4.3 被忽略的“负相关”模式真的毫无用武之地吗

在应用关联分析时,我们大多会预先设置支持度和置信度阈值,以缩短算法计算时间并能有效提供具有显著性的强规则,然后通过提升度配合支持度和置信度共同提取有效规则。这种做法在大多数场景下并没有问题。

但是,很多支持度和置信度高而提升度低的强规则也有可利用的空间。当一个规则的支持度和置信度高时,说明这个规则是频繁的;但如果发现规则的提升度低,那么说明规则中的前后项是“互斥”的,即规则中的前后项通常不会一起发生。4.4.1节中的苹果和香蕉的例子就说明了这个问题。

这种规则说明了我们不能把规则中的前后项通过组合、打包或关联的策略展示给客户,它可以作为组合打包的控制条件来优化组合策略。典型应用场景包括:

在商品销售策略中,不将具有互斥性的商品放到同一个组合购买计划中。

在站外广告媒体的投放中,不将具有互斥性的多个广告媒体做整合传播或媒体投放。

在关键字提示信息中,不将具有互斥性的关键字提示给客户。

在页面推荐的信息流中,不将具有互斥性的信息流展示给用户。

4.4.4 频繁规则只能打包组合应用吗

常见的关联规则基于两种模式产生:基于同一个时间内发生的事件以及基于不同时间下发生的事件。

基于同一个时间内发生的事件:这种模式发生在同一时间点,例如购买篮分析就是用于在一次购物篮中同时购买的商品,这种场景下使用订单ID做事务型数据的主键。

基于不同时间下发生的事件:这种模式发生在不同的时间点,但是可以通过特定的主键信息关联,例如用户在不同日期购买了多件商品,这种场景下使用用户ID作为事务型数据的主键。

当通过上述规则分析得到关联结果后,第一反应就是应该把这些商品(或其他项目)放到一起做打包组合应用。例如,将用户常买的商品打包为一个促销方案,或者将用户经常一起浏览的内容作为专栏等。

但除了这种打包组合的思维方式之外,还可以这样考虑应用:既然用户具有较强的发生关联事件关系(例如购买、查看等)的可能性,那么可以基于用户的这种习惯,将前后项内容故意分离开,利用用户主动查找的时机来产生更多价值或完成特定转化目标。

例如:用户经常一起购买啤酒和尿布,我们可以分别将啤酒和尿布陈列在展柜的两端(或者隔开一段距离),然后在用户购买啤酒又去购买尿布的途中,也许会发现别的商品进而产生兴趣,从而实现更多的销售。

在用户完成两件事情的期间,不仅能促进商品销售,还能用于展示更多的广告和促销活动、提供更多的个性化内容等。这种方式可以将用户的更多兴趣激发出来。

但是,这种模式不是在所有关联规则下都能生效,需要具备一定的条件:

关联规则必须是强规则且有效规则。规则不频繁或无效则说明用户并不具有这种频繁习惯去完成两件事情,更何况需要花费更多的时间和精力。因此,刚需内容是最好的,其次是强规则且有效规则。

发生关联的前后项之间需要有非常强的完成动机。强动机是促进用户完成两件事情的主要原因,例如,在做大型促销活动时,需要用户完成多个步骤才能获得抄底价商品的购买资格就属于这类应用。

不能过多降低用户体验。用户体验在这个过程中是辅助于用户完成事件的重要因素,尤其对于关注用户体验的客户群来说,该因素更加重要。如果在用户完成不同事件间设置的环节或周期过长,会使得用户体验度的极度下降,这样会直接导致用户的放弃。因此,能在保证甚至提升客户一定的体验度的前期下,设计完成环节非常重要。

4.4.5 关联规则的序列模式

基于不同时间下发生的频繁规则,可以使用关联规则中的序列模型来分析。

序列模式相较于普通关联模式最大的区别是不同的事件之间具有明显的时间区隔,以及先后的序列发生关系,能得到类似于“完成某个事件之后会在特定的时间周期内完成其他事件”的结论,例如购买了冰箱的客户会在3个月内购买洗衣机的结论。这是一种预测性分析的模式,能够将事件发生的时间和对象提取出来,因此更加适合对基于时间下的数据化运营的应用需求。

常见的运营应用场景:

客户购买行为预测:基于用户上次的购买时间和商品信息,推断用户下次购物的时间和订单商品。

Web访问模式预测:基于用户上次浏览页面的时间和页面信息,推断用户下次最可能浏览的页面。

流量来源预测:基于用户上次网站到达时间和到访信息,推断用户下次最可能从哪些媒体渠道进入网站。

关键字搜索预测:基于用户上次搜索关键字的时间和关键字,推断用户下次最可能搜索哪些关键字。

能实现序列模式的关联算法包括:

AprioriAll:基于哈希树的序列关联算法,它与Apriori算法的执行过程是一样的,不同点在于候选集的产生,需要区分最后两个元素的前后顺序。

AprioriSome:该算法是对AprioriAll算法的改进。

CARMA(Continuous Association Rule Mining Algorithm):CARMA是一种比较新的关联规则算法,能够处理在线连续交易流数据。

GSP(Generalized Sequential Patterns):基于水平存储结构和哈希树遍历操作的序列关联算法,它具有类似于Apriori算法的实现步骤,主要区别在于产生候选序列模式。

SPADE(Sequential PAttern Discovery using Equivalence classes):基于垂直存储结构和格理论连接操作的序列关联算法,它是一种改进的GSP算法。

FreeSpan:频繁模式投影的序列关联算法,利用频繁项递归地将序列数据库投影到更小的投影数据库集中,在每个投影数据库中生成子序列片断,是一种分治思想的算法。

PrefixSpan(Prefix-Projected Pattern Growth):基于前缀树的序列关联算法,从Free-Span中推导演化而来。

4.4.6 代码实操:Python关联分析

对于Python,目前的流行数据科学计算库中尚没有一个广泛应用的关联算法库,因此本节我们无法直接使用流行库来做关联分析(在关联分析这个问题上,Python确实比R要逊色)。

Orange有关联算法应用,但它需要先下载和安装orange程序,再通过python库做调用,还不是完全的Python第三方扩算法库。

不过,得益于Python的开放性,我们可以在本地自定义一个算法包,然后直接导入Python程序中做关联分析。事实上,在很多运营分析中,我们都需要通过导入本地第三方包来解决特定问题,例如:

现有Python流行库中没有我们需要的算法,本示例就是如此。

企业内部根据实际运营需求开发了很多Python程序,这些程序需要集成到Python工作环境中。

企业内部的数据工作环境中,有预定义好的类和库,直接引用即可实现特定功能,无需重复“造轮子”。

现有的Python流行库中的算法存在某些问题和缺陷,在企业内部已经经过一定的优化和提升,而这些优化只能在企业内部应用。

示例模拟的是针对一批事务型的订单交易数据集做关联分析,以得到不同商品之间的关联规则;在本节示例代码的附件中,有一个名为apriori.py的关联算法包,该程序的基础版本来源于网络,并经过二次开发和修正以满足特定需求,它将作为本示例关键算法的主要工具包;数据源文件association.txt位于“附件-chapter4”中,默认工作目录为“附件-chapter4”(如果不是,请cd切换到该目录下,否则会报“IOError:File association.txt does not exist”)。

另外,对于关联分析的关系结果展示,我们会用到在4.3节中的GraphViz,同时需要一个封装的Python API第三方包——GraphViz,通过该包调用GraphViz自定义画图。读者可以在系统终端的命令行窗口通过pip install graphviz安装。以下是完整代码:

import sys
sys.path.append('../chapter4')
import pandas as pd
from graphviz import Digraph
import apriori

# 定义数据文件
fileName = 'association.txt'

# 通过调用自定义的apriori做关联分析
minS = 0.1  # 定义最小支持度阈值
minC = 0.38  # 定义最小置信度阈值
dataSet = apriori.createData(fileName)  # 获取格式化的数据集
L, suppData = apriori.apriori(dataSet, minSupport=minS)  # 计算得到满足最小支持度的规则
rules = apriori.generateRules(fileName, L, suppData, minConf=minC)  # 计算满足最小置信度的规则

# 关联结果报表评估
model_summary = 'data record: {1} \nassociation rules count: {0}'  # 展示数据集记录数和满足阈值定义的规则数量
print (model_summary.format(len(rules), len(dataSet)))  # 使用str.format做格式化输出
df = pd.DataFrame(rules, columns=['item1', 'itme2', 'instance', 'support', 'confidence', 'lift'])  # 创建频繁规则数据框
df_lift = df[df['lift'] > 1.0]  # 只选择提升度>1的规则
print (df_lift.sort('instance', ascending=False))  # 打印排序后的数据框

# 关联结果图形展示
dot = Digraph()  # 创建有向图
graph_data = df_lift[['item1', 'itme2', 'instance']]  # 切分画图用的前项、后项和实例数数据
for each_data in graph_data.values:  # 循环读出每条规则
    node1, node2, weight = each_data  # 分割每条数据画图用的前项、后项和实例数
    node1 = str(node1)  # 转化为字符串
    node2 = str(node2)  # 转化为字符串
    label = '%s' % weight  # 创建一个标签用于展示实例数
    dot.node(node1, node1, shape='record')  # 增加节点(规则中的前项)
    dot.edge(node1, node2, label=label, constraint='true')  # 增加有向边
dot.render('apriori', view=True)  # 保存规则为pdf文件

上述代码以空行分为5部分。

第一部分导入库。本示例中用到了sys、Pandas、GraphViz和apriori。

sys:用来为Python增加自定义库的工作路径,使用sys.path.append方法将chapter4目录(自定义库apriori所在的目录)将自定义库目录追加到程序中。

Pandas:用来将关联规则的结果通过数据框表格展示出来。

GraphViz:用来创建一个关系图展示不同项目的关联关系。

apriori:为自定义的关联算法,在通过sys.path.append操作之后可直接跟普通第三方库一样使用import方法导入。需要注意的是导入自定义的本地库的代码位置必须在sys.path.append方法之后,否则程序会无法找到自定义包。

相关知识:按照约定俗成的位置顺序导入不同类型的库

Python的工作库有三种类型,分别是Python内置标准库、第三方库和自定义库。

内置标准库是Python安装之后自带的库和包,例如re、string、datetime等,读者可在https://docs.python.org/2/library/index.html查看所有2.*(本书程序所用的版本)版本的内置库。

第三方库是除了Python程序之外的,第三方主体开发的流行库,例如Sklearn、Numpy、Pandas等,一般是直接通过网络相关资源下载到本地安装或者使用pip命令在线安装。

自定义库是本地的相关程序,一般是自定义的功能模块。

Python中导入不同类型的库,约定俗成的位置顺序是:

Python标准库。

Python第三方库。

自定义库。

例如:

import re # Python标准库
import numpy as np # Python第三方库
import apriori # 自定义库

如果这三类库比较多,通常在不同类型的库之间以空行隔开。这样做的好处是不同的类型库之间的关系清晰,易于管理和维护,尤其是大型程序导入的应用库多且需要多人协同运维时非常必要。本书中由于示例代码一般都比较短,并且需要以空行做功能讲解,因此没有通过空行的形式区分不同类型的库。

第二部分定义数据文件。数据文件的格式是以逗号分隔的订单合并的事务型记录,每条记录是一个订单,每个订单中的多个项目在同一行。

第三部分通过调用自定义的apriori做关联分析。

先定义了最小支持度和置信度阈值,除了可以用来筛选特定条件的规则外,还能有效提高程序效率。对于两个阈值的定义,如果在时间允许的条件下,笔者一般都先设置较低的阈值,后期再做进一步筛选。

接着通过apriori库的createData方法获得数据,返回的是列表类型的数据,每个列表内嵌套商品项目列表。

然后使用apriori库的apriori方法计算得到满足最小支持度的规则,返回的是所有满足条件的频繁项集的列表和所有候选项集的支持度数据列表。

最后使用apriori库的generateRules方法计算满足最小置信度的规则,返回同时满足最小支持度和最小置信度的频繁规则。

第四部分关联结果报表评估。先定义一个结果概览字符串,并使用str.format对字符串用占位符做格式化输出。打印输出结果如下:

data record: 100 
association rules count: 13

原始数据集有100条数据记录,得到的符合条件的频繁规则有13条。

相关知识点:使用str.format对字符串做格式化处理

在做格式化输出时,我们之前用到了print直接输出、Pandas的数据框、使用print配合%占位符等方法。该部分示例用到一种新的方法:str.format。与%占位符类似,str.format使用{}做占位符。这是一个针对字符串格式化输出的利器,相比较之前的几种方法,str.format使用灵活、方便,能通过多种途径获取要输出的变量内容。

str.format占位符所指示的格式化语法为:

[[fill][align][sign][#][0][width][,][.precision][type]

其中:

[fill]:任何要填充到占位符的字符串。

[align]:对齐方式,通过<、>、=、^可设置为左对齐、右对齐、强制将变量值放到符号之后数字之前以及强制居中对齐。

[sign]:符号选项,仅对数字类型有效,通过+表示一个符号应该用于正数和负数;-表示一个符号只能用于负号;空格表示在正数时应使用前导空格,负号使用负号。

[#]:选项仅对整数有效,仅适用于二进制,八进制或十六进制输出。如果存在,它指定输出将分别以0b,0o或0x为前缀。

[width]:定义最小字段宽度的十进制整数。如果未指定,则字段宽度将由内容确定。

[,]:表示使用逗号作为千分位分隔符。

[.precision]:用来控制精度,这是一个十进制数,表示在使用f和F格式化的浮点值的小数点后面应显示多少个数字。

[type]:表示以何种形式展示数据,常用的类型如表4-5所示。

表4-5 常用type类型

格式化数据示例

示例一:通过位置映射获得变量信息输出数据:

print ('number:{1},count:{0}'.format(10,20)) # 输入

其中''number:{1},count:{0}''为原始字符串,{1}代表format变量中的第2个变量值,{0}代表format变量中的第1个变量值。字符串的占位符与format参数不要求前后位置一一对应,只要索引位置对应即可。上述代码执行后输出如下结果:

number:20,count:10 # 输出

示例二:通过列表/元组/字符串的位置映射形式输出一组数据:

str_key = 'I am: {0[1]}\nYou are: {0[2]}\nHe is:{0[0]}'
str_value = ('Lucy','Tony','Lilei')
print (str_key.format(str_value))

其中{0[1]}代表输出的是元组的第二个值,以此类推{0[2]}和{0[0]}分别代表元组的第三个和第一个值。format的参数变量可以是元组也可以是列表,只要是能迭代读出的序列就可以。除了列表和元素,还可以使用分割后的字符串(如果觉得字符串本身也有意义,也可以直接使用字符串),字符串位置跟fomat参数的位置无关,只跟位置索引有关。例如:

str_key = 'I am: {0[1]}\nYou are: {0[2]}\nHe is:{0[0]}'
str_value = 'Lucy,Tony,Lilei'
print (str_key.format(str_value.split(',')))

这段代码返回的结果与上述代码结果一致,结果如下:

I am: Tony
You are: Lilei
He is:Lucy

示例三:通过列表/元组/字符串的形式多次输出一组数据:

str_key = 'I am: {0[1]}\nYou are: {0[1]}\nHe is:{0[0]}'
str_value = 'Lucy,Tony'
print (str_key.format(str_value.split(',')))

上述代码中,在占位符中可多次调用format参数中的索引。字符串可以多次映射到format参数的位置,与其参数的数量无关。返回结果如下:

I am: Tony
You are: Tony
He is:Lucy

示例四:通过关键字参数获得变量信息:

str_value = {'age':30, 'name':'tony'}
str_key='I am: {name}, I am {age} years old'
print (str_key.format(**str_value))

上述代码中,先定义一个字典,字典的key为关键字参数,然后在format参数中,通过**+字典名称的方式批量传入参数信息。返回结果如下:

I am: tony, I am 30 years old

示例五:通过表达式结合数字传递变量信息:

print ('rate is: {:.2%}'.format(10./21))

上述代码中,在format参数中传入一个表达式来传值。占位符表示的是保留2位小数的百分数。结果如下:

rate is: 47.62%

示例六:样式居中对齐:

print ('{:*^40}'.format('This is a title'))

上述代码中,强制字符串居中对齐,总长度为40位,不足的部分以*补齐。返回结果如下:

************This is a title*************

接着创建一个频繁规则数据框,用来存在返回的规则数据,包括前项、后项、实例数、支持度、置信度、提升度,然后只选择数据框中lift>1的数据记录,最后使用sort方法对数据按照实例数排序输出。结果如下:

            item1          item2  instance  support  confidence    lift
0   (17288980167)  (17092020299)        14     0.14      0.4828  1.3410
1   (17092020299)  (17288980167)        14     0.14      0.3889  1.3410
3   (38657641492)  (17092020299)        14     0.14      0.4118  1.1438
4   (17092020299)  (38657641492)        14     0.14      0.3889  1.1438
7   (38728350298)  (38660935334)        14     0.14      0.5000  1.3158
8   (13943415375)  (38660935334)        14     0.14      0.4516  1.1885
9   (38722052311)  (38660935334)        14     0.14      0.3889  1.0234
2   (38657641492)  (38660935334)        13     0.13      0.3824  1.0062
5   (36989298167)  (38660935334)        13     0.13      0.4483  1.1797
6   (13943415375)  (17092020299)        13     0.13      0.4194  1.1649
12  (38657641492)  (38722052311)        13     0.13      0.3824  1.0621
10      (4002591)  (38728350298)        11     0.11      0.4231  1.5110
11  (38728350298)      (4002591)        11     0.11      0.3929  1.5110

第五部分关联结果图形展示。本部分调用GraphViz实现画关系图。在第一部分的导入库操作中,我们直接导入了GraphViz的有向图库digraph,除此之外还有一个Graph的无向图库。

所谓有向和无向指的是不同节点之间是否具有方向性。有向图库digraph可以表示有顺序、流转等逻辑的图形,例如流程图、指向图等;无向图库Graph则只表示不同节点间的相互关系,而没有方向指向性,例如热力图等。

首先通过digraph方法创建一个有向图对象用来画图。然后切分画图用的前项、后项和实例数数据。通过for循环读出每条规则数据并做画图处理:

分割每条数据画图用的前项、后项和实例数;

将前后项转化为字符串类型;

创建一个标签用于展示实例数,通过占位符的形式动态赋值;

使用node方法为有向图对象添加节点,其中的三个参数分别代表节点名称、节点标签和节点的图形样式;

为该节点增加一条有向线条,用来表示该节点与哪个其他节点产生关系,其中的四个参数分别为线条开始的节点、线条终止的节点、线条标签(展示每个有向线条所代表的规则的实例数),以及是否根据图形自动调整位置。

最后使用render方法将画完的图保存为apriori的文件,系统默认会保留为PDF格式的文件。通过view=true来控制保存完成之后自动打开文件。得到如图4-9所示的规则。

图4-9 关联结果关系图

上述过程中,关联算法本身由本地导入,因此不涉及算法的应用,本示例新增了一些知识:

如何定义本地库路径并导入自定义库;

如何通过GraphViz画出关系图。

代码实操小结:在本节的代码中,主要用了以下几个知识点:

通过sys.path.append方法将本地自定义库的目录追加到程序中并导入自定义库apriori;

通过调用自定义库的功能实现关联分析并得到关联规则结果集;

使用str.format方法做输出格式化操作;

通过Pandas的dataframe创建数据库并指定列名;

对数据库进行切片分割,并按照指定列值做数据记录筛选;

使用sort方法对数据框进行排序;

使用GraphViz的digraph画有向图,并分别定义了节点、连接线并设置了自定义信息;

将通过GraphViz画出的图形保存为本地PDF格式的文件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文