고차 추세와 직교 다항식 — 비선형성을 자유도 1 의 가산 조각으로

Maxwell Ch.6.2 Higher Order Trends · Orthogonal Polynomials

선형 추세를 분리한 뒤 남은 변동을 이차·삼차·고차 직교 다항식 대비로 분해하는 절차다. 직교성이 SS 의 가산성을 보장하므로 각 차수의 추세를 독립적으로 검정할 수 있다. Maxwell 학습 시간-회상 데이터에서 선형·이차·삼차 SS 를 계산하고 의사결정의 의미를 정리한다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: 직교 다항식 대비 (Orthogonal Polynomial Contrasts)

수준 \(X_1, \ldots, X_a\) 의 양적 요인에 대해, 차수 \(p = 1, 2, \ldots, a-1\) 의 다항식 \(P_p(X)\) 를 levels 위에서 직교화하여 만든 대비 계수 \(c_j^{(p)}\) 의 집합이다.

직교 조건: \[ \sum_{j=1}^{a} c_j^{(p)} c_j^{(q)} = 0,\quad p \neq q,\qquad \sum_j c_j^{(p)} = 0. \]

이 조건 덕에 각 차수의 SS 가 가산된다. \[ SS_{\text{between}} = \sum_{p=1}^{a-1} SS_{\psi_p},\quad SS_{\psi_p} = \frac{n \, \hat\psi_p^2}{\sum_j (c_j^{(p)})^2}. \]

2 왜 직교 다항식인가

선형 추세만 검정하면 비선형 패턴 (포화, U 자, 진동) 을 놓친다. Maxwell 학습 시간 데이터의 평균 \(\bar Y = (2, 6, 8, 9)\) 는 선형성도 강하지만 마지막 1 분의 추가 효과가 줄어드는 한계 효용 체감 이 보인다. 이 비선형성을 통계적으로 잡으려면 이차 항이 필요하다.

직교화의 이점은 두 가지이다.

  1. SS 의 가산성: 각 차수의 SS 가 다른 차수에 의존하지 않아 “선형 + 이차 + 삼차” 의 분해를 자유도 1 씩 별도로 검정할 수 있다.
  2. 검정력 보존: 비직교 다항식 (단순 \(X, X^2, X^3\) 의 거듭제곱) 은 다중공선성으로 추정 분산이 부풀려진다. 직교 다항식은 분산이 최소이다.
직관: 직교화는 무엇을 하는가

\(X, X^2, X^3, \ldots\) 의 levels 값에서 평균과 저차 다항식 부분을 빼서 “이미 저차가 설명한 부분” 을 제거한다 (Gram-Schmidt). 결과 벡터는 서로 수직이라, 한 차수의 회귀 계수가 다른 차수의 계수에 영향받지 않는다. 통계적 표현으로는 design matrix 의 columns 가 직교이므로 \(\hat\beta\) 의 공분산이 대각이다.

3 등간격·등표본의 표준 직교 다항식

수준이 등간격이고 그룹 표본이 같으면 직교 다항식 계수는 정수로 떨어진다 (Fisher-Yates 표).

\(a\) 차수 계수 \(\sum c_j^2\)
3 linear \(-1, 0, +1\) 2
quadratic \(+1, -2, +1\) 6
4 linear \(-3, -1, +1, +3\) 20
quadratic \(+1, -1, -1, +1\) 4
cubic \(-1, +3, -3, +1\) 20
5 linear \(-2, -1, 0, +1, +2\) 10
quadratic \(+2, -1, -2, -1, +2\) 14
cubic \(-1, +2, 0, -2, +1\) 10
quartic \(+1, -4, +6, -4, +1\) 70

직교성 검증: \(a=4\) 의 linear × quadratic = \((-3)(+1) + (-1)(-1) + (+1)(-1) + (+3)(+1) = -3 + 1 - 1 + 3 = 0\). ✓

4 비선형성 전체 검정

선형 SS 를 분리한 뒤, 남은 그룹 간 변동을 한꺼번에 묶어 자유도 \(a-2\) 의 “비선형성” 검정을 만든다.

\[ SS_{\text{nonlinear}} = SS_{\text{between}} - SS_{\psi_{\text{linear}}} \]

\[ F_{\text{nonlinear}} = \frac{SS_{\text{nonlinear}} / (a-2)}{MS_W} \]

이 검정은 “선형으로 설명되지 않는 추가 구조가 있는가?” 를 묻는다. 유의하면 차수별 세부 검정으로 진행한다.

5 차수별 개별 검정

각 차수 \(p\) 의 추세 SS 는

\[ SS_{\psi_p} = \frac{n \, \hat\psi_p^2}{\sum_j (c_j^{(p)})^2},\quad \hat\psi_p = \sum_j c_j^{(p)} \bar Y_j \]

자유도 1 의 \(F\) 검정은 \(F_p = SS_{\psi_p} / MS_W\).

6 수치 예시 — Maxwell 학습 시간 데이터

\(\bar Y = (2, 6, 8, 9)\), \(n = 6\), \(a = 4\).

6.1 선형 (linear)

