金融产品销售预测分析

背景:某金融公司新推出的理财产品,预测客户是否会接受新的产品,并提高产品的销售量。
数据:根据公司提供的用户数据,包括职业、婚姻状态房产、年龄、违约情况等数据。与近期购买的详细资料,包括金额、购买频率,时间等相关数据。
目标:根据客户的信息,将客户进行分类打上标签预测该用户是否会购买理财产品以及是否需要对该用户进行主动销售。

贷款产品分析


【一】思路&流程

对客户进行精准营销可以提高产品的销售。那么对产品分析转换为对客户的分析。
——考虑客户是否能接受新的产品,可以从两方面着手分析。
1>依据往期客户数据进行是否购买预测,二分类回归问题。
2>根据客户价值进行划分,对高价值客户加大营销力度。
根据结果可以对客户进行分群划分,降低营销成本。

流程图

【二】数据处理

1>数据探索
IO1 = r'C:\Users\Ziger\Desktop\Yian_Cinformation1782.csv'
IO2= r'C:\Users\Ziger\Desktop\Yian_details1782.csv'
data1 = pd.read_csv(IO, header=None, names=(['id','name','age','job','marital','education','default','balance','housing','loan','contact','day','month','duration','campaign','pdays','previous','poutcome','address','y'])
data2 = pd.read_csv(IO2)

根据业务常识,客户基本信息删除如ID,姓名等无关维度。
还款明细提取总计金额,购买时间,购买产品数等维度。


2>清洗数据

客户资料文本数据较多,去除缺失的数据以免影响结果。


清洗data1后
3>数据处理

文本数值化 ,本次基本信息中主要处理的是职业,学历,地址等文本信息。

data1.groupby(['job']).describe()

根据业务经验将对应的职业划分打分。

def Replace (X,columns):
    a = X.groupby([columns],as_index=False)[columns].agg({'cnt':'count'})
    for i in a[columns]:
        X[columns] = X[columns].replace(i,a[(a[columns]== i )].index.tolist()[0])
    return (X)

def Len(X,columns):
    for i in X[columns]:
        X[columns] = X[columns].replace(i,len(i))
    return (X)

将文本转化为数值

def Sigmoid (X):
    return (1.0 / (1 + np.exp(-float(X)))

数据归一化

4>相关性分析

数据处理之后,选择相关性最强的前17位维度进行分析观测

import numpy as np
import matplotlib.pyplot as plt  
import seaborn as sns  

corrmat = data.corr()                                      
k = 17                                                                                            
plt.figure(figsize=(12,9))
cols = corrmat.nlargest(k, 'y')['y'].index       
cm = np.corrcoef(data[cols].values.T)
sns.set(font_scale=1.25,font='SimHei')                                        
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', cmap='YlOrBr_r',annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)

plt.show()
相关性分析
5>提取维度

data1客户分析,将相关性较低的维度数据删除。
data2贷款记录,提取R,F,M。

import datetime as dt
now = dt.datetime(2017,11,14)

#查看交易最早-最晚日期
print(data2['Borrowing_date'].min())
print(data2['Borrowing_date'].max())

#构造交易时间间隔变量 hist
data2['hist'] = now - df['Borrowing_date']
data2['hist'].astype('timedelta64[D]')
data2['hist'] = data2['hist'] / np.timedelta64(1,'D')
data2.head()

#生成R F M 特征变量   agg()分组函数
customer = data2.groupby('customer_id').agg(['hist':'min',             #Recency
                                          'customer_id':'count',    #Frequency
                                          'tran_amount':'sum'])     #Monetary
#对变量重命名
customer.rename(columns = {'hist':'recency'
                           'customer_id':'frequency'
                           'tran_amount':'monetary'},inplace = True)
6>特征工程

验衍生出新的维度。
a. 统计每个客户使用的不同产品量,1列(目的:分析产品总数与是否购买关联)
b.统计每个客户近期的产品购买频率。(目的:分析客户的近期的资金需求量)
c. 统计客户借款金额与还款的差值。(目的:分析客户贷款产品的需求度)
.........等
对已有数据进行观测分析
eg:分析借贷时间可以针对销售时间进行调整。

plt.subplots(figsize=(12,9))
sns.countplot(x='month',,hue='day',data=data1)
借贷时间分析
7>特征筛选

本次维度较少,但是为了提高模型预测准确率,对数据进行特征整合。
考虑因子分析与主成分分析,根据模型准确率选择使用。


【三】RMF分析

1>用SPSS封装模型进行预测
2>K-Means聚类算法对客户数据进行分群
from sklearn.externals import joblib
from sklearn.cluster import KMeans
k=5
kmodel=KMeans(n_clusters=k,n_jobs=4)
kmodel.fit(customer)
r1=pd.Series(kmodel.labels_).value_counts()
r2=pd.DataFrame(kmodel.cluster_centers_)
r3=pd.Series(['group1','group2','group3','group4','group5',])
r=pd.concat([r3,r1,r2],axis=1)
    
r.columns=['聚类类别','聚类个数']+list(customer.columns)
r.to_csv(KMeans_result,encoding = 'utf_8_sig',index=False)

通过观测客户数及聚类中心,划分客户分类。

labels = np.array(list(customer.columns))
dataLenth = 5
r4=r2.T
r4.columns=list(customer.columns)
fig = plt.figure()
y=[]
for x in list(customer.columns):
    dt= r4[x]
    dt=np.concatenate((dt,[dt[0]]))
    y.append(dt)
ax = fig.add_subplot(111, polar=True)
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
ax.plot(angles, y[0], 'b-', linewidth=2)
ax.plot(angles, y[1], 'r-', linewidth=2)
ax.plot(angles, y[2], 'g-', linewidth=2)
ax.plot(angles, y[3], 'y-', linewidth=2)
ax.plot(angles, y[4], 'm-', linewidth=2)
plt.rcParams['font.sans-serif']=['SimHei'] 
ax.legend(r3,loc=1)
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
ax.set_title("Customer_loan", va='bottom', fontproperties="SimHei")
ax.grid(True)
plt.show()
3>综合分析

根据2次结果综合考虑,将5类客户打上标签,划分价值群。


【四】建模预测

二分类问题考虑逻辑回归与随机森林进行训练。
交叉验证

from sklearn import cross_validation
X = data1 
Y1 = X['y']
X1 = X.drop(['y'],axis = 1)
X1_train, X1_test, y1_train, y1_test = \
cross_validation.train_test_split( X1, Y1, test_size=0.3, random_state=0)

设置early stop round 提前停止迭代参数,防止过拟合,其他参数采用随机搜索寻优。

def LR(X_train, X_test, y_train, y_test):   
    from sklearn.linear_model import LogisticRegression
    lor = LogisticRegression(penalty='l1',C=100,multi_class='ovr') 
    lor.fit(X_train, y_train)
    predicted= lor.predict(X_test)
    score = accuracy_score(y_test, predicted)
    return (score) 

def RF(X_train, X_test, y_train, y_test):  
    from  sklearn.ensemble  import  RandomForestClassifier
    model= RandomForestClassifier(n_estimators=100)
    model.fit(X_train, y_train)
    predicted= model.predict(X_test)
    score = accuracy_score(y_test, predicted)
    return (score)

优化参数,提高预测的准确率。


【五】总结分析

1>销售策略

①考虑模型预测结果,对预测会购买的客户进行营销。
②RFM分群后,针对资金量高,购买频繁的高价值客户进行定向宣传。
③考虑特殊维度的影响力,改变销售策略。(如:贷款热门时间段,贷款人年龄)

2>不足


②数据缺失值与异常值较少,但本身维度较少,特征工程中选择面较少。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 设了个定时器,每一秒钟向后台请求一次数据并刷新tablesorter,同时让tablesorter以第5列数字倒序...
    KardelShaw阅读 905评论 0 0
  • 问世间情为何物,直教鹊桥难度相思苦 画的有点渣。。。 给大家看下原图好了 玲珑骰子安红豆 入骨相思君知否?
    清寒w阅读 441评论 19 12
  • 现在学会了心理暗示,所以做很多事情,都会给自己心理暗示。跟自己对话,暗示自己“无论成败,都是一条好汉”。 一 前些...
    枚橙roro阅读 1,804评论 7 2