들어가면서
시계열 분석에서 중요한 것 중 하나가 변곡점(changepoints)이다. 시간의 흐름에 따라 나타나는 패턴이라는 것이 매번 동일한 수준으로 발생하지 않는다. 어떤 순간을 기점으로 상승세나 하락세의 흐름이 변화하기도 한다. 주식을 예로 든다면, 일시적인 조정을 하락세로 판단하고 보유한 주식을 전량 처분하거나, 순간적인 반등인데 상승세로의 전환으로 판단하고 풀베팅을 때린다면 문제가 될 것이다. 따라서 시계열 분석에서 의미있는 변곡점을 파악하는 것은 중요한 과제다.
Prophet 모델은 변곡점 분석을 위한 기능을 제공한다. Trend Changepoint는 시계열 데이터에서 추세 변화가 일어날 수 있는 지점을 나타낸다. 다행히 Prophet 모델은 이런 변곡점을 자동으로 감지하고, 이를 반영하여 Prophet은 자동으로 Trend Changepoint를 찾아주고 있다. 그럼에도 여러가지 비즈니스 상황을 고려할 때, 조금 더 최적화 된 결과를 추출하고 싶다면 관련된 파라미터를 조정해서 개선시킬 수 있다.
회사에서 시계열 모델을 생성하는 과정에서, 최근에 발생한 지표에 대한 영향력을 높이는 작업이 필요했기 때문에 이 부분을 최적화하게 되었다. 오늘은 여러가지 요소 중 이와 관련된 changepoint_prior scale에 대해서 정리했다.
n_changepoints, changepoint_range 등의 다른 요소도 존재하지만, 실제 작업해서 changepoint_prior_scale을 변화시키면서 유의미한 예측치 산출을 만들어봤기 때문에 일단은 changepoint_prior_sclae에 대해서만 작성했다.
트렌드 변화를 얼마나 예민하게 잡아낼 것인가에 대해서는 changepoint_prior_scale 파라미터를 조정한다. 우선 위의 파라미터는 기본적으로 0.05로 설정된다.
만약 이 수치가 높아진다면, 유연성이 지나치게 높아지는 과적합(overfitting) 문제가 발생한다. 주식을 예시로 쉽게 설명해보면, 유연성이 높아진다는 것은 KOSPI가 2021년에 3200까지 올라갔던 구간도 있으니 2023년 3월 13일의 주가 상승이 가능한 범위를 최대 3200으로 잡는 개념이다. 다시 말해, 유연성이 높아지면 과거의 데이터를 고려하는 정도가 더욱 커지기 때문에, 예측치에서 과거 수치의 영향을 크게 받게 된다. 이런 경우, 새로운 데이터에 대한 예측 능력이 떨어질 수 있기 때문에 지나치게 높이는 것은 문제가 될 수 있다.
반면, 이 수치가 낮아지면, 상대적으로 트렌드를 더욱 유연하게 감지할 수 있게 된다. 그럼 좋은 것이 아닌가 생각할 수 있지만, 만약 이 수치가 지나치게 과소적합(underfitting)되는 것도 문제다. 우선 이상치(outlier)와 같은 요소의 영향을 크게 받는다.
예를 들면, 겨울 의류를 판매하는 회사라면, 여름 시즌에는 매출이 확 줄고, 가을부터 매출이 상승하는 추세로 나타날 것이다. 이런 회사에서 여름 중 하루 이틀을 떨이-프로모션을 진행하면서 평소와 다르게 매출이 확 늘었다고 가정한다. 그러면 정상적인 실무자들은 '떨이 했으니까 하루이틀 확 뛰었구나' 생각하겠지만, 이 시계열 모델의 파라미터가 지나치게 낮다면 '지금부터 상승세로 바뀐거군' 하면서 여름 시즌의 전체의 예상 매출을 프로모션 기간과 동일한 수준으로 잡을 수 있다.
따라서 시계열 모델에서 무조건 트렌드를 유연하게 받아들이도록 할 것이 아니라, 최근의 추세도 어느정도 반영하지만 발생하는 아웃라이어의 영향을 최소화 할 수 있는 수준으로 잡는 것이 중요하다.
# Python
m = Prophet(changepoint_prior_scale=0.5) # 이 지점의 수치를 변경
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
'프로덕트 매니저 > PM의 데이터' 카테고리의 다른 글
[SQL/Clickhouse] 시계열 데이터 지수index로 변환하기 (0) | 2023.05.11 |
---|---|
[시계열분석] Prophet 모델에 독립변수 추가하기 (0) | 2023.03.10 |
[시계열분석] Prophet 모델에 한국 공휴일 추가하기 (0) | 2023.03.05 |
[clickhouse] neighbor 활용하여 이전행/다음행 가져오기 (0) | 2023.01.03 |
예측치를 산출하는 이유, 그리고 분석에 대한 관점 (feat. 뉴욕주민) (0) | 2022.12.30 |