\[ \hat\psi_{\text{lin}} = -3(2) - 1(6) + 1(8) + 3(9) = 23 \] \[ SS_{\text{lin}} = \frac{6 \times 23^2}{20} = \frac{3174}{20} = 158.7 \]

6.2 이차 (quadratic)

\[ \hat\psi_{\text{quad}} = +1(2) - 1(6) - 1(8) + 1(9) = -3 \] \[ SS_{\text{quad}} = \frac{6 \times (-3)^2}{4} = \frac{54}{4} = 13.5 \]

이차 대비의 부호가 음수라는 것은 어떤 의미인가? 계수 \((+1, -1, -1, +1)\) 는 “양 끝이 중간보다 큰” U 자형에 양의 값을 준다. 결과 -3 은 그 반대 — “중간이 양 끝보다 큰” 역 U 자, 즉 곡선이 위로 볼록함을 의미한다. 학습 시간이 길수록 추가 회상의 한계가 체감하는 형태와 부합한다.

6.3 삼차 (cubic)

\[ \hat\psi_{\text{cub}} = -1(2) + 3(6) - 3(8) + 1(9) = -2 + 18 - 24 + 9 = 1 \] \[ SS_{\text{cub}} = \frac{6 \times 1^2}{20} = 0.3 \]

6.4 분해 검증

\[ SS_{\text{between}} = SS_{\text{lin}} + SS_{\text{quad}} + SS_{\text{cub}} = 158.7 + 13.5 + 0.3 = 172.5 \]

직교성에 의해 SS 가 정확히 합쳐진다. 한편 ANOVA 의 between 그룹 SS 도 같은 값이어야 한다. 데이터에서 \(\sum_j n (\bar Y_j - \bar{\bar Y})^2 = 6[(2-6.25)^2 + (6-6.25)^2 + (8-6.25)^2 + (9-6.25)^2] = 6[18.0625 + 0.0625 + 3.0625 + 7.5625] = 6 \times 28.75 = 172.5\). ✓

6.5 \(F\) 검정 결과

\(MS_W \approx 4.1\) (\(df = 20\)) 가정 시:

추세 \(SS\) \(df\) \(F\) \(p\)
linear 158.7 1 38.7 \(< 0.0001\)
quadratic 13.5 1 3.29 \(0.085\)
cubic 0.3 1 0.07 \(0.79\)
nonlinear (전체) 13.8 2 1.68 \(0.21\)

해석: 선형 추세는 매우 강하게 유의하지만 이차·삼차는 통상적인 \(\alpha=0.05\) 에서 유의 하지 않다. 비선형성 전체 검정도 비유의. 즉 데이터가 학습 시간의 선형 함수 로 충분히 설명된다고 결론. 단, 이차의 \(p\) 값 0.085 는 표본 크기가 작은 (24) 점을 감안할 때 “잠재적 한계 효용 체감” 의 신호이며 후속 실험에서 재검토할 가치가 있다.

함정: 다중 추세 검정의 alpha 통제

\(a-1\) 개의 추세 대비를 모두 검정하면 가족별 오차율 (FWER) 이 부풀려진다. Maxwell Ch.5 와 같이 (1) 사전 계획된 추세 (보통 선형·이차) 만 검정, (2) 모든 차수를 검정할 경우 Bonferroni 또는 Scheffé 보정을 적용한다. 보통은 선형은 사전 계획, 고차는 탐색 으로 구분한다.

7 Top-down 분석 전략

실무 절차:

1. ANOVA 의 전체 F 검정
   ↓ (유의)
2. 선형 추세 F 검정 (자유도 1)
   ↓ (유의)
3. 비선형성 전체 F 검정 (자유도 a-2)
   ↓ (유의)
4. 이차·삼차 ... 차수별 F 검정
   ↓ (유의 차수까지)
5. 모형 채택: Y ~ 선형 + (필요시) 이차 + ...

비유의 단계에서 멈추는 것이 관례. 즉 비선형성 전체가 비유의이면 이차 이상은 굳이 검정하지 않는다 (Maxwell, 2004, Ch.6 §FURTHER EXAMINATION OF NONLINEAR TRENDS).

8 Python 코드

import numpy as np
from scipy import stats

data = {
    1: [2, 3, 1, 2, 0, 4],
    2: [6, 8, 5, 3, 7, 7],
    3: [6, 8, 10, 5, 10, 9],
    4: [11, 10, 7, 9, 8, 9],
}
levels = [1, 2, 3, 4]
Y_means = np.array([np.mean(data[k]) for k in levels])
n = 6
N = n * len(levels)
a = len(levels)

# Fisher-Yates 직교 다항식 표준 계수 (등간격, a=4)
coeffs = {
    "linear":    np.array([-3, -1, +1, +3]),
    "quadratic": np.array([+1, -1, -1, +1]),
    "cubic":     np.array([-1, +3, -3, +1]),
}

# 직교성 검증
print("== Orthogonality check ==")
for p, cp in coeffs.items():
    for q, cq in coeffs.items():
        if p < q:
            print(f"  <{p},{q}> = {np.sum(cp*cq)}")

