问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SAS数据清洗之发现异常值

创作时间:
作者:
@小白创作中心

SAS数据清洗之发现异常值

引用
CSDN
1.
https://blog.csdn.net/2401_82677324/article/details/140595901

在数据清洗过程中,发现和处理异常值是一个重要的环节。本文将介绍如何使用SAS软件来检测数据集中的异常值,包括基于均数和标准差的方法,以及基于百分位数的方法。同时,本文还将提供具体的SAS编程代码示例,帮助读者更好地理解和应用这些方法。

1. 确定异常值定义

此处提供两种参考定义:

  1. 均数-3倍标准差~均数+3倍标准差为正常值,否则为异常
  2. p5~p95为正常值,否则为异常

2. 编程实现

1)均数-3倍标准差~均数+3倍标准差为正常值

方法一:使用PROC MEANS

proc means data=index mean std;
    var height;
    output out=std std=std mean=mean;
run;

data _null_;
    set std;
    call symput("uplimit",strip(put(mean+std*3,3.)));
    call symput("lowlimit",strip(put(mean-std*3,3.)));
run;

data index1;
    set index;
    if height>&uplimit or height<&lowlimit then h_outfl="Y";
run;

使用异常值定义1)只发现一个异常值

方法二:使用PROC SQL

proc sql;
    create table index2 as
    select *,
    case 
    when height>mean(height)+std(height)*3 or height<mean(height)-std(height)*3 then "Y" 
    else " "
    end as h_outfl
    from index;
quit;

结果与方法一输出一致。

2)p5~p95为正常值

proc univariate data=index outtable=stat;
    var height;
run;

data _null_;
    set stat;
    call symput("p5",_P5_);
    call symput("p95",_P95_);
run;

data index3;
    set index;
    if height>&p95 or height<&p5 then h_outfl="Y";
run;

通过百分位数的方法,10%的观测会被定义为异常值,比起1)定义会发现更多异常值。

3. 宏程序实现

%macro outlier_check(data,var);
%local rc dsid;
%let dsid=%sysfunc(open(&data));
%do j=1 %to %eval(%sysfunc(countc(&var,","))+1) ; 
%let input_var&j = %upcase(%scan(&var,&j,",")) ;
%if %sysfunc(varnum(&dsid,&&input_var&j)) > 0 %then %do;
%put &&input_var&j EXIST;
proc sql;
create table _&j as
    select &&input_var&j,
        case
      when  &&input_var&j>mean( &&input_var&j) +std(&&input_var&j)*3 or  &&input_var&j<mean(&&input_var&j)-std(&&input_var&j)*3 then "Y" 
        else " "
        end as &&input_var&j.._FLAG 
    from &data;
quit;
%end;
%else %put &&input_var&j NOT EXIST;
data &data.4;
    merge _1-
    %do i=1 %to %eval(%sysfunc(countc(&var,","))+1);
    %if %sysfunc(exist(_&i.)) %then _&i;
    %end;
    ;
run;
%end;
%let rc = %sysfunc(close(&dsid));
%mend;

%outlier_check(index,height);
%outlier_check(index,%str(height,weight));

如果变量不存在,程序会忽略该变量。

参考资料

《sas数据统计分析》第六章

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号