在平时的工作中,不管是建模还是做一些变量分析探索很多时候都需要了解变量对好坏客户的区分能力如何,这种情况下通常需要计算变量的IV值,IV的计算公式是

其中,gpct是好客户的占比,bpct表示坏客户的占比。
下面直接给出SAS计算变量IV值得代码,这段代码是我自己写的,适用于数值型和字符型变量的IV计算,在调用之前还是要做一些相应的设置的,比如路径、数据集、特殊值等。

上表是经验上的参考值,IV越大对模型的效果来说肯定更好,在实际中很多时候IV高的变量非常少,更多地靠众多低IV的变量来构建模型,这时候如果需要模型有一个比较好的区分效果可能就要从算法方面做一些改变了,比如用集成算法或深度学习算法去代替传统的LR模型。

LIBNAME IV 'F:\WORK\IV';*存放结果路径;
/***********跑IV前需要进行相应设置*****************/
%LET INDATA=Creditcard1;*原数据集;
%LET EXP_VAR='CustID','Status';*不参与计算的变量如ID,好坏标签等,注意大小写;
%LET SPE_VAR=.,-9999,9999,-9993;*数值变量特殊值,需要做更改;
%LET N=10;*除特殊值外,数值变量最大分组数;
%LET GB=Status;*好坏标签字段,用0,1表示;
/***********跑IV前需要进行相应设置*****************/
%MACRO IV;
PROC CONTENTS DATA=&INDATA OUT=VARLIST(KEEP=NAME TYPE WHERE=(NAME NOT IN (&EXP_VAR))) NOPRINT;
RUN;
DATA DATA_CHAR DATA_NUM;SET VARLIST;IF TYPE=1 THEN OUTPUT DATA_NUM;ELSE OUTPUT DATA_CHAR;
RUN;
%LET DISD=%SYSFUNC(OPEN(DATA_CHAR));
%LET NCHAR=%SYSFUNC(ATTRN(&DISD,NOBS));
%PUT &NCHAR;
%LET C=%SYSFUNC(CLOSE(&DISD));%LET DISD=%SYSFUNC(OPEN(DATA_NUM));
%LET NNUM=%SYSFUNC(ATTRN(&DISD,NOBS));
%PUT &NNUM;
%LET C=%SYSFUNC(CLOSE(&DISD));/*数值变量计算IV*/
%IF &NNUM>0 %THEN %DO;DATA _NULL_;SET DATA_NUM END=LAST;CALL SYMPUT(COMPRESS('NVAR'||_N_),NAME);IF LAST THEN CALL SYMPUT('N_NOBS',_N_);RUN;%MACRO NUM_IV;DATA IV.IV_NUM_VAR;FORMAT LABEL $100. NAME $32. IV;STOP;RUN;%DO I=1 %TO &N_NOBS;DATA DATA_REG DATA_NREG;SET &INDATA(KEEP=&&NVAR&I &GB);IF &&NVAR&I IN (&SPE_VAR) THEN OUTPUT DATA_NREG;ELSE OUTPUT DATA_REG;RUN;%LET TDISD=%SYSFUNC(OPEN(DATA_NREG));%LET TNNUM=%SYSFUNC(ATTRN(&TDISD,NOBS));%PUT &TNNUM;%LET TC=%SYSFUNC(CLOSE(&TDISD));PROC RANK DATA=DATA_REG OUT=RANK GROUPS=&N;VAR &&NVAR&I;RANKS BIN;RUN;PROC MEANS DATA=RANK N MAX MIN NOPRINT;CLASS BIN;VAR &&NVAR&I;OUTPUT OUT=RANK1;RUN;PROC TRANSPOSE DATA=RANK1(WHERE=(NOT MISSING(BIN) AND _STAT_ IN ('MAX','MIN')))OUT=RANK2(DROP =_NAME_ RENAME=(MIN=START MAX=END));BY BIN;ID _STAT_;VAR &&NVAR&I;RUN;DATA RANK3;SET RANK2;LENGTH BIN_GROUP $30.;BIN_GROUP=COMPRESS(_N_||'、'||START||'-'||END);RUN;PROC SQL;CREATE TABLE RANK4 ASSELECTBIN,SUM(CASE WHEN &GB=0 THEN 1 ELSE 0 END) AS G_CNT,SUM(CASE WHEN &GB=1 THEN 1 ELSE 0 END) AS B_CNTFROM RANKGROUP BYBIN;QUIT;DATA RANK5;FORMAT BIN _LABEL_ BIN_GROUP;MERGE RANK3 RANK4;BY BIN;RUN;%IF &TNNUM>0 %THEN %DO;PROC SQL NOPRINT;SELECT DISTINCT &&NVAR&I INTO :NREG_VAR SEPARATED BY ',' FROM DATA_NREG;CREATE TABLE DATA_NREG1 ASSELECT"0、&NREG_VAR" AS BIN_GROUP FORMAT $30.,SUM(CASE WHEN &GB=0 THEN 1 ELSE 0 END) AS G_CNT,SUM(CASE WHEN &GB=1 THEN 1 ELSE 0 END) AS B_CNTFROM DATA_NREGGROUP BY"0、&NREG_VAR";QUIT;DATA RANK6;FORMAT _LABEL_ BIN_GROUP $30. START END G_CNT B_CNT;SET DATA_NREG1 RANK5;KEEP _LABEL_ BIN_GROUP START END G_CNT B_CNT;RUN;%END;%ELSE %DO;DATA RANK6;FORMAT _LABEL_ BIN_GROUP $30. START END G_CNT B_CNT;SET RANK5;KEEP _LABEL_ BIN_GROUP START END G_CNT B_CNT;RUN;%END;DATA RANK7;SET RANK6 END=LAST;IF _N_=1 THEN DO;CUM_G_CNT=0;CUM_B_CNT=0;END;CUM_G_CNT+G_CNT;CUM_B_CNT+B_CNT;IF LAST THEN DO;CALL SYMPUT('TOTG',CUM_G_CNT);CALL SYMPUT('TOTB',CUM_B_CNT);END;RUN;DATA IV.&&NVAR&I;SET RANK7 END=LAST;G_CNT_PCT=ROUND(G_CNT/&TOTG,0.0001);B_CNT_PCT=ROUND(B_CNT/&TOTB,0.0001);BAD_RATE=ROUND(B_CNT/(B_CNT+G_CNT),0.0001);IF B_CNT_PCT^=0 AND G_CNT_PCT^=0 THEN WOE=ROUND(LOG(G_CNT_PCT/B_CNT_PCT),0.0001);ELSE WOE=0;IV_SEG=ROUND((G_CNT_PCT-B_CNT_PCT)*WOE,0.0001);IF _N_=1 THEN IV=0;IV+IV_SEG;KEEP _LABEL_ BIN_GROUP START END G_CNT B_CNT BAD_RATE WOE IV;RENAME _LABEL_=LABEL;RUN;DATA TEMP_IV;FORMAT LABEL NAME $32. IV;SET IV.&&NVAR&I END=LAST;NAME="&&NVAR&I";IF LAST;KEEP LABEL NAME IV;RUN;DATA IV.IV_NUM_VAR;SET IV.IV_NUM_VAR TEMP_IV;RUN;%END;%MEND;%NUM_IV;
%END;/*字符变量计算IV*/
%IF &NCHAR>0 %THEN %DO;DATA _NULL_;SET DATA_CHAR END=LAST;CALL SYMPUT(COMPRESS('CVAR'||_N_),NAME);IF LAST THEN CALL SYMPUT('C_NOBS',_N_);RUN;%MACRO CHAR_IV;DATA IV.IV_CHAR_VAR;FORMAT LABEL $100. NAME $32. IV;STOP;RUN;%DO I=1 %TO &C_NOBS;DATA DATA_REG;SET &INDATA(KEEP=&&CVAR&I &GB);RUN;PROC SQL;CREATE TABLE RANK1 ASSELECT&&CVAR&I,SUM(CASE WHEN &GB=0 THEN 1 ELSE 0 END) AS G_CNT,SUM(CASE WHEN &GB=1 THEN 1 ELSE 0 END) AS B_CNTFROM DATA_REGGROUP BY&&CVAR&I;QUIT;DATA RANK2;FORMAT LABEL BIN_GROUP;SET RANK1 END=LAST;LABEL=VLABEL(&&CVAR&I);BIN_GROUP=COMPRESS(_N_||'、'||&&CVAR&I);IF _N_=1 THEN DO;CUM_G_CNT=0;CUM_B_CNT=0;END;CUM_G_CNT+G_CNT;CUM_B_CNT+B_CNT;IF LAST THEN DO;CALL SYMPUT('TOTG',CUM_G_CNT);CALL SYMPUT('TOTB',CUM_B_CNT);END;RUN;DATA IV.&&CVAR&I;SET RANK2 END=LAST;G_CNT_PCT=ROUND(G_CNT/&TOTG,0.0001);B_CNT_PCT=ROUND(B_CNT/&TOTB,0.0001);BAD_RATE=ROUND(B_CNT/(B_CNT+G_CNT),0.0001);IF B_CNT_PCT^=0 AND G_CNT_PCT^=0 THEN WOE=ROUND(LOG(G_CNT_PCT/B_CNT_PCT),0.0001);ELSE WOE=0;IV_SEG=ROUND((G_CNT_PCT-B_CNT_PCT)*WOE,0.0001);IF _N_=1 THEN IV=0;IV+IV_SEG;KEEP _LABEL_ BIN_GROUP G_CNT B_CNT BAD_RATE WOE IV;RUN;DATA TEMP_IV;FORMAT LABEL NAME $32. IV;SET IV.&&CVAR&I END=LAST;NAME="&&CVAR&I";IF LAST;KEEP LABEL NAME IV;RUN;DATA IV.IV_CHAR_VAR;SET IV.IV_CHAR_VAR TEMP_IV;RUN;%END;%MEND;%CHAR_IV;
%END;
%MEND;%IV;