# MS_within
ss_within = sum(np.sum((np.array(data[k]) - np.mean(data[k]))**2) for k in data)
ms_within = ss_within / (N - a)

# 차수별 SS 와 F
print("\n== Trend tests ==")
ss_total_trend = 0
for name, c in coeffs.items():
    psi = np.sum(c * Y_means)
    ss = n * psi**2 / np.sum(c**2)
    F = ss / ms_within
    p_val = 1 - stats.f.cdf(F, 1, N - a)
    ss_total_trend += ss
    print(f"  {name:>9s}: psi={psi:+.2f}, SS={ss:7.3f}, F={F:6.2f}, p={p_val:.4f}")

# 비선형 전체
ss_lin = n * np.sum(coeffs["linear"] * Y_means)**2 / np.sum(coeffs["linear"]**2)
ss_between = sum(n * (yj - Y_means.mean())**2 for yj in Y_means)
ss_nonlin = ss_between - ss_lin
F_nonlin = (ss_nonlin / (a - 2)) / ms_within
p_nonlin = 1 - stats.f.cdf(F_nonlin, a - 2, N - a)
print(f"\n  nonlinear: SS={ss_nonlin:.3f}, df={a-2}, F={F_nonlin:.2f}, p={p_nonlin:.4f}")
print(f"  decomposition check: SS_between={ss_between:.3f}, "
      f"sum trends={ss_total_trend:.3f}")

# statsmodels 로 단일 회귀와 추세 비교
import statsmodels.api as sm
X_full = np.repeat(levels, n)
all_Y = np.concatenate([data[k] for k in levels])
X_des = sm.add_constant(np.column_stack([X_full, X_full**2, X_full**3]))
model = sm.OLS(all_Y, X_des).fit()
print("\n== Polynomial regression (3rd order) ==")
print(model.summary().tables[1])

기대 출력:

== Orthogonality check ==
  <linear,quadratic> = 0
  <linear,cubic>     = 0
  <quadratic,cubic>  = 0

== Trend tests ==
     linear: psi=+23.00, SS=158.700, F= 38.71, p=0.0000
  quadratic: psi=-3.00,  SS= 13.500, F=  3.29, p=0.0846
      cubic: psi=+1.00,  SS=  0.300, F=  0.07, p=0.7919

  nonlinear: SS=13.800, df=2, F=1.68, p=0.2114
  decomposition check: SS_between=172.500, sum trends=172.500

9 IT 매핑

ML 하이퍼파라미터 튜닝과의 연결

learning rate 1e-4, 1e-3, 1e-2, 1e-1 의 4 수준 grid search 결과 (validation loss 평균) 에 직교 다항식을 적용해 보자. 선형이 강하면 “lr 가 작을수록 좋다 — 더 작은 값 시도”의 외삽 신호이다. 이차가 음 (역 U 자) 이면 최적이 중간 어딘가에 있다는 신호이고 (ref. response surface, Phase G-12), 삼차가 유의하면 손실 곡면이 비단조 · 다중극값 (saddle, plateau) 일 가능성을 시사한다.

이는 random search 나 Bayesian optimization 이 처리하는 구조 진단의 통계적 형식이다. 양적 요인의 작은 grid (3~5 수준) 에서 조기에 함수 형태를 잡으면 다음 grid 의 범위· 간격을 합리적으로 좁힐 수 있다.

도메인 양적 요인 선형 강함 이차 강함 (역 U) 삼차 강함
가격 정책 할인율 % 한계 효용 미체감 역치 후 포화 가격 구간 효과
광고 노출 노출 빈도 누적 효과 광고 피로 비선형 행동 패턴
추천 슬롯 개수 클릭 증가 다양성 트레이드오프 위치 효과 진동
ML learning rate 단조 감소 최적 중간값 saddle/plateau

10 직교 다항식의 회귀 표현

직교 다항식은 회귀 모형으로도 동치 표현이 가능하다.

\[ Y_{ij} = \beta_0 + \beta_1 P_1(X_j) + \beta_2 P_2(X_j) + \cdots + \beta_{a-1} P_{a-1}(X_j) + \varepsilon_{ij} \]

여기서 \(P_p(X)\) 는 levels 에서 직교화된 다항식. 각 \(\beta_p\) 의 검정은 \(SS_{\psi_p}\)\(F\) 검정과 동치이다. R 의 poly(), Python 의 numpy.polynomial.polynomial.polyvander + QR 분해, statsmodels 의 Orthogonal Polynomial Contrast 가 이 변환을 자동 처리한다.

11 가정과 한계

  • 수준이 등간격, 표본 크기가 같음 — 표 계수의 전제. 비등간격은 Gram-Schmidt 로 계수를 다시 만들어야 한다 (G-MAX6-3).
  • 다항식의 차수 \(\le a-1\): \(a\) 수준의 평균은 \(a\) 개 자유도, 그 중 1 개는 grand mean, 나머지 \(a-1\) 개가 추세에 배분된다. 그 이상의 차수는 추정 불가능 (non-identifiable).
  • 외삽 위험: 추세 모형은 levels 의 범위 밖으로 외삽하면 함수 형태가 깨질 수 있다 (특히 삼차 이상의 다항식).

12 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: