想必大家都听说过啤酒和纸尿裤的故事,非常典型的提篮分析,通过分析顾客的购买习惯,制定相应的营销策略,从而提高营收,是关联分析在零售超市中的一个具体分析场景。今天就来总结下关联分析的基本概念以及如何用Apriori算法实现关联分析。
一、关联分析是什么?
1. 关联分析的定义
关联分析是数据挖掘中一种简单而实用的技术,通过深入分析数据集,寻找事物之间的关联性,挖掘频繁出现的组合,并描述组合对象同时出现的模式和规律。
关联分析技术不仅可以用来分析用户购买商品之间的关联性制定营销策略,也可以应用于智能推荐系统、医疗、保险等领域。
2. 关联分析的基本概念
- 事务库:记录用户行为的数据,以提篮分析来说,就是用户的订单交易信息以及商品数据。
- 事务:事务库中每一行记录就是一笔事务,以提篮分析来说,一笔订单就是一笔事务。
- 项和项集:在购物篮事务库中,订单中的每个商品就是一个项,项的集合称为项集。
- 关联规则:由“前件”和“后件”组成,A->B,{A,B}->C,分别代表如果一个用户购买了A也会购买B,一个用户购买了A和B,也会购买C。
- 支持度:包含该项集的事务在整体所有事务中所占的比例。例如项集{A,B}在购物篮中共出现3次,一共由5笔订单,则项集{A,B}的支持度为3/5。
- 频繁项集:支持度大于人为设定的阈值的项集成为频繁项集。
- 置信度:置信度的含义是项集Y在包含项集X的事务中出现的频繁程度。在购物篮事务中,关联规则X->Y的置信度=P(Y|X)=P(XY)/P(X)=support(X,Y)/support(X)
- 强关联规则:强关联规则是指频繁项集中满足了最小置信度的关联规则,即项集首先要满足最小支持度。
二、Apriori算法是什么?
Apriori算法是著名的关联规则的挖掘算法之一,核心是递推算法,步骤如下:
- 设定最小支持度和最小置信度
- 根据最小支持度找出频繁项集
- 根据最小置信度找出强关联规则
三、Apriori算法在Python中的使用
Python中可以利用apyori库和mlxtend库快速推到强关联规则,apyori库使用简单,但有时会漏掉一些强关联规则;mlxtend库稍显麻烦,但比较严谨。
1. 案例1-用apyori库实现病症关联分析
import pandas as pd
df = pd.read_excel('中医辨证.xlsx')
print(df.head())
excel数据中存储的是病人的编号和病人病症,共 1000 条:
symptoms = []
for i in df['病人症状'].tolist():
symptoms.append(i.split(','))
print(symptoms)
去掉逗号之后的 list:symptoms
from apyori import apriori
#设置支持度和置信度
rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)
results = list(rules)
for i in results:
for j in i.ordered_statistics: #获取频繁项集中的强关联规则
# 前件
X = j.items_base
# 后件
Y = j.items_add
x = ', '.join([item for item in X]) #连接前件中的元素
y = ', '.join([item for item in Y])
if x != '': #防止前件出现为空的情况
print(x + ' → ' + y)
最终获取结果如下:
2. 案例1-用mlxtend库实现亚马逊提篮分析
数据集是在kaggle上下载的,是个1000行的数据集,mlxtend的数据要求是不能有id列,要有表头,值必须是True或者False的字符串
import pandas as pd
df = pd.read_csv('basket_analysis.csv')
print(df.head())
from mlxtend.frequent_patterns import apriori
items = apriori(df,min_support=0.1, use_colnames=True)
print(items)
items是符合置信度大于等于0.1的频繁项集
from mlxtend.frequent_patterns import association_rules
rules = association_rules(items, min_threshold=0.4)
rules是最后获取到的结果集
表头的列如上,其中 antecedents 列代表关联规则中的前件,如关联规则{A}→{B}中的{A};consequents列代表关联规则中的后件,如关联规则{A}→{B}中的{B};antecedent support 列代表前件的支持度,consequent support列代表后件的支持度,support列代表该关联规则的支持度,confidence列代表该关联规则的置信度。
输出结果中的lift、leverage、conviction这3列都是用来衡量关联度强弱的:
lift列代表该关联规则的提升度,其计算公式为“关联规则支持度/(前件支持度×后件支持度)”,该值越大,表明X和Y的关联度越强;
leverage列代表关联规则的杠杆率,其计算公式为“关联规则支持度-前件支持度×后件支持度”,该值越大,表明X和Y的关联度越强;
conviction列代表关联规则的确信度,其计算公式为“(1-后件支持度)/(1-关联规则置信度)”,该值越大,表明X和Y的关联度越强。
for i, j in rules.iterrows():
X = j['antecedents']
Y = j['consequents']
x = ', '.join([item for item in X])
y = ', '.join([item for item in Y])
print(x + ' → ' + y)
这是最后出现的部分关联规则,其中置信度的参数可以自己灵活调整,我一开始设置为 0.7 是没有结果的,说明这个数据集中的商品购买 关联性没有达到 70% 这个比例的。
实际运用可以视实际场景而定,针对不同置信度的关联商品做分阶段的商品营销策略。