大数据实践(一):对葡萄牙银行数据集做简单的观察与探索

实验

实验目标:对葡萄牙银行数据集做简单的观察与探索

完成时间:1小时(实验),0.5小时(实验报告)

实验要求:

  1. 查看数据的基本情况。
  2. 观察所有分类变量的取值情况,并且进行数据可视化
  3. 观察所有数值变量的数值分布情况,并且进行数据可视化

项目背景

 

本项目背景是基于葡萄牙银行电话营销数据的基础上,通过数据分析和机器学习,优化营销策略,提高营销效率。通过数据分析了解客户的需求,通过机器学习,根据客户和当时的社会经济情况,预测用户是否可能购买储蓄产品。

  • 这个数据集是关于一家葡萄牙银行机构从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()
(41188, 21)
 agejobmaritaleducationdefaulthousingloancontactmonthday_of_week...campaignpdayspreviouspoutcomeemp.var.ratecons.price.idxcons.conf.idxeuribor3mnr.employedy
0 56 housemaid married basic.4y no no no telephone may mon ... 1 999 0 nonexistent 1.1 93.994 -36.4 4.857 5191.0 no
1 57 services married high.school unknown no no telephone may mon ... 1 999 0 nonexistent 1.1 93.994 -36.4 4.857 5191.0 no
2 37 services married high.school no yes no telephone may mon ... 1 999 0 nonexistent 1.1 93.994 -36.4 4.857 5191.0 no
3 40 admin. married basic.6y no no no telephone may mon ... 1 999 0 nonexistent 1.1 93.994 -36.4 4.857 5191.0 no
4 56 services married high.school no no yes telephone may mon ... 1 999 0 nonexistent 1.1 93.994 -36.4 4.857 5191.0 no

5 rows × 21 columns

df=pd.read_csv("bank-additional-full.csv",sep=';')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 41188 entries, 0 to 41187
Data columns (total 21 columns):
age               41188 non-null int64
job               41188 non-null object
marital           41188 non-null object
education         41188 non-null object
default           41188 non-null object
housing           41188 non-null object
loan              41188 non-null object
contact           41188 non-null object
month             41188 non-null object
day_of_week       41188 non-null object
duration          41188 non-null int64
campaign          41188 non-null int64
pdays             41188 non-null int64
previous          41188 non-null int64
poutcome          41188 non-null object
emp.var.rate      41188 non-null float64
cons.price.idx    41188 non-null float64
cons.conf.idx     41188 non-null float64
euribor3m         41188 non-null float64
nr.employed       41188 non-null float64
y                 41188 non-null object
dtypes: float64(5), int64(5), object(11)
memory usage: 6.6+ MB

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())
job  :   ['housemaid' 'services' 'admin.' 'blue-collar' 'technician' 'retired'
 'management' 'unemployed' 'self-employed' 'unknown' 'entrepreneur'
 'student']
marital  :   ['married' 'single' 'divorced' 'unknown']
education  :   ['basic.4y' 'high.school' 'basic.6y' 'basic.9y' 'professional.course'
 'unknown' 'university.degree' 'illiterate']
default  :   ['no' 'unknown' 'yes']
housing  :   ['no' 'yes' 'unknown']
loan  :   ['no' 'yes' 'unknown']
contact  :   ['telephone' 'cellular']
month  :   ['may' 'jun' 'jul' 'aug' 'oct' 'nov' 'dec' 'mar' 'apr' 'sep']
day_of_week  :   ['mon' 'tue' 'wed' 'thu' 'fri']
poutcome  :   ['nonexistent' 'failure' 'success']
y  :   ['no' 'yes']

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()
 
 duration
count 41188.000000
mean 258.285010
std 259.279249
min 0.000000
25% 102.000000
50% 180.000000
75% 319.000000
max 4918.000000
 
df['age'].isnull().sum()
0
 

4.2 数值型变量分布可视化

通过进一步的可视化,观察数值型变量的分布情况,数据分布情况的分析。

 

箱形图


箱形图很直观地展示了数据的分散情况,箱型图中矩形较扁,说明数据分布比较集中,矩形较长,说明数据分布比较离散。从箱形图的上下边缘之外观察是否有离散数据,可以了解该变量是否存在较多离群点

以下以年龄分布为例,结合上文describe输出结果进行分析:

  1. 矩形盒子中间这条线是中位线,结合图形和上文分析可知,平均年龄为40岁
  2. 第一四分位数(下四分位数)和第三四分位数(上四分位数)分别对应着箱子的顶部和底部,结合上文可知其分别是32和47。这是大部分群体的年龄范围。可以看出从上下四分位数差距不大,年龄分布基本比较集中。
  3. 从图中看,在上边缘之外存在较多离群点(年龄偏大的顾客)
 

直方图

直方图显示了不同的数据取值的分布情况。

  1. 从图上看,客户的分布从60岁以后出现一个大幅度下滑。这与60岁是退休年龄有关。
  2. 客户大幅度集中在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()

 

 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2020-04-14 17:30  Mangnolia  阅读(4738)  评论(3编辑  收藏  举报