概述:
数据集是基于开源数据集Bank Marketing Data Set 的分类预测,本数据集与葡萄牙银行机构的营销活动相关。
这些营销活动一般以电话为基础,银行的客服人员至少联系客户一次,以确认客户是否有意愿购买该银行的产品(定期存款),最终目标是预测客户是否会订购定存业务(变量y)。
数据说明
下载下来的数据是这样的,虽说是csv格式但是并非逗号分隔符,需要通过文本工具打开进行一下替换。
替换后打开结果:
以上表格字段说明,
序号 | 字段名 | 数据类型 | 描述 |
1 | age | Int | 客户年龄 |
2 | job | String | 客户的职业 |
3 | marital | String | 婚姻状况 |
4 | education | String | 受教育水平 |
5 | default | String | 是否有违约记录 |
6 | balance | Int | 每年账户的平均余额 |
7 | housing | String | 是否有住房贷款 |
8 | loan | String | 是否有个人贷款 |
9 | contact | String | 与客户联系的沟通方式 |
10 | day | Int | 最后一次联系的时间(几号) |
11 | month | String | 最后一次联系的时间(月份) |
12 | duration | Int | 最后一次联系的交流时长 |
13 | campaign | Int | 在本次活动中,与该客户交流过的次数 |
14 | pdays | Int | 距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过) |
15 | previous | Int | 在本次活动之前,与该客户交流过的次数 |
16 | poutcome | String | 上一次活动的结果 |
17 | y | Int | 预测客户是否会订购定期存款业务 |
本次实验采用了和鲸社区提供的数据集,分为了训练集与测试集,采用了18个属性(原17个属性+ID属性)。
数据处理
导入所需要的包并进行相关设置
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
# 相关设置
sns.set(style='darkgrid')
plt.rcParams['font.family']='SimHei'
plt.rcParams['axes.unicode_minus']=False
warnings.filterwarnings("ignore")
读取数据并查看相关信息
bank = pd.read_csv('./bank.csv')
# 查看数据文件详情
bank.info()
随机获取10条数据
bank.sample(10)
缺失值查看与判断
# 查看是都有缺失值,测试全部是0
bank.isnull().sum()
# 数据没有缺失值,但是有‘unknown’这也算缺失值,查看数据‘unknown’的百分比
bank.isin(['unknown']).mean()*100
通过查看数据集较好,基本不需要处理,unknow的我们需要简单处理一下。工作(job),教育(education)和沟通方式(contact)用众数填充,上一次沟通(poutcome)的结果因为缺失太多,把这一特征舍弃掉
bank.drop(['poutcome'],inplace=True,axis=1)
bank['job'].replace(['unknown'],bank['job'].mode(),inplace=True)
bank['education'].replace(['unknown'],bank['education'].mode(),inplace=True)
bank['contact'].replace(['unknown'],bank['contact'].mode(),inplace=True)
重复值判断与删除
bank.duplicated().any() # 如果存在可以删除重复值,但是判断之后返回False
描述分析
查看数据标签【y】的分布,使用seaborn中的countplot,countplot是seaborn库中分类图的一种,作用是使用条形显示每个分箱器中的观察计数。
# 查看数据标签的分布
sns.countplot(x='y',data=bank) # 或者sns.countplot(x=bank['y'])
可以发现数据分布还是很不平衡的,后边可以使用上采样解决样本不均衡问题。
查看购买和未购买用户的年龄分布,年龄分布我们采用seaborn中的FacetGrid类完成。
FacetGrid是seaborn库中的一个类,我们在初始化这个类时只需要给它传一个DataFrame的数据集即可。实例化这个类以后,我么就可以直接使用这个对象的方法map绘制需要的图形
g=sns.FacetGrid(data=bank,height=6,hue='y',palette='Spectral_r')
g=(g.map(sns.distplot,'age',bins=[20,30,40,50,60,70,80,90]).add_legend())
通过分析可以看出:两类客户的年龄分布差异不大
查看不同职业的购买比例
seaborn.catplot 是一个将分类图绘制到FacetGrid上图级别接口。
这个函数可以访问多个轴级功能,这些轴级功能通过不同的可视化图表展示数字和一个或多个分类变量的关系。kind
参数可以选择的轴级基础函数有:
分类散点图:
-
stripplot()
(withkind="strip"
; the default) -
swarmplot()
(withkind="swarm"
)
分类分布图:
-
boxplot()
(withkind="box"
) -
violinplot()
(withkind="violin"
) -
boxenplot()
(withkind="boxen"
)
分类估计图:
-
pointplot()
(withkind="point"
) -
barplot()
(withkind="bar"
) -
countplot()
(withkind="count"
)
sns.catplot(data=bank,x='job',kind='bar',y='y',) # 柱形图
plt.xticks(rotation=90)
退休人员和学生最青睐定期理财,其次是失业人员,蓝领定期理财的比率最低
# 查看婚姻状况与购买的关系
sns.catplot(data=bank,x='marital',kind='bar',y='y')
单身相比离异和已婚倾向于定期理财
# 查看学历和购买的关系
sns.catplot(data=bank,x='education',kind='bar',y='y')
sns.catplot(y='job', x='y', col='education',
data=bank, ci=None,kind='bar',)
通过下图发现无论接受教育的程度如何,进行定期理财的人主要是退休人员和学生,其次是失业人员。随着教育程度的提高,管理人员、技术人员、行政人员、蓝领、企业家、自由职业者、事业人员越来越倾向接受定期理财。
查看违约和购买的关系
fig,ax=plt.subplots(1,3)
sns.catplot(data=bank,x='default',kind='bar',y='y',ax=ax[0])
sns.catplot(data=bank,x='housing',kind='bar',y='y',ax=ax[1])
sns.catplot(data=bank,x='loan',kind='bar',y='y',ax=ax[2])
没有违约的人倾向于定期理财,没有个人贷款的人倾向于定期理财, 没有房贷的人倾向于定期理财,
沟通方式和购买的关系
fig,ax=plt.subplots(1,2,figsize=(15,6))
sns.catplot(data=bank,x='contact',kind='bar',y='y',ci=None,ax=ax[0])
sns.catplot(data=bank,x='campaign',kind='bar',y='y',ci=None,aspect=2,ax=ax[1])
# 获取银行是否沟通过的数据,并且获取沟通时常进行展示
g=sns.FacetGrid(data=bank,height=6,hue='y')
g=(g.map(sns.distplot,'duration',bins=40).add_legend())
通过分析得出,移动电话客户确实可以促进客户的定期理财,但是也并不是沟通时长越长越好,而是定期理财在300分钟最能促进理财意愿的达成。