更多大数据分析、建模等内容请关注公众号《bigdatamodeling

将代码封装在函数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数据框。

代码如下:

 1 ####################   PlotKS_N ################################
2 PlotKS_N<-function(Pred_Var, labels_Var, descending, N){
3 # Pred_Var is prop: descending=1
4 # Pred_Var is score: descending=0
5 library(dplyr)
6
7 df<- data.frame(Pred=Pred_Var, labels=labels_Var)
8
9 if (descending==1){
10 df1<-arrange(df, desc(Pred), labels)
11 }else if (descending==0){
12 df1<-arrange(df, Pred, labels)
13 }
14
15 df1$good1<-ifelse(df1$labels==0,1,0)
16 df1$bad1<-ifelse(df1$labels==1,1,0)
17 df1$cum_good1<-cumsum(df1$good1)
18 df1$cum_bad1<-cumsum(df1$bad1)
19 df1$rate_good1<-df1$cum_good1/sum(df1$good1)
20 df1$rate_bad1<-df1$cum_bad1/sum(df1$bad1)
21
22 if (descending==1){
23 df2<-arrange(df, desc(Pred), desc(labels))
24 }else if (descending==0){
25 df2<-arrange(df, Pred, desc(labels))
26 }
27
28 df2$good2<-ifelse(df2$labels==0,1,0)
29 df2$bad2<-ifelse(df2$labels==1,1,0)
30 df2$cum_good2<-cumsum(df2$good2)
31 df2$cum_bad2<-cumsum(df2$bad2)
32 df2$rate_good2<-df2$cum_good2/sum(df2$good2)
33 df2$rate_bad2<-df2$cum_bad2/sum(df2$bad2)
34
35 rate_good<-(df1$rate_good1+df2$rate_good2)/2
36 rate_bad<-(df1$rate_bad1+df2$rate_bad2)/2
37 df_ks<-data.frame(rate_good,rate_bad)
38
39 df_ks$KS<-df_ks$rate_bad-df_ks$rate_good
40
41 L<- nrow(df_ks)
42 if (N>L) N<- L
43 df_ks$tile<- 1:L
44 qus<- quantile(1:L, probs = seq(0,1, 1/N))[-1]
45 qus<- ceiling(qus)
46 df_ks<- df_ks[df_ks$tile%in%qus,]
47 df_ks$tile<- df_ks$tile/L
48 df_0<-data.frame(rate_good=0,rate_bad=0,KS=0,tile=0)
49 df_ks<-rbind(df_0, df_ks)
50
51 M_KS<-max(df_ks$KS)
52 Pop<-df_ks$tile[which(df_ks$KS==M_KS)]
53 M_good<-df_ks$rate_good[which(df_ks$KS==M_KS)]
54 M_bad<-df_ks$rate_bad[which(df_ks$KS==M_KS)]
55
56 library(ggplot2)
57 PlotKS<-ggplot(df_ks)+
58 geom_line(aes(tile,rate_bad),colour="red2",size=1.2)+
59 geom_line(aes(tile,rate_good),colour="blue3",size=1.2)+
60 geom_line(aes(tile,KS),colour="forestgreen",size=1.2)+
61
62 geom_vline(xintercept=Pop,linetype=2,colour="gray",size=0.6)+
63 geom_hline(yintercept=M_KS,linetype=2,colour="forestgreen",size=0.6)+
64 geom_hline(yintercept=M_good,linetype=2,colour="blue3",size=0.6)+
65 geom_hline(yintercept=M_bad,linetype=2,colour="red2",size=0.6)+
66
67 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)+
68
69 scale_x_continuous(breaks=seq(0,1,.2))+
70 scale_y_continuous(breaks=seq(0,1,.2))+
71
72 xlab("of Total Population")+
73 ylab("of Total Bad/Good")+
74
75 ggtitle(label="KS - Chart")+
76
77 theme_bw()+
78
79 theme(
80 plot.title=element_text(colour="gray24",size=12,face="bold"),
81 plot.background = element_rect(fill = "gray90"),
82 axis.title=element_text(size=10),
83 axis.text=element_text(colour="gray35")
84 )
85
86 result<-list(M_KS=M_KS,Pop=Pop,PlotKS=PlotKS,df_ks=df_ks)
87 return(result)
88 }

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

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曲线对象

