一、什么是关联分析
关联分析:世间万物都有一定的联系
-
定义:发现存在于大量数据集中的关联性或相关性,从而描述了一个事物中某些属性同时出现的规律和模式。
-
应用场景【超市购物、服装搭配、图书购买等等】
-
实质:关联规则学习
二、关联分析的基本概念
1、项、项集
项:一个个分析对象
项集:若干个项组成的集合
举例说明,今天去超市购买苹果、葡萄、包子、馒头,这些称之为项,今天买的总的称之为项集。
2、支持度:项集出现的频繁程度
含义:项集在数据集中出现的频率即项集出现的次数除以数据集中的数量
数学表达式为:
P
(
A
)
=
c
o
u
n
t
(
A
)
/
c
o
u
n
t
(
d
a
t
a
s
e
t
)
P(A)=count(A)/count(dataset)
P(A)=count(A)/count(dataset)
3、置信度:体现关联规则的可靠程度
含义:产品A与产品B出现的次数除以A出现的次数
数学表达式为:
置
信
度
(
A
−
−
>
B
)
=
c
o
u
n
t
(
A
B
)
/
c
o
u
n
t
(
A
)
=
P
(
A
B
)
/
P
(
A
)
=
P
(
B
∣
A
)
置信度(A-->B)=count(AB)/count(A) =P(AB)/P(A)=P(B|A)
置信度(A−−>B)=count(AB)/count(A)=P(AB)/P(A)=P(B∣A)
上述表达式的实质是概率公式,意为在A发生的前提下,B发生的概率。
对应现实生活中的啤酒和尿不湿捆绑销售,则表示为啤酒和尿不湿放在一定的前提下,用户在买啤酒的时候有多大的概率会买尿不湿。
4、提升度:置信度相对于支持度来说提升了多少
数学表达式为:
提
升
度
(
A
−
−
>
B
)
=
P
(
B
∣
A
)
/
P
(
B
)
=
P
(
A
B
)
/
P
(
A
)
∗
P
(
B
)
提升度(A-->B)=P(B|A)/P(B)=P(AB)/P(A)*P(B)
提升度(A−−>B)=P(B∣A)/P(B)=P(AB)/P(A)∗P(B)
提升度的取值范围:
- 大于1:产品A和产品B捆绑时B卖出的几率比单独卖产品B卖出的几率大,有研究的意义
- 等于1:捆绑卖与单独卖的效益相同,转换成数学思维的话就是产品A和产品B之间是独立的没有联系的。
- 小于1:捆绑卖反而没有单独卖效益高,产生了负作用。
5、频繁项集:项集出现比较频繁
支持度是描述项集出现的频繁程度,因此针对支持度设定一个阈值【标准】,大于等于阈值则被称之为频繁项集
三、关联分析过程
1. 在数据集中,找出频繁项集
首先看一下组合的流程图:
以上的流程图展示了,各项之间的组合,第一层是项,后两层是项集。
具体操作原理:
4. 遍历项,此时的每个项就是一个项集
5. 计算每个项集的支持度
6. 得到支持度大于指定阈值的项集
2.根据频繁项集生成关联规则
1.将符合条件的频繁项集拆分成两个非空子集,则这两个非空子集就构成关联规则。
2.针对每个规则分别计算置信度、提升度,选择符合要求且合适的关联规则
四、算法原理
1、Apriori算法
上述的寻找频繁项集的过程在数据集的项数多的情况下,数量会非常大。用Apriori算法优化,降低计算量。
原理:
1.如果一个项集是频繁项集,则其所有的非空子集也是频繁项集
2. 如果一个非空项集是非频繁项集,则其所有的父集也是非频繁项集
举例说明:若123是频繁项集,则断定12、13、23也是频繁项集;若12是非频繁项集,则123也是频繁项集,即其他数据集里只要含12都可直接判定其为非频繁项集。
2、Apriori算法流程
- 遍历数据集,生成候选项集Ck(k从1开始)C1表示1项集,每个项集中存在一个元素
- 计算Ck的支持度,排除低于阈值的项集,筛选出来的项集为频繁项集Lk(k从1开始)
- 频繁项集Lk进行组合得到候选项集C(k+1)
- 重复2、3的操作直到满足下述的条件之一时,停止。
- 频繁K项集无法组合成候选的K+1项集【无候选项集可生成】
- 所有的候选K项集的支持度都低于指定阈值,则无法生成频繁K项集【无频繁项集生成】
- 简单来2步骤无法实现、3步骤无法实现,不得不终止。
3、Apriori算法代码实现
-
读取数据并整理数据
def load_data(path): content = [] with open(path, encoding="UTF 8") as f: #打开文件命名为f for line in f: line = line.strip("\n") #清除开头结尾的换行符 content.append(line.split(",")) #将每一层的内容以,分隔开作为一个整体装入列表中 return content dataset = load_data("data.txt") print(len(dataset))
注:dataset 是一个二维列表,每个元素 一维列表 保存每个购物清单的商品记录。
-
寻找频繁K项集和关联规则
# 导入算法包 from efficient_apriori import apriori # 该函数会返回满足条件的频繁项集与关联规则 '''itemsets,rules=apriori(transactions, min_support: float = 0.5, # min_support 支持度阈值 min_confidence: float = 0.5) # min_confidence 置信度阈值 ''' itemsets,rules=apriori(transactions=dataset,min_support= 0.04,min_confidence= 0.3) # 输出所有满足条件频繁k项集 print(itemsets) # 输出关联规则 print(rules) # 查看关联规则的支持度、置信度、提升度、确信度 for r in rules: print(r) print("支持度",r.support) print("置信度",r.confidence) print("提升度",r.lift) print("确信度",r.conviction)
4、Apriori结果解读
rules 关联规则的结果
每个关联规则的4个指标
- 支持度 support P(A)
- 置信度 confidence P(B|A)
- 提升度 lift P(B|A)/P(B)
- 确信度 conviction 1-P(B)/1-P(B|A)
上面只介绍了前3个指标,因此接下来要介绍一下确信度。
确信度
确
信
度
(
A
−
−
>
B
)
=
(
1
−
P
(
B
)
)
/
(
1
−
P
(
B
∣
A
)
)
确信度(A-->B)=(1-P(B))/(1-P(B|A))
确信度(A−−>B)=(1−P(B))/(1−P(B∣A))
如某关联规则的确信度大,该规则的置信度大。
四、实际应用
在实际应用中最关键的是寻找合适的支持度、置信度阈值。最终的每个关联规则都会得到相应的四个指标,根据实际的应用场景,着重查看某指标,最终得到合适的关联规则,应用到实际的业务场景中去。