上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度。以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集。

这次呢,我们会在上次的基础上,讲讲如何分析物品的关联规则得出关联结果,以及给出用apyori这个库运行得出关联结果的代码。

一. 基础知识

上次我们介绍了几个关联分析的概念,支持度,置信度,提升度。这次我们重点回顾一下置信度和提升度:

置信度(Confidence):置信度是指如果购买物品A,有较大可能购买物品B。计算方式是这样:

置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)

举例:我们已经知道,(牛奶,鸡蛋)一起购买的次数是两次,鸡蛋的购买次数是4次。那么置信度Confidence(牛奶->鸡蛋)的计算方式是Confidence(牛奶->鸡蛋)=2 / 4。

提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少。计算方式是:

提升度( A -> B) = 置信度( A -> B) / (支持度 A)

举例:上面我们计算了牛奶和鸡蛋的置信度Confidence(牛奶->鸡蛋)=2/4。牛奶的支持度Support(牛奶)=3 / 5,那么我们就能计算牛奶和鸡蛋的支持度Lift(牛奶->鸡蛋)=0.83

当提升度(A->B)的值大于1的时候,说明物品A卖得越多,B也会卖得越多。而提升度等于1则意味着产品A和B之间没有关联。最后,提升度小于1那么意味着购买A反而会减少B的销量

举个例子,有了这个指标,你就能看出卖越多的汉堡就会卖越多的番茄酱。但卖越多的沐浴露,则可能香皂的销量会下降。

二. 关联规则

我们前面已经用Apriori得到频繁项集了。那么我们就可以在频繁项集的基础上,找到这里面的关联规则。而计算关联规则所用到的,就是我们上面所说的置信度和提升度

这里有一点要注意,当我们发现置信度(A->B)很高的时候,反过来的值置信度(B->A)不一定很高。

一个物品的关联结果是非常多的。但好在,我们上一节学习了Apriori思想。运用在置信度上也是合适的:

如果一个关联结果的置信度低,那么它的所有超集的置信度也低

这样一来,我们就能节省很多的计算量。

三. Apriori关联规则实战

我们还是用mlxtend库,根据上一篇找到的频繁项集,计算出它们的关联规则。在此之前,还是先介绍一下相应API的参数。

association_rules(df, metric="confidence",
min_threshold=0.8,
support_only=False): 参数介绍:
- df:这个不用说,就是 Apriori 计算后的频繁项集。
- metric:可选值['support','confidence','lift','leverage','conviction']。
里面比较常用的就是置信度和支持度。这个参数和下面的min_threshold参数配合使用。
- min_threshold:参数类型是浮点型,根据 metric 不同可选值有不同的范围,
metric = 'support' => 取值范围 [0,1]
metric = 'confidence' => 取值范围 [0,1]
metric = 'lift' => 取值范围 [0, inf]
support_only:默认是 False。仅计算有支持度的项集,若缺失支持度则用 NaNs 填充。

完整代码如下:

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori #设置数据集
dataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['牛奶','苹果','芸豆','鸡蛋'],
['牛奶','独角兽','玉米','芸豆','酸奶'],
['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']] te = TransactionEncoder()
#进行 one-hot 编码
te_ary = te.fit(records).transform(records)
df = pd.DataFrame(te_ary, columns=te.columns_)
#利用 Apriori 找出频繁项集
freq = apriori(df, min_support=0.05, use_colnames=True) #导入关联规则包
from mlxtend.frequent_patterns import association_rules
#计算关联规则
result = association_rules(freq, metric="confidence", min_threshold=0.6)

这里我们根据置信度来计算,找出置信度大于0.6的关联规则。

计算结果如下:

   antecedents      consequents        antecedent support              consequent support       support           confidence      lift       leverage            conviction
0 (洋葱) (芸豆) 0.6 1.0 0.6 1.00 1.00 0.00 inf
1 (芸豆) (洋葱) 1.0 0.6 0.6 0.60 1.00 0.00 1.000000
2 (洋葱) (鸡蛋) 0.6 0.8 0.6 1.00 1.25 0.12 inf
3 (鸡蛋) (洋葱) 0.8 0.6 0.6 0.75 1.25 0.12 1.600000
4 (芸豆) (牛奶) 1.0 0.6 0.6 0.60 1.00 0.00 1.000000
5 (牛奶) (芸豆) 0.6 1.0 0.6 1.00 1.00 0.00 inf
6 (酸奶) (芸豆) 0.6 1.0 0.6 1.00 1.00 0.00 inf
7 (芸豆) (酸奶) 1.0 0.6 0.6 0.60 1.00 0.00 1.000000
8 (芸豆) (鸡蛋) 1.0 0.8 0.8 0.80 1.00 0.00 1.000000
9 (鸡蛋) (芸豆) 0.8 1.0 0.8 1.00 1.00 0.00 inf
10 (洋葱, 芸豆) (鸡蛋) 0.6 0.8 0.6 1.00 1.25 0.12 inf
11 (洋葱, 鸡蛋) (芸豆) 0.6 1.0 0.6 1.00 1.00 0.00 inf
12 (鸡蛋, 芸豆) (洋葱) 0.8 0.6 0.6 0.75 1.25 0.12 1.600000
13 (洋葱) (鸡蛋, 芸豆) 0.6 0.8 0.6 1.00 1.25 0.12 inf
14 (芸豆) (洋葱, 鸡蛋) 1.0 0.6 0.6 0.60 1.00 0.00 1.000000
15 (鸡蛋) (洋葱, 芸豆) 0.8 0.6 0.6 0.75 1.25 0.12 1.600000

