1 정의
수준 \(X_j\), 그룹 표본 \(n_j\), 평균 \(\bar Y_j\) 의 양적 요인에서 추세 대비 계수를 정의하는 두 방식.
- Unweighted: \(c_j = X_j - \bar X_U\), \(\bar X_U = \frac{1}{a}\sum_j X_j\) (\(X\) 값의 단순 평균). 그룹별 동일 가중치.
- Weighted (Hierarchical): \(c_j = n_j(X_j - \bar X_W)\), \(\bar X_W = \frac{\sum_j n_j X_j}{\sum_j n_j}\) (표본 크기 가중 평균). 모형에 항을 순차 추가하는 접근.
등표본 (\(n_j = n\)) 일 때 두 방식은 정확히 일치한다 (Maxwell, 2004, Ch.6 Eq. 26-27).
2 불균등 표본의 SS 공식
표 계수는 등간격·등표본 가정에서 직교한다. 표본이 다르면 직교성이 깨져 SS 가 가산되지 않는다. 표 계수를 그대로 사용하는 unweighted 접근에서 추세 대비의 SS 는
\[ SS_{\psi} = \frac{\hat\psi^2}{\sum_j (c_j^2 / n_j)} \]
(분모가 등표본의 \(\sum c_j^2 / n\) 일반화임을 확인하자 — \(n_j = n\) 이면 \(\sum c_j^2 / n\) 이 되어 등표본 공식과 일치한다.)
기울기의 일반 형태는
\[ \hat\beta_1 = \frac{\sum_j n_j c_j \bar Y_j}{\sum_j n_j c_j^2} \]
(Maxwell Eq. 4)
3 Unweighted vs Weighted: 편향-검정력 트레이드오프
| 측면 | Unweighted | Weighted (Hierarchical) |
|---|---|---|
| 가정 | levels 가 동등하게 중요 | 표본 비율이 모집단 비율 반영 |
| SS 가산성 | 깨짐 (표 계수 비직교) | 유지 |
| 모집단이 진짜 선형일 때 | 검정력 약간 낮음 | 더 강한 검정력 |
| 모집단이 비선형일 때 | 편향 작음 | 선형 추세 추정이 편향됨 |
| 일반 권장 | 기본값 | 강한 이론적 근거 있을 때만 |
가중 계수 \(c_j = n_j(X_j - \bar X_W)\) 는 그룹 평균을 표본 크기로 가중한다. 이는 “표본이 큰 levels 가 더 신뢰할 만하다”는 가정에 기반한다. 그러나 표본 크기가 모집단 분포 가 아니라 연구자의 편의 로 결정된 경우 (학습 시간 1 분에 12 명, 4 분에 3 명 같은) 가중치가 모집단 추세를 왜곡할 수 있다. 또 진짜 추세가 비선형이면 weighted 선형 검정이 비선형 정보의 일부를 흡수해 가짜 선형 유의성을 만들 수 있다.
따라서 Maxwell 의 일반 권장은 unweighted 이며, 표본 크기가 모집단 비율을 정확히 반영한다는 강한 근거가 있을 때만 weighted 를 정당화한다.
4 불균등 간격 (levels 가 등간격이 아님)
학습 시간 1·2·4·8 분 같은 로그 스케일 levels 의 경우 표 직교 다항식 계수 (Fisher-Yates 표) 는 적용 불가능하다. 새 직교 계수를 만드는 두 표준 방법:
4.1 방법 1 — Gram-Schmidt 직교화
저차에서 시작해 각 다항식을 levels 위에서 직교화한다.
선형: \(c_j^{(1)} = X_j - \bar X\) (\(\bar X = \frac{1}{a}\sum_j X_j\), 등표본 가정)
이차: $X_j^2 - $ projection of \(X_j^2\) on \(c_j^{(1)}\) and constant
\[ c_j^{(2)} = X_j^2 - \alpha - \beta\, c_j^{(1)} \] 여기서 \(\alpha = \overline{X^2}\), \(\beta = \frac{\sum_j c_j^{(1)} X_j^2}{\sum_j (c_j^{(1)})^2}\).
삼차·고차: 동일하게 \(X_j^p\) 에서 \(c_j^{(1)}, \ldots, c_j^{(p-1)}\) 의 투영을 차감.
직교화 결과는 정수가 아닌 일반 실수 계수가 된다. 검정 절차는 등간격과 동일.
4.2 방법 2 — OLS 다항 회귀 + Sequential SS
전체 데이터에 대해
\[ Y_{ij} = \beta_0 + \beta_1 X_j + \beta_2 X_j^2 + \cdots + \beta_{a-1} X_j^{a-1} + \varepsilon_{ij} \]
를 최소제곱으로 적합한 뒤, 항을 차례로 추가한 모형의 잔차 SS 차이로 각 차수의 SS 를 계산한다 (Type I sequential SS).
Model_0: Y ~ 1
Model_1: Y ~ 1 + X
Model_2: Y ~ 1 + X + X^2
...
\(SS_{\text{linear}} = E_0 - E_1\), \(SS_{\text{quadratic}} = E_1 - E_2\), …
Gram-Schmidt 와 sequential OLS 는 동일한 SS 분해를 산출한다 (이는 QR 분해의 동치성). 컴퓨터 시대 이후 OLS 가 더 널리 쓰이며, R 의 poly(X, degree), Python 의 numpy.polynomial.polynomial.Polynomial.fit + 정규화는 모두 직교 다항식을 자동 생성한다.
5 추세 분석 vs 회귀 분석: 언제 어느 것?
Maxwell 의 핵심 구분 (Ch.6 §QUANTITATIVE FACTORS):
| 기준 | 추세 분석 | 회귀 분석 |
|---|---|---|
| levels 의 분포 | 소수의 이산값 (3~6) | 다수의 고유값 (수십~) |
| 그룹당 관측 | 다수 (\(n_j \ge 5\)) | 보통 1 (개인별 unique \(X\)) |
| 본래 변수 형태 | 실험자가 통제한 처치 | 자연스러운 연속 변수 |
| 예시 | 학습 시간 1, 2, 3, 4 분 (각 6 명) | 어머니 IQ → 자녀 IQ (각자 unique) |
| 강점 | 직교 분해, ANOVA 통합 | 외삽·내삽 가능, 연속 해석 |
어머니 IQ 점수가 본래 연속이면 회귀로 다뤄야 한다. 4 분위로 묶어 추세 분석을 하면 정보 손실 과 분위 경계 의존성 이 발생한다. Maxwell 은 “if there are relatively few distinct values of the predictor and there are several individuals with scores at each of these values, trend analysis offers advantages over regression analysis. … rarely is it useful to categorize a continuous variable in order to perform a trend analysis” 라고 명시한다 (Maxwell, 2004, Ch.6).
6 외삽·내삽의 주의
추세 분석의 추정·검정은 연구에서 사용된 \(X\) 값들의 범위 내 에서만 유효하다.
- 외삽 금지: 학습 시간 1~4 분 데이터로 적합한 \(\hat Y = 0.5 + 2.3 X\) 를 \(X=10\) 에 적용해 회상 23.5 개를 예측하는 것은 부적절하다. 학습 시간 6 분쯤에 회상 능력의 생리적 한계가 올 수 있고, 추세 모형은 그 외부 행동을 보장하지 않는다.
- 내삽은 신중히: \(X=3.5\) 의 회상 예측은 데이터 범위 내이지만, 사이 구간을 보간할 이론적 근거 (예: 단조 함수 가정) 가 있어야 신뢰할 수 있다.
7 데이터 예시 — 비등간격, 불균등 표본
학습 시간 levels = \((1, 2, 4, 8)\) 분 (로그 스케일), 그룹 표본 = \((8, 6, 6, 4)\), 평균 회상 = \((2.0, 5.5, 8.5, 9.5)\).
7.1 Step 1 — 선형 unweighted 대비
\(\bar X_U = (1 + 2 + 4 + 8) / 4 = 3.75\)
\(c_j^{(1)} = X_j - \bar X_U = (-2.75, -1.75, 0.25, 4.25)\)
\(\hat\psi_{\text{lin}} = -2.75(2.0) + (-1.75)(5.5) + 0.25(8.5) + 4.25(9.5)\) \(= -5.5 - 9.625 + 2.125 + 40.375 = 27.375\)
\(\sum c_j^2 / n_j = 7.5625/8 + 3.0625/6 + 0.0625/6 + 18.0625/4\) \(= 0.945 + 0.510 + 0.010 + 4.516 = 5.981\)
\[ SS_{\text{lin}} = \frac{27.375^2}{5.981} = \frac{749.39}{5.981} = 125.30 \]
7.2 Step 2 — 이차 직교 계수 (Gram-Schmidt)
\(X_j^2 = (1, 4, 16, 64)\), \(\overline{X^2} = 21.25\)
\(c_j^{(1)} \cdot X_j^2 = -2.75(1) - 1.75(4) + 0.25(16) + 4.25(64) = -2.75 - 7 + 4 + 272 = 266.25\)
\(\sum c_j^{(1) 2} = 7.5625 + 3.0625 + 0.0625 + 18.0625 = 28.75\)
\(\beta = 266.25 / 28.75 = 9.261\)
\(c_j^{(2)} = X_j^2 - 21.25 - 9.261\, c_j^{(1)}\)
\(j=1\): \(1 - 21.25 - 9.261(-2.75) = -20.25 + 25.468 = 5.218\) \(j=2\): \(4 - 21.25 - 9.261(-1.75) = -17.25 + 16.207 = -1.043\) \(j=3\): \(16 - 21.25 - 9.261(0.25) = -5.25 - 2.315 = -7.565\) \(j=4\): \(64 - 21.25 - 9.261(4.25) = 42.75 - 39.359 = 3.391\)
(직교성 검증: \(\sum c_j^{(1)} c_j^{(2)} \approx 0\) ✓ — 작은 수치 오차 제외)
\(\hat\psi_{\text{quad}} = 5.218(2.0) - 1.043(5.5) - 7.565(8.5) + 3.391(9.5)\) \(= 10.436 - 5.737 - 64.303 + 32.215 = -27.389\)
이 값을 SS 로 환산하면 (분모 \(\sum c_j^{(2) 2} / n_j\)) 이차 추세의 강도를 추정.
7.3 Step 3 — Python 자동화
이런 손계산은 오류가 잦으니 컴퓨터로 위임한다.
8 Python 코드
import numpy as np
import statsmodels.api as sm
from numpy.polynomial import polynomial as P
# 비등간격 + 불균등 표본 데이터
levels = np.array([1, 2, 4, 8])
n_per = np.array([8, 6, 6, 4])
y_means = np.array([2.0, 5.5, 8.5, 9.5])
# 가상 raw data 재구성 (분포는 평균에만 맞춤)
np.random.seed(42)
all_X = np.repeat(levels, n_per)
all_Y = []
for k, (m, n) in enumerate(zip(y_means, n_per)):
all_Y.append(np.random.normal(m, 1.5, n))
all_Y = np.concatenate(all_Y)
# 1) Sequential SS via OLS polynomial regression
def fit_poly(X, Y, deg):
X_mat = sm.add_constant(np.column_stack([X**p for p in range(1, deg+1)]))
return sm.OLS(Y, X_mat).fit()
E = []
for d in range(0, 4): # 0..3 차수
if d == 0:
m = sm.OLS(all_Y, np.ones((len(all_Y), 1))).fit()
else:
m = fit_poly(all_X, all_Y, d)
E.append(np.sum(m.resid**2))
ss_lin = E[0] - E[1]
ss_quad = E[1] - E[2]
ss_cubic = E[2] - E[3]
ss_within = E[3] # full polynomial = 그룹별 평균에 적합 (a=4 levels)
df_within = len(all_Y) - 4
ms_within = ss_within / df_within
print("Sequential SS decomposition (unequal spacing, unequal n):")
print(f" linear : SS={ss_lin:8.3f} F={ss_lin/ms_within:6.2f}")
print(f" quadratic: SS={ss_quad:8.3f} F={ss_quad/ms_within:6.2f}")
print(f" cubic : SS={ss_cubic:8.3f} F={ss_cubic/ms_within:6.2f}")
# 2) Orthogonal polynomial via numpy.polynomial (자동 직교화)
from numpy.polynomial.polynomial import Polynomial
print("\nOrthogonal polynomial coefficients (centered+scaled):")
for d in [1, 2, 3]:
p = Polynomial.fit(levels, y_means, d, w=n_per) # 가중 회귀
print(f" degree {d}: domain={p.domain}, coef={p.convert().coef}")
# 3) 회귀 vs 추세 비교 — levels 가 연속 변수인 양 회귀 적합
slope, intercept, r, p_reg, se = __import__("scipy.stats", fromlist=["linregress"]).linregress(all_X, all_Y)
print(f"\n[regression] slope={slope:.3f}, intercept={intercept:.3f}, "
f"R^2={r**2:.3f}, p={p_reg:.4g}")9 IT 매핑
| 시나리오 | levels | 표본 | 적절 분석 |
|---|---|---|---|
| 추천 슬롯 3, 5, 7, 9 (각 그룹 1 만 명) | 등간격 등표본 | 충분 | 표 계수 추세 분석 |
| 가격 인하율 5, 10, 20, 50 % (그룹별 트래픽 다름) | 비등간격 불균등 | 충분 | unweighted 추세 분석 |
| 사용자 연령 (개인별 고유값) | 연속 | 1 인 1 값 | 회귀 분석 |
| ML lr 1e-4, 1e-3, 1e-2, 1e-1 (각 5 회 실행) | 비등간격 (로그) | 작음 | 로그 변환 후 등간격 추세 |
| A/B 변종 (UI 색 5 가지) | 명목 (질적) | 충분 | 일반 ANOVA + 사후 비교 |
learning rate, weight decay 같은 양적 hyperparameter 의 grid 가 로그 스케일이면 \(X' = \log_{10}(X)\) 로 변환해 등간격으로 만들고 표 직교 다항식을 적용한다. 이는 “로그 스케일이 자연스럽다” 는 구조적 가정 (효과가 곱셈적) 에 부합한다. response surface (Phase G-12) 에서도 같은 변환이 표준이다.
10 가정과 한계 — 종합
추세 분석을 적용하기 전 점검할 가정:
- 양적 요인의 측도: 비율·간격 척도. 명목·서열은 적용 불가.
- levels 의 의미 있는 거리: 1 분과 2 분의 거리가 3 분과 4 분의 거리와 동일하다고 주장할 수 있는가? 아니라면 변환 (log, 제곱근) 후 분석.
- 본래 이산 처치: 연속 변수는 회귀로.
- 외삽·내삽 신중: 통계적 추론은 관측 levels 범위 내에서만.
- ANOVA 표준 가정: 정규성·등분산·독립성. 위반 시 robust 추세 (rank-based, bootstrap) 또는 Jonckheere 검정 (단조 추세의 nonparametric 대안).
11 본 시리즈 요약
G-MAX6-0 추세 분석 개관 — 양적 요인의 함수 패턴 분해
G-MAX6-1 선형 추세 = 회귀 기울기의 contrast 표현
G-MAX6-2 직교 다항식으로 이차·고차의 가산 분해
G-MAX6-3 불균등 간격·표본 + 추세 vs 회귀의 선택 ← 현재 글
↓
Phase G-12 Response Surface
(양적 요인 2 개 이상의 곡면 적합)
12 관련 주제
선행 지식
후속 주제
- G-MON7 — Response Surface Designs (작성 예정, Phase G-12)
- G-MAX7 — Two-Way Factorial Designs
다른 카테고리 연결