본문 바로가기
SAS

[SAS] sas proc means 기초통계량 결과 데이터 작업 응용 방법

by SASBIGDATA김진휘 2018. 10. 19.

오늘은 SAS의 proc means 프로시저를 통해 나온 기술통계량 결과를 원하는대로 작업하여 본다. sas의 proc means는 정말 자주 사용되어 많은 사람들이 가장 기본적으로 유용하게 사용되는 기술통계량을 구해주는 프로시저이다. 옵션도 다양하고 그룹별로도 통계량을 낼수도 있고 통계량을 데이터셋으로 만들어 추가 핸들링을 통해 원하는 결과보고서 형태로 데이터를 만들어 응용해볼수도 있다. 


오늘 알아볼 내용은 간단하게 소개하면 그룹별 통계량을 구해보는 것이며, 자세하게 들어가면 대분류 세분류 2단 구조의 그룹의 기술통계량을 출력하는데 조건은 세분류별 통계량 출력 아래 대분류 전체 통계량을 각각 끼워넣는 결과를 원한다는 것이다. 어차피 글로는 잘 이해가 되지 않으니 스크린샷과 함께 보며 이해해보자. 


간략하게 설명하면 보통 아래의 왼쪽과 같이 데이터가 있을 경우 g1대분류별 g2소분류별 cost의 대한 기술통계량을 proc means 구문을 활용해 실행하면 오른쪽과 같은 결과가 나타난다.





하지만 여기서 원하는 것은 아래 그림과 같이 대분류 g1에 해당하는 그룹별 전체 통계량 값을 각 대분류 그룹값 아래에 끼워 넣고 싶은것이다. 아래 그림의 g2변수의 T(total을 뜻함)값에 해당하는 g1의 전체 통계량값을 각각 아래에다가 끼워서 함께 보고 싶은 것이다. 그룹이 몇개안되는 케이스는 그냥 엑셀로 툭툭하는게 빠르지만 그룹이 수천개 수만개인 경우는 이야기가 달라지므로 오늘 코딩 몇줄로 간단하게 원하는 보고서의 결과 형태의 데이터로 작업하는 방법을 






1. 아래 왼쪽과 같이 코딩을 짜면 오른쪽과 같은 형태의 test라는 베이스 데이터 셋이 만들어진다. 이 데이터로 예제삼아 실행해보자.



      



2. 보통 우리가 일반적으로 많이 사용하는 proc means 프로시저를 활용하여 기술통계량을 구하면 아래와 같이 나타난다. 기술통계량을 구하는데 g1 그룹 변수 별로 g2 그룹에 대한 cost의 기술통계량을 뽑아주는데 빈도와 최소값 최대값 평균 중앙값을 출력하라 다만 소숫점은 1번째 자리로 반올림한다라는 명령어이다.


위와같은 명령문을 통하면 아래와 같이 전혀 문제 없이 g1그룹별 g2그룹에 대한 통계량값이 출력된다. 하지만 우리가 원하는것은 g1그룹에 대한 전체 통계량 값을 원한다.


3. 그럼 보통 옵션을 적용하면 되지라고 말한다. proc means에서 printalltypes 옵션을 넣으면 모든 타입별 통계량을 아래와 같이 산출해준다. 하지만 원하는것은 이렇게 따로따로가 아닌 각 그룹 아래에 통계량값을 끼워 넣고 싶은것이다. 옵션가지고는 내가 원하는 바의 출력결과 형태로는 한눈에 표현하는데 한계가 있다는 것이다. 그러므로 출력결과를 데이터셋화 하여 간단하게 핸들링하여 원하는대로 출력결과를 핸들링 한다.










4. 우선 아까와 마찬가지고 통계량값을 뽑는데 output out문장을 이용해 통계량값을 출력창에 출력하지 않고 데이터셋으로 저장하여 test1이라는 출력결과 데이터셋을 만든다.




위의 명령문을 실행하면 아래와 같이 test1이라는 데이터셋이 생기는데 g1별 g2별로 cost에 대한 모든 타입별 통계량 수치를 데이터셋화 시킨것이다. 아래 데이터셋을 잘 보면 _TYPE_변수의 값 0는 전체 통계량을 뜻하고, 1은 g2변수의 값에 대한 통계량을 말하며, 2는 대분류 g1별 통계량 값, 3은 g1별 g2별 통계량값을 나타낸다. 우리가 필요한것이 _type_의 2에 해당하는 대분류 통계량값과 3에 해당하는 각각의 분류별 통계량값이 필요한 것이다. 잘보면 결국 g1의 공백값만 지워버리면 우리가 필요한 통계량값만 남게 된다. g1의 공백값을 지우면 결국 _TYPE_ 2와 3만 가져오는셈이니 편한대로 하면된다.





5. 여기서 먼저 g1 변수의 공백에 해당하는 값을 if문의 delete 문장을 통해 제거한다. 그러면 위의 그림 기준으로 8번째 관측치부터 그아래 값들만 남게 된다. 그후 남은 데이터에서 정렬을 하는데 g1별로 _TYPE_에 descending 옵션을 걸어 내림차순 정렬을 실행하면 대분류에 대한 _TYPE_값은 2라는 값을 가지기 때문에 세분류까지 나온 통계량보다 작은값이므로 대분류별 _TYPE_정렬에서 아래에 위치하게 된다. 즉, 각 대분류 그룹인 g1별로 전체 통계량값들이 아래에 위치하게 되는것이다. 




위와같이 기존 test1데이터셋의 g1변수의 공백을 제거후 g1변수별로 우선 정렬후 그다음  _TYPE_변수 앞에 descending 옵션을 걸어 내림차순 정렬을 해주면 아래 결과와 같이 각 g1그룹별로 제일 아래에 그룹 전체 통계량 값이 위치하게 된다. g2의 공백부분인것이다.




6. 이제 마무리로 g2의 공백에 원하는 값(예제에는 T로 합계를 표현했다)을 본인이 보기 편하게 넣어주고 필요가 없어진 _type_ 와 _freq_ 변수를 드랍시켜 날려주면, 내가 원하는 결과 형태의 통계량을 데이터셋화하여 바로 뽑아낼수 있다. 






다소 쉽게 설명하려고 복잡해 보이지만 엄청 간단한 작업이다. 대분류별로 통계량을 뽑고, 대분류 소분류별 통게량을 뽑아 세로병합하여 정렬을 해도되고, 가로병합 merge를 통해 transpose해서 나올수도 있는 등 각자 취향대로 편하게 해서 결과만 나오면 된다. 엑셀로 일일이 작업하고 굳이 통계량을 두번 돌려서 데이터 병합 작업을 하거나 기타 다른 작업 대비 빠르고 수월한 방법인것 같아 한번 쉽게 풀어서 설명해 보았다. 

www.sasbigdata.com







댓글