BookmarkSubscribeRSS Feed

[SAS 활용 노하우] Cloud Based 시계열 분석 part2

Started ‎07-18-2022 by
Modified ‎07-18-2022 by
Views 314

 

 

지난번 Cloud Based 시계열 분석 part1 게시글에서는 Python Code를 SAS Script에 옮겨서 Moving Average를 구하는 예에 대해서 알아보았습니다.

이번에는 R에서 구현된 ARIMA 모델을 SAS 데이터 세트에 적합시키는 예제로 오픈소스가 SAS와 연동되는 방법에 대해 알아보려 합니다.

 

ARIMA 모델이란, Auto Regressive Integreated Moving Average 모형으로 과거의 관측 값과 오차를 사용해서 현재의 시계열 값을 설명하는 ARMA(Auto-Regressive Moving Average) 모델을 일반화 한 것으로, 분기/반기/연간 단위로 다음 지표를 예측하거나 주간/월간 단위로 지표를 리뷰하며 트렌드에 이상치가 없는지를 모니터링 하는데 사용되는 분석기법입니다.

또한, ARMA는 안정적 시계열(Stationary Series)에만 적용 가능한 것에 비해, 분석 대상이 다소 비안정적인 시계열(Non Stationary Sereis)의 특징을 보여도 적용이 가능합니다. 여기서 안정적 시계열이란 시간의 추이와 관계없이 평균 및 분산이 불변하거나 시점 간의 공분산이 기준시점과 무관환 형태의 시계열입니다. 시계열이 안정적이지 않을 때는 로그를 이요하거나 차분을 통해서 시계열을 안정적으로 변환한 뒤에 분석을 진행합니다.

 

 

5K7we (1).jpg

 

 

 

 

 

 

■ ARIMA Forecasting USING R

R에서 구현된 ARIMA 모델을 데이터에 적용하는 방법을 보여주는 보다 현실적인 예제입니다.

ATSM 패키지 객체에 의해 제공되는 자동화된 모델 선택 프로세스(Automated Model Selection)에 사용자 지정 모델을 포함시키는 등의 작업을 수행할 수 있습니다.

첫번째, CAS 서버에 연결하기 위해서 mycas라는 CAS library를 만듭니다. mycas library 는 기존의 분석하고자 하는 데이터 세트를 CAS server에 옮겨 주는 역할로 시계열 분석을 위해 필요한 단계입니다.

 

CAS mycas;
LIBNAME mycas CAS SESSREF = mycas;

 

 

 

 이제 SAShelp에 있는 PriceData를 CAS library 인 mycas에 옮기는 작업을 수행합니다.

 

DATA mycas.pricedata;
SET sashelp.pricedata;
RUN;

 

 

PROC TSMODEL 은 input dat set (mycas.pricedata), output table (mycas.outarry), 출력 데이터 배열(mycas)을 저장할 출력 테이블(mycas.outarry), 스칼라 변수를 저장할 출력 테이블(mycas.outscalar), 출력 객체를 저장할 출력 테이블(mycas.pylog)를 설정해야 합니다.

output table은 2개로 mycas.rlog 에는 R에 의해 생성된 모든 출력을 저장하고 mycars.rvars에는 공유 변수에 대한 정보를 저장합니다.

 

PROC TSMODEL DATA=mycas.pricedata OUTARRAY=mycas.outarray
OUTSCALAR=mycas.outscalar
OUTOBJ=(rlog=mycas.rlog rvars=mycas.rvars)
LEAD=12;

 

 

ID statement은 시간 인덱스 변수로 변수 날짜를 지정하고 INTERVAL= 옵션은 데이터가 월 단위임을 나타냅니다.

 

ID date INTERVAL = MONTH;

 

 

 

BY 문은 데이터 집합 변수의 각 고유한 조합을 지정합니다.

영역 이름, 제품 라인 및 제품 이름은 그룹별 고유한 시계열에 해당합니다. BY 그룹은 독립적으로 처리됩니다.

 

BY regionname productline productname;

 

 

 

VAR 문은 입력 데이터 집합 변수 SALE을 지정합니다.

누적=AVG 옵션은 판매 변수에 대한 평균 값 누적을 지정합니다.

 

VAR SALE / ACCUMULATE = AVG;

 

 

OUTSCALAR 문은 SAS 스크립트가 생성하고 저장할 스칼라 변수를 지정합니다. 여기에는 R 프로그램의 실행 시간(실행 시간)을 저장할 변수가 포함됩니다.

종료 코드(exitCode) 및 각 메서드의 반환 코드(rc1–rc7)가 R 개체를 호출합니다

 

OUTSCALAR runtime exitCode rc1 rc2 rc3 rc4 rc5 rc6 rc7;

 

 

OUTARRAY 문은 SAS 스크립트가 생성하고 저장할 배열 변수를 지정합니다. 유일한 출력 배열은 RARIMA 모델(rPred)을 사용하여 모델링된 영상 시리즈입니다.

 

