python数据挖掘(1.亲和性分析)

数据源(python数据挖掘文件下的chapter1)

亲和性分析

亲和性分析根据样本之间的相似度,确定他们关系的亲疏。
下面我们说一个非常常见的应用场景,顾客在买一件商品时,商家可以趁机了解他们还想买什么,以便把多数顾客愿意同时购买的商品放到一起增加销量以提升销售额,当商家收集到足够多的数据时,可以进行亲和性分析,确定哪些商品放到一起出售效果最佳。

亲和性有多种测量方式,例如,两件商品同时出售的频率,购买A再购买B的比例,还有其他方法,我们在后续章节中介绍。

为了方便讲述,我们只考虑一次购买两种商品的情况,我们的商场中有5种商品分别是面包,牛奶,奶酪,苹果和香蕉。数据在文章开头的链接中可以下载到。我们看一下数据

第一行0,0,1,1,1 。0代表没有购买,1代表购买了,该顾客购买了奶酪,苹果和香蕉,并没有购买面包和牛奶。每个特征值只有2个可能的值,1或0,表示是否购买了该商品,并非购买的个数。

我们需要找出的是‘如果顾客购买了商品A,那么他可能愿意购买商品B’这样的规则,最简单的办法是找出数据中同时购买的两件商品,看一下多少人这么做了。
有很多种衡量方法,常用的是支持度和置信度。
支持度指的是给定规则下的次数。
置信度衡量给定规则应验的比例

下面我们通过一个简单的例子来说明一下支持度和置信度的计算。
我们现在想知道,如果顾客购买了苹果,他们也会购买香蕉的支持度和置信度。

In [1]: import numpy as np                                                      In [2]: data_filename = 'Chapter1.txt'                             In [3]: x = np.loadtxt(data_filename)                                           In [4]: print(x[:5])
[[0. 0. 1. 1. 1.][1. 1. 0. 1. 0.][1. 0. 1. 1. 0.][0. 0. 1. 1. 1.][0. 1. 0. 0. 1.]]In [5]: n_samples, n_features = x.shape ...: print(n_samples,n_features)
100 5#一共100行,每行有5个数In [6]: features = ['bread','milk','cheese','apples','banana']                  In [7]: rule_valid = 0 ...: rule_invalid = 0 ...: for sample in x: ...:     if sample[3] == 1: ...:         if sample[4] ==1: ...:             rule_valid += 1 ...:         else: ...:             rule_invalid += 1 ...: print("既买了苹果又买香蕉的有%s人"%(rule_valid)) ...: print("买了苹果没买香蕉有%s人"%(rule_invalid))
既买了苹果又买香蕉的有21人
买了苹果没买香蕉有15人

那么我们所需要的数都算出来了。
在这个例子中,顾客购买了苹果,也会购买香蕉的支持度就是21,置信度为21/(21+15)=0.583.

现在我们要统计所有规则的相关数据,计算所有规则下的置信度和支持度。
下面我将创建几个字典用来存放这些数据,我们就按照features = [‘bread’,‘milk’,‘cheese’,‘apples’,‘banana’] 这个列表的索引来代替商品的名称,我用一个元组来当字典的键,例如(2,1)既购买奶酪的情况下也会购买牛奶,注意(2,1)和(1,2)是不同的概念。

In [21]: from collections import defaultdict                                                                         In [22]: valid_rules = defaultdict(int)                                                                              In [23]: invalid_rules = defaultdict(int)                                                                            In [24]: num_occurences = defaultdict(int)                                                                           In [25]: for sample in x: ...:     for primise in range(5): ...:         if sample[primise] == 0:continue ...:         num_occurences[primise] += 1 ...:         for conclusion in range(5): ...:             if primise == conclusion: ...:                 continue ...:             if sample[conclusion] == 1: ...:                 valid_rules[(primise,conclusion)] += 1 ...:             else: ...:                 invalid_rules[(primise,conclusion)] += 1 ...:                                                                                                             In [26]: support = valid_rules                                                                                       In [27]: confidence = defaultdict(float)                                                                             In [28]: for primise,conclusion in valid_rules.keys(): ...:     confidence[(premise,conclusion)] = valid_rules[(primise, conclusion)] / num_occurences[premise] ...:                                                                                                             In [29]: print(support)
defaultdict(<class 'int'>, {(2, 3): 25, (2, 4): 27, (3, 2): 25, (3, 4): 21, (4, 2): 27, (4, 3): 21, (0, 1): 14, (0, 3): 5, (1, 0): 14, (1, 3): 9, (3, 0): 5, (3, 1): 9, (0, 2): 4, (2, 0): 4, (1, 4): 19, (4, 1): 19, (0, 4): 17, (4, 0): 17, (1, 2): 7, (2, 1): 7})In [30]: print(confidence)
defaultdict(<class 'float'>, {(2, 3): 0.6944444444444444, (2, 4): 0.75, (3, 2): 0.6944444444444444, (3, 4): 0.5833333333333334, (4, 2): 0.75, (4, 3): 0.5833333333333334, (0, 1): 0.3888888888888889, (0, 3): 0.1388888888888889, (1, 0): 0.3888888888888889, (1, 3): 0.25, (3, 0): 0.1388888888888889, (3, 1): 0.25, (0, 2): 0.1111111111111111, (2, 0): 0.1111111111111111, (1, 4): 0.5277777777777778, (4, 1): 0.5277777777777778, (0, 4): 0.4722222222222222, (4, 0): 0.4722222222222222, (1, 2): 0.19444444444444445, (2, 1): 0.19444444444444445})

