들어가면서
우리가 어떤 변수에 대한 예측치를 정할 때, 그 예측치의 추세에 영향을 주는 것들이 있다. 예를 들면, 첫 구매 프로모션 혜택을 받게 될 고객을 예측한다고 가정해보자. 이런 경우, 첫 구매 수치는 아무래도 회원가입 추세를 따라가게 될 가능성이 크다. 이런 것처럼 어떤 변수를 예측할 때, 다른 원인이 되는 독립변수를 분석에 결합한다면 조금 더 정확한 추세를 분석할 수 있을 것이다. Prophet에서도 모델에도 add_regressor이라는 기능을 제공하고 있다.
# Prophet에 사용할 데이터프레임 생성
prophet_df = first_df[['first_promote_day', 'first_cnt', 'join_total']].rename(columns={'first_promote_day': 'ds', 'first_cnt': 'y'})
위에서 언급한 것처럼 첫 구매 프로모션이 어느 정도 지급될 것인지 예측하는 코드를 작성한다. first_promote_day는 첫 구매 프로모션이 지급되는 날짜이며, first_cnt는 첫 구매 프로모션이 지급된 횟수로 본다. 마지막으로 join_total이 회원가입으로 첫 구매 프로모션의 독립변수 역할을 하게 된다.
# 독립 변수 설정
prophet_df['join_total'] = joined_df['join_total']
# Prophet 모델 객체 생성 및 독립 변수 포함
n.add_regressor('join_total')
먼저, 'prophet_df'라는 데이터 프레임에서 'join_total'이라는 이름의 열을 생성한다. 이 열은 다른 데이터 프레임인 'joined_df'에서 'join_total' 열을 가져와서 넣은 것으로, Prophet 모델이 사용할 독립 변수를 설정하는 과정이다.
여기에, Prophet 모델 객체 'n'에 'add_regressor' 메소드를 이용하여 'join_total' 열을 포함시킨다. 이렇게 하면 Prophet 모델은 독립 변수로 'join_total'을 사용하여 시계열 데이터를 예측한다. 이를 통해, Prophet 모델은 시계열 예측에 독립 변수를 포함시켜 예측 정확도를 높이는 방법 중 하나인 '추가 예측 변수(regressor)'를 설정하게 된다.
# 모델 학습
n.fit(prophet_df)
# 31일간의 미래 예측
future = prophet_df[['ds', 'y', 'join_total']].copy()
future = future.append(pd.DataFrame({'ds': pd.date_range(start=prophet_df['ds'].max() + pd.Timedelta(days=1), periods=31, freq='d')}))
forecast = n.predict(future)
# 모델의 성능평가
df_cv = cross_validation(n, horizon='30 days', period='60 days', initial='300 days')
df_pm = performance_metrics(df_cv)
fig = plot_cross_validation_metric(df_cv, metric='mape')
이후 코드는 동일하다. 자세한 설명은 이전에 작성한 콘텐츠를 확인하면 될 것 같다.
실제로 성능평가를 해본 결과, 다음과 같이 나온다
종속변수를 결합한 모델 | 독립변수를 결합한 모델 |
horizon 30 days 00:00:00 mse 178.607987 rmse 13.36443 mae 11.617794 mape 0.146222 mdape 0.082588 smape 0.133005 coverage 1.0 Name: 27, dtype: object |
horizon 30 days 00:00:00 mse 147.300523 rmse 12.136743 mae 10.536745 mape 0.130796 mdape 0.062118 smape 0.119366 coverage 0.666667 Name: 27, dtype: object |
종속변수인 첫 구매 프로모션 횟수에 영향을 주는 회원가입이라는 독립변수를 추가해서 비교할 수 있다. 만약 결과값이 위의 예시처럼 나타난다면, 독립변수를 설정한 것의 오차가 더 적기 때문에 모델의 성능이 더 좋다고 볼 수 있다.
더 나아갈 경우, 시계열 분석에서 독립변수와 종속변수의 영향력을 판단할 때 활용하는 그레인저 인과성 검정이 있다. 이 방법에 대한 부분은 다음 글에서 포스팅해보겠다.
'프로덕트 매니저 > PM의 데이터' 카테고리의 다른 글
[SQL/Clickhouse] 시계열 데이터 지수index로 변환하기 (0) | 2023.05.11 |
---|---|
[시계열분석] Prophet 모델 Trend Changepoint(변곡점)의 활용 (0) | 2023.03.12 |
[시계열분석] Prophet 모델에 한국 공휴일 추가하기 (0) | 2023.03.05 |
[clickhouse] neighbor 활용하여 이전행/다음행 가져오기 (0) | 2023.01.03 |
예측치를 산출하는 이유, 그리고 분석에 대한 관점 (feat. 뉴욕주민) (0) | 2022.12.30 |