6 min read

Facebook Prophet 정리

Facebook Prophet 정리
Photo by Isaac Smith / Unsplash

(일전에 '비전공자가 비전공자에게 Prophet에 대해 정리해서 설명'해야 하는, 가급적 피하고 싶은(...) 일이 있었는데 정리한 김에 여기에 그 내용을 일부 옮기기로 한다.)

Prophet은 약 5년 전에 facebook에서 공개한 시계열 분석 및 예측 라이브러리이다. R과 Python을 지원한다.
ARIMA 같은 기존의 시계열 모형과 달리 curve-fitting, 그러니까 주어진 데이터의 추세를 따라 가상의 선을 그어서 그 곡선을 가장 적절히 표현하는 함수식을 구하는 방법으로 모델을 적합한다.

Prophet은 일간/주간/연간 판매량 같은 비즈니스 분야의 시계열 데이터를 분석하고 예측하기 위한 것이다. 이러한 데이터는 ARIMA 처럼 과거와 현재 데이터 간의 통계적 특성을 분석해서 논리적인 인과 관계를 밝히는 방식이 비효율적일 수 있다. 가게 주인이 감기에 걸려서 오늘 하루 결근했다면, 여기서 어떤 통계적인 인과 관계를 도출할 수 있을 것인가? 오히려 시간대 별, 요일 별, 계절 별 또는 분기 별 특성을 분석하고 모델을 구축하는 것이 더 효율적일 수 있다.

이를 위해 장기간의 상승이나 하강 추세를 나타내는 트렌드 곡선 ($g(t)$)과 위에서 언급한 계절적 특성을 포함하는 (하나 이상의) 곡선 ($s(t)$), 그리고 휴일이나 앞서 예를 들어 언급한 비수학적인 단발성 이벤트에 의한 효과에 의한 함수 ($h(t)$) 등 각기 다른 특성을 나타내는 함수들을 갖고 모델을 구축한다. 각 함수들을 가법적 방식(additive)으로 합성하는 GAM (generalized additive model)을 바탕으로 한다.

$$ y(t) = g(t) + s(t) + h(t) + \epsilon_i $$

수식 마지막 항은 정규분포 오차이다.

이 중 계절성을 나타내는 $s(t)$ 함수는 푸리에 계수 (Fourier series)를 이용하여 만들며 다양한 주기를 갖는 여러 함수들의 합이다. 기본적으로 연간, 주간, 일간 주기를 갖고 있다.

예로, 다음과 같이 실제 데이터 (검은색 점)에 대해 prophet으로 분석한 그래프 (파란색 선)가 있다고 했을 때

(from hyperconnect.github.io)

plot_components() 함수 하나로 위에서 언급한 추세 및 계절성 함수 요소를 아래와 같이 쉽게 분리해서 볼 수 있다.

(from hyperconnect.github.io)

이처럼 시계열 요소의 분해 및 추가가 용이하기 때문에, 직관적인 파라미터를 갖고 모델을 수정하기 용이하다는 장점이 있다.

따라서 기존 시계열 분석 기법에 비해 여러가지 장점을 가진다.

  • 여러 주기를 가지는 계절성을 쉽게 반영할 수 있어서 비즈니스 시계열 분석에 적용하기 용이하다.

일례로, Prophet에는 월 주기 분석이 없는데, 그런 경우 한달을 평균 30.5일로 가정하고 아래처럼 간단하게 계절성 함수를 쉽게 추가할 수 있다.

m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
  • 시계열 데이터의 측정 주기가 일정 간격일 필요가 없기 때문에 이상치 제거나 결측치 대치 등의 작업이 필요 없다.

이 부분에 대해서는, 처음에는 Prophet 과 같은 류의 알고리즘에 의한 특성이라고 생각했는데, 이 글을 작성하면서 보니까 실제로는 Prophet 라이브러리 내에 보정 기능이 구현되어 있다고 한다.

  • 적합이 빨라 분석자는 interactive 방식으로 여러 모형을 고려하고 적합할 수 있다. 휴일 효과 등 분석자가 원하는 가정을 쉽게 넣고 뺄 수 있다.

속도에 대해서는 다른 블로그에서 1시간 단위의 네트워크 속도 한달 치를 분석하여 다음 일주일의 평균 속도를 예측하는 테스트를 진행한 결과를 올렸는데, 다른 기법 대비 정확도는 떨어지는 편이지만 큰 차이는 아니었고, 대신 training 및 inferencing 속도는 제일 좋은 결과를 내는 것으로 나왔다.

(from doheon.github.io)

이런 이유로 Prophet은 도메인 지식만 있는 비전문가도 쉽게 사용할 수 있는 분석 툴이 되는 것이다.

단 모델 자체에 단점이 있어서, 예를 들어 기상 자료에 기반한 예측을 한다면 이미 관측된 기상 인자를 이용한 산불 위험도 계산에는 매우 효과적이지만 풍속 등 단기간에 급격한 변화가 발생하는 변수에는 약해서 시시각각 확산하는 산불의 진화를 위한 실시간 예측은 정확도가 떨어진다.

seasonality 함수의 경우 최소 주기에 의해 원 데이터를 curve-fitting 하는 최소 시간에 제한을 받기 때문에 급격한 변화를 추적하기 어려워진다. trend 함수의 checkpoint를 늘리면 추세를 더 정확하게 추적할 수 있지만 과적합의 우려가 있기 때문에 예측 정확도와의 trade-off가 필요하다.

그리고 ARIMA와 같은 추론적 예측이 불가능하다. ARIMA 등의 전통적인 시계열 분석 기법은 과거 값과 현재 값 사이에 인과 관계가 있다고 가정하고 분석하기 때문에, 이를 바탕으로 구축된 모델을 통해 예측 값을 도출한다. 만약 판매량 같은 비즈니스 데이터이 아닌 논리적이고 타당성 있는 인과 관계가 밝혀진 시계열 데이터에 대해서는 예측 값의 정확도가 높을 것이다.

참고

— END OF POST.