SAS 문법 - 12: 범주형변수 proc freq 수행하기
SAS 라이브러리 파일을 받아서 원하는 디렉토리에 저장한다.
일원빈도표(one-way frequency table)
libname icdb 'd:\tmp';
proc freq data=icdb.back;
tables sex race;
run;
위 SAS 코드를 실행하면 sex와 race 두 범주형변수에 대하여 일원빈도표(일원도수표)를 만든다. tables sex와 race를 넣지 않으면 모든변수에 대하여 도수표를 만들게 된다.
범주형변수의 각 수준(level)에 대하여 빈도표를 만들려면 proc sort를 수행한 후에 proc freq 안에 by 문장을 넣어서 SAS 코드를 수행하면 된다.
proc sort data=icdb.back out=s_back;
by sex;
run;
proc freq data=s_back;
tables ed_level;
by sex;
run;
proc sort에서 성별에따라 정렬을 한 후에 s_back이라는 데이터집합에 넣었다.
proc freq에서 정렬된 s_back을 이용하여 성별에 따라 ed_level의 빈도표를 만들었다.
변수값에 결측값이 있는 경우에는 결측값을 빼고 계산한다. 만약 결측값이 몇개인지 알아보고자 한다면 missing이나 missprint 옵션을 이용한다.
DATA mydat;
INPUT subj 1-4 gender 6 height 8-9 weight 11-13;
DATALINES;
1024 1 65 125
1167 1 68 140
1168 . 68 190
1201 2 72 190
1302 1 63 115
;
RUN;
proc freq data=mydat;
title 'No option to tables statement';
tables gender;
run;
proc freq data=mydat;
title 'missing option to tables statement';
tables gender /missing;
run;
proc freq data=mydat;
title 'missprint option to tables statement';
tables gender /missprint;
run;
결과는 아래와 같다.
옵션 없음
missing 옵션 사용
missprint옵션 사용
이원빈도표(Two-way frequency table)
2개의 변수를 가로 세로 변수로 놓고 빈도표를 만들어보자. 성별에 따른 교육수준을 표로 만들면
libname icdb 'd:\tmp\';
proc freq data=icdb.back;
tables ed_level * sex;
run;
- 성별이 남자(sex = 1)이고 교육수준이 1인 사람은 4명이다.
- 전체 638명중 4명은 62.7%($4 / 638 \times 100 = 0.626$)에 해당한다. 위 표에서는 0.63%로 나와있다.
- 교육수준이 1이고 성별이 남자(sex = 1)인 사람은 여자를 포함한 교육수준이 1인 사람의 36.36%에 해당한다($4/11 \times 100 = 36.36$).
- 교육수준이 1인 남자는 전체 남자의 7.14%에 해당한다($4/56 \times 100 = 7.14$).
위 빈도표는 약간 지저분 하므로 1-4를 선택하여 출력할수가 있다.
- NOFREQ : 표에서 빈도를 없앤다 (위에서 4명에 해당).
- NOPERCENT 전체 %를 없앤다 (위 표의 0.63).
- NOROW row percent를 없앤다 (위 표의 36.36).
- NOCOL column percent를 없앤다(위 표의 7.14).
따라서 빈도만 출력하고 싶다면
proc freq data=icdb.back;
tables ed_level * sex / nocol norow nopercent;
run;
또한 각 cell마다 statistic을 추가할수 있다.
- expected : null hypothesis of independence에 의하여 각 cell 빈도의 기대값을 출력
- cellchi2 : chi squared statistic을 출력
$$\textrm{cellchi2} = \frac { (\textrm{frequency} - \textrm{expected})^2 } {\textrm{expected}}$$
proc freq data=icdb.back;
tables ed_level * sex / expected cellchi2 nocol norow nopercent;
run;
이원빈도표가 너무 지저분하다고 생각되면 이를 아래로 늘리면 쉽게 볼수있다.
list나 crosslist를 사용하는데 list의 결과에는 row percent, column percent, percent등이 포함되지 않는다.
proc freq data=icdb.back;
tables sex * ed_level / crosslist;
* tables ed_level * sex / crosslist;
run;
list 옵션을 사용한 경우
proc freq data=icdb.back;
tables ed_level * sex / list;
run;
데이터로 저장하기
out 옵션을 이용하여 proc freq의 결과를 데이터로 만들수도 있다.
proc freq data=icdb.back;
tables sex * race /out=sexfreq noprint;
run;
proc print data=sexfreq;
run;
sexfreq라는 데이터를 다른 분석에 이용할수 있도록 일렬로 데이터형태를 만들어 저장되었다. noprint옵션을 제거하고 위 SAS코드를 실행하면 어떻게 다른지 알수가 있다.
위 출력결과에서 sex와 race가 0인것들은 모두 제거되었는데 이를 포함시키려면 sparse 옵션을 사용한다.
proc freq data=icdb.back;
tables sex * race /out=sexfreq noprint sparse;
run;
proc print data=sexfreq;
run;