forecast
시계열 데이터의 추세를 분석하여 미래 값을 예측합니다. 주기가 있는 데이터는 STL 분해(Seasonal and Trend decomposition using Loess)를 사용하여 추세, 계절성, 잔차 성분으로 분리한 후 추세 성분을 기반으로 예측 값을 산출하며, 입력 레코드에는 예측 기댓값과의 편차에 기반한 이상 스코어를 함께 부여합니다.
명령어 속성
| 항목 | 설명 |
|---|---|
| 명령어 유형 | 가공 쿼리 |
| 필요 권한 | 없음 |
| 라이선스 사용량 | 해당 없음 |
| 병렬 실행 | 미지원 |
| 분산 실행 | 수집 노드에서 실행 (mapper) |
문법
옵션
count=INT- 예측할 레코드 수. 1 이상의 자연수여야 합니다. (기본값:
5) period=INT- 시계열 데이터의 주기 길이. 지정하는 경우 3 이상의 자연수여야 합니다. 지정하지 않으면 스펙트럴 밀도 추정(Spectral Density Estimation)을 사용하여 자동으로 주기를 계산하며, 계산된 주기가 2 미만이면 비주기적 데이터로 판단하여 단순 선형 회귀를 적용합니다.
predictor={ets|linear|loess|constant}method=stl(기본값)로 주기적 데이터를 분해했을 때, 추세 성분을 예측하는 방법 (기본값:ets)
ets: 지수 평활법(Exponential Smoothing)linear: 선형 회귀loess: LOESS(국소 가중 산점도 평활법)constant: 추세 성분의 평균값을 상수로 사용합니다. 뚜렷한 추세가 없는 시계열에 적합합니다.
이전 버전에서 사용하던 smoother 옵션 이름은 predictor의 별칭으로 계속 인식됩니다. method=linear이거나 비주기적 데이터로 판단된 경우에는 이 옵션이 적용되지 않습니다.
normalize=BOOL- Box-Cox 변환 적용 여부.
true로 설정하면 비선형적으로 증가하는 추세를 보정합니다. 추가 연산으로 인한 성능 영향이 있을 수 있습니다. (기본값:false) accumulate=BOOL- 신뢰 구간 누적 여부.
true로 설정하면 예측 시점이 멀어질수록 신뢰 구간이 넓어집니다. (기본값:true) confidence=DOUBLE- 상한·하한 구간과 이상 스코어 계산에 사용하는 신뢰 구간 백분율. 0 이상 100 미만의 실수여야 합니다. (기본값:
95) seed=INT- 난수 시드 값. 동일한 입력에 대해 동일한 결과를 재현하려면 시드 값을 지정합니다.
time=STR- 시간 필드 이름. 시계열 데이터의 시간 간격을 계산하는 데 사용합니다. (기본값:
_time) method={stl|linear}- 시계열 분해 알고리즘 (기본값:
stl). 계산된(또는 지정된) 주기가 2 미만인 비주기적 데이터에는 이 옵션과 무관하게 단순 선형 회귀가 적용됩니다.
stl: STL 분해를 사용하여 추세·계절성·잔차 성분으로 분리한 후,predictor옵션에 따라 추세 성분을 예측합니다.linear: 주기별 평균값(계절성)과 선형 회귀(추세)를 결합하여 예측합니다. 이 방식에서는predictor옵션이 적용되지 않습니다.
alpha=DOUBLE- 이상 스코어(
_score) 계산에 사용하는 감쇠 계수. 0 이상 1 이하의 실수여야 합니다. 각 레코드의 이상 스코어는이전 레코드의 _score 값 * alpha + 현재 레코드의 확률 기반 스코어로 누적 계산됩니다. (기본값:0.6)
대상
FIELD- 예측 대상 시계열 데이터가 포함된 필드
[by FIELD, ...]- 그룹 필드.
by절을 지정하면 그룹 필드 값이 같은 레코드별로 독립적으로 예측합니다. 쉼표(,)로 구분하여 여러 필드를 지정할 수 있습니다.
입력 필드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| FIELD | 수치 | 필수 | 예측 대상 시계열 값. 파티션의 첫 레코드에서 이 필드 값이 null이면 해당 파티션의 예측을 건너뜁니다. |
| time 필드 | 날짜 | 필수 | 시계열 데이터의 시간 값. 마지막 두 레코드의 시간 간격을 기반으로 예측 시간을 산출합니다. |
| by 필드 | 모든 타입 | 선택 | 그룹 기준 필드 |
출력 필드
| 필드 | 타입 | 설명 |
|---|---|---|
| _trend | 64비트 실수 | 입력 레코드의 추세(trend) 성분 값. normalize=true인 경우 Box-Cox 역변환을 적용한 값입니다. |
| _expected | 64비트 실수 | 입력 레코드의 예측 기댓값(추세와 계절성을 반영). _upper/_lower/_score 계산의 기준값입니다. |
| _score | 64비트 실수 | 입력 레코드의 이상 스코어. 실제 값과 _expected의 차이가 클수록 커지며, alpha 옵션에 따라 이전 레코드의 스코어를 누적 반영합니다. |
| _upper | 64비트 실수 | 신뢰 구간 상한 값. 입력 레코드는 _expected, 예측 레코드는 _future를 기준으로 계산합니다. |
| _lower | 64비트 실수 | 신뢰 구간 하한 값. 입력 레코드는 _expected, 예측 레코드는 _future를 기준으로 계산합니다. |
| _future | 64비트 실수 | 예측 레코드의 예측 값 |
| _forecast_error | 문자열 | 입력 레코드에 대해 예측을 수행할 수 없는 경우의 원인 메시지. 이 필드가 있는 레코드는 _trend 등 나머지 예측 관련 필드가 채워지지 않습니다. |
오류 코드
파싱 오류
| 오류 코드 | 메시지 | 설명 |
|---|---|---|
| 40501 | forecast 명령의 period 값은 3 이상의 자연수여야 합니다. | period 값이 3 미만이거나 숫자가 아닌 경우 |
| 40502 | forecast 명령의 그룹 필드가 누락되었습니다. | by 절 뒤에 그룹 필드를 지정하지 않은 경우 |
| 40503 | forecast 명령의 대상 필드가 누락되었습니다. | 예측 대상 필드를 지정하지 않은 경우 |
| 40504 | 머신러닝 라이센스가 필요합니다. | 머신러닝 라이선스가 없는 경우 |
| 40505 | forecast 명령의 method 값이 올바르지 않습니다. 유효값은 stl, linear 입니다. | method 값이 stl, linear가 아닌 경우 |
| 40506 | forecast 명령의 count 값은 1 이상의 자연수여야 합니다. | count 값이 1 미만이거나 숫자가 아닌 경우 |
| 40507 | forecast 명령의 predictor 값이 올바르지 않습니다. 유효값은 ets, linear, loess, constant 입니다. | predictor(또는 smoother) 값이 네 값 중 하나가 아닌 경우 |
| 40510 | forecast 명령의 confidence 값은 0~100 사이의 실수여야 합니다. | confidence 값이 0 미만이거나 100 이상이거나 숫자가 아닌 경우 |
| 40511 | forecast 명령의 seed 값은 자연수여야 합니다. | seed 값이 숫자가 아닌 경우 |
| 40512 | forecast 명령의 alpha 값은 0~1 사이의 실수여야 합니다. | alpha 값이 0 미만이거나 1을 초과하거나 숫자가 아닌 경우 |
런타임 오류
| 오류 코드 | 메시지 | 설명 |
|---|---|---|
| - | cannot sort forecast item for query [id] | by 절 사용 중 그룹 정렬용 임시 파일 처리에 실패한 경우. 쿼리가 오류로 중단됩니다. |
설명
forecast 명령어는 모든 입력 레코드를 수집한 후 시계열 예측을 수행합니다. 입력 레코드에는 추세 성분(_trend), 예측 기댓값(_expected), 신뢰 구간(_upper, _lower), 이상 스코어(_score)를 추가하여 그대로 출력하고, 예측 레코드는 _future, _upper, _lower 필드를 포함하여 입력 레코드 뒤에 count 옵션 개수만큼 추가합니다.
주기(period) 값이 2 이상이면 method 옵션에 따라 STL 분해(stl, 기본값) 또는 주기별 평균과 선형 회귀를 결합한 방식(linear)으로 추세·계절성을 분리하여 예측합니다. predictor 옵션은 method=stl일 때만 적용되며, 추세 성분을 어떤 방법으로 예측할지 결정합니다. 주기가 2 미만이면 비주기적 데이터로 판단하여 method·predictor 옵션과 무관하게 단순 선형 회귀로 예측합니다.
time 옵션으로 지정한 시간 필드의 마지막 두 레코드 간격을 기반으로 예측 레코드의 시간 값을 산출합니다. timechart 명령어 등으로 시간 간격이 일정한 데이터를 준비한 후 사용하는 것을 권장합니다.
입력 데이터는 다음 조건을 모두 충족해야 정상적으로 예측을 수행하며, 그렇지 않으면 원본 레코드에 _forecast_error 필드를 추가하여 그대로 출력합니다.
- 파티션별로 5건 이상의 레코드가 있어야 합니다.
- 파티션의 첫 레코드에서 예측 대상 필드 값이 null이 아니어야 합니다.
period옵션을 지정한 경우, 입력 데이터 수가period값의 2배 이상이어야 합니다.time옵션으로 지정한 시간 필드 값이 파티션의 마지막 두 레코드에 존재하고 날짜 타입이어야 합니다(이 두 레코드의 간격으로 예측 시간 값을 계산하기 때문입니다).
by 절을 사용하면 그룹 필드 값이 같은 레코드별로 독립적으로 예측합니다. 그룹별 정렬을 위해 내부적으로 임시 파일을 사용할 수 있습니다.
사용 예
이 사용 예에서 조회하는 WEB_APACHE_SAMPLE 테이블을 준비하려면 쿼리 실습용 데이터를 참고하세요.
-
시계열 데이터의 예측 값 출력
table WEB_APACHE_SAMPLE | timechart span=1h count | forecast count웹 접근 로그를 1시간 단위로 집계한 후,
count필드의 시계열 예측 값 5건과 각 입력 레코드의 이상 스코어(_score)를 출력합니다. -
주기와 예측 수 지정
table WEB_APACHE_SAMPLE | timechart span=1h sum(bytes) as traffic | forecast period=24 count=12 traffic주기를 24(일간 패턴)로 지정하고, 향후 12건의 예측 데이터를 출력합니다.
-
시간 필드와 시드 값 지정
table WEB_APACHE_SAMPLE | timechart span=1h count | forecast period=24 time=_time seed=1234 count주기를 24(일간 패턴)로 지정하고, 시드 값을 1234로 고정하여 동일한 입력에 대해 재현 가능한 결과를 출력합니다.
-
그룹별 예측
table WEB_APACHE_SAMPLE | timechart span=1h count by method | forecast count=10 count by methodmethod필드 값이 같은 그룹별로 독립적으로count필드의 예측 값을 10건씩 출력합니다. -
Box-Cox 변환 적용
table WEB_APACHE_SAMPLE | timechart span=1h sum(bytes) as traffic | forecast period=24 normalize=true traffic비선형적으로 증가하는 추세를 보정하기 위해 Box-Cox 변환을 적용하여 예측합니다.
-
추세가 없는 시계열에 상수형 예측자 사용
table WEB_APACHE_SAMPLE | timechart span=1h count | forecast period=24 predictor=constant alpha=0.8 count뚜렷한 추세가 없는 시계열에 상수형 예측자(
predictor=constant)를 사용하고, 이상 스코어 누적 비중(alpha)을 0.8로 높여 직전 스코어의 영향을 더 크게 반영합니다.
변경 이력
| 대상 | 도입 릴리스 |
|---|---|
forecast 명령어 | 소나 4.0 이전 버전 |
predictor·method·alpha 옵션 | 4.0.2609.0 |
_expected·_score·_forecast_error 출력 필드 | 4.0.2609.0 |
입력 레코드에 _upper/_lower 신뢰 구간 부여 | 4.0.2609.0 (이전에는 예측 레코드에만 부여) |
period·count·confidence·seed·alpha 값 검증(오류 코드 40501, 40505-40507, 40510-40512) | 4.0.2609.0 |
머신러닝 라이선스 오류 코드가 40804에서 40504로 변경 | 4.0.2609.0 (4.0.2511.3 이하와 5.0 계열은 40804) |