BookmarkSubscribeRSS Feed

[SAS 활용 노하우] 테이블 작성: TABULATE

Started ‎01-27-2022 by
Modified ‎01-27-2022 by
Views 7,207

 

 

TABULATE 는 여러 가지 요약 통계량들을 다양한 테이블의 형태로 출력시키는 프로시져입니다.

이번 게시글은 TUBULATE 프로시저의 기본적인 사용법을 설명하고 응용 예제들을 통해 여러 형태의 테이블을 작성하는 방법을 다룰 것 입니다.

예제 1) 데이터셋 item 생성.

이번에 사용할 예제 데이터셋은 지역(Region), 성별(Sex), 직업(Job), 나이(Age) 및 3개의 문항( item 1 - item 3) 에 대해서 30명의 사람에게 응답을 받은 것으로 데이터 셋과 사용자 풀력 포맷을 생성하는 프로그램은 아래와 같습니다.

 

 

 

data work.item;
input region $ sex $ job $ age item1 - item3 @@;
label region = '지역' sex = '성별'
      job = '직업'  age = '나이'
      item1 = '문항1' item2 = '문항2' item3 = '문항3';
      
cards;
1 F A 25 1 1 1      2 M B 26 2 1 1      3 F C 31 1 3 1
1 M A 35 1 2 3      2 F C 29 1 1 2      3 F A 28 1 1 1
1 M C 33 2 1 2      2 M A 25 3 2 2      3 M B 24 1 3 2
1 F B 33 2 3 2      2 F A 27 2 1 1      3 F A 29 2 1 3
1 F A 35 1 3 1      2 M B 28 1 1 2      3 M B 34 2 1 1
1 F C 25 1 1 3      2 M C 33 1 1 1      3 F C 37 1 2 1
1 F A 31 2 2 1      2 F C 29 2 1 2      3 F B 32 1 1 2
1 M A 21 1 1 3      2 M C 23 1 2 2      3 M C 25 1 3 2
1 M B 35 2 1 1      2 M A 39 1 2 3      3 F A 26 3 2 3
1 F B 33 2 3 2      2 M C 27 2 1 2      3 M C 23 2 1 1
1 F . 29 2 3 2      2 F . 35 1 1 2      3 M . 32 2 2 1
;
run;

proc format library=work.item_format;
value $f_region '1'='서울' '2'='부산' '3'='광주';
value $f_sex 'F'='여자' 'M'='남자';
value $f_job 'A'='전문직' 'B'='사무직' 'C'='일반직';
value $f_age 21-<30='20대' 30-<40='30대';
value $f_item 1='1.싫어함' 2='2.보통' 3='3.좋아함';
run;

options fmtsearch=(work sasuser work.item_format);

data work.item;
set work.item;
format region $f_region. sex $f_sex. job $f_job. age f_age.
	   item1 item2 item3 f_item;
run;

 

 

예제2) TABULATE 일반적인 형식

 

이번의 예는 TABULATE 문을 이용하여 일차원 빈도표를 생성하는 간단한 프로그램입니다.

이번의 예시에서는 TABULATE 문에 의해서 생성되는 빈도표의 출력형태는 주로 CLASS와 TABLE 명령문에 의해 결정되는데, 이 게시글에서는 기본적인 사용법 및 옵션들에 대한 내용입니다.

 

 

 

options nodate pageno=1 fmtsearch=(work sasuser work.item_format); /*1*/

title '1차원 도표';

proc tabulate data=work.item;    /*2*/
class sex job age;               /*3*/
table job sex age;               /*4*/
run;                             /*5*/

 

 

결과

 

 

스크린샷_2021-12-21_오후_10.27.47 (1).png

 

 

 

주석 1에서는 FMSEARCH = 옵션을 이용하여 출력포맷을 탐색할 라이브러리를 지정합니다.

work.item 데이터셋을 사용하기 위해서는 SAS를 구동한 후 이 OPTIONS 명령문을 가장 먼저 수행해야 합니다.

주석 2에서는 데이터 Item을 이용하여 TABULATE 문을 프로시저를 수행할 것을 지정합니다.

주석 3에서는 테이블 작성에 사용될 분류변수를 지정합니다.

