fANOVA 개념과 Purification¶
SHAP이 개별 예측을 변수별로 분배하는 도구라면, Functional ANOVA(fANOVA)는 모형의 예측 함수 자체를 주효과와 교호작용으로 분리하는 프레임워크다. 이 페이지에서는 fANOVA의 핵심 아이디어와 Purification을 직관 수준에서 다루고, 궁극적으로 SHAP과 fANOVA의 차이를 이해한 뒤 실무에서 둘을 어떻게 조합해 쓸 것인가를 검토하는 것이 목표다.
5.1 왜 "ANOVA"인가¶
통계학의 ANOVA¶
언제 쓰는가? — 두 집단의 평균 비교는 t-test로 충분하지만, 세 집단 이상의 평균을 동시에 비교해야 할 때 ANOVA(Analysis of Variance)를 사용한다.
가설 구조:
- \(H_0\) (귀무가설): \(\mu_{\text{사원}} = \mu_{\text{대리}} = \mu_{\text{과장}} = \mu_{\text{부장}}\) — 모든 집단의 평균이 같다
- \(H_1\) (대립가설): 적어도 하나의 집단 평균이 다르다
예를 들어 "직급이 소득에 영향을 미치는가?"를 검정한다고 하자. 사원·대리·과장·부장의 소득 데이터를 모았을 때, 소득이 사람마다 다른 이유는 크게 두 가지다:
- 그룹 간 차이(SSB) — 직급이 달라서 생기는 소득 차이 (사원 평균 vs 부장 평균)
- 그룹 내 차이(SSW) — 같은 직급 안에서도 사람마다 다른 소득 차이 (같은 과장끼리의 편차)
검정 논리 — 평균이 같은지를 직접 비교하는 게 아니라, 분산의 비율로 간접 판단한다:
직급이 소득에 진짜 영향이 있다면 직급별 평균이 크게 벌어지므로 그룹 간 분산이 커지고, F가 커진다. 반대로 영향이 없다면 직급별 평균이 비슷하므로 F ≈ 1에 머문다. 즉, "그룹 간 흩어짐이 그룹 내 흩어짐에 비해 유난히 큰가?"를 보고 \(H_0\)를 기각할지 판단하는 것이다. "평균 비교"를 직접 하지 않고 분산의 비율이라는 우회 경로로 검정하기 때문에 이름이 "분산 분석"이다.
2-way ANOVA에서는 "직급 효과 + 성별 효과 + 직급×성별 교호작용 + 잔차"로 분해한다. 여기서 핵심은 총 변동을 요인별로 쪼개고, main effect와 interaction을 분리하는 구조다.
"Functional"이 붙은 이유¶
Functional ANOVA는 같은 분산 분해 아이디어를 함수(모형의 예측 함수 \(\hat{f}\))에 적용한 것이다. 전통 ANOVA가 "직급이 소득 변동을 얼마나 설명하는가?"를 물었다면, fANOVA는 "소득 변수가 모형 출력의 변동을 얼마나 설명하는가?"를 묻는다. 분해 대상이 데이터에서 함수로 바뀌었을 뿐, "총 변동을 요인별로 쪼갠다"는 사상은 동일하다 — 그래서 ANOVA라는 이름이 나오지 않았을까 싶다.
| 전통 ANOVA | Functional ANOVA | |
|---|---|---|
| 분해 대상 | 데이터의 분산 (관측값의 흩어짐) | 함수의 분산 (모형 출력의 흩어짐) |
| 요인 | 그룹을 나누는 범주형 변수 (직급, 성별) | 모형의 입력 변수 (소득, DTI, ...) |
| 묻는 질문 | "직급별로 소득 평균이 정말 다른가?" | "소득 변수가 모형 출력 변동의 몇 %를 설명하는가?" |
| 교호작용 | 직급×성별 interaction | 소득×DTI interaction |
| 핵심 산출물 | F 통계량 → 유의성 판정 | 주효과 함수 \(f_j\) + 교호작용 함수 \(f_{jk}\) |
한 가지 더 — 전통 ANOVA는 정규성, 등분산 등 분포 가정이 필요하다. 가정이 깨지면 F 검정의 신뢰성이 떨어진다. 반면 fANOVA는 분포 가정이 필요 없다. 트리 모형의 경우, 학습 시 이미 결정된 bin과 각 bin의 샘플 수(empirical distribution)를 그대로 가중치로 사용하기 때문에 "분포를 정의한다"는 별도 단계 자체가 없다. 이것은 fANOVA가 전통 ANOVA의 사상만 빌려왔을 뿐, 통계적 검정이 아니라 함수 분해 도구이기 때문에 가능한 일이다.
이 아이디어는 Hoeffding(1948)이 확률론에서 처음 제시했고, Hooker(2004)가 ML 모형 해석에 적용하면서 현재의 맥락으로 이어진다.
5.2 핵심 아이디어: 분배 vs 분리¶
SHAP과 fANOVA는 모두 "변수별 기여"를 구하지만, 교호작용을 처리하는 방식이 근본적으로 다르다.
| SHAP | Functional ANOVA | |
|---|---|---|
| 사상(思想) | 분배(distribute) | 분리(decompose) |
| 교호작용 처리 | 관여한 변수들에게 균등 분배 | 별도의 교호작용 항으로 분리 |
| 결과물 | 변수당 하나의 숫자 \(\phi_j\) | 주효과 \(f_j\) + 교호작용 \(f_{jk}\) + ... |
| 해석 단위 | 개별 샘플 (local) | 함수 전체 (global) |
구체적 예시¶
소득(\(X_1\))과 부채(\(X_2\))가 교호작용을 일으킨다고 하자 — 고소득+저부채일 때 부도 확률이 비선형적으로 급감하는 시너지가 있다.
SHAP의 처리 — 교호작용의 기여분을 관여한 변수들에게 반씩 나눠준다:
편리하지만, 대가가 있다. 소득이 동일한 두 차주라도 소득의 SHAP 값이 다를 수 있다:
차주 A: 소득 5,000만 원, 부채 500만 원 → 소득의 SHAP = -0.8
차주 B: 소득 5,000만 원, 부채 2억 원 → 소득의 SHAP = -0.2
교호작용 기여분이 다른 변수의 값에 따라 달라지기 때문이다. 이것이 SHAP이 태생적으로 local 해석일 수밖에 없는 이유다.
fANOVA의 처리 — 교호작용을 분배하지 않고, 별도의 항으로 분리한다:
- \(f_1(X_1)\): 순수하게 소득만의 효과 — 소득이 같으면 항상 같은 값
- \(f_2(X_2)\): 순수하게 부채만의 효과
- \(f_{12}(X_1, X_2)\): 소득과 부채의 순수 교호작용 — 주효과로는 설명할 수 없는 시너지
왜 이 차이가 중요한가 — 규제 관점
심사역이 "소득 변수의 효과가 단조적인가?"라고 물었을 때:
- SHAP: 교호작용 기여분이 섞여 있어 특정 구간에서 비단조 패턴이 나타날 수 있고, 그것이 소득 자체의 비단조성인지 교호작용 때문인지 구분 불가
- fANOVA: \(f_{\text{소득}}\)이 순수 주효과이므로 단조성을 직접 확인 가능. 비단조 패턴이 있다면 그것은 교호작용이 아니라 소득 자체의 효과
5.3 Variance Decomposition — "교호작용이 실제로 중요한가?"¶
fANOVA의 직교 분해 덕분에, 총 분산을 component별로 정확히 나눌 수 있다:
이것이 실무적으로 중요한 이유는, main effect와 교호작용의 상대적 비중을 정량적으로 판단할 수 있기 때문이다.
신용평가 모형 예시
| component | 분산 비중 |
|---|---|
| \(f_{\text{소득}}\) (main) | 22% |
| \(f_{\text{DTI}}\) (main) | 15% |
| \(f_{\text{연체}}\) (main) | 35% |
| 기타 main effects | 20% |
| \(f_{\text{소득,DTI}}\) (interaction) | 5% |
| 기타 interactions | 3% |
| 합계 | 100% |
main effect가 전체 분산의 92%를 설명하고, 교호작용은 8%에 불과하다. 이 모형에서 교호작용은 미미하며, GAM(교호작용 없는 모형)으로도 거의 같은 성능을 낼 수 있었을 것이다.
SHAP의 mean(|SHAP|)로는 이 판단이 불가능하다. SHAP 값에는 주효과와 교호작용이 녹아들어 있어서, "우리 모형에서 교호작용이 실제로 중요한가?"라는 질문에 답할 수 없다. fANOVA의 Variance Decomposition은 이 질문에 숫자로 답한다.
5.4 Purification — 효과 누출 보정¶
문제: 학습 과정에서 효과가 섞인다¶
GA\(^2\)M이나 depth-2 XGBoost를 학습하면, main effect \(f_j\)와 interaction \(f_{jk}\) 사이에 효과 누출(leakage)이 발생한다. 모형의 예측값은 변하지 않지만, 각 항의 해석이 왜곡된다.
DTI/소득 숫자 예시¶
DTI와 소득, 두 변수가 각각 2구간(Low, High)인 depth-2 모형이 다음과 같이 학습되었다고 하자:
학습 결과 (purification 전):
| main effect | 교호작용 \(f_{12}\) | ||
|---|---|---|---|
| 소득=Low | 소득=High | ||
| DTI | Low: 0, High: 0 | +0.1 | -0.7 |
| 소득 | Low: 0, High: 0 | +0.5 | +0.1 |
main effect가 전부 0이고, 모든 효과가 교호작용에 담겨 있다. 해석: "DTI도 소득도 개별 효과는 없고, 오직 두 변수의 조합만 중요하다." — 정말 그럴까?
Purification 적용¶
1단계 — 교호작용 테이블에서 소득의 누출을 찾는다. 각 소득 구간별로 DTI 방향의 평균을 구하면:
- 소득=Low 열의 평균: \((0.1 + 0.5)/2 = +0.3\)
- 소득=High 열의 평균: \((-0.7 + 0.1)/2 = -0.3\)
이 값(+0.3, -0.3)은 소득 구간에만 의존 → 소득의 main effect다. 교호작용에서 빼고 main effect로 옮긴다.
2단계 — 같은 방식으로 DTI의 누출을 찾아 되돌린다. 업데이트된 교호작용의 각 DTI 구간별 평균을 구하면 -0.3, +0.3 → DTI의 main effect로 이동.
결과:
| Purification 전 | Purification 후 | 해석 변화 | |
|---|---|---|---|
| \(f_{\text{DTI}}\) | Low=0, High=0 | Low=-0.3, High=+0.3 | "DTI 높으면 위험 ↑" |
| \(f_{\text{소득}}\) | Low=0, High=0 | Low=+0.3, High=-0.3 | "소득 높으면 위험 ↓" |
| 교호작용 크기 | 전체 효과 지배 | ±0.1 수준으로 축소 | 교호작용은 미미 |
예측값은 네 가지 조합 모두 동일 — purification은 해석만 바꾸고 모형은 바꾸지 않는다.
핵심 교훈
학습 결과만 보면 "교호작용이 전부"였지만, purification 후에는 main effect가 핵심이고 교호작용은 미미한 것으로 드러났다. 효과 누출이 해석을 얼마나 왜곡할 수 있는지를 보여주는 사례다.
실무에서의 적용¶
- InterpretML (EBM): 학습 후 purification이 자동 적용되지 않는다.
interpret.utils.purify()를 명시적으로 호출해야 한다 - PiML (XGB2): Depth-2 XGBoost + purification을 내장 지원
- GAM Purification 별도 라이브러리로도 적용 가능
5.5 Model Complexity ↔ Interpretability Trade-off¶
fANOVA는 이론적으로 아무리 복잡한 트리 모형이라도 주효과와 교호작용으로 분해할 수 있다. 그러나 분해할 수 있다는 것과, 그 결과를 사람이 이해할 수 있다는 것은 별개의 문제다.
Depth-8 XGBoost 500 라운드 모형을 fANOVA로 분해하면:
- main effect의 shape function이 수십 개의 bin으로 잘게 쪼개져, 곡선이 아니라 노이즈에 가까운 지그재그가 된다
- 2-way 교호작용만 해도 \(\binom{30}{2} = 435\)개 조합이 나오고, 각각이 복잡한 heatmap이 된다
- 심사역이나 검증 담당자에게 "이 435개 heatmap을 보시면 모형이 이해됩니다"라고 할 수는 없다
결국 fANOVA가 실무에서 직관적 해석 도구로 기능하려면, 모형 자체의 복잡도가 일정 수준 이내여야 한다.
복잡한 모형에서 fANOVA가 실제로 전달할 수 있는 것¶
성능 중심으로 개발된 깊은 트리 모형이라 하더라도, fANOVA를 통해 실무적으로 의미 있는 해석을 끌어낼 수 있는 영역은 두 가지다:
(1) Main effect의 shape function — 변수 하나의 순수 효과는 2D 곡선이므로, bin이 다소 많더라도 전체적인 방향성과 단조성은 확인할 수 있다. "소득이 올라가면 부도 확률이 내려간다"는 수준의 직관은 복잡한 모형에서도 전달 가능하다.
(2) 분산 기여도가 큰 상위 교호작용 — Variance Decomposition(5.3절)으로 교호작용의 분산 비중을 정렬한 뒤, 상위 2~3개 조합만 보고한다. 다만 이것도 각 변수의 구간이 지나치게 세분화되어 있으면 heatmap이 읽히지 않으므로, 해석 가능한 수준의 구간 수(5~10개 이내)로 요약하는 과정이 필요하다.
해석 가능 모형과의 차이
EBM이나 depth-2 제한 모형처럼 처음부터 해석을 염두에 두고 설계한 모형은 main effect와 교호작용이 자연스럽게 적은 bin, 적은 조합으로 구성된다. 반면 깊은 트리 모형에 fANOVA를 사후 적용하는 것은 "이미 복잡해진 결과물에서 읽을 수 있는 부분만 추려내는" 작업이다. 같은 fANOVA라도 모형 설계 단계에서 복잡도를 제어했느냐에 따라 해석의 품질이 근본적으로 달라진다.
수학적 상세 → 부록
fANOVA 직교 분해의 수학적 제약 조건, Non-identifiability 문제, Mass-Moving 알고리즘의 수렴 정리, SHAP과 fANOVA의 심층 비교 등은 부록 A: SHAP과 Functional ANOVA에서 다룬다.
다음 페이지
도구 · 구현 · 요약 --- 오픈소스 도구, 업계 사례, 구현 예시, 참고 자료를 다룬다.