京公网安备 11010802034615号
经营许可证编号:京B2-20210330
SAS信用评分九步曲之第一步数据清洗
累积了一段时间的建模经验了,这次想把我在建模中用的代码分批分享出来,可能写的东西不是你能用到的,毕竟我们接触到的数据都不一样。但是譬如文本清洗之类的,看我之前的文章“正则式”还是可以找到解决方法的。我觉得数据面并不多,就是就我现有的数据做的数据处理。希望大神也可以指正我在建模中用的不恰当的处理数据的方式。那么就开始今天的分享啦。
今天主要想分享给大家的有三个代码:“缺失值填充”,“变量缺失值比例”“异常值检测”。
1、缺失值填充
缺失值补充这部分的代码是我在遇到譬如主表的数据是有的,但是left join的时候没有这个数据,但是他并不是缺失,只是客户真的没有。譬如房屋贷款笔数,假设客户没有房屋贷款,那么这个变量就是缺失的,但是他并不是缺失,他实际上没有,所以要填补一个零。这段代码是对数值的字符的整张数据集的变量的处理。
%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;根据自己的需要,要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填入数据集
代码我都是调试好的,所以可以直接用。
2、变量缺失值比例
经过缺失值填补之后,但是还有些改缺失还是缺失的,这时候要对变量做变量缺失率的检查,我这边是对于变量缺失率达到70%的就去掉这个变量。具体缺失比率在多少就不要,还是要看自己的业务需求。那上代码吧。这部分的代码是参考另外这个公众号的妹纸写的代码公众号是:数据分析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));/*数值型缺失*/
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 = "缺失频数",
input(compress(put(calculated frequency / &N.,percent10.2),'%'),best32.) as percent label = %nrstr("%缺失占比")
from tmp11
group by variable
having percent>70;
quit;
/*统计缺失频数和占比*/
3、异常值检测
剔掉缺失严重的变量,那么下一步就是做异常值的检查,不要让异常值坏了拟合结果,毕竟数据也是存在一颗老鼠屎坏了一锅粥。异常值我之前在前面的文章中有用到聚类,有3倍标准差,聚类的话可能对于字符变量可能好些,3倍标准差的话需要要求数据呈正态分布,但是我的数据貌似很难达到这个需求。如果需要以上提及的聚类或者是3倍标准差可以点:路径查看啦。那么一下这段代码我用的箱形图来找出异常值,并且将在区域以外的数据集用上下界的值代替。分享的代码没有固定的iqr,写的条件譬如,异常值都在1.5倍iqr达到1%,那么就将这部分的值判断为异常值,假设现在是3iqr外的异常值达到1%或者小于1%,但是2.5iqr以外的数据已经达到了1.5%,那么就行选定3iqr以外的数据为异常值。异常值检查只针对数值变量。我是不是废话很多,我很怕你们理解不了我的意思,如果不知道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填入数据集,var填入你要检测的变量。
代码中有很多可以优化地方,譬如那些重复的东西就可以用循环的,你问我为什么不用,是因为我懒得改了,如果你想自己优化一下,就自己优化一下吧。如果我后续优化了,再分享给你们也可以。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在Python数据分析中,Pandas库的DataFrame是最核心、最常用的结构化数据表对象,类似于Excel的二维表格,具备规整的行列结构、字 ...
2026-09-07在数据分析、经营复盘、业绩预测与经济统计工作中,平均增速(平均增长率)是衡量数据长期变化趋势、业务发展快慢的核心指标。不 ...
2026-09-07 很多数据分析师精通Excel单元格操作,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质区别”“为什么表结 ...
2026-09-07随着大数据技术的快速发展,商业竞争逐步从传统的经验式经营转变为数据驱动的精细化运营。海量的用户行为数据、交易数据、运营数 ...
2026-09-04CDA数据分析师 出品 作者:李诗怡 1. 波士顿矩阵(BCG Matrix) 定义: BCG于1970年提出的业务组合分析工具,以"市场增长率"(纵 ...
2026-09-04 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-09-04数据透视表是Excel与Power BI中最核心的数据分析工具,具备快速汇总、维度拆分、动态筛选的能力,可高效完成数据归类与统计展示 ...
2026-09-03在Power BI数据分析可视化场景中,堆积柱状图+折线图是最常用的复合图表组合。堆积柱状图适合展示各细分维度当期数值、结构占比 ...
2026-09-03 很多数据分析师每天与Excel打交道,但当被问到“表格结构数据的基本处理单位是什么”“数据类型误判会引发哪些分析错误”“ ...
2026-09-03CDA数据分析师 出品 作者:李诗怡 一、8个核心数据清洗函数 1. TRIM:一键清除多余空格(最常用) 作用:仅保留文本中"单词/字 ...
2026-09-02数据分析的核心并非单纯操作工具、整理报表或绘制图表,而是依靠科学的思维逻辑挖掘数据价值、解释业务现象、指导经营决策。在完 ...
2026-09-02在社会经济、产业研究、区域治理与大数据实证分析中,面板数据是最具研究价值的数据类型。面板数据同时包含截面维度与时间维度信 ...
2026-09-02 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-09-02在数据驱动决策的体系中,数据分析按照分析目的可分为描述性分析、诊断性分析、预测性分析与指导性分析四大类型。其中,诊断性分 ...
2026-09-01网络请求是Python爬虫开发、接口测试、数据拉取的核心基础功能,Python生态中主要依靠 urllib 和 requests 两大库实现HTTP请求操 ...
2026-09-01 很多数据分析师面对业务问题时,常常感到“知道要分析,却不知道用什么方法”。其实,数据分析并非无章可循——从三大基础范 ...
2026-09-01在数据库设计与业务数据维护中,自增ID是数据表最常用的主键字段,用于唯一标识每一条业务数据,正常状态下ID应保持连续递增。但 ...
2026-08-31在数理统计、数据分析、经济测算与日常量化评估中,平均值是刻画数据集中趋势、反映整体水平的基础核心指标。在实际应用中,最常 ...
2026-08-31在数据驱动的时代,数据分析早已不是“凭经验、靠感觉”的零散操作,而是一套具备固定逻辑、标准化流程的系统方法——这就是数据 ...
2026-08-31在大数据时代背景下,海量行业数据亟需通过专业化工具挖掘潜在价值,辅助企业业务决策、优化运营模式、规避经营风险。Python凭借 ...
2026-08-28