我们已经生成了所需要的支持度和置信度,这么看起来不是很方便。让我们更清楚的看一下

In [31]: features_c = ['面包','牛奶','奶酪','苹果','香蕉'] ...: for premise, conclusion in confidence: ...:     premise_name = features_c[premise] ...:     conclusion_name = features_c[conclusion] ...:     print("结果:同时购买{0}和{1}".format(premise_name, conclusion_name)) ...:     print(" - 占比: {0:.1f}%".format(confidence[(premise, conclusion)]*100)) ...:     print(" - 支持度: {0}".format(support[(premise, conclusion)])) ...:     print("") ...:
结果:同时购买奶酪和苹果- 占比: 69.4%- 支持度: 25结果:同时购买奶酪和香蕉- 占比: 75.0%- 支持度: 27结果:同时购买苹果和奶酪- 占比: 69.4%- 支持度: 25结果:同时购买苹果和香蕉- 占比: 58.3%- 支持度: 21结果:同时购买香蕉和奶酪- 占比: 75.0%- 支持度: 27结果:同时购买香蕉和苹果- 占比: 58.3%- 支持度: 21结果:同时购买面包和牛奶- 占比: 38.9%- 支持度: 14结果:同时购买面包和苹果- 占比: 13.9%- 支持度: 5结果:同时购买牛奶和面包- 占比: 38.9%- 支持度: 14结果:同时购买牛奶和苹果- 占比: 25.0%- 支持度: 9结果:同时购买苹果和面包- 占比: 13.9%- 支持度: 5结果:同时购买苹果和牛奶- 占比: 25.0%- 支持度: 9结果:同时购买面包和奶酪- 占比: 11.1%- 支持度: 4结果:同时购买奶酪和面包- 占比: 11.1%- 支持度: 4结果:同时购买牛奶和香蕉- 占比: 52.8%- 支持度: 19结果:同时购买香蕉和牛奶- 占比: 52.8%- 支持度: 19结果:同时购买面包和香蕉- 占比: 47.2%- 支持度: 17结果:同时购买香蕉和面包- 占比: 47.2%- 支持度: 17结果:同时购买牛奶和奶酪- 占比: 19.4%- 支持度: 7结果:同时购买奶酪和牛奶- 占比: 19.4%- 支持度: 7

我们再进行一下排序。

In [40]: from operator import itemgetter ...: sorted_support = sorted(support.items(),key=itemgetter(1),reverse=True) ...: for index in range(5): ...:     print("排名{0}".format(index+1)) ...:     premise,conclusion = sorted_support[index][0] ...:     print("同时购买{0}和{1}".format(features_c[premise],features_c[conclusion])) ...:     print(' - 占比:{0:.1f}%'.format(confidence[(premise,conclusion)]*100)) ...:     print(' - 支持度:{0}'.format(sorted_support[index][1])) ...:     print("") ...:
排名1
同时购买奶酪和香蕉- 占比:75.0%- 支持度:27排名2
同时购买香蕉和奶酪- 占比:75.0%- 支持度:27排名3
同时购买奶酪和苹果- 占比:69.4%- 支持度:25排名4
同时购买苹果和奶酪- 占比:69.4%- 支持度:25排名5
同时购买苹果和香蕉- 占比:58.3%- 支持度:21

这是根据支持度进行的排序。根据置信度的代码就不上了。
从结果上看‘顾客买苹果,也会买奶酪’,和‘顾客买奶酪,也会买香蕉’,这两条在置信度还是支持度上都很高,超市就可以根据这些规则调整摆放,例如在苹果促销时旁边摆上奶酪,但是香蕉和奶酪同时促销就没有他打意义,因为在买奶酪的顾客中66%都会购买香蕉,所以即使香蕉不搞促销,顾客也会购买。
上面是一个最最简单的例子,我们能获取到很多很多的信息。通过寻找各变量的关系,就能得出一些有用的结论,提高效率。