R语言绘制KS曲线的更多相关文章

  1. Python绘制KS曲线

    更多大数据分析.建模等内容请关注公众号<bigdatamodeling> python实现KS曲线,相关使用方法请参考上篇博客-R语言实现KS曲线 代码如下: ############## ...

  2. R语言绘制相对性关系图

    准备 第一步就是安装R语言环境以及RStudio 图绘制准备 首先安装库文件,敲入指令,回车 install.packages('corrplot') 然后安装excel导入的插件,点击右上角impo ...

  3. 一幅图解决R语言绘制图例的各种问题

    一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...

  4. R语言绘制空间热力图

    先上图 R语言的REmap包拥有非常强大的空间热力图以及空间迁移图功能,里面内置了国内外诸多城市坐标数据,使用起来方便快捷. 开始 首先安装相关包 install_packages("dev ...

  5. R语言绘制花瓣图flower plot

    R语言中有很多现成的R包,可以绘制venn图,但是最多支持5组,当组别数大于5时,venn图即使能够画出来,看上去也非常复杂,不够直观: 在实际的数据分析中,组别大于5的情况还是经常遇到的,这是就可以 ...

  6. R语言绘制沈阳地铁线路图

    ##使用leaflet绘制地铁线路图,要求 ##(1)图中绘制地铁线路 library(dplyr) library(leaflet) library(data.table) stations< ...

  7. R语言绘制QQ图

    无论是直方图还是经验分布图,要从比较上鉴别样本是否处近似于某种类型的分布是困难的 QQ图可以帮我们鉴别样本的分布是否近似于某种类型的分布 R语言,代码如下: > qqnorm(w);qqline ...

  8. R语言绘制直方图,

    直方图: 核密度函数: 练习题目1: 绘制出15位同学体重的直方图和核密度估计图,并与正态分布的概率密度函数作对比 代码如下: > w <- c(75.0, 64.0, 47.4, 66. ...

  9. R语言绘制正太分布图,并进行正太分布检验

    正态分布 判断一样本所代表的背景总体与理论正态分布是否没有显著差异的检验.   方法一概率密度曲线比较法 看样本与正太分布概率密度曲线的拟合程度,R代码如下: #画样本概率密度图s-rnorm(100 ...

随机推荐

  1. Jenkins + docker ,容器中跑docker服务

    1. 宿主机:安装docker 2. 启动jenkins服务 https://jenkins.io/download/ Jenkins官网找自己需要的镜像版本号进行使用. docker run -it ...

  2. MySQL开发规范与使用技巧总结

    命名规范 1.库名.表名.字段名必须使用小写字母,并采用下划线分割. a)MySQL有配置参数lower_case_table_names,不可动态更改,Linux系统默认为 0,即库表名以实际情况存 ...

  3. 矢量图形(Vector Picture, SVG, PDF)转TiKZ代码

    在使用LaTeX的过程中,我们需要往往需要使用一些图片,譬如,在样式文件中,但是如果在样式文件中使用外部的图片,总感觉不是那么地舒服「请原谅强迫症」.因此,想办法将图形内嵌入LaTeX文件. 首先,我 ...

  4. [综合] ISE的综合结果

    1.count2 == 7‘d12,会被综合成下面这个样子, 7‘d12就是左边下面这根绿线,等于符号在中间的圆圈里. 2.什么线都不点的时候,也就什么也没被选中, 而一旦我点击了某根线,却发现图里到 ...

  5. Secure CRT注册码

    secure CRT 把记忆的东西放在这就行了,:)   SecureCRT 5.2.2的注册码 Name:          Apollo InteractiveCompany:    Apollo ...

  6. nyoj 199-无线网络覆盖 (ceil())

    199-无线网络覆盖 内存限制:64MB 时间限制:3000ms 特判: No 通过数:4 提交数:13 难度:3 题目描述: 我们的乐乐同学对于网络可算得上是情有独钟,他有一个计划,那就是用无线网覆 ...

  7. bootstrap中图片响应式

    主要解决的是在轮播图中图片响应式的问题 目的 各种终端都需要正常显示图片 移动端应该使用更小(体积)的图片 实现方式 给标签添加两个data-属性(如:data-img-sm="小图路径&q ...

  8. 突破至暗时刻,HCIE-RS的6个月成就之路

    我是今年四月份报的HCIE培训,到考完面试总共六个月的时间,对于HCIE整个考试的流程来说,六个月的时间不短,但也不是很长.尤其是面试,需要花费大量的时间和精力,下面我就把我整个备考历程做个简单的分享 ...

  9. 爬虫json文件存储形式

    json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...

  10. 用Spring Security, JWT, Vue实现一个前后端分离无状态认证Demo

    简介 完整代码 https://github.com/PuZhiweizuishuai/SpringSecurity-JWT-Vue-Deom 运行展示 后端 主要展示 Spring Security ...