EDA 2단계 — 시간 패턴 시각화
EDA 1단계에서 데이터 상태를 확인했다면, 2단계는 **실제로 어떤 패턴이 있는지** 시각화로 확인하는 과정이다. 여기서 발견한 패턴만 feature로 만든다.
## 왜 scatter가 아닌가
Scatter는 두 변수 간의 관계를 보는 차트다. 시계열에서 x축 날짜, y축 수량으로 scatter를 그리면 점만 뿌려지고 시간 흐름에 따른 연속성이 보이지 않는다. 시계열에서 보고 싶은 건 "흐름"이기 때문에 선이 필요하다.
## 차트 종류와 목적
### 1. 전체 추세 — Line plot
```python
import pandas as pd
import matplotlib.pyplot as plt
df['mday'] = pd.to_datetime(df['mday'])
plt.figure(figsize=(15, 4))
plt.plot(df['mday'], df['daily_qty'])
plt.title('일별 판매량 추이')
plt.show()
```
확인 포인트:
- 장기 트렌드가 있는가 (전반적으로 증가/감소)
- 어느 시점에 급변이 있는가
- 주기적으로 반복되는 spike가 보이는가
### 2. 요일 패턴 — Bar plot
```python
df['day_of_week'] = df['mday'].dt.dayofweek # 0=월, 6=일
df.groupby('day_of_week')['daily_qty'].mean().plot(kind='bar')
plt.title('요일별 평균 판매량')
plt.show()
```
요일별 평균에 차이가 없으면 요일 feature는 추가하지 않는다.
### 3. 월 패턴 — Bar plot
```python
df['month'] = df['mday'].dt.month
df.groupby('month')['daily_qty'].mean().plot(kind='bar')
plt.title('월별 평균 판매량')
plt.show()
```
월별 차이가 뚜렷하면 계절성 feature를 넣는다.
### 4. 이상값 탐색 — Box plot
```python
df.boxplot(column='daily_qty', by='month', figsize=(12, 5))
plt.title('월별 판매량 분포')
plt.show()
```
월별 분포를 보면 이상값도 같이 드러난다. 박스에서 크게 벗어난 점들이 이상값 후보다.
## 시각화 순서
전체 line → 요일 bar → 월 bar → box plot 순서로 본다. 전체 흐름을 먼저 파악하고, 주기 패턴을 확인하고, 이상값을 마지막에 보는 것이 자연스럽다.
## 여기서 결정하는 것
| 확인 내용 | feature 결정 |
|----------|------------|
| 요일별 차이 있음 | `day_of_week` feature 추가 |
| 요일별 차이 없음 | 요일 feature 제외 |
| 월별 차이 있음 | `month`, `quarter` feature 추가 |
| 반복되는 spike | 공휴일/이벤트 feature 고려 |
| 이상값 존재 | 처리 방법 결정 (제거 or 보존) |
## EDA 2단계 결과 — scode 53
### Line plot
- 장기 트렌드 없음
- 초반 32,000+ spike 존재 (실제 대량 주문 확인)
- 마이너스 값 소수 존재 (반품, 3.9% 수준)
### 요일 패턴 ✅
- 일요일(6) 평균 260 — 평일 평균(900~1200)의 1/4 수준
- B2B 성격 강한 상품으로 추정
- `day_of_week` feature 추가 결정
### 월별 패턴 ✅
- 8~9월 평균 2,000+ (성수기)
- 1~2월 평균 450~500 (비수기)
- 계절성 뚜렷 → `month`, `quarter` feature 추가 결정
### 이상값 (대량 주문)
- 중위값은 거의 0에 가깝고 가끔 수만 단위 spike 발생
- 실제 대량 주문으로 확인 → 제거 불가
- Bimodal 분포: 일반 소량 주문 + 대량 주문 패턴이 혼재
- 모델 방향 결정 필요: 대량 주문 포함 vs 일반/대량 분리
### 최종 feature 결정
| feature | 결정 | 근거 |
|---------|------|------|
| `day_of_week` | ✅ 추가 | 일요일 패턴 뚜렷 |
| `month` | ✅ 추가 | 여름 계절성 강함 |
| `quarter` | ✅ 추가 | 월 패턴 강화 |
| lag, rolling | ✅ 추가 | 시간 의존성 기본 |