Apriori算法在购物篮分析中的运用
购物篮分析是一个很经典的数据挖掘案例,运用到了Apriori算法。下面从网上下载的一超市某月份的数据库,利用Apriori算法进行管理分析。例子使用Python+MongoDB
处理过程1 数据建模(将Excel中的数据写入到MongoDB数据库), 2 从数据库中读取数据进行分析。
Excel文件http://download.csdn.net/detail/artscrafts/6805689
案例配置文件 setting.py
data_source = 'supermarket.xls'
host = 'localhost'
port = 27017
db_name = 'shopping_basket'
items_name = 'goods_items'
record_name = 'transaction_record'
读取Excel数据到MongoDB中 load_basket.py
from xlrd import open_workbook
from pymongo import MongoClient
import setting wb = open_workbook(setting.data_source, encoding_override='utf-8')
client = MongoClient(setting.host, setting.port)
db = client[setting.db_name]
items = [] #read xls
def read_one_line(workbook, sheet_index=0, row_index=0, start_col_index=0):
sheet = workbook.sheets()[0]
max_row = sheet.nrows
max_col = sheet.ncols
start_col_index = (start_col_index if (start_col_index > 0 and start_col_index <= max_col) else max_col)
if row_index < 0 or row_index >= max_row:
raise IndexError()
for col_index in xrange(start_col_index, max_col):
yield sheet.cell(row_index, col_index).value #read xls
def readlines(workbook, sheet_index=0, start_row_index=0, end_row_index=None, start_col_index=0, end_col_index=None):
sheet = workbook.sheets()[sheet_index]
max_row = sheet.nrows
max_col = sheet.ncols
end_row_index = (end_row_index if end_row_index else max_row)
end_col_index = (end_col_index if end_col_index else max_col)
for row_index in xrange(start_row_index, end_row_index):
yield [sheet.cell(row_index, col_index).value for col_index in xrange(start_col_index, end_col_index)] #from xls to mongodb
def load_items():
collection = db[setting.items_name]
items_line = read_one_line(wb, row_index=1, start_col_index=1)
id = 1
tmp = []
for item in items_line:
if id % 100 == 0:
collection.insert(tmp)
tmp = []
tmp.append({'id':id, 'name':item})
items.append(item)
id += 1 # from xls to mongodb
def load_record():
collection = db[setting.record_name]
lines = readlines(wb,start_row_index=2, start_col_index = 1)
tmp = []
id = 1
for line in lines:
if id % 100 == 0:
collection.insert(tmp)
tmp = []
tmp.append({'id':id, 'items':[items[i] for i in xrange(len(line)) if line[i] == 'T']})
id += 1 def main():
print '........start loading........'
load_items()
load_record()
client.close()
print '.........end loading.........' if __name__ == '__main__':
main()
进行数据分析 analysis_basket.py
#Apriori
from pymongo import MongoClient
import setting client = MongoClient(setting.host, setting.port)
db = client[setting.db_name]
data = [] #from mongodb to items
def filldata():
collection = db[setting.record_name]
cur = collection.find()
for row in cur:
data.append(row['items']) def connect(items):
result = {}
keys = items.keys()
length = len(keys)
for i in range(length):
prev = keys[i][:len(keys[i]) - 1]
for j in range(i + 1, length):
tmp = keys[j][:len(keys[j]) - 1]
if prev == tmp:
key = keys[i] + (keys[j][len(keys[i]) - 1],)
result[key] = getsupp(key)
else:
break
return result def pruning(items, minsupp):
result = {}
for key in items.keys():
if items[key] >= minsupp:
result[key] = items[key]
return result def contain(par, sub):
for v in sub:
if not v in par:
return False
return True def getsupp(item):
supp = 0
for row in data:
if contain(row, item):
supp+=1
return supp def apriori(data, minsupp, k):
candidate_set = {}
for row in data:
for i in row:
key = (i,)
candidate_set[key] = candidate_set.get(key, 0) + 1
frequently_set = pruning(candidate_set, minsupp)
result = {}
result['k=1'] = frequently_set
for n in range(2, k):
candidate_set = connect(frequently_set)
frequently_set = pruning(candidate_set, minsupp)
if len(frequently_set) <= 1:
return result
result['K=' + str(n)] = frequently_set
return result def main():
filldata()
client.close()
res = apriori(data, 30, 8) if __name__ == '__main__':
main()
Apriori算法在购物篮分析中的运用的更多相关文章
- 数据挖掘算法之-关联规则挖掘(Association Rule)(购物篮分析)
在各种数据挖掘算法中,关联规则挖掘算是比較重要的一种,尤其是受购物篮分析的影响,关联规则被应用到非常多实际业务中,本文对关联规则挖掘做一个小的总结. 首先,和聚类算法一样,关联规则挖掘属于无监督学习方 ...
- 数据算法 --hadoop/spark数据处理技巧 --(5.移动平均 6. 数据挖掘之购物篮分析MBA)
五.移动平均 多个连续周期的时间序列数据平均值(按相同时间间隔得到的观察值,如每小时一次或每天一次)称为移动平均.之所以称之为移动,是因为随着新的时间序列数据的到来,要不断重新计算这个平均值,由于会删 ...
- R语言和数据分析十大:购物篮分析
提到数据挖掘,我们的第一个反应是之前的啤酒和尿布的故事听说过,这个故事是一个典型的数据挖掘关联规则.篮分析的传统线性回归之间的主要差别的差别,对于离散数据的相关性分析: 常见的关联规则: 关联规则:牛 ...
- 108_Power Pivot购物篮分析分组GENERATE之笛卡尔积、排列、组合
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 昨天在看论坛帖子时候(帖子),看到一个关于SKU组合的问题,有很多M大佬都给出了处理方案,于是想用dax也写一个 ...
- 关联规则之Aprior算法(购物篮分析)
0.支持度与置信度 <mahout实战>与<机器学习实战>一起该买的记录数占所有商品记录总数的比例——支持度(整体) 买了<mahout实战>与<机器学习实战 ...
- Apriori算法第二篇----详细分析和代码实现
1 Apriori介绍 Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然 ...
- 016 Spark中关于购物篮的设计,以及优化(两个点)
一:介绍 1.购物篮的定义 2.适用场景 3.相关概念 4.步骤 5.编程实现 6.步骤 二:程序 1.程序 package com.ibeifeng.senior.mba.association i ...
- Apriori算法第一篇
摘要: Apriori算法是产生k项高频项目组的一般手段.算法概要:首先产生k项高频项目集合Lk,自身链接形成k+1项的项目结合C(k+1),然后剪枝(去掉以前去掉的不满足支持度的高频),生成K=1项 ...
- Apriori算法的C++实现
Apriori是经典的购物篮分析算法.该算法用SQL实现难度较大,所以考虑用C++实现. 花了两天,代码例如以下.原创转载请注明出处 //Apriori.c #include<iostream& ...
随机推荐
- SPOJ 1043 1043. Can you answer these queries I
思路:用TREE记录节点的最大连续和,LEF记录左边开始的最大连续和,RIG记右边开始的最大连续和 然后处理的时候就是比较左边最大,右边最大 中间区间的问题 其中这个query 只能膜拜了... 大 ...
- C# richTextBox编辑器
附件:http://files.cnblogs.com/xe2011/CSHARP_RichTextBoxEditor.rar 完整的转到这里 http://www.cnblogs.com/xe201 ...
- MYSQL 专家 ----zhaiwx_yinfeng
http://mysqllover.com/?p=708 https://yq.aliyun.com/articles/54454 http://blog.csdn.net/zhaiwx1987/ar ...
- http协议通信原理的问答
1.dns怎么解析?答:假设一个网站www.tianyik.com的ip是192.168.31.36 浏览器(URL:www.tianyik.com)--> 客户机 h ...
- 第三篇:web之前端之JavaScript基础
前端之JavaScript基础 前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript ...
- node express
在某QQ群里,发现大家都在搞node,为了不被out,这周主要研究了一下,还挺高大上. 参考了下资料,适合初学者学习. Node和NPM的安装够便捷了,不细说...有几点基础顺手提一下: 安装命令中的 ...
- 两种隐藏元素方式【display: none】和【visibility: hidden】的区别
此随笔的灵感来源于上周的一个面试,在谈到隐藏元素的时候,面试官突然问我[display: none]和[visibility: hidden]的区别,我当时一愣,这俩有区别吗,好像有,但是忘记了啊,因 ...
- html学习的一些问题
1,什么是 W3C标准?w3c 标准不是一个标准,而是一系列标准,包括:结构标准,表现标准,动作标准. 2,内链元素和块状元素的区别内链元素允许与其他内链元素位于同一行,没有宽和高,如果想设置宽和搞, ...
- SQL SERVER将某一列字段中的某个值替换为其他的值 分类: MSSQL 2014-11-05 13:11 67人阅读 评论(0) 收藏
SQL SERVER将某一列字段中的某个值替换为其他的值 UPDATE 表名 SET 列名 = REPLACE(列名 ,'贷','袋') SQL SERVER"函数 replace 的参数 ...
- 在Android上模拟登录广工正方教务系统查询成绩
这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...