4, 5년 전쯤, 농촌 봉사를 하러 논밭에 내려갔던 기억이 있다. 그 때 농부아저씨와 새참을 먹으면서 이런저런 얘기를 나누다가 넌지시 “아버님은 몸도 건강하시고 농작물도 잘 자라고 올해는 걱정이 없으시겠어요~” 라고 너스레를 떨었는데 아저씨는 “농작이 잘되도 문제고~ 안되어도 문제고~” 라고 쓴웃음을 지으며 말씀하셔서 고개가 갸우뚱했던 적이 있다.
농작물 공급이 넘치는 해에는 가격이 너무 싸져서 논을 갈아 엎어야하고, 공급이 부족하면 또 그 나름대로의 고충이 있다고 하셨다. 도심에 사는 나같은 소비자들이야 무 가격이 올라도 대체제를 찾아 먹던지 생활에 큰 타격이 없지만, 1년 동안 피땀 흘려가면 작물한 농작물들을 갈아 엎어야한다는 사실이 마음 아프다. 아래 사진은 과잉재배로 인해 무 밭을 갈아 엎고 있는 사진이다.
========================================================================================================================
작년과 올해 COVID-19 때문에 온라인 쇼핑을 자주 이용하게 되었는데, 온라인 쇼핑몰 또한 이런 수급에 따른 고충이 있을 것 같다는 생각이 들었다.
COVID-19으로 인해 인터넷 쇼핑 매출이 폭발적으로 성장함에 따라 이미 자체 배송 인프라를 갖추고 있던 쿠팡은 코로나로 큰 매출상승을 즐길 수 있었고, 비교적 소규모 프리미엄 서비스인 마켓컬리는 폭발적인 수요에 따라 capa를 즉각적으로 맞추는 데는 어려움이 있지 않았나 싶다. 조금 우려스러운 점은 코로나 종식 후, 소비자들의 구매형태가 어떻게 변할지이다. 대량 유입된 온라인 소비자에 따라 capa를 증설했는데 코로나 종식 후 온라인 소비자들이 오프라인으로 빠지게 된다면 이미 투자한 capa에 대한 은행이자, 잉여 물류시설 관리 등 비용이 발생할 수도 있다. (개인적인 생각으로 네이버 쇼핑처럼 자체 물류인프라에 투자하기 보다는 CJ와 같은 물류회사와 협업하여 수요에 맞게 물류서비스를 사용 및 증설할 수 있는 전략이 보수적이지만 유연한 전략인 것 같다)
이와 같이 농수산물 종사자들뿐만 아니라 이를 중개하거나 판매하는 온라인 쇼핑몰 또한 수요-공급 예측이 중요할 것이다.
당장은 농작물 수요공급에 대한 분석 대신 인터넷에서 시계열 데이터를 찾아 수요 예측 관련 분석을 해보았다. 따라서 이번 포스트에서는 가게별 상품별 과거 매출 데이터를 기반으로 미래 매출을 예측해보려고 한다.
========================================================================================================================
========================================================================================================================
데이터는 2013년 1월 1일부터 2017년 12월 31일까지 date(날짜), store(가게 ID), item(상품 ID), sales(판매량)에 대한 정보를 포함한다.
아쉽게도 어떤 산업의 매출 데이터인지, 그 외 다른 변수들에 대한 정보는 없다.
========================================================================================================================
========================================================================================================================
위: 2013년 1월 1일 - 2017년 12월 31일 일별 판매추이를 보여준다.
아래: 연도별 일별 판매추이를 보여준다.
========================================================================================================================
========================================================================================================================
“연도별 총 판매량” (좌상): 전체 판매량이 증가하는 추세를 확인할 수 있다.
“월별 총 판매량” (우상): 여름과 Thanksgiving 때 판매량이 증가하는 계절성 패턴을 확인할 수 있다. 아마 여름 할인행사 등으로 매출이 늘지 않을까 싶다.
“2013-2017년도 월별 평균 판매량” (좌하): 위의 연도별 월별 총 판매량을 합친 그래프이다. 여름과 Thanksgiving 때 판매가 증가하는 계절성 패턴과 전체적으로 우상향하는 판매 트렌드가 확인된다.
요일별 평균 판매량: 주말에 가까워질수록 판매량이 증가하는 패턴을 띈다. 일요일 - 월요일에 매출이 급감하는 것으로 미루어보아 Holiday effect 가 존재한다.
========================================================================================================================
========================================================================================================================
각 가게(Store)별 2013-2017년도 월별 평균 판매량이다.
가게별 평균 판매량만 상이할뿐 소름끼치게 똑같은 계절성 패턴을 띈다. 거의 복제를 시켜놓은 듯 하다.
========================================================================================================================
========================================================================================================================
각 상품(Item)별 2013-2017년도 평균 판매량이다. (그래프를 클릭하면 자세한 정보를 확인할 수 있다.)
Item 15가 가장 판매량이 많고, Item 5가 가장 판매량이 작다.
계절에 따라 다른 패턴을 띄는 상품이 있다면, 추가적으로 재미있는 분석 가능할텐데 너무 똑같아 아쉽다.
========================================================================================================================
## alpha: 0.8184186
## beta: 0.01355978
## gamma: 1
## SSE: 0.0326497
========================================================================================================================
앞서 EDA에서 살펴봤듯이, 계절성 변동이 시계열 전반에 거쳐 거의 일정하다는 것, 추세가 우상향한다는 것을 고려했을 때, additive (덧셈) 모델인 Triple Holt-Winters Exponential Smoothing 가 적합하다고 생각해서 해당 모델로 수요 예측을 진행했다.
검은선은 기존값을, 빨간선은 예측값을 나타낸다. 그래프만 봐도 당히 좋은 결과를 내는 것을 알 수 있다.
alpha (\(\alpha\)) 값이 큰 것은 해당 타임에 대한 예측값이 과거값보다는 최근값에 영향을 많이 받는다는 것을 뜻한다.
beta (\(\beta\)) 값이 0과 가까운 것은 추세(slope)가 시간에 따라 잘 변하지 않는다는 것을 뜻한다. 그래프를 살펴보면 시간에 따라 전체적인 slope은 크게 바뀌지 않는다.
gamma (\(\gamma\)) 값이 1이라는 것은 계절에 대한 예측값이 가장 최근값에 영향을 받는다는 것을 뜻한다.
SSE가 낮다는 것은 예측값과 실제값의 차이가 작다는 것을 뜻한다.
종합해봤을 때, 미래를 예측하는 모델을 Holt-Winters Exponential Smoothing 모델로 만들어도 될 것 같다.
========================================================================================================================
HWES는 additive(덧셈)와 multiplicative(곱셈) 모델로 나뉘는데 이번 포스트에서 사용하는 additive 모델을 방정식으로 나타내면 다음과 같다.
\(\hat{y}_{t+1} = L_{t} + kT_{t} + S_{t+k-m} where\)
\(L_{t} = \alpha(y_{t} - S_{t-m})+(1-\alpha)(L_{t-1}+T_{t-1})\)
\(T_{t} = \beta(L_{t} - L_{t-1}) + (1-\beta)T_{t-1}\)
\(S_{t} = \gamma(y_{t}) + (1-\gamma)S_{t-m}\)
이 방정식을 시작하려면 기본적으로 \(L_{0}, T_{0}, S_{0}\) 와 같은 몇가지 초기 값이 필요하다.
레벨을 나타내는 \(L_{0}\)을 계산하기 위해 인덱스 \(m, 2m, 3m\) 등의 값을 평균화한다. 여기서 \(m\)은 기간을 뜻한다. 예를 들어 \(m=6\)일 경우, \(L_{0} = mean(T_{0}+T_{6}+T_{12}+...)\)
트렌드를 나타내는 \(B_{0}\)의 경우, time step에 걸쳐 발생한 트렌드의 변화율을 측정하고 타임 스텝수로 전체의 평균을 낸다. \(m=3\)개월인 예를 들면, \(T_{0}=1/6[(T_{6}-T_{0})/6 + (T_{7}-T_{1}/6) + ...]\)
계절성을 나타내는 \(S_{0}\)의 경우, 각 m 인덱스 이후의 값 사이의 비율을 취한 다음 해당 레벨로 나눈다. \(S_{0} = [(T_{0}-L_{0}),(T_{1}-L_{1}),(T_{0}-L_{0})...]\)
예측을 수행하려면 각각 single, double, triple Exponential Smoothing에 대한 HWES 방정식에서 사용되는 파라미터 \(\alpha, \beta, \gamma\)에 값을 할당해야하는데 초기값은 각각 \(\frac{1}{2}m, \frac{1}{20}m, \frac{1}{20} * (1-\alpha)\)와 같다. 모든 파라미터는 0-1 사이 값을 가진다. Single HWES는 Level이 있는 시계열 데이터를 처리할 수 있지만, Double HWES는 추세가 있는 데이터를 처리할 수 있고, triple HWES는 계절성까지 처리할 수 있다. 보다 명확한 설명은 아래 도표로 확인 가능하다.
이제 이러한 값이 설정되면 비로소 \(L_{t}, T_{t}, S_{t}\)를 결정할 수 있고, 이후에 위의 방정식대로 \(\hat{y}_{t+1}\)를 예측할 수 있다.
HWES를 다룰 때 꼭 잊지 말아야할 점은 아래와 같다.
========================================================================================================================
========================================================================================================================
미래 3년에 대한 수요 예측 모델의 예측값이다.
짙은 그림자는 80% PI(Prediction Interval; 예측구간), 옅은 그림자는 95% PI를 표시한다. 참고로 95% PI는 평균이 \(\mu\), 표준편차가 \(\sigma\)인 정규분포(normal distribution)를 따르는 모집단(population)에서 표본(sample) 하나를 뽑았을 때 모평균(\(\mu\))에서 \(\pm1.96\sigma\)의 구간에 속할 확률이 95%라는 것을 뜻한다.
2018년도의 PI 범위는 좁지만 더 먼 미래인 2020년도는 PI 범위가 넓다.
즉 먼 미래일수록 uncertainty가 더 많아져 PI 범위가 넓어지는 것을 확인할 수 있다.
========================================================================================================================
##
## Box-Ljung test
##
## data: fs2$residuals
## X-squared = 5.867, df = 20, p-value = 0.9991
========================================================================================================================
위의 예측 모델을 검증하기 위해 실행한 ACF와 Ljung-Box 테스트에 대한 결과이다.
Correlogram (위): 모든 값이 파란 점선 안에 들어있다. 위에 예측모델의 예측에러에 대한 autocorrelation이 lag 1-20 사이에서 유의하지 않다는 것을 보여준다.
p-value 해석: lag 1-20 사이에 non-zero autocorrelation이 존재한다는 증거가 부실하다는 것을 보여준다.
========================================================================================================================
========================================================================================================================
예측오차값이 시간에 따라 동일한 분산을 갖는 것을 확인할 수 있다. (at mean = 0)
따라서, Holt-Winters exponential smoothing 모델이 예측에 적합하다고 결론내릴 수 있다.
========================================================================================================================
이번 월간리포트에서는 이미 정제된 시계열 데이터를 통해 3년 뒤 매출 미리 예측해보는 분석을 진행했다.
추후에는 농작물에 대한 수요 예측을 진행해볼 예정이다.
예를 들어, 2018년 4월에 양파 재배 면적이 증가하고 양파 생산량이 증가할 것으로 예상되어 과잉생산으로 인해 양파 가격이 폭락할 것으로 예상되었다고 한다 (기사 참고). 해당년도 날씨, 습도 등 계절성 변수 또한 양파 공급에 영향이 있을 것이다.
이러한 수급 효율화를 통해 판매자 유입과 긍정적 구매 경험을 통한 구매자 유입은 해당 온라인 쇼핑몰 서비스의 지속적인 선순환 구조를 가능케 할 것이고, 이는 단순히 플랫폼의 수익성 증대 뿐 아니라 사회적 효율성 달성이라는 또 다른 목표를 달성하는 결과를 낳을 것이다.
출처:
시계열 데이터 분석 및 포스트 작성을 위해 아래 사이트들을 참고했다.
- https://rpruim.github.io/s341/S19/from-class/MathinRmd.html
- https://medium.com/analytics-vidhya/holt-winters-forecasting-13c2e60d983f