ARIMA와 Google Trend 데이터를 활용한 이커머스 상품 가격 예측

2021. 6. 20. 14:05time-series

출처 : https://www.researchgate.net/publication/329801800_Forecasting_E-Commerce_Products_Prices_by_Combining_an_Autoregressive_Integrated_Moving_Average_ARIMA_Model_and_Google_Trends_Data

 

(PDF) Forecasting E-Commerce Products Prices by Combining an Autoregressive Integrated Moving Average (ARIMA) Model and Google T

PDF | E-commerce is becoming more and more the main instrument for selling goods to the mass market. This led to a growing interest in algorithms and... | Find, read and cite all the research you need on ResearchGate

www.researchgate.net

 

 

1. 연구 목표: 이커머스 상품의 미래의 가격 예측 with 구글 트렌드 데이터 

- 주어진 제품의 가격 추세와 각 외부 요인이 각 제품의 가격 예측에 미치는 영향 분석
     = 과거 정보와 외부 요인이 미래에 미치는 영향을 연구하고 분석
     = 1) & 2)
   1) ARIMA (Autoregressive Integrated Moving Average) 모델을 활용하여 제품의 미래 가격 추세를 예측
   2) 외생변수 = 구글 트렌드 데이터 


※ 이 논문의 특징이자 참신한 지점


1) Google Trend 데이터와 와 상품 가격의 상관 관계를 분석
- 가격, 제조업체, 해당 카테고리, Google 트렌드 및 리뷰와 관련된 정보 내에서 약 900 만 개의 제품과 9,600 만 개의 튜플을 추출한 크롤러를 개발/활용

2) Google 트렌드 정보가 ARIMA 모델 내에서 외생 변수로 사용될 때, 어떻게 예측 작업을 개선했는지에 대한 심층 분석

3) 오픈소스 프레임워크 PriceProbe
- Amazon 제품 정보를 다운로드 및 크롤링
- ARIMA 모델을 조정 및 사용할 수있는 오픈 소스 프레임 워크를 개발

4) 데이터 베이스 구축
Amazon 제품, 리뷰, 시간 경과에 따른 가격 및 관련 Google 트렌드 정보의 방대한 수집

 

2.  Price forecasting 앞두고 time-series 분석의 주요 요소들 이론 설명 
 
1) 정상성stationarity 테스트
    - Adfuller 테스트
    - modified unit root test

2) 비정상 시계열 데이터의 변환
    - 추세와 계절성 제거

3) ARIMA 모델의 파라미터 (p,q,d) 선택


3. 실험에 활용한 데이터 소개

  1) 상품 Products : the Amazon products
    {id, the manufacturer of the given product, the product’s URL, the product’s title, the URL of its related image}
  2) 제조사 manufacturers
  3) 상품 카테고리 Categories
   - 주의!! Each product can be associated with one or more categories
    -  the associations (product, category) as each product may have multiple categories and, vice-versa, each category can be assigned to several products
   -  The rationale behind having the categorieswas to test whether the forecast process was more precise for products of the same categories

  4) 상품 가격
   - tuples (item, price, date) : 하나의 시간의 하나의 상품에는 하나의 가격이 존재
   - 9 millions of different products and about 90 millions of different prices taken within the interval timefrom 2015 to 2016.
   - 하나의 상품에 대한 정보가 모든 시간에 존재하지 않는다 : 연속되어 나타나는 제품이 그렇고 그렇지 않은 제품이 있다
   - Amazon AffiliationAPI (https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/GettingStarted.html)를 사용하여 크롤링

  5) 리뷰 : 아마존 상품 리뷰
   - (item, date, sentiment, stars)
        = {리뷰가 언급된 item, 리뷰 설명, 리뷰가 게시된 날짜, 해당 제품에 대한 감성 스코어(-1에서 +1 사이의 정수), rating 필드(0점~5점이라는 별점 부여)}

  - 모든 제품에 리뷰가 있는 것은 아니다
  - the social influence of its users에 따라 미치는 영향도도 달라지니.. 리뷰와 감성 주제는 매우 까다롭겠다...

  6) trends—which contains information about Google Trends on the manufacturers of the Amazon products
  - {manufacturer, date, value}
  - value = 추세값 (0 약한 추세 ~ 100 강한 추세)
  - Essentially, we havea manufacturer popularity expressed as a pair (value, date).

4. PriceProbe 소개
- RESTful Back-end 로 데이터를 수집하여 관계형 데이터로 저장,

