회전 가능 설계와 중심합성 설계 — RSM 의 표준 도구

Montgomery Ch.7.7.5-7.7.8 Rotatable · ANOVA · Uses · Construction · CCD

Response Surface 의 2 차 모형 적합을 위한 표준 설계 — Rotatable Design, Central Composite Design (CCD), Box-Behnken Design — 의 정의·구성·분석 절차를 정리한다. Rotatability 의 의미, \(\alpha\) 의 선택 기준 (rotatable, orthogonal, face-centered), Box-Behnken 의 3 수준 대안, ANOVA 표 작성, 응답 분산의 등고선 (variance contour) 분석을 포함한다.

Experimentation
DOE
저자

Kwangmin Kim

공개

2026년 05월 08일

1 Rotatable Design

정의: Rotatable Design

응답 예측의 분산 \(\text{Var}(\hat Y(\mathbf{x}))\) 가 design 중심에서의 거리 만에 의존하고 방향에 무관 한 design.

\[ \text{Var}(\hat Y(\mathbf{x})) = f(\|\mathbf{x}\|) \]

→ 같은 거리의 모든 점이 같은 정밀도. 어느 방향으로 응답이 증가할지 모를 때 가장 robust.

1.1 왜 Rotatable 인가

직관: 모든 방향이 평등한 design

당신이 어느 방향으로 진행할지 사전 정보가 없다면, 한 방향으로 정밀하고 다른 방향으로 부정확한 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

직관: 분산 등고선 plot

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 분석

pyDOE2ccdesign 또는 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 응용

매핑: ML hyperparameter 의 CCD

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 (작성 예정)

다른 카테고리 연결

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 후속.

Subscribe

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