
SAS信用評(píng)分九步曲之第一步數(shù)據(jù)清洗
累積了一段時(shí)間的建模經(jīng)驗(yàn)了,這次想把我在建模中用的代碼分批分享出來(lái),可能寫的東西不是你能用到的,畢竟我們接觸到的數(shù)據(jù)都不一樣。但是譬如文本清洗之類的,看我之前的文章“正則式”還是可以找到解決方法的。我覺得數(shù)據(jù)面并不多,就是就我現(xiàn)有的數(shù)據(jù)做的數(shù)據(jù)處理。希望大神也可以指正我在建模中用的不恰當(dāng)?shù)奶幚頂?shù)據(jù)的方式。那么就開始今天的分享啦。
今天主要想分享給大家的有三個(gè)代碼:“缺失值填充”,“變量缺失值比例”“異常值檢測(cè)”。
1、缺失值填充
缺失值補(bǔ)充這部分的代碼是我在遇到譬如主表的數(shù)據(jù)是有的,但是left join的時(shí)候沒有這個(gè)數(shù)據(jù),但是他并不是缺失,只是客戶真的沒有。譬如房屋貸款筆數(shù),假設(shè)客戶沒有房屋貸款,那么這個(gè)變量就是缺失的,但是他并不是缺失,他實(shí)際上沒有,所以要填補(bǔ)一個(gè)零。這段代碼是對(duì)數(shù)值的字符的整張數(shù)據(jù)集的變量的處理。
%macro missing(data);
data aa;
set &data;
array arr1{*} _NUMERIC_ ;
array arr2{*} _CHARACTER_ ;
do i = 1 to dim(arr1);
if missing(arr1(I)) then do;
arr1(i)=0;
/*這里的arr1(i)=0;根據(jù)自己的需要,要0就是0也可以是別的值*/
end;
if missing(arr1(i)) then do;
arr1(i)=0;
end;
end;
do i = 1 to dim(arr2);
if missing(arr2(I)) then do;
arr2(i)="0";
end;
end;
run;
%mend;
Data填入數(shù)據(jù)集
代碼我都是調(diào)試好的,所以可以直接用。
2、變量缺失值比例
經(jīng)過缺失值填補(bǔ)之后,但是還有些改缺失還是缺失的,這時(shí)候要對(duì)變量做變量缺失率的檢查,我這邊是對(duì)于變量缺失率達(dá)到70%的就去掉這個(gè)變量。具體缺失比率在多少就不要,還是要看自己的業(yè)務(wù)需求。那上代碼吧。這部分的代碼是參考另外這個(gè)公眾號(hào)的妹紙寫的代碼公眾號(hào)是:數(shù)據(jù)分析sas和r和python。
data tmp11;
set raw.jxl_total_t;
array arr1{*} _NUMERIC_ ;
array arr2{*} _CHARACTER_ ;
length variable $50;
do i = 1 to dim(arr1);
if missing(arr1(i)) then do;
variable =vname(arr1(i));/*數(shù)值型缺失*/
output;
end;
end;
do j = 1to dim(arr2);
if missing(arr2(j)) then do;
variable = vname(arr2(j)); /*字符型缺失*/
output;
end;
end;
keep variable;
run;
proc sql noprint;
select count(*) into : N from raw.jxl_total_t;
create table miss as
select variable label = "缺失變量名",
count(*) as frequency label = "缺失頻數(shù)",
input(compress(put(calculated frequency / &N.,percent10.2),'%'),best32.) as percent label = %nrstr("%缺失占比")
from tmp11
group by variable
having percent>70;
quit;
/*統(tǒng)計(jì)缺失頻數(shù)和占比*/
3、異常值檢測(cè)
剔掉缺失嚴(yán)重的變量,那么下一步就是做異常值的檢查,不要讓異常值壞了擬合結(jié)果,畢竟數(shù)據(jù)也是存在一顆老鼠屎壞了一鍋粥。異常值我之前在前面的文章中有用到聚類,有3倍標(biāo)準(zhǔn)差,聚類的話可能對(duì)于字符變量可能好些,3倍標(biāo)準(zhǔn)差的話需要要求數(shù)據(jù)呈正態(tài)分布,但是我的數(shù)據(jù)貌似很難達(dá)到這個(gè)需求。如果需要以上提及的聚類或者是3倍標(biāo)準(zhǔn)差可以點(diǎn):路徑查看啦。那么一下這段代碼我用的箱形圖來(lái)找出異常值,并且將在區(qū)域以外的數(shù)據(jù)集用上下界的值代替。分享的代碼沒有固定的iqr,寫的條件譬如,異常值都在1.5倍iqr達(dá)到1%,那么就將這部分的值判斷為異常值,假設(shè)現(xiàn)在是3iqr外的異常值達(dá)到1%或者小于1%,但是2.5iqr以外的數(shù)據(jù)已經(jīng)達(dá)到了1.5%,那么就行選定3iqr以外的數(shù)據(jù)為異常值。異常值檢查只針對(duì)數(shù)值變量。我是不是廢話很多,我很怕你們理解不了我的意思,如果不知道iqr是什么的,先百度下拉。接下來(lái)上代碼。
%macro pub(data,var);
PROC UNIVARIATE DATA= &data.(where=(&var.^=.)) NOprint;
VAR &var.;
OUTPUT OUT=qdata Q1=q1 Q3=q3 QRANGE=iqr STD=VSTD Mean=VMean;
RUN;
DATA _null_;
SET qdata;
call symput('STD', VSTD);
call symput('Mean', VMean);
CALL SYMPUT("q1",q1);
CALL SYMPUT("q3",q3);
CALL SYMPUT("iqr",compress(iqr));
RUN;
%let qa=%sysevalf(&q1. -(1.5*&iqr.));
%let qb=%sysevalf(&q3. +(1.5*&iqr.));
%let qc=%sysevalf(&q1. -(2*&iqr.));
%let q4=%sysevalf(&q3. +(2*&iqr.));
%let q5=%sysevalf(&q1. -(2.5*&iqr.));
%let q6=%sysevalf(&q3. +(2.5*&iqr.));
%let q7=%sysevalf(&q1. -(3*&iqr.));
%let q8=%sysevalf(&q3. +(3*&iqr.));
%put &q1.&q8.;
DATA outliers;
SET &data.(where=(&var.^=.));
LENGTH severity $2;
severity="";
IF &var. <= &qa. OR &var. >= &qb. THEN severity="1";
else IF &var. <= &qc. OR &var. >= &q4. THEN severity="2";
else IF &var. <= &q5. OR &var. >= &q6. THEN severity="3";
else IF &var. <= &q7. OR &var. >= &q8. THEN severity="4";
IF severity in ("1","2","3","4") THEN OUTPUT outliers;
RUN;
proc sql;
%do f=1 %to 4;
select count(*) into:outliers_&f. from outliers where severity="&f.";
%end;
select count(*) into :n from &data.;
quit;
%put &outliers_1. &outliers_2.;
%put &n.;
%let out_1=%sysevalf(&outliers_1./&n.);
%let out_2=%sysevalf(&outliers_2./&n.);
%let out_3=%sysevalf(&outliers_3./&n.);
%let out_4=%sysevalf(&outliers_4./&n.);
data &data.;
set &data.;
length &var._1 8.;
if &out_1.<0.01 and &var.^=. then do;
if &var. <=&qa. then &var._1=0;
else if &var. >=&qb. then &var._1=&qb.;
else &var._1=&var.;
end;
if &out_2.<0.01 and &var.^=. then do;
if &var. <=&qc. then &var._1=0;
else if &var. >=&q4. then &var._1=&q4.;
else &var._1=&var.;
end;
if &out_3.<0.01 and &var.^=. then do;
if &var. <=&q5. then &var._1=0;
else if &var. >=&q6. then &var._1=&q6.;
else &var._1=&var.;
end;
if &out_4.<0.01 and &var.^=. then do;
if &var. <=&q7. then &var._1=0;
else if &var. >=&q8. then &var._1=&q8.;
else &var._1=&var.;
end;
else do ;
&var._1=. ;
end;
drop &var. ;
rename &var._1=&var. ;
run;
%mend;
pub(data,var) data填入數(shù)據(jù)集,var填入你要檢測(cè)的變量。
代碼中有很多可以優(yōu)化地方,譬如那些重復(fù)的東西就可以用循環(huán)的,你問我為什么不用,是因?yàn)槲覒械酶牧?,如果你想自己?yōu)化一下,就自己優(yōu)化一下吧。如果我后續(xù)優(yōu)化了,再分享給你們也可以。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL 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)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(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ù)全功能周期的專業(yè)操盤手 表格結(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)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(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ù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10