- 데이터를 추출, 수집 및 처리하기 위해 개발 한 크롤러들
1) Amazon AffiliationAPI (https://docs.aws.amazon.com/AWSECommerceService/latest/GSG/GettingStarted.html) 를 사용하여 상품 가격 정보 크롤링

2) GitHub 저장소 (https://github.com/AndreaM16/go-amazon-itemlookup)
      - 단품에 대한 XML 본문에서 제품 제조업체, 카테고리, 리뷰 페이지 URL 등과 같은 다양한 매개 변수가 포함되어 있으나, 리뷰는 url만 있어서 다시 페이지를 글어내야 함

3) 확보하지 못한 일부 제품에 대한 제조업체, 리뷰 정보는 아래 활용
       - Polarized Sentiment Analysis는 Vader Sentiment Analysis (https://github.com/cjhutto/vaderSentiment)를 사용하여 제품 콘텐츠 정보 확보 

4) 그러나 각 일자별 상품의 가격 정보와 리뷰 데이터를 조인할 때, 제품에 대한 리뷰가 매일 없을 수도 있어서, 누락 정보를 메꾸고 매일 일관된 리뷰수를 얻고자 온라인 도구 (https://github.com/AndreaM16/review-analyzer) 를 사용하여 unique한 일일 리뷰를 생성
: 특정 날에 한 개 이상의 리뷰가있는 경우 그들의 감정의 평균을 계산하고 별점과 과 Rt에 삽입

5) 제조사의 인기 정보 + 구글 트렌드 정보(결측치 보정) 

    - Python 및 Golang에서 Selenium Webdriver (http://www.seleniumhq.org/projects/webdriver/ 를 사용하여 크롤러를 구축, 제조사별 트렌드를 찾아서 csv*를 다운로드한 후, 파싱하여 백엔드에 올림

     - 다운로드 된 csv*  파일에 주별 (값, 날짜) 항목가 있는데, 주별 데이터라서 일별 daily 데이터로 변환 : 연속된 2일에 대해서, 각각의 n개의 날짜 데이터를 가져와서,누락된 날짜 t(i)에 대해서 = the average of t(i−1) and t(i+1)로 구함

    ※아울러, 결측치 (구글 트렌드 정보 및 리뷰 모두)의 수는 각 제품의 시계열당 2 %미만이여서 따로 민감도 분석을 포함하지 않았다고 합니다

     - 일별 트렌드 T_f 에는 전체적 트렌드 V(t_i)가 포함되어 있음.

"우리가 개발 한 Selenium + Python 코드는 다음 GitHub 저장소 https://github.com/AndreaM16/yaggts-selenium 에서 무료로 사용할 수 있습니다"


5. ARIMA 모델

1) ARIMA 수행 위한 정상성 확보
    - 차분은 왜 하는가? ARIMA에서는 시계열 데이터가 stationary하다고 가정한다. 만약 이미 Stationary 하다면, ARMA 모델이 추정된다. 하지만 시계열이 정상성과 거리가 있다면, 비정상 데이터를 정상 데이터로 변환하기 위해 차분을 하게 된다
   - 비정상 데이터의 변환 예시 : 성장률의 근사치 ~ 시계열의 변동성을 줄일 수 있다
     ∆y_t=log(Y_t)−log(Y_t−1)


2) ARIMA 모델 튜닝
- innovations equal to zero 로 두고, 독립적으로 예측하면서 전진하는 방식으로 예측 수행 We make our predictions by using the multi-step ahead approach with a direct (also called Independent) strategy, which consists of forecasting each horizon independentlyfrom the others

- 기본변수 (p,d,q) 추정하기 위해서  the Box and Jenkins method 통해 선택  

- 시계열 (p,d,q) 이란, 주어진 시간의 정상성  stationary (d), the size of clusters of correlated entries (q) 와 partially correlated entries (p).

- q란 , 시간이 지남에 따라 유사하게 작동하는 항목의 클러스터가 얼마나 큰지를 알려준다

- step1) Model identification 단계 ~ 정상성 테스트를 거쳐서 ARIMA를 써도 되는지 본다

 정상성 테스트 : modified unit root test
- 정상성이란 시간의 변화에 따라 분포의 모양에 변화가 없다는 것
- 단위근 = 비정상의 원인 중 하나. 왜냐면,시계열에 단위근이 있으면 확률적 과정a stochastic process에서 예측할 수 없는 비체계적 패턴asystematic pattern that is unpredictable이 나타난다
- Augmented Dickey-Fuller 테스트를 통해 "단위근이 있다"는 귀무가설 검정
        - 검정 결과의 p-value가 5% 미만이면 귀무가설 기각 & 통계 값이 음수 일수록 단위근이 있다는 가설을 더 많이 기각 할 수 있다

        - 검정 결과 가설을 기각 할 수없는 것으로 나타나면 시계열 데이터를 미분하고 테스트를 다시 반복해야 함

- 주의!! 일반적으로 두 번 이상의 차분은 해당 시계열 데이터가 ARIMA에 적합하지 않음을 의미한다

- step 2) parameter estimation 적절한 time lag값 p,q 찾기 위해서 Box-Jenkins 활용하여
MA(q) 프로세스의 자기상관이 어떤 시차(q+1)이상에서 0이 되는지,
AR(p) 프로세스의 부분 자기상관이 어떤 시차(p+1)이상에서 0이 되는지, 그 위치를 확인함

이는 자기상관ACF(->> q )과 부분자기상관PACF(->> q ) 그래프에서 95% 신뢰구간 내에 있는지 보는 것, 신뢰 밴드는 The confidence band is approximately ±2/√N, where N corresponds to the sample size

- step3) 모델 평가 : MSE를 최소화하는 p,d,q의 조합을 찾는다


7. ARIMA모델의 파라미터 설정 및 실험 결과/성능평가
1) 최저 MAPE - 실제 가격 트렌드 O_t와 예측 가격 트렌드 R_t 가 있을 때, 100*sum(abs{ ( O_t - R_t ) / O_t })를 모두 더한 후 n으로 나눈 것. 즉, 실제 트렌드 대비 얼마나 틀렸는지 %를 모두 합한 후 n개로 나눠 차이 비율의 평균을 구한 것

저자의 모델 git 허브 참조

https://github.com/andream16/price-probe-ml

2) 성능 평가

2-1) 검증집합
: time-series cross-validation 활용
이와 관련하여 저자의 설명글 참조 
https://towardsdatascience.com/time-series-nested-cross-validation-76adba623eb9


2-2) 외생변수에 따른 성능 평가
외생변수로 Google Trends를 사용했을 때가 가장 성능 좋음
얼마나 성능 개선에 도움이 됐는지를 예측 프로세스에 도움이 되는 횟수로 계산
그리고 감성변수는 매우 낮은 상관관계를 보였음