想必大家都据说过啤酒和纸尿裤的故事,十分典型的提篮剖析,通过剖析顾客的购买习惯,制订相应的营销策略,从而进步营收,是关联剖析在批发超市中的一个具体分析场景。明天就来总结下关联剖析的基本概念以及如何用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算法是驰名的关联规定的开掘算法之一,外围是递推算法,步骤如下:

  1. 设定最小反对度和最小置信度
  2. 依据最小反对度找出频繁项集
  3. 依据最小置信度找出强关联规定

三、Apriori算法在Python中的应用

Python中能够利用apyori库和mlxtend库疾速推到强关联规定,apyori库应用简略,但有时会漏掉一些强关联规定;mlxtend库稍显麻烦,但比拟谨严。

1. 案例1-用apyori库实现病症关联剖析
import pandas as pddf = 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 pddf = pd.read_csv('basket_analysis.csv')print(df.head())

from mlxtend.frequent_patterns import aprioriitems = apriori(df,min_support=0.1, use_colnames=True)print(items)

items是合乎置信度大于等于0.1的频繁项集

from mlxtend.frequent_patterns import association_rulesrules = 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% 这个比例的。
理论使用能够视理论场景而定,针对不同置信度的关联商品做分阶段的商品营销策略。