주요 컨텐츠로 이동

Facebook Prophet와 Apache Spark를 사용한 대규모 세밀 시계열 예측

Comparing the actual demand to the time-series forecast generated by Facebook Prophet leveraging Apache Spark

발행일: 2020년 1월 27일

오픈 소스2 min read

이 수요 예측 솔루션 가속기에서 시간 시리즈 예측 노트북을 사용해 보세요.

시간 시리즈 예측의 발전으로 소매업체는 더 안정적인 수요 예측을 생성할 수 있게 되었습니다. 이제 과제는 이러한 예측을 시기적절하게, 그리고 비즈니스가 제품 재고를 정확하게 조정할 수 있도록 하는 세분성 수준으로 생성하는 것입니다. Apache Spark™Facebook Prophet을 활용하여 이러한 문제에 직면한 점점 더 많은 기업들이 과거 솔루션의 확장성과 정확성 한계를 극복할 수 있다는 것을 알게 되었습니다.

이 게시물에서는 시간 시리즈 예측의 중요성을 논의하고, 샘플 시간 시리즈 데이터를 시각화한 다음, Facebook Prophet의 사용을 보여주기 위해 간단한 모델을 구축할 것입니다. 단일 모델 구축에 익숙해지면 Prophet과 Apache Spark™의 마법을 결합하여 한 번에 수백 개의 모델을 훈련하는 방법을 보여줌으로써, 지금까지 거의 달성되지 않았던 세분성 수준에서 각 개별 제품-매장 조합에 대한 정확한 예측을 생성할 수 있습니다.

정확하고 시기적절한 예측이 그 어느 때보다 중요해졌습니다

제품 및 서비스에 대한 수요를 더 잘 예측하기 위해 시간 시리즈 분석의 속도와 정확성을 개선하는 것은 소매업체의 성공에 매우 중요합니다. 너무 많은 제품이 매장에 배치되면 선반과 창고 공간이 부족해지고, 제품이 유통기한을 넘길 수 있으며, 소매업체는 재고에 금융 자원이 묶여 제조업체에서 발생하는 새로운 기회나 소비자 패턴의 변화를 활용할 수 없게 될 수 있습니다. 너무 적은 제품이 매장에 배치되면 고객이 필요한 제품을 구매하지 못할 수 있습니다. 이러한 예측 오류는 소매업체에 즉각적인 수익 손실을 초래할 뿐만 아니라, 시간이 지남에 따라 소비자 불만이 고객을 경쟁업체로 유인할 수 있습니다.

새로운 기대치는 더 정확한 시간 시리즈 예측 방법 및 모델을 요구합니다

한동안 전사적 자원 관리(ERP) 시스템과 타사 솔루션은 간단한 시간 시리즈 모델을 기반으로 소매업체에 수요 예측 기능을 제공해 왔습니다. 그러나 기술의 발전과 해당 부문의 압력이 증가함에 따라 많은 소매업체는 과거에 사용할 수 있었던 선형 모델과 보다 전통적인 알고리즘을 넘어서기를 원하고 있습니다.

Facebook Prophet에서 제공하는 것과 같은 새로운 기능이 데이터 과학 커뮤니티에서 등장하고 있으며, 기업들은 이러한 머신러닝 모델을 시간 시리즈 예측 요구에 적용할 수 있는 유연성을 추구하고 있습니다.

Facebook Prophet 로고

전통적인 예측 솔루션에서 벗어나는 이러한 움직임은 소매업체 등이 수요 예측의 복잡성뿐만 아니라 수십만 또는 수백만 개의 머신러닝 모델을 시기적절하게 생성하는 데 필요한 작업의 효율적인 분배에 대한 사내 전문 지식을 개발해야 합니다. 다행히 Spark를 사용하여 이러한 모델의 훈련을 분산시킬 수 있으므로, 제품 및 서비스에 대한 전체 수요뿐만 아니라 각 위치의 각 제품에 대한 고유한 수요를 예측할 수 있습니다.

시간 시리즈 데이터의 수요 계절성 시각화

개별 매장 및 제품에 대한 세분화된 수요 예측을 생성하기 위해 Prophet을 사용하는 것을 시연하기 위해 Kaggle에서 공개적으로 사용 가능한 데이터 세트를 사용할 것입니다. 이 데이터 세트는 10개 매장의 50개 개별 품목에 대한 5년치 일일 판매 데이터를 포함합니다.

시작하기 위해 모든 제품과 매장에 대한 전체 연간 판매 추세를 살펴보겠습니다. 보시다시피, 총 제품 판매는 정체기에 수렴되는 명확한 징후 없이 해마다 증가하고 있습니다.

