摘 要:
本文通过搜集银行营销的相关数据,使用C5.0算法进行数据挖掘,根据相关指标预测客户是否会订购定期存款。首先用箱线图来确定连续型属性的离群点并删除,删除意义不明的因子型属性的记录,使用分层抽样的方式选取测试集和训练集,然后代入C5.0算法建立模型,初次建模训练集的正确率为95.3%,在测试据的正确率为92.05%,生成的决策树大小为15。对pdays和duration属性进行同统一划归后,再次建模,训练集的正确率降为93.5%,而在在测试集的正确率提高到92.45%,而且生成了一棵只有5条规则的决策树,简单明了,改进模型后过度拟合得到了有效的解决。最能影响客户是否会订购定期存款的属性是poutcome、age和duration,银行人员可以根据这些属性对客户进行更有针对性、更有效的营销。
关键词:银行营销 C5.0算法 箱线图 过度拟合

The thesis title
Abstract:
This paper collects relevant data from bank marketing, uses C5.0 algorithm to perform data mining, and predicts whether customers will order fixed deposits based on related indicators. First, use the box plot to determine the outliers of the continuous attribute and delete it, delete the record of the factor attribute whose meaning is not clear, use the stratified sampling method to select the test set and the training set, and then substitute the C5.0 algorithm to establish the model. The accuracy rate of the modeling training set is 95.3%, the correct rate for the test data is 92.05%, and the generated decision tree size is 15. After the pdays and duration attributes were unified and reclassified, the accuracy of the training set was reduced to 93.5%, while the accuracy rate in the test set was increased to 92.45%, and a decision with only 3 rules was generated. The tree is simple and clear, and the overfitting of the improved model has been effectively solved. The attributes that most affect the customer’s ability to order fixed deposits are poutcome, age, and duration. Bankers can use these attributes to make more targeted and effective marketing for their customers.
Key words: Bank Marketing C5.0 Algorithm Boxplot Overfitting
目 录
1 数据挖掘目标 1
2 数据理解 2
3 数据预处理 3
4 模型的建立 4
5 模型评估及改进 5
6 结论 6
7 系统收获 7
8 参考文献 8
附录 9

1 数据挖掘目标
本次建模目标是利用葡萄牙银行机构直接营销的海量真实数据,采用数据挖掘技术,分析各类属性预测客户是(yes)否(no)会购买定期存款(y),决策属性有客户自身的信息,由于银行的直接营销活动的是以电话为基础的,所以银行机构的客服人员 至少需要联系一次客户来得知客户是否将认购银行的定期存款,所有决策属性中还有客服人员与客户联系的信息以及其他属性。通过这些属性完成分类的预测任务,来帮助银行更有效、更精准的直接营销。
2 数据理解
2.1读入数据
从UCI Machine Learning Repository: Data Sets(网址:http://archive.ics.uci.edu/ml/datasets.html)下载了bankmarketing共4521条数据,17个属性。
这是一个只有一列但包含17个属性的CSV格式的数据,使用read.csv()函数读入数据,以分号分隔。
2.2属性说明
表2-1属性说明
序号 属性 说明
1 Age 年龄(数字)
2 Job 工作(工作类型)
3 marital 婚姻状况(绝对:“已婚”,“离婚”,“单身”;注:“离婚”是指离婚或丧偶)
4 education 教育水平(分类:“未知”,“中学”,“小学”,“大专”)
5 default 默认是否有信用(二进制:“是”,“否”)
6 balance 平均每年余额(欧元)(数字)
7 housing 是否有住房贷款(二进制:“是”,“否”)
8 loan 是否有个人贷款(二进制:“是”,“否”)
9 contact 联系人通信类型(分类:“未知”,“电话”,“手机”)
10 day 每个月的最后一个联系日(数字)
11 month 每年的最后一个联系月份
12 duration 上次联系持续时间,以秒为单位(数字)
13 campaign 在此广告系列和此客户中执行的联系数量(数字,包含最后一次联系)
14 pdays 客户最近一次与之前活动联系后经过的天数(数字,-1表示之前未联系过客户)
15 previous 此广告系列和此客户端之前执行的联系数量(数字)
16 poutcome 以前的营销活动的结果(分类:“未知”,“其他”,“失败”,“成功”)
17 y 客户是否订购了定期存款(二进制:“是”,“否”)

3 数据预处理
3.1处理缺失值
一共17个属性,4521条数据。使用is.na(数据名) 查看数据中的缺失值,由于数据量庞大不方便,所以使用sum(is.na(数据名))统计缺失值的个数,结果为0.说明此数据中没有缺失值
3.2筛选数据
选取前16个属性作为分类属性,第17个属性为预测属性。对每一个分类属性的规范性以及合理性进行检查,并筛选出符合条件的记录。
3.2.1筛选连续型变量
对于连续性变量绘制箱线图,找出离群点并做删除。
在16个属性中,连续性变量有age,balance,day,duration,campaign,pdays,previous,对每个属性绘制箱线图查看离群点的分布。使用summary(数据名$列名)函数可以获取描述性统计量,可以提供数值型变量的最小值、最大值、四分位数、中位数和的值。
结合公式:
Min=下四分位数-1.5IQR (1)
Max=上四分位数+1.5
IQR (2)
其中:IQR表示四分位距,即上四分位数与下四分位数的差值。
检查以下属性是否存在离群点:
1) Age 年龄,删除年纪大于73的记录,如图3-1:

