啤酒和尿布:一文看懂关联规则

  • 一、关联规则
  • 二、Apriori算法
    • 2.1 相关概念
    • 2.2 实现步骤
    • 2.3 代码实现

谈到大数据在零售业的应用,不得不提到一个经典的营销案例–啤酒和尿布的故事,有个有趣的现象——啤酒和尿布赫然摆放在一起出售,但是,这个奇怪的举措却使啤酒和尿布的销量双双增加了。这是发生在美国沃尔玛超市的真实案例,并一直为商家所津津乐道。
为人们所知的是因为男人去超市买尿布时顺手买了啤酒,所以啤酒和尿布销量增加,那么从数据和算法层面分析,大家知道为什么啤酒和尿布放在一起销量会增加吗。

一、关联规则

站在啤酒和尿布故事后面的是关联规则算法,进行关联性分析是涉及到三个指标:

1.支持度(Support)
支持度表示项集{X,Y}在总项集里出现的概率。表示A和B同时在总数I中发生的概率\color{#FF0000}{表示A和B同时在总数I 中发生的概率}表示A和B同时在总数I中发生的概率 ,公式为:

          Support(X→Y) = P(X,Y) / P(I) = P(X∩Y) / P(I) = num(X∩Y) / num(I)

其中,I表示总事务集。num()表示求事务集里特定项集出现的次数。

2.置信度 (Confidence)
置信度表示在先决条件X发生的情况下,由关联规则”X→Y“推出Y的概率。表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例\color{red}{表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例}表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例,公式为:

           Confidence(X→Y) = P(Y|X)  = P(X,Y) / P(X) = P(X∩Y) / P(X)

3.提升度(Lift)
提升度表示含有X的条件下,同时含有Y的概率,与只看Y发生的概率之比。提升度反映了关联规则中的X与Y的相关性\color{red}{提升度反映了关联规则中的X与Y的相关性}提升度反映了关联规则中的X与Y的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性,即相互独立。

           Lift(X→Y) = P(Y|X) / P(Y)

下面用例子直观的解释一下三个指标:

比如有100个订单I,其中10个订单中有牛奶A,20个订单中有面包B,5个订单即有牛奶又有面包:
Support(A->B) = P(A,B) / P(I) = 5/100 = 0.05;
Confidence(A->B) = P(B/A) = P(A,B) / P(A) = 5/10 = 0.5;
Lift(A->B) = P(B/A) / P(B) = 0.5/0.2 = 2.5;
LIFT>1,表示牛奶面包正相关性;

二、Apriori算法

2.1 相关概念

  • 项与项集:设itemset={item1, item_2, …, item_m}是所有项的集合,其中,item_k(k=1,2,…,m)成为项。项的集合称为项集(itemset),包含k个项的项集称为k项集(k-itemset)。
  • 事务与事务集:一个事务T是一个项集,它是itemset的一个子集,每个事务均与一个唯一标识符Tid相联系。不同的事务一起组成了事务集D,它构成了关联规则发现的事务数据库。
  • 关联规则:关联规则是形如A=>B的蕴涵式,其中A、B均为itemset的子集且均不为空集,而A交B为空。
  • 频繁项集(frequent itemset):如果项集I的相对支持度满足事先定义好的最小支持度阈值(即I的出现频度大于相应的最小出现频度(支持度计数)阈值),则I是频繁项集。
    强关联规则:满足最小支持度和最小置信度的关联规则,即待挖掘的关联规则。

2.2 实现步骤

一般而言,关联规则的挖掘是一个两步的过程:
比如对于数据集:

[['l1', 'l2', 'l5'],
['l2', 'l4'],
['l2', 'l3'],
['l1', 'l2', 'l4'],
['l1', 'l3'],
['l2', 'l3'],
['l1', 'l3'],
['l1', 'l2', 'l3', 'l5'],
['l1', 'l2', 'l3']]
  1. 找出所有的频繁项集
    遍历数据集,首先找出频繁1项集:[‘l1’]、[‘l2’]、[‘l3’]、[‘l4’]、[‘l5’]
    然后找出频繁2项集:[‘l1’,‘l2’]、[‘l1’,‘l3’]、[‘l1’,‘l4’]、[‘l1’,‘l5’]、[‘l2’,‘l3’]、[‘l2’,‘l4’]、[‘l2’,‘l5’]、…、[‘l3’,‘l4’];
    找出频繁3项集:[‘l1’, ‘l2’, ‘l5’]、[‘l1’, ‘l2’, ‘l4’]…
  2. 由频繁项集产生强关联规则
    把每个频繁项集的支持度和置信度和阈值对比,找出强关联规则。

2.3 代码实现

"""
# Python 2.7
# Filename: apriori.py
# Author: llhthinker
# Email: hangliu56[AT]gmail[DOT]com
# Blog: http://www.cnblogs.com/llhthinker/p/6719779.html
# Date: 2017-04-16
"""def load_data_set():"""Load a sample data set (From Data Mining: Concepts and Techniques, 3th Edition)Returns: A data set: A list of transactions. Each transaction contains several items."""data_set = [['l1', 'l2', 'l5'], ['l2', 'l4'], ['l2', 'l3'],['l1', 'l2', 'l4'], ['l1', 'l3'], ['l2', 'l3'],['l1', 'l3'], ['l1', 'l2', 'l3', 'l5'], ['l1', 'l2', 'l3']]return data_setdef create_C1(data_set):"""Create frequent candidate 1-itemset C1 by scaning data set.Args:data_set: A list of transactions. Each transaction contains several items.Returns:C1: A set which contains all frequent candidate 1-itemsets"""C1 = set()for t in data_set:for item in t:item_set = frozenset([item])C1.add(item_set)return C1def is_apriori(Ck_item, Lksub1):"""Judge whether a frequent candidate k-itemset satisfy Apriori property.Args:Ck_item: a frequent candidate k-itemset in Ck which contains all frequentcandidate k-itemsets.Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.Returns:True: satisfying Apriori property.False: Not satisfying Apriori property."""for item in Ck_item:sub_Ck = Ck_item - frozenset([item])if sub_Ck not in Lksub1:return Falsereturn Truedef create_Ck(Lksub1, k):"""Create Ck, a set which contains all all frequent candidate k-itemsetsby Lk-1's own connection operation.Args:Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.k: the item number of a frequent itemset.Return:Ck: a set which contains all all frequent candidate k-itemsets."""Ck = set()len_Lksub1 = len(Lksub1)list_Lksub1 = list(Lksub1)for i in range(len_Lksub1):for j in range(1, len_Lksub1):l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])l1.sort()l2.sort()if l1[0:k-2] == l2[0:k-2]:Ck_item = list_Lksub1[i] | list_Lksub1[j]# pruningif is_apriori(Ck_item, Lksub1):Ck.add(Ck_item)return Ckdef generate_Lk_by_Ck(data_set, Ck, min_support, support_data):"""Generate Lk by executing a delete policy from Ck.Args:data_set: A list of transactions. Each transaction contains several items.Ck: A set which contains all all frequent candidate k-itemsets.min_support: The minimum support.support_data: A dictionary. The key is frequent itemset and the value is support.Returns:Lk: A set which contains all all frequent k-itemsets."""Lk = set()item_count = {}for t in data_set:for item in Ck:if item.issubset(t):if item not in item_count:item_count[item] = 1else:item_count[item] += 1t_num = float(len(data_set))for item in item_count:if (item_count[item] / t_num) >= min_support:Lk.add(item)support_data[item] = item_count[item] / t_numreturn Lkdef generate_L(data_set, k, min_support):"""Generate all frequent itemsets.Args:data_set: A list of transactions. Each transaction contains several items.k: Maximum number of items for all frequent itemsets.min_support: The minimum support.Returns:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support."""support_data = {}C1 = create_C1(data_set)L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)Lksub1 = L1.copy()L = []L.append(Lksub1)for i in range(2, k+1):Ci = create_Ck(Lksub1, i)Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)Lksub1 = Li.copy()L.append(Lksub1)return L, support_datadef generate_big_rules(L, support_data, min_conf):"""Generate big rules from frequent itemsets.Args:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support.min_conf: Minimal confidence.Returns:big_rule_list: A list which contains all big rules. Each big rule is representedas a 3-tuple."""big_rule_list = []sub_set_list = []for i in range(0, len(L)):for freq_set in L[i]:for sub_set in sub_set_list:if sub_set.issubset(freq_set):conf = support_data[freq_set] / support_data[freq_set - sub_set]big_rule = (freq_set - sub_set, sub_set, conf)if conf >= min_conf and big_rule not in big_rule_list:# print freq_set-sub_set, " => ", sub_set, "conf: ", confbig_rule_list.append(big_rule)sub_set_list.append(freq_set)return big_rule_listif __name__ == "__main__":"""Test"""data_set = load_data_set()L, support_data = generate_L(data_set, k=3, min_support=0.2)big_rules_list = generate_big_rules(L, support_data, min_conf=0.7)for Lk in L:print "="*50print "frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport"print "="*50for freq_set in Lk:print freq_set, support_data[freq_set]printprint "Big Rules"for item in big_rules_list:print item[0], "=>", item[1], "conf: ", item[2]

