- 시계열 예측을 사용하여 에콰도르 기반의 대형 식료품 소매업체인 Corporación Favorita의 매장 판매량(
sales
)을 예측하고자 함- Favorita 매장에서 판매되는 수천 개 제품들의 단위 판매량을 제품군 별로 정확하게 예측하는 모델을 구축하고자 함
팀원 1 | 팀원 2 | 팀원 3 | 팀원 4 | 팀원 5 |
---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
|
고도현 | 박지현 | 서혜현 | 원서현 | 차수빈 |
- 기간: 2023.1.01(월) ~ 2023.01.19(금)
- 세부 일정

- 역할
이름 | 역할 |
---|---|
고도현 | 데이터 병합, 데이터 전처리, EDA - Type D, Modeling - Type D |
박지현 | 데이터 병합, 데이터 전처리, EDA - Type A, Modeling - Type A |
서혜현 | 데이터 병합, 데이터 전처리, EDA - Type C, Modeling - Type C |
원서현 | 데이터 병합, 데이터 전처리, EDA - Type E, Modeling - Type E |
차수빈 | 데이터 최종 병합, 데이터 최종 전처리, EDA - Type B, Modeling - Type B, 코드 최종 검토 |
- 예측은 기상학뿐만 아니라 정부의 경제 성장, 과학적 미래 인구 예측뿐만 아니라 기업의 제품 수요 예측과 같은 다양한 분야에서 중요한 역할을 함
- 특히 육상 식료품점에서는 정확한 재고 구매가 필요하며, 머신러닝을 통한 더 정확한 예측은 고객을 만족시키기 위해 필수적임
- 현재의 주관적인 소매 예측 방법은 데이터 부족으로 자동화하기 어려우며, 새로운 위치, 제품, 계절 변화, 예측할 수 없는 마케팅으로 인해 더욱 복잡함
여러 Favorita 상점에서 판매되는 수천 개의 품목에 대한 단위 판매를 더 정확하게 예측하는 모델 구축
- Root Mean Squared Logarithmic Error(
RMSLE
)- 다음과 같이 계산
-
$$\sqrt{ \frac{1}{n} \sum_{i=1}^n \left(\log (1 + \hat{y}_i) - \log (1 + y_i)\right)^2}$$ -
$n$ : 총 인스턴스 수 -
$\hat{y}_i$ : 인스턴스$i$ 에 대한 타겟의 예측값 -
$y_i$ : 인스턴스$i$ 에 대한 타겟의 실제값
-
Store-Sales-Forecasting
├─ 데이터 구조(정의).docx # ERD(Entity Relationship Diagram)
├─ 1. data_merging.ipynb # 데이터 병합
├─ 2. preprocessing.ipynb # 데이터 전처리
├─ 3. EDA_final.ipynb # EDA
├─ 4. Modeling_Final.ipynb # Modeling
│
├─1. merging # 데이터 병합
│ ├─고도현
│ │ 데이터 병합_고도현.ipynb
│ │
│ ├─박지현
│ │ 데이터_전처리_pdf파일.pdf
│ │ 데이터_전처리_박지현.ipynb
│ │
│ └─원서현
│ 1. data_merging.ipynb
│
├─2. preprocessing # 데이터 전처리
│ 2. data_preprocessing(원서현).ipynb
│ 2. preprocessing_차수빈.ipynb
│ kaggle_stocksales_전처리(서현).ipynb
│ kaggle_stocksales_전처리.ipynb
│ 전처리_고도현.ipynb
│
├─3. eda
│ 3. EDA_TypeA_박지현.ipynb
│ 3. EDA_TypeB_차수빈.ipynb
│ 3. EDA_TypeC_서혜현.ipynb
│ 3. EDA_typeD_고도현.ipynb
│ 3_EDA_typeE_원서현.ipynb
│
└─4. modeling
4. Modeling_TypeA_박지현.ipynb
4. Modeling_typeB_차수빈.ipynb
4. Modeling_TypeC_서혜현.ipynb
4. Modeling_TypeD_고도현.ipynb
4_Modeling_TypeE_원서현.ipynb
- 일 단위 데이터
- 데이터 수집/가공 후 하나의
csv
파일로 가공 - 성격과 목적에 맞게 5가지 파일로 구분되어 있음

- 학습용 데이터
- 데이터 건수: 300만개
- 데이터 시점: 2013-01-01 ~ 2017-08-15
- 중복 데이터: x

- 매장 메타데이터
- 데이터 건수: 54개
- 데이터 시점: x
- 중복 데이터: x

- 일일 유가
- 데이터 건수: 1218개
- 데이터 시점: 2013-01-01 ~ 2017-08-31
- 중복 데이터: x

- 거래 데이터, 하루 동안 매장에 방문한 사람 수 또는 하루에 생성된 송장(영수증) 수
- 데이터 건수: 83488개
- 데이터 시점: 2013-01-01 ~ 2017-08-15
- 중복 데이터: x

- 휴일 및 이벤트에 대한 메타 데이터
- 공휴일의 규모가 가장 중요하다고 판단됨
- 국가 공휴일인 경우 전 지역, 전 매장이 영향을 받음
- 지역 공휴일인 경우 해당 지역(주, 도시)만 영향을 받음
- 공휴일의 규모가 가장 중요하다고 판단됨
- 데이터 건수: 350개
- 데이터 시점: 2012-03-02 ~ 2017-12-26
- 데이터 중복: O

