当前课程知识点:R语言数据分析 > 下部:博术 > 第11章 相随相伴、谓之关联 > 11.4 关联规则(III)
大家好
欢迎来到《R语言数据分析》课程
今天继续和大家交流关联规则的相关内容
具体看一看在R里面如何实现关联规则
说到R的关联规则的实现
我们首先得提什么
这个Task Views
我们始终不要忘了
Task Views提供了最基本的导航
我们说R语言
用一句话来形容它的编程的话是什么
用别人的包和函数讲述自己的故事
我们在讲如何找这个包的时候
当时也提到了Task Views是一个什么
是一个最基本的导航
而且是一个官方的一个整理的文档
在Task Views里面
专门有关于机器学习的一个主题
它下面就有一个什么
就有关联规则
这么一项
在关联规则具体这个条款里面
就提到了一个arules这个包
当我们看这个包的时候
仿佛觉得这个包的作者好像
这个英文水平不怎么样
arules仿佛什么
语法都是错的
对不对
a那后面显得应该是单数
对吧
但是我们看看关联规则
毫无疑问
这个a代表什么
它并不是表示一个两个
a和an不是这个对吧
它是表示什么
关联规则 A=Association
是这么一个意思
咱们接下来将用到这个arules这个包
来挖我们具体的
面对同样的问题
还是围绕学生文理分科这么一主题
拿这个成绩表这个数据
来挖关联规则
看文理分科是否确实和其他一些因素有关系
有关联关系
具体实现的话首先做什么
按照我们数据分析
一般流程先怎么样
加载数据
通过这个tidyverse这个包
这里面我们后面会用到一些具体的这个包里面的
一些数据转换
一些管道操作符等等
一些具体的函数
在读取数据的时候
主要用这个readr里面的什么
read_csv这么一个文[函数]
我们可以直接从这个github里面
我们托管的相应的数据和代码
我们可以直接从这个github里面
直接读取我们这个成绩表这份数据
在读完数据之后
我们要用这arules这个包
进行关联规则挖掘的时候
需要做一个数据预处理工作是什么
这个包它只能处理这个类别数据
只能处理类别数据
也就是说我们所有参与这个挖掘的
关联规则挖掘的变量都应该是什么呀
都应该是因子
所以对于我们这个大部分的成绩数据来讲
我们都需要用到cut()这个函数
我们可以基于这个cut()函数定义
一个将百分制转换成五分制成绩的函数
也就说对数据进行分箱
将它转换成什么
由百分之成绩转换成五分制
变成一个因子
这是由百分制转换成五分制的一个函数
在前面我们的迷你案例里面
其实包括我们在讲向量与因子的时候
都提到这个函数
经过这个函数
我们可以将每一列也就是语文数学外语等等
这么九门课将它由百分制成绩变成有序的因子
在参与这个关联规则挖掘的时候
我们要首先怎么样做数据类型转换
我们刚才讲了
要将所有的数据参与挖掘的数据都转化成因子
这里面要参与的有
性别
文理分科
他们之前是一个什么
之前是字符向量
这个时候我要把它变成什么
factor
变成因子
对于像yw sx wy等等
一直到sw这九门课我们怎么样
利用刚才定义的这个由百分制
转换成五分制的成绩的这么一个函数
对它们进行数据分箱
也是转化成什么
也转换成因子
而对于像这个第一列和第二列分别是什么
姓名和班级
他们是不参与我们这次挖掘的
因为我们认为文理分科应该是
跟我的姓名和班级应该是没有关系的
所以我们现在是将这个数据做这么一个处理
然后大家看这个管道操作符怎么样
它不再是百分号括起一个大于号了
而是百分号
括起来什么小于号大于号表什么
既有向前的针对这个数据进行了操作
同时我要将操作结果返回给怎么样
返回给这个cjb这个变量本身
我们一旦进行这个数据预处理之后
就可以怎么样
加载arules这个包
进行什么
先做
先将这个转换好的数据
把它进一步转换成事务数据
事务型的数据
我们来看一下转换之后的事务型数据
它是什么样的
看一下
我们可以在什么
在控制台里面直接敲这个变量的名字
可以看得出来它总共包含多少个事务
775条
这其实就是我们的775行
对不对
然后包含多少
49个items 49项
这49项怎么来的
我们刚刚讲了yw sx wy等等
一直到sw这九门课
它们都变成什么
变成五分制成绩了
也就是说每一门课他都有什么
都有五个取值
这个时候就是5×9=45对不对
就已经有45项
同时我们还有什么
还有性别
还有文理分科
性别有男女对吧
然后文理分科的话有文科和理科
那毫无疑问
45+2+2变成多少 49
总共49个项
当然我们也可以什么
通过这个inspect()函数来查找什么
查找他前面的若干个事务的具体记录
可以看一下
当然假如我们对这个事务记录本身
这种类型不是很熟悉的话
我们也可以将什么叫它进一步转化成什么
as("list")
将它转换成什么列表
这时候我们看得就比较清楚了
这个列表里面比如第一个组成部分其实就是什么
其实就是第一条事务记录
其实就是第一条事务记录
它其实也相当于我们前面讲的购物篮分析里面什么
一个顾客的一次消费记录
它里面究竟有哪些商品
无非这个时候我们的项是
我们具体的一些变量的取值而已
有了这个数据预处理之后
我们处理完这个数据
我们就可以做什么
进行关联规则的挖掘了
我们来看看R里面怎么实现的
我们前面在讲这关联规则算法原理的时候
相对还是比较复杂一点
但是在实现的时候
基本上就一句话的事了
什么意思
我们先加载这个包
library(arulesViz)
毫无疑问是什么
这个包是一个关联规则可视化的包
但这个包在加载的时候的话
它会同时将arules这个包也加载
好 加载完这个包之后
我可以利用什么
利用这个arules这个包里面的
apriori()这个函数
进行关联规则的挖掘
毫无疑问
它所用的算法就是我们之前讲到的什么
Apriori算法
我们看一下
调用完这个函数之后
它会将整个这个函数的相应的一些参数的设置
都给我们显示出来
当然这里边有很多参数设置
包括比如说这个target
最终挖出来是关联规则还是频繁项集等等
当然我们比较关注的那个参数
主要是有这两个
一个什么
confidence
一个什么support
也就分别是什么
置信度和支持度
这是我们比较关注的
目前来讲
这个支持度设置为0.1
置信度是0.8
我们来看一下
具体挖出来的这个关联规则是什么
这个irules_args_default
就是当我这个参数是默认的时候
因为我后面除了交给这个事务数据
交给这个apriori()这个函数的之外
没有给它传递其他的参数
我们先看一下默认参数情况之下
挖出关联规则是什么样的
我们在控制台里面直接将这个变量
敲进去之后回车
得结果是什么呢
2097条规则
当然我们也要查看具体规则的话
要调用这个什么
inspect()这个函数
我们查看前6条
head
将这规则拿出来一看
这时候我们看得出来
第一条规则
当物理为优的时候
他什么数学也为优
然后这个什么
它的支持度是0.21
它的置信度是0.83
它的置信度是0.83
提升度1.8
支持度计数多少
166
出现在166条记录里面
这个是我们在默认参数之下
一个关联规则挖掘的结果
当然我们在挖具体规则的时候
在具体的数据分析的应用里面
肯定是需要进行参数设置的
比如说我们可以设置什么
我们可以设置这个关联规则
这个最小的长度是多少
所包含的项至少为2
对吧
至少为2
然后我们可以什么
设置它的支持度
设置支持度
这里面是
设置支持度的话
既可以写
比如刚才那个默认参数里面的
0.1
0.2
这样是可以的
或者0.05类似这种
也可以通过这个支持度计数
我设置为50
然后再除以什么
除以我整个事务记录的事务数
这是我们的支持度
一个设置方法
我们这个在我们目前这个调用
这个apriori算法的时候
我们设定什么
就是至少在我这个记录里面出现50次
或者50次以上
我才认为它是什么
才是认为它是一个有效的规则
就支持度
减少这个偶然性
置信度的话
一般来讲都是相对偏高一点的
百分之七八十
百分之九十
类似这个样子
这个时候置信度我们用来增加它推断能力
我们来看一下
在当前这个支持度和置信度水平之下
我们看一看这个
我们所挖出来的规则是什么样的
我们通过这个inspectDT()
这么一个交互式的这么一个界面
我们可以怎么样
将所挖出来规则进行动态查看
比如说你可以点击任何一个指标
比如我可以根据什么
支持度 置信度
来进行排序
我也可以按照这个下一页下一页
来查看不同的规则
这个时候我们看这里面所挖出来的规则
比如说有什么
wl = 优 的时候
sx = 优
类似这些规则其实我们是不关注的
因为我们现在目前关注的主题是什么
文理分科与哪些因素有关系
我们这个时候主要想把这些右项
就是这个[右手这一侧]
或者说后项
它是跟文理分科相关的
这些规则我给提取出来
我们看一下在R里面怎么实现它
我们可以怎么样
设置这个appearance
这个参数我直接设定
我右边这一项
后边这一项
rhs=Right-Hand-Side
这个右边这一项设置为什么文理分科
要不文科要不为理科
当然左侧就还是设置什么
还是default
这个不改变左侧的那个
不需要过滤左侧这一部分
经过这个参数的设置
我们后面拿到的规则所生成的规则
它只包含什么
右项为文理分科的这一部分关联规则
咱们看一下具体结果
好
这时候可以看得出来
所有的规则都怎么样
都是与文理分科相关的
就是什么情况之下他选择为文科
什么情况之下选择为理科
而至于说你数学好
物理也好
或者物理好
数学也好
这个规则我们就过滤掉了
对吧
这个规则过滤掉了
都是我们比较感兴趣的规则
拿这个规则之后
当然我们可以通过这个支持度
置信度来对规则进行评价
当然我们在前面也讲了
提升度也是一个非常必要的指标
我们也可以根据这个提升度
对整个的规则进行排序
比如说我通过这个sort()这个函数
对刚才挖出来这个irules这些规则我进行排序
根据什么排序
by="lift"
表示我按照提升度
对所有的规则进行排序
我们再调用这个函数
inspectDT()
对这个规则进行查看
当然我们也可以直接在这里面
点击相应的按钮
也可以进行相应的排序
我们接下来看一下
看一下我们挖的规则
这个时候我们重点关注第二条
以及下面的第九第十条
第二条规则是什么
当我物理为优的时候
文理分科
我一般都选择什么
选择理科
第九条
物理为优
并且生物为优的时候
文理分科为理科
第十条
数学为优 物理为优
文理分科为理科
这个时候我们仔细比较这三条规则之后
我们发现什么
当我有了这条规则之后
当我有了第二条规则的话
其实第九和第十条规则属于冗余的
什么意思
当我知道我这个物理为优的时候
我基本上可以判断
这个相应的文理分科应该就是理科
对不对
然后这个时候你不需要再增加额外的什么
额外的生物数学其他一些特征了
对不对
当然我们在增加特征的时候
肯定这个置信度应该是会提升的
相比这个置信度来讲应该会提高一点
但是它的支持度的话
毫无疑问它会降低
对吧
所以假如我们权衡下来的话
只要我下面这个规则是上面这条规则的
它的超集
或者说上面这条规则是下面的子集的话
那好
我保留的应该只是保留这个子集
这个超集这个规则我是不需要有的
也就是说下面这个规则属于冗余规则
我们需要把它剔除掉
具体剔除过程
我们可以通过下面这个代码来进行剔除
我们调用这个函数
is.subset
我们将
关联规则
刚才挖的规则
看一看哪些规则是另外一些规则的
它的子集
这个时候生成了
生成一个矩阵
is.subset
接受两个参数
前面一个参数是我这个排序好的规则
后面也是这个规则
规则之间两两进行比较生成一个矩阵
所生成这个矩阵里面每一个元素Xij表示
第i条规则是否是第j条规则子集
那这个时候其实我们根据这个矩阵
我们就可以做一个判断了
我们可以做通过计算
每一列上面就是这个j每一列
我看看我这里面出现了1的次数多少
我来判断我是否是别人的超集
我们接下来看
我们可以这样
我们可以将这个生成的这个矩阵
将它的下三角
我都变成
变成NA
当然变成零也可以
对吧
同时我要包含什么
包含这个对角线
因为对角线上毫无疑问都是1
因为自己肯定是自己的子集
好
我把对角线也去掉
把下三角都去掉
这个时候假如我每一列它的和加起来超过1的话
那毫无疑问它应该是属于别人的超集
对不对
那这个时候毫无疑问这条规则就是
就是冗余的规则
我们可以通过
通过colSums()
就将对每一列进行求和
假如他结果大于等于1的话
毫无疑问怎么样
它应该是属于那个冗余规则了
这个冗余规则我们可以看一下
as.integer()
直接算出来
直接看看究竟哪些规则是属于冗余规则
我们一旦得到这个冗余规则之后怎么办
我们可以直接将它剔除掉
直接将这个规则进行剔除
剔除掉这个冗余规则
然后接下来就是
已经剔除冗余规则之后的结果
irules_pruned
我们在inspectDT看看
这个查看一下
在将冗余规则剔除之后
所剩下的规则
一百多条 121条
我们有了前面参数的设置
我们找到了文理分科相关的一些规则
并且设定了相应的支持度置信度
并且剔除掉了冗余规则之后
毫无疑问
这个时候规则的挖掘的过程基本就完成了
基本就完成
我们可以对规则进行一个可视化
进行可视化
可视化的话毫无疑问还是
arulesViz这个包对吧
我们调用的话可以调用这个plot这个函数
对我们刚才进行了这个冗余规则之后
剔除之后的规则进行一个
进行可视化
我们可以设置一下
我们显示的方式是graph
这个时候形成一个
一个网络图
我们简单解释一下这个网络图的一个含义
这里面网络图里面每一个
每一个气泡就是一个
就是一条规则
我们可以看得出来
每一个气泡
它其实都有进去的箭头
也有出去的箭头 他其实都有进去的箭头
也有出去的箭头
进去的箭头是 就是它的前项
出去箭头就是它的后项
所以我们数一下
假如我们现在只看前十条规则的话
这里面应该就
总共有十个气泡
然后我们可以根据这个气泡图
看见这个graph这个图
这个网络图可以看得出来
整个这个规则哪些规则
是属于有比较高的支持度的
哪些规则是有比较高的提升度的
我们这现在将什么
将这个大小映射为支持度
将颜色的深浅映射为
提升度
这是一个规则一个直观的展示
当然这个这种方式的话一般就是静态的方式了
生成一张静态的图像
假如我们想交互式的
比如说我想拉开一下看看哪些规则
因为有些规则已经重叠到一起去了
假如我想做交互式的话
交互式的查看的话
得加上什么
加上这一条
加上这个参数
这个时候我们就是一个生成一个
动态可交互的一个可视化的一个图形
比如说这个时候我就将文理分科
分别拉到了两端
然后这个时候我再来看
它相应特征的话就比较清晰了
这就是规则的一个可视化的过程
当然我们所有的规则
要用之前
要看它是否是我们感兴趣的规则
是否是有趣的规则
是否是有用的规则的时候怎么样
我们会对规则进行评估
评估的话
我们有一个函数叫quality()
我们将这个刚才挖出的规则
作为参数传递给这个quality这个函数
可以看得出来
它返回一个data.frame
包含了
support
confidence
lift
count
也说最基本的这三个指标
支持度 置信度 提升度已经包含了
当然这个是属于支持度计数
其实和前面这个是一致的
无非是
就在支持度的基础之上
乘了我整个这个什么
这个事务记录的数量
这个就是我们那个最基本的
评估指标的一个展示
当然我们可以增加一些新的评估指标
比如说我想增加
这个因果置信度
它什么意思
当X出现的时候
Y随之出现
当X不出现的时候
Y也不出现
那这个时候它就这个因果性就更强一点点
将这两者的
置信度加起来之后
除以2 取个平均值
这个时候我们定义为
定义一个因果自信度
也就说我们除了这个
支持度 置信度 提升度之外
我们可以再增加一些评价指标
然后具体的评价指标的话
我们可以通过这个函数interestMeasure()
我们通过这个函数来计算不同的
不同的指标
具体的值
还是针对我们刚才挖出来的规则
我们可以看得出来
这个时候既有这个支持度 置信度 提升度
也有我们刚才参数设置里面设置到了
这个因果自信度
都可以看得出来
就是对我们已有的规则
通过不同的指标来衡量它
哪些规则是有用的
哪些规则是可以
应用于我们后面具体的问题情境的
这是我们规则的评估
当然一般来讲
我们挖的规则的话都是数量是比较大的
数量比较多
这个时候我们需要对规则进行过滤
比如说我想提取符合某些条件一些规则
就是这是我们原始挖出来的一个规则
比如说我现在只想关注这个跟生物相关的
这个规则怎么办
就是lhs就是前项里面
就是这么一个符号表示什么意思
partly/partially include
部分包含
包含后面这个相应的这个字符
对吧
就是我现在经过过滤之后
我后面的规则里面
基本上都包含了生物这相关的一些内容
来看它和文理分科有什么关系
当然这里面还可以增加 叠加一些其他条件
就是这个比如说提升度大于1.8
设置完成条件之后
我当然都可以调用这个
subset()的这个函数
提取或者说过滤掉一些不符合条件的规则
从而找到我自己比较感兴趣的规则
当然这个还是可以用这个inspect()
这个函数来直接在控制台里面展示
或者说inspectDT()
以一个交互的方式
来展示我们最终的感兴趣的规则
除了这个规则提取之外
我们一旦挖出规则的话
其实我们还需要进一步 保存
把它导出这个规则
假如我要保存规则的话
为了复用的话
其实我们可以存为
rda文件
直接将我们刚才挖的规则也好
或者包括我们过滤完之后的规则也好
直接save()一下就可以
save()这个函数
将它存到硬盘上面去
将它存到硬盘上面去
当然假如我们想把这个规则
以其它一些更通用的方式展示出来
比如说我想把规则导出
为Excel表
或者说导出为比较通用的这个csv文件的话也可以
怎么办
我先将这个规则
转换成data.frame
先调这个as这个函数
将这个规则转换成data.frame
这个时候我就以一个data.frame的方式
来保存这个规则
当然我们会也可以View()一下
进一步的将这个data.frame写到csv文件里面去
咱们看看这个变成数据框之后的
这个规则是一个什么样的具体的形式
这个规则是一个什么样的具体的形式
这时候我们可以看得出来
它有规则这一列
也有什么呢
有support
有confidence
有lift
有count
有相应的一些指标
这个时候其实就是一个Excel表这种方式来存储的
当然可能有些同学会觉得这个规则
其实你每一条规则都是分成两部分
前项 后项
或者说左项 右项
那其实我是想把规则的这些部分都去掉的
比如 => 去掉
这表示
一个推导的过程
一个推断的过程
同时我把这个 { } 都去掉
只保留 前项和后项
把它作为两列来存储
这样可能更方便我们以后的使用
或者说更方便我们以后在报告里面
使用这个具体的挖出来规则
那这个时候我们可以对这个
data.frame进行进一步的处理
这个时候还是借助我们这个tidyverse包里面一些函数
具体来讲
我们可以通过这个separate()
这么一个函数
我通过什么
通过刚才这个符号
来将规则这一列
分成
分成两列
一个是前项
一个是后项
同时对这个前项和后项怎么办
gsub就相当于是把它替换掉
把这个花括符都替换成什么
都直接删除掉
替换成无
就没有了
替换成空字符
那这个时候相当于
将规则这一列分成了两列
同时将那个花括符去掉
这个时候我们再看看
我们所得到的以data.frame的方式
所存在的规则
就这么一种具体形式
这种形式相对来说就比较
我们也比较熟悉
也比较适用于我们具体的
比如说一些数据分析报告
或者一些具体的规则导出
以上就是我们R里面
对整个这个关联规则的一个数据预处理
关联规则的挖掘的过程
包括参数的设置
可视化
规则的提取
规则的评估等等
咱们来看一看
简单总结一下我们的关联规则
其实我们关联规则挖掘是
是以事务为单位的
寻求的是
是项集和项集之间的联系
但是我们需要说明的是
这么一个蕴涵式
它其实并非因果关系
只是一个伴随关系而已
所以我们这个章节的主题是
是相随相伴 谓之关联
对不对
所以这关联规则只是一个伴随关系而已
只是一个伴随关系
后项伴随着前项的出现
是这么一个含义
或者说前项有可能是引发
或者说诱发了后项的出现
任何这个提升度
要是小于1的话
它其实都不能视为真正的
真正的伴随现象
它就是一个负相关的过程
当然我们说这个伴随关系
其实伴随关系
我们可以再继续细分成三种关系
假如A出现的话
B也出现这么一条规则
它置信度比较高
同时B出现的时候
A出现的置信度也比较高的话
那这时候A和B
是一个共生关系
如果A出现的时候
B也出现这个置信度比较高
但是B出现的时候
A出现的置信度比较低的话
那这个时候属于
属于一个寄生关系
就是谁就这个B寄生于A对吧
这么一种关系
当然假如他们置信度都比较低
它基本上就属于
基本属于没什么关系了
这是我们关于这个关联规则的一个简单的总结
当然我们可以继续用一个更加精简的话来说
假如我用一句话来形容关联规则的话是什么
所谓关联规则的学习其实就是
通过观察这个历史记录
如果说B总是频繁的和A一起出现
当A出现的时候
B出现的概率很大
甚至是更大的话
那很自然就形成一条关联规则
这个时候我们说B总是频繁的和A一起出现
这个时候体现的是
是支持度
当A出现的时候
B出现的概率很大
这个条件概率很大的时候
这是一个置信度
甚至是更大
就比这个B本身我什么都不知道的时候
B本身的这个先验概率还要大的话
那就提升度了
就相当于A提升了
B出现了可能性
对不对
那这个时候就是
这就是一个所谓的我们的关联规则
这是我们对关联规则一个简要的回顾
我们现在需要思考另外一个问题
我们一般说所有的模型都是错的
但有模型是有用的
然后不同的模型在同一个问题情境里面
它可能有不同的性能表现
同样除了这个经典的apriori这个算法之外
其实我们还有很多其他的一个关联规则挖掘的算法
那好
我们需要考虑的是
这些后提出的一些关联规则的挖掘的算法
它是不是可以挖出更多更好的规则
这个是需要我们思考一下这个问题
比如说我们在做预测的时候
一个算法可能比另外一个算法更加准确
我们在基于某一份数据挖掘关联规则的时候
那是不是说这个算法所挖出的关联规则
可能质量差一点
然后新提那些算法它挖的关联规则可能质量更高
或者说挖得更多更有趣的规则
假如说我们都在这个支持度和置信度框架之下的话
是不是可以实现这一点
其实是没有的
我们其他的一些新的算法
他只是什么
他只是效率上有所不同
真正的规则的话其实是完全一样
因为我所谓的规则都是
都是这个项集
他的支持度 置信度 提升度
我们通过这个apriori这个算法
其实已经挖出了
相应的参数设置下已经挖出了所有的规则
已经挖出所有规则
无非是它的效率和其他一些算法相比
我们能否接受的问题
这是我们对不同的算法比较方面
关联规则挖掘
一个比较特殊的地方
它和其他一些应用情景里面
比如预测问题里面
它不同算法
确实性能指标完全不一样
准确率完全不一样
但是对于关联规则来讲
所挖出来的结果是一样的
只是过程方面效率上有所高低而已
以上就是我们关于关联规则最基本的原理
以及在R里面实现的一些简短的介绍
进一步的内容
同学们可以查阅一些相关的资料
包括上一些比较好的网站
咱们这也推荐一个进行进一步的深入的了解
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业