시간 의존성 섹션 — 질문과 검증의 사슬
대질문: 시간 정보를 입력으로 만들면 얼마나 좋아지는가 — 그리고 그 한계는 어디인가?
배경: 회귀 모델에게 각 행은 순서가 섞인 카드 — 시간을 스스로 못 쓰므로, 우리가 컬럼으로 만들어 줘야 한다.
Q1. 시간 신호가 실제로 존재하는가? (존재 증명)
| 단계 | 내용 |
|---|
| 도구 | 합의 분산 공식 (간접) + Stage 1 잔차 ACF (직접) |
| 실측 | 주간 분산이 i.i.d. 이론의 6.15배 → ρ̄ ≈ 0.86 / Stage 1 잔차 ACF lag-1 = 0.7001 |
| 판정 | 독립이면 나올 수 없는 수치 — 시간 신호 존재 확정 |
| 결정 | 시계열 FE에 투자할 가치 있음 → Stage 2 진입 |
Q2. 신호의 구조 — 어느 lag에, 어떤 주기로? (지도 그리기)
| 단계 | 내용 |
|---|
| 도구 | ACF(누적) / PACF(직접) / STL(분해·강도) / ADF(정상성) |
| 실측 | ACF: lag-26 골 −0.38 → lag-52 산 +0.64 / PACF: lag-1(+0.89)·lag-2(+0.20)만 유의 / STL: F_S 0.89 > F_T 0.71 / ADF: 96.2% 정상 |
| 판정 | 연간 주기 확정(ACF+STL 두 독립 증거) · 직접 경로는 2개 · 차분 불필요 |
| 결정 | feature 명세: lag_1·2(직접) + lag_52(연간) + rolling 4주(추세) + sin·cos(달력) |
Q3. 어떻게 누수 없이 번역하나? (안전한 시공)
| 단계 | 내용 |
|---|
| 도구 | (store,item)별 시간순 shift · NaN 행 제거 · 시간 cutoff |
| 실측 | lag_52 정의 불가 첫 52주 26,000행 제거 (130K→104K) · 79개 feature (numerical 10 + OneHot 69) |
| 판정 | 누수 3경로(전기간 rolling/전기간 인코딩/미래 보간) 전부 차단 |
| 결정 | Stage 2 파이프라인 확정 (+ StandardScaler — lag 수백 vs sin·cos ±1) |
Q4. 효과는 얼마이고, 모델과 무관한가? (검증)
| 단계 | 내용 |
|---|
| 도구 | 4모델 재학습(모델 고정 — 순수 효과) + importance 3종 교차 + 잔차 재진단 |
| 실측 | 0.79 → 0.986 · Δ R² +0.1775~+0.1972 (4모델 전부) · lag_52 importance 93.8% · 잔차 ACF 0.70 → 0.24 |
| 판정 | 진화 폭이 좁은 구간에 모임 = 효과가 모델이 아니라 feature의 것 |
| 결정 | H2 적중 — 흡수율 94.5%, 남은 1.4%가 Stage 3의 과제 |
산출물
- R² 0.9856 (Stage 2 best) · 시간 잠재력(20.51%)의 94.5% 흡수
- 진단의 예고(ACF 산 ≫ PACF 1·2 ≫ 추세)와 기여 서열(lag_52 ≫ lag_1 ≫ rolling)이 일치 — 사슬 정합
예상 질문
- "sin·cos(cyclical)의 기여가 왜 0에 가깝나?" → lag_52가 "작년 같은 주의 실제 값"으로 달력 정보를 더 구체적으로 이미 품기 때문 — 달력 위치만 주는 sin·cos가 잉여가 됨.
- "lag을 1~52 전부 만들지 왜 4개만?" → PACF가 직접 경로는 lag-1·2뿐임을 보였다(나머지는 메아리). 사후에 Lasso(non-zero 4/79)가 이 절제를 정당화.
- "누수가 없다는 걸 어떻게 믿나?" → 모든 lag·rolling이 shift 기반(과거만 참조 구조적 보장) + NaN은 보간 대신 제거 + test 구간 격리 — 경로별 차단을 설계로 보장.