python数据挖掘(1.亲和性分析)相关推荐

  1. python数据挖掘电影评分分析_Pyhon数据分析项目——男女电影评分差异比较

    <用 Python 玩转数据>数据分析项目 一.程序功能 基于 MovieLens 100k 数据集中男性女性对电影的评分来判断男性还是女性电影 评分的差异性更大. 二.数据来源 数据集下 ...

  2. Python数据挖掘-NLTK文本分析+jieba中文文本挖掘

    一.NLTK介绍及安装 (注:更多资源及软件请W信关注"学娱汇聚门") 1.1 NLTK安装 NLTK的全称是natural language toolkit,是一套基于pytho ...

  3. python亲和性分析_数据挖掘入门系列教程(一)之亲和性分析

    数据挖掘入门系列教程(一)之亲和性分析 教程系列简介 该教程为入门教程,为博主学习数据挖掘的学习路径步骤.教程为入门教程,从最简单的开始.使用的编程语言为Python3.8.1,使用JupyterNo ...

  4. python亲和性分析法推荐电影论文_数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法...

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 201 ...

  5. python亲和度_数据挖掘——亲和性分析

    亲和性分析根据样本个体之间的相似度,确定它们关系的亲疏.应用场景: 1.向网站用户提供多样化的服务或投放定向广告. 2.为了向用户推荐电影或商品 3.根据基因寻找有亲缘关系的人 比如:统计顾客购买了商 ...

  6. Python数据挖掘(1)亲和性分析

    亲和性分析根据样本个体之间的相似度,确定他们的亲疏. 首先下载数据集affinity_dataset.txt. 数据集的内容如下: 0 0 1 1 1 1 1 0 1 0 1 0 1 1 0 0 0 ...

  7. python亲和性分析法推荐电影论文_用亲和性分析方法推荐电影

    本文是<python数据挖掘与入门实践>第四章"用亲和性分析方法推荐电影"的笔记 目的 学习Apriori算法,实现更精准的电影推荐服务,向潜在的客户推荐他们可能喜欢的 ...

  8. 【python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

    这是<Python数据挖掘课程>系列文章,也是我上课内容及书籍中的一个案例.本文主要讲述朴素贝叶斯分类算法并实现中文数据集的舆情分析案例,希望这篇文章对大家有所帮助,提供些思路.内容包括: ...

  9. 【python数据挖掘课程】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

    这是<Python数据挖掘课程>系列文章,也是我这学期上课的部分内容.本文主要讲述鸢尾花数据集的各种分析,包括可视化分析.线性回归分析.决策树分析等,通常一个数据集是可以用于多种分析的,希 ...

最新文章

  1. Swift - 多行文本输入框(UITextView)的用法
  2. Android -- 贝塞尔使圆渐变为桃心
  3. 【CSS】多行溢出显示省略号
  4. 默认访问首页 || 国际化||设置全局字符编码的默认设置
  5. 《算法竞赛入门经典》 例题5-1 大理石在哪(Where is the Marble,UVa 10474)
  6. LeetCode Pancake Sorting
  7. 汇编语言中常见的标志位: CF, PF, AF, ZF, SF,TF,IF,DF, OF
  8. 在java中图片随机播放_java-以相同顺序随机播放多个文件
  9. N皇后问题的解(洛谷P1219题题解,Java语言描述)
  10. mysql之批量删除
  11. JS地图经纬度正则表达式校验
  12. 面试相关-转载-well,yzl——持续更新
  13. ubuntu18 安装caj阅读器 wine
  14. 多张表格链接一起——《超级处理器》应用
  15. python为啥爬取数据会有重复_使用python爬取B站千万级数据
  16. 多重for循环优化,提升运行效率
  17. Qt优秀开源项目之十:开源截图工具flameshot
  18. python练习题-运算符和变量练习作业题
  19. 【雕虫小技第1篇】如何将Scratch项目(转换)打包为一个HTML文件
  20. htc 8x android,htc8x怎么样 htc8x测评【图解】

热门文章

  1. Python几种常用的数据导入方法
  2. QT生成动态链接库及调用详细步骤
  3. 【Java基础[数组及对象数组取子数组]】
  4. 无执照开通微信商家收款码0.38%费率——步骤详细图解。
  5. java幻灯片效果_在PowerPoint 中,幻灯片切换效果是指(  )。
  6. 计算机科学与技术以为舟,于哲舟-吉林大学计算机科学与技术学院
  7. Flutter高仿微信-第36篇-单聊-语音通话
  8. Mac系统下加速百度云下载(附软件)
  9. fifa11键盘按键_FIFA 20 Player集群
  10. 阿里云李津:公有云做的是信心与责任!