
sas信用評分之評分卡的生成
今天介紹的“信用風險評分卡研究”中的生成評分卡的代碼,哪一章生成評分卡我琢磨了好久,所以我覺得要是有疑惑的可以看下我寫的這篇文章。至于理論的東西我就不說,基本要學評分卡的,這本書都是人手一本啦。
這個代碼分為三部分:1、準備數(shù)據(jù)集。2、代碼執(zhí)行 3、生成sas代碼。我今天也會按照這個順序介紹下。
1 準備數(shù)據(jù)集。
(1)準備一個邏輯庫,最好數(shù)據(jù)不要太多,可以是本地的也可以是數(shù)據(jù)庫上的。
(2)生成變量碼表:
<1>、數(shù)值的碼表是長這樣子的:
其中-1000和-999代表的是空值。Bin是分組,ll是下限,ul是上限。一定要這么 命名,不要問為什么
<2>、字符的碼表長這樣子:
全部的變量碼表的命名都是“new_q_lcc_six_map”,就是后面有個 “_map”的后綴。
(3)準備變量的woe表。在這里強調(diào)一下,每個變量都是一張碼表還有一張對應的woe表,woe表長下面這樣子:
生成表的規(guī)則是,第一列是變量碼表中的分組,名字是該變量名加上后綴“_b”,第二列就是該分組對應的woe值,命名也是叫woe。Woe值是等下要生成評分的。Woe的命名規(guī)則是,該變量名后面加后綴”_woe”。像上面這個數(shù)據(jù)集,他的數(shù)據(jù)集名稱就叫“new_q_lsix_cnt_woe”。
準備數(shù)據(jù)集中的工作就這樣子啦,強調(diào)一遍,這些數(shù)據(jù)集都必須全部放在我剛才說的那個你準備的邏輯庫里面。
2 代碼執(zhí)行
%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= 這個數(shù)據(jù)集就是你執(zhí)行以下這個過程中outest=產(chǎn)出的數(shù)據(jù)集,其實就是各個變量的系數(shù)。這個說一下(event="1")這個參數(shù),就是假設你的好客戶是1的話,那使用這個outest=產(chǎn)出的數(shù)據(jù)集計算的評分,就是越高分越是好人。
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 你想設置的刻度,這個你也自己看書,我不是很能表達這個參數(shù)的意義
SCDS=cc 輸出數(shù)據(jù)集。
輸出的數(shù)據(jù)集長的是這樣子的:
就是每個變量的區(qū)間對應的分數(shù),方便生成sql或者是sas代碼去對初始變量執(zhí)行。
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=填入你上個代碼生成評分卡的那個輸出數(shù)據(jù)集。
BasePoints=如上代碼
BaseOdds=如上代碼
PDO=如上代碼
IntOpt=1的意思就是使所有的分值都四舍五入為整數(shù)。
FileName 你想把這個代碼放在那里的路徑。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經(jīng)網(wǎng)絡(RNN)家族中,長短期記憶網(wǎng)絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網(wǎng)絡(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調(diào)研數(shù)據(jù)中的深度應用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03