
sas字符變量基于bad_rate分組
最近因?yàn)槟P蛿M合的不理想的原因,sas信用評(píng)分的內(nèi)容可能要停更一兩周了,因?yàn)槲疫€沒(méi)能進(jìn)行到模型評(píng)分卡這一步就被跨期驗(yàn)證給拍下來(lái)了,我做的模型,訓(xùn)練的數(shù)據(jù)以及測(cè)試的數(shù)據(jù)指標(biāo)都還不錯(cuò),跨期驗(yàn)證指標(biāo)掉的厲害。希望有經(jīng)驗(yàn)的大神可以在留言區(qū)給我點(diǎn)建議,因?yàn)槟銈兊慕ㄗh可以讓我少走很多彎路。我現(xiàn)在要重新調(diào)整,至于怎么調(diào)整的內(nèi)容,我后面會(huì)做一個(gè)總結(jié)的文章,講對(duì)于指標(biāo)達(dá)不到指標(biāo)的時(shí)候可以有什么方便調(diào)整下指標(biāo),在這些方法之后還調(diào)整不了指標(biāo)的再回頭看變量。
這次分享的代碼是字符變量依據(jù)bad_rate做的一個(gè)分組。之前分享過(guò)給予基尼系數(shù),給予iv值的,那么這次就叫基于bad_rate的吧。這次的代碼可能會(huì)比之前的代碼容易理解很多,而這次的代碼也是我的partner陳先生寫(xiě)的。不要問(wèn)我陳先生是誰(shuí),這是個(gè)秘密。
%macrodatasplit(data,target,group);
proc sql;
create table csm_CASH_MODEL_Train_rank1(
table_name varchar(100)
,col_name varchar(50)
,rank_name numeric
,low numeric
,up numeric
,cnt numeric
,rate numeric
,n1 numeric
,bad_rate numeric
,woe numeric
,iv numeric
,split_type numeric);
quit;
proc sql;
create table csm_CASH_MODEL_Train_rank2(
table_name varchar(100)
,col_name varchar(50)
,rank_name varchar(2000)
,lownumeric ,, ,up numeric
,cnt numeric
,rate numeric
,n1 numeric
,bad_rate numeric
,woe numeric
,iv numeric
,split_type numeric);
quit;
proc sql;/*獲得總記錄數(shù)、總壞客戶(hù)數(shù)、總好客戶(hù)數(shù)*/
select count(*),SUM(&target.),count(*)-SUM(&target.) into :record_cnt,
:bad_cnt,
:good_cnt
from &data.;
quit;
proc contents/*獲取輸入數(shù)據(jù)集的所有變量信息*/
data=&data.
out=CASH_SELECT_MODEL_VALID_V10_CONT
noprint;
run;
data CASH_SELECT_MODEL_VALID_V10_CONT;
set CASH_SELECT_MODEL_VALID_V10_CONT;
where name ^='&target.';
run;
data _null_;
set CASH_SELECT_MODEL_VALID_V10_CONT;
call symput(compress("numobs"),compress(_n_));
run;
%doi=1%to&numobs;
%put&NUMOBS.||&i.;
data _null_;
pointer=&i.;
set CASH_SELECT_MODEL_VALID_V10_CONT POINT=POINTER;
call symput('col_name', NAME);
call symput('TYPE', put(TYPE,1.));
stop;
run;
%if&TYPE.=2%then%do;
proc sql;
create table &col_name.as select
&col_name.
,sum(&target.)/count(1) as bad_rate
,sum(&target.) as &target.
,count(1) as num
from &data.
group by &col_name.;
quit;
%put&col_name;
%put&type;
proc sql;
select count(1) into:valuenum from &col_name;
quit;
%if&valuenum.>&group.%then%do;
proc rank data= &col_name out = data_rank ties = mean groups = &group.descending;
var bad_rate;
ranks group_name;
run;
proc sql;
create table &data.as
select *,
b.group_name as new_&col_name.
from &data.a
left join data_rank b
ona.&col_name.=b.&col_name.;
quit;
proc sql;
insert into csm_CASH_MODEL_Train_rank1(table_name ,col_name ,rank_name ,low ,up,cnt,rate,n1,bad_rate,woe,iv,split_type)
select"csm_CASH_MODEL_Train_rank","&col_name",group_name ,min(bad_rate) ,max(bad_rate) ,sum(num)
,sum(num)/&record_cnt
,sum(&target.)
,sum(&target.)/sum(num)
,log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))
,(sum(&target.)/&bad_cnt-(sum(num)-sum(&target.))/&good_cnt)*log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))
,&group.
from data_rank
group by group_name;
quit;
%end;
%if&valuenum.<=&group.%then%do;
proc sql;
insert into csm_CASH_MODEL_Train_rank2( table_name ,col_name ,rank_name ,low,up,cnt,rate ,n1 ,bad_rate,woe ,iv ,split_type)
select"csm_CASH_MODEL_Train_rank","&col_name",&col_name.,min(bad_rate) ,max(bad_rate) ,sum(num),sum(num)/&record_cnt
,sum(&target.),sum(&target.)/sum(num)
,log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))
,(sum(&target.)/&bad_cnt-(sum(num)-sum(&target.))/&good_cnt)*log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))
,&valuenum
from &col_name.
group by &col_name.;
quit;
%end;
%end;
%end;
data csm_CASH_MODEL_Train_rank1;
set csm_CASH_MODEL_Train_rank1;
rank_name1=put(rank_name,$8.);
drop rank_name;
rename rank_name1=rank_name;
run;
data csm_CASH_MODEL_Train_rank;
set csm_CASH_MODEL_Train_rank1 csm_CASH_MODEL_Train_rank2;
run;
%mend;
關(guān)于這個(gè)代碼的使用呢,就是下面這樣子啦。
Data:填入你的數(shù)據(jù)集,重點(diǎn)來(lái)啦,這個(gè)數(shù)據(jù)集也是等下的產(chǎn)出的數(shù)據(jù)集,所以你突然覺(jué)得,慘了,我拿錯(cuò)數(shù)據(jù)集,那么你就得重新跑下這個(gè)數(shù)據(jù)集,因?yàn)榻?jīng)過(guò)這個(gè)過(guò)程他已經(jīng)被改變了。
Target:因變量
Group;你要分的組數(shù)。
還有說(shuō)下這個(gè)代碼,因?yàn)槭轻槍?duì)字符的分組,就意味著要是有點(diǎn)變量的觀測(cè)情況就只用3種,那怎么分五組呢,譬如性別啊,你活生生的要是把男女分成5組,這就不道德了哈,所以代碼中對(duì)于觀測(cè)情況少于你的分組數(shù)的就不分組了。
說(shuō)下結(jié)果哈:
變量指標(biāo)統(tǒng)計(jì)表:
產(chǎn)出的表中就有圖中的這些指標(biāo),low以及up是bad_rate的區(qū)間。Cnt是分組統(tǒng)計(jì)的人數(shù),n1是壞客戶(hù)的數(shù)量。后面的split_type是分成幾組。宏里面設(shè)定的5組,所以顯示的是5。
碼表:
這張表是碼表。名字為每個(gè)變量的名字,譬如你這個(gè)變量叫l(wèi)oan_cnt,那么你找到一個(gè)數(shù)據(jù)叫l(wèi)oan_cnt就是loan_cnt的碼表。這個(gè)碼表不是你等下一個(gè)一個(gè)按照主表去leftjoin的哈。這個(gè)主表只要是想你之后要生成評(píng)分或者做數(shù)據(jù)集驗(yàn)證的時(shí)候可以用的。數(shù)據(jù)分析師培訓(xùn)
最后就是主表:
為什么剛才說(shuō)碼表不是主表連的呢,因?yàn)樯傻闹鞅砝锩嬉呀?jīng)有新的分組,new_開(kāi)頭的就是新生成的變量。便于后面的區(qū)分。
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
訓(xùn)練與驗(yàn)證損失驟升:機(jī)器學(xué)習(xí)訓(xùn)練中的異常診斷與解決方案 在機(jī)器學(xué)習(xí)模型訓(xùn)練過(guò)程中,“損失曲線” 是反映模型學(xué)習(xí)狀態(tài)的核心指 ...
2025-09-19解析 DataHub 與 Kafka:數(shù)據(jù)生態(tài)中兩類(lèi)核心工具的差異與協(xié)同 在數(shù)字化轉(zhuǎn)型加速的今天,企業(yè)對(duì)數(shù)據(jù)的需求已從 “存儲(chǔ)” 轉(zhuǎn)向 “ ...
2025-09-19CDA 數(shù)據(jù)分析師:讓統(tǒng)計(jì)基本概念成為業(yè)務(wù)決策的底層邏輯 統(tǒng)計(jì)基本概念是商業(yè)數(shù)據(jù)分析的 “基礎(chǔ)語(yǔ)言”—— 從描述數(shù)據(jù)分布的 “均 ...
2025-09-19CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-19SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢(xún)效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類(lèi)型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專(zhuān)業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專(zhuān)業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶(hù)體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷(xiāo)案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷(xiāo)成為企業(yè)突圍的核心方 ...
2025-09-11