一、问题

设有一份购物篮数据basketdata.txt,包括两部分内容。

第一部分是1000名顾客的个人信息,含7个变量:会员卡号(cardid)、消费金额(value)、支付方式(pmethod)、性别(sex,M表示男性,F表示女性)、是否户主(homeown)、年龄(age)及收入(income)。

第二部分是1000名顾客一次购买的商品信息,变量均为二分类变量,取值1表示购买,取值0表示未购买。这些变量包括水果蔬菜(fruitveg)、鲜肉(freshmeat)、奶制品(dairy)、蔬菜罐头(cannedveg)、肉罐头(cannedmeat)、冷冻食品(frozenmeal)、啤酒(beer)、葡萄酒(wine)、软饮料(softdrink)、鱼(fish)及果糖(confectionery)等。基于该数据集,利用关联规则分析算法完成以下任务:

(1)找到有较大可能连带销售的商品。

(2)对比不同性别和年龄段顾客的啤酒选择性倾向。(这里将年龄分为三组,30岁以下为年轻组“1”,30~49岁为中年组“2”,50岁以上为中老年组“3”)。

二、代码

'''
我是第二题
我是第二题
'''
##################2
import pandas as pd
import numpy as np# 打开txt文件
f = open("basketdata1.txt","r",encoding='utf-8')   #设置文件对象
# 转换为二维表格式
ff= []
line = []
for line in f.readlines():#readlines以列表输出文件内容line = line.strip().split("\t")line1 = " ".join(line)line1 = line1.split(",")# result.append(line)ff.append(line1)
f.close()   #将文件关闭
f1=pd.DataFrame(ff).dropna(axis=0)
# 添加列名
f1.columns= ['cardid','value','pmethod','sex','homeown','income','age','fruitveg','freshmeat','dairy','cannedveg','cannedmeat','frozenmeal','beer','wine','softdrink','fish','confectionery']
# f1.columns= ['cardid','value','pmethod','sex','homeown','income','age',1,2,3,4,5,6,7,8,9,10,11]# print(f1.head())
# TF转换为商品信息
def val2colindex(val,colname):if(val=='T'):return colnameelse:return 0
for i in f1.columns[7:]:f1[i]=f1[i].apply(lambda val:val2colindex(val,i))
# print(f1.head())

(1)找到有较大可能连带销售的商品。

