赞
踩
一个数据科学项目。通过对客户的信息分析、客户与银行的通话信息分析、经济情况分析和相关其它信息分析,来判断最有可能购买银行存款产品的群体,从而对其做出智能的推荐。
该数据与葡萄牙银行机构的直接营销活动(电话)有关,我们的最终目标是预测客户是否将会定期存款(变量y),为了访问产品(银行定期存款)是否被订阅,通常需要与同一客户进行多次联系。
1.2.1.银行客户信息:bank_client
1.age:int类型,代表年龄
2.job:string类型,代表职业,共12种(‘admin.’, ‘blue-collar’, ‘entrepreneur’, ‘housemaid’, ‘management’, ‘retired’,
‘self-employed’, ‘services’, ‘student’, ‘technician’, ‘unemployed’, ‘unknown’)
3.marital:string类型,代表婚姻情况,共4种(‘divorced’, ‘married’, ‘single’, ‘unknown’)
4.education:string类型,代表教育情况,共8种(‘illiterate’,‘basic.4y’,‘basic.6y’,‘basic.9y’,‘high.school’,‘professional.course’,
‘university.degree’,‘unknown’)
5.default:string类型,代表是否有违约信用(‘no’, ‘yes’, ‘unknown’)
6.housing:string类型,代表是否有房(‘no’, ‘yes’, ‘unknown’)
7.loan:string类型,代表是否有个人贷款(‘no’, ‘yes’, ‘unknown’)
1.2.2.最后一次与相关人员联系的信息:bank_contact
8.contact:string类型,代表联系方式(‘cellular’,‘telephone’)
9.month:string类型,代表月份(‘jan’, ‘feb’, ‘mar’, …, ‘nov’, ‘dec’)
10.day_of_week:string类型,代表最后联系的天,周末不上班(‘mon’,‘tue’,‘wed’,‘thu’,‘fri’)
11.duration:double类型,代表最后一次联系的持续时间,以秒为单位
注:duration对结果的影响度非常高,如果duration=0那么y=’no’。
1.2.3.社交和经济背景信息:bank_economical
12.emp.var.rate:double类型,代表就业变动率-季度
13.cons.price.idx:double类型,代表消费物价指数-月
14.cons.conf.idx:double类型,代表消费者信心指数-月
15.euribor3m:double类型,代表欧元3个月利率-日
16.nr.employed:double类型,代表员工人数-季度
1.2.4.其它信息:bank_another
17.campaign:int类型,代表此客户与相关人员的通话数量
18.pdays:int类型,距离最后一次联系相关人员的天数(999代表没有联系过)
19.previous:int类型,代表在此产品上线之前和客户联系的次数
20.poutcome:string类型,代表营销的结果(‘failure’,‘nonexistent’,‘success’)
1.2.5.结果
y:string类型,代表是否订阅定期存款产品
#!/usr/bin/env python # -*- coding: utf-8 -*- import pandas as pd def generate_file(): result = [] with open('bank-additional-full.csv', encoding='utf-8') as fp: for line in fp: line = line.replace('"', '').replace('\n', '').replace(' ', '').split(';') result.append(line) del (result[0]) df = pd.DataFrame(result, columns=['age', 'job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'day_of_week', 'duration', 'campaign', 'pdays', 'previous', 'poutcome', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed', 'y']) df.to_csv('dataset.csv', index=0) def show_information(): fp = pd.read_csv('dataset.csv') print('types:') print(fp.dtypes, '\n') print('null:') print(fp.isnull().any()) if __name__ == '__main__': # generate_file() # show_information()
处理前的数据形式
处理后的数据形式
2.1.1.generate_file()
通过python原生的函数来处理文件,将文件转化为一个DataFrame结构,之所以不用pandas包下的read_csv()函数是因为python原生函数对文件中某行的字符处理要更为友善。
2.1.2.show_information()
展示所生成文件每个特征的数据类型和是否有缺失值,可以看出,数据为object,int64和float64类型,同时数据完整,没有缺失值
通过生成的dataset.csv将数据导入SPSS依次生成堆积图,结果如下
2.2.1.银行客户信息分析(7个特征)
age:由直方图可知,年龄的分布是离散化的,仅仅看这个图表我们不能得出结论如果年龄对y有很大影响。与此同时,年龄在偏高的地方呈断崖式下跌,若不经过处理则会影响模型准确性。
job:由直方图可知,退休人员和学生的订阅率最高,这两类人员种缺乏相关理财知识的人占比较高,所以大多会选择风险低的定期存款。因此可以多向这两类人群投送广告,同时其他相同工作层次的人订阅率相差不大。
marital:由直方图可知,单身人群存款比例更高。
education:由直方图可知,大学生的存款比例最高。
default:由直方图可推断,有违约信用的几乎不存款。
housing:由直方图可知,是否有房存款的比例差别不大。
loan:由直方图可知,是否贷款与是否存款比例差距不大。
2.2.2.最后一次与相关人员联系的信息分析(4个特征)
contact:由直方图可知,使用手机联系的存款比例较高,推测使用手机的可能家庭较富裕
month:由直方图可知,五月的存款比例最低
day_of_week: 由直方图可知,在每个工作日存款人数比例接近
duration: 由直方图可知,数据分布过于离散,需要进行进一步的处理
2.2.3.社交和经济背景信息分析(5个特征)
由直方图可得,经济类的五个特征表现出相似的行为。
2.2.4.其它信息分析(4个特征)
campaign:由直方图可得,银行工作人员跟客户联系持续的时间越长,客户订阅产品的概率越大。
pdays:由直方图可得,客户在产品出来前如果联系相关人员,订阅率几乎为百分之百,这说明了产品宣传的重要性。
previous:由直方图可得,联系次数越多,存款的几率越大
poutcome:由直方图可得,营销结果成功的情况下,存款几率很高
2.2.5.综合分析
去掉离群样本的特征:age, duration, campaign,共3个
手动编码的特征:education,共1个
LabelEncoder编码的特征:job, marital, default, loan, contact, month, poutcome,共6个
放缩的特征:age, duration, euribor3m, pdays,共5个
不需要处理的特征:previous,emp.var.rate, cons.price.idx, cons.conf.idx, nr.emplyed,共6个
意义不大的特征:housing, day_of_week,共2个
#!/usr/bin/env python # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from pandas import DataFrame as dF from sklearn.preprocessing import LabelEncoder # 20 columns + y # ['age', 'job', 'marital', 'education', 'default', 'housing', 'loan'] 'housing' is useless # ['contact', 'month', 'day_of_week', 'duration'] 'day_of_week' is useless # ['campaign', 'pdays', 'previous', 'poutcome'] # ['emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed'] def process(): filename = 'dataset.csv' bank = pd.read_csv(filename) label_encoder = LabelEncoder() bank.drop('housing', axis=1, inplace=True) bank.drop('day_of_week', axis=1, inplace=True) bank = remove_outliers(bank, 'age', low=True, high=True) bank = remove_outliers(bank, 'campaign', low=False, high=True) bank = remove_outliers(bank, 'duration', low=False, high=True) # 6 columns of 7 bank_client = bank.loc[:, ['age', 'job', 'marital', 'education', 'default', 'loan']] process_bank_client(bank_client, label_encoder) # 3 columns of 4 bank_contact = bank.loc[:, ['contact', 'month', 'duration']] process_bank_contact(bank_contact, label_encoder) # 5 columns bank_economy = bank.loc[:, ['emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed']] process_bank_economy(bank_economy, label_encoder) # 4 columns bank_another = bank.loc[:, [
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。