다음으로, 월별로 동일한 데이터를 보면 연간 상승 추세가 매월 꾸준히 진행되지 않는다는 것을 알 수 있습니다. 대신, 여름철에는 최고점을 찍고 겨울철에는 최저점을 찍는 명확한 계절 패턴을 볼 수 있습니다. Databricks Collaborative Notebooks의 내장 데이터 시각화 기능을 사용하면 차트 위로 마우스를 가져가면 각 월별 데이터의 가치를 볼 수 있습니다.

요일별로 보면, 일요일(요일 0)에 판매량이 최고조에 달하고 월요일(요일 1)에는 급감한 후 나머지 주 동안 꾸준히 회복됩니다.

기술 가이드 eBook

Databricks 앱을 위한 핸즈온 가이드

Facebook Prophet에서 간단한 시간 시리즈 예측 모델 시작하기

위 차트에서 볼 수 있듯이, 우리 데이터는 판매량의 명확한 연간 상승 추세와 연간 및 주간 계절 패턴을 보여줍니다. Prophet이 해결하도록 설계된 것은 바로 데이터의 이러한 겹치는 패턴입니다.

Facebook Prophet은 scikit-learn API를 따르므로 sklearn 경험이 있는 사람이라면 쉽게 배울 수 있습니다. 입력으로 2열 pandas DataFrame을 전달해야 합니다. 첫 번째 열은 날짜이고 두 번째 열은 예측할 값(이 경우 판매량)입니다. 데이터가 올바른 형식으로 준비되면 모델을 구축하는 것은 쉽습니다.

모델을 데이터에 맞춘 후에는 90일 예측을 구축하는 데 사용하겠습니다. 아래 코드에서는 Prophet의 make_future_dataframe 메서드를 사용하여 과거 날짜와 그 이후 90일을 포함하는 데이터 세트를 정의합니다.

그게 전부입니다! 이제 Prophet의 내장 .plot 메서드를 사용하여 실제 데이터와 예측 데이터가 어떻게 일치하는지, 그리고 미래에 대한 예측을 시각화할 수 있습니다. 보시다시피, 앞에서 설명한 주간 및 계절 수요 패턴은 실제로 예측 결과에 반영됩니다.

이 시각화는 다소 복잡합니다. Bartosz Mikulski는 이것에 대한 훌륭한 분석을 제공하며, 이는 확인해 볼 가치가 있습니다. 간단히 말해서, 검은색 점은 실제 데이터를 나타내고, 진한 파란색 선은 예측을 나타내며, 더 옅은 파란색 밴드는 (95%) 불확실성 구간을 나타냅니다.

Prophet과 Spark를 사용하여 수백 개의 시간 시리즈 예측 모델 병렬 훈련

이제 단일 시간 시리즈 예측 모델을 구축하는 방법을 시연했으므로, Apache Spark의 성능을 활용하여 노력을 배가할 수 있습니다. 우리의 목표는 전체 데이터 세트에 대한 단일 예측이 아니라, 각 제품-매장 조합에 대한 수백 개의 모델과 예측을 생성하는 것입니다. 이는 순차적인 작업으로 수행하기에 시간이 매우 많이 걸릴 것입니다.

이러한 방식으로 모델을 구축하면 예를 들어 식료품 체인이 해당 지역의 수요가 다른 Sandusky 매장에 필요한 우유 양과 다른 양을 해당 매장에 필요한 우유 양과 다르게 정확하게 예측할 수 있습니다.

Spark DataFrames를 사용하여 시간 시리즈 데이터 처리 분산하는 방법

데이터 과학자들은 종종 Apache Spark와 같은 분산 데이터 처리 엔진을 사용하여 대량의 모델을 훈련하는 과제에 직면합니다. Spark 클러스터를 활용하면 클러스터의 개별 워커 노드가 다른 워커 노드와 병렬로 모델의 하위 집합을 훈련할 수 있어 전체 시계열 모델 컬렉션을 훈련하는 데 필요한 총 시간을 크게 줄일 수 있습니다.

물론 워커 노드(컴퓨터) 클러스터에서 모델을 훈련하려면 더 많은 클라우드 인프라가 필요하며 이는 비용이 발생합니다. 그러나 주문형 클라우드 리소스를 쉽게 사용할 수 있으므로 기업은 필요한 리소스를 신속하게 프로비저닝하고 모델을 훈련한 다음 리소스를 즉시 해제하여 물리적 자산에 대한 장기적인 약정 없이 대규모 확장성을 달성할 수 있습니다.

