projects

데이터 분포 축 — 교과서 + history 통합 노트

데이터 분포 축 — 교과서 + history 통합 노트

data-distribution-flow의 4개 질문을, 교과서 개념을 먼저 깔고 우리가 밟은 절차의 history를 얹는 식으로 확장한 노트.


Q1. store·item은 쓸 만한 신호인가, 얼마나 큰가?

교과서: 두 그룹에서 여러 그룹으로

그룹 간 평균 비교의 출발점은 t-test — 평균 차이를 표준오차로 나눈 통계량이 t분포를 따른다는 사실을 이용한다.

t=yˉ1yˉ2SE(yˉ1yˉ2)t = \frac{\bar{y}_1 - \bar{y}_2}{SE(\bar{y}_1 - \bar{y}_2)}

그룹이 셋 이상이면 문제가 생긴다. store 10개면 쌍이 (102)=45\binom{10}{2}=45개, 유의수준 5%로 45번 검정하면 거짓 양성이 한 번 이상 날 확률이 1(0.95)4590%1-(0.95)^{45} \approx 90\%다중비교 문제. 표준 해법이 ANOVA: "모든 모집단 평균이 같다"(H0:μ1==μ10H_0: \mu_1 = \cdots = \mu_{10})는 단일 가설을 한 번에 검정해 오류 누적의 자리를 없앤다.

ANOVA의 엔진은 분산 분해다.

SST=SSB+SSW(전체=그룹 사이+그룹 안)SS_T = SS_B + SS_W \quad (\text{전체} = \text{그룹 사이} + \text{그룹 안})

자유도로 보정한 비율 F=MSB/MSWF = MS_B/MS_W가 1보다 충분히 큰지를 본다. H0H_0이 참이면 분자·분모가 같은 우연에서 나오므로 F ≈ 1.

교과서: p의 한계와 effect size

분모 MSW=SSW/(nk)MS_W = SS_W/(n-k)는 n이 클수록 정밀해진다 → 표본이 충분히 크면 아무리 미세한 차이도 유의해진다. p는 존재("0이 아닌가")만 답하고 크기("얼마나")는 답하지 않는다. Cohen 이래의 처방이 effect size이고, ANOVA 맥락에선 같은 분해를 재활용한 η²가 그 역할:

η2=SSBSST\eta^2 = \frac{SS_B}{SS_T}

F와 η²는 동일한 분해의 두 가지 읽기 — F는 "우연 대비 몇 배"(n에 민감), η²는 "전체 분산 중 그룹의 몫"(n에 무관). Cohen 기준 0.01/0.06/0.14 = small/medium/large.

우리의 history

  1. 질문을 그룹 평균 비교 문제로 환원
  2. t-test 기각 — 쌍이 수백 개, 다중비교 누적
  3. ANOVA 실행 — store F 2,463 / item F 4,418, p ≈ 0
  4. 큰 표본 함정 인지 (n=130K) — F-test의 역할을 문지기(존재 확인)로 한정
  5. effect size 전환 — store η² 14.57% / item η² 62.49%, 둘 다 LARGE, item 4배 → 둘 다 포함, item 주 신호
  6. joint η² 확장 — 그룹 정의를 (store, item) 500개 조합으로 바꿔 같은 계산: 79.49%

보너스 — 측정이 가설이 되는 순간

η²는 "그룹 평균으로 예측하는 모델의 R²"와 정의가 같은 양이다. 입력이 (store, item)뿐인 모델은 같은 입력에 같은 출력 → 최선이 그룹 평균 예측 → joint η² 79.49% = Stage 1 모든 모델의 이론 상한. EDA 측정값이 검증 가능한 가설로 승격됐고, 4모델이 0.7884~0.7917에 모이며 적중.

한 줄: t-test의 다중비교 한계가 ANOVA를 부르고, 큰 표본이 p를 무력화해 η²를 부르고, η²의 R² 동일 척도성이 천장 가설을 낳았다.


Q2. 신호의 형태 — 합인가, 조합인가?

교과서: 주효과와 상호작용 — two-way ANOVA의 언어

요인이 둘이면 분해가 한 조각 늘어난다:

SST=SSA+SSB+SSAB+SSWSS_T = SS_A + SS_B + SS_{AB} + SS_W

가산 모델(additive model)은

y^ij=yˉ+(yˉiyˉ)+(yˉjyˉ)\hat{y}_{ij} = \bar{y} + (\bar{y}_{i\cdot} - \bar{y}) + (\bar{y}_{\cdot j} - \bar{y})

— "조합 평균 ≈ 전체 평균 + store 보정 + item 보정". 상호작용(SSABSS_{AB})은 이 가산 예측과 실제 조합 평균의 차이 — "store 3에선 item 7이 유독 잘 팔린다" 같은, 합으로 환원 안 되는 조합 고유 효과. 직관: 상호작용이 없으면 그룹 평균 그래프의 선들이 평행하다(parallel lines).

