使用R语言creditmodel包进行Vintage分析或留存率分析

article/2025/9/4 16:11:58

1 什么是vintage分析?

Vintage分析(账龄分析法)被广泛应用于信用卡及信贷行业,这个概念起源于葡萄酒,即不同年份出产的葡萄酒的品质有差异,那么不同时期开户或者放款的资产质量也有差异,其核心在于,对不同时期不同批次的资产分别跟踪,按照账龄同步对比,从而能够了解不同时期放款或发行信用卡的资产质量情况。

vintage分析从更广泛的意义来讲属于同期群分析,跟社会跟踪调查、人口学的队列分析技术,互联网运营的留存分析是类似的,具体概念不再赘述。我们直接进入主题,如何使用R语言creditmodel包做Vintage分析。

2 creditmodel包的cohort analysis模块简介

creditmodel是汉森老师开发的一个强大的R语言数据科学工具包,有数据预处理、变量衍生、数据分析、数据可视化、自动化建模五大功能模块。而今天所讲的vintage分析是creditmodel包数据分析模块的一个子模块,包括cohort_analysiscohort_tablecohort_table_plotcohort_plot四个主要函数。

3 cohort analysis 模块简介

Description

cohort_analysis cohort_analysis is for cohort(vintage) analysis.

Usage

cohort_analysis(dat, obs_id = NULL, occur_time = NULL, MOB = NULL,period = "monthly", status = NULL, amount = NULL, by_out = "cnt",start_date = NULL, end_date = NULL, dead_status = 30)cohort_table(dat, obs_id = NULL, occur_time = NULL, MOB = NULL,period = "monthly", status = NULL, amount = NULL, by_out = "cnt",start_date = NULL, end_date = NULL, dead_status = 30)

Arguments

datA data.frame contained id, occur_time, mob, status …
obs_idThe name of ID of observations or key variable of data. Default is NULL.
occur_timeThe name of the variable that represents the time at which each observation takes place.
MOBMobility of book
periodPeriod of event to analysis. Default is “monthly”
statusStatus of observations
amountThe name of variable representing amount. Default is NULL.
by_outOutput: amount (amt) or count (cnt)
start_dateThe earliest occurrence time of observations.
end_dateThe latest occurrence time of observations.
dead_statusStatus of dead observations.

4 使用vintage分析步骤

4.1 数据准备

进行vintage分析,输入的数据至少要有放款编号(loan_id), 放款时间(loan_time)、放款金额(loan_amount)和账户状态(max_overdue_days或age_overdue_days)四列。

