文章目录
- 一、理论知识
- 1.1、定义
- 1.2、关联规则
- 1.3、频繁项集的产生
- 二、python实战
一、理论知识
许多商业企业在运营中积累了大量的数据。例如:普通超市的收银台每天都会收集到大量的用户购物数据。下表给出一个这样的例子,通常称为购物篮事务。每一行代表一个事务,包含唯一标识id和顾客购买的商品的集合。零售商对分析这些数据会感兴趣,因为这样可以了解到用户的购物行为,可以使用这种有价值的信息来支持各种商务应用,如市场促销,库存管理等。
TID | 项集 |
1 | {黄油 ,苹果,香蕉} |
2 | {面包,牛奶,苹果} |
3 | {面包,黄油,苹果} |
4 | {黄油,苹果,香蕉} |
5 | {牛奶,香蕉} |
这篇博客主要讲解关联分析的方法。用于发现隐藏在大型数据集中的有意义的联系。发现的联系可以利用关联规则或频繁项集的形式表示。例如,从上表中可以提取出如下规则:{面包}->{苹果},这个规则表示买了面包的人同时也买了苹果,继而可以发现新的交叉销售商机。
1.1、定义
- 二元表示:
购物篮数据可以用下表的二元形式来表示,每行表示一个事务,每一列表示一个项集。项可以用二元值表示,若项在事务中出现,则表示为1,否则为0。
牛奶 | 苹果 | 面包 | 香蕉 | 黄油 | |
1 | 0 | 1 | 0 | 1 | 1 |
2 | 1 | 1 | 1 | 0 | 0 |
3 | 0 | 1 | 1 | 0 | 1 |
4 | 0 | 1 | 0 | 1 | 1 |
5 | 1 | 0 | 0 | 1 | 0 |
- 项集:关联分析中,包含0个或多个项的集合被称为项集。如果一个项集中包含k个项,则称其为k项集。例如:{苹果,面包,牛奶}是一个3项集。
- 支持度计数:项集在事务中出现的次数即为支持度计数。例如:上面的二元表中,项集{面包,苹果}在5个事务中出现了2次,所以它的支持度计数就为2。
1.2、关联规则
- 关联规则是形如X->Y的蕴含表达式,其中X和Y是不相交的项集,即它们的交集为空。关联规则的强度可以利用支持度和置信度度量。支持度确定给定数据集的频繁程度,而置信度确定Y在包含X的事务中出现的频繁程度。
- 支持度(support)和置信度(confidence)的定义如下:N表示事务数量,N()表示项集在事务中出现的次数
- 提升度(lift):,如果说明X和Y没有任何关联,如果,说明X和Y是排斥的,如果,我们认为X和Y是有关联的。
例如:上面的例子中:牛奶出现在2个事务中,那么{牛奶}的支持度就是2/5=0.4;苹果出现在包含牛奶的事务中出现了1次,那么规则{牛奶}→{苹果}的置信度为1/2=0.5,规则{牛奶}→{苹果}的提升度为0.5/(4/5)=0.625。 - 给定事务的集合T,关联规则发现是指找出支持度大于等于minsup且置信度大于等于minconf的所有规则,其中minsup和minconf是对应的支持度和置信度的阈值即设置的最小支持度和最小置信度。
- 为什么使用支持度和置信度呢?
- 支持度是一种重要度量值,因为支持度很低的规则可能知识偶尔出现,从商务角度看,低支持度的规则多半是无意义的,因为对顾客很少同时购买的商品进行促销活动并无益处。因此支持度,通常是删掉那些无意义的规则。
- 置信度度量通过规则推理具有可靠性。对于给定的规则X→Y,置信度越高,说明Y在包含X的事务中出现的可能性就越大。置信度也可以估计Y在条件X下的条件概率。
- 提升度存在的意义:
置信度用于评估规则的可信程度,但是该度量有一个缺点,没有考虑规则后件的支持度问题,例如在下表中:
规则{茶}{咖啡}的支持度为150/1000=15%,置信度为150/200=75%,先不考虑支持度,只看置信度会觉得比较高,因为可能会认为爱喝茶的人一般也爱喝咖啡。我们再来看一下喝咖啡的人的支持度,达到800/1000=80%,比规则{茶}{咖啡}的置信度75%高,这说明什么问题?并不是爱喝茶的人一般爱喝咖啡,从而使得规则置信度高,而是爱喝咖啡的人本身就很多,所以这条规则是一个误导。由于置信度存在的缺陷,人们又提出了称作提升度的度量。 - 强关联规则:
- 对于给定的规则X→Y,如果规则同时满足和,那么称规则X→Y为强关联规则,否则为弱关联规则。
1.3、频繁项集的产生
- 先验原理:如果一个项集是频繁的,那么该项集的所有子集一定也是频繁的。
- Apriori算法是第一个关联挖掘算法,使用基于支持度的剪枝技术。对于例子来说,假定支持度阈值为60%,相当于最小支持度计数为3。
- 如图:初始将每个项作为一个候选1-项集,对他们的支持度计数之后,候选项集{牛奶}和{面包}被丢弃,因为它们的计数均小于3;第二次迭代,仅使用频繁集1-项集来产生2-项集,因为先验原理保证2-项集的所有子集均属于频繁集,因为只有3个频繁1-项集,所以从3个中选择两个产生2-项集,2项集数目为,计算它们在所有事务中的支持度,发现2-项集中频繁项集只有一个{苹果,黄油};最终的频繁项集就是{苹果,黄油}。
二、python实战
import numpy as np
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules #关联规则
data = pd.read_csv('GoodsOrder.csv',sep=',',index_col=0,encoding='gbk')
df = pd.crosstab(index=data.index,columns=data.goods)
df
goods 牛奶 苹果 面包 香蕉 黄油
row_0
1 0 1 0 1 1
2 1 1 1 0 0
3 0 1 1 0 1
4 0 1 0 1 1
5 1 0 0 1 0
frequent=apriori(df,min_support=0.3,use_colnames=True) #设置最小支持度为0.3,求频繁项集,显示列标签名
rules=association_rules(frequent,metric='confidence',min_threshold=0) #置信度大于0.5,求关联规则
rules.sort_values(by='confidence',ascending=False)
- 结果解释:三项集中置信度最高的是和,项集说明在购买了黄油和香蕉的前提下,一定会购买苹果;且它们的提升度>1,说明有着较强的相关性。
- 列名含义:针对规则{A}->{B},总事务数为N
列名 | 解释 | 公式 |
antecedents | 前件 | A |
consequents | 后件 | B |
antecedent support | 前件支持度 | |
consequent support | 后件支持度 | |
support | 规则支持度 | |
confidence | 置信度 | |
lift | 提升度 | |
leverage | 杠杆率 | |
conviction |
参考:
《数据挖掘导论》 范明 译