
sas信用评分之评分卡的生成
今天介绍的“信用风险评分卡研究”中的生成评分卡的代码,哪一章生成评分卡我琢磨了好久,所以我觉得要是有疑惑的可以看下我写的这篇文章。至于理论的东西我就不说,基本要学评分卡的,这本书都是人手一本啦。
这个代码分为三部分:1、准备数据集。2、代码执行 3、生成sas代码。我今天也会按照这个顺序介绍下。
1 准备数据集。
(1)准备一个逻辑库,最好数据不要太多,可以是本地的也可以是数据库上的。
(2)生成变量码表:
<1>、数值的码表是长这样子的:
其中-1000和-999代表的是空值。Bin是分组,ll是下限,ul是上限。一定要这么 命名,不要问为什么
<2>、字符的码表长这样子:
全部的变量码表的命名都是“new_q_lcc_six_map”,就是后面有个 “_map”的后缀。
(3)准备变量的woe表。在这里强调一下,每个变量都是一张码表还有一张对应的woe表,woe表长下面这样子:
生成表的规则是,第一列是变量码表中的分组,名字是该变量名加上后缀“_b”,第二列就是该分组对应的woe值,命名也是叫woe。Woe值是等下要生成评分的。Woe的命名规则是,该变量名后面加后缀”_woe”。像上面这个数据集,他的数据集名称就叫“new_q_lsix_cnt_woe”。
准备数据集中的工作就这样子啦,强调一遍,这些数据集都必须全部放在我刚才说的那个你准备的逻辑库里面。
2 代码执行
%macro SCScale(BasePoints, BaseOdds, PDO, M_alpha, M_beta);
%local bb;
%let bb=%sysevalf(&PDO / %sysfunc(log(2)));
%let &M_Beta = &bb;
%let &M_alpha= %sysevalf(&BasePoints - &bb * %sysfunc(log(&BaseOdds)));
%mend;
%macro GenSCDS(ParamDS, Lib, DVName, BasePoints, BaseOdds, PDO, SCDS);
%local alpha beta;
%let alpha=;
%let beta=;
%SCScale(&BasePoints, &BaseOdds, &PDO, alpha, beta);
proc transpose data =&ParamDS out=temp_mpt;
run;
%local Intercept;
data temp_mptc;
set temp_mpt;
length VarName $32.;
length MapDS $32.;
length WOEDS $32.;
if _Name_ eq 'Intercept' then do;
call symput('Intercept', compress(&DVName));
delete;
end;
ix=find(upcase(_Name_),'_WOE')-1;
if ix >0 then VarName=substr(_Name_,1,ix);
MapDS=compress(VarName)||'_MAP';
BinName=compress(VarName)||'_b';
WOEDS=_Name_;
Parameter=&DVName;
if _Name_ ne '_LNLIKE_' and &DVName ne . ;
keep VarName BinName MapDS WOEDS Parameter;
run;
%local SCBase;
%let SCBase = %sysfunc(int(&alpha + &beta * &Intercept));
%local i N;
data _null_;
set temp_mptc;
call symput('N',compress(_N_));
run;
%do i=1 %to &N;
%local V_&i P_&i WOE_&i Map_&i;
%end;
data _null_;
set temp_mptc;
call symput('V_'||left(_N_),compress(VarName));
call symput('B_'||left(_N_),compress(BinName));
call symput('P_'||left(_N_),compress(Parameter));
call symput('WOE_'||left(_N_),"&Lib.."||compress(WOEDS));
call symput('Map_'||left(_N_),"&lib.."||compress(MapDS));
run;
%put &&Map_&i.;
proc sql noprint;
create table &SCDS (VarName char(80), UL num, LL num, Points num);
insert into &SCDS values('_BasePoints_' , 0 , 0 , &SCBase);
run; quit;
%do i=1 %to &N;
data temp1;
set &&WOE_&i;
bin=&&B_&i;
VarName="&&V_&i";
ModelParameter=&&P_&i;
run;
proc sort data=temp1;
by bin;
run;
proc contents data=&&Map_&i out=temp_cont nodetails noprint;
run;
%local MapType;
proc sql noprint;
select Type into :MapType from temp_cont where upcase(Name)='CATEGORY';
run; quit;
%if &MapType =1 %then %do;
Data &&Map_&i;
set &&Map_&i;
N_category=Category;
drop category;
run;
%end;
proc sort data=&&Map_&i;
by bin;
run;
data temp_v;
merge temp1 &&Map_&i;
by bin;
run;
proc sort data=temp_v;
by VarName;
run;
proc sort data=&SCDS;
by VarName;
run;
data temp_all;
merge &&SCDS temp_v;
by VarName;
run;
Data &SCDS;
set temp_all;
drop &&B_&i;
run;
%end;
data &SCDS;
set &SCDS;
if VarName = '_BasePoints_' then VarType=0;
else do;
Points=-WOE*ModelParameter * &beta ;
if UL ne . and LL ne . then VarType=1;
else if N_Category eq . then VarType=2;
else VarType=3;
end;
drop WOE bin ModelParameter;
run;
proc sort data=&SCDS;
by VarType VarName;
run;
/*proc datasets library=work nodetails;*/
/*delete temp1 temp_all temp_cont temp_mpt temp_mptc temp_v;*/
/*run; quit;*/
%mend;
%GenSCDS(ParamDS=raw.bb, Lib=raw, DVName=appl_status_1, BasePoints=540, BaseOdds=7.5, PDO=20, SCDS=cc);
代码使用:
%GenSCDS(ParamDS=raw.bb, Lib=raw, DVName=appl_status_1, BasePoints=540, BaseOdds=7.5, PDO=20, SCDS=cc);
ParamDS= 这个数据集就是你执行以下这个过程中outest=产出的数据集,其实就是各个变量的系数。这个说一下(event="1")这个参数,就是假设你的好客户是1的话,那使用这个outest=产出的数据集计算的评分,就是越高分越是好人。
Ods Output ParameterEstimates=aa ;
proc logistic data=test.RONG_total12 outest=bb ;
model APPL_STATUS_1(event="1")=
*****
/selection=s sle=0.05 sls=0.05 include=12;
output out=pp
p=pred_status lower=pi_l upper=pi_u;
run;
Lib=填入你第一步哪里我说的准备的逻辑库。
BasePoints=基础分,具体的基础分是什么,书里有详细的解释。
BaseOdds=7.5 违约比正常,7.5那就是违约率大概是11%。具体看样本的坏样本量。
PDO=20 你想设置的刻度,这个你也自己看书,我不是很能表达这个参数的意义
SCDS=cc 输出数据集。
输出的数据集长的是这样子的:
就是每个变量的区间对应的分数,方便生成sql或者是sas代码去对初始变量执行。
3 生成sas代码
%macro SCSasCode(SCDS,BasePoints, BaseOdds, PDO, IntOpt,FileName);
proc sort data=&SCDS;
by VarType VarName;
run;
data _null_;
set &SCDS nobs=nx;
by VarType VarName;
file "&FileName";
length cond $300.;
length value $300.;
if _N_ =1 then do;
put '/*********************************************/' ;
put '/*********************************************/';
put '/***** Automatically Generated Scorecard *****/';
put '/*********************************************/';
put '/************ SAS CODE ********/';
put;
put '/* Scorecard Scale : */';
put "/* Odds of [ 1 : &BaseOdds ] at [ &BasePoints ] Points ";
put " with PDO of [ &PDO ] */";
put;
put '/*********************************************/';
put '/*********************************************/';
put ;
put '/********** START OF SCORING DATA STEP *******/';
put '/*********************************************/';
put '/*********************************************/';
put;
put 'DATA SCORING;/********** Modify ************/';
put ' SET ScoringDataset; /********** Modify ************/';
put;
put '/*********************************************/';
put '/*********************************************/';
end;
/* print the dataset RulesDS */
%if &IntOpt=1 %then xPoints=int(Points);
%else xPoints=Points; ;
if VarName="_BasePoints_" then do;
put '/*********************************************/';
put "/* Base Points */";
put '/*********************************************/';
put "Points=" xPoints ";";
end;
else do;
if first.VarName then do;
put '/*********************************************/';
put "/* Variable : " VarName " *****/";
put '/*********************************************/';
end;
value= " THEN Points=Points +("||compress(xPoints)||");";
/* The rule */
if VarType=1 then do;/* continuous */
if first.VarName then cond='IF '||compress(VarName)||' LE ('||compress(UL) || ') ';
else if last.VarName then cond='IF '||compress(VarName)||' GT ('|| compress(LL)||')';
else cond='IF '||compress(VarName)||' GT ('|| compress(LL)||') AND '||compress(VarName)||' LE ('||compress(UL) || ') ';
end;
else if VarType=2 then /* nominal string */
cond = 'IF '||compress(VarName)||' = '|| quote(compress(Category)) ;
else /* nominal numeric */
cond='IF '||compress(VarName)||' = ('|| compress(N_Category)||') ';
put " " cond value;
end;
if _N_=Nx then do;
put 'RUN;';
put;
put '/*************END OF SCORING DATA STEP *******/';
put '/*********************************************/';
end;
run;
%mend;
%SCSasCode(SCDS=cc,BasePoints=540, BaseOdds=7.5, PDO=20,IntOpt=1,FileName=D:\工作\简版征信\scorecard.sas);
SCDS=填入你上个代码生成评分卡的那个输出数据集。
BasePoints=如上代码
BaseOdds=如上代码
PDO=如上代码
IntOpt=1的意思就是使所有的分值都四舍五入为整数。
FileName 你想把这个代码放在那里的路径。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
机器学习解决实际问题的核心关键:从业务到落地的全流程解析 在人工智能技术落地的浪潮中,机器学习作为核心工具,已广泛应用于 ...
2025-09-09SPSS 编码状态区域中 Unicode 的功能与价值解析 在 SPSS(Statistical Product and Service Solutions,统计产品与服务解决方案 ...
2025-09-09CDA 数据分析师:驾驭商业数据分析流程的核心力量 在商业决策从 “经验驱动” 向 “数据驱动” 转型的过程中,商业数据分析总体 ...
2025-09-09R 语言:数据科学与科研领域的核心工具及优势解析 一、引言 在数据驱动决策的时代,无论是科研人员验证实验假设(如前文中的 T ...
2025-09-08T 检验在假设检验中的应用与实践 一、引言 在科研数据分析、医学实验验证、经济指标对比等领域,常常需要判断 “样本间的差异是 ...
2025-09-08在商业竞争日益激烈的当下,“用数据说话” 已从企业的 “加分项” 变为 “生存必需”。然而,零散的数据分析无法持续为业务赋能 ...
2025-09-08随机森林算法的核心特点:原理、优势与应用解析 在机器学习领域,随机森林(Random Forest)作为集成学习(Ensemble Learning) ...
2025-09-05Excel 区域名定义:从基础到进阶的高效应用指南 在 Excel 数据处理中,频繁引用单元格区域(如A2:A100、B3:D20)不仅容易出错, ...
2025-09-05CDA 数据分析师:以六大分析方法构建数据驱动业务的核心能力 在数据驱动决策成为企业共识的当下,CDA(Certified Data Analyst) ...
2025-09-05SQL 日期截取:从基础方法到业务实战的全维度解析 在数据处理与业务分析中,日期数据是连接 “业务行为” 与 “时间维度” 的核 ...
2025-09-04在卷积神经网络(CNN)的发展历程中,解决 “梯度消失”“特征复用不足”“模型参数冗余” 一直是核心命题。2017 年提出的密集连 ...
2025-09-04CDA 数据分析师:驾驭数据范式,释放数据价值 在数字化转型浪潮席卷全球的当下,数据已成为企业核心生产要素。而 CDA(Certified ...
2025-09-04K-Means 聚类:无监督学习中数据分群的核心算法 在数据分析领域,当我们面对海量无标签数据(如用户行为记录、商品属性数据、图 ...
2025-09-03特征值、特征向量与主成分:数据降维背后的线性代数逻辑 在机器学习、数据分析与信号处理领域,“降维” 是破解高维数据复杂性的 ...
2025-09-03CDA 数据分析师与数据分析:解锁数据价值的关键 在数字经济高速发展的今天,数据已成为企业核心资产与社会发展的重要驱动力。无 ...
2025-09-03解析 loss.backward ():深度学习中梯度汇总与同步的自动触发核心 在深度学习模型训练流程中,loss.backward()是连接 “前向计算 ...
2025-09-02要解答 “画 K-S 图时横轴是等距还是等频” 的问题,需先明确 K-S 图的核心用途(检验样本分布与理论分布的一致性),再结合横轴 ...
2025-09-02CDA 数据分析师:助力企业破解数据需求与数据分析需求难题 在数字化浪潮席卷全球的当下,数据已成为企业核心战略资产。无论是市 ...
2025-09-02Power BI 度量值实战:基于每月收入与税金占比计算累计税金分摊金额 在企业财务分析中,税金分摊是成本核算与利润统计的核心环节 ...
2025-09-01巧用 ALTER TABLE rent ADD INDEX:租房系统数据库性能优化实践 在租房管理系统中,rent表是核心业务表之一,通常存储租赁订单信 ...
2025-09-01