我们可以发现,除了置信度(confidence),提升度(lift)外,还有两个指标,leverage和conviction。这两个用得比较少,和置信度,提升度也有些类似,就不展开说了。

既然返回的结果是Dataframe,那么就可以很方便得用pandas的排序方法找出置信度或提升度高的物品组合,方法如下:

DataFrame.sort_values

比如上面例子中要找出最大的置信度,用

result.sort_values(by = 'confidence',ascending=False,axis=1)

上面例子中我们可以发现,{洋葱 -> 鸡蛋,芸豆} 的置信度是 1.00 ,而它们的提升度是 1.25 。这说明买了洋葱的人很可能会再购买 1.25 份的 {鸡蛋,芸豆} 。所以可以让它们放到一起出售。

OK,相信通过这个前面的介绍和这次的这个例子,已经能够明白Apriori算法的原理以及如何使用它。当然Apriori只能算是关联挖掘算法中比较基础的一个,还有其他的关联挖掘算法,比如FP-growth,以后有机会再介绍吧。

对了,我从网上找了个关联分析的数据和大概针对这个数据写了个小的demo代码。

数据是超市的购物清单,大概有7500条,足够我们来运算分析了。

我把数据和我写的一点点demo代码放在我的公众号中了,关联公众号:哈尔的数据城堡,回复“apriori”(不需要双引号),就能获得下载链接了。

以上~

Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战的更多相关文章

  1. 深入浅出Apriori关联分析算法(一)

    在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加.这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽然事 ...

  2. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  3. 第十四篇:Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  4. Apriori关联分析算法概述

    概念 关联分析:从大规模数据集中寻找物品间的隐含关系.物品间关系又分为两种:频繁项集或关联规则,频繁项集是经常出现一块的物品集合:关联规则则暗示物品间存在很强的联系 关联评判标准:支持度和可信度.支持 ...

  5. Apriori关联分析详解

    ------------恢复内容开始------------ 一. Apriori关联分析概述 选择物品之间的关联规则也就是要找出物品之间的关系,要找到这种关系有两步 找出频繁一起出现的物品集的集合, ...

  6. 使用Apriori进行关联分析(二)

    书接上文(使用Apriori进行关联分析(一)),介绍如何挖掘关联规则. 发现关联规则 我们的目标是通过频繁项集挖掘到隐藏的关联规则. 所谓关联规则,指通过某个元素集推导出另一个元素集.比如有一个频繁 ...

  7. python的引用计数分析(二)

    python所有对象引用计数被减少1的情况: 一.对象的别名被赋予新的对象; a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 print(sys.getrefcount( ...

  8. 关联分析Apriori算法和FP-growth算法初探

    1. 关联分析是什么? Apriori和FP-growth算法是一种关联算法,属于无监督算法的一种,它们可以自动从数据中挖掘出潜在的关联关系.例如经典的啤酒与尿布的故事.下面我们用一个例子来切入本文对 ...

  9. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

随机推荐

  1. who are you?

    不多说,直接使用脚本跑 # -*- coding:utf-8 -*- import requests import string url = "http://ctf5.shiyanbar.c ...

  2. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  3. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  4. AndroidStudio使用genymotion模拟器

    安装Genymotion之前首先要安装好virtualbox这个软件 virtual官方网站:https://www.virtualbox.org/ genymotion的官方网站: https:// ...

  5. LiteDB源码解析系列(4)跳表基本原理

    LitDB里面索引的数据结构是用跳表来实现的,我知道的开源项目中使用跳表的还包括Redis,大家可以上网搜索关于Redis的跳表功能的实现.在这一章,我将结合LiteDB中的示例来讲解跳表. 1.跳表 ...

  6. 成为高级 React 开发你需要知道的知识点

    简评:除了常见的 HOC 和 RenderProp 技巧,作者介绍了 7 个有用的知识点. 使用 Fragment 而不是 div 很多时候我们想要处理多个 component,但是 render 只 ...

  7. MyBatis从入门到精通(十四):在MyBatis中使用类型处理器

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解在MyBatis中如何 ...

  8. 解决Windows10下安装Ubuntu16.04双系统后开机没有Ubuntu引导

    转载 https://blog.csdn.net/qq_27838307/article/details/79149791 1.按照网上教程在磁盘中压缩硬盘并且不需要给他新建卷标,就让他显示空闲就好了 ...

  9. 【MySQL】(六)锁

    开发多用户.数据库驱动的应用时,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另一方面还要确保每个用户能以一致的方式读取和修改数据.为此就有了锁(locking)的机制,同时这也是数据库系 ...

  10. jQuery 解析 url 参数

    应用场景: 三毛:我现在拿到一个 url 地址(https://www.google.com/search?dcr=&ei=5C&q=param),我现在要获取 location.se ...