京公网安备 11010802034615号
经营许可证编号:京B2-20210330
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
B+树作为数据库索引的核心数据结构,其高效的查询、插入、删除性能,离不开节点间指针的合理设计。在日常学习和数据库开发中,很 ...
2026-01-30在数据库开发中,UUID(通用唯一识别码)是生成唯一主键、唯一标识的常用方式,其标准格式包含4个短横线(如550e8400-e29b-41d4- ...
2026-01-30商业数据分析的价值落地,离不开标准化、系统化的总体流程作为支撑;而CDA(Certified Data Analyst)数据分析师,作为经过系统 ...
2026-01-30在数据分析、质量控制、科研实验等场景中,数据波动性(离散程度)的精准衡量是判断数据可靠性、稳定性的核心环节。标准差(Stan ...
2026-01-29在数据分析、质量检测、科研实验等领域,判断数据间是否存在本质差异是核心需求,而t检验、F检验是实现这一目标的经典统计方法。 ...
2026-01-29统计制图(数据可视化)是数据分析的核心呈现载体,它将抽象的数据转化为直观的图表、图形,让数据规律、业务差异与潜在问题一目 ...
2026-01-29箱线图(Box Plot)作为数据分布可视化的核心工具,能清晰呈现数据的中位数、四分位数、异常值等关键统计特征,广泛应用于数据分 ...
2026-01-28在回归分析、机器学习建模等数据分析场景中,多重共线性是高频数据问题——当多个自变量间存在较强的线性关联时,会导致模型系数 ...
2026-01-28数据分析的价值落地,离不开科学方法的支撑。六种核心分析方法——描述性分析、诊断性分析、预测性分析、规范性分析、对比分析、 ...
2026-01-28在机器学习与数据分析领域,特征是连接数据与模型的核心载体,而特征重要性分析则是挖掘数据价值、优化模型性能、赋能业务决策的 ...
2026-01-27关联分析是数据挖掘领域中挖掘数据间潜在关联关系的经典方法,广泛应用于零售购物篮分析、电商推荐、用户行为路径挖掘等场景。而 ...
2026-01-27数据分析的基础范式,是支撑数据工作从“零散操作”走向“标准化落地”的核心方法论框架,它定义了数据分析的核心逻辑、流程与目 ...
2026-01-27在数据分析、后端开发、业务运维等工作中,SQL语句是操作数据库的核心工具。面对复杂的表结构、多表关联逻辑及灵活的查询需求, ...
2026-01-26支持向量机(SVM)作为机器学习中经典的分类算法,凭借其在小样本、高维数据场景下的优异泛化能力,被广泛应用于图像识别、文本 ...
2026-01-26在数字化浪潮下,数据分析已成为企业决策的核心支撑,而CDA数据分析师作为标准化、专业化的数据人才代表,正逐步成为连接数据资 ...
2026-01-26数据分析的核心价值在于用数据驱动决策,而指标作为数据的“载体”,其选取的合理性直接决定分析结果的有效性。选对指标能精准定 ...
2026-01-23在MySQL查询编写中,我们习惯按“SELECT → FROM → WHERE → ORDER BY”的语法顺序组织语句,直觉上认为代码顺序即执行顺序。但 ...
2026-01-23数字化转型已从企业“可选项”升级为“必答题”,其核心本质是通过数据驱动业务重构、流程优化与模式创新,实现从传统运营向智能 ...
2026-01-23CDA持证人已遍布在世界范围各行各业,包括世界500强企业、顶尖科技独角兽、大型金融机构、国企事业单位、国家行政机关等等,“CDA数据分析师”人才队伍遵守着CDA职业道德准则,发挥着专业技能,已成为支撑科技发展的核心力量。 ...
2026-01-22在数字化时代,企业积累的海量数据如同散落的珍珠,而数据模型就是串联这些珍珠的线——它并非简单的数据集合,而是对现实业务场 ...
2026-01-22