월마트의 매출을 예측해 봅시다!

“다음달 우리 가게의 매출은 어떨까? 다음달에 크리스마스가 있는데, 재고를 더 준비해놔야 하는 걸까?”

자영업자들이라면 한 번쯤은 하는 고민이죠! 다음 주, 다음 달의 매출을 예측할 수만 있다면 남는 재고를 줄이면서 손해 또한 줄일 수 있을 테니까요. 이러한 매출 예측 고민, 월마트도 풀어야 하는 숙제였습니다. 그래서 월마트가 Kaggle 데이터 사이언스 대회에 전 세계 사이언티스트들을 상대로 현상금을 걸었습니다! 월마트 45개 지점과 각 부서의 과거 매출 기록들을 토대로 미래 월마트 지점들의 부서 매출을 예측하는 것이 목표였죠!

데이터부터 보고 가십시다!

월마트가 제공한 데이터는 2010년 2월부터 2011년 마지막 주까지의 각 지점의 매출 기록과 각 지점의 지역에 대한 정보입니다. 지역에 대한 정보에는 지역별 온도, 유가, 소비자물가지수, 실업률, 휴일 유무, 그리고 당시 행해지고 있었던 이벤트 등을 기록하고 있습니다. 그러면 주어진 데이터를 간략하게 한번 보겠습니다.
먼저, 월마트에서 준 데이터 파일 입니다. 5개의 열만 볼까요?

각 세로 열은 순서대로 지점번호, 부서 번호, 날짜, 그 주의 매출, 그리고 휴일 유무입니다. 언뜻 보아도 휴일의 매출이 높을 것같은 느낌적인 느낌이 드시나요?

위 데이터는 추가적 정보입니다. 지점별로 그 지점이 있는 곳의 온도, 유가, 이벤트 (MarkDown1 ~ MarkDown5), 소비자물가지수, 그리고 실업률이 나와 있네요. 데이터의 구성을 보았으니, 이번에는 간단한 그래프를 그려 보겠습니다.

지점별 총 매출

위 그래프는 지점별 총 매출을 오름차순으로 보여줍니다. 45개의 지점 사이에서도 매출이 차이가 크게 나는군요! “5지점" 이 가장 낮은 매출을 기록하고, “20지점”이 가장 높은 매출을 보여 줍니다.

온도별 매출

위는 온도별 매출을 줍니다. 영하 15도의 맹추위나 35도의 푹푹 찌는 폭염 속에서도 매출이 생기기는 하는군요. 마지막으로 휴일 유무와 매출의 상관관계를 보도록 하겠습니다.

평일(좌)과 휴일(우)의 매출

아니나 다를까, 휴일이 낀 주는 매출이 더 높군요! 휴일을 맞이하여 친구와 가족들이 모이는 행사가 많으니, 매출이 높아지는 것도 당연한 트렌드라고 볼 수 있죠. 저희에게 주어진 데이터에 대한 감을 잡았으니, 이제 본격적으로 월마트의 2013년 매출을 예측하여 보도록 할까요?

매출 예측은 구체적으로 어떻게 하나요?

2013년의 매출을 예측하기 위해서 SVD, STL, 그리고 ETS를 이용한 시계열 분석을 (Time Series Analysis) 적용해 볼 텐데요. 용어부터가 어럽다고요? 이 글을 다 읽으실때 즈음이면 어디에 쓰는 물건인지 아실 거에요!

먼저, 큰 그림부터 잡고 들어가도록 하겠습니다! 각각의 용어는 아래에 따로 설명될 테니 너무 걱정하지 마시고 “큰 그림”에만 집중해주세요~

  1. SVD를 이용해서 Noise를 제거하고 정보를 압축한다.
  2. 본격적인 시계열분석 시작!
  3. STL을 이용해서 트렌드, 계절성, 랜덤 노이즈로 분해를 한다.
  4. ETS을 이용해서 forecasting을 한다.

자, 그럼 이제 본격적인 설명해 드릴게요!

본격적인 요리(?)에 들어가기에 앞서, 재료 손질부터 하고 들어가도록 하겠습니다! 데이터 사이언스에는 preprocessing “전처리"라고 말합니다!

SVD (Singular Value Decomposition)란?

영어로는 SVD, 한국어로는 고윳값 분해! 통계학 외에 여러 분야에서 널리 애용되는 선형 대수학의 꽃(?) 중 한 송이입니다. 쉽게 설명을 하자면 어떠한 객체를 그 객체를 구성하고 있는 요소로 분해하는 기술입니다. 예를 들어, 돼지 한 마리를 삼겹살, 항정살, 가브리살, 목살, 등심, 족발 등으로 분해하거나, 그림 같은 경우는 액자, 큰 배경 (하늘, 바다, 산 등), 작은 배경 (나무, 언덕, 바위 등), 인물, 디테일 (꽃, 자갈, 나뭇잎) 등으로 나누는 컨셉이 되겠습니다. SVD 의 특징 중 한 가지는, SVD 를 함으로서 나오는 항목들은 그 객체를 고유하게 식별할 수 있게 해 줍니다. 레고 로봇을 분해했다 다시 합치면 같은 레고 로봇이 되는 것처럼요.

