99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀SAS信用評(píng)分九步曲之第一步數(shù)據(jù)清洗
SAS信用評(píng)分九步曲之第一步數(shù)據(jù)清洗
2017-04-02
收藏

SAS信用評(píng)分九步曲之第一步數(shù)據(jù)清洗

累積了一段時(shí)間的建模經(jīng)驗(yàn)了,這次想把我在建模中用的代碼分批分享出來,可能寫的東西不是你能用到的,畢竟我們接觸到的數(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):路徑查看啦。那么一下這段代碼我用的箱形圖來找出異常值,并且將在區(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是什么的,先百度下拉。接下來上代碼。

%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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }