R语言绘制KS曲线;R语言实现KS曲线

更多内容请关注公众号《大数据风控的一点一滴》

将代码封装在函数PlotKS_N里,Pred_Var是预测结果,可以是评分或概率形式;labels_Var是好坏标签,取值为1或0,1代表坏客户,0代表好客户;descending用于控制数据按违约概率降序排列,如果Pred_Var是评分,则descending=0,如果Pred_Var是概率形式,则descending=1;N表示在将数据按风险降序排列后,等分N份后计算KS值。

PlotKS_N函数返回的结果为一列表,列表中的元素依次为KS最大值、KS取最大值的人数百分位置、KS曲线对象、KS数据框。

代码如下:

####################   PlotKS_N ################################
PlotKS_N<-function(Pred_Var, labels_Var, descending, N){
  # Pred_Var is prop: descending=1
  # Pred_Var is score: descending=0
  library(dplyr)
  
  df<- data.frame(Pred=Pred_Var, labels=labels_Var)
  
  if (descending==1){
    df1<-arrange(df, desc(Pred), labels)
  }else if (descending==0){
    df1<-arrange(df, Pred, labels)
  }
  
  df1$good1<-ifelse(df1$labels==0,1,0)
  df1$bad1<-ifelse(df1$labels==1,1,0)
  df1$cum_good1<-cumsum(df1$good1)
  df1$cum_bad1<-cumsum(df1$bad1)
  df1$rate_good1<-df1$cum_good1/sum(df1$good1)
  df1$rate_bad1<-df1$cum_bad1/sum(df1$bad1)
  
  if (descending==1){
    df2<-arrange(df, desc(Pred), desc(labels))
  }else if (descending==0){
    df2<-arrange(df, Pred, desc(labels))
  }
  
  df2$good2<-ifelse(df2$labels==0,1,0)
  df2$bad2<-ifelse(df2$labels==1,1,0)
  df2$cum_good2<-cumsum(df2$good2)
  df2$cum_bad2<-cumsum(df2$bad2)
  df2$rate_good2<-df2$cum_good2/sum(df2$good2)
  df2$rate_bad2<-df2$cum_bad2/sum(df2$bad2)
  
  rate_good<-(df1$rate_good1+df2$rate_good2)/2
  rate_bad<-(df1$rate_bad1+df2$rate_bad2)/2
  df_ks<-data.frame(rate_good,rate_bad)
  
  df_ks$KS<-df_ks$rate_bad-df_ks$rate_good
  
  L<- nrow(df_ks)
  if (N>L) N<- L
  df_ks$tile<- 1:L
  qus<- quantile(1:L, probs = seq(0,1, 1/N))[-1]
  qus<- ceiling(qus)
  df_ks<- df_ks[df_ks$tile%in%qus,]
  df_ks$tile<- df_ks$tile/L
  df_0<-data.frame(rate_good=0,rate_bad=0,KS=0,tile=0)
  df_ks<-rbind(df_0, df_ks)
  
  M_KS<-max(df_ks$KS)
  Pop<-df_ks$tile[which(df_ks$KS==M_KS)]
  M_good<-df_ks$rate_good[which(df_ks$KS==M_KS)]
  M_bad<-df_ks$rate_bad[which(df_ks$KS==M_KS)]
  
  library(ggplot2)
  PlotKS<-ggplot(df_ks)+
    geom_line(aes(tile,rate_bad),colour="red2",size=1.2)+
    geom_line(aes(tile,rate_good),colour="blue3",size=1.2)+
    geom_line(aes(tile,KS),colour="forestgreen",size=1.2)+
    
    geom_vline(xintercept=Pop,linetype=2,colour="gray",size=0.6)+
    geom_hline(yintercept=M_KS,linetype=2,colour="forestgreen",size=0.6)+
    geom_hline(yintercept=M_good,linetype=2,colour="blue3",size=0.6)+
    geom_hline(yintercept=M_bad,linetype=2,colour="red2",size=0.6)+
    
    annotate("text", x = 0.5, y = 1.05, label=paste("KS=", round(M_KS, 4), "at Pop=", round(Pop, 4)), size=4, alpha=0.8)+ 
    
    scale_x_continuous(breaks=seq(0,1,.2))+
    scale_y_continuous(breaks=seq(0,1,.2))+
    
    xlab("of Total Population")+
    ylab("of Total Bad/Good")+
    
    ggtitle(label="KS - Chart")+
    
    theme_bw()+
    
    theme(
      plot.title=element_text(colour="gray24",size=12,face="bold"),
      plot.background = element_rect(fill = "gray90"),
      axis.title=element_text(size=10),
      axis.text=element_text(colour="gray35")
    )
  
  result<-list(M_KS=M_KS,Pop=Pop,PlotKS=PlotKS,df_ks=df_ks)
  return(result)
}
######################### OVER   #######################################