주석 4에서는 테이블의 형식을 지정합니다.

-1) CLASS : 분류

 

CLASS 문은 테이블 작성에 사용될 분류변수들을 지정하는 것으로, TABULATE 프로시저가 분류변수를 처리하는 방법을 지정하는 옵션들을 지정할 수 있습니다. 여기에서 주로 사용되는 옵션에는 ASCENDING, DESCENDING, MISSING, MLF, ORDER 옵션들이 있습니다.

● MISSING: 결측값의 출력

 

TABULATE문은 분류변수들 중 어느 한 변수에 대해서라도 결측값을 가지는 개체들은 비도표를 구성할 때 제외시키므로 테이블 작성시에는 결측값이 있지 않도록 주의해야 합니다. 예를 들면, 예제 1에서는 결측값을 가지는 개체가 3개 존재하는데, 따라서 앞의 예제 2에서는 이들 개체를 제외하고 나머지 30개의 자료에 대해서 빈도표를 출력하고 있습니다. 이와 같이 분류변수들에 결측값이 존재할 경우에는 CLASS 명령문에 MISSING 옵션을 사용하면 결측값을 하나의 범주로 고려하여 모든 개체를 빈도표의 구성에 사용할 수 있습니다. MISSING 옵션은 다음과 같이 PROC TABULATE 문에 사용할 수도 있습니다.

 
PROC TABULATE DATA = work.item missing;
 

- 2) 출력되는 범주의 순서 지정

 

ASCENDING 또는 DESCENDING 과 ORDER = DATA | FORMATED | FREQ | UNFORMATTED 옵션은 분류변수의 범주들이 순서를 지정하는 기능을 가지고 있으며 ORDER = 은 ASCENDING 또는 DESCENDING 과 함께 사용할 수 있습니다. 특히, ASCENDING과 ORDER = UNFORMATTED 옵션을 사용하는 것은 디폴트에 해당하므로 옵션을 전혀 사용하지 않은 예제 2와 같습니다.

 
 
class sex job age / ASCENDING ODER = UNFORMATTED;    /*1*/
class sex job age / DESCENDING ORDER = FORMATTED;    /*2*/ 
class sex job age / ORDER = FREQ;                    /*3*/
 
 

주석 1에서는 출력포맷이 아닌 원래 변수의 값, 즉 변수 job에 대해서는 A(전문직), B(사무직), C(일반직) 그리고 변수 SEX에 대해서는 F(여자), M(남자)의 순서에 의해서 올림차순으로 출력됩니다.

주석 2에서는 출력포맷에 의해 내림차순으로 출력됩니다. 예를 들면, 변수 Job에 대해서는 전문직, 일반직, 사무직의 순서로 출력됩니다.

주석 3에서는 빈도(frequency)의 수에 의해서 내림차순으로 출력됩니다.

- 3) 겹치는 범위에 대한 출력포맷 사용: MLF 옵션

 

일반적으로 사용자 출력포맷은 범위가 서로 겹치지 않도록 규정되어야 합니다.

그러나 이번 예제는 f_mage 포맷과 같이 일부 포맷의 범위가 서로 겹치도록 만들 수도 있는데, 이를 다중레이블 포맷(multilabel format)이라고 하며, 포맷을 작성할 때 이와 같이 포맷이름에 MULTI LABEL 옵션을 지정해 주어야 합니다. 또한, TABULATE 프로시저에 다중레이블 포맷을 사용하기 위해서는 이번 예시와 같이 MLF 옵션을 추가로 지정해 주어야 합니다.

 

 

 

value f_mage(MULTILABEL)
21-<30='20대' 30-<40='30대'
low-25 = '25세 이하' 26-30 = '26 ~ 30'
31-35='31~35' 36-high='36세 이상';
run;

options nodate pageno=1 fmtsearch=(work sasuser work.item_format);

proc tabulate data=work.item;
format age f_mage.;
class sex job age / MLF ORDER=formatted;
table age;
run;

 

 

결과

 

스크린샷_2021-12-21_오후_11.04.55 (1).png

 

 

예제 3) TABLE 명령문: 출력형식의 지정

