본문 바로가기
SAS

[SAS] 기하평균 및 표준편차 적용시 round error 해결 방법

by SASBIGDATA김진휘 2017. 2. 9.

설명에 앞서서 예로 사용된 이상치제거 방법론에 관한 수식은 의미가 없으며, round error 방법을 해결하는 것을 쉽게 보여주기 위해 기하평균과 기하표준편차를 사용하지 않고, 간단하게 그냥 일반 표준편차를 사용하였을 뿐 방법론적으론 의미가 없음을 알린다.


아래 코드에 주석으로 달아놨지만

핵심은 이것이다.

1. 그룹내 값이 모두 동일할 경우 std는 0로 나오지만 그룹내 단건인 경우는 std가 결측치로 나타남 그러므로 결측치를 0로 변환해줘야함

여러 그룹중에 한 그룹에 모두 동일한 값이 있는 경우도 있다. 이 경우에는 표준편차가 0로 나오지만, 만약 한 그룹이 한건으로 구성되어 있다면 이경우 표준편차는 . (결측치)로 표기된다.

그래서 결측치를 나타내는 .(마침표)를 0값으로 변환시켜줘야 수식에 오류가 생기지 않는다.


2. std가 0인 경우 하한 상한값이 중간에 변환과정이 들어가 round error가 생길수 있음 그래서 비교대상이 되는 기준값도 원값을 변환한 값을 가지고 비교해야 round error 방지됨.



los값을 기준으로 하여 low(하한) high(상한)값과 비교를 하여 이상치이면 in의 값이 0이고 이상치가 아니면 1로 들어와야 하는데 위의 그림에서 inlier값으로 들어와야 하는것이 outlier로 빠져있음을 알수 있다.

이것은 기존 los값은 정수로 들어왔지만 기하평균 +- 3*표준편차 기준이라하면 표준편차가 0값으로 떨어지는 상황일 때 기하평균 값은 로그로 변환하여 평균값을 구하고 다시 exponential 변환을 거치기 때문에 기존의 los 정수값과 비교하면 다른값으로 판단하여 sas창에서는 똑같은 정수로 보이지만 실제 소숫점의 미미한 차이로 인해 round error가 발생해버린다. 이경우 하한 상한을 정수화 시켜서 조정 할수도 있지만 다른 그룹에도 하한 상한의 영향을 끼칠수 있고 이상치 건수도 바뀔수가 있기 때문에 아예 los 기존의 값에서 한번 자연로그를 씌웠다가 exponential 시켜주는 과정을 거친뒤에 변환을 거친 기준값(change_los)과 비교해 주면 위와 같이 round error를 해결 할 수 있다.


자세한 사항은 아래의 코딩과 스크린샷을 첨부한다.


다시한번 말하지만 기하평균 +- 3*표준편차에서 표준편차를 기하표준편차가 아닌 일반 표준편차를 사용한 것은 예를 쉽게 들기 위해 보여준것이고 수학적으로 이상치제거방법론적으로는 의미가 없음을 알린다.




data hwi1;
input g$ los;
cards;
a 3
a 3
a 3
b 1
b 10
b 800
c 5
;
run;

data hwi2;
set hwi1;
ln=log(los);
change_los=exp(ln);
run;

proc means data=hwi2 noprint;
by g;
var los;
output out=hwi3(drop=_type_ _freq_) std=std;
run;

data hwi4;
set hwi3;
if std=. then std=0; /*그룹내 값이 모두 동일할 경우 std는 0로 나오지만 그룹내 단건인 경우는 std가 결측치로 나타남 그러므로 결측치를 0로 변환해줘야함*/
run;

data hwi5;
merge hwi2(in=jin) hwi4(in=hwi);
by g;
if jin;
run;

proc means data=hwi5 noprint;
by g;
var ln;
output out=hwi6(drop=_type_ _freq_) mean=gm;
run;

data hwi7;
set hwi6;
geo=exp(gm);
run;

data hwi8;
merge hwi5(in=jin) hwi7(in=hwi);
by g;
if jin;
run;


data hwi9;
set hwi8;
low=geo-(3*std);
high=geo+(3*std);

if low<=change_los<=high then in='1'; /*std가 0인 경우 하한 상한값이 중간에 변환과정이 들어가 round error가 생길수 있음 그래서 비교대상이 되는 기준값도 원값을 변환한 값을 가지고 비교해야 round error 방지됨.*/
else in='0';
run;

data hwi10;
set hwi8;
low=geo-(3*std);
high=geo+(3*std);

if low<=los<=high then in='1'; /*std가 0인 경우 하한 상한값이 중간에 변환과정이 들어가 round error가 생길수 있음 그래서 비교대상이 되는 기준값도 원값을 변환한 값을 가지고 비교해야 round error 방지됨.*/
else in='0';
run;






www.sasbigdata.com

www.sasbigdata.co.kr

www.kdrg.co.kr


김 진 휘

댓글