SVD 를 왜 하는 것이죠?

SVD 를 이용하는 가장 큰 이유는 “잡음 제거”와 “정보 압축”입니다. 불필요한 디테일을 제거함으로써, 더욱 전체적인 윤곽이나 트렌드에 집중하게 하는 거죠. 예를 들어 친구에게 위의 그림을 설명하고 싶을 때, 우리는 액자, 큰 배경, 작은 배경, 인물, 디테일 30가지의 모든 항목에 관심이 있을까요? 물론 정보를 언제, 어디서 사용하느냐에 따라 다르겠지만, 보통, 배경과 인물 정도의 정보만 관심이 있을 것입니다. 30가지의 자잘한 디테일은 관심이 적을뿐더러, 정보 전달에 있어 효과적이지 못하죠. 즉, SVD 를 이용해 어느 객체를 분해한 후, 필요한 큰 정보만을 취합니다. 그리고 나머지는 버림으로써 “정보압축”을 하고 “잡음처리”를 하는 것이죠. 이미지로 간단한 예시를 들어 보겠습니다.

Andrew Gibiansky 의 블로그에서 발췌

위의 이미지는 첫 번째 원본 호랑이 사진에 SVD 를 행한 후, “중요한 요소”들만 뽑은 후 재구성한 이미지입니다. 각 사진 위에 있는 숫자는 몇 가지 “요소” 들을 선택하였는지 알려줍니다. “요소”의 개수가 줄어듦으로써 디테일도 함께 줄어들고 화질도 떨어지는 게 보이시나요? 마지막에 세 가지 “요소”만 가지고 이미지를 재구성 하였을 때에는 어떠한 물체가 있다고만 인식이 되고, 용량은 현저하게 줄어듭니다. 만약 정확한 디테일이 중요하지 않은 상황이라면 위의 “요소” 50개의 호랑이 사진을 선택하여 훨씬 적은 용량과 적당한 디테일의 이미지를 얻을 수 있겠죠?

그럼 월마트 시계열 데이터에서 SVD 는 왜 쓰는 것일까요?

어느 한 회사의 주식 변동 그래프를 떠올려 봅시다. 하루에도 자잘하게 주가가 위아래로 변동이 있으며, 주별, 월별로 보아도 그래프의 표면은 사포처럼 거칠기만 합니다. 장기적인 투자를 원하는 사람이라면 그러한 자잘한 변동 보다는 전체적인, 큰 그림의 변동이 중요할 겁니다. 월마트 데이터도 마찬가지입니다. 저희에게 중요한 것은 매출의 전체적인 트렌드이지, 한주 한주의 미세한 변동이 아닙니다. 저희는 SVD 를 이용하여 그래프의 “잡음”을 제거한 후, 트렌드를 더욱 잘 나타낸 매끄러운 데이터로 미래를 예측합니다. 아래는 월마트 한 지점의 한 개의 부서에 대한 매출 그래프입니다.

한 지점의 한 부서에 대한 매출 그래프 (적) 원래 그래프 (청) SVD 후 그래프

적색 선은 오리지널 매출 그래프이고, 푸른색 선은 SVD 를 행한 후 “중요 요소” 일부분만 가져온 그래프입니다. 전체적으로 굴곡이 완만해졌으며, 특히 10~30주쯤의 구간의 “잡음”이 정리 되는 것이 보이시죠? 이제 저는 후에 본격적인 예측을 할 때 이 푸른 그래프를 사용할 것입니다.

이제 본격적인 시계열 분석을 들어가 볼까요?

시계열 (Time Series) 란 무엇인가요?

시계열이란 시간을 기준으로 쌓인 데이터를 뜻합니다. 지금 분석의 대상인 주별 매출의 월마트 데이터가 시계열 데이터이고, 다른 대표적인 시계열 데이터로서는 우리에게 더 익숙한 주가, 유가 변동 그래프, 날씨 변화 그래프 등이 있습니다. 시간에 의한 변화가 중요할 때 등장하는 컨셉입니다.

STL은 무엇인가요?

STL은 Seasonal and Trend Decomposition using Loess 의 약자입니다. 시계열 그래프를 계절 (Seasonal)별 동향과 전체적인 트렌드, 그리고 “잡음”으로 나누는 것이죠. 백문이 불여일견! 아래의 예시가 STL을 한눈에 보여줍니다.

Anomaly.io 블로그에서 발췌

STL 은 좌측과 같은 간단한 시계열 그래프가 있을때, 우측의 세가지 그래프로 나눠 줍니다. 첫째는 계절, 주기적으로 나타나는 현상을 말합니다. 서울의 계절별 온도 변화등 일정한 주기를 바탕으로 비슷한 현상이 반복되는, 문자 그대로 seasonality 를 분리해 주는 것이죠. 두번째는 트렌드, 전체적인 동향을 의미합니다. 위의 그래프는 시간이 지날수록 올라가죠? 계절의 영향을 제거한 후 전체적인 동향을 의미합니다. 계절성과 트렌드를 제거하고 남은 것은 random, 즉 무작위성이 남습니다. 위에서 언급한 “잡음”이 되겠죠!