SAS计算IV代码分享相关推荐

  1. 【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第二大问代码分享+解题思路(EDA数据再探索+LightGBM模型)

    [第十一届泰迪杯B题产品订单的数据分析与需求预测]第二大问代码分享+解题思路(EDA数据再探索+LightGBM模型) 写在前面: ​ 拖了这么长时间,一方面是我在找实习面试准备.另一方面是在做第二问 ...

  2. 风控ML[11] | 3种连续变量分箱方法的代码分享

    大家好呀!在上一篇文章<风控建模中的自动分箱的方法有哪些>中我们介绍了3种业界常用的自动最优分箱方法. 1)基于CART算法的连续变量最优分箱 2)基于卡方检验的连续变量最优分箱 3)基于 ...

  3. python登录代码思路_用python登录Dr.com思路以及代码分享

    用python登录Dr.com思路以及代码分享 发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...

  4. python最优分箱计算iv值_Python计算woe和iv值

    计算逻辑 先计算WOE值,再计算IV值. 其中Y或N分别是YES,NO,反应在因变量中,就是1和0. Yi是第i组中1的个数,YT是所有(Total)为1的个数. Ni是第i组中0的个数,NT是所有( ...

  5. java str2date,java date类与string类实例代码分享

    Date类用来指定日期和时间,其构造函数及常用方法如下: publicDate() 从当前时间构造日期时间对象. publicStringtoString() 转换成字符串. publiclongge ...

  6. python代码标识码_代码分享:使用Python和Tesseract来识别图形验证码

    原标题:代码分享:使用Python和Tesseract来识别图形验证码 *本文原创作者:ipenox,本文属FreeBuf原创奖励计划,未经许可禁止转载 各位在企业中做Web漏洞扫描或者渗透测试的朋友 ...

  7. python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  8. 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  9. 使用IText组件在PDF文档上绘制椭圆形印章的算法分析及代码分享

    1. 引言 PDF是一种和操作系统及平台无关的.可移植的电子文件格式,其以PostScript语言图像模型为基础,无论在哪种打印机上,都可保证精确的颜色和准确的打印效果.PDF将真实地再现原稿的每一个 ...

  10. 【2023年电工杯数学建模竞赛】选题分析+A题B题完整思路+代码分享

    2023年电工杯B题(附带ChatGpt思路)思路已更新,请点击一下链接 [2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价]完整思路分析+完整代码+(附带ChatGpt思路) 1.竞赛 ...

最新文章

  1. php如何word转html格式文件,PHP将上传word文件,转化为Html格式,(多种转换方式)
  2. jQuery的get()和post()方法
  3. MySQL month()函数
  4. debian 访问 windows 共享_【续】windows环境redis未授权利用方式梳理
  5. 廖雪峰JS教程--条件判断
  6. Android -- App生成快捷方式
  7. 本硕985非科班渣硕2020腾讯计算机视觉算法实习面经(已获Offer)
  8. Jenkins安装部署篇
  9. python怎么弄成白色背景_使用PIL python将白色背景转换为透明背景
  10. leetcode题库1314-- 矩阵区域和
  11. 招聘数下降71%!程序员:你的努力正在毁掉自己!
  12. python print 换行_和我一起学Python?第1讲——Print()函数
  13. 红外条码扫描器的另类使用C#版
  14. 修改jsp文件刷新网页没有更新
  15. 福尔曼大学计算机排名,留学选校指南|纽约时报2019美国精英群体认可的大学榜单Top50...
  16. 计算机电缆电阻值,一文看懂5个电线电缆电阻检测方法
  17. python实现杨辉三角的规律_Python实现杨辉三角算法
  18. python中检测键盘(上下左右) 代码
  19. 时序分析(8) -- GARCH(p,q)模型
  20. 下载的caj论文怎么转换成pdf?

热门文章

  1. Swagger自动生成接口文档
  2. PlantUML——程序员画架构图都靠它
  3. 服务器硬盘raid方案,服务器RAID磁盘阵列经验总结
  4. Power bi 3.10 折线和堆积柱形图
  5. java 一元二次方程_java求解一元二次方程
  6. jsdroid 教程_电气设计编程视频教程,涉及PLC、电气绘图、仿真等共400多份资料...
  7. 计算机win10无法打开小键盘,win10系统下小键盘数字键不能用怎么办_win10电脑小键盘数字键不能用如何解决...
  8. 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配自定义home三型)
  9. IEEE会议或期刊检索方法
  10. 如何在UEFI模式下安装Linux,详解 UEFI 模式下安装 Linux