图3-1
2) Balance平均每年余额(欧元),删除月大于3509.75和小于-200.25的记录

图3-2
3) day每个月的最后一个联系日,没有离群点不做删除。

图3-3
4) duration上次联系持续时间,以秒为单位,删除上次联系时间大于552秒的记录。

图3-4
5) campaign在此广告系列和此客户中执行的联系数量(数字,包含最后一次联系),删除联系数量大于5的记录。
6) pdays客户最近一次与之前活动联系后经过的天数,pdays属性中有2500条左右值为-1,剩余越500条是不为-1,处于1~871之间的一些值。这列数据的中位数,上四分位数,下四分位数均为-1,如果删除离群点,这个属性全为相同的值,就没有意义了。

图3-5
7) previous此广告系列和此客户端之前执行的联系数量,previou属性中有2500条左右值为0,剩余约500条是不为0,处于1~24之间的值,此列属性的上四分位数,下四分位数和中位数都是0,所以也不做删除。

图3-6
3.2.2筛选因子型变量
对于因子型的变量,存在一些值为unknown的因子,使用summary(数据名$列名)可以对因子型变量进行频数统计,对于数量较少的做删除,数量庞大删除可能会影响分类结果的保留。
因子型的变量中存在值为“unknown”的有以下属性:
1)job工作类型,unknown值较少,进行删除。
2 ) education教育水平,unknown值较少,进行删除。
3) contact联系人通信类型,unknown值有1000多条,为了避免影响结果,所以不做删除。
4) poutcome以前的营销活动的结果,unknown值有2500多条,为了避免影响结果,所以不做删除。
不存在“unknown”值得因子变量有以下属性:
1)marital婚姻状况,三个取值,无异常值。
2)default ,二元变量,无异常值
3)housing是否有住房贷款,二元变量,无异常值
4)loan是否有个人贷款,二元变量,无异常值
5)month每年的最后一个联系月份,十二个月份,无异常值。
4 模型的建立
使用决策树算法中的C5.0算法,把前十六个属性作为输入变量,来预测客户是否订购定期存款。
在Rstdio中建立模型的过程:
第一:安装并加载C50和caret包。
第二:使用creatDataParition()函数分层抽样,抽取75%作为训练集和25%测试集。
第三:使用C5.0算法建立模型。
第四:分析生成的决策树的规则和错误率。
第五:对测试集进行预测,计算混淆矩阵。
5 模型评估及改进
5.1在训练集上的预测结果
表5-1决策树的性质
大小 错误率
15 4.7%(107)

测试集共2270条记录 ,有107条数据预测错误,错误率为4.7%
表5-2
预测值
实际值 Yes No
Yes 89 87
No 20 2074

决策属性的利用率:
表5-3
poutcome 100.00% contact 35.55%
duration 98.55% day 21.23%
month 97.49% marital 3.35%
pdays 94.14% previous 1.10%

5.2在训练集的预测结果
测试集中一共有755条记录,有60条数据预测错误,错误率为7.95%
表5-4
预测值
实际值 No Yes
No 680 17
Yes 43 15
5.3算法的改进
在数据与处理的时候,有两个属性
1)pdays客户最近一次与之前活动联系后经过的天数,有2500条左右值为-1,剩余约500条是不为-1,没有删除那500条离群点。-1为之前未联系过客户,现在记不等于-1的离群点为1,意味联系过客户。
2) previous此广告系列和此客户端之前执行的联系数量,有2500条左右值为0,剩余约500条是不为0,也没有删除那500条离群点。0为此前没有联系过,记其他值为1,意为联系过。
再次使用C5.0算法进行数据挖掘

表5-5决策树的性质
大小 错误率
5 148(6.5%)

