问题背景:
-
随着利率市场化改革推进,银行业整体面临息差收窄的压力,不少银行将中间业务收入作为新的利润增长点。其中,以招商银行为代表的一批大型股份制银行,更是将大财富管理模式做到了极致,中间收入占比的增加既有利于银行利润的稳定健康增长,也有利于扩大银行的品牌影响力,建造属于自己品牌的私域流量。
-
银行客户经理,是为银行创造中间收入的主力军。但是,以笔者在银行的从业经验来看,一名客户经理名下管户人数往往多达千人,而每人每个工作日可拨打的有效电话只有20个左右,毫无目的的从千人之中寻找产品的目标客户无异于大海捞针。因此,在客群管理方面,提前预测产品的潜在购买客户对于减轻客户经理工作压力,提升工作效率意义巨大。
文章概述
- 本文将先对营销结果进行数据探索性分析,理清客户的分布情况,以及客户的各个特征对于是否购买存款产品的影响。之后用XGboost对数据集做训练,建模,评估。最终将基于模型和探索性分析结果,给出可采取的精准营销措施。
数据说明
- 因数据敏感性问题,在本文中,笔者以葡萄牙银行机构的营销电话记录作为数据源
:
标签 | 说明 |
---|---|
index | 行的索引 |
age | 年龄 |
job | 职业 |
marital | 婚姻状况 |
education | 受教育程度 |
default | 是否有违约信用 |
balance | 收支情况 |
housing | 是否有住房贷款 |
loan | 是否有个人贷款 |
contact | 联系方式 |
day | 上一次联系的日期 |
month | 上一次联系的月份 |
duration | 上一次联系的持续时间,以秒为单位 |
campaign | 活动期间联系客户的次数 |
pdays | 距离上一次联系过了多少天 |
previous | 在此次活动之前同该客户的联系数量 |
poutcome | 上一次营销活动的结果 |
y | 客户是否订阅了定期存款 |
模型部分
数据和库的导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.metrics import roc_auc_score, f1_score, precision_score, recall_score, accuracy_score, auc, roc_curve
import optuna
import xgboost as xgb
warnings.filterwarnings('ignore')
data = pd.read_csv(r'./bank/bank-full.csv')
数据清洗
- 查看数据样式
data.head()
data.info()
我们看到这里的数据和特征名存在一些特殊字符,先将这些特殊符号去除。
data = data.rename(columns=lambda x: x.replace("'","").replace('"','')).replace(" ","")
for col in data.select_dtypes( 'object').columns:
data[col] = data[col].apply(lambda x:x.replace("'","").replace('""','').replace('"',''))
同时将index和age分开:
data['index,age'] = data['index,age'].str.split(',',expand=True)[1]
data.rename(columns={
'index,age':'age'},inplace=True)
data_clean = data.copy()
data_clean.age = data_clean.age.astype('int8')
data_clean.head()
font = {
'family':'SimHei','size':'15'}
plt.rc('font',**font)
plt.rc('axes',unicode_minus='False')
plt.figure(figsize = (10,5))
corr_matrix = data_clean.corr()
sns.heatmap(corr_matrix, cmap='RdBu', annot=True, vmin=-1, vmax=1)
plt.title('各变量相关系数')
plt.show()
分析结果
- 从协方差矩阵来看,仅有pdays和previous之间有较强的相关性,直接的意思是越久没联系的客户,过去联系的次数越多。出现这一情况可能是由于当下银行更多的将精力放在挖掘新客户上。而对于其他特征,仅从协方差矩阵很难得到什么实质信息。
数据探索性分析
在这一部分,笔者将对各个特征的分布情况,以及各个特征对于用户是否购买的影响情况两方面着手进行探索性分析。
定义分布直方图绘图函数方便后续分析:
def dist_plot(data, col, title):
fig, ax = plt.subplots(2, 1, sharex=True, figsize=(8,5),gridspec_kw={
"height_ratios": (.2, .8)})
ax[0].set_title(title,fontsize=18)
sns.boxplot(x=col, data=data, ax=ax[0],color = "#1D8EF5")
ax[0].set(yticks=[])
sns.histplot(x=col, data=data, ax=ax[1],color = "#33AAFF", edgecolor="#1D1EA2")
ax[1].set_xlabel(col, fontsize=16)
plt.axvline(data[col].mean(), color='darkgreen', linestyle='--',linewidth=2.2, label='mean=' + str(np.round(data[col].mean(),1