이번 포스팅에서는 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 |
댓글