表5-6训练集评估
预测值
实际值 Yes No
Yes 36 140
No 8 2086

表5-7属性用法
属性 百分比
poutcome 100.00%
age 97.53%
duration 3.70%

测试集中一共有755条记录,有57条数据预测错误,错误率为7.55%
表5-8测试集评估
预测值
实际值 No Yes
No 689 8
Yes 49 9
上次联系持续时间,以秒为单位(数字)
以前的营销活动的结果(分类:“未知”,“其他”,“失败”,“成功”)

提取IF-THEN规则
1)如果以前营销活动的结果是成功,而且上次连续时间<=254,那么客户不会订购定期存款
2)如果以前营销活动的结果是成功,而且上次连续时间>254,那么客户会订购定期存款
3)如果以前营销活动的结果是失败,其他或者未知,而且年龄<=60,那么客户不会订购产品
4)如果以前营销活动的结果是失败,其他或者未知,而且年>60,而且上次连续时间<=182,那么客户不会订购产品
5) 如果以前营销活动的结果是失败,其他或者未知,而且年>60,而且上次连续时间>182,那么客户会订购产品.
6 结论
通过使用C5.0算法对 BankMarking数据预处理后,生成了一棵有15条规则的决策树,训练集的正确率为95.3%,在测试据的正确率为92.05%,正确率比较可观,但生成的决策树比较大,IF-THEN规则划分太细致高达15条,可能存在过度拟合。于是改进算法,在属性padys 和previous中存在许多不规范、没有规律、离散的数值,统一划归后,代入C5.0算法中,训练集的正确率降为93.5%,而在在测试集的正确率提高到92.45%,而且生成了一棵只有5条规则的决策树,比原来的简单明了。主要影响客户是否购买定期存款的因素是poutcome 、age 和duration。银行从业人员应该多加关注,可以营销更多的定期存款。
7 系统收获
通过本次课程设计,系统地学习了使用R语言进行数据分析和数据挖掘的步骤和方法,从收集数据、处理数据、建立模型、分析结果到评价及改进,每一个步骤都会遇到不同问题,提高了自学的能力以及查阅资料的能力。尤其是互联网上一些经验帖和博客里的文章,对我的帮助很大,可以根据一些案例来学习不懂的知识。通过数据来分析出有价值的信息,能够做到学以致用,我受益匪浅。当遇到不懂的问题,主动查找资料一步步解决的很有成就感,在今后的学习中,我会多注意理论结合实践。
8 参考文献
[1]Robert I. Kabacoff[美].王小宁.黄俊文等译.R语言实战[M].人民邮电出版社.第二版.2016年5月第2版
[2] 李璐.基于R语言的确是值填补方法[J].统计与决策.2012
[3]马建强.刘二钢.R语言在统计分析中的使用技巧[J].电脑知识与技术.2017
[4]张海阳.齐俊.传毛健.基于R语言的数据挖掘算法研究.[J]电脑知识与技术.2016
[5]方匡男.基于数据挖掘的分类和聚类算法的研究及R语言实现[D]2007
附录 :
getwd()#查看当前工作路径
setwd(“C:/Users/fan/Desktop/R”)#设置工作路径
bank2=read.csv(“bank.csv”,sep=";")#读取分隔前的一列
write.csv(bank2,“bank2.csv”,row.names = FALSE)#把bank2存为分开列的CSV文件,行号不要
bank2=read.csv(“bank2.csv”)
is.na(bank2)#缺失值
sum(is.na(bank2))#查看缺失值的个数,结果为0,没有缺失值
names(bank2)#查看列名
mode(bank2)#查看数据类型
sapply(bank2,class)#查每列数据的数据类型
summary(bank2)#数据的基本描述
#处理第一个属性(删除离群点)
boxplot(bank2KaTeX parse error: Expected 'EOF', got '#' at position 34: …lot",ylab="年龄")#̲年龄的箱线图 age<-wit…age)
49+1.5*(49-33)#年龄的上界
33-1.5*(49-33)#年龄的下界
a<-bank2[which(bank2KaTeX parse error: Expected 'EOF', got '#' at position 11: age<=73),]#̲删除年龄异常值 #处理第二个属…job)
b<-a[which(aKaTeX parse error: Expected 'EOF', got '#' at position 19: …!='unknown'),] #̲第三个属性(三个,无异常) s…marital)
#处理第四个属性(删除unknown)
summary(beducation)c&lt;−b[which(beducation) c&lt;-b[which(beducation)c<−b[which(beducation!=‘unknown’),]
#第五个属性(二元无异常)
summary(cKaTeX parse error: Expected 'EOF', got '#' at position 10: default) #̲第六个属性(删除离群点) bo…balance,main=“balance-boxplot”,ylab=“平均每年余额”)
66-1.5*(1443.5-66)
1443.5+1.5*(1443.5-66)
d<-c[which(cbalance&lt;=3509.75),]d&lt;−d[which(dbalance&lt;=3509.75),] d&lt;-d[which(dbalance<=3509.75),]d<−d[which(dbalance>=-2000.25),]
#处理第七个属性(二元无异常无异常)
summary(dKaTeX parse error: Expected 'EOF', got '#' at position 10: housing) #̲处理第八个属性(二元无异常) …loan)
#处理第九个属性(unknown很多1116)
summary(dKaTeX parse error: Expected 'EOF', got '#' at position 46: …able(contact)) #̲处理第十个属性(无离群点) s…day)
boxplot(dKaTeX parse error: Expected 'EOF', got '#' at position 62: …1-8) 21+(21-8) #̲处理第十一个属性(因子) su…month)
#处理第十二个属性
summary(dduration)boxplot(dduration) boxplot(dduration)boxplot(dduration,main=“duration-boxplot”,ylab=“上次联系持续时间”)
table(dduration)104−(328−104)328+(328−104)e&lt;−d[which(dduration) 104-(328-104) 328+(328-104) e&lt;-d[which(dduration)104−(328−104)328+(328−104)e<−d[which(dduration<=552),]
#处理第十三个属性
summary(ecampaign)boxplot(ecampaign) boxplot(ecampaign)boxplot(ecompaign,main=“campaign-boxplot”,ylab=“在此广告系列和此客户中执行的联系数量”)
table(eKaTeX parse error: Expected 'EOF', got '#' at position 10: campaign)#̲排序 1-(3-1) 3+(3…campaign<=5),]
#处理第十四个属性
summary(fpdays)table(fpdays) table(fpdays)table(fpdays)#排序
boxplot(fKaTeX parse error: Expected 'EOF', got '#' at position 56: …之前活动联系后经过的天数") #̲处理第十五个属性 summar…previous)

Min. 1st Qu. Median Mean 3rd Qu. Max.

0.0000 0.0000 0.0000 0.5456 0.0000 24.0000

table(fKaTeX parse error: Expected 'EOF', got '#' at position 10: previous)#̲排序 boxplot(fprevious,main=“previous-boxplot”,ylab=“此广告系列和此客户端之前执行的联系数量”)
#处理第十六个属性
summary(fKaTeX parse error: Expected 'EOF', got '#' at position 45: …ble(poutcome)) #̲预测属性 table(fy)
#C5.0算法
install.packages(“C50”)
library(C50)
#分层抽样
install.packages(“caret”)
library(caret)
library(lattice)
library(ggplot2)
index<-createDataPartition(fKaTeX parse error: Expected 'EOF', got '#' at position 46: …rain<-f[index,]#̲训练集 test<-f[-in…y)
summary(trainy)summary(testy) summary(testy)summary(testy)
mod <- C5.0(train$y ~ .,data=train)
mod
summary(mod)

利用predict()函数对训练集数据进行预测,并计算其混淆矩阵

pred<-predict(mod,test,type=“class”)#预测
(a=table(test$y,pred))#混淆矩阵
(b=paste0(round((sum(a)-sum(diag(a)))/sum(a),4)*100,"%"))#错误率

利用predict()函数对测试集数据进行预测,并计算其混淆矩阵:

pred <- predict(mod,train[,-17],type=“class”)

(a=table(train$y,pred))

(b=paste0(round((sum(a)-sum(diag(a)))/sum(a),4)*100,"%"))

#改进
g<-f
gpdays[gpdays[gpdays[gpday!=-1]<-1
gprevious[gprevious[gprevious[gprevious!=0]<-1
index1<-createDataPartition(gKaTeX parse error: Expected 'EOF', got '#' at position 48: …in1<-g[index1,]#̲训练集 test1<-g[-i…y)
summary(train1y)summary(test1y) summary(test1y)summary(test1y)
mod1 <- C5.0(train1$y ~ .,data=train1)
mod1
summary(mod1)

利用predict()函数对训练集数据进行预测,并计算其混淆矩阵

pred1<-predict(mod1,test1,type=“class”)#预测
(a1=table(test1$y,pred1))#混淆矩阵
(b1=paste0(round((sum(a1)-sum(diag(a1)))/sum(a1),4)*100,"%"))#错误率

基于决策树算法的银行营销预测相关推荐

  1. nodejs+vue基于决策树算法的大学生就业预测系统

    通过历年毕业生信息情况,进行就业情况的预测.系统主要以饼状图展示了就业率,毕业生人数学历比例和就业形势的预测.系统通过直观的信息预测,也可以分析出毕业生去单位工作的意向.系统是后台管理系统,主要通过算 ...

  2. 计算机成绩统计优秀率,基于决策树算法的成绩优秀率分析与研究.pdf

    基于决策树算法的成绩优秀率分析与研究.pdf · · EraNo.122015 70 Computer DOI:10.166448.cnki.cn33-1094/tp,2015.12,019 基于决策 ...

  3. 疯狂的机器学习实战-银行营销预测

    机器学习实战-银行营销预测 问题: 数据集: 链接:https://pan.baidu.com/s/1TUOLr8jFbT38p_iUh1iBsQ 提取码:1234 银行营销数据集 这些数据与葡萄牙银 ...

  4. Python3:《机器学习实战》之决策树算法(3)预测隐形眼镜类型

    Python3:<机器学习实战>之决策树算法(3)预测隐形眼镜类型 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://gith ...

  5. 实验——基于决策树算法完成鸢尾花卉品种预测任务

    文章目录 一 实验要求 二 实验思路 三 实验代码 四 实验结果与分析 参考 一 实验要求 本实验通过鸢尾花数据集iris.csv来实现对决策树进一步的了解.其中, Iris鸢尾花数据集是一个经典数据 ...

  6. 房价预测(基于决策树算法)

    预测波士顿房价 第一步. 导入数据 在这个项目中,将使用波士顿房屋信息数据来训练和测试一个模型,并对模型的性能和预测能力进行评估.我们希望可以通过该模型实现对房屋的价值预估,提高房地产经纪人的工作效率 ...

  7. 机器学习决策树算法泰坦尼克号乘客生存预测

    目录 1 决策树算法api 2 泰坦尼克号乘客案例背景 2.1 步骤分析 2.2 代码实现 2.3 决策树可视化 2.3.1 保存树的结构到dot文件 2.3.2 网站显示结构 3 决策树总结 4 小 ...

  8. 【Paper Note】基于决策树算法的电信运营商客户流失预测

    1.引言 随着互联网业务的速发展,移动业务市场的客户流失预警成为每一个电信运营商重点关注的内容,在商务智能与机器学习快速发展的当下,运用数据挖掘的方法,实现对电信客户的挽留.转化.精准营销越来越彰显其 ...

  9. 决策树算法学习笔记(三)-预测隐形眼镜类型

    #coding=utf-8 import matplotlib.pyplot as plt #定义文本框和箭头格式 decisionNode=dict(boxstyle="sawtooth& ...

最新文章

  1. oracle 服务名 数据库名 实例名
  2. 转行学python后悔了-你是多少岁转行的?转行后你后悔了吗?
  3. 12C OCP 1ZO-071 题库(8月以前)
  4. 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
  5. 如何写计算机会议的rebuttal
  6. [置顶] 读取pdf并且在web页面中显示
  7. java excel解析 poi_Java解析Excel之POI(一)
  8. shell 编程中的判断
  9. 编译php时提示“Cannot find MySQL header files”的解决方法
  10. 商人Larry Ellison炮轰云计算
  11. 大神总结的一套PCB学习方法! 真得很受用!
  12. 推荐几个做自媒体好用的电影素材网站
  13. NVT平台model sensor配置
  14. oracle统计个数函数,oracle中字符串统计的函数
  15. 短视频推荐算法过程分享,论如何针对推荐算法来优化短视频内容
  16. flutter 吸顶效果
  17. pytorch的DP和DDP
  18. 计算机网络-基本概念
  19. 两服务器文件异地同步,两台群晖之间Moments异地同步方法探索
  20. “私域流量”的背后:利益催生黑色产业链,恶意营销泛滥成灾

热门文章

  1. matlab mysql建系统_能环水体治理项目(Mysql数据库,Matlab创建GUI界面)【一】
  2. 前端实现搜索功能和模糊查询
  3. 神经网络架构搜索——可微分搜索(DARTS)
  4. 微信群控的服务器怎么用,微信群控开发SDK使用教程--手机客户端返回聊天消息的原始内容给服务端...
  5. 小米mini路由小米3 PandoraBox下载地址
  6. BAM: Bottleneck Attention Module算法笔记
  7. 接口管理平台 - APIPOST和APIfox使用 - PUSDN
  8. 为什么要认真准备Java面试,编程语言排行榜告诉你
  9. Surfacebook电池1充不上电解决办法亲测有效
  10. html图片高度撑开,CSS背景图撑开盒子高度