###############(1)
# 数据
def loadDataSet():#函数,基础知识# mm = np.array(f1[lambda f1: f1.columns[7:]]).tolist()mm = f1[lambda f1: f1.columns[7:]]data2Dlist = []for index,row in mm.iterrows():list1=row.tolist()# list1.pop(0)while 0 in list1:list1.remove(0)if list1!=[]:data2Dlist.append(list1)else:continuereturn data2Dlist
D=loadDataSet()
# print(D)def createC1(dataSet):C=[]for transaction in dataSet:for item in transaction:if [item] not in C:C.append([item])C.sort()
#调用frozenset函数将单项集列表冻结,返回冻结单项集列表return list(map(frozenset,C))def scanD(D,Ck,minSupport):ssCnt={}
#对于每一个候选项集can,检查是否是D的一部分,即该候选can是否得到transcaction的支持for tid in D:for can in Ck:if can.issubset(tid):ssCnt[can]=ssCnt.get(can,0)+1numItems=float(len(D))retList=[]supportData={}for key in ssCnt:
#每个项集的支持度support=ssCnt[key]/numItems
#将满足最小支持度的项集,加入retList中if support>=minSupport:retList.insert(0,key)
#汇总支持度数据supportData[key]=supportreturn retList,supportData#拼接函数,输入为Ck-1、K参数,表示生成k-项集
def aprioriGen(Ck,k):retList=[]lenCk=len(Ck)
#以下的Ck[i]与Ck[j]均包含k-1个项,如果它们的前k-2项相同
#则通过或运算将其拼接为一个包含k项的列表元素,加入到retList中for i in range(lenCk):for j in range(i+1,lenCk):L1=list(Ck[i])[:k-2]L2=list(Ck[j])[:k-2]L1.sort()L2.sort()if L1 == L2:retList.append(Ck[i]|Ck[j])return retList#生成所有的频繁项集L1,及所有项集的支持度
#输入为交易记录D,及最小支持度参数minSupport
def apriori(D,minSupport):C1=createC1(D)L1,suppData=scanD(D,C1,minSupport)L=[L1]
#最初的L1中的每个项集含有一个元素
#新生成的项集应该含有2个元素,所以k=2k=2while(len(L[k-2])>0):Ck=aprioriGen(L[k-2],k)Lk,supK=scanD(D,Ck,minSupport)
#将新的项集的支持度数据加入原来的总支持度字典中suppData.update(supK)
#将符合最小支持度要求的项集加入LL.append(Lk)
#新生成的项集中的元素个数应不断增加k+=1
#返回所有满足条件的频繁项集的列表和所有候选项集的支持度信息return L,suppData# L1,suD2=apriori(D,0.315)
# # print(L1)
# print(suD2)
# 删除
# print("据suD2可知:('frozenmeal', 'cannedveg'),(frozenmeal', 'fruitveg'),('cannedveg', 'fruitveg')在支持度为0.313时,具有较大可能连带销售。")
L1,suD2=apriori(D,0.1)
def calcConf(freqSet,H,supportData,brl,minConf=0.6):prunedH=[]for conseq in H:conf=supportData[freqSet]/supportData[freqSet-conseq]if conf >= minConf:print(freqSet-conseq,'-->',conseq,'conf:',conf)brl.append((freqSet - conseq,conseq,conf))prunedH.append(conseq)return prunedHdef rulesFromConseq(freqSet,H,supportData,brl,minConf=0.6):m=len(H[0])
#检查频繁项集是否大到移除大小为m的子集if len(freqSet)>m+1:Hmp1=aprioriGen(H,m+1)Hmp1=calcConf(freqSet,Hmp1,supportData,brl,minConf)
#如果不止一条规则满足要求,进一步递归合并if len(Hmp1)>1:rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)def generateRules(L,supportData,minConf=0.6):bigRuleList=[]for i in range(1,len(L)):for freqSet in L[i]:
#对于每一个频繁项集的集合freqSetH1=[frozenset([item]) for item in freqSet]
#如果频繁项集中的元素个数大于2,需要进一步合并if i>1:rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)else:calcConf(freqSet,H1,supportData,bigRuleList,minConf)# return bigRuleList
bRlist=generateRules(L1,suD2,0.5)
print('相关度大于50%的物品及置信度:')
print(bRlist)
print("相关度大于50%的物品及置信度:{'wine','confectionery'},{'confectionery','wine'},{'cannedveg','beer'},{'beer','cannedveg'},{'frozenmeal','beer'},{'cannedveg','frozenmeal'},{'frozenmeal','cannedveg'}")

(2)对比不同性别和年龄段顾客的啤酒选择性倾向。(这里将年龄分为三组,30岁以下为年轻组“1”,30~49岁为中年组“2”,50岁以上为中老年组“3”)。

#############################(2)
# 年龄段分组
for i in range(len(f1)):if int(f1['age'][i]) < 30:f1['age'][i] = 1elif int(f1['age'][i]) <=49:f1['age'][i] = 2else:f1['age'][i] = 3
# 分组
aaaa = f1.groupby(['sex','age'])['beer'].agg('count')
bbbb = pd.DataFrame(aaaa)
print(bbbb)
print('由数据可以看出,无论男女,年龄位于1、2两组,及50岁以下的顾客较倾向购买啤酒,而50岁以上的顾客很少购买。')

