关联分析规则---Apriori算法的理解和使用

apriori:算法(无监督学习)

  • 应用场景:

    • 1.啤酒、尿不湿;2.大量数据中(购物小票)找到经常在一起出现的物品组合
    • 3.库存管理(摆放);4.促销页面设计;5.捆绑销售;6.内容推荐
  • 相关概念

    • 1.支持度support:物品或物品组合,在所有数据中出现的概率

      • 公式:计算同时购买AB的支持度:support(A&B) = 同时购买AB的订单数量/总的订单数量=n(A&B)/n
    • 2.置信度confidence:购买A的订单中同时购买了B的订单数量/购买A的订单数量,就称为A对B的置信度

      • 公式:confidence(A->B)=P(B|A)=P(B&A)/P(A)= (n(A&B)/n)/(n(A)/n)= n(A&B)/n(A)
      • 相当于条件概率的计算P(B|A)=同时出现AB的概率/出现A的概率
      • 注意:A对B的置信度,与B对A的置信度不是一个概念
    • 3.提升度lift:应用关联规则与不应用产生结果的比例;

      • 公式:lift(A->B)= 对购买A的人运用规则计算会去买B的数量比例 / 不考虑是否购买A计算购买B的数量比例 = confidence(A->B) / support(B) = P(B&A)/P(A) / P(B) = n(A&B)/n(A) / (n(B)/n) = n(A&B)*n/n(A)/n(B) (这就是A对B的提升度,从公式很快得出,A对B的提升度与B对A的提升度相等
      • 如果lift>1,说明关联规则有效果,但在实际运用中,我们认为提升度>3才算作值得认可的关联规则
      • 如果lift=1,说明没有任何意义,A与B相互独立,互不影响;
      • 如果lift<1,说明有反作用,买了A就不愿意买B;
  • 举例说明: 20个人,5个人买了面包+牛奶,3个人只买了面包,7个人只买了牛奶,还有5个人只买了鸡蛋

    • 同时购买 面包+牛奶 的支持度support = 5/20=0.25 >0.1(满足支持度阈值>0.1)
    • 购买面包 对 购买牛奶 的置信度confidence = 5/(5+3)=5/8 >0.5(满足置信度阈值>0.5)
    • 购买牛奶 对 购买面包 的置信度confidence = 5/(5+7)=5/12 <0.5(不满足置信度阈值>0.5)
    • 同时购买:面包+牛奶 的提升度lift = 5*20/((5+3)(5+7))=100/8/12>1
  • 补充说明:为什么在实际运用中,我们认为提升度>3才算作值得认可的关联规则

    • 当n中零事件由5变为35时,此时同时购买面包+牛奶 的支持度support = 5/49=0.102 >0.1(刚刚满足支持度阈值>0.1),此时计算提升度为:lift = 5*49/((5+3)(5+7))=245/8/12=2.55>1,有关联
    • 当n中零事件由5变为0时,此时同时购买面包+牛奶 的支持度support = 5/15=0.33 >0.1(满足支持度阈值>0.1),此时计算提升度为:lift = 5*15/((5+3)(5+7))=75/8/12=0.78<1,互斥
    • 结论:
      • 根据补充说明中的情况,在满足支持度>0.1的情况下,零事件数量的改变对提升度的影响,从0.78提升到了2.55,n中零事件越多,提升度的值越大
      • 所以,在实际运用中,我们一般定义支持度>0.1的情况下,认为提升度>3才算作值得认可的关联规则

apriori原理

  • apriori原理:如果某个项集是频繁项集,那么它所有的子集也是频繁的。即如果 {0,1} 是频繁的,那么 {0}, {1} 也一定是频繁的;;这个原理直观上没有什么用,但是反过来看就有用了,该定理的逆反定理为 :如果一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的;;Apriori原理的出现,可以在得知某些项集是非频繁之后,不需要计算该集合的超集,有效地避免项集数目的指数增长,从而在合理时间内计算出频繁项集。
  • 使用Apriori算法发现数据的(频繁项集、关联规则)
    • 频繁项集:经常出现在一块的物品的集合
    • 关联规则:暗示两种物品之间可能存在很强的关系
    • Apriori具体算法实现网上查,直接使用其接口即可Apriori
    • pip install akapriori
    • 使用: from akapriori import apriori
    • rules = apriori(order_records, support=0.1, confidence=0.5, lift=0,minlen=0, maxlen=5)
    • 返回 5个值:rules_all = pd.DataFrame(rules, columns=[‘item1’,‘item2’,‘support’,‘confidence’,‘lift’])

代码实现

import pandas as pd
import apriori

# 加载数据文件
data = pd.read_csv('order_table.csv')

# 转换成关联所用的记录模式
order_ids = pd.unique(data['order_id'])  # 去重得到订单id
# 将相同id的产品名称拼接到一个子列表中,再将这些id对应的子列表拼到一个列表中
order_records = [data[data['order_id']==each_id]['product_name'].tolist() for each_id in 
                order_ids]
# 通过调用自定义的apriori做关联分析
minS = 0.1 # 定义最小支持度阈值
minC = 0.5 # 定义最小置信度阈值
# 计算得到满足最小支持度的规则
L, suppData = apriori.apriori(order_records, minSupport=minS)
# 计算满足最小置信度的规则
rules = apriori.generateRules(order_records, L, suppData, minConf=minC)
# 关联结果报表评价
# 展示数据集记录数和满足阈值定义的规则数量
model_summary = 'data record: {1} \ nassociation rules count: {0}'
print(model_summary.format(len(rules), len(order_records)), '\n','-'*60) # 使用str.format()输出
# 创建频繁规则数据集
rules_all = pd.DataFrame(rules, 
                         columns=['item1','item2','instance','support','confidence','lift'])
rules_sort = rules_all.sort_values(['lift'], ascending=False)
rules_sort.head(10)

你可能感兴趣的:(数据挖掘,数据挖掘,机器学习,python,概率论)