2. Functional ANOVA — 함수의 직교 분해¶
작성 중
이 페이지는 현재 작성 중입니다.
1절에서 확인한 것처럼, 제약 없이는 하나의 함수를 무한히 많은 방식으로 분해할 수 있고, 분해마다 해석이 달라진다. 그러면 제약을 걸어서 분해를 하나로 고정하면 되지 않을까? Functional ANOVA(fANOVA)가 바로 그것이다 — 수학적 제약 조건을 부과하여 분해를 유일하게 결정하는 프레임워크다.
이 절에서는 먼저 "Functional ANOVA"라는 이름의 유래를 짚은 뒤, 분해 공식이 실제로 무엇을 계산하는지 1절의 XOR 예시에 직접 적용해보면서 확인한다. 그런 다음, 유일성을 보장하는 세 가지 제약 조건과 그 핵심인 Integrate-to-Zero 조건을 알아본다.
왜 "ANOVA"인가 — 통계학에서 함수 분해로¶
fANOVA를 본격적으로 다루기 전에, 이름에 담긴 의미를 짚고 가자.
통계학의 ANOVA¶
ANOVA(Analysis of Variance)는 데이터의 총 분산을 요인별로 분해하는 기법이다. 예를 들어, "직급에 따라 소득이 다른가?"를 검정한다고 하자:
SSB(집단 간)가 SSW(집단 내)에 비해 충분히 크면, "직급이 소득에 유의한 영향을 미친다"고 판단한다. 핵심은 분산을 쪼개서 각 요인의 기여를 정량화하는 것이다.
2-way ANOVA로 확장하면 요인이 2개(예: 직급 × 성별)가 되고, 총 분산을 "직급 효과 + 성별 효과 + 직급×성별 교호작용 + 잔차"로 분해한다. main effect와 interaction을 분리하는 구조가 여기서 이미 나타난다.
"Functional"이 붙은 이유¶
Functional ANOVA는 같은 분산 분해 아이디어를 함수에 적용한 것이다:
| 전통 ANOVA | Functional ANOVA | |
|---|---|---|
| 분해 대상 | 데이터의 분산 | 함수의 분산 |
| 요인 | 범주형 변수 (직급, 성별) | 모형의 입력 변수 (소득, DTI, ...) |
| 묻는 질문 | "직급이 소득 변동의 몇 %를 설명하는가?" | "소득 변수가 모형 출력 변동의 몇 %를 설명하는가?" |
| 교호작용 | 직급×성별 interaction | 소득×DTI interaction |
"Functional"이라는 수식어는, 분해 대상이 데이터 포인트가 아니라 함수 자체(모형의 예측 함수 \(\hat{f}\))이기 때문에 붙었다. 이 아이디어는 Hoeffding(1948)이 확률론에서 처음 제시했고, Sobol(1969)이 독립적으로 재발견했으며, 1990년대에 "Functional ANOVA"라는 이름이 확립되었다. Hooker(2004)가 이것을 ML 모형 해석에 적용하면서 현재의 맥락으로 이어진다.
전통 ANOVA의 핵심이 "이 요인이 유의한가?"를 분산 비율로 판단하는 것이듯, fANOVA의 핵심도 "이 변수(또는 변수 조합)가 모형 출력 변동의 몇 %를 설명하는가?"를 정량화하는 것이다. 이것이 아래에서 다룰 Variance Decomposition(식 4)이며, SHAP에는 없는 fANOVA만의 강점이다.
분해의 정의¶
임의의 함수 \(\hat{f}(\mathbf{x})\)를 모든 변수 부분집합의 효과 합으로 분해한다:
여기서 \(f_0\)은 전체 평균(intercept), \(f_i\)는 변수 \(i\)의 주효과, \(f_{ij}\)는 변수 \(i, j\)의 2차 교호작용이다. 변수가 \(p\)개이면 가능한 부분집합이 \(2^p\)개이므로, 최대 \(2^p\)개의 component가 존재한다.
각 component \(f_S\)는 재귀적으로 정의된다 (Hooker, 2004):
수식이 복잡해 보이지만, 하는 일은 두 단계다: (1) \(S\)에 포함되지 않는 변수들(\(X_{-S}\))을 확률분포에 따라 적분(평균)해서 없앤다. (2) 이미 구해진 하위 component(\(f_V\), \(V \subset S\))를 뺀다. "하위 component"란 현재 구하려는 것보다 더 적은 수의 변수로 설명되는 효과를 말한다. 예를 들어 \(f_{12}\)(2변수 효과)의 하위 component는 \(f_0\), \(f_1\), \(f_2\)(0~1변수 효과)다.
이 절차를 가장 단순한 것부터 차례로 풀면, 각 component가 무엇인지 명확해진다:
| Component | 수식 | 직관 |
|---|---|---|
| Intercept | \(f_0 = \mathbb{E}[\hat{f}(\mathbf{X})]\) | 전체 평균. 모든 변수를 적분해서 없앤 값 |
| Main effect | \(f_1(x_1) = \mathbb{E}[\hat{f}(\mathbf{X}) \mid X_1 = x_1] - f_0\) | \(X_1\)만 고정하고 나머지를 평균 낸 뒤, 전체 평균을 빼면 \(X_1\)만의 순수 효과 |
| 2차 interaction | \(f_{12} = \mathbb{E}[\hat{f} \mid X_1, X_2] - f_1 - f_2 - f_0\) | 두 변수를 모두 고정했을 때의 값에서, 이미 설명된 효과(전체 평균 + 각각의 주효과)를 빼면 두 변수가 동시에 특정 조합일 때만 나타나는 효과가 남는다 |
핵심 원리: 나머지 변수를 적분해서 없앤 뒤, 더 적은 수의 변수로 이미 설명된 효과를 빼면, 해당 변수 집합만의 순수 효과가 남는다. 이 "빼기"가 없으면 main effect와 교호작용이 뒤섞이는데, 그것이 1절에서 본 non-identifiability의 원인이었다.
XOR 함수로 직접 계산해보기¶
공식이 실제로 어떻게 작동하는지 확인하는 가장 좋은 방법은 직접 계산해보는 것이다. 1절에서 네 가지 분해를 보았던 XOR 함수에 fANOVA를 적용하자. fANOVA가 1절의 네 분해와 다른 다섯 번째 분해를 내놓는다면, 그것이 유일한 정답이 된다.
균등분포를 가정한다 (4가지 입력이 동일 확률 1/4).
대상 함수: \(Y(0,0)=0,\; Y(0,1)=1,\; Y(1,0)=1,\; Y(1,1)=0\)
Intercept — 전체 평균:
가장 먼저 구하는 것은 \(f_0\)이다. 모든 변수를 적분해서 없앤 값, 즉 \(Y\)의 기대값이다:
Main effect — 나머지를 평균 내고, 전체 평균을 뺀다:
\(f_1(x_1)\)을 구하려면, \(X_1\)을 특정 값으로 고정한 상태에서 \(X_2\)에 대해 평균을 내고, 방금 구한 전체 평균 \(f_0\)을 뺀다. \(f_0\)을 빼는 이유는, 전체 평균은 이미 intercept에 담겨 있으므로 main effect에서는 전체 평균을 초과하는 부분만 남겨야 하기 때문이다:
\(f_2\)도 같은 방식으로 구한다. \(X_2\)를 고정하고 \(X_1\)에 대해 평균을 낸다:
\(X_1\)이든 \(X_2\)든, 0일 때의 평균 출력과 1일 때의 평균 출력이 동일하다 (둘 다 0.5). 따라서 main effect는 정확히 0이다. 이것은 XOR이 순수한 교호작용 함수라는 직관과 일치한다 — 변수 하나만으로는 출력을 예측할 수 없으니까.
2차 교호작용 — 하위 효과를 모두 빼고 남은 것:
마지막으로 \(f_{12}\)를 구한다. 원래 함수에서 intercept(\(f_0\))와 main effect(\(f_1, f_2\))로 이미 설명된 부분을 빼면, 두 변수가 동시에 특정 조합일 때만 나타나는 순수한 효과가 남는다:
왜 빼는가? 빼지 않으면 \(f_{12}\)에 main effect와 intercept가 중복으로 담긴다. 1절의 분해 ①이 정확히 이 경우였다 — \(f_{12}\)가 \(Y\) 자체였고, 그 안에 전체 평균 0.5가 그대로 들어 있었다.
XOR에서는 \(f_1 = f_2 = 0\)이므로, 전체 평균 0.5만 빼면 된다:
| \(f_{12}\) | \(X_2=0\) | \(X_2=1\) |
|---|---|---|
| \(X_1=0\) | \(0 - 0.5 = \mathbf{-0.5}\) | \(1 - 0.5 = \mathbf{+0.5}\) |
| \(X_1=1\) | \(1 - 0.5 = \mathbf{+0.5}\) | \(0 - 0.5 = \mathbf{-0.5}\) |
읽는 법: \(f_{12} = +0.5\)인 칸(서로 다른 조합: 0-1, 1-0)은 평균보다 높고, \(f_{12} = -0.5\)인 칸(같은 조합: 0-0, 1-1)은 평균보다 낮다. XOR의 "서로 달라야 1"이라는 패턴이 교호작용에 그대로 담겨 있다.
fANOVA 분해 vs 1절의 네 가지 분해¶
방금 구한 fANOVA 분해(\(f_0 = 0.5,\; f_1 = 0,\; f_{12} = [-0.5, 0.5;\; 0.5, -0.5]\))를 1절의 네 분해와 나란히 놓아보자. 결과부터 말하면, 1절의 네 가지 분해는 어느 것도 fANOVA 분해와 일치하지 않는다:
| 분해 | \(f_0\) | \(f_1\) | \(f_{12}\) | fANOVA 제약 충족? |
|---|---|---|---|---|
| ① | 0 | 0 | [0, 1; 1, 0] | ✗ |
| ② | 0.25 | ±0.25 | [0.25, 0.75; 0.75, -0.75] | ✗ |
| ③ | -0.75 | ±0.25 (반대) | [0.25, 1.75; 1.75, 1.25] | ✗ |
| ④ | -0.25 | 0 | [0.25, 1.25; 1.25, 0.25] | ✗ |
| fANOVA | 0.5 | 0 | [-0.5, 0.5; 0.5, -0.5] | ✓ |
\(f_0 = 0.5\)인 분해는 1절에 없었다. fANOVA가 내놓은 이 분해만이 아래에서 설명할 세 가지 제약 조건을 동시에 만족하며, 유일하다.
분해 ①과 fANOVA는 main effect가 둘 다 0이라는 점에서 비슷해 보이지만, intercept가 다르다. ①에서 \(f_0 = 0\)이고 \(f_{12}\)의 평균이 \((0 + 1 + 1 + 0)/4 = 0.5\)인 반면, fANOVA에서는 그 0.5가 \(f_0\)로 옮겨져서 \(f_{12}\)의 평균이 \((-0.5 + 0.5 + 0.5 + (-0.5))/4 = 0\)이 된다. 이것이 아래에서 다룰 Zero Means 제약의 효과다.
유일성을 보장하는 제약 조건¶
fANOVA 분해가 유일한 이유는, 다음 세 가지 조건을 동시에 만족하는 분해가 하나뿐이기 때문이다. 각 조건이 무엇을 막는지, XOR 예시로 검증해보자.
Zero Means (평균 0)¶
intercept(\(f_0\))를 제외한 모든 component의 기대값이 0이어야 한다. 전체 평균은 \(f_0\) 하나에만 담기고, 나머지 component는 그 평균으로부터의 편차만 표현한다. 1절에서 본 분해 ①과 ④의 차이(intercept를 어디에 담을지)를 이 조건이 해결한다.
XOR 예시로 검증:
| component | 기대값 계산 | 결과 | 충족? |
|---|---|---|---|
| \(f_1\) | \((0 + 0) / 2\) | \(0\) | ✓ |
| \(f_2\) | \((0 + 0) / 2\) | \(0\) | ✓ |
| \(f_{12}\) | \((-0.5 + 0.5 + 0.5 + (-0.5)) / 4\) | \(0\) | ✓ |
반면 1절의 분해 ①에서 \(f_{12}\)의 기대값 = \((0 + 1 + 1 + 0)/4 = 0.5 \neq 0\). 전체 평균 0.5가 교호작용에 남아 있으므로, Zero Means를 위반한다.
Orthogonality (직교성)¶
서로 다른 component끼리 곱해서 기대값을 구하면 0이다. 통계학에서 "직교"란 정보가 겹치지 않는다는 뜻이다. \(f_1\)에 담긴 효과와 \(f_{12}\)에 담긴 효과가 독립적이어서, 하나를 알아도 다른 하나에 대해 아무 정보를 주지 않는다.
XOR 예시에서 \(f_1 = f_2 = 0\)이므로, \(f_1 \cdot f_{12} = 0\)은 자명하다. 일반적으로는 non-trivial한 조건이며, main effect가 0이 아닌 함수에서 중요해진다.
Variance Decomposition (분산 분해)¶
총 분산 = 각 component 분산의 합. 직교성의 직접적 결과이며, 실무적으로 중요한 의미가 있다: 각 component가 전체 분산의 몇 %를 차지하는지를 계산할 수 있게 된다. 예를 들어 "소득의 main effect가 전체 분산의 40%를 설명하고, 소득×부채 교호작용은 5%에 불과하다"라는 진술이 가능해진다.
XOR 예시:
- 총 분산: \(\sigma^2(Y) = \mathbb{E}[(Y - 0.5)^2] = \frac{(0-0.5)^2 + (1-0.5)^2 + (1-0.5)^2 + (0-0.5)^2}{4} = \frac{0.25 \times 4}{4} = 0.25\)
- \(\sigma^2(f_1) = 0\), \(\sigma^2(f_2) = 0\)
- \(\sigma^2(f_{12}) = \frac{(-0.5)^2 + 0.5^2 + 0.5^2 + (-0.5)^2}{4} = \frac{0.25 \times 4}{4} = 0.25\)
- 합계: \(0 + 0 + 0.25 = 0.25\) ✓
이것은 XOR의 모든 분산이 교호작용에서 온다는 것을 의미한다. 변수 하나로는 XOR을 전혀 설명할 수 없으니 직관적으로도 맞다.
main effect vs interaction — 비중을 정량화할 수 있다¶
Variance Decomposition이 실무적으로 중요한 이유는, main effect와 교호작용의 상대적 비중을 정량적으로 판단할 수 있기 때문이다. XOR에서는 main이 0%, interaction이 100%였지만, 실제 신용평가 모형에서는 예를 들어 이런 결과가 나올 수 있다:
| component | \(\sigma^2\) | 비중 |
|---|---|---|
| \(f_{\text{소득}}\) (main) | 0.22 | 22% |
| \(f_{\text{DTI}}\) (main) | 0.15 | 15% |
| \(f_{\text{연체}}\) (main) | 0.35 | 35% |
| 기타 main effects | 0.20 | 20% |
| \(f_{\text{소득,DTI}}\) (interaction) | 0.05 | 5% |
| 기타 interactions | 0.03 | 3% |
| 합계 | 1.00 | 100% |
이 테이블이 말해주는 것: main effect가 전체 분산의 92%를 설명하고, 교호작용은 8%에 불과하다. 이 모형에서 교호작용은 미미하며, GAM(교호작용 없는 모형)으로도 거의 같은 성능을 낼 수 있었을 것이다.
이것이 전통 ANOVA에서 "SSB / SST = 몇 %"로 요인의 유의미함을 판단하는 것과 같은 발상이다. fANOVA는 이 발상을 ML 모형에 그대로 가져온 것이다.
SHAP의 mean(|SHAP|)로는 이 판단이 불가능하다. SHAP 값에는 주효과와 교호작용이 녹아들어 있어서(4절 참조), "우리 모형에서 교호작용이 실제로 중요한가?"라는 질문에 답할 수 없다. fANOVA의 Variance Decomposition은 이 질문에 숫자로 답한다 — 이것이 fANOVA가 "ANOVA"라는 이름을 달고 있는 이유이기도 하다.
핵심: Integrate-to-Zero¶
위의 세 조건 중 실무에서 가장 직접적으로 쓰이는 것이 있다. Zero Means와 Orthogonality를 하나의 조건으로 합친 강력한 형태인 Integrate-to-Zero다. 3절의 Purification 알고리즘이 바로 이 조건을 만족시키는 방향으로 작동하므로, 그 의미를 정확히 이해할 필요가 있다.
수식이 추상적이므로, 풀어서 읽자. \(u = \{1, 2\}\)(2차 교호작용)이고 \(i = 1\)인 경우:
\(f_{12}\)에서 변수 \(X_1\)의 값을 고정한 채 \(X_2\) 방향으로 가중평균을 내면, 결과가 0이어야 한다.
좀 더 직관적으로 말하면: 교호작용 테이블의 모든 행(또는 열)의 가중평균이 0이어야 한다. 만약 어떤 행의 평균이 0이 아니라면, 그 평균값은 해당 행에 고정된 변수(\(X_1\))의 main effect이지 교호작용이 아니다 — 교호작용에 main effect가 누출되어 있다는 뜻이다.
이것이 실질적으로 검사하는 것: \(f_{12}\)에 \(f_1\)이나 \(f_2\)에 담겨야 할 효과가 남아 있지 않은가?
XOR 예시로 검증¶
fANOVA의 \(f_{12} = [-0.5, 0.5;\; 0.5, -0.5]\):
- \(X_1\)을 고정하고 \(X_2\)에 대해 평균:
- \(X_1=0\): \((-0.5 + 0.5)/2 = 0\) ✓
- \(X_1=1\): \((0.5 + (-0.5))/2 = 0\) ✓
- \(X_2\)를 고정하고 \(X_1\)에 대해 평균:
- \(X_2=0\): \((-0.5 + 0.5)/2 = 0\) ✓
- \(X_2=1\): \((0.5 + (-0.5))/2 = 0\) ✓
모든 행/열 평균이 0이다. \(f_{12}\)에는 \(X_1\)만으로 설명 가능한 패턴도, \(X_2\)만으로 설명 가능한 패턴도 남아 있지 않다. 이것이 순수한 교호작용(pure interaction) — 두 변수가 동시에 특정 조합일 때만 나타나는, 더 적은 수의 변수로는 설명할 수 없는 효과다.
1절의 분해 ①이 왜 실패하는가¶
비교: 분해 ①의 \(f_{12} = [0, 1;\; 1, 0]\):
- \(X_2=0\) 고정, \(X_1\) 방향 평균: \((0 + 1)/2 = 0.5 \neq 0\) ✗
이 0.5는 "\(X_2=0\)일 때의 평균 출력"이다. 이것은 \(X_2\)의 값에만 의존하는 효과, 즉 \(X_2\)의 main effect 또는 intercept에 해당하는 값이다. 이것이 \(f_{12}\) 안에 남아 있다는 것은 교호작용 테이블에 main effect가 누출되어 있다는 뜻이다.
fANOVA는 이런 누출을 허용하지 않는다. 교호작용에는 교호작용만, main effect에는 main effect만 — 이 원칙을 수학적으로 강제하는 것이 Integrate-to-Zero 조건이다.
이 세 조건을 동시에 만족하는 분해는 유일(unique)하다. 비로소 "이 변수의 효과가 양이다/음이다"를 신뢰할 수 있게 된다.
그런데 XGBoost 같은 트리 기반 모형은 학습 과정에서 이 제약을 고려하지 않는다. 학습된 shape function이 이미 뒤섞여 있을 때, 이를 사후적으로 바로잡는 알고리즘이 필요하다. 다음 절에서 그 알고리즘(Purification)이 어떻게 작동하는지, 구체적인 숫자 예시로 확인한다. → 3절. Purification — 트리 모형의 사후 정제
참고문헌¶
| 문헌 | 내용 |
|---|---|
| Hooker (2004, 2007) | Functional ANOVA를 ML 해석에 적용한 논문 |
| Hooker, Mentch, Zhou (2021) | 변수 독립성 위반 시 ANOVA/SHAP 문제 |