본문 바로가기
공부중/1 SAS

SAS 빈도분석 [PROC TABULATE]

by E__E 2020. 2. 23.

데이터를 처음 확인할때 각 변수별로 빈도를 점검한다. 
[PROC FREQ]는 가장 많이 쓰는 함수인데, N개의 변수를 쓰면 N개의 빈도표가 출력된다. 
한개의 테이블에서 여러개 변수의 빈도표를 출력하고 싶을때 (dummy table등을 만들때)

[PROC TABULATE] 를 사용하면 좀 더 편리하겠다. 
(결과창을 엑셀에 여러번 복/붙 하는 시간도 줄일 수 있다.) 

 

[PROC TABULATE] syntax

*데이터 출처: 공공데이터 포털, (건강보험심사평가원의 요양기관 개설 현황) 

 

[Institution]이라는 데이터셋을 사용해서 연습해보자. 

(오픈 데이터이지만 주소는 그냥 가렸습니다. '_' ) 

[Institution 데이터 형태, N=94865]

 

1) 시도명(SIDO), 요양기관종별(medical_type), 표시과목(subject) 의 빈도 출력

PROC FREQ data=institution; 
tables SIDO medical_type subject/missing norow nocol nocum; 
run; 

PROC TABULATE data=institution; 
class SIDO medical_type subject;
tables SIDO medical_type subject, all; 
run

PROC FREQ(왼) vs TABULATE(오)

FREQ는 각 변수에 대해 하나씩 TABLE이 생성되고, TABULATE는 한개의 테이블에 출력되는데, 사실 1개의 변수에 대한 결과는 별 차이가 없다. (FREQ가 더 편할수도...) 

 

2) 전국을 수도권/비수도권으로 나누어서 2*2table을 만들어보자. 

 2-1) 수도권=1, 비수도권=2 로 코딩된 CAPITAL이라는 새로운 변수 생성. 

 data a1;

 set institution;
  if substr(SIDO,1,4) in ('서울','경기','인천') then capital=1;  else capital=2; 
 run; 

이제 수도권별 요양기관종별, 표시과목의 빈도를 확인해보자. 

PROC TABULATE data=a1; 
class capital medical_type subject;
tables all medical_type subject, all capital
run

(변수 앞에 all을 써주면 행, 열의 전체 합계가 함께 출력된다. 한쪽에만 써줘도 됨.) 

** 빈도 뿐 아니라 행, 열의 백분율도 함께 출력가능하다. 

 행의 합=100%로 표현: rowPCTN

 열의 합=100%로 표현: colPCTN 

(명령문 쓸때 대/소문자는 상관없음) 

 

PROC TABULATE data=a1;
class capital medical_type subject;
tables all medical_type subject, all capital*(N rowPCTN); /*행의 합=100%*/ 

run;  

 

*옵션추가하기. 
*①출력되는 결과에 대한 '이름'을 설정할 수 있다. (ex. n=빈도, 행의 합=(가로or세로)%) 

*②결측값에 대한 표시 설정. (ex. 결측값은 0으로 표시) 

 -tables문 작성 후 /misstext='결측값으로 표시하려는 값' ;   
PROC TABULATE data=a1;
class capital medical_type subject;
tables all medical_type subject

   , all capital*(N='빈도'  rowPCTN='가로%' colPCTN='세로%') /misstext='0';

run;  

 

 >> 옵션추가 전/후 출력 결과 비교.  (결과표가 길어 중간에 생략하였습니다.) 

빈도, 백분율 출력결과 

 

3) 조건에 맞는 빈도표 출력하기. (FREQ함수와 동일하게 where문을 사용!) 

  ex. 요양기관 종별의 종류 중 "의원"과 "종합병원"의 세부과목은 어떻게 분류되어있는지 확인해보자. 

 

PROC TABULATE  data=a1 ; 
where medical_type in ('의원','종합병원'); 
class capital medical_type subject;
tables all medical_type*subject, all capital*(N='빈도'  colPCTN='%') /misstext='0' ;

run;

요양기관종별 세부과목코드

출력결과를 보면, 현재 데이터는 종합병원은 모두 '해당사항없음'으로, 의원은 24개의 세부과목으로 코딩되어 있음을 확인 할 수 있다.  그리고 의원의 경우 수도권/비수도권 모두 일반의, 내과, 이비인후과 순으로 많음을 알 수 있다. 

 

이렇게 [PROC TABULATE]는 한개의 테이블에서 조건에 맞는 빈도와 백분율을 편리하게 출력할 수 있다.

여기에 앞에서 작성했던 VAR함수도 함께 넣어 빈도, 백분율, 평균, 표준편차 등도 추가해서 한꺼번에 출력이 가능하다. 

 

CLASS문에는 TABLE문에 적을 변수가 모두 들어가야함을 잊지 말자~!

 

- 끝 -