Python金融数据挖掘 第八章 复习思考题2相关推荐

  1. Python金融数据挖掘 第八章 复习思考题1

    一.问题 医院礼品店已完成5项交易,购买记录清单如表8-3所示,请使用Apriori算法进关联规则分析. (1)使用数字代替商品完成第3列: (2)计算购买"鲜花"的支持度: (3 ...

  2. Python金融数据挖掘 第八章 第1节 Apriori算法原理(2)

    一.目标 1.了解关联规则算法的研究对象.意义和应用场景 2.掌握支持度与置信度的概念及计算方法 3.掌握关联规则算法的项目空间集裁剪方法 4.掌握Apriori算法的原理和实现方法 二.关联规则 1 ...

  3. 大学学python在金融中的应用_《Python金融数据挖掘及其应用》教学大纲

    < python 金融数据挖掘及其应用> 课程教学 大纲 课程代码: 学 分: 5 学 时: 80 (其中:讲课学时: 60 实践或实验学时: 20 ) 先修课程:数学分析.高等代数.概率 ...

  4. Python金融数据挖掘 第7章 复习思考题 3

    3.有'手机垃圾短信'数据集,将其放在文件中:sms_spam.csv,该文件共有5537行,2列,分别是类型(type,ham为非垃圾短信,spam为垃圾短信)和内容(text,短信的具体内容). ...

  5. Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。

    1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...

  6. Python金融数据挖掘 第7章 第3节 (7) 案例:基于股评文本的情绪分析

    1.特征词 表示一篇文本,矩阵数据,聚类.分类.预测 2.情绪.情感分析 情感值.舆论文本.文本数据,来源管,新闻.情感倾向:存在误差,不准确 3.基于股评文本的情绪分析 #网络舆情,判断指数走向 3 ...

  7. Python金融数据挖掘 第7章 第2节 (5)高频词

    1.长度 文本长度:按照字数.标点符号.中英文 分词长度:词数,列表:list 预处理--统计词频.词,矩阵数据--深入分析,二维表,记录(文本).字段(词) 2.引入库 import jieba i ...

  8. Python金融数据挖掘

    一.随便说说? 使用底层code构建(包.模块--模板). 实验是干啥的呀?我也不知道,yinweimeiyoutingke. def 层层封装: 1.欧式距离计算(手工计算.) 2.数学语言到机器语 ...

  9. 基于北京市各区二手房的数据分析(金融数据挖掘Python)

    目录 1 研究背景与研究意义...................................................................................... ...

最新文章

  1. OpenCV图像序列生成视频,MATLAB图像生成avi视频,image2video。
  2. 成功解决基于VS2015(Visual Studio2015)编写C++程序调试时弹出窗口一闪而过的问题
  3. 来自高维的对抗 - 逆向TinyTool自制
  4. JAVA中的那些名词解释
  5. STM32F407ZGT6 fatfs出现挂载成功,但是文件读写失败的原因
  6. 算法——贪心算法解0-1背包问题
  7. Python算法教程第一章知识点:利用插入元素的例子详解list之本质
  8. 组成原理---补码加减法,原码一两位乘法,补码一两位乘法,754标准
  9. Python bcrypt 加密验证密码
  10. pr中的字幕、关键帧动画以及声音的处理
  11. Presto日期函数
  12. Pycharm一键选中多个东西(数据、函数等)进行修改、删除、替换等
  13. ionic ActionSheet(上拉菜单)
  14. 【PC工具】可能是最好用最方便的内部网络设备查看工具,内网ip查询ip扫描工具...
  15. (Mimics、ANSYS)医学三维重建
  16. matlab矩阵程序,matlab矩阵基本操作
  17. 阿里云、腾讯云国际站购买、下单流程
  18. 【狮子数学】chapter2-02-中值定理
  19. vue3 (三) 小案例 简易小书架
  20. 盘点有哪些国家自主研发自己的操作系统

热门文章

  1. 类型多样的线性图标素材,速来收藏
  2. 当当网---你怎么了?
  3. 国庆出行小心:28道靠菜名宰人的经典名菜
  4. 走!去接淘系的新郎新娘们回娘家了!| 510阿里日
  5. 移动端input弹出带有搜索按钮的键盘与获取点击搜索按钮触发的事件
  6. 测牛学堂:高级软甲测试工程师基础夯实之linux系统权限命令学习总结
  7. 解决POST提交中文乱码问题
  8. CSS之优先级(6大类)、权重(4等级)、从高到低优先顺序
  9. 【电气专业知识问答】问:蓄电池有哪些主要技术特性?
  10. exdark数据集论文阅读笔记