金融数据分析——DataJoy银行客户购买预测

这篇博客通过葡萄牙银行的营销活动数据,探讨了客户购买定期存款的预测。主要涉及数据预处理、探索性分析、特征工程和建模分析,使用了GBDT模型。发现如年龄、婚姻状况、违约记录等因素影响购买意愿,同时揭示了数据中某些特征的潜在模式。
摘要由CSDN通过智能技术生成

本预测与葡萄牙银行机构的营销活动相关。这些营销活动一般以电话为基础,银行的客服人员至少联系客户一次,以确认客户是否有意愿购买该银行的产品(定期存款)。任务是基本类型为分类任务,即预测客户是否购买该银行的产品。

相关包

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from sklearn import ensemble, 
from sklearn import model_selection
from sklearn import multiclass
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.metrics import roc_curve, auc,roc_auc_score
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import GridSearchCV
from imblearn.over_sampling import SMOTE
from scipy.stats import chi2_contingency


数据预处理

数据导入

train_set = pd.read_csv('train_set.csv')
test_set = pd.read_csv('test_set.csv')   
print(train_set.shape)
print(test_set.shape) 
#(25317, 18)
#(10852, 17)
#train_set.info()
#test_set.info() 

数据字段
ID :客户唯一标识
age :年龄
job :职位
marital :婚姻状况
education :教育
default :是否有违约记录
balance :每年账户的平均余额
housing :是否有住房贷款
loan :是否有个人贷款
contact :与客户的沟通方式
day :最后一次联系的日期
month :最后一次联系的月份
duration :最后一次联系的交流时时长
campaign :在本次活动中与客户交流的次数
pdays :距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过)
previous :在本次活动之前,与该客户交流过的次数
poutcome :上一次活动的结果
y :预测客户是否会订购定期存款业务

重复值处理

test_set = test_set.drop_duplicates()
train_set = train_set.drop_duplicates() 
print(train_set.shape)
print(test_set.shape) 
#(25317, 18)
#(10852, 17)
#数据没有重复值

缺失值处理

#数据没有NA值但是有unknow值
train_set.isin(['unknown']).mean()*100 
#job:0.643836,education:4.206660,contact:28.759332,poutcome:81.672394
test_set.isin(['unknown']).mean()*100 
#job:0.552893,education:4.128271,contact:28.676742,poutcome:81.800590
# 工作,教育和沟通方式用众数填充,上一次沟通的结果poutcome因为缺失太多,把这一特征舍弃掉
train_set.drop(['poutcome'],inplace=True,axis=1)
train_set['job'].replace(['unknown'],train_set['job'].mode(),inplace=True)
train_set['education'].replace(['unknown'],train_set['education'].mode(),inplace=True)
train_set['contact'].replace(['unknown'],train_set['contact'].mode(),inplace=True)
test_set.drop(['poutcome'],inplace=True,axis=1)
test_set['job'].replace(['unknown'],test_set['job'].mode(),inplace=True)
test_set['education'].replace(['unknown'],test_set['education'].mode(),inplace=True)  
test_set['contact'].replace(['unknown'],test_set['contact'].mode(),inplace=True)

探索性分析

#离散变量列名
object_columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact','month']
#连续变量列名
num_columns = ['age', 'balance', 'duration', 'campaign', 'pdays', 'previous','day']

离散变量

def barplot(x,y, **kwargs):
    sns.barplot(x=x , y=y)
    x = plt.xticks(rotation=45)
f = pd.melt(train_set,  value_vars=object_columns ,id_vars = 'y')
g = sns.FacetGrid(f, col="variable", col_wrap=3, sharex=False, sharey=False, size=5)
g = g.map(barplot,"value",'y')       

在这里插入图片描述
职位:退休人员和学生更有可能买购买定期存款,其次是失业人员和管理人员,蓝领定期理财的意愿较低
婚姻状况:单身人士比离婚和结婚人士更愿意定期理财
教育程度:定期理财意愿按照大学、高中、初中受教育程度依次降低
是否有违约记录:没有违约记录的人士购买定期理财的可能是有违约记录人员的两倍
是否有住房贷款:没有住房贷款的人士购买定期理财的可能是有住房贷款人员的两倍以上
是否有个人贷款:没有个人贷款的人士更有可能购买定期理财
与客户的沟通方式:用电话沟通和手机沟通对客户决定是个购买定期存款 影响不明显
最后一次联系的月份:12、10、9、3月购买定期存款的比例较高

g = sns.FacetGrid(train_set, col='marital',size=5)
g.map(sns.barplot, 'default', 'y', 'education') 
g.add_legend()

在这里插入图片描述
单身&没有违约记录&大学学历的人士购买定期存款的概率较高
离婚&有违约记录&大学学历的人士购买定期存款的概率较低

def barplot(x,y, **kwargs):
    sns.barplot
  • 18
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值