OUTARRAY rPred;

 

 

 

REQUARE 문은 EXTLANG 패키지를 지정합니다. 여기에는 다음과 같은 모든 개체가 포함됩니다.

SAS가 외부 언어와 상호 작용하는 데 필요합니다.

 

REQUIRE EXTLANG;

 

 

 

SUMBIT 문과 ENDSUMBIT 문 사이의 프로그램 문에는 아래와 같이 사용됩니다.

 

SUBMIT;
/*
* Initialize the R object, which is the interface to the
* R interpreter. The interpreter executable is set via a
* CAS configuration file.
*/
declare object robj(R) ;
rc1 = robj.Initialize() ;
/*
* Push code from the filesystem. The R object will dynamically create
* a file that contains all source code to be run and will autogenerate
* code for transferring to and from the SAS environment.
* The file r_arima_code.r has the following contents:
------------------------------------------------------
library(forecast)
Y<- Y[1:(NFOR - HORIZON)]
Y_ts<-ts(Y,frequency=12)
LOG_Y_ts<-log(Y_ts)
fit <- stats::arima(LOG_Y_ts, order=c(p=0, d=1, q=1),
seasonal=list(order=c(0,1,1), frequency=12))
sse<-sum(fit$residuals^2)
forecast(fit)
a <- stats::predict(fit, n.ahead=HORIZON)
PREDICT <- c( exp(fitted.values(fit)), exp(a$pred) )
------------------------------------------------------
*/
rc2 = robj.PushCodeFile('/path/to/r_arima_code.r') ;
/*
* Specify variables to share between SAS and R.
* SALE is the (READONLY) dependent variable. The ARIMA code
* uses the generic name Y for the dependent variable, so
* SALE is aliased to Y.
* rPred will contain the predicted series, which is returned to the
* SAS program. The R code that is used stores the predicted series in
* the variable PREDICT, so rPred is aliased to PREDICT.
* Two additional read-only variables are needed by the R code:
* NFOR, which stores the forecast length, and HORIZON, which stores
* the forecast horizon.
*/
rc3 = robj.AddVariable(SALE, 'ALIAS', 'Y') ;
rc4 = robj.AddVariable(rPred, 'ALIAS', 'PREDICT', 'READONLY', 'FALSE');
rc5 = robj.AddVariable(_LENGTH_, 'ALIAS', 'NFOR') ;
rc6 = robj.AddVariable(_LEAD_,'ALIAS','HORIZON') ;
/*
* Run the model and get the exit code and run time.
*/
rc7 = robj.Run() ;
exitCode = robj.GetExitCode() ;
runtime = robj.GetRunTime() ;
/*
* Store the execution and resource usage statistics logs.
*/
declare object rlog(OUTEXTLOG) ;
rc16 = rlog.Collect(robj, 'EXECUTION') ;
declare object rvars(OUTEXTVARSTATUS) ;
rc17 = rvars.collect(robj) ;
ENDSUBMIT;
RUN;

 

 PROC TSMODEL 의 summary는 아래와 같습니다.

 

image (1).png

 

 

 

아래의 코드는 시간 경과에 따라 판매된 실제 및 예측 단위를 보여주는 그림을 생성합니다.

예측 값은 에서 사용되는 R ARIMA 모델에서 가져옵니다.

DATA step에서는 다음과 같은 BY 그룹으로 구성된 하위 시리즈를 생성합니다.

Region 1, Production Line 1 , Product 3.

SGPLOT 절차는 다음을 사용합니다.

실제 판매의 산점도를 생성하기 위해 데이터 단계에서 얻은 하위 시리즈 R ARIMA 모델에서 얻은 값의 선 그림과 함께 값을 표시합니다.

 

 

 

DATA mycas.subseries ;
set mycas.outarray(where=(regionName="Region1" and productLine="Line1"
and productName="Product3")) ;
RUN ;
PROC SGPLOT data=mycas.subseries ;
scatter x=DATE y=SALE / markerattrs=(color=black) LEGENDLABEL = 'Actual'
Name="act";
series x=DATE y=rPRED / lineattrs=(color=red thickness=2)
LEGENDLABEL = 'Predicted' Name="pred";
yaxis LABEL="Sale" ;
xaxis LABEL="Time" ;
keylegend / POSITION=BOTTOMRIGHT LOCATION=INSIDE ACROSS=1 ;
RUN;

 

 

image (2).png

 

 

PROC PRINT DATA=mycas.rlog; 
RUN;

 

 

 

R 프로그램은 오류가 발생하지 않으면 텍스트 출력을 생성하지 않을 것으로 예상되므로 _LOGTEXT_는 비어 있어야 합니다.

아래의 코드 mycas.rlog 테이블을 통해 확인할 수 있습니다.

 

 

image (3).png

 

 

Version history
Last update:
‎07-18-2022 06:27 AM
Updated by:
Contributors

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

Article Labels
Article Tags