数据挖掘——关联分析Apriori算法

实验原理

关联规则:

是形如X→Y的蕴涵式,其中,X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。其中,关联规则XY,存在支持度和信任度。
支持度:几个关联的数据在数据集中出现的次数占总数据集的比重
S u p p o r t ( X , Y ) = P ( X Y ) = n u m b e r ( X Y ) n u m ( A l l S a m p l e ) Support(X,Y) = P(XY)=\frac{number(XY)}{num(AllSample)} Support(X,Y)=P(XY)=num(AllSample)number(XY)
置信度:一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。
C o n f i d e n c e ( X ← Y ) = P ( X ∣ Y ) = P ( X ∣ Y ) P ( Y ) Confidence(X \gets Y) = P(X|Y)=\frac{P(X|Y)}{P(Y)} Confidence(XY)=P(XY)=P(Y)P(XY)
提升度:表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比。
L i f t ( X ← Y ) = P ( X ∣ Y ) P ( X ) = C o n f i d e n c e ( X ← Y ) P ( X ) Lift(X \gets Y)=\frac{P(X|Y)}{P(X)}=\frac{Confidence(X \gets Y) }{P(X)} Lift(XY)=P(X)P(XY)=P(X)Confidence(XY)

示例

使用Apriori算法发现频繁项集:

  1. 扫描数据集,得到所有出现过的数据,作为候选1项集
  2. 挖掘频繁k项集扫描计算候选k项集的支持度剪枝去掉候选k项集中支持度低于最小支持度α的数据集,得到频繁k项集。如果频繁k项集为空,则返回频繁k-1项集的集合作为算法结果,算法结束。基于频繁k项集,链接生成候选k+1项集
  3. 利用步骤2,迭代得到k=k+1项集结果
    发现频繁集
    由频繁项集产生关联规则:
  4. 对于每个频繁项集I,产生I的所有非空子集
  5. 对于I的每个非空子集s,如果
    S u p p o r t ( I ) S u p p o r t ( s ) ⩾ m i n c o n f \frac{Support(I)}{Support(s)}\geqslant minconf Support(s)Support(I)minconf
    则输出规则“s(l-s)”。其中,minconf是最小置信度阈值:
    C o n f i d e n c e ( A → B ) = P ( A ∣ B ) = S u p p o r t ( A ∪ B ) S u p p o r t ( A ) Confidence(A \to B) = P(A|B)=\frac{Support(A\cup B)}{Support(A)} Confidence(AB)=P(AB)=Support(A)Support(AB)

生成关联规则

算法

Apriori算法

是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。

原理:

  1. 如果一个项集是频繁项集,则它的所有子集都是频繁项集;
  2. 如果一个集合不是频繁项集,则它的所有父集(超集)都不是频繁项集。

目标:

  1. 发现频繁项集:发现满足最小支持度的所有项集;
  2. 发现关联规则:从频繁项集中提取所有高置信度的规则。
  3. 缺点:

(1)对数据库的扫描次数过多。
(2)Apriori算法会产生大量的中间项集。
(3)采用唯一支持度。
(4)算法的适应面窄。

实验步骤

  1. 先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集;
  2. 对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集;
  3. 以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。

代码

代码如下(示例):

#导入相关库
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
#打开数据文件
df=pd.read_excel(r'C:\Users\dell\.PyCharmCE2018.3\config\scratches\Online Retail.xlsx')
print(df.head())
#选择数据
df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]
#描述Description字段去除首尾空格,删除发票ID"InvoiceNo"为空的数据记录,
# 将发票ID"InvoiceNo"字段转为字符型,删除发票ID"InvoiceNo"不包含“C”的记录
basket = (df[df['Country'] =="France"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))
#basket选择法国地区数据不要忘记fillna(0),将空值转为0,算法包需要。列名为商品名称,每一行为一个订单。
#将购物数量转为0/1变量
#0:此订单未购买包含列名
#1:此订单购买了列名商品
def encode_units(x):
    if x <= 0:
        return 0
    if x >= 1:
        return 1
#使用dataframe的applymap函数,将encode_units在basket中的每个单元格执行并返回
#删除购物篮中的邮费项(POSTAGE)
basket_sets = basket.applymap(encode_units)
basket_sets.drop('POSTAGE', inplace=True, axis=1)
#frequent_itemsets 为频繁项集:
#Support列为支持度,即 项集发生频率/总订单量
#产生相应的信心和提升的规则,rules为最终关联规则结果表:
#antecedants前项集,consequents后项集,support支持度,confidence置信度,lift提升度。
frequent_itemsets = apriori(basket_sets, min_support=0.07, use_colnames=True)
print(frequent_itemsets)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
import xlwt
pd.set_option('display.max_columns',None)
print(rules.head())
rules.to_csv(r'E:\文件\课程\数据挖掘\Apriori.csv')
#选取置信度(confidence)大于0.8且提升度(lift)大于5的规则,按lift降序排序
rules [(rules['lift'] >= 6) & (rules['confidence'] >= 0.8)]
basket['ALARM CLOCK BAKELIKE GREEN'].sum()
#结果:340.0
basket['ALARM CLOCK BAKELIKE RED'].sum()
#结果:316.0

#basket2为德国地区数据
basket2 = (df[df['Country'] =="Germany"]
          .groupby(['InvoiceNo', 'Description'])['Quantity']
          .sum().unstack().reset_index().fillna(0)
          .set_index('InvoiceNo'))
basket_sets2 = basket2.applymap(encode_units)
basket_sets2.drop('POSTAGE', inplace=True, axis=1)
frequent_itemsets2=apriori(basket_sets2,min_support=0.05, use_colnames=True)
rules2= association_rules(frequent_itemsets2, metric="lift", min_threshold=1)
rules2[ (rules2['lift'] >= 4) & (rules2['confidence'] >= 0.5)]
Rules2.to_csv(r'E:\文件\课程\数据挖掘\Apriori2.csv')

结果分析

对于法国的数据,查看规则时,可以发现似乎绿色和红色闹钟是一起购买的,红纸杯,餐巾纸和纸板是以总体概率提高的方式一起购买的。
例如:我们可以看到,我们销售340个绿色闹钟,但只有316个红色闹钟,所以也许我们可以通过科学的方法来推动更多的红色闹钟销售。
法国输出结果
统计
(antecedants前项集,consequents后项集,support支持度,confidence置信度,lift提升度。)

对于德国的数据:德国人喜欢锡太太雄和林地动物的奶油布丁一起买,或者圆盒子的水果和圆盒子的林地动物小吃一起买。
德国输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值