Index | Column | Description |
---|---|---|
1 | id | 각 데이터를 구분하기 위한 식별자 |
2 | date | 판매일자 |
3 | store_nbr | 매장 고유 식별번호 |
4 | family | 판매되는 제품군 유형 |
5 | sales | 매출액, target 변수 |
6 | onpromotion | 프로모션 대상 제품 수 |
7 | city | 도시 |
8 | state | 주 |
9 | type | 매장 유형 |
10 | cluster | 유사한 매장들의 군집 |
11 | dcoilwtico | 유가(기름값) |
12 | transactions | 거래량 |
13 | holiday | 공휴일 종류 |
- 시도표
- 시계열 분해(time series decomposition)
- 추세(Trend): 우상향
- 계절성(seasonality): 주로 연말(11
12dnjf)에 증가하고 연초(12월)에 감소하는 형태 - 잔차 분석: 패턴이 나타나지 x
- 정상성
- ACF, PACF
- ADF 검정
- 데이터 파악 시 2가지 문제점을 파악
- 매장마다 개업 일자가 다르다는 문제
- 중간에 휴업을 한 경우들도 존재 -> 차분의 어려움
시간과 관련된 변수로
year(연도)
,quarter(분기)
,month(월)
,day_of_week(요일)
변수 추가
- 5개의 파일을 병합/ 전처리 후 학습용 데이터에 대해 수행
🔗 EDA
type
,cluste
r에 따라 store은 어떻게 구분되는지 파악type
과cluster
변수는 서로를 구분하는 데 중요한 역할을 하는 것으로 확인됨
- 또한, 가게의 type마다 매출액의 크기와 분포에 큰 차이가 있음을 확인
type에 따라 각각 다른 예측 모델을 개발하기로 결정
- 이후 각 type별로 EDA를 진행한 후 이상치 제거, 최종적으로 모델링에 활용할 변수 선택
Type | 최종 활용 변수 |
---|---|
A | store_nbr , family , onpromotion , state , cluster , dcoilwtico , holiday , year , quarter , month , day_of_week |
B | store_nbr , family , onpromotion , city , cluster , dcoilwtico , holiday , year , quarter , month , day_of_week |
C | store_nbr , family , onpromotion , state , cluster , dcoilwtico , holiday , year , quarter , month , day_of_week |
D | store_nbr , family , onpromotion , city , cluster , dcoilwtico , holiday , year , quarter , month , day_of_week |
E | store_nbr , family , onpromotion , dcoilwtico , holiday , year , quarter , month , day_of_week |
RandomForestRegressor
활용HyperOpt
를 활용한 하이퍼 파라미터 튜닝
Type | RMSE |
---|---|
A | 0.323 |
B | 0.371 |
C | 0.378 |
D | 0.355 |
E | 0.139 |
- test 데이터를
type
별로 분리 후 각 모델을 활용하여 예측 수행- 예측 이후 해당 매장에서 판매하지 않는 제품군의 경우
sales
를 0으로 수정
- 예측 이후 해당 매장에서 판매하지 않는 제품군의 경우
- 대부분
onpromotion
과 제품군(family_
)의 종류가 모델의 예측 성능에 큰 영향을 미침 - 최종 LeaderBoard RMSLE: 0.54718
- 시계열 데이터에 대해 다양하게 eda를 해보면서, 시계열 데이터만의 특징과 형태를 보며 어떻게 이 데이터를 다루어야 하는지 고민해볼 수 있었던 경험이었다.
- 딥러닝이 아닌 머신러닝으로 시계열 데이터를 다룸으로써 어떻게 데이터를 분해하고 가공해야 하는지 생각해본 것이 이번 프로젝트에서 겪었던 힘들었던 점이자 좋은 점인 것 같다.
- 이후 BDA 공모전과 비슷한 환경에서 실습을 하기 위해
RandomForestRegressor
만 사용하였는데, 범주형 변수가 많은 상황에서 해당 모델은 다른 RNN 기반 모델이나 ARIMA 등의 통계적 모형에 비해 예측 성능이 떨어지는 것 같다. - 데이터 이해에 많은 시간을 허비하여 모델링에 더 많은 노력을 기울이지 못해 아쉽다.
- 시계열 데이터 분석을 처음 접하면서 시계열 데이터의 특성과 시계열 만의 여러 데이터 분석 기법을 익힐 수 있어 유익한 경험이었다
- 데이터 전처리에 많은 시간을 투자했는데 그에 비해 모델링에 여러 방법을 경험해보지 못해 아쉬웠으나 여러 전처리 아이디어를 생각해보고 적용시켜보어 매우 뿌듯한 경험이었다.
- 시계열 데이터를 처음 분석해보면서, 시계열 데이터의 특성을 배우고 이를 다루는 방법을 학습할 수 있었다.
- 타겟 변수에 유의미한 영향을 미칠만한 변수를 고민해보며 인사이트를 도출하는 과정이 흥미로웠지만 좀 더 다양한 모델링을 시도하지 못한 점은 아쉽다.