机器学习--银行营销方案
项目背景及目标
通过银行数据来预测客户是否购买产品。
目标
1.分析各个因素对是否购买产品的影响
2.建立模型预测用户是否购买
数据集
数据集来源:
https://www.kesci.com/home/competition/5c234c6626ba91002bfdfdd3/content/5
代码参考:
https://www.kesci.com/home/project/5ec0c5edb7c5170037f3b74e
数据内容分析
影响是否购买产品的数据分为三个部分:
用户数据:age,job,maritial(是否结婚),education;
行为数据(信用):default(违约),balance(每年账户平均余额),hosing(房贷),loan(借贷)
业务数据:contact(联系方式),day(最后一次联系时间),month最后一次联系时间),duration(联系持续时间),campaign(活动中与客户交流的次数),pdays(距离上次联系的天数),previous(本次活动之前,与客户交流的次数),poutcome (上次活动结果)
分析过程
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import sklearnfrom sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.model_selection import train_test_split #原始数据照比例分割为测试集,训练集
from sklearn.metrics import roc_auc_score #返回精度值
from sklearn.metrics import classification_report #返回正确率,召回率,F1等
from sklearn import preprocessing #预处理
1. 读取和查看数据
df_train=pd.read_csv('train_set.csv')
df_test=pd.read_csv('test_set.csv')
df_train.info()
df_test.info()
df_train.head()
df_test.head()
字符型特征中存在unkwown值,我们认为unknown值是缺失值。特征为字符串格式,无法放到模型训练,后期需要该字段需要进行离散型特征编码。
我们观察到days(最后一次联系的时间(几号))和month(最后一次联系的时间(月份))与pdays(距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过))之间存在特征重合,保留pdays特征。
df_train.drop(['day','month'],inplace=True,axis=1)
df_test.drop(['day','month'],inplace=True,axis=1)
df_train.describe()
df_test.describe()
![](https://img-blog.csdnimg.cn/20200610211356428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FseWph,size_16,color_FFFFFF,t_70)
2.数据清洗
重复值
df_train.duplicated().all() #重复值
异常值
df_train.boxplot() #箱线图查看是否有正负异常
缺失值
def missing_data(data):total = data.isin(['unknown']).sum()percent = (data.isin(['unknown']).sum()/data.isin(['unknown']).count()*100) #count计算总行数,计算0和1个数;sum计算所以0和1的加和tt = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])types = []for col in data.columns:dtype = str(data[col].dtype)types.append(dtype)tt['types'] = typesreturn(np.transpose(tt))
missing_data(df_train)
考虑到职业、教育程度、通讯方式都是离散型数据,采用众数进行填补。上一次活动结果poutcome因为是大部分缺失,依据80%原则(非缺失部分低于总样本量的80%)删除poutcome列。
删除poutcome
df_train.drop('poutcome',inplace=True,axis=1)
df_test.drop('poutcome',inplace=True,axis=1)
替换unknown值
df_train['job'].replace(['unknown'],df_train['job'].mode(),inplace=True)
df_test['job'].replace(['unknown'],df_test['job'].mode(),inplace=True)
df_train['education'].replace(['unknown'],df_train['education'].mode(),inplace=True)
df_test['education'].replace(['unknown'],df_test['education'].mode(),inplace=True)
df_train['contact'].replace(['unknown'],df_train['contact'].mode(),inplace=True)
df_test['contact'].replace(['unknown'],df_test['contact'].mode(),inplace=True)
** 3. 分析及可视化**
3.1 label值
查看label的分布,确定数据集是否是偏斜样本
#
client_purchase=df_train[df_train.loc[:,'y']==1].copy()
client_not_purchase=df_train[df_train.loc[:,'y']==0].copy()
#
#两种方法可以计算#buy_rate=df_buy.shape[0]/df_train.shape[0]或者buy_rate=df_train['y'].sum()/df_train.shape[0]pie_data = {'purchase rate': client_purchase.shape[0],'': df_train.shape[0]-client_purchase.shape[0]}
explode = (0.2, 0) # 突出购买率fig1, ax = plt.subplots()
sizes=pie_data.values()
labels =['{}:{}'.format(key,value) for key,value in pie_data.items()]
ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90)
ax.axis('equal') # 确保圆形plt.show()
可以看出,定期理财产品的购买率不高,同时训练样本极其不均衡。后边可以使用过采样解决样本不均衡问题。
3.2 特征分析
分别从用户数据,信用数据和业务数据三个角度分析
年龄:定量数据(连续型),直方图
print("最小的年龄:{}".format(df_train['age'].min()))
print("最大的年龄:{}".format(df_train['age'].max()))
直方图
fg = sns.FacetGrid(data=df_train,height=6,hue='y')
fg = (fg.map(sns.distplot,'age',bins=[20,30,40,50,60,70,80,90]).add_legend())
通过年龄分布直方图发现:
1.数据样本集中在年龄低的分段
2.年龄超过60岁和年龄低30岁的人更喜欢定期理财
职业:定性数据(离散数据),条形图
fg=sns.catplot(data=df_train,x='job',kind='bar',y='y',ci=None)
fg=(fg.set_xticklabels(rotation=90).set_axis_labels('','purchase rate').despine(left=True))
通过职业分类查看观察到:
1.退休人员和学生最青睐定期理财,其次是失业人员
2.蓝领定期理财的比率最低
**婚姻:**定性数据(离散型)
fg=sns.catplot(data=df_train,x='marital',kind='bar',y='y',ci=None,aspect=.8)
fg=(fg.set_axis_labels('marital','purchase rate').despine(left=True))
按照婚姻情况分类观察到:单身相比离异和已婚倾向于定期理财。
**教育:**定性数据(离散型)
fg=sns.catplot(data=df_train,x='education',kind='bar',y='y',ci=None,aspect=.6)
fg=(fg.set_axis_labels('education','purchase rate').despine(left=True))
职业-教育:
g = sns.catplot(x='job', y='y', col='education',data=df_train, saturation=.5,kind='bar', col_order=['primary','secondary','tertiary'],aspect=1.2,ci=None)
g = (g.set_axis_labels('job', 'purchase rate').set_xticklabels(rotation=90).set_titles('{col_name} {col_var}').despine(left=True))
从上图我们观察到:
1.无论接受教育的程度如何,进行定期理财的人主要是退休人员和学生,其次是失业人员。
2.随着教育程度的提高,管理人员、技术人员、行政人员、蓝领、企业家、自由职业者、事业人员越来越倾向接受定期理财。
违约,房贷,借贷:
fg=sns.catplot(data=df_train,x='default',kind='bar',y='y',ci=None,order=['yes','no'])
fg.set_axis_labels("default",'purchase rate')
fg=sns.catplot(data=df_train,x='housing',kind='bar',y='y',ci=None,order=['yes','no'])
fg.set_axis_labels("housing",'purchase rate')
fg=sns.catplot(data=df_train,x='loan',kind='bar',y='y',ci=None,order=['yes','no'])
fg.set_axis_labels("loan",'purchase rate')
观察到:
没有违约的人倾向于定期理财
没有房贷的人倾向于定期理财
没有个人贷款的人倾向于定期理财
业务数据:联系方式,持续时间,活动次数,距离上一次练习时间,上次活动联系次数
fg=sns.catplot(data=df_train,x='contact',kind='bar',y='y',ci=None)
fg.set_axis_labels("contact",'purchase rate')
fg=sns.catplot(data=df_train,x='campaign',kind='bar',y='y',ci=None,aspect=2)
fg.set_axis_labels("campaign",'purchase rate')fg = sns.FacetGrid(data=df_train,height=6,hue='y')
fg = (fg.map(sns.distplot,'duration',bins=40).add_legend())
通过沟通方式等特征分析观察到:
通过移动电话沟通客户定期理财的比率高
沟通次数长并不一定能够提高客户进行定期理财的比率
最后一次沟通的超过一定时长(大约300)后定期理财比率提高
两个特征的相关性
fig,axes=plt.subplots(1,3)#pearson系数
ax0=axes[0].imshow(X=df_train.corr())
#kendall系数
ax1=axes[1].imshow(X=df_train.corr(method='kendall'))
#spearman系数
ax2=axes[2].imshow(X=df_train.corr(method='spearman'))fig.colorbar(ax0,ax=[axes[0],axes[1],axes[2]])
fig.set_size_inches(30,8)##当然可以使用sns.heatmap函数还可以显示对应的值
将相关性数值表示出来
sns.heatmap(data=df_train.corr(),annot=True)
根据previous系数,duration(最后一次联系的交流时长)与预测值成弱相关性,pdays(距离上次活动最后一次联系该客户,过去了多久)和previous(在本次活动之前,与该客户交流过的次数)成相关性。
4.数据模型
数据集预处理
# 采用哑变量进行编码
train_data=pd.get_dummies(df_train.iloc[:,:-1])
train_data.drop('ID',inplace=True,axis=1)
train_target=df_train.loc[:,'y']
print(train_data.head())
建立和训练模型
#划分训练集和验证集
X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.2, random_state=0)LR=LogisticRegression(solver='liblinear')
#对训练集X_train训练
LR.fit(X_train,y_train)
#给出训练的精度
LR.score(X_train,y_train)
输出:0.892114748432331
#对于验证集x_test进行预测
x_pre_test=LR.predict(X_test) #返回预测标签
x_pre_test
输出:array([0, 0, 0, …, 0, 0, 0], dtype=int64)
print(classification_report(y_test, x_pre_test)) #文本型预测分类报告
x_pro_test = LR.predict_proba(X_test) #返回预测属于某标签的概率
print("验证集的预测可能性:{}".format(x_pro_test))
#计算验证集的auc值,参数为预测值和概率估计
auc=roc_auc_score(y_test, x_pro_test[:, 1]) #精度值 0.85
print("auc的值:{}".format(auc))
5.结果预测
df_out=pd.DataFrame(df_test['ID'].copy())
df_test.drop('ID',inplace=True,axis=1)
df_test=pd.get_dummies(df_test)
#对测试集df_test进行预测
y_pre_test=LR.predict(df_test)
y_pre_test
输出:array([0, 0, 0, …, 0, 0, 0], dtype=int64)
#预测df_test分类的可能性
y_test_pro=LR.predict_proba(df_test)
y_test_pro
df_out['pred']=y_test_pro[:,1]
df_out=df_out[['ID','pred']]
df_out.head()
df_out.to_csv(r'./result.csv',index=False)
机器学习--银行营销方案相关推荐
- 银行营销方案计算机实验心得体会,浙科电子商务实验报告总结.docx
浙科电子商务实验报告总结 实验报告 姓名:徐娜娜学号:专业:市场营销班级:12商101课程:电子商务 江苏师范大学商学院市场营销系 <电子商务>课程实验报告 1 2 3 4 电子商务实训心 ...
- 疯狂的机器学习实战-银行营销预测
机器学习实战-银行营销预测 问题: 数据集: 链接:https://pan.baidu.com/s/1TUOLr8jFbT38p_iUh1iBsQ 提取码:1234 银行营销数据集 这些数据与葡萄牙银 ...
- 机器学习之「二分类算法」-----银行营销案例分析
原文地址: <di:https://blog.csdn.net/weixin_44696674/article/details/88231922iv id="article_conte ...
- 银行营销策略数据分析 - 智能定位
银行营销策略数据分析 - 智能定位 1 摘要 银行金融领域的数据分析可以更好为营销活动提供具有参考性的建议,做到智能金融定位.银行通过为客户创造价值并建立牢固的客户关系来从客户那里获取价值作为回报的营 ...
- 【工商管理论文】S船舶监理公司协同营销方案优化研究(节选)
本文是一篇工商管理论文,本文对 S 公司与其母公司和母公司旗下的姐妹公司之间协同营销的研究可以从两个角度分析:一是以客户需求为导向的基于产业链上下游的垂直协同营销:二是基于资源.信息共享的集团企业协同 ...
- 人工智能营销方案_AI增长营销智能营销精益AI
人工智能营销方案 Editor's Note: We think this piece is important because AI is transforming all industries a ...
- 网络营销方案之巧用电子书营销
网络营销方案之巧用电子书营销 随着网络营销的发展,各种新兴的网络营销方法如雨后春笋般冒出来,让人眼花聊乱!各种成功的网络营销方案也是让人惊奇不已. 其实经典的网络营销方案也都是针对客户的需求而相应制作 ...
- url.getinputsteam 获取不完整_年度营销方案合集,活动策划,规划推广,全内容完整套用告别加班...
Hello大家好,我是帮帮.今天跟大家分享一组年度营销方案合集,活动策划,规划推广,全内容完整套用,告别加班. 为了让大家能更稳定的下载模板,我们又开通了全新下载方式(见文章末尾),以便大家可以轻松获 ...
- 门户网站运营方案_网络营销方案涉及的工作内容有哪些
问:在公司从事网络营销推广工作,想问下要撰写网络营销方案,要涉及到哪些层面,工作内容有哪些呢? 答:总的来说,网络营销方案涉及到:网站技术,市场营销,网络应用,营销策划等,其主要的工作有以下9个方面: ...
最新文章
- 算法---------路径总和
- 你是什么时候真正从产品助理成长为产品经理的?
- 计算机应用技能大赛海报,2017年计算机应用工程系技能大赛汇总 ——大赛点亮人生 技能改变命运...
- Matlab错误:Y must be a vector or a character array
- RTT的IPC机制篇——邮箱
- 1.4 Padding
- 二维绕任意点旋转_解析几何|对称,平移和旋转
- c# 解析JSON的几种办法
- 非酋用计算机弹唱,非酋简谱 薛明媛/朱贺 听说爱情就是这样子
- ikm java_ikm(IKM在线)
- 共享 || 我自己觉得好看的20款可商用字体
- ol+天地图+geoserver_天地图离线瓦片的打包与发布(GeoServer)
- python凹多边形分割_Unity 凹多边形三角剖分
- book mac pro怎么重装系统_MacBook Pro怎么重装系统 MacBook Pro重装系统教程
- secondary namenode 检查点
- java语言之面向对象
- MPU6050/6500/9250中断读取原始数据(基于STM32F103)
- python 写word图表标题_工作汇报神技!用Python三步生成带有图表的word报表
- HZYWX-技术交流-开发中的导入导出
- 关于wap上网及彩信的一点想法
热门文章
- 一节计算机课英语,电脑课的英语
- 数据挖掘各种算法JAVA的实现方法
- CSS——标签选择器,类选择器
- 电脑防火墙未使用推荐的设置来保护计算机,防火墙无法使用推荐设置,
- c语言多文件编译 实例霓虹灯,单片机51c语言编程20种不同霓虹灯亮法
- 责任链模式-C++实现
- DBeaver连接mysql数据库执行.sql脚本,Windows
- Excel VBA中的If,Select循环语句
- python算法问题_算法重心问题树(Python),的
- 常用的Linux外文文献,Linux大学外文文献翻译及原文.doc