research

EDA 1단계 — 기본 현황 파악

EDA 1단계 — 기본 현황 파악


EDA의 첫 번째 단계. 분석을 시작하기 전에 데이터가 "믿을 만한 상태인지" 확인하는 과정이다.

## 왜 먼저 해야 하는가

이동평균이나 lag feature는 이전 데이터를 기반으로 계산된다. 결측값이나 이상값을 모른 채로 feature를 만들면 오염이 전체로 퍼진다. 예를 들어 특정 날에 판매량이 0으로 기록되어 있는데 실제로는 데이터가 누락된 것이라면, 그 날을 포함한 이동평균은 실제보다 낮게 계산된다.

## 확인해야 할 세 가지

### 1. 결측값 (Missing Values)

데이터에 값이 아예 없는 경우다. 시계열에서는 특히 **날짜 gap**이 문제다. 특정 날에 판매 기록이 없으면 그 날이 아예 row로 존재하지 않을 수 있다. 이 경우 이동평균 계산 시 날짜 연속성이 깨진다.

확인 포인트:
- 각 컬럼의 NULL 비율
- 날짜 연속성 — 중간에 빠진 날이 있는지

처리 방향은 맥락에 따라 다르다:
- 판매 기록 없음 = 실제로 판매 0 → 0으로 채우거나 해당 날짜 row를 생성
- 판매 기록 없음 = 데이터 누락 → 보간(interpolation) 또는 해당 구간 제외

### 2. 이상값 (Outliers)

분포에서 극단적으로 벗어난 값이다. 시계열에서 이상값은 두 종류다:

- **실제 이상값**: 대규모 단체 주문, 행사, 오입력 등
- **정상적인 spike**: 명절 전 수요 급증처럼 반복되는 패턴

이 둘을 구분하는 게 중요하다. 반복되는 spike는 제거 대상이 아니라 계절성 feature로 포착해야 한다. 오입력이나 일회성 이상값만 처리 대상이다.

확인 방법: 상품별로 판매량 분포를 보고 극단값의 날짜를 확인해서 맥락을 파악한다.

### 3. 데이터 범위와 규모

- 전체 기간이 얼마나 되는지 — 5년치 이동평균을 쓰려면 최소 5년 데이터가 필요하다
- 상품 수가 몇 개인지 — 상품마다 모델을 따로 만들 건지, 통합할 건지 결정에 영향
- 상품별 거래 빈도 — 매일 거래되는 상품과 가끔 거래되는 상품은 전처리 방식이 다르다

## 이 단계의 산출물

- 결측값 현황 테이블
- 날짜 gap 목록
- 이상값 후보 목록 (날짜 + 맥락)
- 데이터 기간, 상품 수, 상품별 거래일 수 요약

이 산출물을 보고 feature engineering 전에 어떤 처리가 필요한지 결정한다.



## 12,000개 이상 상품에서의 현실적 접근

상품이 수천 개 이상이면 상품별 테이블을 따로 만들거나 하나하나 분석하는 건 불가능하다. 대신 **통계적으로 전체 분포를 파악**하는 게 1단계의 실제 목표가 된다.

### 테이블 구조 vs 분석 단위

테이블을 상품별로 쪼갤 필요 없다. 하나의 테이블에서 `GROUP BY`로 집계하면 된다. 필요한 형태:

```
scode | mday       | daily_qty
------|------------|----------
1001  | 2024-01-01 | 15
1001  | 2024-01-02 | 23
1002  | 2024-01-01 | 8
```

이걸 원본 테이블에서 집계 쿼리 하나로 만든다.

### 전체 분포에서 확인할 것

- 상품별 총 거래일 수 분포 → 히스토그램 하나로 전체 파악
- 상위 N개 상품이 전체 거래량의 몇 %인가 → 파레토 법칙 확인
- 거래일 수가 기준 이하인 상품 수 → 모델 대상 제외 기준 결정

### 실제 흐름

```
원본 테이블
    │
    ▼
매출 행만 필터링
    │
    ▼
상품 × 날짜 단위 수량 합산 (GROUP BY scode, mday)
    │
    ▼
상품별 거래일 수 분포 확인 → A/B/C 그룹 분류
    │
    ▼
A그룹(충분한 데이터)만 추려서 EDA 2단계로
```

테이블을 쪼개는 것이 아니라 쿼리와 필터링으로 분석 대상을 좁혀가는 방식이다.



## EDA 1단계 실제 결과 — tsan 데이터

### 전체 범위
- 기간: 2008-05-01 ~ 2026-03-12 (3,312일)
- 전체 상품 수: 11,397개
- 실질적 데이터 시작: 상위 상품 대부분 2015-07-01 전후 (시스템 전환 추정)

### 거래 빈도 분포

| 그룹 | 거래일 수 | 상품 수 | 비율 |
|------|---------|--------|------|
| C (희소) | ~30일 | 9,282개 | 81% |
| B | 31~365일 | 1,799개 | 16% |
| A (충분) | 730일+ | 107개 | 1% |

상품 거래일 수 중위값: **2일** → 전체 81%가 모델링 불가 수준의 희소 데이터

### 파레토

- 상위 10개 상품 → 전체 거래량의 40.6%
- 상위 100개 → 78.4%
- 상위 500개 → 94.6%

### 모델링 대상 결정

현실적인 모델링 대상은 730일+ 상품 107개. 그 중 거래량 1위 상품(scode 53)부터 파이프라인 구축 시작.

- scode 53: 거래일 2,281일, 총 수량 2,152,569, 기간 2015-07-01 ~ 2026-03-10



## 반품 처리 결정

scode 53 기준 반품 건수: 88건 / 전체 2,281건 (약 3.9%)

반품 비율이 작고, 반품은 실제 순 판매량의 일부이므로 **별도 처리 없이 순 판매량(SUM(su))으로 진행**한다. 반품이 많은 날 순 판매량이 낮아지는 건 현실을 반영하는 것이고, 이동평균에 미치는 영향도 미미하다.

반품 비율이 10% 이상이거나 반품이 특정 시점에 집중된다면 별도 처리가 필요할 수 있다.