ML 번역: 가산이면 OneHot(store)+OneHot(item) 병렬로 충분(선형 모델이 정확히 αi+βj\alpha_i+\beta_j를 배움), 상호작용이 크면 store×item 교차항 필요 — feature가 69개에서 수백 개로 불어나므로 "필요한가"를 먼저 재는 게 순서.

우리의 history

  1. 의심의 출처는 Q1의 끝자락 — joint η²(79.49%) > 단순 합(77.06%), 잉여 2.4%p가 상호작용의 몫이라는 신호
  2. 지표 정의SSABSS_{AB} 비율의 정신을 빌린 자체 지표: IR=Var(yˉijy^ijadditive)/Var(yˉij)IR = \mathrm{Var}(\bar{y}_{ij} - \hat{y}_{ij}^{additive}) / \mathrm{Var}(\bar{y}_{ij})
  3. 실측 — 28,450 = 가산 27,582 (96.9%) + 상호작용 868 (3.1%) → IR 3.05%
  4. 판정·결정 — 5% 이하 가산 충분, 곱셈항 500개 불도입 (이득 상한 3%)

한 줄: joint η²와 단순 합의 차이가 상호작용의 존재를 알렸고, IR이 크기(3.05%)를 쟀고, 크기가 작아 가산 구조가 결정됐다.

심화: IR이 15% 이상이었다면? (가정 질문 대비)

접근의 사다리 4단:

  1. 교차 더미(정공법) — store×item OneHot, drop 적용 시 9×49=441열 추가. full model y^=μ+αi+βj+γij\hat{y} = \mu + \alpha_i + \beta_j + \gamma_{ij}. n=130K, 조합당 ~260행이라 표본은 충분. 단 rank·VIF 재검정 + 계수 70→511 증가의 분산 비용 평가 필요.
  2. joint 범주 통합 — (store,item)을 500-level 범주 하나로. 표현력 동일하나 "store 효과 얼마"의 해석력 상실 — 예측 목적이면 충분, 분석 목적이면 손해.
  3. 선택적 투입 — 가산 잔차 yˉijy^ijadditive\bar{y}_{ij}-\hat{y}_{ij}^{additive}가 큰 조합만 더미 추가, 또는 전부 넣고 Lasso로 쳐내기. 상호작용은 보통 소수 조합에 집중되므로 수십 개로 대부분 잡힘.
  4. 저랭크 분해 — 조합 평균을 10×50 행렬로 보고, 가산 잔차 행렬을 SVD. 유효 rank가 낮으면 store 벡터×item 벡터 내적으로 압축(matrix factorization, 추천 시스템 방식) — 파라미터 절약으로 과적합에 강함.

핵심 비대칭: tree는 면제 — 분기를 거듭하며(store로 쪼개고 그 가지에서 item으로) 상호작용을 자동 학습. 처방은 linear 계열에만. 최종 기준은 cost-benefit: IR이 재준 값은 이득의 상한이므로, 추가 비용(feature 수·과적합)이 그보다 싼지로 결정.


Q3. noise의 형태 — 등분산 가정과 맞는가?

교과서: OLS가 깔고 앉은 가정, 등분산

Gauss-Markov 정리(OLS = 최량 선형 불편 추정량)는 등분산성 위에 서 있다:

y=f(x)+ε,Var(ε)=σ2  (상수)y = f(x) + \varepsilon, \quad \mathrm{Var}(\varepsilon) = \sigma^2 \;(\text{상수})

이분산(heteroscedasticity)이면 계수는 여전히 불편이지만 — ① 표준오차가 틀려 추론이 무너지고, ② 제곱 손실이 분산 큰 그룹에 지배된다. 오차 100은 평균 500 그룹에선 사소하고 평균 20 그룹에선 재앙인데 제곱 손실은 같은 100²으로 센다 → 모델이 대형 그룹 비위만 맞춤.

교과서: 가산 vs 곱셈 noise, 변환의 처방전

가산형: y=μ+ε곱셈형: y=με\text{가산형: } y = \mu + \varepsilon \qquad \text{곱셈형: } y = \mu \cdot \varepsilon

곱셈형이면 σy=μσε\sigma_y = \mu\,\sigma_\varepsilon — σ가 μ에 정비례. 진단 지문: CV=σ/μCV = \sigma/\mu 상수. 처방은 분산 안정화 변환(variance-stabilizing transformation): σ ∝ μ^θ에서 Box-Cox 족으로 고르며, θ=1이면 정확히 log:

logy=logμ+logε\log y = \log\mu + \log\varepsilon

곱이 합으로 풀려 가산·등분산이 되고 우측 skew도 펴진다. (Poisson처럼 σ∝√μ면 sqrt — θ에 따라 처방이 달라지는 게 이 틀의 요점.)