代码运行结果截图如下:

参考:https://www.cnblogs.com/llhthinker/p/6719779.html

啤酒和尿布:一文看懂关联规则相关推荐

  1. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)

    2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...

  2. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)

    2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...

  3. 一文看懂人脸识别(4个特点+4个实现步骤+5个难点+算法发展轨迹)

    2020-03-09 20:01:00 人脸识别是身份识别的一种方式,目的就是要判断图片和视频中人脸的身份时什么. 本文将详细介绍人脸识别的4个特点.4个步骤.5个难点及算法的发展轨迹. 什么是人脸识 ...

  4. 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)

    http://blog.itpub.net/29829936/viewspace-2648775/ 2019-06-25 21:31:18 卷积神经网络 – CNN 最擅长的就是图片的处理.它受到人类 ...

  5. 【深度学习理论】一文看懂卷积神经网络

    [深度学习理论]一文看懂卷积神经网络 https://mp.weixin.qq.com/s/wzpMtMFkVDDH6scVcAdhlA 选自Medium 作者: Pranjal Yadav 经机器之 ...

  6. python读取excelsheet-一文看懂用Python读取Excel数据

    原标题:一文看懂用Python读取Excel数据 导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要 ...

  7. ​【Python基础】一文看懂 Pandas 中的透视表

    作者:来源于读者投稿 出品:Python数据之道 一文看懂 Pandas 中的透视表 透视表在一种功能很强大的图表,用户可以从中读取到很多的信息.利用excel可以生成简单的透视表.本文中讲解的是如何 ...

  8. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...

  9. 一文看懂深度学习——人工智能系列学习笔记

    深度学习有很好的表现,引领了第三次人工智能的浪潮.目前大部分表现优异的应用都用到了深度学习,大红大紫的 AlphaGo 就使用到了深度学习. 本文将详细的给大家介绍深度学习的基本概念.优缺点和主流的几 ...

