精华内容
下载资源
问答
  • 本文主要讲“变量选择”“模型开发”“评分卡创建和刻度” 变量分析 首先,需要确定变量之间是否存在共线性,若存在高度相关性,只需保存最稳定、预测能力最高的那个。需要通过 VIF(variance inflation ...

    这里写图片描述

    本文主要讲“变量选择”“模型开发”“评分卡创建和刻度”

    变量分析

    首先,需要确定变量之间是否存在共线性,若存在高度相关性,只需保存最稳定、预测能力最高的那个。需要通过 VIF(variance inflation factor)也就是 方差膨胀因子进行检验。
    变量分为连续变量和分类变量。在评分卡建模中,变量分箱(binning)是对连续变量离散化(discretization)的一种称呼。要将logistic模型转换为标准评分卡的形式,这一环节是必须完成的。信用评分卡开发中一般有常用的等距分段、等深分段、最优分段。

    单因子分析,用来检测各变量的预测强度,方法为WOE、IV;

    WOE

    WOE(weight of Evidence)字面意思证据权重,对分箱后的每组进行。假设good为好客户(未违约),bad为坏客户(违约)。
    woe公式
    #good(i)表示每组中标签为good的数量,#good(T)为good的总数量;bad相同。

    这里说一下,有的地方计算WOE时使用的是 b a d 占 比 g o o d 占 比 \frac{bad占比}{good占比} goodbad的,其实是没有影响的,因为我们计算WOE的目的其实是通过WOE去计算IV,从而达到预测的目的。后面IV计算中,会通过相减后相乘的方式把负号给抵消掉。所以不管谁做分子,谁做分母,最终的IV预测结果是不变的。

    IV

    IV(information value)衡量的是某一个变量的信息量,公式如下:
    iv公式
    N为分组的组数;
    IV可用来表示一个变量的预测能力。

    IV预测能力
    <0.03无预测能力
    0.03~0.09
    0.1~0.29
    0.3~0.49
    >=0.5极高

    根据IV值来调整分箱结构并重新计算WOE和IV,直到IV达到最大值,此时的分箱效果最好。

    分组一般原则

    1. 组间差异大
    2. 组内差异小
    3. 每组占比不低于5%
    4. 必须有好、坏两种分类

    举例说明

    例如按年龄分组,一般进行分箱,我们都喜欢按照少年、青年、中年、老年几大类进行分组,但效果真的不一定好:

    AgegoodbadWOE
    <185040 l n ( 50 / 330 40 / 220 ) = − 0.182321556793955 ln(\frac{50/330}{40/220}) = -0.182321556793955 ln(40/22050/330)=0.182321556793955
    18~3010060 l n ( 100 / 330 60 / 220 ) = 0.105360515657826 ln(\frac{100/330}{60/220}) = 0.105360515657826 ln(60/220100/330)=0.105360515657826
    30~6010080 l n ( 100 / 330 80 / 220 ) = − 0.182321556793955 ln(\frac{100/330}{80/220}) = -0.182321556793955 ln(80/220100/330)=0.182321556793955
    >608040 l n ( 80 / 330 40 / 220 ) = 0.287682072451781 ln(\frac{80/330}{40/220}) = 0.287682072451781 ln(40/22080/330)=0.287682072451781
    ALL330220

    计算
    根据IV值可以看出,预测能力低,建议重新调整分箱。

    建立模型

    先进行数据划分,一般70%训练集、30%测试集。训练集用于训练模型,测试集用于检测训练后的模型。
    一般采用Logistic Regression建立模型,训练模型。将建好的模型对待测样本进行预测。
    模型创建标准

    评分卡

    评分卡计算方法

    odds为good用户概率(p)与bad用户概率(1-p)的比值。
    o d d s = 好 客 户 概 率 坏 客 户 概 率 = p 1 − p odds=\frac{好客户概率}{坏客户概率}=\frac{p}{1-p} odds==1pp
    评分卡设定的分值刻度可以通过将分值表示为比率对数的线性表达式来定义。公式如下:
    s c o r e 总 = A + B ∗ l n ( o d d s ) score_总=A+B*ln(odds) score=A+Bln(odds)
    注:若odds是 好 客 户 概 率 坏 客 户 概 率 \frac{好客户概率}{坏客户概率} ,odds应取倒数,再经过 l n ln ln转换则B前面是减号。所以有的地方此公式B前为负号。

    设置比率为 θ 0 \theta_0 θ0(也就是odds)的特定点分值为 P 0 P_0 P0,比率为 2 θ 0 2\theta_0 2θ0的点的分值为 P 0 + P D O P_0+PDO P0+PDO。带入上面公式可得到:
    { P 0 = A + B l n ( θ 0 ) P 0 + P D O = A + B l n ( 2 θ 0 ) \begin{cases} P_0 &= A+Bln(\theta_0) \\ P_0+PDO &= A+Bln(2\theta_0) \end{cases} {P0P0+PDO=A+Bln(θ0)=A+Bln(2θ0)
    求解上述公式,可以得到A、B值:
    { B = P D O l n 2 A = P 0 − B l n ( θ 0 ) \begin{cases} B &= \frac{PDO}{ln2} \\ A &= P_0-Bln(\theta_0) \end{cases} {BA=ln2PDO=P0Bln(θ0)

    P 0 P_0 P0 P D O PDO PDO 的值都是已知常数,可以设置 P 0 = 600 P_0 = 600 P0=600 P D O = 20 PDO = 20 PDO=20
    可以计算出A、B值。
    这里 P 0 P_0 P0 P D O PDO PDO 主要是根据你想要分数落在一个什么范围内,然后进行人为设定,不用太纠结取值的意义。

    分值分配

    在实际的应用中,我们会计算出每个变量的各分箱对应的分值。新用户产生时,对应到每个分箱的值,将这些值相加,最后加上初始基础分,得到最终的结果。
    如果用户某个变量发生改变,由一个分箱变成另一个,只需将更新后所在分箱的值做替换,再重新相加即可得到新的总分。

    我们都知道,假设模型结果为p,根据Logistic Regression计算公式有:
    p = 1 1 + e − θ T x p = \frac{1}{1+e^{-\theta^Tx}} p=1+eθTx1
    经过转换得到
    l n ( p 1 − p ) = θ T x ln(\frac{p}{1-p})=\theta^Tx ln(1pp)=θTx
    由于上面提到的公式
    l n ( p 1 − p ) = l n ( o d d s ) ln(\frac{p}{1-p})=ln(odds) ln(1pp)=ln(odds)
    所以
    l n ( o d d s ) = θ T x = w 0 + w 1 x 1 + ⋅ ⋅ ⋅ + w n x n ln(odds)=\theta^Tx =w_0+w_1x_1+···+w_nx_n ln(odds)=θTx=w0+w1x1++wnxn
    这里带入评分卡公式,
    s c o r e 总 = A + B ∗ ( θ T x ) = A + B ∗ ( w 0 + w 1 x 1 + ⋅ ⋅ ⋅ + w n x n ) score_总 = A+B*(\theta^Tx)=A+B*(w_0+w_1x_1+···+w_nx_n) score=A+B(θTx)=A+B(w0+w1x1++wnxn)
    = ( A + B ∗ w 0 ) + B ∗ w 1 x 1 + ⋅ ⋅ ⋅ + B ∗ w n x n =(A+B*w_0)+B*w_1x_1+···+B*w_nx_n =(A+Bw0)+Bw1x1++Bwnxn
    这里 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn是Logistic Regression中不同变量 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn的系数。 w 0 w_0 w0是截距。
    ( A + B ∗ w 0 ) (A+B*w_0) (A+Bw0)为基础分数, B ∗ w 1 x 1 , ⋅ ⋅ ⋅ , B ∗ w n x n B*w_1x_1,···,B*w_nx_n Bw1x1,,Bwnxn为每个变量对应分配到的分数。

    之前步骤中每个变量都有进行分箱操作,分为若干类。所以下一步的话,把每个变量对应的分数,分别乘以变量中每个分箱的WOE,得到每个分箱的评分结果。

    变量分箱类别分值
    基础分数- ( A + B ∗ w 0 ) (A+B*w_0) (A+Bw0)
    x 1 x_1 x11
    2

    i i i
    ( B ∗ w 1 ) ∗ W O E 11 (B*w_1)*WOE_{11} (Bw1)WOE11
    ( B ∗ w 1 ) ∗ W O E 12 (B*w_1)*WOE_{12} (Bw1)WOE12
    ···
    ( B ∗ w 1 ) ∗ W O E 1 i (B*w_1)*WOE_{1i} (Bw1)WOE1i
    x 2 x_2 x21
    2

    j j j
    ( B ∗ w 2 ) ∗ W O E 21 (B*w_2)*WOE_{21} (Bw2)WOE21
    ( B ∗ w 2 ) ∗ W O E 22 (B*w_2)*WOE_{22} (Bw2)WOE22
    ···
    ( B ∗ w 2 ) ∗ W O E 2 j (B*w_2)*WOE_{2j} (Bw2)WOE2j
    ·········
    x n x_n xn1
    2

    k k k
    ( B ∗ w n ) ∗ W O E n 1 (B*w_n)*WOE_{n1} (Bwn)WOEn1
    ( B ∗ w n ) ∗ W O E n 2 (B*w_n)*WOE_{n2} (Bwn)WOEn2
    ···
    ( B ∗ w n ) ∗ W O E n k (B*w_n)*WOE_{nk} (Bwn)WOEnk

    以上步骤都完成后,假如新产生一个用户,我们只需将此用户每个变量对应到各分箱中得到其对应的WOE值,再根据上面的公式计算出这个样本在每个变量下的分数。最后将所有变量对应的分数相加,即为最终评分结果。

    最后说一下,特征选择方面,并不是维度越多越好。一个评分卡中,一般不超过15个维度。可根据Logistic Regression模型系数来确定每个变量的权重,保留权重高的变量。通过协方差计算的相关性大于0.7的变量一般只保留IV值最高的那一个。

    引用
    《信用风险评分卡研究》Mamdouh Refaat著
    《互联网金融时代消费信贷评分建模与应用》单良著
    手把手教你用R语言建立信用评分模型
    《统计学习方法》李航著

    展开全文
  • 关于风控中信用评分卡的概念和设计思路的介绍论文
  • 构建风控评分卡模型介绍(WOE/KS/ROC)

    万次阅读 多人点赞 2018-03-26 15:52:03
    根据使用场景分为反欺诈评分卡、申请评分卡、行为评分卡、催收评分卡 为什么要开发评分卡 风险控制的一个环节,根据已有数据提供逾期概率指标参考 评分卡的特性 稳定性 预测能力 等价于逾期概率 评分卡开发的...

    完整代码请关注公众号回复“评分卡”获得。

    有酒有风

    什么是评分卡(信贷场景中)

    1. 以分数的形式来衡量风险几率的一种手段
    2. 对未来一段时间内违约/逾期/失联概率的预测
    3. 通常评分越高越安全
    4. 根据使用场景分为反欺诈评分卡、申请评分卡、行为评分卡、催收评分卡

    为什么要开发评分卡

    • 风险控制的一个环节,根据已有数据提供逾期概率指标参考

    评分卡的特性

    • 稳定性
    • 预测能力
    • 等价于逾期概率

    评分卡开发的常用模型

    • 逻辑回归
    • 决策树

    基于逻辑回归的评分卡理论依据

    • 一个事件发生的几率(Odds),是指该事件发生的概率与该事件不发生概率的比值。若一个客户违约概率为p,则其正常的概率为1-p,由此可得:

      此时,客户违约的概率p可以表示为: 

      评分卡表达式为: 


      其中A、B为常数。由于log函数在(0→+∞)单调递增,所以当用户违约几率Odds越大时,Score评分越低。
      通过给定 
      (1)某特定Odds时的Score值S0; 
      (2)该特定Odds值翻倍时Score增加值PD0; 
      通过给定值S0与PD0带入评分卡表达式,可求得A、B。 
      通过以上分析,求该用户评分Score的问题则转化为求用户违约对数几率log(Odds)的问题。 
      依照二元逻辑回归构造预测函数 


      其中hθ(x)表示结果取1的概率。 
      推倒可得该事件的对数几率log(Odds)如下: 


      可以发现:在逻辑斯蒂回归模型中,输出Y=1的对数几率是输入条件x的线性函数。 

      回到信贷业务中 
      目标:寻找最理想的参数估计θ使得模型预测的概率相对已有样本最准确。 
      方法:损失函数最小化求得θ 
      逻辑回归的损失函数为对数损失函数(具体可由极大似然估计推倒): 

      1.检验异常样本

      根据对具体业务的理解和认识去除一些异常极端的数据。例如在对网页浏览量的分析,可能需要去除爬虫用户的浏览数据。

      2.缺省字段的处理

      数据样本的某些特征字段可能有缺省值,需根据缺省值多少与特征类型区分处理

      • 缺省值很多时直接舍弃。作为特征加入的话,可能反倒带入噪声,影响最后的结果。
      • 非连续特征缺省量适中时,将Nan作为一个新类别加入至特征中
      • 连续特征缺省量适中时,考虑给定一个step(比如age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中
      • 缺省值很少时利用填充的办法进行处理。例如用均值、中位数、众数填充,模型填充等

      变量筛选

      单变量:归一化,离散化,缺失值处理

      多变量:降维,相关系数,卡方检验,信息增益。决策树等。

      这里讲一种行业经常用的基于IV值进行筛选的方式。

      首先引入概念和公式。

      IV的全称是Information Value,中文意思是信息价值,或者信息量。

      求IV值得先求woe值,这里又引入woe的概念。

      WOE的全称是“Weight of Evidence”,即证据权重。

      首先把变量分组,然后对于每个组i,对于第i组有:

      其中 是第i组坏客户数量(bad), 是整体坏客户数量。同理,G就是good,好客户的意思。

    • woe反映的是在自变量每个分组下违约用户对正常用户占比和总体中违约用户对正常用户占比之间的差异;从而可以直观的认为woe蕴含了自变量取值对于目标变量(违约概率)的影响

      而IV值得公式如下:

    • 我们可以看到IV值其实是woe值加权求和。这个加权主要是消除掉各分组中数量差异带来的误差。

      比如如果只用woe的绝对值求和,如果一些分组中,A组数量很小,B组数量很大(显然这样的分组不合理),这是B的woe值就很小,A组很大,求和的woe也不会小,显然这样不合理。比如:

      最后我们可以根据每个变量VI值的大小排序去筛选变量。VI越大的越要保留。

      变量处理

      变量离散化:

      评分卡模型用的是logistics,基本上都需要变量离散化后,效果才比较好。

      离散化一般有几种方式:合并和切割。

      合并:先把变量分为N份,然后两两合并,看是否满足停止合并条件。

      切割:先把变量一分为二,看切割前后是否满足某个条件,满足则再切割。

       

      而所谓的条件,一般有两种,卡方检验,信息增益。

      关于这两种方法已经有很多介绍,不在赘述,大家可自行查阅相关资料。
    • 模型优化

      KS检验

    • KS检验主要是验证模型对违约对象的区分能力,通常是在模型预测全体信用样本的信用评分后,将样本按违约率与非违约率分成两部分,然后用KS统计量来检验两组样本信用评分是否具有显著性差异。

    • 横轴是总体累积率,纵轴是各样本累积率

      蓝色是坏客户的占比,红色是好客户的占比,两者都会随着横轴总体累积率的变化而变。但两者差距最大时,为KS值。

      如在60%的时候KS值取得最大,此时将模型里面算出的P值(odds)排序,往下取60%时的P值,将60时的P值作为新的阈值,效果往往会有所提升。

    • 模型检验

    • 1.KS值图

      上面说过,此处不再叙述。

      2.ROC曲线

      召唤经典级交叉矩阵

      (1)True Positive Rate,敏感度,召回率计算公式为TPR=TP/(TP+FN)

      (2)False Positive Rate,简称为FPR,计算公式为FPR=FP/(FP+TN)

      (3)Precision=TP/(TP+FP),或2TP/((TP+FN)+(TP+FP))。

      (4)真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1 - FPR

    • ROC曲线及AUC系数主要用来检验模型对客户进行正确排序的能力。ROC曲线描述了在一定累计好客户比例下的累计坏客户的比例,模型的分别能力越强,ROC曲线越往左上角靠近。AUC系数表示ROC曲线下方的面积。AUC系数越高,模型的风险区分能力越强。

    •  

      3.Lift曲线

       

      Lift=命中率/真实中正例的比例

      横坐标Depth为预测成正例的比例

      在模型中,随着改变阈值p,命中率会随之改变,lift曲线中横坐标就是改变阈值p下正比例的变化,纵坐标是lift提升度。比如命中率是80%,原来好坏比是1.1,那样就提高了1.6。

      一般来说,在depth为1前,lift越大于1越好。

    • 总结

    • 在实际建模中需要重复特征工程、变量离散化、KS检验等步骤,不断优化以达到更优效果。

    展开全文
  • 评分卡模型的介绍(ABCD卡),数据清洗、特征工程的介绍,模型使用的介绍,评分卡模型评价标准的介绍~
  • 传统信用评分中的评分卡中的A卡、B卡和C卡是什么意思。

    A卡(Application score card)申请评分卡

    B卡(Behavior score card)行为评分卡
    C卡(Collection score card)催收评分卡


    评分机制的区别在于:
    1.使用的时间不同。分别侧重贷前、贷中、贷后;
    2.数据要求不同。A卡一般可做贷款0-1年的信用分析,B卡则是在申请人有了一定行为后,有了较大数据进行的分析,一般为3-5年,C卡则对数据要求更大,需加入催收后客户反应等属性数据。
    3.每种评分卡的模型会不一样。在A卡中常用的有逻辑回归,AHP等,而在后面两种卡中,常使用多因素逻辑回归,精度等方面更好。

    展开全文
  • 企业诊断与绩效评估平衡评分卡之运用平衡评分卡四大.pptx
  • 评分卡上线后如何进行评分卡的监测

    万次阅读 多人点赞 2017-10-26 17:48:34
    我们的评分卡上线后,如何对评分卡的效果进行有效监测,监测哪些指标,监测的指标阈值达到多少我们需要对现有评分卡进行调整更新?这是我们在评分卡上线后需要持续性监测、关注的问题,今天就来跟大家分享一下互金...

    有一段时间没来写博了,一直忙我司申请评分卡、催收评分卡的上线工作,那么我们的评分卡上线后,如何对评分卡的效果进行有效监测,监测哪些指标,监测的指标阈值达到多少我们需要对现有评分卡进行调整更新?这是我们在评分卡上线后需要持续性监测、关注的问题,今天就来跟大家分享一下互金行业评分卡监测的常用手段。

    1. 模型稳定性

    包括评分卡得分分布的PSI(Population Stability Index), 评分卡所有涉及变量的PSI.
    模型分数分布稳定性:监测模型的打分结果的分布是否有变化,主要将评分卡上线后的样本RealData与建模时的样本Train_Data比较。使用的统计指标为PSI(Population Stability Index).使用的指标是PSI.

    变量稳定性:监测模型的输入变量的分布是否有变化,主要将评分卡上线后的样本RealData与建模时的样本Train_Data比较。使用的指标也是PSI.

    PSI 计算步骤:
    假设我们要比较样本A与样本B中某一变量Y的分布,首先按照同一标准将Y分为几个区间(通常分为10段),计算样本A和样本B中每个区间的占比。在每个区间段上,将两个样本的各自占比相除再取对数,然后乘以各自占比之差,最后将各个区间段的计算值相加,得到最终PSI.
    这里写图片描述

    这里写图片描述

    以“联名贷”产品申请评分卡监测过程为例,代码实现:

    realdata<-read.csv("C:/Users/5609/Desktop/每日定时报表/20171023/CacheData_LMD.csv",header = TRUE)
    modeldata<-read.csv("D:/sissi/联名贷/联名贷分数_建模样本.csv",header=TRUE)
    realdata$申请日期<-as.Date(realdata$time)
    modeldata$申请日期<-as.Date(modeldata$申请日期)
    vars <- read.table("variable list.txt", sep = "\t")
    vars <- as.character(vars[,1])
    
    for (i in vars){
      if(is.character(modeldata[,i]) | is.logical(modeldata[,i])){
        modeldata[,i] <- as.factor(modeldata[,i])
      }
    }
    modeldata1<-modeldata[,c("申请编号","申请日期",vars,"pred","groups","groups_n")]
    realdata1<-realdata[,c("申请编号","申请日期",vars,"final_score","group")]
    # 联名贷评分卡分组
    breaks_g <- c(   0,  3.67, 
                         4.49,
                         5.21, 
                         5.99, 
                         6.83,
                         8.02, 
                         9.59, 
                         12.44, 
                         19.90, 
                         100.00 
    
    
    )
    
    realdata1$groups <- cut(realdata1$final_score, breaks = breaks_g, include.lowest = FALSE, right = TRUE)
    realdata1$groups_n<-as.numeric(realdata1$groups)
    
    ####建模数据
    tab <- summary(modeldata$groups)
    write.table(tab, "clipboard", sep = "\t")
    
    t1 <- summary(modeldata$groups)/dim(modeldata)[1]
    write.table(t1, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 每组样本量  更新至excel
    tab <- summary(realdata1$groups)
    write.table(tab, "clipboard", sep = "\t")
    
    # 每组占比  更新至excel
    t2 <- summary(realdata1$groups)/dim(realdata1)[1]
    write.table(t2, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    PSI <- sum((t2-t1)*log(t2/t1))
    
    PSI
    
    
    # 变量 PSI ----------------------------------------------------------------
    vars <- read.table("variable list.txt", sep = "\t")
    vars <- as.character(vars[,1])
    # 调整变量值  (评分卡对输入变量的值有调整,将调整后的值与建模时的数据做比较)
    #loan_query_12MA_level
    realdata1$loan_query_12MA_level <- cut(realdata1$loan_query_12MA, breaks = c(0, 1.5,Inf),
                                           include.lowest = TRUE)
    
    realdata1$loan_query_12MA_level <- as.character(realdata1$loan_query_12MA_level)
    index <- is.na(realdata1$loan_query_12MA_level)
    realdata1[index, "loan_query_12MA_level"] <- "NA"
    realdata1$loan_query_12MA_level <- as.factor(realdata1$loan_query_12MA_level)
    
    levels(realdata1$loan_query_12MA_level) <- c(  "2_(1.5,Inf]", "1_[0,1.5] & NA","1_[0,1.5] & NA" )
    realdata1$loan_query_12MA_level <- as.character(realdata1$loan_query_12MA_level)
    
    
    # 未结清贷款笔数
    
    realdata1$未结清贷款笔数_level <- cut(realdata1$未结清贷款笔数_level,
                                   breaks = c(0,  5, Inf),
                                   include.lowest = TRUE, right = FALSE)
    
    realdata1$未结清贷款笔数_level <- as.factor(as.character(realdata1$未结清贷款笔数_level))
    index <- is.na(realdata1$未结清贷款笔数_level)
    realdata1[index, "未结清贷款笔数_level"] <- "[0,5)"
    
    #贷款类别
    realdata1$贷款类别 <- as.factor(as.character(realdata1$贷款类别))
    
    levels(realdata1$贷款类别) <- c(  "新贷款", "再贷","续贷" )
    
    modeldata1[, "贷款类别"] <- ordered(  
      modeldata1[, "贷款类别"],   
      levels=c("新贷款", "再贷", "续贷"),  
      labels=c('新贷款', '再贷', '续贷')  
    );  
    table(modeldata1[, "贷款类别"])  
    
    #modeldata1[order(modeldata1[, "贷款类别"]),]
    
    
    #名下物业数量_所有联名人
    index <- is.na(realdata1$名下物业数量_所有联名人)
    realdata1[index, "名下物业数量_所有联名人"] <- 0
    
    index <- realdata1$名下物业数量_所有联名人 > 3
    realdata1[index, "名下物业数量_所有联名人"] <- 3
    
    #要求贷款期限_level
    realdata1$要求贷款期限_level <- cut(realdata1$要求贷款期限, breaks = c(0,18,36),
                                  include.lowest = FALSE, right = TRUE)
    
    
    realdata1$HZ_score<-realdata1$HZ_score/100
    realdata1$主贷人分数<-realdata1$主贷人分数/100
    
    PSI <- NULL
    
    ########"HZ_score"
    var_name <- "HZ_score"
    
    breaks_v <- unique(quantile(modeldata1[,var_name], seq(0,1,.2), na.rm = TRUE))
    N <- length(breaks_v)
    breaks_v <- c(-99,breaks_v[2:(N-1)], Inf)
    breaks_v 
    modeldata1$groups_v <- cut(modeldata1[, var_name], breaks = breaks_v, include.lowest = TRUE, right = FALSE)
    index <- !is.na(modeldata1[,var_name])
    t1 <- summary(modeldata1[index,"groups_v"])/sum(index)
    
    realdata1$groups_v <- cut(realdata1[, var_name], breaks = breaks_v, include.lowest = TRUE, right = FALSE)
    index <- !is.na(realdata1[,var_name])
    t2 <- summary(realdata1[index,"groups_v"])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[1] <- sum((t2-t1)*log(t2/t1))
    
    
    ########"主贷人分数"
    var_name <- "主贷人分数"
    
    breaks_v <- unique(quantile(modeldata1[,var_name], seq(0,1,.2), na.rm = TRUE))
    N <- length(breaks_v)
    breaks_v <- c(-99,breaks_v[2:(N-1)], Inf)
    breaks_v 
    modeldata1$groups_v <- cut(modeldata1[, var_name], breaks = breaks_v, include.lowest = TRUE, right = FALSE)
    index <- !is.na(modeldata1[,var_name])
    t1 <- summary(modeldata1[index,"groups_v"])/sum(index)
    
    realdata1$groups_v <- cut(realdata1[, var_name], breaks = breaks_v, include.lowest = TRUE, right = FALSE)
    index <- !is.na(realdata1[,var_name])
    t2 <- summary(realdata1[index,"groups_v"])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[2] <- sum((t2-t1)*log(t2/t1))
    
    
    ########loan_query_12MA_level
    
    modeldata1$loan_query_12MA_level<-as.character(modeldata1$loan_query_12MA_level)
    var_name <- "loan_query_12MA_level"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[3] <- sum((t2-t1)*log(t2/t1))
    
    #######未结清贷款笔数_level
    #modeldata1$未结清贷款笔数_level<-as.character(modeldata1$未结清贷款笔数_level)
    
    var_name <- "未结清贷款笔数_level"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[4] <- sum((t2-t1)*log(t2/t1))
    
    ########名下物业数量_所有联名人
    #modeldata1$名下物业数量_所有联名人<-as.character(modeldata1$名下物业数量_所有联名人)
    #realdata1$名下物业数量_所有联名人<-as.character(realdata1$名下物业数量_所有联名人)
    
    var_name <- "名下物业数量_所有联名人"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[5] <- sum((t2-t1)*log(t2/t1))
    
    
    ########要求贷款期限_level
    modeldata1$要求贷款期限_level<-as.character(modeldata1$要求贷款期限_level)
    
    var_name <- "要求贷款期限_level"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[6] <- sum((t2-t1)*log(t2/t1))
    
    ###########最近1_3月信用卡是否逾期
    var_name <- "最近1_3月信用卡是否逾期"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[7] <- sum((t2-t1)*log(t2/t1))
    
    ###########贷款类别
    var_name <- "贷款类别"
    
    index <- !is.na(modeldata1[,var_name])
    t1 <- table(modeldata1[index,var_name])/sum(index)
    
    index <- !is.na(realdata1[,var_name])
    t2 <- table(realdata1[index,var_name])/sum(index)
    
    sum((t2-t1)*log(t2/t1))
    PSI[8] <- sum((t2-t1)*log(t2/t1))
    

    PSI<0.1 样本分布有微小变化
    PSI 0.1~0.2 样本分布有变化
    PSI>0.2 样本分布有显著变化

    计算完建模变量的PSI值,需要重点关注PSI>0.2的变量,说明这几项的分布较建模时已经发生比较显著的变化,需要考虑是否是客户质量变化引起的PSI变动。

    ##### 观测PSI大于0.2的变量#####
    xx<-tapply(Data$未结清贷款笔数, substr(aa$申请日期,1,7),mean, na.rm = TRUE)
    write.table(xx, "clipboard", sep = "\t", col.names = FALSE, row.names = TRUE)
    
    
    yy<-tapply(Data$名下物业数量_所有联名人, substr(aa$申请日期,1,7),mean, na.rm = TRUE)
    write.table(yy, "clipboard", sep = "\t", col.names = FALSE, row.names = TRUE)
    
    zz<-tapply(Data$要求贷款期限, substr(aa$申请日期,1,7),mean, na.rm = TRUE)
    write.table(zz, "clipboard", sep = "\t", col.names = FALSE, row.names = TRUE)

    这里写图片描述

    这里写图片描述

    此为实例数据,可以看到PSI>0.2的变量较建模初期存在较大波动,风控部门提供监测数据,业务部门需总结变量出现异常性或趋势性波动的原因。

    2. 坏账变现

    以9个月内逾期60天为坏账标准,或12个月内逾期90天为坏账标准,观测模型的表现。(坏账标准具体需根据不同产品来定义)
    我常用的坏账监测标准:60days/9m;90days/12m;30+监测(适用于续贷产品或催收评分卡
    监测所使用的统计量:可使用AUC,KS来监测评分卡模型在样本上的预测效果。

    以后置评分卡监测过程为例,代码实现:

    # 模型表现 60d/9M --------------------------------------------------------------
    
    # 读取数据 合并
    Data2016 <- read.csv("d:/sissi/Data/2016Data/HZ_score_201601_201606.csv", header = TRUE)
    
    Data201607 <- read.csv("d:/sissi/Data/2016Data/HZ_score_201607_201612.csv", header = TRUE)
    
    index <- Data2016$app_no %in% Data201607$app_no
    
    Data2016 <- Data2016[!index,]
    
    Data2016 <- rbind(Data2016, Data201607)
    
    
    # 对数据进行新版分组
    breaks_g <- c(0,
                  3.73, 
                  4.45 ,
                  5.05 ,
                  5.61 ,
                  6.21 ,
                  6.87 ,
                  7.54 ,
                  8.25 ,
                  9.14 ,
                  10.02 ,
                  11.09 ,
                  12.13 ,
                  13.24 ,
                  14.66 ,
                  16.67 ,
                  19.20 ,
                  22.96 ,
                  28.73 ,
                  39.24 ,
                  100.00 
    
    )
    
    Data2016$groups <- cut(Data2016$score, breaks = breaks_g, include.lowest = FALSE, right = TRUE)
    
    # 读取Data Source需更新至最新
    DS <- read.csv("D:/sissi/ds201710/DataSource-2017年10月10日.csv", header = TRUE)
    
    Data2016 <- merge(Data2016, DS[,c("申请编号", "合同起始日", "状态.贷前.","录单营业部","贷款产品")], by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    Data2016 <- Data2016[Data2016$合同起始日!="",]
    
    Data2016$合同起始日 <- as.Date(Data2016$合同起始日)
    
    # 读取2015年数据
    Data2015 <- read.csv("D:/sissi/后置/Score_HZ_201206_201512.csv", header = TRUE)
    
    Data2015 <- Data2015[!duplicated(Data2015$app_no),]
    
    Data2015 <- merge(Data2015, DS[,c("申请编号", "状态.贷前.", "合同起始日","是否联名贷款","实际贷款额度","要求贷款额度","录单营业部","贷款产品")], by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    Data2015 <- Data2015[Data2015$合同起始日!="",]
    Data2015$合同起始日 <- as.Date(Data2015$合同起始日)
    
    Data2015$groups <- cut(Data2015$pred_refitted*100, breaks = breaks_g, include.lowest = FALSE, right = TRUE)
    
    Data2016$pred_refitted <- Data2016$score/100
    
    # 合并数据
    vars <- c( "app_no" ,    "合同起始日" ,"pred_refitted","状态.贷前.","groups","录单营业部","贷款产品")   
    Data_all <- rbind(Data2015[,vars], Data2016[,vars])
    
    
    # 读取旧评分卡分数
    
    old_score_card1 <- read.csv("D:/sissi/评分卡监测/20170206/旧版评分卡分数_201510_201608.csv")
    old_score_card2<-SCORE_CARD_RESULT[,c("申请编号","后置评分卡计算结果")]
    old_score_card<-rbind(old_score_card1,old_score_card2)
    old_score_card<-old_score_card[!(duplicated(old_score_card$申请编号)),]
    
    breaks_g_old <- c(0,6.84, 8.97, 10.58, 12.12, 13.4, 14.75,
                      16.19, 17.56, 19.02, 20.46, 22, 23.93, 26.14, 
                      28.58, 31.46, 35.16, 39.76, 45.86, 54.97, 100)
    
    old_score_card$后置评分卡计算结果<-as.numeric(old_score_card$后置评分卡计算结果)
    old_score_card$分组 <- cut(old_score_card$后置评分卡计算结果, breaks = breaks_g_old, include.lowest = FALSE, right = TRUE)
    
    old_score_card <- old_score_card[!duplicated(old_score_card$申请编号),]
    
    # 从OverDueDate报表中读取9个月时的逾期状态 Dates中日期需更新至最新一月一号 OverDueDate报表需保存成csv格式
    data_out <- NULL
    Dates <- c("2012-01-01","2012-02-01","2012-03-01","2012-04-01","2012-05-01","2012-06-01",
               "2012-07-01","2012-08-01","2012-09-01","2012-10-01","2012-11-01","2012-12-01",
               "2013-01-01","2013-02-01","2013-03-01","2013-04-01","2013-05-01","2013-06-01",
               "2013-07-01","2013-08-01","2013-09-01","2013-10-01","2013-11-01","2013-12-01",
               "2014-01-01","2014-02-01","2014-03-01","2014-04-01","2014-05-01","2014-06-01",
               "2014-07-01","2014-08-01","2014-09-01","2014-10-01","2014-11-01","2014-12-01",
               "2015-01-01","2015-02-01","2015-03-01","2015-04-01","2015-05-01","2015-06-01",
               "2015-07-01","2015-08-01","2015-09-01","2015-10-01","2015-11-01","2015-12-01",
               "2016-01-01","2016-02-01","2016-03-01","2016-04-01","2016-05-01","2016-06-01",
               "2016-07-01","2016-08-01","2016-09-01","2016-10-01","2016-11-01","2016-12-01",
               "2017-01-01","2017-02-01","2017-03-01","2017-04-01","2017-05-01","2017-06-01",
               "2017-07-01","2017-08-01","2017-09-01","2017-10-01")
    Table <- matrix(nrow = 100, ncol = 7)
    for (i in 1:(length(Dates)-10)) {
      StartDate <- Dates[i]
      EndDate <- Dates[i+1]
      Date1 <- Dates[i+10]
    
      file1 <- paste("D:/sissi/OverdueDaily/OverDueDate",Date1,".csv",sep = "")
    
      overdue <- read.csv(file1, header = TRUE, sep = ",")
      data <- subset(Data_all, Data_all$合同起始日 < EndDate & Data_all$合同起始日 >= StartDate)
      if (dim(data)[1]==0) {next }
    
      data <- merge(data, overdue[, c("申请编号","逾期天数","逾期日期","贷款剩余本金","账户状态")],
                    by.x = "app_no", by.y = "申请编号", all.x = TRUE)
      data[is.na(data$逾期天数), "逾期天数"] <- 0
    
      data$overdue60 <- ifelse(data$逾期天数>=60, TRUE, FALSE)
    
      index <- !is.na(data$账户状态) & data$账户状态 %in% c("ACCOOA","RWOCOOA", "RWOCORA", "RWOCOXX","WOCOOA", "WOCORA", "WOCOXX")
      data[index, "overdue60"] <- TRUE
    
      index <- data$overdue60 == FALSE
      data[index, "贷款剩余本金"] <- 0
    
      data <- data[,c("app_no","逾期日期","逾期天数","overdue60","贷款剩余本金")]
    
      if (is.null(data_out)) {
        data_out <- data
      } else {
        data_out <- rbind(data_out,data)
      }
    }
    
    Data_all <- merge(Data_all, data_out[,c("app_no", "overdue60","贷款剩余本金")], by = "app_no", all.x = TRUE)
    
    Data_all <- merge(Data_all, DS[,c("申请编号", "实际贷款额度", "贷款类别","申请日期","合作方")], by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    Data_all$申请日期 <- as.Date(Data_all$申请日期)
    
    Data_all <- subset(Data_all, Data_all$状态.贷前.=="AC" & Data_all$贷款类别 != "续贷")
    
    Data_all <- merge(Data_all, old_score_card[, c("申请编号", "后置评分卡计算结果","分组")],
                      by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    # 有2笔债务重组无评分卡分数
    
    index <- !is.na(Data_all$后置评分卡计算结果) & !is.na(Data_all$overdue60) & 
      Data_all$合同起始日 >= "2015-11-01" & Data_all$申请日期 >= "2015-11-01" & !is.na(Data_all$overdue60)
    
    # 旧版评分卡AUC
    gbm.roc.area(Data_all[index,"overdue60"],Data_all[index,"后置评分卡计算结果"]/100)
    
    # 新版评分卡AUC
    gbm.roc.area(Data_all[index,"overdue60"],Data_all[index,"pred_refitted"])
    
    subData1 <- Data_all[index,]
    
    
    # 新版评分卡KS
    
    b_points <- quantile(subData1$pred_refitted, seq(0,1,.01))
    C_R <- NULL
    C_N <- NULL
    for (i in 1:100){
      index <- subData1$pred_refitted<=b_points[i+1]
      C_R[i] <- sum(subData1[index, "overdue60"]==1)/sum(subData1[,"overdue60"]==1)
      C_N[i] <- sum(subData1[index, "overdue60"]==0)/sum(subData1[,"overdue60"]==0)
    }
    
    KS <- max(C_N - C_R)
    KS
    
    # 旧版评分卡 KS
    
    b_points <- quantile(subData1$后置评分卡计算结果/100, seq(0,1,.01))
    C_R <- NULL
    C_N <- NULL
    for (i in 1:100){
      index <- subData1$后置评分卡计算结果/100<=b_points[i+1]
      C_R[i] <- sum(subData1[index, "overdue60"]==1)/sum(subData1[,"overdue60"]==1)
      C_N[i] <- sum(subData1[index, "overdue60"]==0)/sum(subData1[,"overdue60"]==0)
    }
    
    KS <- max(C_N - C_R)
    KS
    
    # 新版每组坏账 (A/C)
    tab <- tapply(subData1$overdue60, subData1$groups, mean)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 新版每组样本量
    tab <- tapply(subData1$overdue60, subData1$groups, length)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    #新版每组占比
    tab <- tapply(subData1$overdue60, subData1$groups, length)/dim(subData1)[1]
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 新版每组逾期金额
    tab <- tapply(subData1$贷款剩余本金, subData1$groups, sum)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 新版每组合同金额
    tab <- tapply(subData1$实际贷款额度, subData1$groups, sum)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    
    #  旧版每组坏账 (A/C)
    tab <- tapply(subData1$overdue60, subData1$分组, mean)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 旧版每组样本量
    tab <- tapply(subData1$overdue60, subData1$分组, length)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    #旧版每组占比
    tab <- tapply(subData1$overdue60, subData1$分组, length)/dim(subData1)[1]
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    
    # 旧版每组逾期金额
    tab <- tapply(subData1$贷款剩余本金, subData1$分组, sum)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    # 旧版每组合同金额
    tab <- tapply(subData1$实际贷款额度, subData1$分组, sum)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)
    
    
    # 按新版每组比例对旧版进行重新分组  将新版cumulative占比结果更新至下面quantile函数
    breaks_g <- quantile(subData1$后置评分卡计算结果, c(0,         0.0626, 
                                               0.1170 ,
                                               0.1749 ,
                                               0.2244 ,
                                               0.2863 ,
                                               0.3463 ,
                                               0.3997 ,
                                               0.4527 ,
                                               0.5158 ,
                                               0.5744 ,
                                               0.6339 ,
                                               0.6783 ,
                                               0.7214 ,
                                               0.7686 ,
                                               0.8232 ,
                                               0.8691 ,
                                               0.9108 ,
                                               0.9522 ,
                                               0.9835 ,
                                               1.0000 
    
    
    ))
    
    subData1$分组_new <- cut(subData1$后置评分卡计算结果, breaks = breaks_g, include.lowest = TRUE, right = FALSE )
    
    # 旧版新分组 坏账率(A/C)
    tab <- tapply(subData1$overdue60, subData1$分组_new, mean)
    write.table(tab, "clipboard", sep = "\t")
    
    # 旧版新分组 样本量
    tab <- tapply(subData1$overdue60, subData1$分组_new, length)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE)
    
    # 旧版新分组 逾期金额
    tab <- tapply(subData1$贷款剩余本金, subData1$分组_new, sum)
    write.table(tab, "clipboard", sep = "\t")
    
    # 旧版新分组 合同金额
    tab <- tapply(subData1$实际贷款额度, subData1$分组_new, sum)
    write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE)

    3. 拒绝原因

    针对每个变量,根据其取值,按照样本量平均分为3~5组,计算每一组中的平均得分。对每一个客户的各个变量,根据实际值落入的组判断对应的平均分X, 再减去该变量各组平均分的最小值X_min, X-X_min为该变量对应的差值。将每个变量对应的差值从高到低排序,输出头三个不同的拒绝原因。例如,最近120天内查询这个变量,根据其样本中的取值,可以分为5组,每组中的平均分数如下:
    这里写图片描述

    某客户,其最近120天内查询次数为4次,落入第四组,该组平均得分为14.36,全部5组中,最低分为7.3,所以该客户这个变量对应的差值为7.06. 对应的拒绝原因为“近期征信查询过多”。将该客户的所有变量按照同样的方法计算差值,再排序,可得到输出的拒绝原因。

    该部分代码主要监测被拒绝客户的拒绝原因,以及被评分卡拒绝的客户的拒绝原因明细。

    # 读取拒绝原因 需更新至最新
    RJ_REASON <- read.table("D:/sissi/评分卡监测/20171017/V_RJ_REASON_DETAIL.txt", header = TRUE,stringsAsFactors=FALSE)
    RJ_REASON1 <- read.table("D:/sissi/评分卡监测/20171017/V_RJ_REASON_DETAIL1.txt", header = TRUE,stringsAsFactors=FALSE)
    RJ_REASON<-rbind(RJ_REASON,RJ_REASON1)
    RJ_REASON<-RJ_REASON[!(duplicated(RJ_REASON$申请编号)),]
    
    RJ_REASON <- RJ_REASON[RJ_REASON$申请编号!="null" & !is.na(RJ_REASON$申请编号),]
    
    RealData <- merge(RealData, SCORE_CARD_RESULT[, c("申请编号", "后置评分卡计算结果", "后置评分卡分组")],
                      by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    RealData <- merge(RealData, RJ_REASON[, c("申请编号", "状态","拒绝原因","贷款类型","贷款产品")],
                      by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    RealData <- merge(RealData, DS[, c("申请编号", "状态.贷前.", "主拒绝原因" )], by.x = "app_no", by.y = "申请编号", all.x = TRUE)
    
    index <- is.na(RealData$状态)
    RealData[index, "状态"] <- RealData[index, "状态.贷前."]
    
    # 拒绝原因 --------------------------------------------------------------------
    index <- is.na(RealData$拒绝原因) | RealData$拒绝原因 == "null"
    RealData$拒绝原因 <- as.character(RealData$拒绝原因)
    RealData[index, "拒绝原因"] <- as.character(RealData[index, "主拒绝原因"])
    
    index <- RealData$状态.贷前.=="RJ" 
    subData <- RealData[index,]
    summary(subData)
    
    
    # 整体被拒绝原因
    library(stringr)
    temp <- unlist(str_split(subData[,"拒绝原因"], ","))
    tab <- summary(as.factor(temp))
    write.table(tab, "clipboard", sep = "\t")
    
    # 被评分卡拒绝的
    index <- RealData$状态.贷前.=="RJ" & grepl("综合评分差", RealData$拒绝原因)
    subData <- RealData[index,]
    
    # 拒绝原因1
    tab <- summary(subData$RJ_reason1)
    write.table(tab, "clipboard", sep = "\t")
    # 拒绝原因2
    tab <- summary(subData$RJ_reason2)
    write.table(tab, "clipboard", sep = "\t")
    # 拒绝原因3
    tab <- summary(subData$RJ_reason3)
    write.table(tab, "clipboard", sep = "\t")

    关于监测频率,对于一般金融产品,以每月一次的监测频率进行监测;对于催收评分卡或某些特殊需求的金融产品,需每周做一次监测。监测结果需定时上传,在监测指标明显波动的情况下需考虑更新或重建评分卡。

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

    展开全文
  • 企业诊断与绩效评估平衡评分卡之运用平衡评分卡四大构面.pptx
  • 催收评分卡(一)催收评分卡介绍

    千次阅读 2019-08-25 13:51:40
    从今天开始本号会陆续公开催收评分卡的原创教程和资料,如果对这部分内容有兴趣,麻烦动动手关注转发,谢谢大家的捧场。 搜索关注公众号“ 番茄风控大数据”,获取更多风控干货。   我这里所要介绍给各位的是:...
  • 信用评分卡.pdf

    2019-10-19 21:22:23
    资源文档为PDF格式,里面介绍了各类型评分卡制作的主体流程注意事项等内容,对评分卡模型制作中的流程查询价值很高。
  • R语言 信用评分卡

    2018-06-26 15:10:34
    介绍了如何使用R语言构建评分卡评分卡广泛应用于银行信用卡、消费金融公司等金融机构
  • 评分卡开发实施研究
  • 文章目录一、信用风险和评分卡模型的基本概念1.信用风险的概念2.评分卡的概念3.评分卡模型的开发步骤4.评分卡开发的常用模型5.模型监控指标二、申请评分卡在互联网金融业的重要性和特性三、贷款申请环节的数据介绍和...
  • 申请评分卡

    2021-05-08 10:46:52
    一、数据的预处理与特征构建 简介:在构建评分卡模型的工作中,数据预处理工作和特征构建工作是至关重要的一步。数据的预处理工作可以有效处理...6)反欺诈评分卡、申请评分卡、行为评分卡、催收评分卡。 申请评分卡(Ap
  • 信用评分卡

    2018-05-09 17:03:51
    传统的信贷模型以评分卡为主,了解一下。 这里有几篇关于评分卡的文章,可以看一下。参考文章
  • 评分卡系列图书

    2018-12-12 13:52:18
    关于信贷行业及评分卡的知识 The Credit Scoring Toolkit - R. Anderson (Oxford, 2007) BBS
  • scorecard:评分卡-源码

    2021-05-02 18:03:50
    scorecard 评分卡
  • 评分卡-数据集

    2021-03-16 22:33:04
    评分卡 cs-training.csv
  • 评分卡模型搭建流程

    2018-08-31 10:34:44
    讲述了评分卡模型整个搭建流程,包括IV和woe转换的概念
  • C卡催收评分卡

    千次阅读 2020-03-26 21:22:27
    转自公众号:天天学风控 1、定义:C卡(Collection scorecard)催收评分...3、数据使用:A卡申请评分卡一般可做贷款0-1年的信用分析,B卡行为评分卡一般为3-5年,催收评分卡则对数据要求更大,需加入催收后客户反应...
  • 信用评分卡开发流程

    2018-04-08 22:44:05
    信用评分卡原理以及开发流程,关键点的阐述。大学课件
  • 信用评分卡A卡、B卡、C卡区别

    万次阅读 2019-07-02 13:24:18
    一、信用评分卡通过对客户实行打分制,以对客户优质与否做判断。 二、分类: A卡(Application Score Card),申请评分卡 B卡(Behavior Score Card),行为评分卡 C卡(Collection Score Card),催收评分卡 三、区别:...
  • 评分卡流程

    2019-03-15 16:04:44
    偶尔浏览收藏了一个做评分卡的流程图 可以访问原网站:https://mp.weixin.qq.com/s/WFirxjUpbSlpsyiQbSRgWg
  • 信用评分卡(A卡/B卡/C卡)模型简介

    千次阅读 2019-07-24 21:10:48
    如今在银行、消费金融公司等各种贷款业务机构,普遍使用信用评分,对客户实行...A卡(Application score card)申请评分卡B卡(Behavior score card)行为评分卡C卡(Collection score card)催收评分卡评分机制的...
  • (信贷风控)基于专家经验制作评分卡,从0到1,搭建基于专家经验评分卡,适合业务前期无数据,冷启动启动业务。
  • 评分卡模型介绍

    2020-11-13 09:01:22
    文章目录申请评分卡行为评分卡催收评分卡反欺诈模型 个人信贷中,信用风险评估的关键是: 通过分析借款人的信用信息,评估借款人的偿还能力和意愿量化违约风险 信用评分卡模式是个人信贷风险管理中的重要手段,是...
  • 行为评分卡-附件资源

    2021-03-05 15:18:14
    行为评分卡-附件资源
  • 评分卡模型开发-基于逻辑回归的标准评分卡实现

    万次阅读 多人点赞 2017-08-03 01:05:01
    评分卡设定的分值刻度可以通过将分值表示为比率对数的线性表达式来定义,即可表示为下式: 其中,A和B是常数。式中的负号可以使得违约概率越低,得分越高。通常情况下,这是分值的理想变动方向,即高分值代表低...
  • 信贷评分卡模型所需要的数据源,3000调数据,里面不涉及任何个人隐私

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,295
精华内容 8,518
关键字:

评分卡