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

时间:2024-03-02 16:47:19

实验

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

完成时间: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()