본문 바로가기
Data_Analysis/SAS

[SAS] RETAIN

by Classic! 2021. 4. 19.

이번 포스팅에서는 RETAIN 기능을 활용하여 데이터를 다룬 사례를 정리합니다.

 

[문제]

데이터에는 ID별로 SIGN 등급(A > B > C > D 순서대로 점수가 높음 > 낮음)이 데일리로 적재되어 있습니다.

이 데이터에서 기준일자를 기준으로 특정한 기간 내에 고객 별로 가장 나쁜 점수, D를 연속적으로 받은 최대 일수를 구하는 문제입니다.

 아래 이미지와 같이 기준일자 15일 내 D가 연속적으로 등장하는 최대 일수는 2일이고, 기준일자 30일 내 최대 일수는 8일입니다.


[해결 방법]

다음과 같이 문제를 해결했습니다.

1. 데이터를 짜순으로 정렬

2. SIGNAL 컬럼을 한 행씩 내려오면서 D가 연속되는 횟수를 MAX_15D 열에 누적

3. MAX_15D, MAX_30D 열의 최댓값 계산

 

 

1. 날짜 기준 내림차순으로 정렬

이미지에서 보듯이 날짜 기준 내림차순으로 정렬했습니다. temp 데이터 셋은 최초에 ID, 기준일자, 날짜, SIGNAL 컬럼만 존재합니다. 

PROC SORT DATA = temp OUT = temp1; 
BY DESCENDING 날짜; 
RUN;

 

2. 'D'가 연속되는 날짜를 누적

[RETAIN]

DATA SETP에서 쓰는 RETAIN은 2가지 기능이 있습니다. 해당 문제 해결을 위해 retain의 2번째 기능을 사용하였습니다.

1. 데이터 셋에서 변수의 순서를 지정

2. 자료의 행을 순차적으로 따라 내려가면 연산 작업

 

- FIRST.ID : ID 컬럼의 첫 번째 행

# 15일과 30일 전 날짜를 변수로 지정
%LET 15D = 20190415;

DATA temp1;
	SET temp1;
	RETAIN 
		max_15d 0 
        	max_1m  0    ;

IF 	FIRST.ID AND SIGNAL = 'D'  	     THEN 1; 
ELSE IF FIRST.ID AND SIGNAL ^= 'D' 	     THEN 0;
ELSE IF BASE_DATE >= &15D. AND SIGNAL  = 'D' THEN MAX_15D = MAX_15D +1 ;
ELSE IF BASE_DATE >= &15D. AND SIGNAL ^= 'D' THEN 0;

IF BASE_DATE < &15D. THEN MAX_15D = 0;

RUN;

# MAX_30D도 동일한 방법으로 연산

 

3. 최댓값 구하기

SQL 쿼리로 ID, 기준일자, MAX_15D, MAX_30D의 최댓값만 뽑았습니다.

PROC SQL;
 CREAT TABLE TEMP2 AS
  SELECT  DISTINCT 
          ID
        , 기준일자
        , MAX(MAX_15D)	AS MAX_15D
        , MAX(MAX_30D)  AS MAX_30D
  FROM temp1
  GROUP BY 1;
QUIT;

최종 결과

 

처음 이 문제를 접했을 때, 행별로 순차적으로 연산하는 RETAIN의 기능을 몰라 어려움을 겪었는데 사수의 도움으로 위와 같이 간단한 방법으로 해결할 수 있었습니다.

RETAIN을 이용한 방법 외, 다른 좋은 방법이 있다면 댓글로 소개 부탁드립니다! :)

'Data_Analysis > SAS' 카테고리의 다른 글

[SAS] 코드를 줄여주는 기능 정리  (2) 2021.09.09
[SAS] 자주 쓰는 기능 정리  (2) 2021.09.08
[SAS] 반복문 활용  (1) 2021.02.27
[SAS] PROC FREQ  (1) 2021.02.09
[SAS] PROC TABULATE  (0) 2021.01.28

댓글