#安装和加载creditmodel包
#install.packages("creditmodel")
library(creditmodel)
#使用read_data读入数据。
vin_dat = read_data("vin_dat.csv")
#使用creditmodel包的数据清晰模块主函数对数据进行清洗,关于数据清洗模块,以后会做详细接受,在此简单描述下各个参数的含义。
vin_dat = data_cleansing(vin_dat, obs_id = "loan_id",#主键occur_time = 'loan_time',#事件发生时间outlier_proc = FALSE,#不进行异常值处理missing_proc = FALSE,#不进行确实值处理remove_dup = FALSE,#不删除重复观测merge_cat = FALSE,#不对类别变量的类别进行合并low_var = 0.9999,#删除单一值比例大于0.9999的变量missing_rate = 0.9999 # 对缺失值比例大于0.9999的变量进行二值化处理)
#可使用creditmodel包的data_exploration函数来观察数据概貌
data_exploration(vin_dat)
>
* Observations      : 204697
* Numeric_variables : 7
* Category_variables: 1
* Date_variables    : 1
$numFeature  NMiss Miss_Rate        Max        75%     Median        25%        Min       Mean   Std
1   age_overdue_days 194695    95.11%        440        122         61         30          1         90    76
2 age_overdue_period     33     0.02%         15          0          0          0          0          0  0.87
3           loan_age     33     0.02%         15          6          3          1          0          4   3.2
4        loan_amount      0        0%     500000      60000      40000      30000       1000      47911 24279
5       loan_balance    823      0.4%     500000      53186      39046      27871        920      43112 22157
6          loan_time      0        0% 2017-09-30 2017-03-31 2016-12-29 2016-11-01 2016-06-01 2017-01-11    99
7   max_overdue_days 160974    78.64%        440         13          2          1          1         23    52
8 max_overdue_period      0        0%       15.0        0.0        0.0        0.0        0.0        0.3  0.93$charFeature  NMiss Miss_Rate                 Value1                 Value2              Value3              Value4              Value5              Value6
1 loan_id 204697      100% n2016060100000030 : 48 n2016060100000010 : 30 n1605300032102 : 16 n1606010034102 : 16 n1606020032402 : 16 n1606020034202 : 16Value7
1 (Other) : 204555
>
#使用plot_table画出数值型变量的数据概要
plot_table(data_exploration(vin_dat)$num)

在这里插入图片描述

4.2 vintage分析

4.2.1 cohort_dat表的构建

使用cohort_analysis函数来构建cohort_dat表。

cohort_dat = cohort_analysis(vin_dat,obs_id = 'loan_id',#放款编号occur_time = 'loan_time', #放款时间MOB = NULL,#month on book在账月份,找个可以自己定义为一个变量,默认以自然月为月份。period = 'monthly',#以月作为同一时期,也可按周weeklystatus = "age_overdue_days",#使用账龄末逾期天数作为状态,也为自己定义的0、1变量dead_status = 30, #逾期天数大于30天则为dead状态,若为0、1变量,此处应设为0.amount = "loan_amount", #如果以金额统计,则必须设置,此处按放款金额计算,也可以按余额by_out = 'amt',#如果以金额统计则为‘amt’,以笔数统计则为‘cnt’start_date = "2016-08-01",#统计日开始时间end_date = '2017-05-31'#统计日结束时间)

最终表结构如下:

GroupAgeTotalEventsOpeningfinal_EventsCurrent_rateEvents_rateRetention_rate
2016/8/1064766471010.15610.00931
2016/8/11646216471010.15610.03250.9985
2016/8/12645216471010.15610.03250.9969
2016/8/13642256471010.15610.03860.9923
2016/8/14638336471010.15610.0510.9861
2016/8/15630476471010.15610.07260.9737

4.2.2 画出vintage图

画出vintage图,特别简单,直接使用cohort_plot函数,输入上一步计算的cohort_dat即可。

cohort_plot(cohort_dat)

在这里插入图片描述

4.2.3 vintage表格

使用cohort_table函数得到vintage表格,其入参与cohort_analysis 入参完全一致。

vin_table = cohort_table(vin_dat, obs_id = 'loan_id', occur_time = 'loan_time', MOB = NULL,period = 'monthly', status = "max_overdue_days",dead_status = 30, amount = "loan_balance", by_out = 'amt',start_date = "2016-09-01", end_date = '2017-07-31')

最终表格如下表所示:

Cohort_Group123456789101112
2016/9/10%0.48%1.19%2.09%2.78%4.11%4.46%5.45%6.06%7.67%8.43%9.47%
2016/10/10%0.34%1.37%2.61%4.03%4.50%6.27%7.04%8.31%9.19%10.70%
2016/11/10%0.47%1.39%2.44%3.44%4.96%5.97%6.91%7.93%9.23%
2016/12/10%0.39%1.37%2.07%3.25%4.29%4.60%6.18%7.39%
2017/1/10%0.32%0.82%1.83%2.66%3.21%4.71%5.31%
2017/2/10%0.35%1.25%2.49%2.97%5.09%7.03%
2017/3/10%0.60%1.21%1.63%4.07%5.55%
2017/4/10%0.16%0.83%2.81%4.52%
2017/5/10%0.29%1.26%1.87%
2017/6/10%0.47%1.27%
2017/7/10%0.32%

4.2.4 画出vintage表格

如何优雅地画出vintage表格呢?本来只需要一步:cohort_table_plot(cohort_dat)即可,但由于汉森老师粗心大意,R语言CRAN库最新的creditmodel1.1.8版本的该函数有一些bug,不能一步画出来,因此我把修复了bug的源码贴出来,在画vintage表格前先加载这个函数。

#' cohort_table_plot
#' \code{cohort_table_plot} is for ploting cohort(vintage) analysis table.
#' @param cohort_dat  A data.frame generated by \code{cohort_analysis}.
#' @import ggplot2
#' @export
cohort_table_plot = function(cohort_dat) {#set global variablesopt = options('warn' = -1, scipen = 200, stringsAsFactors = FALSE, digits = 6) #cohort_dat[is.na(cohort_dat)] = 0#initial parametersCohort_Group = Cohort_Period = Events = Events_rate = Opening_Total = Retention_Total = cohor_dat = final_Events = m_a = max_age = NULL#plotcohort_plot = ggplot(cohort_dat, aes(reorder(paste0(Cohort_Period), Cohort_Period),Cohort_Group, fill = Events_rate)) +geom_tile(colour = 'white') +geom_text(aes(label = as_percent(Events_rate, 4)), size = 3) +scale_fill_gradient2(limits = c(0, max(cohort_dat$Events_rate)),low = love_color('deep_red'), mid = 'white',high = love_color(),midpoint = median(cohort_dat$Events_rate,na.rm = TRUE), na.value = love_color('pale_grey')) +scale_y_discrete(limits = rev(unique(cohort_dat$Cohort_Group))) +scale_x_discrete(position = "top") +labs(x = "Cohort_Period", title = "Cohort Analysis") +theme(text = element_text(size = 15), rect = element_blank()) +plot_theme(legend.position = 'right', angle = 0)return(cohort_plot)options(opt) #reset global variables
}

creditmodel包的数据可视化模块依赖ggplot2包画图,因此在画图前,别忘了加载ggplot2

vin_table = cohort_table(vin_dat, obs_id = 'loan_id', occur_time = 'loan_time', MOB = NULL,period = 'monthly', status = "max_overdue_days",dead_status = 30, amount = "loan_balance", by_out = 'amt',start_date = "2016-09-01", end_date = '2017-07-31')
cohort_table_plot(cohort_dat)

在这里插入图片描述


5总结

R语言creditmodel包是集变量衍生、数据预处理、数据分析、建模、数据可视化为一体的强大的数据科学工具包,关于该包的更深入的使用,还请关注汉森老师的公众号hansenmode

觉得本文有参考意义的同学请点个赞或者转发,以鼓励汉森老师出产更多的作品。

另外,以上分析过程所使用的数据为模拟的数据,没有任何实际参考价值。


http://chatgpt.dhexx.cn/article/MwewjZPI.shtml

相关文章

Vintage分析和迁移率模型在网贷行业的运用

Vintage 分析和迁移率模型在网贷行业的运用 网贷业务的核心竞争力来自收益与风险之间平衡点的把握,其收到消费理念、市场策略、市场消费环节影响,贯穿于产品设计、营销审批、授信、支用、还款、催收以及客户服务的全过程。风控偏好和市场竞争策略会导致不…

一文彻底理解评分卡开发中——Y的确定(Vintage分析、滚动率分析等)

评分卡已经在各大银行和公司都实际运用于业务,也有很多前辈对它进行了详细的阐述。本文将从支付和信贷评分卡建立的角度,对比分析不同行业在建立评分卡时因变量Y确定的差异。让想了解评分卡的小伙伴,有一个更深刻的理解。并能举一反三&#x…

vintage的一点深入思考

vintage是资产质量分析中常用的指标,网上也有很多介绍vintage的含义、计算方法以及用法的文章。最近结合业务中的一个实际问题,对vintage曲线有了一些新的思考,所以写下来记录一下。 目录 1.业务问题 2.原因分析 3.总结 一、业务问题 业务的发…

ML之FE:Vintage曲线/Vintage分析(观察用户的全周期风险情况/明确用户风险的成熟期/确定逾期率何时趋向于稳定/从而选择合适的表现期)的简介、计算逻辑、案例应用之详细攻略

ML之FE:Vintage曲线/Vintage分析(观察用户的全周期风险情况/明确用户风险的成熟期/确定逾期率何时趋向于稳定/从而选择合适的表现期)的简介、计算逻辑、案例应用之详细攻略 目录 Vintage曲线简介—通过葡萄酒产业理解Vintage曲线 (1)、Vintage来源 (2)、Vintage曲…

vintage分析

vintage分析的由来 由于酿酒业,对于葡萄酒而言,年份不同,气候不同,生产的葡萄酒品质也不同,因此酿酒业常将葡萄的采摘年份作为品质的区分。同时,随着葡萄酒窖藏时间的增加,酒的品质也会提升。因…

对Vintage分析的一些学习理解

账龄分析(Vintage Analysis) 我目前工作主要是信贷业务相关的数据分析及算法构建,所以经常会接触到信贷风险管理分析方法,常见的包括账龄分析(Vintage Analysis)、滚动率分析(Roll Rate Analys…

ACM学习经验

首先可以说,在我认识的顶尖的 ACMer 中,很多人走的都不是在 OJ 盲目刷题的路。(当然也有特例,前提是他们的某方面基础或智商本身已经达到很高的水平。)不盲目刷题,我想原因也很简单,OJ 题目质量…

如何进行算法比赛 (持续更新)ACMER

由数据范围反推算法复杂度以及算法内容 - AcWing 1.关于时间复杂度的分析y总的总结 变量要进行初始化否则会坑你一把 还有变量的命名要注意 https://www.acwing.com/blog/content/32/ 有时候n的范围很大,但是a[i]的范围很小就可以预处理 2.首先一些奇奇怪怪的方法…

关于ACMers

ACMers那些事 ACM是什么?能吃吗? 我们所说的ACM竞赛,通常指的是国际大学生程序设计竞赛(International Collegiate Programming Contest,ICPC),ACM只是主办方的名字(国际计算机协会…

一个合格的ACMer的代码当中,都藏着哪些秘密?

作者 | 梁唐 责编 | 欧阳姝黎 今天给大家聊聊C中的头文件,之前我在写算法专题展示源代码的时候,很多小伙伴给我留言说被我的头文件中的内容震惊了。其实之所以我的头文件这么复杂,完全是因为它是我一直从大学时期acm竞赛当中沿用下来的…

ACM模板(从小白到ACMer的学习笔记)

写在开头: 2020年ICPC银川站,现场赛,第三题的字典树没能过,首站打铁,不过这一场也让我看到铜牌其实没有想象中的那么难。 2020年ICPC沈阳站,现场赛,封榜后过两题,铜首,I题…

【转】 如何提高自己的acm个人能力

转载自 简单de数字 最终编辑 fading_code by zfy0701 本来以为HNU的huicpc035和我一样退役了,后来听说他组成了新的footman队,于是又关注了下他。 035体现了两个我觉得非常重要的品质: 1、刻苦的训练 2、有效的训练 (本文将主…

ACMer必看的基础算法(附经典例题)

文章目录 一、排序算法1.冒泡排序2.选择排序3.快速排序4.桶排序 二、递归算法三、递推算法四、贪心算法五、动态规划基本模型区间dp背包问题01背包完全背包多重背包 六、分治算法二分三分 七、补充STL的简单应用结构体 一、排序算法 1.冒泡排序 【基本思想】 基本思想为两两比…

反向代理与正向代理区别

正向代理与反向代理的区别 正向代理是客户端与正向代理客户端在同一局域网,客户端发出请求,正向代理 替代客户端向服务器发出请求。服务器不知道谁是真正的客户端,正向代理隐藏了真实的请求客户端。 反向代理:服务器与反向代理在同…

Nginx反向代理与正向代理配置

一、Nginx主要功能 1、Nginx 简介 Nginx是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。主要有反向代理,负载均衡等功能。 官方网站:nginx news Nginx是一款免费开源的高性能 HTTP 代理服务器及反向代理服务器(Reverse Proxy)产品,它高…

如何解释反向代理与正向代理

概念 首先看看说明图,先有一个整体的理解。 正向代理( Forward Proxy ): 是指是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容, 客户端向代理发送一个请求并指定目标(原始服务器)&am…

反向代理设置

折腾家庭服务器,因只有一个公网ip,还要尝试设置私有云,博客,论坛,以及练习flask编程,又不想写各种端口访问,计划采取的方案是设置一个反向代理,使用子域名访问各个服务。 一、什么是…

知识积累3:什么是反向代理,如何区别反向与正向代理

一直对反射代理的反向不知道如何理解,经过百度知道,再结合下面这幅图,总算弄清楚一点了。简单的说从一个局域网出来到服务端为正向,从客户端要进入一个局域网为反向 概念: 反向代理(Reverse Proxy&#xf…

正向代理和反向代理概念及区别

正向代理和反向代理 文章目录 正向代理和反向代理前言正向代理正向代理用处 反向代理反向代理用处 总结(正反向代理的区别) 前言 总是搞不懂正向代理和反向代理应用场景,今天专门来整理一下 提示:以下是本篇文章正文内容,下面案例可供参考 正向代理 正…

nginx反向代理和正向代理的区别

nginx反向代理和正向代理的区别是什么?下面本篇文章就来给大家介绍一下,希望对你们有所帮助。 什么是正向代理? 正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向…