1 Rotatable Design
응답 예측의 분산 \(\text{Var}(\hat Y(\mathbf{x}))\) 가 design 중심에서의 거리 만에 의존하고 방향에 무관 한 design.
\[ \text{Var}(\hat Y(\mathbf{x})) = f(\|\mathbf{x}\|) \]
→ 같은 거리의 모든 점이 같은 정밀도. 어느 방향으로 응답이 증가할지 모를 때 가장 robust.
1.1 왜 Rotatable 인가
당신이 어느 방향으로 진행할지 사전 정보가 없다면, 한 방향으로 정밀하고 다른 방향으로 부정확한 design 은 위험. Rotatable design 은 이 위험을 제거 — 모든 방향이 통계적으로 같은 분산.
비유: GPS 가 “남북 정밀도 ±1m, 동서 정밀도 ±10m” 라면 동서 방향 이동에 부정확. 모든 방향 ±5m 균등이 더 좋다 (특히 어느 방향으로 갈지 모를 때).
이는 RSM 의 미지의 응답 곡면 탐색에 자연스럽다 — 정상점이 어느 방향에 있는지 모르므로 모든 방향 균등 정밀도가 좋다.
2 Central Composite Design (CCD)
2.1 정의
CCD = \(2^k\) factorial (또는 fractional) + \(2k\) axial points + center points.
\(k\) 변수, 점 수:
| 부분 | 점 수 |
|---|---|
| Factorial | \(2^k\) |
| Axial | \(2k\) |
| Center | \(n_C\) (보통 4~6) |
| 총 | \(2^k + 2k + n_C\) |
2.2 Axial Points
Axial point: 한 변수가 \(\pm \alpha\), 다른 모든 변수가 0:
\(k = 3\) 의 6 axial points: \[ (\pm\alpha, 0, 0), (0, \pm\alpha, 0), (0, 0, \pm\alpha) \]
2.3 \(\alpha\) 의 선택
\(\alpha\) 의 값에 따라 design 의 성격 변화:
| \(\alpha\) | 종류 | 특징 |
|---|---|---|
| \((n_F)^{1/4}\) | Rotatable | \(\text{Var}(\hat Y)\) 가 \(\|\mathbf{x}\|\) 만에 의존 |
| 1 | Face-centered | axial 점이 cube 의 면 위 (factorial 외각) |
| \(\sqrt{k}\) | Spherical | 모든 점이 같은 거리에 |
| 다른 값 | Orthogonal | 모수 추정량 간 직교 |
가장 자주: Rotatable. 다음으로 face-centered (모든 변수의 범위가 \([-1, 1]\) 로 실용적).
2.4 각 \(k\) 의 rotatable \(\alpha\)
\(\alpha = (n_F)^{1/4}\):
| \(k\) | \(n_F = 2^k\) | \(\alpha\) |
|---|---|---|
| 2 | 4 | \(4^{1/4} = \sqrt{2} \approx 1.414\) |
| 3 | 8 | \(8^{1/4} \approx 1.682\) |
| 4 | 16 | \(16^{1/4} = 2\) |
| 5 | 32 | \(32^{1/4} \approx 2.378\) |
| 5 (half-fractional) | 16 | \(16^{1/4} = 2\) |
2.5 CCD 의 Visualization — \(k = 2\)
x_2
│
●─────●─────● (+α, 0)
│ │
│ ● ● │
│ │
●──┼─●─●─●─┼──● ← x_1
│ (0,0) │ center
│ ● ● │
│ │
●─────●─────● (-α, 0)
│
(0, -α)
(2D 에서 8 + 4 + 5 = 17 points 의 일반 CCD.)
3 Box-Behnken Design
3.1 정의
3 수준 (\(-1, 0, +1\)) 의 factorial 의 부분 — 모든 점이 sphere 위에 있는 점 (모서리 점 없음).
\(k = 3\) 의 Box-Behnken: - \((0, \pm1, \pm1)\) — 4 points - \((\pm1, 0, \pm1)\) — 4 points - \((\pm1, \pm1, 0)\) — 4 points - \((0, 0, 0)\) — center, 보통 3 points
총 12 + 3 = 15 points.
3.2 CCD vs Box-Behnken
| 측면 | CCD | Box-Behnken |
|---|---|---|
| 점 수 (k=3) | 8 + 6 + n_C ≈ 19 | 12 + n_C ≈ 15 |
| 변수 범위 | \([-\alpha, \alpha]\) | \([-1, 1]\) |
| 극단 점 | factorial corners + axials | 없음 (조작 안전) |
| 사용 시점 | 일반 | 조작 한계가 있을 때 |
Box-Behnken 의 장점: 모서리 점 없음 → 변수의 극단 조합 (예: 최대 온도 + 최대 압력) 회피. 산업 안전 관점에서 유리.
CCD 의 장점: factorial 부분이 standard \(2^k\) — 1 차 fit 후 axial 추가로 2 차 fit 으로 전환 (sequential).
4 ANOVA 표 — RSM
2 차 모형의 ANOVA:
| Source | \(SS\) | \(df\) |
|---|---|---|
| Regression | \(SS_{\text{reg}}\) | \((k+1)(k+2)/2 - 1\) |
| ┌ 1 차 | \(k\) | |
| │ 2 차 (자기) | \(k\) | |
| └ 상호작용 | \(\binom{k}{2}\) | |
| Lack-of-fit | \(SS_{\text{LOF}}\) | $n - n_C - $ regression \(df\) |
| Pure error (center) | \(SS_{\text{PE}}\) | \(n_C - 1\) |
| Total | \(n - 1\) |
\(F\) 검정: - 회귀: \(MS_{\text{reg}} / MS_{\text{PE}}\). - Lack-of-fit: \(MS_{\text{LOF}} / MS_{\text{PE}}\). 유의면 2 차 모형 부적합.
4.1 Lack-of-Fit 의 진단
LOF 가 유의: 2 차 모형이 데이터를 충분히 설명 못 함. 가능한 원인: 1. 3 차 이상의 곡률: cubic terms 추가. 2. 상호작용의 누락: 더 복잡한 interaction. 3. 변수 누락: 다른 영향 변수. 4. 잡음 비등분산: 변수 일부 영역에서 분산 ↑.
해결: 변수 변환 (log, square root), 모형 확장, 더 많은 design 점.
5 응답 분산 등고선 — Variance Contour
CCD 가 rotatable 이면 \(\text{Var}(\hat Y)\) 의 등고선이 design 중심을 둘러싼 동심원. 중심에서 멀수록 분산 ↑.
이 등고선은: - Center 의 정밀도 검토: 중심점에서의 분산 (\(\text{Var} = \sigma^2 / n\)) 이 가장 작음. - Edge 의 정밀도: factorial corners (rotational radius \(\sqrt k\)) 와 axial \(\alpha\) 점의 분산 비교. - Extrapolation 의 위험: design 영역 외부의 분산이 매우 큼.
6 가설 사례 — 화학 공정 RSM
6.1 Step 1 — 작동 영역 진입 (G-MON7-3 의 단계 5)
Steepest ascent 후 새 영역 (\(x_1 = 75°C\) 부근, \(x_2 = 50.5 \text{ min}\) 부근).
6.2 Step 2 — CCD 적용
\(k = 2\), rotatable \(\alpha = \sqrt 2\). 코딩 변수 (\(x_1' = (x_1 - 75)/5\), \(x_2' = (x_2 - 50.5)/5\)):
| Run | \(x_1'\) | \(x_2'\) | \(Y\) |
|---|---|---|---|
| 1 | -1 | -1 | 73 |
| 2 | +1 | -1 | 74 |
| 3 | -1 | +1 | 73.5 |
| 4 | +1 | +1 | 73 |
| 5 | \(-\sqrt 2\) | 0 | 72.5 |
| 6 | \(+\sqrt 2\) | 0 | 73 |
| 7 | 0 | \(-\sqrt 2\) | 72 |
| 8 | 0 | \(+\sqrt 2\) | 72.8 |
| 9 | 0 | 0 | 75.5 |
| 10 | 0 | 0 | 75.7 |
| 11 | 0 | 0 | 75.9 |
| 12 | 0 | 0 | 75.6 |
| 13 | 0 | 0 | 75.8 |
5 center 의 평균 ≈ 75.7. 모서리·axial 의 평균 < 75 → 정상점이 중심 근처.
6.3 Step 3 — 2 차 fit + ANOVA
fit: Y ~ β_0 + β_1 x_1' + β_2 x_2' + β_11 (x_1')^2 + β_22 (x_2')^2 + β_12 x_1' x_2'
가상 결과: - \(\hat\beta_0 = 75.7\) - \(\hat\beta_1 = 0.05, \hat\beta_2 = 0.03\) (1 차 작음 — 정상 근처) - \(\hat\beta_{11} = -1.2, \hat\beta_{22} = -1.5\) (2 차 음 — 최대) - \(\hat\beta_{12} = -0.1\) (상호작용 작음)
정상점: \(\mathbf{x}^* \approx (0.02, 0.01)\) (코딩) → \((75.1°C, 50.55 \text{ min})\).
응답: \(\hat\eta(\mathbf{x}^*) \approx 75.7\). 최적 조건!
6.4 Step 4 — Confirmatory Run
추정 최적점에서 새 실험 5~10 회. 평균이 예측 75.7 에 가까운지 확인.
만약 일치 → 최적점 확정. 다르면 모형 재검토.
7 Python 코드 — Full RSM Pipeline
import numpy as np
import pandas as pd
import statsmodels.api as sm
from itertools import product
from scipy import stats
np.random.seed(2026)
# k = 2 의 rotatable CCD
k = 2
alpha = np.sqrt(2)
n_center = 5
factorial = list(product([-1, 1], repeat=k))
axial = [(s * alpha if i == j else 0 for j in range(k)) for i in range(k) for s in [-1, 1]]
axial = [(s * alpha if i == j else 0 for j in range(k)) for i in range(k) for s in [-1, 1]]
# 정확한 axial 생성
axial_pts = []
for i in range(k):
for s in [-1, 1]:
pt = [0] * k
pt[i] = s * alpha
axial_pts.append(tuple(pt))
center = [(0,) * k] * n_center
all_pts = factorial + axial_pts + center
print(f"Total CCD points: {len(all_pts)}")
# 진짜 곡면: max at (0.05, 0.02), peak ≈ 75.7
def true_surface(x1, x2):
return 75.7 - 1.2 * (x1 - 0.05)**2 - 1.5 * (x2 - 0.02)**2 - 0.1 * x1 * x2
records = []
for x1, x2 in all_pts:
y = true_surface(x1, x2) + np.random.normal(0, 0.3)
records.append({"x1": x1, "x2": x2, "Y": y})
data = pd.DataFrame(records)
# 2차 모형 fit
data["x1_sq"] = data["x1"]**2
data["x2_sq"] = data["x2"]**2
data["x1_x2"] = data["x1"] * data["x2"]
X = sm.add_constant(data[["x1", "x2", "x1_sq", "x2_sq", "x1_x2"]])
model = sm.OLS(data["Y"], X).fit()
print("=== Second-order fit ===")
print(model.summary().tables[1])
# Lack-of-fit test
center_data = data[(data["x1"] == 0) & (data["x2"] == 0)]
ss_pure = ((center_data["Y"] - center_data["Y"].mean())**2).sum()
df_pure = len(center_data) - 1
# Lack-of-fit SS = SS_residual - SS_pure
ss_resid = model.ssr
df_resid = model.df_resid
ss_lof = ss_resid - ss_pure
df_lof = df_resid - df_pure
F_lof = (ss_lof / df_lof) / (ss_pure / df_pure)
p_lof = 1 - stats.f.cdf(F_lof, df_lof, df_pure)
print(f"\nLack-of-Fit: F = {F_lof:.3f}, p = {p_lof:.4f}")
if p_lof > 0.05:
print("=> 2nd-order model OK")
else:
print("=> 2nd-order inadequate")
# 정상점
b = np.array([model.params["x1"], model.params["x2"]])
B = np.array([
[model.params["x1_sq"], model.params["x1_x2"] / 2],
[model.params["x1_x2"] / 2, model.params["x2_sq"]]
])
x_star = -0.5 * np.linalg.inv(B) @ b
y_star = model.params["const"] + 0.5 * x_star @ b
print(f"\nStationary point: x* = {x_star}")
print(f"Predicted response: y* = {y_star:.3f}")
eigvals = np.linalg.eigvalsh(B)
print(f"Eigenvalues: {eigvals}")
if np.all(eigvals < 0):
print("=> Maximum")
elif np.all(eigvals > 0):
print("=> Minimum")
else:
print("=> Saddle point")
# 응답 contour 그리기
import matplotlib.pyplot as plt
x1_grid = np.linspace(-1.5, 1.5, 50)
x2_grid = np.linspace(-1.5, 1.5, 50)
X1, X2 = np.meshgrid(x1_grid, x2_grid)
Y_pred = (model.params["const"]
+ model.params["x1"] * X1 + model.params["x2"] * X2
+ model.params["x1_sq"] * X1**2 + model.params["x2_sq"] * X2**2
+ model.params["x1_x2"] * X1 * X2)
fig, ax = plt.subplots(figsize=(8, 6))
cs = ax.contourf(X1, X2, Y_pred, levels=15, cmap="RdYlGn")
ax.scatter(data["x1"], data["x2"], c="black", marker="o", s=50, label="Design")
ax.scatter(x_star[0], x_star[1], c="white", marker="*", s=200, label="Stationary")
ax.set_xlabel("x1 (coded)")
ax.set_ylabel("x2 (coded)")
plt.colorbar(cs, label="Predicted Y")
ax.legend()
plt.tight_layout()
# plt.savefig("ccd_contour.png")8 Variance Contour 분석
pyDOE2 의 ccdesign 또는 R::rsm 로 자동:
# 응답 분산 plot (rotatable 검증)
def pred_variance(x, X_design, sigma=0.3):
"""예측 분산 = σ² · x_*' (X'X)^-1 x_*"""
x_star = np.array([1, x[0], x[1], x[0]**2, x[1]**2, x[0]*x[1]])
XtX_inv = np.linalg.inv(X.values.T @ X.values)
return sigma**2 * x_star @ XtX_inv @ x_star
# 등고선
var_grid = np.array([
[pred_variance([x1, x2], X.values) for x1 in x1_grid]
for x2 in x2_grid
])
fig, ax = plt.subplots(figsize=(7, 6))
cs = ax.contour(X1, X2, var_grid, levels=10, cmap="viridis")
ax.clabel(cs, inline=True)
ax.set_title("Variance of predicted Y (Rotatable check)")
ax.set_xlabel("x1")
ax.set_ylabel("x2")
plt.tight_layout()Rotatable 이면 등고선이 동심원. 다른 모양이면 design 이 비대칭.
9 CCD 외의 RSM 설계
9.1 Box-Behnken Design
3 수준만 사용 (모서리 점 없음):
# k = 3 Box-Behnken
bb_pts = [
(-1, -1, 0), (-1, 1, 0), (1, -1, 0), (1, 1, 0),
(-1, 0, -1), (-1, 0, 1), (1, 0, -1), (1, 0, 1),
(0, -1, -1), (0, -1, 1), (0, 1, -1), (0, 1, 1),
] + [(0, 0, 0)] * 3장점: 변수 범위가 \([-1, 1]\), 모서리 안전 회피. 단점: factorial 부분 없어 sequential strategy (1 차 → 2 차) 어려움.
9.2 Doehlert Design
육각형 격자 기반. CCD 보다 적은 점.
9.3 Computer-Generated Optimal Design (D-optimal)
특정 영역 또는 비대칭 design space 에 맞는 최적 설계. R AlgDesign, Python dexpy 로 자동 생성.
10 다목적 최적화 (Multi-Response)
여러 응답 (\(Y_1, Y_2, \ldots\)) 을 동시에 최적화. 예: 수율 최대 + 부산물 최소 + 시간 최소.
해결: 1. Desirability function: 각 응답을 0~1 의 desirability 로 변환, 곱 또는 가중평균. 2. Pareto frontier: 한 응답을 희생하지 않으면 다른 응답이 더 좋아질 수 없는 점. 3. Goal programming: 응답마다 목표값과의 거리 최소화.
산업 실험에서 흔함. 자세한 절차는 Derringer-Suich (1980).
11 가정과 한계
- 2 차 다항식의 적합성: lack-of-fit 으로 검증.
- 변수의 양적 측도: 명목 변수는 RSM 부적합.
- 변수 영역 균등 정밀도 (rotatable): \(\alpha\) 선택.
- Curse of dimensionality: \(k = 6\) 이상 점 폭증 — fractional CCD 또는 Box-Behnken.
- Sequential vs One-shot: CCD 가 sequential 적합, Box-Behnken 은 one-shot 적합.
12 ML 응용
3 변수 (lr, dropout, batch_size) 의 CCD 로 val accuracy 최적화:
Factorial: 8 cells (lr ∈ {1e-4, 1e-3}, dropout ∈ {0.1, 0.5}, batch ∈ {32, 128})
Axial: 6 cells (한 변수가 ±√3 ≈ 1.732)
Center: 3 cells (lr=3e-4, dropout=0.3, batch=64)
Total: 17 runs
각 run 에 모델 훈련 → val accuracy 측정. 2 차 fit:
\(\hat\eta = \hat\beta_0 + \hat\beta_1 \log_{10}(\text{lr}) + \ldots + \hat\beta_{11} (\log_{10} \text{lr})^2 + \ldots\)
정상점 = 최적 hyperparameter. 17 runs 만으로 표준 grid search 의 정밀한 결과를 능가.
이는 Bayesian optimization 의 정수형 (1 단계). BO 는 acquisition function 으로 다음 점 선택을 반복하지만 CCD 는 정해진 점 셋팅. 단, 작은 차원에서는 CCD 가 충분히 정확.
13 MON Ch.7 시리즈 정리
G-MON7-0 Bio-assays · RSM 개관
G-MON7-1 Bio-assay 직접·간접
G-MON7-2 Parallel Line · Slope Ratio
G-MON7-3 RSM 1 차·2 차 모형 + Steepest Ascent
G-MON7-4 Rotatable · CCD · ANOVA ← 현재 글 (마지막)
↓
G-MON8 (ANCOVA · Transformation), G-MON9 (Weighing)
14 관련 주제
선행 지식
후속 주제
- G-MON8 — ANCOVA · Transformation (작성 예정)
- G-MON9 — Weighing Designs (작성 예정)
다른 카테고리 연결
- Statistics — SLR 예측 — 회귀 예측 분산
- AB Test — Sequential Testing — 순차 탐색의 IT lens
15 더 읽을 거리
- Box, G. E. P., Hunter, J. S. (1957). “Multi-factor experimental designs for exploring response surfaces.” Annals of Mathematical Statistics 28: 195-241 — CCD 원조.
- Box, G. E. P., Behnken, D. W. (1960). “Some new three-level designs for the study of quantitative variables.” Technometrics 2(4): 455-475 — Box-Behnken.
- Myers, R. H., Montgomery, D. C., Anderson-Cook, C. M. (2016). “Response Surface Methodology” (4th ed). Wiley — 표준 textbook.
- Derringer, G., Suich, R. (1980). “Simultaneous optimization of several response variables.” Journal of Quality Technology 12(4): 214-219 — multi-response optimization.
- Frazier, P. I. (2018). “A Tutorial on Bayesian Optimization.” arXiv:1807.02811 — RSM 의 ML 후속.