우리의 history

  1. 의심 — 우측 skew + item 간 규모 수십 배 차이, 규모 데이터의 전형
  2. 진단 설계 — 표준은 잔차 vs 적합값 깔때기 모양이지만, 그룹 구조가 있으니 직접: 그룹별 (μ, σ) 쌍의 Pearson r
  3. 실측 — store·item 기준 모두 r = +1.0000, CV 0.47/0.29 상수 — 곱셈 noise 확정 (r=1.0000은 점 10·50개짜리 그룹 통계 상관이라 가능)
  4. 결정 — θ=1의 처방 log, 단 Linear·SVR에만
  5. 사후 검증 — log 후 잔차 skew +0.06, 정규 근접

왜 tree는 제외 — 처방의 비대칭

log가 고치는 건 "전 구간 하나의 함수 + 하나의 오차 스케일"을 가정하는 모델의 문제(Linear·SVR). RF·HGB는 공간을 쪼개 영역별 평균으로 예측 — 대형/소형 item 영역이 분리되어 각자 스케일에서 학습되므로 등분산 가정 자체가 없다. 입력 쪽 log는 분기의 단조 불변성 때문에 무의미, target 쪽 log는 손실 가중을 바꿔 오히려 해가 될 수 있다. → 측정이 같아도 처방은 모델 가정에 따라 갈린다 (Q2의 tree 면제와 같은 패턴).

각주: retransformation bias

log 스케일 예측을 exp로 되돌리면 Jensen 부등식 때문에 E[y]exp(E[logy])E[y] \neq \exp(E[\log y]) — 체계적 과소예측 가능. 방어선: 평가를 원 스케일 지표(R², SMAPE)로 통일해 변환/비변환 모델을 같은 잣대로 비교했다.

한 줄: 규모 데이터의 지문(CV 상수, r=1.0)이 곱셈 noise를 확정했고, Box-Cox 틀의 θ=1 처방인 log가 곱을 합으로 풀었으며, 등분산 가정이 없는 tree는 제외됐다.


Q4. OneHot 표현은 수학적으로 안전한가?

교과서: 범주를 숫자로 — dummy variable trap

label encoding(1,2,3,…)은 존재하지 않는 순서·간격을 주입하므로 명목 범주엔 OneHot이 표준. 그런데 k개 level을 전부 열로 만들면 열들의 합이 모든 행에서 1 — OneHot 블록이 둘이면 store 열합 = item 열합 = 1로 정확한 선형 종속이 생긴다(dummy variable trap). 치명적인 이유는 normal equation:

β^=(XX)1Xy\hat{\beta} = (X^\top X)^{-1} X^\top y

XXX^\top X의 가역성은 XX의 full column rank를 요구한다. 종속이 있으면 rank 결손 → 역행렬 없음 → 해가 유일하지 않음 → 계수 해석 무의미. 처방: 블록마다 level 하나 제거(drop='first') — 빠진 level이 기준(reference)이 되고 남은 계수는 "기준 대비 차이"로 읽힌다.

교과서: 정확한 종속 이후 — 다중공선성과 VIF

rank 회복은 역행렬의 존재까지만 보장한다. 열들이 거의 종속이면(near-collinearity) 가역이어도 불안정 — 계수 추정 분산이 폭발해 데이터가 조금만 달라도 계수가 출렁인다. 표준 측정이 VIF:

VIFj=11Rj2VIF_j = \frac{1}{1 - R_j^2}

(Rj2R_j^2 = feature jj를 나머지 전부로 회귀한 R²) — "이 계수의 분산이 직교 설계 대비 몇 배 부풀었나". 완전 직교면 1, Kutner 기준 10 초과 시 문제.

우리의 history

  1. 인코딩 선택 — OneHot 채택 (label: 거짓 순서 / target encoding: 누수 위험)
  2. rank 검정 — 60열 실측 rank 59/60, 정확히 1 결손 — 교과서가 예고한 함정의 실증
  3. 수리 — drop='first': 9+49=58열, rank 58/58 회복
  4. 잔여 위험 측정 — VIF 전수: max 1.96, Kutner 10의 1/5
  5. 결정 — OneHot + drop='first' 확정, 추가 조치 불필요

VIF가 낮은 이유도 교과서적: 모든 조합이 같은 행 수인 균형 설계(balanced design) — 균형 설계에서 더미들은 거의 직교하고 직교 설계의 VIF 하한은 1. 1.96은 그 이상에 가깝다.

사슬에서의 위치

Q1~Q3이 내용의 결정이라면 Q4는 표현의 구조 검증. 이 단계가 사주는 것 둘: ① Stage 1 Linear 닫힌 해의 수치 안정성 — 천장 수렴 실험의 신뢰 기반, ② 계수 해석 가능성 — "기준 대비 효과"로 읽을 자격이 VIF 1.96에서 나온다.

예상 질문: "tree에도 OneHot이 필요한가?" → 필수는 아니다(역행렬을 안 풀고 label도 분기로 소화). 우리는 4모델 공정 비교를 위해 입력 표현을 통일 — 표현이 다르면 성능 차이가 모델 탓인지 표현 탓인지 분리 불가.

한 줄: dummy trap의 예고를 rank 실측(59/60)으로 확인하고, drop='first'로 full rank를 회복했으며, VIF 1.96(균형 설계의 선물)이 계수 해석의 자격을 줬다.