贷款逾期用户画像分析
数据来自拍拍贷真实业务数据。拍拍贷是美国纽交所上市公司。成立于2007年6月遵从金融本质,以数据为基石,用创新技术为用户提供最便捷可得的借款撮合服务,拍拍贷平台借款端服务包括面向广大个人用户的通用性借款和其他借款。
一、数据清洗
df_copy = df.copy()
(1)空值、重复值处理(所有的都重复)
主要关注的是标当前状态,都不存在空值
df = df.drop_duplicates()
删除106个重复值
(2)异常值处理
对指标分析的时候逐个进行处理分析,这边观察的是标状态是否存在异常值
df['标当前状态'].value_counts()
-
正常还款中 172505
-
已还清 109129
-
逾期中 9596
-
0 409
-
2.35 24
-
4.25 24
-
....
df.loc[(df['标当前逾期天数']!=0),'标当前状态'] = '逾期中'
对于0的通过观察可知都是正常还款中的
df.loc[(df['标当前状态']=='0'),'标当前状态'] = '正常还款中'
df.loc[(df['标当前状态']=='0.49'),'标当前状态'] = '正常还款中'
-
正常还款中 172915
-
已还清 109129
-
逾期中 10389
二、数据分析
本部分分析主要目的是:根据几个维度的数据构建逾期用户画像
1、用户维度
这部分主要关注的是是否逾期,做定性分析,因此创建一个新的数据
df.loc[df['标当前状态']=='逾期中','是否逾期'] = '逾期中'
df.loc[df['标当前状态']!='逾期中','是否逾期'] = '未逾期'
用户基本信息
(1)性别
df_sex = df.groupby('性别')['是否逾期'].value_counts()
df_sex = pd.DataFrame(df_sex.unstack(level=1))
df_sex['逾期占比'] = df_sex['逾期中']/(df_sex['逾期中'] + df_sex['未逾期'])
df_sex['总人数'] = df_sex['逾期中'] + df_sex['未逾期']
贷款中男、女分别占65.08%和34.92%。
plt.pie(df_sex['总人数'],labels=['女','男'],autopct='%.2f%%')
image
df_sex['逾期占比'].plot(kind='bar',rot=1,alpha=0.6)
image
男逾期占比为3.79%,女逾期占比为3.11%。从逾期占比情况来看,男逾期占比高于女22%。因此在后续分析中将男、女进行分开分析。
(2)年龄
df['年龄'].describe()
-
mean 29.353838
-
std 6.164796
-
min 18.000000
-
25% 25.000000
-
50% 28.000000
-
75% 32.000000
-
max 65.000000
年龄分布最小18岁,最大65岁,平均年龄29.35岁
sns.distplot(df['年龄'],label='整体年龄分布')
sns.distplot(df[df['是否逾期'] =='逾期中']['年龄'],label='逾期人员年龄分布',color='r')
plt.legend()
image
从图中可知,逾期人员年龄分布与整体年龄、男女性年龄分布相似。因此在这边考虑对年龄进行统一划分处理:18-23,24-29,30-35,36-41,42-47,48-53,54-59,60-65
labels = ['18-23','24-29','30-35','36-41','42-47','48-53','54-59','60-65']
bin_age = [18,24,30,36,42,48,54,60,66]
df['年龄段'] = pd.cut(df['年龄'],bins=bin_age,labels=labels,right=False)
df_age = df.groupby(['年龄段','性别'])['是否逾期'].value_counts()
df_age = df_age.unstack(level=2)
df_age['逾期占比%'] = round(df_age['逾期中']/(df_age['逾期中']+df_age['未逾期'])*100,2)
image
image
男性不同年龄段逾期占比:
df_age[('逾期占比%','男')].sort_values(ascending=False).plot(kind='bar',title='男性不同年龄段逾期占比%')
y = df_age[('逾期占比%','男')].sort_values(ascending=False)
y = y.dropna()
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.4,j+0.1,'%.2f%%'%j)
')
image
男性逾期率高的年龄段为54-59,逾期占比为7.9%,其次是42-47、18-23、36-41(均高于平均值)。
由于54-59岁的男性逾期率非常高,因此在这边做进一步观察:
df[(df['年龄段'] =='54-59')&(df['是否逾期']=='逾期中')&(df['性别']=='男')]
54-59岁男性中,所有用户借款利率在18%及以上,借款类型属于普通或者其他,83%的用户借款期限为12个月,91%的借款金额在7000及以上,初级评分为B、C、D类。
女性不同年龄段逾期占比:
df_age[('逾期占比%','女')].sort_values(ascending=False).plot(kind='bar',title='女性不同年龄段逾期占比%')
y = df_age[('逾期占比%','女')].sort_values(ascending=False)
y = y.dropna()
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.4,j+0.1,'%.2f%%'%j)
image
女性逾期占比较高的年龄段是:48-53,其次是36-41,42-47,30-35均高于平均值。
(3)初级评级——逾期占比
女性初始评级逾期占比:
df_pre = df.groupby(['性别','初始评级'])['是否逾期'].value_counts()
df_pre = df_pre.unstack(level=2)
df_pre['逾期占比'] = df_pre['逾期中'] / (df_pre['逾期中'] + df_pre['未逾期'])
df_pre_f = df_pre.loc['女',:].sort_values(by='逾期占比%',ascending=False)
sns.barplot(df_pre.index,df_pre['逾期占比'])
image
女性最高位E类,其次是D、C(均超过平均值)
同样由于E类人群中逾期占比非常高,在这也做进一步观察
df[(df['初始评级']=='E')&(df['是否逾期']=='逾期中')&(df['性别']=='女')]
观察知,这类人群:
-
年龄段:40岁以下
-
借款金额:2000-10000元
-
借款类型:普通或其他
-
借款期限:95%的都是12个月
男性初始评级逾期占比:
image男性最高是E类,其次是F、D、G、A类均高于平均值
进一步观察E类
df[(df['初始评级']=='E')&(df['是否逾期']=='逾期中')&(df['性别']=='男')]
-
年龄段:45岁以下
-
借款金额:80%的2000-5000元
-
借款类型:98%普通或其他
-
借款期限:91%的都是12个月
各初始评级中年龄段分布情况相似
g = sns.FacetGrid(df, col='初始评级',row = '性别',palette='seismic', size=4)
g.map(sns.countplot, '年龄段', alpha=0.8)
g.add_legend()
image
从初始评级与逾期占比的情况来看,初始评级在一定程度上能够衡量逾期占比情况,像AA、AAA类的逾期占比都比较低。
2、用户行为属性
(1)借款类型
借款类型中普通和其他类占了近72%。
imagedf_type = df.groupby(['性别','借款类型'])['是否逾期'].value_counts()
df_type = df_type.unstack(level=2)
df_type['逾期占比'] = df_type['逾期中']/(df_type['逾期中']+df_type['未逾期'])
df_type['逾期占比%'] = df_type['逾期中']/(df_type['逾期中']+df_type['未逾期'])*100
y = df_type.loc['女',:]['逾期占比'].sort_values(ascending=False)
sns.barplot(y.index,y,alpha=0.8)
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.4,j+0.1,'%.2f%%'%j)
plt.title('女性借款类型逾期占比')
plt.legend()
image
女性用户借款类型为电商类的逾期占比最高,其次是APP闪电类,这可能和女性用户网购频率高、数目大有关。可以进一步通过挖掘这些用户的网购习惯进行分析。
y = df_type.loc['男',:]['逾期占比'].sort_values(ascending=False)
sns.barplot(y.index,y,alpha=0.8)
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.4,j+0.1,'%.2f%%'%j)
plt.title('男性借款类型逾期占比')
plt.legend()
image.png
男性用户借款类型为APP闪电类的逾期占比最高,其次是其他类,这可能和男性用户玩游戏,对游戏充值有关。
(2)借款期限
男:
df_time = df.groupby(['性别','借款期限'])['是否逾期'].value_counts()
df_time = df_time.unstack(level=2)
df_time['逾期占比'] = df_time['逾期中']/(df_time['逾期中']+df_time['未逾期'])
df_time['逾期占比%'] = df_time['逾期中']/(df_time['逾期中']+df_time['未逾期'])*100
y = df_time.loc['男',:]['逾期占比%'].sort_values(ascending=False)
plt.figure(figsize=(10,5))
y.plot(kind='bar',alpha=0.6,rot=1)
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.5,j+0.2,'%.2f%%'%j)
plt.title('女性借款日期逾期占比%')
plt.legend()
image
女:
y = df_time.loc['女',:]['逾期占比%'].sort_values(ascending=False)
plt.figure(figsize=(10,5))
y.plot(kind='bar',alpha=0.6,rot=1)
x = len(y)
for i,j in zip(range(x),y):
plt.text(i-0.5,j+0.2,'%.2f%%'%j)
plt.title('男性借款日期逾期占比%')
plt.legend()
image
男、女借款期限为24个月的逾期占比最高。进一步观察借款期限为24个月的用户,发现这批用户
-
年龄段:70%30-41岁
-
借款金额:90%的借款金额在24000及以上元
-
借款类型:普通或其他
-
初始评级:64%的是C
(3)借款金额
将借款金额按人数平均分成四个区间,分别是:100-3000/3001-4170/4170-7000/7000+
df['借款金额区间'] = pd.qcut(df['借款金额'],4)
df_money = df.groupby(['性别','借款金额区间'])['是否逾期'].value_counts()
df_money = df_money.unstack(level=2)
df_money['逾期占比'] = df_money['逾期中']/(df_money['逾期中']+df_money['未逾期'])
df_money['逾期占比%'] = df_money['逾期中']/(df_money['逾期中']+df_money['未逾期'])*100
女性
image男性
image男女性借款金额来看,100-3000的低金额借款的逾期占比都比较高。
三、结论——构建用户画像
总结论1:逾期占比分布最高的男性用户普遍的标签为:
-
年龄段为54-59岁;
-
初始评级为E类;
-
借款类型为APP闪电;
-
借款期限为24个月;
-
借款金额区间在3000元及以下;
总结论2:逾期占比分布最高的女性用户普遍的标签为:
-
年龄段为48-53岁;;
-
初始评级为E类;
-
借款类型为电商;
-
借款期限为24个月;
-
借款金额区间在3000元及以下;
总结论3:
-
总结论1和总结论2的标签满足3个及以上可以考虑为逾期率较高的人群;
-
对于逾期占比特别高的几类人可以做进一步的细分(在文中已经进行了部分的分析);
-
本文分析中由于不同年龄段内人数差异大,因此可以考虑在性别的基础上对不同年龄段进行分析,得到在性别和年龄段下的用户标签;