Spark에서 분산 데이터 처리를 달성하는 핵심 메커니즘은 DataFrame입니다. 데이터를 Spark DataFrame으로 로드하면 데이터가 클러스터의 워커에 분산됩니다. 이를 통해 이러한 워커는 데이터의 하위 집합을 병렬 방식으로 처리하여 작업 수행에 필요한 총 시간을 줄일 수 있습니다.

물론 각 워커는 작업을 수행하는 데 필요한 데이터 하위 집합에 액세스할 수 있어야 합니다. 이 경우 스토어 및 항목 조합을 기준으로 데이터를 그룹화하면 해당 키 값에 대한 모든 시계열 데이터가 특정 워커 노드로 모입니다.

다음 섹션에서 UDF를 설정하고 데이터에 적용할 때 실제로 사용되지는 않지만 groupBy 코드를 여기에 공유하여 여러 모델을 효율적으로 병렬로 훈련할 수 있도록 하는 방법을 강조합니다.

pandas 사용자 정의 함수(UDF)의 강력한 기능 활용

시계열 데이터를 스토어 및 항목별로 올바르게 그룹화한 후에는 각 그룹에 대해 단일 모델을 훈련해야 합니다. 이를 달성하기 위해 pandas 사용자 정의 함수(UDF)를 사용할 수 있으며, 이를 통해 사용자 정의 함수를 DataFrame의 각 데이터 그룹에 적용할 수 있습니다.

이 UDF는 각 그룹에 대한 모델을 훈련할 뿐만 아니라 해당 모델의 예측을 나타내는 결과 집합을 생성합니다. 그러나 함수가 DataFrame의 각 그룹에서 독립적으로 훈련하고 예측하는 동안 각 그룹에서 반환된 결과는 편리하게 단일 결과 DataFrame으로 수집됩니다. 이를 통해 스토어-항목 수준 예측을 생성하지만 분석가 및 관리자에게 단일 출력 데이터 세트로 결과를 제시할 수 있습니다.

아래의 축약된 Python 코드에서 볼 수 있듯이 UDF를 구축하는 것은 비교적 간단합니다. UDF는 반환할 데이터의 스키마와 수신할 데이터 유형을 식별하는 pandas_udf 메서드로 인스턴스화됩니다. 바로 뒤이어 UDF의 작업을 수행할 함수를 정의합니다.

함수 정의 내에서 모델을 인스턴스화하고 구성하고 수신한 데이터에 맞게 조정합니다. 모델이 예측을 수행하고 해당 데이터가 함수의 출력으로 반환됩니다.

이제 모든 것을 종합하기 위해 앞서 논의한 groupBy 명령을 사용하여 데이터 세트가 특정 스토어 및 항목 조합을 나타내는 그룹으로 올바르게 분할되도록 합니다. 그런 다음 DataFrame에 UDF를 apply하기만 하면 UDF가 각 데이터 그룹에 모델을 맞추고 예측을 수행할 수 있습니다.

함수를 각 그룹에 적용하여 반환된 데이터 세트는 예측을 생성한 날짜를 반영하도록 업데이트됩니다. 이렇게 하면 기능을 프로덕션으로 전환할 때 다른 모델 실행 중에 생성된 데이터를 추적하는 데 도움이 됩니다.

다음 단계

이제 각 스토어-항목 조합에 대한 시계열 예측 모델을 구축했습니다. SQL 쿼리를 사용하여 분석가는 각 제품에 대한 맞춤형 예측을 볼 수 있습니다. 아래 차트에서는 10개 스토어에 걸쳐 제품 #1에 대한 예상 수요를 표시했습니다. 보시다시피 수요 예측은 스토어마다 다르지만 예상대로 모든 스토어에서 일반적인 패턴은 일관됩니다.

새로운 판매 데이터가 도착하면 효율적으로 새로운 예측을 생성하고 기존 테이블 구조에 추가할 수 있으므로 분석가는 조건이 발전함에 따라 비즈니스 기대치를 업데이트할 수 있습니다.

자세히 알아보려면 How Starbucks Forecasts Demand at Scale with Facebook Prophet and Azure Databricks라는 온디맨드 웨비나를 시청하고 Demand Forecasting을 위한 Solution Accelerator를 확인하세요.

수요 예측 웨비나 헤더

(이 글은 AI의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여기를 클릭해 주세요)

Never miss a Databricks post

Subscribe to our blog and get the latest posts delivered to your inbox