獨斷論

SAS 문법 - 12: 범주형변수 proc freq 수행하기 본문

과학과 기술/SAS

SAS 문법 - 12: 범주형변수 proc freq 수행하기

부르칸 2021. 10. 3. 04:42

SAS 라이브러리 파일을 받아서 원하는 디렉토리에 저장한다.

back.sas7bdat
0.08MB

 

일원빈도표(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;

  1. 성별이 남자(sex = 1)이고 교육수준이 1인 사람은 4명이다.
  2. 전체 638명중 4명은 62.7%($4 / 638 \times 100 = 0.626$)에 해당한다. 위 표에서는 0.63%로 나와있다.
  3. 교육수준이 1이고 성별이 남자(sex = 1)인 사람은 여자를 포함한 교육수준이 1인 사람의 36.36%에 해당한다($4/11 \times 100 = 36.36$).
  4. 교육수준이 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;

Comments