TABLE 명령문에서는 출력형식을 다양하게 지정할 수 있는데, 하나의 TABULATE 프로시저 안에서 여러 개의 TABLE 명령문을 사용할 수 있습니다. 여기서는 통계량에 대한 출력포맷을 지정하는 것과 계층적(hierachical)구조를 가지는 테이블을 생성하는 예시를 들어보겠습니다.

1) 통계량에 대한 출력포맷 지정

 

TABULATE 프로시저에서는 빈도뿐만 아니라 다양한 통계량들을 출력할 수가 있습니다. 이번 예제는 통계량들에 출력포맷을 지정하는 방법에 대한 예제입니다. 이번의 예제에서 *F = Format 형식을 이용하여 출력포맷을 지정할 수 있습니다. 예를 들면 변수 job 에 대해서는 전체 자릿수를 5자리, 소수점 이하의 자릿수를 0 자리 하도록 지정한 것입니다. 이와 같은 출력 포맷의 지정은 각 cell 의 넓이에도 영향을 줍니다.

 

 

 

proc tabulate data=work.item;
class sex job age;
table job*F = 8.2 (sex age)*F = 5.0;
run;

 

결과

 

스크린샷_2021-12-21_오후_11.04.13.png

 

 

 

2) 계층적 구조를 가지는 테이블의 작성

 

 

TABLE 명령문에서는 단순히 변수들을 나열하는 것 이외에도 ( ) 또는 * 를 사용하여 다양한 출력형식을 사용할 수 있습니다. 예를 들면, 이번 예제에서는 job * sex*age 는 변수 job, sex, age의 순서로 계층적 구조를 가지는 테이블을 출력하도록 지정하는 것이고, job*(sex age) 변수 job 아래에 변수 sex와 age 가 나열식 구조를 가지는 복합적인 테이블을 출력하도록 지정한 것입니다.

 

 

proc tabulate data = work.item;
class sex job age;
table (job sex age)*F = 7.1; /*1*/
table job*sex*age*F=4.1;     /*2*/
table job*sex*age*F=4.1 / PRINTMISS; /*3*/
table job*(sex age)*F=4.1;
run;

 

주석 1 라인에서는 단순한 나열식 구조의 테이블을 출력합니다.

주석 2 라인에서는 계층적 구조를 가지는 테이블을 출력합니다.

주석 3 라인에서는 PRINTMISS 옵션을 사용하여 빈도가 0인 범주도 출력하게 됩니다.

주석 4 라인에서는 계층적 구조 안에 나열식 구조를 가지는 테이블을 출력합니다.

3) 빈도의 수가 0인 범주의 출력: PRINTMISS 옵션

 

TABULATE 프로시저는 각 변수에 대해서 빈도의 수가 0인 범주는 테이블에 출려가지 않습니다.

이런 경우 위의 예제 주석 3라인에서와 같이 PRINTMISS 옵션을 사용하면 빈도의 수가 0인 범주도 테이블에 출력시킬 수 있습니다.

 

 

4) 변수와 통계량에 대한 레이블 변경

 

변수나 통계량에 대한 이름을 변경하여 테이블에 출력하고자 할 때는 변수(또는 통계량) = '출력될 레이블' 의 형식으로 지정하면 됩니다. 이번 예제는 변수 job에 대해서는 '직업분류' 라는 레이블을 출력하고 변수 sex 와 age 에 대해서는 레이블을 출력하지 않도록 지정한 것입니다.

 

 

 

proc tabulate data=work.item;
class sex job age;
table job = '직업분류'*sex = ' '*age=' '*F=4.1 / PRINTMISS;
run;

 

5) 전체 빈도의 출력: ALL 명령어

 

각 하위 범주 전체에 대한 빈도(또는 통계량)를 출력하고자 할 때는 ALL 명령어를 사용하면 됩니다.

예를 들면, 아래의 예제와 같이 변수 SEX의 각 하위 범주와 전체에 대한 빈도를 출력하도록 지정한 것입니다.

 

proc tabulate data=work.item;
class sex age;
table (sex=' '*(age=' ' ALL)ALL='전체')*F=7.0;
run;
Version history
Last update:
‎01-27-2022 12:47 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

Article Labels
Article Tags