1、业务背景
以网贷业务为背景,跟踪每个用户从进件到最终还款之间所涉及到的所有环节,以提高审核通过率和降低还款逾期率为目标,利用单变量分析法、用户群组分析法、用户行为路径分析法,深入进行用户分析,为产品的用户运营提供数据支持。网贷的一般流程如下:
2、数据分析
2.1 单变量分析
2.1.1 业务场景
假设当前有一份放贷监控报告,报告显示最近的放款合同的首逾率有走高趋势,此时就有了这样的业务需求:通过数据探查分析制定出可以有效降低首逾率的策略。
2.1.2 分析流程
(1)首先确定分析目标,制定出降低首逾率的风控策略;
(2)提取数据分析样本,提取出更多维度的客户数据,比如客户年龄、地区等等;
(3)筛选有效变量,通过计算提升度,来筛选出较优的变量;
(4)依据上一步拟定的策略,模拟一下策略执行后的首逾率降幅,选择首逾率降幅大的变量作为重点关注调整变量。
2.1.3 常用概念解释
(1)首逾率=首期逾期的合同数/首期到了应还款的总合同数
(2)单变量分析:对每个变量单独分析,查看其对逾期的影响,从而筛选出能够较好区分好坏客户的变量,以便制定对应策略。
(3)提升度=最坏分箱的首逾客户占总首逾客户的比例/该分箱的区间客户数占比。通俗的来说就是衡量拒绝最坏的那一部分客户之后,对整体的风险控制的提升效果。提升度越高,说明该变量可以更有效的区分好坏客户,能够更少的误据好客户。
2.1.4 具体实现
-
数据集
用到的数据结构如下:
查看数据总体情况:
根据上图所示:芝麻信用分和信用卡额度使用率大部分缺失,分析这两个字段没什么意义,此处不做分析。 -
计算业务指标
首先按照实际业务需求,对每个字段进行分区,然后计算区间内的各大指标,此处用到的分析指标包括区间用户数、区间逾期用户数、区间未逾期用户数、区间用户占比、区间首逾率。结果如下:字段1-征信查询次数计算结果如下:
字段2-信用评级计算结果如下:
字段3-年龄计算结果如下:
字段4-职业计算结果如下:
字段5-工作时间计算结果如下:
计算提升度
#近半年征信查询次数
bad_rate = dt_info.iloc[dt_info['区间首逾率'].idxmax()]['区间逾期用户数']/dt_info['区间逾期用户数'].sum()
num_rate = dt_info.iloc[dt_info['区间首逾率'].idxmax()]['区间用户占比']
bad_rate/num_rate
以征信查询次数计算提升度为例,得到各个字段的提升度结果为:
征信查询次数(1.95)、信用评级(1.71)、职业(1.07)、年龄(1.06)、工作时间(1.05)
- 制定策略
上述单变量分析的结果是:近半年征信查询次数和信用评级这两个变量的提升度最高,下面看一下把这两个变量的最坏分箱的用户拒绝后,对整体逾期的影响。
(1)近半年征信查询次数
把近半年征信查询次数最坏的分箱是查询次数>=21的这部分数据,假设把这部分用户全部拒绝掉,重新计算首逾率。
new_yq_times = dt_info['区间逾期用户数'].sum() - dt_info.iloc[dt_info['区间首逾率'].idxmax()]['区间逾期用户数']
new_times = dt_info['区间用户数'].sum()- dt_info.iloc[dt_info['区间首逾率'].idxmax()]['区间用户数']
new_yq_rate = new_yq_times/new_times
old_yq_rate = dt_info['区间逾期用户数'].sum()/dt_info['区间用户数'].sum()
print('拒绝近半年征信查询次数>=21的用户之后,当前首逾率为:{}'.format(new_yq_rate))
print('原始首逾率为:{}'.format(old_yq_rate))
print('首逾率下降了:{}'.format(old_yq_rate-new_yq_rate))
返回:
拒绝近半年征信查询次数>=21的用户之后,当前首逾率为:0.2900287361718911
原始首逾率为:0.307584667705824
首逾率下降了:0.017555931533932867
即拒绝近半年征信查询次数>=21的用户之后,首逾率下降了1.8%。
(2)信用评级
信用评级最坏的分箱为ERC这部分数据,假设把这部分用户全部拒绝掉,重新计算首逾率。结果如下:
拒绝信用评级为ERC的用户之后,当前首逾率为:0.2709728076700554
原始首逾率为:0.307584667705824
首逾率下降了:0.036611860035768606
即拒绝信用评级为ERC的用户之后,首逾率下降了3.7%。
综上:根据上面的分析过程,可见,单变量分析对降低首逾率是有效果的,分析结果可以为运营部门提供参考:建议重点关注信用评级为ERC的这部分用户,深入挖掘这部分用户申请时提交的资料(维度越多越好),以便制定对应策略,降低首逾率。
2.2 用户群组分析
2.2.1 业务场景
在做用户分析时,会有这样的场景:一个用户可能一月份申请贷款1次,二月份申请贷款2次,三四月没有申请,五月份又申请了。也就是对于用户来说他的数据是一个时间面数据,而且不同用户的时间面是不相同的,开始时间经历时间都不一样,而新用户和老用户经历的产品运营情况也不一样,因此我们分析的时候需要考虑到这个因素,而群组分析可以帮助我们在时间轴上对齐用户。
2.2.2 具体过程
-
数据集
用到的数据集结构如下:
orderid:订单id
orderdate:订单日期
userid:用户id
totalcharge:金额
- 生成用户群组
(1)新增订单月份字段orderperiod;按照每个用户的订单的最早时期,生成用户群组字段cohortgroup
#新字段-orderperiod,用户订单月份
df['orderperiod'] = df['orderdate'].apply(lambda x:x.strftime("%Y-%m"))
df.set_index("userid",inplace=True)
#用户群组字段
df["cohortgroup"] = df.groupby(level=0)['orderdate'].min().apply(lambda x:x.strftime("%Y-%m"))
df.reset_index(inplace=True)
df.head()
返回
(2)根据用户群组和月份字段进行分组统计(用户数量、订单数量、购买金额)
#根据用户群组和月份字段进行分组
grouped = df.groupby(['cohortgroup','orderperiod'])
#求每个用户群下每一个月份的用户数量、订单数量、购买金额
cohorts = grouped.agg({
'userid':pd.Series.nunique,
'orderid':pd.Series.nunique,
'totalcharges':np.sum
}).rename(columns={'userid':'totalusers','orderid':'totalorders'})
cohorts.head()
返回
(3)对用户行为进行编号(首次申请编号为1,第二次申请编号为2,以此类推)
#把每个群组继续购买的日期字段进行改变
def cohort_period(df):
#给首次购买日期编号,第二次购买编号为2,第三次购买编号为3,以此类推
df['cohortperiod'] = np.arange(len(df)) + 1
return df
cohorts = cohorts.groupby(level=0).apply(cohort_period)
#得到每个群组的用户量
cohorts.reset_index(inplace=True)
cohorts.set_index(['cohortgroup','cohortperiod'],inplace=True)
cohorts.head()
返回
(4)计算留存率
#得到每个群组的用户量,取第一个用户量数据,作为留存率的分母
cohort_group_size = cohorts['totalusers'].groupby(level=0).first()
#计算每个群组的留存
user_retention = cohorts['totalusers'].unstack(0).divide(cohort_group_size,axis=1)
user_retention
返回
根据上图可知:
处于相同生命周期阶段的用户(垂直分析),留存率随着时间推移在逐渐降低;
通过比较不同的同期群,2009-02这个群组的二次留存率明显低于其他群组的二次留存率;首购时间越晚,留存期限或者说是复购频率越来越低。
2.3 用户行为路径分析
2.3.1 业务场景
以用户申请网贷为背景,以用户下载app为起点,详细查看后续路径的流向以及某个节点事件的转化情况,得到用户在网贷申请流程中各个模块的流转规律和特点,定位影响转化的主次因素,促进产品的优化与改进。
2.3.2 业务分析指标
- PV:页面浏览量,每次用户对页面或标签的点击都会记一次PV
- UV:独立访客量,。
- 注册用户数:只有注册过的用户才有可能进一步发生转化行为。
- 激活:激活用户代表一个用户在注册完成以后成功登录一次。
- 申请用户数:指活跃用户中完成贷款申请行为的用户。
- 放款用户数:指通过审核并成功放款的用户。
- 复借用户数:指借款次数超过一次的用户数。
- 放贷率:放贷用户数/申请用户数
2.3.3 具体过程
-
数据集
dt_flow(平台流量表),数据结构如下:
dt_check(贷款审核表),数据结构如下:
-
计算放贷率
按申请日期分组,分别计算新用户pt_1和老用户pt_2的放贷率,结果如下:
- 计算各节点路径转化率
#连接贷款信息表和流量表
dt_1 = pd.merge(dt_flow,pt_1,on=None,left_on='日期',right_on='申请日期')
dt_2 = pd.merge(dt_1,pt_fj,on='申请日期').drop(['日期'],axis=1)
dt_2.head()
返回各节点流量数据
统计汇总各节点流量数据
dt_3 = pd.DataFrame(dt_2.sum()[["PV","UV","注册数","激活数","新用户申请数","新用户放贷数"]]).reset_index().rename(columns={'index':'指标',0:'汇总'})
dt_3
返回
最后以漏斗图的形式展现各个节点的总体转化率:
由上图可知,随着用户行为越深入,转化率越来越低,真正申请贷款的用户仅为2%,最终能贷到款的不到0.1%,最后四个节点的转化率还有很大的提升空间。