实验
实验目标:对葡萄牙银行数据集做简单的观察与探索
完成时间:1小时(实验),0.5小时(实验报告)
实验要求:
- 查看数据的基本情况。
- 观察所有分类变量的取值情况,并且进行数据可视化
- 观察所有数值变量的数值分布情况,并且进行数据可视化
项目背景
本项目背景是基于葡萄牙银行电话营销数据的基础上,通过数据分析和机器学习,优化营销策略,提高营销效率。通过数据分析了解客户的需求,通过机器学习,根据客户和当时的社会经济情况,预测用户是否可能购买储蓄产品。
- 这个数据集是关于一家葡萄牙银行机构从2008年5月到2010年11月的直接电话营销活动,旨在促进现有客户的定期存款。它在UCI机器学习库中公开,链接: http://archive.ics.uci.edu/ml/datasets/Bank+Marketing#. 这是真实的商业数据,总共4万多条记录,每一条有21个属性。主要的任务目标是分类预测,用户是否会接受营销。(如果会y列则是yes)
- 此数据集中有新旧两个数据集,本例采用了bank-additional-full.csv
变量介绍
银行客户信息:
- 1 - age: 年龄 (数字)
- 2 - job: 工作类型 。管理员(admin),蓝领(blue-collar),企业家(entrepreneur),家庭主妇(housemaid),管理者(\'management\'),退休(\'retired\'),个体经营(\'self-employed\'),服务业(\'services\'),学生(\'student\'),技术人员(\'technician\'),无业(\'unemployed\'),未知(\'unknown\')
- 3 - marital : 婚姻状态,离婚(\'divorced\'),结婚(\'married\'),单身(\'single\'),未知(\'unknown\')。说明:离婚也包括寡居
- 4 - education: 教育情况 : 基本4年(\'basic.4y\'), 基本6年(\'basic.6y\'),基本九年(\'basic.9y\'),高中(\'high.school\'),文盲(\'illiterate\'),专业课程(\'professional.course\'),大学学位(\'university.degree\'),未知(\'unknown\')
- 5 - default: 是否有信用违约? (\'no\',\'yes\',\'unknown\')
- 6 - housing: 是否有房贷 ( \'no\',\'yes\',\'unknown\')
- 7 - loan: 是否有个人贷款 (categorical: \'no\',\'yes\',\'unknown\')
与联络相关信息:
- 8 - contact: 联系类型,手机( \'cellular\'),电话:\'telephone\'
- 9 - month: 年度最后一次联系的月份 (categorical: \'jan\', \'feb\', \'mar\', ..., \'nov\', \'dec\')
- 10 - day_of_week: 最后一次联系的星期 (categorical: \'mon\',\'tue\',\'wed\',\'thu\',\'fri\')
- 11 - duration: 上一次联系的通话时长(秒). 重要提示:此属性高度影响输出目标(例如,如果持续时间=0,则y=\'no\')。然而,在执行呼叫之前,持续时间还不知道。而且,在通话结束后,Y显然是已知的。因此,这个输入应该只包括在基准测试中,如果想要有一个实际的预测模型,就应该丢弃它。(预测时不知道会通话的时长)
其他属性:
- 12 - campaign: 针对该客户,为了此次营销所发起联系的数量。(数字,包括最后一次联络)
- 13 - pdays: 上次营销到现在已经过了多少天。(数字,如果是999表示这个客户还没有联系过)
- 14 - previous: 在本次营销之前和客户联系过几次(数字)
- 15 - poutcome: 上一次营销活动的结果 ( \'failure\',\'nonexistent\',\'success\')
社会和经济相关属性
- 16 - emp.var.rate: 就业变动率 -系度指标(numeric)
- 17 - cons.price.idx: 消费物价指数-月度指标 (numeric)
- 18 - cons.conf.idx: 消费者信心指数--月度指标(numeric)
- 19 - euribor3m: 欧元同业拆借利率3个月 - 每日指标 (numeric)
- 20 - nr.employed: 员工数量-季度指标 (numeric)
输出变量(目标):
- 21 - y -客户存钱了吗(被成功营销了吗)? (binary: \'yes\',\'no\')
主要目标: 提高银行电话营销活动的有效性
该项目将使银行更加细致地了解客户群体,预测客户对于电话营销活动的反应,并为未来的营销计划建立目标客户档案。
通过分析客户特征以及当时的社会经济情况等信息,银行将能够预测客户储蓄行为,并确定哪些类型的客户更有可能进行定期存款。然后,银行可以将其营销工作重点放在这些客户身上。这不仅可以使银行更有效地获得存款,还可以通过减少某些客户的不良广告来提高客户满意度。
1、导入库文件
1 import numpy as np 2 import pandas as pd 3 import warnings 4 import seaborn as sns 5 import matplotlib.pyplot as plt 6 %matplotlib inline
2. 数据整体状态观察
2.1 查看数据基本情况
装载数据后,首先需要对数据进行一个基本观察,例如样本的数量(行数),变量的数量(列数),哪些变量是数值变量,哪些是类别变量(通常表现为char类型)
- 使用shape()方法,观察数据的行列数量。观察数据是否与前文介绍的样本量、变量数相符。
- 使用info()方法观察所有的变量名称、变量的类型,找出哪些属于数值类型。
- 使用head()方法查看数据的大体情况
df=pd.read_csv("bank-additional-full.csv",sep=\';\') df.shape
df.head()
df=pd.read_csv("bank-additional-full.csv",sep=\';\') df.info()
2.2 记录分类和数值变量
根据info输出的结果,区分并且记录下分类和数值变量
- 到此为止,需要分出哪些属于数值类型变量,哪些属于类别变量,请将这些变量分别记录到两个列表中,作为后续实验的基础。结合上述信息,我们可以了解到,数值变量10个,分类变量11个。
- 由于数据集特征较多,分类变量和数值在处理上具有相似性,因此将不同的变量放入不同的list中,便于后续对于同类变量采用循环的方式统一处理。
numberVar=[\'age\',\'duration\',\'campaign\',\'pdays\',\'previous\',\'emp.var.rate\',\'cons.price.idx\',\'cons.conf.idx\',\'euribor3m\',\'nr.employed\'] categoryVar=[\'job\',\'marital\',\'education\',\'default\',\'housing\',\'loan\',\'contact\',\'month\',\'day_of_week\',\'poutcome\',\'y\']
3. 观察分类变量的取值情况
针对前文所有的分类变量逐一进行分析。
3.1 查看分类变量的取值
- 使用value_counts()方法,查看任意变量的取值和数量。观察这些取值与前面的数据介绍是否一致。
- unique()方法,快速查看所有分类变量的取值情况。要求使用for循环实现.输出参考如下:
var=[\'job\',\'marital\',\'education\',\'default\',\'housing\',\'loan\',\'contact\',\'month\',\'day_of_week\',\'poutcome\',\'y\'] for i in var: print(i, " : ", df[i].unique())
3.2 使用条形图查看分类变量取值分布情况
- 绘制所有分类变量取值分布的条形图
- 使用循环的方式,针对所有分类变量绘制条形图
for j in categoryVar: plt.figure(figsize=(14,4)) sns.barplot(df[j].value_counts().index,df[j].value_counts().values) plt.title(j)
4. 观察数值型变量的取值情况
4.1 快速浏览数值型变量分布情况
通过describe()方法可以快速浏览数据集中指定数值变量的分布情况。
- mean 均值
- std 标准差
- min,max: 最小值和最大值
- 25%: 第一四分位数(Q1),即该样本中所有数值由小到大排列后,第25%位置上的数字
- 50%: 中位数,该样本中所有数值由小到大排列后第50%位置上的数字
- 75%: 第三四分位数(Q3),即该样本中所有数值由小到大排列后,第75%的数字。
df[[\'duration\']].describe()
df[\'age\'].isnull().sum()
4.2 数值型变量分布可视化
通过进一步的可视化,观察数值型变量的分布情况,数据分布情况的分析。
箱形图
箱形图很直观地展示了数据的分散情况,箱型图中矩形较扁,说明数据分布比较集中,矩形较长,说明数据分布比较离散。从箱形图的上下边缘之外观察是否有离散数据,可以了解该变量是否存在较多离群点
以下以年龄分布为例,结合上文describe输出结果进行分析:
- 矩形盒子中间这条线是中位线,结合图形和上文分析可知,平均年龄为40岁
- 第一四分位数(下四分位数)和第三四分位数(上四分位数)分别对应着箱子的顶部和底部,结合上文可知其分别是32和47。这是大部分群体的年龄范围。可以看出从上下四分位数差距不大,年龄分布基本比较集中。
- 从图中看,在上边缘之外存在较多离群点(年龄偏大的顾客)
直方图
直方图显示了不同的数据取值的分布情况。
- 从图上看,客户的分布从60岁以后出现一个大幅度下滑。这与60岁是退休年龄有关。
- 客户大幅度集中在30~40这个年龄段
for i in numberVar: fig, (ax1, ax2) = plt.subplots(nrows = 1, ncols = 2, figsize = (13, 4)) sns.boxplot(x = i, data = df, orient = \'v\', ax = ax1) ax1.set_ylabel(i,fontsize=15) ax1.set_title(i, fontsize=15) ax2.hist(df[i],30) ax2.set_title(i, fontsize=15) plt.tight_layout() plt.show()