接下来以实际数据为例查看该函数的运行结果。

pred_train是建模得到的预测结果,这里是概率形式:

> pred_train

[1] 0.40418112 0.35814193 0.45220572 0.53482002 0.12923573 ...

labels_train是好坏标签:

> labels_train

[1] 0 0 0 0 0 ...

函数运行的结果存放在train_ks里:

train_ks<-PlotKS_N(pred_train, labels_train, 1, 100)

我们来查看train_ks中的每一元素:

1、KS最大值

> train_ks$M_KS

[1] 0.4492765

2、KS取最大值的人数百分位置

> train_ks$Pop

[1] 0.3803191

3、KS曲线对象

原文地址:https://www.cnblogs.com/bigdatafengkong/p/9076251.html

时间: 2024-10-28 03:49:05

R语言绘制KS曲线;R语言实现KS曲线的相关文章

R语言初级教程(01): R编程环境的搭建

R是目前最流行的高级编程语言之一,被广泛用于统计分析和数据可视化.R是开源的,有非常活跃的社区来支撑. 想要了解更多有关R信息,可访问R的主页:https://www.r-project.org/. RStudio是R的一个集成开发环境(IDE).使用它的话,R编程的学习和实践会更加轻松和方便. 下面就教大家如何下载并安装R和RStudio,比较简单,这里以Windows系统的安装为例,其它系统类似. 1. 下载R安装包 步骤1:打开R安装包的镜像链接https://cran.r-project

下载零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析,挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺省值,

零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析, 挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习 之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如 此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺

R基础学习(1):R概述

R是一个有着统计分析功能及强大作图功能的软件系统,是由Ross Ihaka和Robert Gentleman共同创立.它是属于GNU系统的一个自由.免费.源代码开放的软件,同时也是一个用于统计计算和统计制图的优秀工具. 一.R的发展历史 要说R,就不得不先来说一下S语言.1980年左右,AT&T贝尔实验室设计出一种在统计领域广泛使用的S语言.S语言是一种解释型语言,被设计用来进行数据探索.统计分析和作图. S语言最初的实现版本主要是S-PLUS,它是一个基于S语言的商业软件,由MathSoft公

C语言内存调试技巧—C语言最大难点揭秘

本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划.但好消息是,它们并不怎么神秘.引言C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果.来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的.自从 70 年代末期以来,C 程序员就一直讨论此

XE3随笔21:系统默认语言与系统支持的语言列表

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Memo1: TMemo;     Button1: TButton;     Button2: TButton;     Button3: TButton;     Button4:

嵌入式 Linux C语言(十一)——C语言模块化编程

嵌入式 Linux C语言(十一)--C语言模块化编程 一.C语言模块化编程 所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明.C语言模块化编程中对.c..h文件的潜规则: 1..c 文件主要负责实现,也就是定义函数:.h 文件主要负责声明,比如函数声明.宏定义等,结构的定义.自定义数据类型一般也放在头文件中,不能在.h文件中定义变量.将一个功能模块的代码单独编写成一个.c文件,然后把该

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

我的Android进阶之旅------&gt;Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项

今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.所以首先我得把系统的语言切换到波兰语,问题是哪个是波兰语呢? 我还真的不认识哪个列表项代表着波兰语.如下图所示:进入到[设置]-[语言和输入法]-[语言]列表后,我就傻眼了,哪个是波兰语呢?本文将介绍如何在列表中找到相应语言所对应的列表项. ([Settings]-[Language & input]-[Language]) 哪个是波兰语呢?好吧,我只认识 日本语.中文.英语的几项,其他的

D?e?p?l?o?y?m?e?n?t? ?f?a?i?l?u?r?e? ?o?n? ?T?o?m?c?a?t? ?6?.?x?.? ?C?o?u?l?d? ?n?o?t? ?c?o?p?y? ?a?l?l? ?r?e?s?o?u?r?c?e?s? ?t?o

在myeclipse总部署项目,一直有问题,提示如下的错误,经过研究在网上需求帮助,解决方案如下: Deployment failure on Tomcat  6.x. Could not copy all resources to D: \Program Files\apache-tomcat-6.0.16\webapps\fuNan_conv. If a file is loc ked, you can wait until the lock times out to redeploy, o