(金融)线上借贷业务用户行为转化与风控用户项目——数据分析
用户行为路径分析
一种监测用户流向,从而统计产品使用深度的分析方法。 它主要根据每位用户在App或网站中的点击行为日志,分析用户在App或网站中各个模块的流转规律与特点,挖掘用户的访问或点击模式,进而实现一些特定的业务用途,如App核心模块的到达率提升、特定用户群体的主流路径提取与浏览特征刻画,App产品设计的优化与改版等。
用户行为指标
PV(Page View)/ UV(Unique Visitor):分别指页面浏览量和独立访客量,每次用户对页面或标签的点击都会记一次PV。 注册用户数:只有注册过的用户才有可能进一步发生转化行为。一个平台的注册用户数衡量了该平台当前已经积累的有效用户的数量。 激活/活跃用户数:激活用户代表一个用户在注册完成以后成功登录一次。而活跃用户代表一个用户在登录后完成了访问。 申请/放款用户数:活跃用户中的一部分会完成贷款申请行为,这部分用户被记为申请用户。申请用户会被审核,通过审核并成功放款的用户会记为放款用户。 复借用户数:指借款次数超过一次的用户数。复借行为往往也需要结合时间维度进行考量,因为用户复借行为出现的时间并不是固定的。
import pandas as pd
import numpy as np
import sqlalchemy
import warnings
warnings. filterwarnings( 'ignore' )
〇、读取数据
engine= sqlalchemy. create_engine( 'mysql+pymysql://id:password@localhost:3306/database' )
sql_flow= 'select * from plat_flow'
sql_check= 'select * from loans_check'
df_flow= pd. read_sql( sql= sql_flow, con= engine)
df_check= pd. read_sql( sql= sql_check, con= engine)
df_flow. rename( columns= { 'date' : '日期' ,
'PV' : 'PV' ,
'UV' : 'UV' ,
'regist_cnt' : '注册量' ,
'regist_rate' : '访客注册率' ,
'active_cnt' : '激活量' ,
'active_rate' : '激活访问率' } , inplace= True )
df_check. rename( columns= { 'ID' : '用户ID' ,
'date' : '申请日期' ,
'new_cus' : '是否新用户(1为是,0为否)' ,
'lending' : '是否放贷' } , inplace= True )
df_flow. head( )
日期 PV UV 注册量 访客注册率 激活量 注册激活率 0 2020-05-01 7121 1972 375 0.190162 341 0.909333 1 2020-05-02 6340 1910 210 0.109948 183 0.871429 2 2020-05-03 6473 1834 183 0.099782 174 0.950820 3 2020-05-04 8544 3195 415 0.129890 349 0.840964 4 2020-05-05 3749 1106 177 0.160036 168 0.949153
df_check. head( )
用户ID 申请日期 是否新用户(1为是,0为否) 是否放贷 0 1 2020-05-01 1 0 1 2 2020-05-01 1 1 2 3 2020-05-01 1 1 3 4 2020-05-01 1 0 4 5 2020-05-01 1 0
一、计算每日申请贷款人数、审批贷款人数、放贷率
df_check_1= df_check[ df_check[ '是否新用户(1为是,0为否)' ] == 1 ]
df_check_0= df_check[ df_check[ '是否新用户(1为是,0为否)' ] == 0 ]
pt_new= pd. pivot_table( data= df_check_1,
index= [ '申请日期' ] ,
values= [ '是否放贷' ] ,
aggfunc= [ sum , 'count' ] )
pt_new. columns= pt_new. columns. droplevel( 0 )
pt_new. columns= [ '新用户放贷数' , '新用户申请数' ]
pt_new[ '新用户放贷率' ] = pt_new. 新用户放贷数/ pt_new. 新用户申请数
pt_new= pt_new. reset_index( )
pt_new. head( )
申请日期 新用户放贷数 新用户申请数 新用户放贷率 0 2020-05-01 56 228 0.245614 1 2020-05-02 26 126 0.206349 2 2020-05-03 12 124 0.096774 3 2020-05-04 43 234 0.183761 4 2020-05-05 22 116 0.189655
pt_old= pd. pivot_table( data= df_check_0,
index= [ '申请日期' ] ,
values= [ '是否放贷' ] ,
aggfunc= [ sum , 'count' ] )
pt_old. columns= pt_old. columns. droplevel( 0 )
pt_old. columns= [ '老用户放贷数' , '老用户申请数' ]
pt_old[ '老用户放贷率' ] = pt_old. 老用户放贷数/ pt_old. 老用户申请数
pt_old= pt_old. reset_index( )
pt_old. head( )
申请日期 老用户放贷数 老用户申请数 老用户放贷率 0 2020-05-01 5 13 0.384615 1 2020-05-02 5 14 0.357143 2 2020-05-03 0 3 0.000000 3 2020-05-04 3 10 0.300000 4 2020-05-05 3 7 0.428571
二、计算老客户复借率
old= list ( pt_new[ '新用户放贷数' ] ) [ 0 : 29 ]
old. insert( 0 , 24 )
dt_old= pd. DataFrame( { '申请日期' : list ( pt_old[ '申请日期' ] ) , '老用户数' : old} )
pt_old_month= pd. merge( pt_old, dt_old, how= 'left' , on= '申请日期' )
pt_old_month[ '老用户复借率' ] = pt_old_month. 老用户申请数/ pt_old_month. 老用户数
pt_old_month. head( )
申请日期 老用户放贷数 老用户申请数 老用户放贷率 老用户数 老用户复借率 0 2020-05-01 5 13 0.384615 24 0.541667 1 2020-05-02 5 14 0.357143 56 0.250000 2 2020-05-03 0 3 0.000000 26 0.115385 3 2020-05-04 3 10 0.300000 12 0.833333 4 2020-05-05 3 7 0.428571 43 0.162791
三、计算各节点路径转化率并绘图
dt= pd. merge( df_flow, pt_new, how= 'left' , on= None , left_on= '日期' , right_on= '申请日期' )
dt_1= dt. merge( pt_old, how= 'left' , on= '申请日期' )
dt_1= dt_1. drop( [ '申请日期' ] , axis= 1 )
dt_1. head( )
日期 PV UV 注册量 访客注册率 激活量 注册激活率 新用户放贷数 新用户申请数 新用户放贷率 老用户放贷数 老用户申请数 老用户放贷率 0 2020-05-01 7121 1972 375 0.190162 341 0.909333 56 228 0.245614 5 13 0.384615 1 2020-05-02 6340 1910 210 0.109948 183 0.871429 26 126 0.206349 5 14 0.357143 2 2020-05-03 6473 1834 183 0.099782 174 0.950820 12 124 0.096774 0 3 0.000000 3 2020-05-04 8544 3195 415 0.129890 349 0.840964 43 234 0.183761 3 10 0.300000 4 2020-05-05 3749 1106 177 0.160036 168 0.949153 22 116 0.189655 3 7 0.428571
dt_2= dt_1. drop( [ '日期' ] , axis= 1 )
dt_2. loc[ 'row_sum' ] = dt_2. apply ( lambda x: x. sum ( ) )
dt_3= dt_2[ dt_2. index== 'row_sum' ] [ [ 'PV' , 'UV' , '注册量' , '激活量' , '新用户申请数' , '新用户放贷数' ] ]
dt_4= dt_3. T. reset_index( )
dt_4. columns= [ '指标' , '汇总' ]
dt_4
指标 汇总 0 PV 130380.0 1 UV 37689.0 2 注册量 5151.0 3 激活量 4535.0 4 新用户申请数 3113.0 5 新用户放贷数 594.0
from plotly import graph_objects as go
trace= go. Funnel( x= dt_4[ '汇总' ] ,
y= dt_4[ '指标' ] ,
textinfo= 'value+percent initial' ,
marker= dict ( color= [ 'skyblue' , 'lightsalmon' , 'moccasin' , 'teal' , 'silver' , 'gainsboro' ] ) ,
connector= { 'line' : { 'color' : 'gold' , 'dash' : 'solid' , 'width' : 1 } } )
data= [ trace]
plt= go. Figure( data)
plt. show( )