最新文章

  1. c++调用python3
  2. InvocationHandler的invoke方法如何被调用?
  3. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
  4. 【Elasticsearch】Elasticsearch 集群 运维 高性能 架构设计 高负载
  5. 非常实用的Android Studio快捷键
  6. Python3.x:定义一个类并且调用
  7. Excel的Range对象(C#)
  8. C#调用新浪微博API生成RSS资源文件
  9. Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
  10. Session使用方法
  11. Linux文件管理器默认不显示隐藏文件
  12. Layui树形表格组件的实现
  13. 如何让win7在桌面显示ie图标
  14. js 如何处理缓存?如何清除缓存。
  15. omnigraffle mac 破解
  16. scala 自带json_在scala中格式化JSON字符串
  17. Artemis集群(18)
  18. pyqt创建窗口没有句柄_史上最强之《Pyqt》写游戏
  19. python绘制正六边形
  20. 生活风水系列(更避邪常识)之一

热门文章

  1. 阿里巴巴一件代发怎么下单
  2. 计算机瑞士留学经验,瑞士留学生活分享
  3. java 打开word(docx)替换内容,并插入图片(盖章)
  4. 第二章 核心动画渲染框架
  5. CSS3元素闪烁效果
  6. Axure RP 基于母版实现页面框架/页眉/页脚/导航栏
  7. 好好说话之IO_FILE利用(1):利用_IO_2_1_stdout泄露libc
  8. 好用的用户准入控制管理系统
  9. spring boot项目使用ojdbc8连接oracle 12c(12.2.0.1.0),解决启动极慢问题!
  10. Win10 Chromedriver安装教程