SAS로 SAP를 만들다 보면, Mock-up shell(또는 TFLs, Dummy table)을 프로그램으로 출력하는 데 시간이 꽤 듭니다. 게다가 통계분석 결과를 다시 ODS(Output Delivery System) 테이블로 조합할 때, 라벨이나 변수명을 또 코딩해야 하는 번거로움이 생기죠. 실제로 이런 중복 작업 때문에 분석 일정이 늦어지는 경우도 적지 않습니다.
이 문제를 해결하는 핵심 방법은 미리 만들어진 Mock-up shell과 통계분석 결과를 SERIAL, SERIAL2 같은 키 변수로 간단히 merge하는 것입니다. 이 방식을 쓰면 통계분석 시 _STAT_ 열의 라벨을 다시 코딩할 필요 없이, ODS 출력 테이블을 바로 생성할 수 있습니다. 참고 자료에 따르면 이 접근법으로 SAP 작성 시간을 20% 이상 줄인 사례도 있습니다.
Mock-up shell과 통계분석 결과를 합칠 때 필요한 준비물
SAP 작업을 효율화하려면 먼저 두 가지 데이터 구조를 통일해야 합니다.
- Mock-up shell(TFLs)의 키 변수: 보통
SERIAL또는SERIAL2라는 이름으로, 분석 결과가 들어갈 위치를 지정하는 변수입니다. 예를 들어 "1-1-1" 같은 고유 코드를 부여합니다. - 통계분석 결과의 키 변수: 동일한
SERIAL이나SERIAL2변수를 분석 결과(예: 평균, 표준편차, p-value)와 함께 저장합니다.
이 키 변수만 일치시키면, SAS에서 proc sort 후 data merge 또는 proc sql join으로 쉽게 결합할 수 있습니다.
실제 SAS 코드로 보는 결합 순서
다음은 기본적인 결합 과정 예시입니다. 실제 작업 환경에 맞춰 변수명과 경로를 수정하세요.
-
Mock-up shell 데이터 준비
이미 SAS 데이터셋(work.shell)으로 저장되어 있다고 가정합니다. 여기에는serial,label(예: "Overall (N=100)"),row_order등이 포함됩니다. -
통계분석 결과 준비
분석 결과는work.stats라는 데이터셋에serial,mean,std,p_value등으로 저장합니다. -
merge 실행
```sas proc sort data=work.shell; by serial; run; proc sort data=work.stats; by serial; run;
data work.merged; merge work.shell work.stats; by serial; run; ```
- ODS 출력 테이블 생성
proc report나proc tabulate로work.merged를 RTF 파일로 출력합니다.
이 과정에서 통계분석 결과의 _STAT_ 열(예: "Mean", "Std Dev")은 이미 shell의 라벨과 정렬되어 있으므로, 추가 코딩 없이 바로 사용할 수 있습니다.
ODS 출력 시 그래프와 표를 한 페이지에 배치하는 방법
SAP에는 표뿐 아니라 그래프도 포함되는 경우가 많습니다. proc sgplot으로 만든 그래프를 표와 같은 페이지에 넣으려면:
- 그래프를 이미지 파일(
.png또는.emf)로 저장합니다. - ODS RTF 파일 내에서
ods text구문으로 이미지 경로를 삽입합니다.
ods rtf file="출력경로\output.rtf";
proc sgplot data=work.data;
series x=time y=value;
run;
ods graphics / outputfmt=png imagename="그래프이름";
ods rtf text="^S={preimage='출력경로\그래프이름.png'}";
ods rtf close;
이렇게 하면 표 아래나 옆에 그래프가 자연스럽게 배치됩니다. 참고로 그래프 이미지 크기는 ods graphics / width=... height=...로 조정할 수 있습니다.
SAP 작성 시간을 줄이는 핵심 포인트 3가지
- Shell 라이브러리를 표준화: 프로젝트 간 일관된 shell 구조를 유지하면, 새 프로젝트 시작 시 처음부터 다시 만들 필요가 없습니다. 참고 자료에서도 "Shell Library"를 표준화 템플릿 라이브러리로 저장하는 방법을 소개하고 있습니다.
- 매크로 프로그램 활용: 통계분석 매크로에 merge 과정을 포함시켜, 분석 결과가 나오는 동시에 ODS 테이블이 생성되도록 설계하세요.
_STAT_열 자동 매핑: shell의 라벨 값과 통계분석 결과의_STAT_값을 사전 매칭해 두면, 분석 결과만 갱신해도 테이블이 자동 업데이트됩니다.
FAQ
Q. 키 변수(SERIAL)가 일치하지 않으면 어떻게 되나요?
merge 시 불일치가 발생하면 해당 행은 출력되지 않거나 결측값이 생깁니다. 분석 결과가 누락된 shell이 있는지 반드시 확인한 후, 데이터 정합성을 점검하세요.
Q. 통계분석 결과를 SAS가 아닌 R이나 Python에서 만들었는데도 이 방법을 쓸 수 있나요?
가능합니다. R이나 Python에서 분석 결과를 CSV로 내보낸 후, SAS에서 proc import로 불러와 같은 merge 과정을 거치면 됩니다. 단, 키 변수명과 데이터 타입이 일치해야 합니다.
Q. ODS 출력 시 표와 그래프 순서를 자유롭게 배치할 수 있나요?
네. ods rtf 블록 안에서 proc report와 ods text(이미지 삽입)을 원하는 순서대로 배치하면 됩니다. 예를 들어 표 → 그래프 → 표 순서로도 가능합니다.
Q. Shell과 통계분석 결과의 라벨 길이가 다를 때 문제가 있나요?
SAS에서 라벨 길이는 최대 256자까지 지원합니다. 다만, RTF 출력 시 테이블 셀 너비가 너무 좁으면 라벨이 잘릴 수 있으므로, proc report의 style(column)=[width=...] 옵션으로 조정하세요.