그럼 월마트 분석에 STL을 왜 쓰는 것일까요?

그 이유는 일주일, 한 달, 일 년 등을 주기적으로 일어나는 매출패턴과, 전반적인 오르고 내리는 패턴 (트렌드) 을 감안해야 훨씬 정확한 모델을 만들 수 있기때문인데요! 간단한 예를들어 봅시다. 겨울은 아이스크림 매출이 여름에 비해서 줄어듭니다. 그렇다고 아이스크림 가게가 문을 닫아야 할까요? 자, 이게 바로 seasonality 의 한 예이죠. 비록 겨울을에 매출이 줄었지만, 이것은 자연스러운 현상이기 때문에, 감안을 해줘야 하는거죠!

그럼, 트렌드는요? 자, 요즘 너도나도 웰빙을 한다면, 이 “트렌드"에 마춰서 건강식품이 “상대적"으로 잘 팔리겠죠? 이런 트렌드를 감안한다면, 조금 더 정확히 매출을 예측할 수 있겠죠!

ETS란 무엇인가요?

ETS는 Exponential Smoothing (지수 평활법) 입니다. 수요나 공급, 매출 예측 등 시계열 분석과 예측에 널리 쓰이는 방법이죠. ETS 는 거창한 이름과는 달리 “과거의 추세로 미래를 예측”한다는 의미입니다. 위의 그래프가 오른쪽으로 계속 이어진다면 똑같은 계절성을 가지고 점차 위로 오를 거라는 예상을 할 수 있듯이 말이죠. 그러면 이 ETS 기법으로 예측한 결과를 한번 볼까요?

한 지점의 한 부서에 대한 매출 그래프

적색 선은 저희에게 주어진 데이터 입니다. 푸른 선은 적색 선을 바탕으로 나온 추측값입니다. 아래 X 축은 주 단위입니다. 1년은 몇 개의 주로 되어있다? 약 52주다! 위 그래프를 보시면 52번째마다 비슷한 패턴이 보일겁니다. 과거와 제법 비슷하게 예측이 되지 않았나요?

SVD, STL, ETS 등의 기술들만 있으면 모든 Time Series분석이 가능한가요?

그렇다면 저도 기쁠 것 같습니다. 아쉽게도 그렇게 쉽지 않습니다. 예를 들어, ETS 외에도 ARIMA, Seasonal ARIMA 등 다른 여러 가지 기법들이 존재합니다. 데이터 사이언스의 세상에서는 “한가지 완벽한 기법”은 존재하지 않습니다. 그리고 정확한 예측을 하기 위해선, 위에서 언급한 기술들과 함께 여러 가지 “깨알 트릭”들도 필요합니다.

그런 트릭이란 무엇일까요?

월마트 분석에서 쓴 트릭 하나를 소개 하겠습니다.

미국에는 여러 가지 휴일들이 있습니다. 미국 최대의 스포츠 이벤트인 슈퍼볼, 노동의 날, 추수 감사절, 크리스마스 등이 대표적인 휴일들입니다.

여기서 잠깐! 슈퍼볼, 추수감사절 등은 항상 몇 번째 주인지가 고정되어 있습니다. 슈퍼볼은 항상 2월의 첫째 주말이고, 추수감사절은 항상 11월의 넷째 주 목요일입니다.

반면의 크리스마스는 12월 25일, 한 해의 몇 번째 주인지가 정해져 있지 않은 거죠. 게다가 저희가 예측 하고 싶은 2012년의 크리스마스는 화요일입니다 (2010년은 토요일, 2011 일요일입니다). 하지만 월마트의 데이터는 일주일이 금요일에 끝나죠. 고객들이 크리스마스 전날까지 물품 구매를 한다고 했을 때, 2010년의 크리스마스는 고객들의 명절 소비가 한 주에 반영되는 데에 반해, 2011, 2012년의 크리스마스는 그 다음 주까지 이전이 됩니다.

즉, 크리스마스 소비는 전년도와 비슷할 텐데, 수치상으로는 두 개의 주로 분산이 되었습니다. 그래서 저희는 2011년과 2012년 크리스마스 전 주와 크리스마스 주의 소비를 조정하여 더욱 정확한 예측값을 구해냈습니다.

이러한 기법들을 적용 할 수 있는 산업들은 많은가요?

당연한 말씀! SVD, ETS 등 Time Series Analysis에 사용되는 기법들은 월마트 데이터 외에도 인터넷 쇼핑몰의 매출 기록부터 국가 차원에서 쌓은 데이터까지 적용 방면이 무궁무진합니다. 시간에 의해 변화하는 Time Series 데이터라면 이러한 분석을 피해 갈 수 없죠!

흥미 있으셨나요? 이번에는 Time Series 데이터를 어떻게 분석하는지 간략하게 알아보았는데요, 다음에도 흥미로운 주제로 돌아오겠습니다!

이 현 2017–02–28