MySQL实战演练——如何才能构建逾期用户画像?数据可视化
Posted 报告,今天也有好好学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL实战演练——如何才能构建逾期用户画像?数据可视化相关的知识,希望对你有一定的参考价值。
必须要看的前言
上篇文章讲完了50道LeetCode的题目,那本篇文章,就带大家真实地实战一下。
项目来源:
https://www.heywhale.com/mw/dataset/5eaf73b9366f4d002d74df08
注:这是拍拍贷互联网金融训练营提供的一份数据,为拍拍贷真实业务数据,但仅为信用标的一个样本,仅供数据分析和学术研究目的使用,而非信息披露。从这个数据中推导得到的结果不反映拍拍贷平台的整体情况,也不代表拍拍贷官方的态度。
数据是从2015-01-01到2017-01-30的所有信用标的10%样本。
在正式开始介绍和分析前,我先用xmind画了一个思维导图,具体如下:
那这次的项目,我不打算用到python,我尝试了mysql+EXCEL,具体项目介绍及实现如下。
1 背景描述
互联网金融行业,逾期率一直是影响其发展的主要原因,所以如何通过现有的数据分析逾期用户画像来进行客户筛选就显得格外重要,通过各个不同维度分析不良贷款情况,以及放贷比例,从而为企业更好的做决策提供参考意见。
2 业务指标
金融行业风险业务指标尤为关键。风险业务指标包括:逾期天数DPD、逾期期数、逾期阶段、即期指标、递延指标、月底结算、期末结算、延滞率、不良贷款率、转呆账率、净损失率、FPD(首次还款逾期)。
3 数据描述
这里是用到项目中提供的LCIS数据集,具体字段含义如下表所示。
4 提出问题
4.1 用户角度
- 失信用户画像:初始认证等级、年龄、性别、学历等维度的逾期占比分布情况;
- 失信用户行为分析:是否开淘宝店;是否有征信报告;是否完成本人认证;是否第一次借款;
4.2 业务角度
- 不良贷款率随记录时间变化趋势
- 不良贷款率与年龄、性别之间的相关性分析,以及各年龄段、性别的放贷比列;
- 不良贷款率与初始评级之间的相关性分析,以及初始评级的放贷比列;
- 不良贷款率与借款类型、利率、金额、期限之间的相关性分析,以及放贷比例
基于以上信息,我从用户画像以及不良贷款率两个业务指标出发,按照以下思路进行分析。
选择以下16个维度对数据进行分析:借款金额、借款期限、借款利率、初始评级、借款类型、是否首标、年龄、性别、手机认证、户口认证、视频认证、学历认证、征信认证、淘宝认证、标当前逾期天数、待还本金。
5 数据清洗
5.1 导入数据
首先将csv文件导入数据库当中,这里我用到的是Navicat。
5.2 字段重命名
ALTER TABLE lcis change ListingId 客户编号 char(10);
ALTER TABLE lcis change recorddate 记录日期 date;
将英文字段 ListiingId,recorddate 改为中文字段,方便后面sql查询。
5.3 缺失值、重复值处理
#查看重复值
SELECT 记录日期,count(*),count(DISTINCT 客户编号),count(客户编号),count(借款金额),
count(借款期限),count(借款利率),count(初始评级),count(借款类型),count(是否首标),
count(年龄),count(性别),count(手机认证),count(户口认证),count(视频认证),count(学历认证),
count(征信认证),count(淘宝认证),count(标当前逾期天数),count(待还本金),count(记录日期)
FROM lcis
GROUP BY 记录日期
ORDER BY 记录日期;
将数据通过对记录时间特征进行分组,统计每个时间段的特征统计值,发现2016-09-30时间段的 ‘count(distinct)客户编号’ 比其余特征统计值少了106个数据,说明在该时间段存在106个重复值,可以对这106个重复值进行去重操作。
#去除重复值和缺失值
CREATE TABLE lcisnew as (SELECT DISTINCT * from lcis);
#查看结果
SELECT 记录日期,count(*),count(DISTINCT 客户编号),count(客户编号),count(借款金额),
count(借款期限),count(借款利率),count(初始评级),count(借款类型),count(是否首标),
count(年龄),count(性别),count(手机认证),count(户口认证),count(视频认证),count(学历认证),
count(征信认证),count(淘宝认证),count(标当前逾期天数),count(待还本金),count(记录日期)
FROM lcisnew
GROUP BY 记录日期
ORDER BY 记录日期;
执行上述sql语句,删除重复值和缺失值。
5.4 异常值处理
经过检查发现 户口认证、手机认证、记录时间有存在异常值。
DELETE FROM lcisnew WHERE 户口认证 not in ('未成功认证','成功认证')
or 手机认证 not in ('未成功认证','成功认证')
or 记录日期 not in ('2016-09-30','2016-10-31','2016-11-30','2016-12-31','2017-02-28')
执行上述语句删除异常值。
SELECT count(*) FROM lcisnew
删除异常值之后可以得到 lcisnew 的样本数量为291230。
6 数据分析
6.1 用户维度
6.1.1 逾期用户画像分析用户的基本信息
包括初始认证等级、年龄、性别、学历分布情况.
6.1.1.1 初始评级逾期占比分布
SELECT 初始评级,
初始评级逾期数量,
初始评级总数,
CONCAT(ROUND(初始评级逾期数量*100/初始评级总数,0),'%') AS '逾期占比'
FROM (
SELECT
初始评级,
sum(CASE WHEN 标当前逾期天数>0 THEN 1 ELSE 0 END) as '初始评级逾期数量',
sum(CASE WHEN 标当前逾期天数>0 OR 标当前逾期天数=0 THEN 1 ELSE 0 END) AS '初始评级总数'
FROM lcisnew
GROUP BY 初始评级
) AS a
从上图表中可以得出结论:
评级为E的逾期占比最大,其次是D、F、C,而AAA和AA级则基本上没有逾期状况发生。
6.1.1.2 年龄段逾期占比分布
SELECT a.年龄段,
a.年龄段逾期人数,
b.年龄段总人数,
concat(round(a.年龄段逾期人数*100/b.年龄段总人数,2),'%') AS '逾期占比'
FROM (
SELECT
(case when(年龄>=18 and 年龄<22) then '18-22'
when 年龄<28 then '22-28'
when 年龄<35 then '28-35'
when 年龄<42 then '35-42'
when 年龄<50 then '42-50'
when 年龄>=50 then '>=50'
ELSE 年龄 END) AS 年龄段,
count('年龄段') AS '年龄段逾期人数'
FROM lcisnew
WHERE 标当前逾期天数>0
GROUP BY 年龄段) AS a
INNER JOIN (
SELECT
(case when(年龄>=18 and 年龄<22) then '18-22'
when 年龄<28 then '22-28'
when 年龄<35 then '28-35'
when 年龄<42 then '35-42'
when 年龄<50 then '42,50'
when 年龄>=50 then '>=50'
ELSE 年龄 END) as 年龄段,
count('年龄段') as '年龄段总人数'
FROM lcisnew
GROUP BY 年龄段) AS b
ON a.年龄段=b.年龄段
从上图表得知,根据对年龄层进行分段,各年龄段的逾期率相对比较平均,但是不同年龄段还是存在着差异;
- 18-22 年龄段的用户的使用贷款的人数较少,且逾期率也最高;此类年龄段的年轻人贷款人数少可能由于信用意识不强,还款能力弱,导致能贷到款的人不多,就算能贷到逾期率也高;此类用户并非主力用户,应该尽量降低额度,甚至减少批款。
- 大于50岁年龄段的用户使用贷款的人数也是远远低于其余年龄段,同时其逾期率也是最低,可以看出此类用户偏向于保守,接受贷款方式的少,此类用户虽然逾期率低,但是也并非主力用户;
- 22-35 年龄段的用户使用贷款的人数占总人数75%左右,逾期率也处于比较低的水平,此类用户正处于事业期阶段,还款能力强,信用意识也比较高,所以此类用户应该算是主力用户;
6.1.1.3 性别逾期占比分布
SELECT 性别,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 性别,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 性别) as a
从上图可知,男女性别逾期占比,男生的占比较高,为3.56%,女生占比较低,为2.81%;
6.1.1.4 学历逾期占比分布
SELECT 学历认证,
学历认证逾期数量,
学历认证总数,
CONCAT( ROUND(学历认证逾期数量*100/学历认证总数,2),'%') as '逾期占比'
FROM
(SELECT 学历认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '学历认证逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '学历认证总数'
from lcisnew
GROUP BY 学历认证) as a
从上表可知,未成功认证学历的用户逾期率更高,为3.90%,成功认证学历的用户逾期率较低,为2.71%。
6.1.2 逾期用户画像分析用户行为
包括淘宝认证、征信认证、手机认证、视频认证、户口认证、是否第一次借款分布情况。
6.1.2.1 淘宝认证
SELECT 淘宝认证,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 淘宝认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 淘宝认证) as a
6.1.2.2 征信认证
SELECT 征信认证,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 征信认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 征信认证) as a
从上图表可知,未进行征信认证的用户占大多数。
6.1.2.3 手机认证
SELECT 手机认证,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 手机认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 手机认证) as a
6.1.2.4 视频认证
SELECT 视频认证,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 视频认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 视频认证) as a
6.1.2.5 户口认证
SELECT 户口认证,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 户口认证,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 户口认证) as a
6.1.2.6 是否第一次借款
SELECT 是否首标,
逾期数量,
总数,
CONCAT( ROUND(逾期数量*100/总数,2),'%') as '逾期占比'
FROM (
SELECT 是否首标,
sum(CASE WHEN 标当前逾期天数 > 0 then 1 else 0 END) as '逾期数量',
sum(CASE WHEN 标当前逾期天数 >= 0 then 1 else 0 END) as '总数'
from lcisnew
GROUP BY 是否首标) as a
对以上6个用户行为维度进行可视化:
通过对比以上用户行为的六个维度可知,
已完成淘宝验证的逾期率小于没有完成淘宝验证的,此结果符合正常猜想,如果开过淘宝网店的用户一般会更加重视其信用评价,此用户行为符合对应的较低逾期率。第一次借款的逾期率也低于不是第一次借款的,这也是符合常规猜想的。
但是征信、视频、户口完成认证的逾期率却高于没有完成认证的逾期率,其中完成征信认证的逾期率远大于未完成认证的,这几个用户行为的逾期率结果不符合常规猜想,所以尝试寻找产生该结果的原因。
重新查看不难发现,征信、视频、户口未认证的用户数量占比都在90%以上,逾期占比=逾期数/总数,由此可知未认证的用户数量基数大,逾期数对于基数大的反应不灵敏,导致未成功认证的逾期率小于成功认证的逾期率。
6.2 业务维度
6.2.1 不良贷款率随记录时间变化趋势
SELECT 记录日期,
逾期待还金额,
待还总金额,
CONCAT(round(逾期待还金额*100/待还总金额,2),'%') as '不良率'
FROM (
SELECT 记录日期,
round(sum(case when 标当前逾期天数>0 then 待还本金 ELSE 0 END),2) as '逾期待还金额',
round(sum(待还本金),2) as '待还总金额'
from lcisnew
GROUP BY 记录日期) as a
由图表可知,本次数据记录的时间是从2016/9/1到2017/2/1的不良贷款率信息,不良率基本上是逐月递增,直到2017/2/1达到最高7.38%。该现象产生的原因刚好与2016年下半年p2p暴雷情况逐步发生,很多借款人都是多头借贷,出现暴雷后,很多多头借贷的借款人,没办法借新还旧,连环效应影响了更多平台。加上国家出台严格监管手段,放款速度放缓,不良率升高。
6.2.2 年龄与性别
6.2.2.1 不良贷款率与性别、年龄段的相关性
#不良贷款与性别的相关性
SELECT 性别,
逾期待还本金,
待还总金额,
concat(round(逾期待还本金*100/待还总金额,2),'%') as '不良率'
from(
SELECT 性别,
round(sum(case when 标当前逾期天数>0 then 待还本金 else 0 end),2) as '逾期待还本金',
round(sum(待还本金),2) as '待还总金额'
from lcisnew
GROUP BY 性别) as a
#不良贷款与年龄段的相关性
SELECT 年龄段,逾期待还本金,待还总金额,
CONCAT(round(逾期待还本金*100/待还总金额,2),'%') as '不良率'
FROM (
SELECT
(case when (年龄>=18 and 年龄<22) then '18-22'
when 年龄<28 then '22-28'
when 年龄<35 then '28-35'
when 年龄<42 then '35-42'
when 年龄<50 then 运营实战B2B SaaS产品运营,如何构建目标用户画像