본문으로 건너뛰기

공정 분석: SPC, MVDA, 소프트 센서

📍 현재 위치: 7부 · "통찰과 평결." 우리가 쌓아 올린 모든 계층 — 포착, 히스토리언(historian), 배치 맥락, 시맨틱, 신뢰 — 은 이 장이 마침내 결실을 맺게 하기 위해 존재합니다. 깨끗하고 맥락화된 데이터가, 드리프트(drift)를 잡아내는 차트, 배치의 지문을 찍어내는 모델, 그리고 품질 속성(quality attribute)을 실시간으로 예측하는 소프트 센서(soft-sensor)로 변환됩니다.

쉽게 말하면

히스토리언을 완벽하게 라벨이 붙은 식재료로 가득 찬 주방이라고 생각해 보세요. 지금까지 우리는 식료품 저장실을 채워 왔습니다 — 센서를 배선하고, 스트림에 태그를 붙이고, 배치와 단위가 함께 붙은 채로 저장했습니다. 분석(analytics)은 요리입니다. 관리도(control chart) 는 "이 요리는 항상 64에서 74 사이로 나온다 — 그렇지 않으면 멈추고 들여다봐라"라고 말하는 레시피 카드입니다. 소프트 센서 는 소스를 맛보고 실험실에 보내지 않고도 소금 농도를 알려주는 노련한 요리사입니다. 둘 다 식재료가 깨끗하고 라벨이 붙어 있어야만 작동합니다. 쓰레기가 들어가면 쓰레기가 나옵니다 — 하지만 우리는 그것이 쓰레기가 아니도록 스물다섯 개의 장을 들였습니다.

이 장에서 다루는 내용

데이터 스택이 제값을 하는 순간입니다. 시뮬레이터가 만들어 낸 결정론적(deterministic) 데이터셋(SIM_SEED=2026)을 가져와, 공정 엔지니어와 품질 부서(배치가 출하될 수 있는지를 결정하는 독립된 QA/QC 조직)가 실제로 사용하는 종류의, 진짜로 테스트된 분석을 그 위에서 돌립니다.

  • 통계적 공정 관리(statistical process control, SPC): 캠페인 전반에 걸친 출하 속성에 대한 I-MR 관리도와 공정 능력(Cpk) 수치, 그리고 온라인 태그(tag)에 대한 골든 배치 엔벨로프(golden-batch envelope).
  • 다변량 데이터 분석(multivariate data analysis, MVDA): 단일 배치가 왜 그 모든 변수를 한꺼번에 보았을 때 더 잘 묘사되는지, 그리고 PCA/PLS가 어떻게 궤적의 지문을 찍는지.
  • 역가 소프트 센서: 인라인(in-line) 라만(Raman) 스펙트럼으로부터 항체 역가(titer)를 예측하는 부분 최소 제곱(Partial Least Squares, PLS) 모델 — scikit-learn으로 학습·검증하고, 어디서 깨지는지에 대해 정직합니다.
  • 모델 거버넌스(model governance): GMP 결정에 기계 학습 모델을 사용하기 위한 실제 기준, 그리고 왜 MLflow가 시작일 뿐 끝이 아닌지.

이 장의 심장에 있는 두 스크립트 — examples/analytics/spc.pyexamples/analytics/soft_sensor.py — 는 커밋된 데이터셋 위에서 돌아가는 순수한 NumPy/Pandas/scikit-learn이므로, 어떤 서비스도 전혀 없이 단독으로 실행됩니다: make venv 후에 make soft-sensor(또는 sim/.venv/bin/python analytics/soft_sensor.py — scikit-learn 의존성이 그 venv, 즉 make venv가 설정하는 프로젝트별 격리된 Python 설치 집합인 가상 환경(virtual environment) 에 있으므로)와 sim/.venv/bin/python analytics/spc.py를 실행하면 됩니다. CI(지속적 통합, continuous integration — 모든 변경마다 돌아가는 자동 테스트 실행)는 소프트 센서의 R²가 0.85를 넘게 유지되는지, 그리고 SPC 차트가 정상적이고 능력 있는 관리도로 유지되는지(lcl < center < ucl, Cpk > 1.0)를 단언(assert)합니다. 서비스로 제공되는 경로 — 소프트 센서가 API 뒤에서 돌아가며 거버넌스를 위해 모든 실행을 오픈 소스 실험 추적·모델 레지스트리 도구인 MLflow 에 로깅하는 — 는 프로덕션 목표로서 스케치되어 있습니다(히스토리언 곁에서 각 실행을 로깅하는 MLflow 추적 서버). 여기 있는 단독 스크립트는 그 서빙 배관을 걷어낸 동일한 모델입니다. (커밋된 analytics Compose 프로필은 메트릭 저장소인 VictoriaMetrics 하나만 제공합니다 — MLflow 서빙 경로는 서술되어 있을 뿐, 예제 리포에는 아직 배선되어 있지 않습니다.)

SPC: 드리프트를 잡아내는 차트

통계적 공정 관리는 이 책에서 가장 오래된 아이디어이면서 여전히 가장 유용한 것입니다. 전제는 이렇습니다. 안정된 공정에는 우연 원인(common-cause) 변동 — 평균 주위의 무작위 흔들림 — 이 있으며, 데이터 그 자체로부터 우연 원인 변동이 머물러야 하는 띠(band)를 계산할 수 있습니다. 그 띠 바깥에 있는 것은 무엇이든 조사할 가치가 있는 이상 원인(special cause) 입니다. 여러분은 규격(specification)에서 한계를 정하는 것이 아니라, 공정 스스로가 "정상"이 어떻게 생겼는지를 말하게 한 다음 "비정상"을 지켜보는 것입니다.

배치당 한 번 측정되는 출하 속성에 대해서는 I-MR(개별값 / 이동 범위, individuals / moving-range) 관리도가 알맞은 도구입니다. 배치당 숫자가 하나뿐이므로, 산포를 부분군 내 표준편차가 아니라 이동 범위 — 연속된 배치 사이의 절대 차 — 로부터 추정합니다(여기서 "부분군(subgroup)"이란 라인에서 뽑은 다섯 개 부품처럼 함께 채취한 여러 측정값의 작은 묶음을 뜻하는데, 여기서는 각 배치가 숫자 하나만 내므로 그 안에서 산포를 잴 부분군이 없습니다). 관리도 상수 d2 = 1.128이 쌍(pair)의 평균 이동 범위를 시그마(sigma) 추정치로 변환합니다(시그마란 표준편차 — 값들이 평균 주위로 얼마나 흩어지는지를 재는 척도 — 입니다). 이 상수는 고정된, 표로 정해진 값입니다: 쌍의 이동 범위(n=2)에 대해, 정규 공정의 평균 범위는 그 표준편차의 약 1.128배가 되므로, 평균 이동 범위를 1.128로 나누면 시그마 추정치가 역산됩니다.

다음은 examples/analytics/spc.py의 핵심입니다. 일부러 손으로 작성했습니다. 우리가 기꺼이 고정(pin)할 만한, 유지보수되고 허용적 라이선스를 가진 순수 Python SPC 라이브러리가 없었기에, 이 장은 산술을 있는 그대로 보여줍니다 — 오픈 소스 통계 생태계가 공정 작업을 위해 오래도록 문서화해 온 고전적인 관리도와 능력 통계입니다.

# examples/analytics/spc.py
D2 = 1.128 # control-chart constant for moving range of n=2

def imr_limits(values: np.ndarray) -> dict:
"""Individuals (I) and moving-range (MR) control limits."""
v = np.asarray(values, dtype=float)
mr = np.abs(np.diff(v))
mr_bar = mr.mean()
sigma = mr_bar / D2
center = v.mean()
return {
"center": round(float(center), 4),
"ucl": round(float(center + 3 * sigma), 4),
"lcl": round(float(center - 3 * sigma), 4),
"sigma": round(float(sigma), 5),
"mr_bar": round(float(mr_bar), 5),
}

능력(capability)은 이야기의 후반부입니다. 공정은 완벽하게 관리 상태(in control)(안정적이고 예측 가능)이면서도 여전히 능력이 없을(incapable)(자연적 산포가 규격 안에 들어가지 못함) 수 있습니다. Cpk 는 공정 평균에서 더 가까운 규격 한계까지의 거리를 3-시그마 단위(3-시그마는 공정의 자연적 ±3-시그마 산포의 절반)로 측정합니다. 그래서 Cpk = 1.0은 그 더 가까운 한계가 정확히 3-시그마 떨어져 있음을 — 산포가 겨우 들어맞음을 — 뜻하고, Cpk ≥ 1.33(더 가까운 한계가 넉넉히 4-시그마 밖)이 관행적인 "넉넉히 능력 있음" 기준으로, 규격을 벗어난 제품을 만들지 않으면서 공정이 흔들릴 여유를 남깁니다.

# examples/analytics/spc.py
def cpk(values: np.ndarray, lsl: float, usl: float) -> float:
v = np.asarray(values, dtype=float)
mu, sd = v.mean(), v.std(ddof=1)
if sd == 0:
return float("inf")
return round(float(min((usl - mu) / (3 * sd), (mu - lsl) / (3 * sd))), 3)

우리는 이것을 시뮬레이션된 분석 증명서(Certificate-of-Analysis, CofA) 표인 datasets/hplc_results.csv — 각 출하 시험과 그 결과, 그리고 충족해야 하는 규격을 나열하는 배치당 공식 품질 기록으로, 배치당·검정(assay)당 출하 행 하나 — 에 대해 실행합니다. release_spc 함수는 여섯 개 캠페인 배치 전반의 양이온 교환 주피크 전하-변이체 %(CEX_main_pct)를 뽑아냅니다. 항체는 완벽하게 균일한 단일 분자가 아닙니다. 작은 화학적 차이(여기 탈아미드화 하나, 저기 잘려 나간 C-말단 라이신 하나)가 집단의 일부를 약간 다른 전하로 옮기므로, 제품은 실제로 전하 변이체(charge variant) 의 혼합물입니다 — 의도된 주(main) 형태에 더 산성과 더 염기성인 형제들이 더해진 것입니다. 양이온 교환 크로마토그래피(cation-exchange chromatography, CEX)는 그 혼합물을 전하로 분리하므로, CEX_main_pct = 70%는 항체의 70%가 주 전하 형태임을 뜻합니다. 이는 지배적인 전하 변이체이지 순도 측정값이 아닙니다. 순도와 응집체는 다른 검정 — 크기 배제 크로마토그래피(size-exclusion chromatography, SEC, SEC_monomer_pct) — 와 불순물 검정이 보고합니다.

batch_id,test,value,unit,spec_low,spec_high,result
BATCH-2026-001,CEX_main_pct,70.686,%,60.0,80.0,PASS
BATCH-2026-002,CEX_main_pct,69.085,%,60.0,80.0,PASS
BATCH-2026-003,CEX_main_pct,70.404,%,60.0,80.0,PASS
BATCH-2026-004,CEX_main_pct,67.879,%,60.0,80.0,PASS
BATCH-2026-005,CEX_main_pct,66.699,%,60.0,80.0,PASS
BATCH-2026-006,CEX_main_pct,69.171,%,60.0,80.0,PASS

python analytics/spc.py를 실행하면 정확히 이것이 출력됩니다.

I-MR control chart for CEX_main_pct (n=6): {'center': 68.9873, 'ucl': 73.8262, 'lcl': 64.1485, 'sigma': 1.61294, 'mr_bar': 1.8194}
spec [60.0, 80.0] Cpk=1.984

품질 엔지니어가 읽듯이 읽어 보세요. 공정은 주피크 68.99% 에 중심을 두며, 관리 한계는 64.1%와 73.8% 입니다 — 그 한계는 규격이 아니라 배치 대 배치 변동 에서 나온 것입니다. 규격은 더 넓으므로(60–80%), 공정은 그 안에 넉넉히 들어맞습니다: Cpk = 1.98 로, 1.33 기준을 한참 웃돕니다. 이것이 바로 FDA의 공정 검증(process-validation) 생애주기가 3단계에서 기대하는 지속적 공정 검증(Continued Process Verification, CPV) 활동입니다(생애주기는 1단계 공정 설계, 2단계 공정 적격성 평가, 그다음 3단계 일상 상업 생산의 지속적 검증으로 진행됩니다) — 공정이 관리 상태를 유지함을 보이기 위해 일상 생산 데이터를 지속적으로 통계 추세화하는 것입니다 [1]. 이 차트를 히스토리언에서 바로 띄우는 것이, 여섯 자리 숫자짜리 통계 스위트 없이 CPV를 하는 오픈 소스 방식입니다.

I-MR / Cpk SPC 레코드 해부

저 출력 한 줄은 아직 차트가 아닙니다 — 그것은 하나의 작은 레코드이며, 품질 엔지니어는 평결을 신뢰하기 전에 필드 하나하나를 읽습니다. release_spc("CEX_main_pct")가 반환하는 dict가 이 속성에 대한 SPC 레코드이고, 모든 필드에는 역할이 있습니다. 검토자가 하듯 분해해 봅시다.

여섯 개 캠페인 배치 전반의 CEX 주피크에 대한 I-MR 관리도라는 제목의 라벨 신분증 카드. release_spc 출력을 해부한다: center 68.9873, mr_bar 1.8194, d2 상수 1.128, sigma 1.61294, Cpk 1.984 행에 이어, 인디고색 규격 띠 60에서 80퍼센트와 시안색 데이터 유래 관리 한계 lcl 64.1485 및 ucl 73.8262를 대비시키는 적층된 핵심 한 쌍, 그리고 다섯 개의 넬슨 이상 원인 런 규칙을 나열한 시안색 패널.

release_spc의 출력 구조체를 신분증 카드로: 한계를 만들어 내는 산포 사슬(mr_bard2sigma), 능력 수치 Cpk, 그리고 — 가장 중요한 필드 한 쌍 — 제품 규격과 대비된 데이터 유래 관리 한계.

저자가 AI의 도움을 받아 직접 제작한 그림입니다.

  • center = 68.9873 — 여섯 개 배치 값에 대한 v.mean(). 다른 모든 필드가 그것을 기준으로 측정되는 선.
  • mr_bar = 1.8194 — 연속 쌍 이동 범위 다섯 개의 평균. 배치당 숫자가 하나뿐이라 쓸 부분군 내 산포가 없으므로 이동 범위 가 그 자리를 대신합니다.
  • d2 = 1.128 — 쌍(n=2)에 대한 관리도 편향 상수. 파일 안에서 유일하게 하드코딩된 숫자(D2 = 1.128)이며, 평균 이동 범위를 시그마로 변환합니다: sigma = mr_bar / d2.
  • sigma = 1.612941.8194 / 1.128. 이는 여섯 값의 보통 표준편차가 아니라 이동 범위 추정치입니다 — 의도적으로 그렇습니다. I-MR 차트가 쓰는 것이 바로 그것이기 때문입니다.
  • ucl / lcl = 73.8262 / 64.1485center ± 3·sigma. 이것이 관리 한계이며, 오직 위의 사슬 덕분에 존재합니다.
  • Cpk = 1.984별개의 cpk() 함수가 계산하며, 이동 범위 시그마가 아니라 보통의 표본 표준편차(std(ddof=1)ddof=1은 NumPy에게 n 대신 n−1로 나누는 표본 표준편차를 요청하는 것으로, 유한한 표본에서 산포를 추정할 때의 표준적 보정입니다)와 규격을 씁니다. 레코드의 두 절반은 두 가지 다른 질문에 답하며, 서로 다른 산포 추정치를 써도 됩니다.

관리 한계는 규격이 아니다

SPC 전체에서 가장 잘못 읽히는 필드 한 쌍이 그 레코드 안에 있으며, 그림은 일부러 그것을 적층된 두 띠로 그립니다. 규격(specification) [60.0, 80.0] 은 제품이 해야 하는 것입니다 — CofA 합격 기준으로 고정되어 있고, hplc_results.csvspec_low/spec_high에 있으며, 모든 배치가 61%로 나와도 동일했을 것입니다. 관리 한계(control limits) [64.1485, 73.8262] 는 공정이 실제로 하는 것입니다 — 배치 대 배치 변동에서 계산되며, 규격과 무관하게 공정이 바뀌면 좁아지거나 넓어집니다. 둘을 혼동하는 것이, 플랜트가 유령 문제를 쫓거나(넓은 규격을 경보 띠로 취급) 실제 드리프트를 놓치는(“규격 내”가 “관리 내”를 뜻한다고 가정) 방식입니다. 그것들은 서로 다른 질문에 답하는 서로 다른 띠이며, 공정은 하나의 안에 있으면서 다른 하나를 벗어날 수 있습니다.

그 구분은 또한 실제 관리도가 단 하나의 띠 이탈 검정보다 더 많은 것을 적용하는 이유이기도 합니다. 64.1573.83 밖의 단일 지점은 명백한 이상 원인이지만, 공정은 모든 지점이 여전히 한계 안에 있으면서도 위험하게 드리프트할 수 있습니다 — 중심선 한쪽에 바짝 붙은 아홉 지점, 또는 꾸준히 상승하는 여섯 지점처럼요. 그런 패턴은 고전적인 Western Electric / 넬슨(Nelson) 런 규칙(run rules) 이 잡아내며, 그림의 측면 패널에 나열되어 있습니다 — 여덟 개 넬슨 규칙 가운데 대표적인 다섯 개입니다(가장 흔한 다섯 개로, 더 드문 규칙 4, 7, 8은 건너뜁니다): 3-시그마 밖 한 지점(규칙 1), 중심 한쪽의 아홉 지점(규칙 2), 꾸준한 추세의 여섯 지점(규칙 3), 그리고 2-시그마 밖 3개 중 2개·1-시그마 밖 5개 중 4개의 구역 검정(규칙 5–6)입니다. (관리도는 중심선 양쪽으로 1-, 2-, 3-시그마 "구역(zone)"으로 머릿속에서 나뉘며, 구역 검정은 최근 지점 가운데 몇 개가 바깥쪽 구역에 떨어지는지를 셉니다.) 우리의 여섯 캠페인 배치는 모든 규칙을 통과하므로, “관리 상태”라는 평결은 가정된 것이 아니라 얻어진 것입니다. spc.py는 한계와 Cpk만 제공합니다. 런 규칙 계층은 명백한 다음 함수이며, 그것이 터진 배치를 잡는 차트와 드리프트하는 공정을 잡는 차트의 차이입니다.

골든 배치: 시간에 대한 관리도

배치당 숫자 하나는 출하 관점입니다. 공정 관점은 궤적 — 열나흘에 걸쳐 변화하는 반응기 온도 같은 태그 — 입니다. 골든 배치 엔벨로프 는 SPC 차트를 옆으로 돌려 놓은 것입니다. 배치 전체에 한 개의 한계를 두는 대신, 배치 시간의 각 지점에서 평균 ± 3-시그마 띠를 계산하므로, 라이브 배치를 겹쳐 놓고 그것이 무리에서 벗어나는 순간을 볼 수 있습니다.

같은 파일 안의 golden_envelope는 하나의 온라인 태그를 시간 단위 주기로 리샘플링(resample)하고 띠를 만듭니다.

# examples/analytics/spc.py
def golden_envelope(tag: str = "BR101.Temp.PV", freq: str = "1h") -> pd.DataFrame:
"""Mean +/- 3 sigma envelope over batch time for one online tag (golden batch)."""
ts = pd.read_parquet(DATA / "fedbatch_timeseries.parquet")
s = ts[ts.tag == tag].set_index("ts")["value"].resample(freq).agg(["mean", "std"]).dropna()
s["upper"] = s["mean"] + 3 * s["std"].fillna(0)
s["lower"] = s["mean"] - 3 * s["std"].fillna(0)
return s.reset_index()

같은 실행이 보고합니다.

golden-batch Temp envelope: 336 hourly points, mean range 36.49-37.01 degC

336개의 시간 단위 지점(열나흘)에서 온도 평균이 36.49와 37.01 °C 사이로 추적됩니다 — PID 제어 바이오리액터(bioreactor)가 유지해야 할 바로 그 빠듯한 띠이며(PID — 비례-적분-미분, proportional-integral-derivative — 은 측정값을 설정값에 붙들어 두기 위해 가열과 냉각을 미세하게 조정하는 표준 피드백 제어기입니다), 시뮬레이터가 일부러 심어 둔 7일 차 0.5 °C 냉각 이탈(excursion — 설정값으로부터의 짧은 의도치 않은 벗어남)이 — 그래서 이 장이 탐지할 알려진 편차를 갖도록 — 평균을 띠의 아래 가장자리(36.49 °C)로 끌어내리는 딥(dip)으로 나타납니다. 그 딥은 계획되지 않은 설정값 이탈이며 — 일부 CHO 공정이 일정대로 수행하는 의도된 생산 단계 온도 다운시프트(흔히 ~31–33 °C로)와는 구별됩니다. 후자는 양호한 배치로 만든 엔벨로프가 이미 포함하고 있어 경보를 울려서는 안 되는 것입니다. 띠 자체에 대한 정직한 단서 하나: 여기 데모는 단일한 시드 배치(BATCH-2026-001) 하나이므로, 그 산포는 한 궤적의 창 내(within-window) 변동이며 방법을 예시하는 것입니다. 진짜 생산 엔벨로프는 같은 평균 ± 3-시그마 계산을 배치 시간의 각 지점에서 양호한 배치 라이브러리 전반에 걸쳐 수행합니다. Grafana에서 새 배치를 그 띠 위에 겹쳐 놓으면, 작업자는 경보가 울리기 몇 시간 전에 형성 중인 편차를 봅니다.

두 패널로 된 공정 분석 그림: 왼쪽은 여섯 개 캠페인 배치 전반의 CEX 주피크(전하 변이체)를 보여주는 I-MR 관리도로, 더 넓은 규격 띠 안에 중심선과 3-시그마 관리 한계가 들어 있다. 오른쪽은 라만 대 역가 PLS 소프트 센서의 산점도로, 예측값 대 측정 역가가 45도 선에 바짝 붙어 있으며 R-제곱 0.99로 주석이 달려 있다.

왼쪽: 출하 속성에 대한 I-MR 차트와 Cpk — 안정적이고, 능력 있으며, 규격 안에 한참 들어 있습니다. 오른쪽: 시뮬레이션된 라만 스펙트럼에서 역가를 복원해 내는 PLS 소프트 센서로, 예측값 대 측정값 지점이 항등선(identity line)에 바짝 붙어 있습니다. 같은 아이디어의 두 얼굴 — 깨끗하고 맥락화된 데이터가 공정이 제대로 거동하고 있는지를 말하게 하는 것입니다.

저자가 AI의 도움을 받아 직접 제작한 그림입니다.

MVDA: 하나의 배치는 숫자가 아니라 구름이다

SPC는 한 번에 한 변수를 지켜봅니다. 그러나 바이오리액터 배치는 함께 움직이는 수십 개의 변수 — 온도, pH, 용존 산소, 글루코스, 락테이트, 생존 세포 밀도, 역가 — 이며, 그것들 사이의 상관관계 가 진짜 신호를 담고 있습니다. 두 배치는 각자 모든 개별 태그가 자기 관리도 안에 있으면서도 여전히 미묘하게 다를 수 있습니다. 글루코스와 락테이트 사이의 관계 가 드리프트했기 때문입니다. 그것이 바로 다변량 데이터 분석(multivariate data analysis, MVDA) 이 보고 단변량 SPC가 놓치는 것입니다.

두 일꾼은 PCAPLS 입니다. 주성분 분석(Principal Component Analysis, PCA)은 상관된 많은 태그를 몇 개의 잠재 성분(latent component) — 각각 원래의 상관된 태그들을 가중 혼합한 새로운 합성 축으로, 훨씬 적은 수의 숫자로 변동의 대부분을 포착하는 — 으로 압축하므로, 배치 궤적 전체가 저차원 공간을 가로지르는 경로가 됩니다 — 그리고 비정상 배치는 말 그대로 정상 경로에서 벗어납니다. 이런 식으로 배치 공정을 모니터링하는 토대 방법이 다방향 PCA(multiway PCA) 입니다. 3차원(배치 × 변수 × 시간) 데이터를 행렬로 펼치고(unfold), 양호한 과거 배치들에 모델을 적합시킨 다음, 새 배치의 편차를 호텔링 T²(Hotelling's T²)와 제곱 예측 오차로 점수화합니다 [5]. 새 배치의 점수 도표가 신뢰 타원(confidence ellipse)을 벗어나면, 기여도 도표(contribution plot)어느 변수 가 그것을 밀어냈는지를 알려줍니다 — 작업자가 실제로 원하는 진단입니다.

부분 최소 제곱(Partial Least Squares, PLS) 은 PCA의 지도 학습 사촌입니다. 그저 분산을 설명하는 것이 아니라 결과(역가, 품질 속성)를 가장 잘 예측하는 잠재 성분을 찾습니다. PLS가 화학계량학(chemometrics)의 기본 도구인 이유는 바로 분광 데이터와 공정 데이터가 넓고, 공선적(collinear)이며, 잡음이 많기 때문입니다 — 보통의 회귀가 무너지고 PLS가 번성하는 바로 그 영역입니다 [4]. scikit-learn에서 이것들은 sklearn.decomposition.PCAsklearn.cross_decomposition.PLSRegression이며, 맥락화된 배치 표 위에서 각각 몇 줄이면 됩니다. 아래의 소프트 센서는 PLS 엔진의 가장 구체적인 형태이고, 배치 궤적의 지문을 찍는 바로 그 PLSRegression API가 스펙트럼으로부터 역가를 예측하는 것입니다.

점수 도표 읽기: 호텔링 T-제곱과 기여도 도표

적합된 PCA 모델의 출력은 예측이 아니라 지도 입니다. 각 배치(또는 배치 안의 각 시점)는 처음 몇 개 성분이 이루는 저차원 공간의 한 점이 됩니다 — 점수 도표(score plot) 입니다. 양호한 과거 배치는 하나의 구름으로 뭉치고, 그 구름 둘레에 그린 95% 신뢰 타원(confidence ellipse) 은 관리도 한계의 다변량 등가물입니다. 그것은 정상 배치의 95%를 감싸도록 크기가 정해지므로(그래서 정상 배치는 우연히 밖으로 떨어지는 일이 드뭅니다), 점수가 타원 안에 떨어지는 새 배치는 나머지와 닮았고, 밖에 떨어지는 배치에는 문제가 있습니다.

두 통계량이 그 그림을 모니터가 경보할 수 있는 숫자로 바꿉니다. 호텔링 T²(Hotelling's T²) 는 배치가 구름 중심에서 모델 평면 안에서 얼마나 멀리 있는지를 측정합니다 — 신뢰 타원이 부호화하는 다변량 거리이므로, 높은 T²는 “이 배치는 극단적이지만 알아볼 수 있는 가족 구성원이다”를 뜻합니다. 제곱 예측 오차(SPE, 또는 Q-통계량) 는 평면 밖의 거리를 측정합니다 — 모델이 전혀 설명할 수 없는 배치의 부분으로, 어떤 양호한 배치도 보인 적 없는 진정으로 새로운 거동(센서 결함, 새로운 오염물)을 표시합니다. T²는 “우리가 아는 무언가가 너무 많음”을 잡고, SPE는 “한 번도 본 적 없는 무언가”를 잡습니다.

둘 중 어느 통계량이라도 한계를 넘으면 곧바로 질문은 이며 — 답은 기여도 도표(contribution plot) 입니다. 그것은 단일한 범위 밖 점수를 원래 변수들로 분해하여, 어느 변수가 배치를 밀어냈는지 순위 매깁니다. 락테이트 기여도의 급등과 글루코스의 하락은 어떤 단일 태그도 자기 관리도를 벗어나지 않았더라도 대사 관계가 드리프트했음을 말합니다. 이것이 작업자가 실제로 행동하는 진단이며, 단변량 SPC가 줄 수 없는 바로 그것입니다 — 정의상 단변량 SPC는 기여도 도표가 읽어 내는 변수 간 구조를 이미 버렸기 때문입니다.

다방향 PCA: 배치 × 변수 × 시간 펼치기

배치 데이터셋은 3차원입니다: 배치 × 변수 × 시간. PCA는 평평한 행렬을 기대하므로, 다방향 PCA(multiway PCA) [5] 의 토대 기법은 펼치기(unfold) 입니다. 각 배치가 하나의 긴 행이 되도록 큐브를 자르고, 모든 변수-각-시점을 열로 나란히 늘어놓습니다(시간 단위 7개 태그의 열나흘 배치는 약 2,350개 열의 한 행으로 펼쳐집니다 — 336개 시간 단위 지점 × 7개 태그). 그러면 절차는 기계적이며, 고정된 절차로 이름 붙일 가치가 있습니다.

  1. 양호한 과거 배치들을 배치 단위 행렬로 펼칩니다(완료된 배치당 한 행).
  2. 그 행렬에 PCA 모델을 적합시킵니다 — 이제 모델은 단지 정상 값이 아니라 “정상 궤적의 형태”를 부호화합니다.
  3. 새 배치를 모델에 대해 점수화하여 배치 시간의 각 지점에서 T²와 SPE를 얻으므로, 편차가 시간 분해됩니다.
  4. 어떤 이탈이든 기여도 도표로 진단하여 어느 변수가 어느 단계에서 그것을 일으켰는지 봅니다.

성과는 비정상 배치가 궤적으로서 잡힌다는 것입니다. 모든 개별 태그가 자기 I-MR 한계 안에 있으면서도 상관 구조 가 움직였기 때문에 정상 경로에서 벗어날 수 있습니다 — 단변량 SPC가 못 보는 바로 그 실패입니다. 상업용 배치 모니터링 스위트(SIMCA 등)는 제품화된 다방향 PCA입니다. 위의 펼치기-적합-점수화-진단 루프가 그것들이 감싸는 오픈 소스 핵심이며, 수십 줄의 NumPy에 sklearn.decomposition.PCA를 더한 것입니다.

역가 소프트 센서: 스펙트럼으로부터 품질을 예측하기

여기가 이 장의 중심입니다. 소프트 센서(soft-sensor)(또는 가상 센서, virtual sensor)는 측정하기 어려운 양을 측정하기 쉬운 양들로부터 추론하는 모델입니다. 역가 — 만들어 낸 리터당 항체 그램 수 — 는 보통 몇 시간이 걸리는 오프라인 검정이 필요합니다. 그러나 인라인 라만(Raman) 프로브는 몇 분마다 스펙트럼을 만들어 내고(라만 분광법은 배양액에 레이저를 비추어 분자 진동이 일으키는 산란광의 미세한 시프트를 읽습니다 — 화학 결합의 종류마다 특유의 양만큼 시프트시킵니다), 그 스펙트럼은 제품을 포함해 배양액 속 모든 분자의 희미한 지문을 담고 있습니다. 모델이 그 지문을 학습할 수 있다면, 역가를 실시간으로 얻습니다 — 최종 제품 시험을 기다리는 대신 공정 중 측정 위에 품질 보증을 세우는, 공정 분석 기술(Process Analytical Technology, PAT) 의 본질입니다 [2]. 이 틀에 들어맞는 인라인 프로브는 라만만이 아닙니다. 근적외선(near-infrared, NIR) 은 또 하나의 흔한 진동 분광(vibrational-spectroscopy) PAT 측정이며, 똑같은 화학계량학적 처리 — 넓고 공선적인 스펙트럼을 농도로 사상(map)하는 PLS 검정선 — 를 받습니다. 따라서 아래의 소프트 센서 패턴은 기법에 구애받지 않습니다. 라만 행렬을 NIR 행렬로 바꿔도 scikit-learn 파이프라인은 그대로입니다.

데이터셋은 datasets/raman_spectra.parquet입니다. 시간 단위 시점당 한 행, 701개의 강도 열(wn_400wn_1800, 파수(wavenumber) 당 하나 — 파수란 cm⁻¹ 단위로 측정되는 라만 시프트 축 상의 위치로, 각 열이 어느 분자 진동을 읽는지를 라벨링하며, 400에서 1800까지 2단위 간격으로 진행됩니다)에 더해, 시뮬레이터가 동일한 동역학 상태로부터 함께 가져온 참조 라벨이 있어, 스펙트럼이 농도에 대해 진정으로 유용한 정보를 담고 있습니다. 미리 짚어 둘 범위 단서 하나는, 아래의 모든 것에 영향을 미치므로 중요합니다: 이 데모 라만 데이터셋은 단일 배치(BATCH-2026-001)입니다 — 한 궤적의 시간 단위 스펙트럼 336개로, SPC 절이 추세화한 여섯 배치짜리 출하 표(BATCH-2026-001006)와 다릅니다. 이 단일 배치 한계와, 그것이 수상쩍게 높은 R²에 대해 갖는 의미는 아래의 "소프트 센서가 깨지는 곳"에서 다시 다룹니다. 참조 열은 시뮬레이터가 각 스펙트럼과 함께 기록한 오프라인 측정값입니다: g/L 단위의 글루코스와 락테이트, mM(밀리몰, millimolar — 농도 단위) 단위의 글루타민, mL당 백만 개 세포 단위의 생존 세포 밀도 VCD_e6_per_mL, 그리고 소프트 센서가 예측하도록 학습하는 g/L 단위의 항체 농도 titer_g_L입니다.

ts batch_id glucose_g_L lactate_g_L glutamine_mM VCD_e6_per_mL titer_g_L
2026-01-05 00:00:00+00:00 BATCH-2026-001 6.000 0.200 4.000 0.300 0.000
2026-01-05 01:00:00+00:00 BATCH-2026-001 5.998 0.201 3.999 0.306 0.000
2026-01-05 02:00:00+00:00 BATCH-2026-001 5.995 0.202 3.998 0.312 0.001

모델은 examples/analytics/soft_sensor.py에 있습니다. 로딩은 사소합니다 — wn_로 시작하는 모든 열이 특징(feature)이고, titer_g_L이 타깃입니다.

# examples/analytics/soft_sensor.py
def load_xy():
df = pd.read_parquet(DATA / "raman_spectra.parquet")
wn = [c for c in df.columns if c.startswith("wn_")]
X = df[wn].to_numpy()
y = df[TARGET].to_numpy()
return X, y, wn

학습은 교과서적인 화학계량학 파이프라인입니다. 한 조각을 떼어 두고(hold out), 스펙트럼을 표준화(standardize)하며 — 모든 파수(wavenumber) 열을 같은 평균 0, 단위 산포의 기반으로 재조정하여, 자연히 값이 큰 열이 단지 원시 숫자가 더 크다는 이유만으로 적합을 지배하지 않게 합니다 — 소수의 잠재 성분으로 PLS 회귀를 적합시킨 다음, 떼어 둔 집합에서 점수를 매깁니다. 우리는 바로 이런 종류의 작업을 위한 정석적인(canonical) 오픈 소스 기계 학습 라이브러리인 scikit-learn을 씁니다 [9].

# examples/analytics/soft_sensor.py
def train(n_components: int = 6, test_size: float = 0.3, seed: int = 2026):
X, y, wn = load_xy()
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=test_size, random_state=seed)
scaler = StandardScaler().fit(Xtr)
pls = PLSRegression(n_components=n_components)
pls.fit(scaler.transform(Xtr), ytr)
pred = pls.predict(scaler.transform(Xte)).ravel()
r2 = r2_score(yte, pred)
rmse = float(np.sqrt(mean_squared_error(yte, pred)))
return {"n_components": n_components, "n_wavenumbers": len(wn),
"n_train": len(ytr), "n_test": len(yte),
"r2": round(float(r2), 4), "rmse_g_L": round(rmse, 4)}

python analytics/soft_sensor.py(또는 make soft-sensor)는 다음을 출력합니다.

PLS soft-sensor (titer from Raman): R2=0.9923 RMSE=0.1498 g/L (6 comps, 701 wavenumbers, 235 train / 101 test)
ASSERT ok: R2 > 0.85 — the Raman dataset is genuinely predictive of titer.

701개의 파수에서 증류해 낸 여섯 개의 잠재 성분이, 모델이 한 번도 보지 못한 데이터에서 R² = 0.99와 0.15 g/L의 RMSE 로 역가를 복원합니다. 두 개의 표준 점수가 회귀를 요약합니다: (모델이 설명하는 역가 변동의 비율로, 1.0이 완벽한 적합)와 RMSE(평균 제곱근 오차, root-mean-square error — 예측이 빗나가는 전형적인 크기로, 타깃과 같은 g/L 단위)입니다. 그래서 R² = 0.99는 모델이 역가 신호의 거의 전부를 포착함을 뜻하고, RMSE = 0.15 g/L는 전형적인 예측이 약 0.15 g/L만큼 빗나감을 뜻합니다. 스크립트는 강한 단언 — assert m["r2"] > 0.85 — 으로 끝나므로, 이 책의 주장이 소리 없이 썩어 갈 수 없습니다. 미래에 시뮬레이터가 바뀌어 신호가 깨진다면 CI가 요란하게 실패할 것입니다. 이는 발표된 현실을 그대로 비춥니다. 데이터 주도 모델이 디지털 트윈(digital-twin) 용도를 향해 CHO 유가식(fed-batch) 배양에서 mAb 역가와 대사물(metabolite)을 예측하고 [7], 라만 + PLS 글루코스 피드백 제어가 실제로 CHO 바이오리액터에서 제품 산출을 약 4분의 1만큼 끌어올린다는 것이 입증되었습니다 — Gibbons 2023에서 그 ~25% 이득은 두 세포주 중 하나에서, 더 세게 공급해서가 아니라 글루코스를 더 안정적으로 유지해 생존성을 연장함으로써 달성된 것이므로, 정확한 수치는 세포주에 따라 다릅니다 [8].

소프트 센서 모델 레코드 해부

저 출력 한 줄 — R2=0.9923 RMSE=0.1498 g/L (6 comps, 701 wavenumbers, 235 train / 101 test) — 은 모델의 모든 이야기를 한 문자열로 압축한 것이며, 바로 그것이 문제입니다. print()는 관리되는 아티팩트가 아닙니다. 그것이 담은 필드들(과 스크립트가 아직 출력하지 않지만 레지스트리는 담아야 하는 몇 개)이야말로 pls.predict() 호출을 감사에서 방어할 수 있는 관리되는 분석 절차 로 바꾸는 것입니다. 하나의 신분증 카드로 해부해 봅시다.

registered model titer_pls v3, scikit-learn PLSRegression라는 제목의 라벨 신분증 카드. 소프트 센서 레코드를 필드 하나하나 해부한다: target titer_g_L, inputs wn_400에서 wn_1800, n_components 6, n_wavenumbers 701, 데이터셋 매니페스트의 sha256 해시로 묶인 학습 데이터셋 raman_spectra.parquet, 시드 2026의 분할 235 학습 및 101 테스트, 적합된 StandardScaler 첫 열 평균과 스케일, R2 0.9923과 RMSE 0.1498 g/L를 보고하는 녹색 검증 블록, 그리고 운영 범위 역가 0에서 5.72 g/L, 의도된 용도 범위, MLflow의 run에서 model에서 registry로 이어지는 계보를 담은 보라색 패널.

콘솔 한 줄이 아니라 관리되는 레코드로서의 소프트 센서: 입력과 하이퍼파라미터, MANIFEST.sha256 해시로 고정된 데이터셋, 적합된 스케일러, 검증 메트릭(녹색), 그리고 — 감사가 실제로 묻는 것 — 운영 범위, 의도된 용도 범위, MLflow 계보(보라색).

저자가 AI의 도움을 받아 직접 제작한 그림입니다.

  • target = titer_g_L, inputs = wn_400 … wn_1800 — 절차의 계약: 701개 분광 열이 들어가고, 농도 하나가 나옵니다. load_xy()wn_ 접두 열을 모두 골라 이를 정의하므로, 입력 형상은 손으로 나열한 것이 아니라 데이터에서 유도됩니다.
  • n_components = 6, n_wavenumbers = 701 — 모델의 유일한 진짜 손잡이와 그것이 작동하는 입력 폭. 여섯 개 잠재 변수가 모델 복잡도 전부이고, 나머지는 모두 적합됩니다.
  • 학습 데이터 = raman_spectra.parquet, sha256 = 4d7f12c4…cbc998c — 레코드를 관리 가능 하게 만드는 필드. sha256 해시는 파일의 정확한 바이트로부터 계산되는 짧은 지문이며 — 값 하나만 바꿔도 지문이 완전히 달라지므로 — 데이터셋을 고유하게 식별합니다. 데이터셋 해시는 실제입니다 — datasets/MANIFEST.sha256에서 raman_spectra.parquet에 대한 줄입니다. 그 해시를 모델 버전에 묶으면(데이터를 "고정(pin)") “어느 데이터가 이 모델을 학습시켰는가?”는 더 이상 추측이 아닙니다.
  • 분할 = 235 학습 / 101 테스트, 시드 2026random_state=2026test_size=0.3. 시드가 235/101 분할 — 따라서 메트릭 — 을 실행마다 재현 가능하게 만드는 것입니다. 시드를 빼면 숫자가 떠돕니다.
  • StandardScaler: mean_[0] ≈ 42.47, scale_[0] ≈ 1.44 — 스케일러는 학습 조각에만 적합되고(StandardScaler().fit(Xtr)) 그다음 테스트 조각에 적용됩니다. 그 파수별 평균과 스케일은 모델의 일부입니다. 모델을 서빙하려면 스케일러도 서빙해야 하며, 아니면 모든 예측이 소리 없이 틀립니다.
  • 검증: R² = 0.9923, RMSE = 0.1498 g/L — held-out 메트릭, 녹색 핵심. CI 단언(r2 > 0.85)이 지키는 숫자이므로, 빌드가 빨갛게 되지 않고는 레코드가 조용히 퇴화할 수 없습니다.
  • 운영 범위, 의도된 용도, 계보 — 보라색 패널은 print()가 빠뜨리고 레지스트리가 더해야 하는 것을 담습니다: 모델이 검정된 역가 범위(이 데이터셋에서 0에서 약 5.72 g/L), 범위(권고용 역가이지 무인 출하 결정이 아님), 그리고 MLflow 계보 run → model → registry stage(한 번의 학습 실행(run) 이 저장된 모델(model) 을 만들고, 그 모델이 Staging과 Production 같은 레지스트리 스테이지(registry stage) 를 거쳐 승격됩니다)입니다. 이것들은 코드가 아니라 ICH Q14(분석 절차 개발에 관한 국제 규제 가이드라인)가 모델 기반 절차 둘레에 기대하는 관리되는 메타데이터이며, 출력된 문자열과 이 완전한 카드 사이의 간극이 아래 거버넌스 절의 주제 전체입니다.
이 레코드들은 어디서 오는가

두 신분증 카드 모두 트릴로지 전체를 가로지르는 고리를 닫습니다. SPC 차트가 추세화하는 CEX 주피크 수치는 물리적 측정값입니다 — 1권의 분석 검정과 QC 출하에서 작업대 위에서 생성되며, 거기서 각 배치가 시험성적서를 얻습니다. 소프트 센서가 예측하는 역가는 생산 바이오리액터 자체에 축적되는 단백질입니다. 그다음 2권은 각각을 관리되는 데이터포인트로 바꾸고, 이 장이 코드로 답하는 열린 질문을 던집니다: SPC 카드 뒤의 I-MR / Cpk 및 CPV 레코드, 그리고 PLS 카드 뒤의 소프트 센서 모델 레코드입니다. 이 장은 그 데이터 관리 과제가 해시된 데이터셋 위에서 돌아가는 scikit-learn이 되는 곳입니다.

두 레코드 모두 그래프 노드다: 하나의 트리플, 하나의 SHACL 게이트, 하나의 역량 질문

어느 신분증 카드도 Python dict로 남아 있을 필요가 없습니다. 각각은 한 주체(subject)에 관한 사실의 작은 묶음이며, 그것이 바로 RDF 노드의 형태 — 시맨틱 장이 디지털 스레드를 만들어 내는 주체-술어-목적어 트리플(triple) 모델 — 입니다. 소프트 센서 레코드는 하나의 IRI(국제화 자원 식별자, Internationalized Resource Identifier — 그래프에서 기본 키에 해당하는, 웹 스타일의 전역 이름) 위의 트리플 몇 개가 되며, 그 장이 산업 온톨로지 파운드리(Industrial Ontologies Foundry)에 정렬시키는 bp: 어휘를 재사용합니다.

# Illustrative — the model record as RDF, the same bp: vocabulary the semantics chapter loads.
bp:titer_pls_v3 a bp:SoftSensorModel ;
bp:predicts bp:titer_g_L ;
bp:trainedOn bp:raman_spectra_parquet ; # the dataset node, pinned by hash
bp:nComponents 6 ;
bp:r2 "0.9923"^^xsd:float ;
bp:operatingRangeMax "5.72"^^xsd:float ;
prov:wasDerivedFrom bp:raman_spectra_parquet . # PROV-O lineage edge

bp:raman_spectra_parquet bp:sha256 "4d7f12c4…cbc998c" . # the MANIFEST.sha256 line, now a triple

prov:wasDerivedFrom 엣지는 W3C 출처(provenance) 어휘인 PROV-O 입니다 — 그것은 "어느 데이터셋이 이 모델을 학습시켰는가?"를 걸어갈 수 있는 그래프 엣지로 만들며, 계보 SPARQL이 로트 계보에 쓰는 바로 그 derivedFrom 순회이자, 해부 카드가 그리는 MLflow run → model → registry 사슬의 기계 판독 가능한 쌍둥이입니다. SPC 레코드도 같은 방식으로 사상됩니다: bp:CEX_main_pct_spc bp:cpk 1.984 ; bp:center 68.9873 은 그 속성 위의 트리플이 몇 개 더 있는 것일 뿐입니다.

레코드가 노드가 되고 나면, SHACL 장이 로트에 적용하는 출하 게이트 규율모델 에도 적용됩니다. 관리되는 소프트 센서는 운영 범위 정확히 하나, 비어 있지 않은 의도된 용도 범위, 그리고 묶인 데이터셋 해시를 지녀야 하며 — "필수 필드가 빠져 있는가?"는 OWL이 답할 수 없지만 SHACL은 답할 수 있는 바로 그 닫힌 세계(closed-world) 질문입니다 [3]. 따라서 모델 거버넌스 카드는 정신적으로 하나의 sh:NodeShape, 즉 bp:ReleaseShape의 소프트 센서 등가물입니다.

# Illustrative — a model-governance gate, mirroring bp:ReleaseShape from the ontology book.
bp:GovernedModelShape a sh:NodeShape ;
sh:targetClass bp:SoftSensorModel ;
sh:property [ sh:path bp:trainedOn ; sh:minCount 1 ;
sh:message "Model is not pinned to a dataset." ] ;
sh:property [ sh:path bp:operatingRangeMax ; sh:minCount 1 ;
sh:message "Model has no declared operating range." ] ;
sh:property [ sh:path bp:intendedUse ; sh:minCount 1 ;
sh:message "Model has no documented intended use." ] .

그리고 감사 질문은 한 줄짜리 SPARQL 역량 질문(competency question)이 됩니다 — 온톨로지 책의 출하 CQ의 분석 판입니다: "데이터셋 해시가 현재 MANIFEST.sha256과 더는 일치하지 않는 모든 서빙 모델을 나열하라"SELECT ?m WHERE { ?m bp:trainedOn ?d . ?d bp:sha256 ?h . FILTER(?h != $current) } 입니다. 그것이 다음 절의 드리프트·진부화(staleness) 질문이며, 스프레드시트가 아니라 그래프에 묻는 것입니다 — 그리고 그것이 해부 카드에서 해시를 고정한 것이 결코 장식이 아니었던 이유입니다.

소프트 센서가 깨지는 곳 — 그리고 왜 정직함이 핵심인가

R² = 0.99는 수상쩍게 좋은 수치이며, 이 장의 도크스트링(docstring)이 그것을 대놓고 말합니다. 시뮬레이션된 스펙트럼은 역가 신호를 깨끗하게 담고 있습니다. 그 수치가 모델을 추켜세우는, 더 미묘한 두 번째 이유가 있습니다. 데이터셋은 단일 배치의 336개 시간 단위 스펙트럼이고, train()은 무작위 학습/테스트 분할을 쓰므로 — 떼어 둔 각 테스트 지점은 하나의 매끄러운 궤적 위에서 자기 자신의 학습 이웃 둘 사이 약 한 시간 자리에 놓입니다. 모델은 거의 내삽(interpolating) 하고 있을 뿐인데, 이는 거의 동일한 행들 사이를 보간하는 것이라 보지 못한 배치를 진정으로 예측하는 것보다 쉽습니다. 정직한 검정선 검증은 배치 전체 를 떼어 둡니다(batch_id로 묶은 leave-one-batch-out 분할). 이 단일 배치 데모는 그렇게 할 수 없습니다. 따라서 여기의 R²는 "이것이 현장 정확도다"가 아니라 "신호가 진정으로 거기 있다"로 읽는 것이 가장 좋습니다. 실제 라만은 더 어렵습니다. 바이오프로세스 소프트 센서는 가변적인 배치 길이, 여러 공정 단계(배양은 적응하는 지체기, 빠르게 분열하는 지수 성장기, 성장이 평탄해지는 정상기, 그리고 사멸기를 거쳐 자라며 — 각각 다른 분광 거동을 보임), 프로브의 오염과 기포, 그리고 노골적인 센서 결함을 견뎌 내야 하며 — 하나의 조건 집합에서 학습된 모델은 그중 어느 것이라도 바뀌면 소리 없이 성능이 떨어집니다 [6]. 하나의 스펙트럼에는 진정으로 여러 모델이 필요합니다. 정상기에서 작동하는 검정선(calibration)이 지수 성장 구간에서는 쓸모없을 수 있습니다.

핵심은 면책 조항이 아니라 설계 규칙입니다. 소프트 센서는 곁에 드리프트 모니터링(drift monitoring) 이 있을 때만 신뢰할 수 있습니다. 분광 입력을 학습 분포와 대조해 추적하고, 예측 잔차(residual)를 이따금의 오프라인 참조와 대조해 추적하여, 둘 중 어느 것이라도 벗어나면 깃발을 들어야 합니다. 서비스로 제공되는 경로는 모든 예측을 로깅하도록 설계되어 있으므로 이것이 감사 가능합니다. 모델은 결코 GMP 결정을 무인으로 내리도록 허용되지 않습니다.

모델이 쓰일 방식대로 검증하라: 그룹 CV, 적용 범위, 두 종류의 드리프트

위의 무작위 분할은 낙관의 가장 큰 단일 원천이며, 그 해법은 ML 책이 타협 불가로 다루는 규율입니다: 모델이 쓰일 방식대로 검증하라. 서빙되는 소프트 센서는 한 번도 본 적 없는 배치 에 대해 예측하므로, 그 현장 오차의 정직한 추정치는 그룹별, leave-one-batch-out 교차 검증(cross-validation) 입니다 — batch_id로 분할하여 테스트 배치의 어떤 행도 학습으로 새어 들지 않게 하고, 나머지에 적합시키고, 떼어 둔 배치에서 점수를 매기고, 돌립니다. 무작위 분할 R²와 leave-one-batch-out R² 사이의 간극이 바로 무작위 분할이 숨긴 누수(leakage)입니다. 같은 함정(과 그룹 CV라는 처방)이 ML 책의 데이터·검증 장이 시간 상관된(time-correlated) 모든 바이오프로세스 계열에 대해 경고하는 바로 그것입니다. 이 단일 배치 데모는 그것을 돌릴 수 없으며, 바로 그래서 그 R²가 "이것이 정확도다"가 아니라 "신호가 거기 있다"로 읽히는 것입니다.

교차 검증은 모델이 본 데이터 안에서 모델이 얼마나 좋은지를 알려 줍니다. 그것들 중 어느 것과도 닮지 않은 스펙트럼에 대해서는 아무 말도 하지 않습니다. 그 두 번째 질문이 적용 범위(applicability domain, AD) — 검정선이 믿어질 자격이 있는 입력 공간의 영역 — 이며, MVDA 절이 이미 그 도구를 만들어 두었습니다. 학습 PCA 모델에 대한 새 스펙트럼의 호텔링 T²(Hotelling's T²)SPE/Q 가 AD 검정입니다: 낮은 T²와 낮은 SPE는 "이 스펙트럼은 검정 집합과 닮았으니 예측을 신뢰하라"를, 높은 SPE는 "이것은 모델 평면 밖이다 — 새로운 화학, 오염된 프로브, 기포 — 이 숫자에 깃발을 들고, 그것에 근거해 행동하지 말라"를 뜻합니다. 모든 예측 곁에 AD 검사를 함께 내보내는 소프트 센서가, 적용 범위 밖에서 요란하게 실패하는 모델과 자신만만하게 틀린 역가를 외삽하는 모델의 차이입니다. (PLS는 세 번째 단서를 공짜로 줍니다: 범위를 한참 벗어난 예측, 또는 분광 잔차가 급등하는 예측은 회귀 쪽에서 읽은 같은 신호입니다.)

마지막으로, 두 드리프트를 구별하세요. 서로 다른 조치를 촉발하기 때문입니다. 모델 드리프트(model drift) 는 변하지 않은 공정에 대해 모델 이 진부해지는 것 — 오염되는 프로브, 더는 기기와 맞지 않는 검정선 — 이며, 처방은 재검정(re-calibration) 또는 재학습입니다. 공정 드리프트(process drift)공정 자체 가 움직이는 것 — I-MR 차트가 잡아내는 전하-변이체 추세, 실제 대사 이동 — 이며, 처방은 모델이 아니라 공정에 대한 CAPA(시정 및 예방 조치)입니다. 위험은 하나를 다른 하나로 착각하는 것입니다: 진짜 공정 이탈을 좇아 모델을 재학습하면 SPC 차트가 표면화하려고 존재하는 그 편차를 숨깁니다. 두 모니터는 나란히 돌아야 합니다 — 잔차 관리도는 모델을, I-MR과 골든 배치 엔벨로프는 공정을 지켜봅니다 — 그것이 ML 책이 만드는 MLOps 생애주기이며, 여기서는 바로 그 같은 데이터셋 위에 근거를 둡니다.

두 모니터는 또한 서로 다른 시점에 작동하며, 그 시간 차이가 핵심입니다. 선행(leading) 탐지기는 레이블이 필요 없습니다 — 들어오는 라만과 태그를 학습 분포와 대조하는 PSI 입력-분포 점검(그리고 같은 호텔링 T² / SPE 적용 영역 검정)이므로, 어떤 품질 결과가 돌아오기도 전에 입력이 움직이는 순간 깃발을 올립니다. 후행(lagging) 탐지기는 잔차 관리도이며, 느린 오프라인 분석이 기준값을 가지고 돌아올 때까지는 아무것도 확정할 수 없습니다. 그제서야 비로소 입력 이동이 실제 공정 이탈이었는지(편차를 표시하고 공정에 CAPA), 아니면 입력만의 공변량 이동(covariate shift)이었는지(변경 관리 하에 재학습)를 물을 수 있습니다:

두 드리프트 탐지기를 대비한 타임라인 및 의사결정 그림: 어떤 품질 결과가 돌아오기 전에 경보하는 선행 레이블-프리 입력-분포 모니터(들어오는 태그에 대한 PSI와 호텔링 T-제곱 및 SPE 적용 영역 검정), 그리고 느린 오프라인 역가 분석이 돌아와야 확정할 수 있는 후행 잔차 모니터. 의사결정은 공정 드리프트는 편차 표시와 CAPA로, 공변량 이동은 변경 관리 하의 재학습으로 갈립니다. 한 배치-시간 축 위의 두 드리프트 탐지기: 레이블-프리 입력 모니터가 잔차 모니터보다 몇 시간 먼저 작동하고, 잔차 모니터는 느린 오프라인 분석이 돌아와야만 확정할 수 있으며 — 판정은 공정 드리프트를 CAPA로, 공변량 이동을 변경 관리 하의 재학습으로 보냅니다.

저자가 AI의 도움을 받아 직접 제작한 그림입니다.

검정선이 움직일 때: 프로브와 스케일 전반의 현장 성능 저하

위 해부 카드에서 가장 중요한 필드 — 데이터셋 해시 — 는 또한 나머지 모든 것을 조용히 무효화하는 필드이기도 합니다. PLS 검정선은 그것이 학습된 정확한 분광기, 프로브, 공정 조건에 묶여 있으며, 문헌은 그중 어느 것이라도 바뀌면 무슨 일이 일어나는지에 대해 솔직합니다. 한 통제된 바이오프로세스 연구에서, Pétillot과 동료들은 같은 라만 분석기의 두 프로브를 같은 CHO 배양에 같은 시각에 넣어 — 모든 생물학적 변동을 제거한 채 — 두 프로브 사이의 세포 밀도 모델 예측 오차가 순전히 기기 간 차이만으로 약 20% 였고, 그것을 약 10% 로 반감시키는 데 검정선 전이(Kennard-Stone 조각별 직접 표준화) 단계가 필요했음을 보였습니다 [12]. 그것이 연결성 장의 “OPC UA 배포의 92%가 안전하지 않게 출하되었다”라는 데이터포인트의 소프트 센서 등가물입니다 — 기본 상태가 신뢰할 수 없음 을 보이는 하나의 단단한 숫자입니다. 프로브를 바꾸거나, 3 L 개발 반응기에서 2,000 L 생산 탱크로 옮기거나, 창에 오염이 끼게 두면, 자기 데이터에서 R² = 0.99를 기록한 모델이 단 한 줄의 코드 변경 없이도 합격 기준을 한참 넘어 퇴화할 수 있습니다.

이것이 해부 카드가 데이터셋을 해시로 고정하고 운영 범위를 선언하는 이유이며, 거버넌스 절이 재검증을 선택이 아니라 필수로 다루는 이유입니다. 새 하드웨어로 옮겨 간 소프트 센서는, 규제 목적상, 재자격(re-qualify)될 때까지 새로운 분석 절차입니다 — 검정선 전이는 공짜 점심이 아니라 자체 증거를 가진 문서화된 작업입니다. 따라서 우리의 R² = 0.99에 대한 정직한 해석은 좁습니다: 그것은 이 프로브, 이 공정, 이 데이터셋 해시 에 대해 참이며, 그중 어느 것이라도 움직이는 순간, 원래 메트릭이 아니라 드리프트 모니터가 그 숫자를 여전히 믿을 수 있는지를 알려 줍니다.

모델 거버넌스: ML에 대한 GxP 기준

대시보드를 위해 역가를 예측하는 모델은 하나의 사안입니다. 그러나 일단 모델이 규제 대상 결정에 닿으면 GxP 기준을 물려받습니다(GxP는 규제되는 우수 실무 표준 — 우수 제조 관리 기준(Good Manufacturing Practice)과 그 형제들 — 을 아우르는 우산입니다). 출하 결정(완성된 배치를 출하하거나 거부하는 공식적 판단)이나 공정 중 관리 결정에 그 출력이 들어가는 모델은 규제 대상 분석 절차이며, 기준이 가파르게 올라갑니다. ICH Q14 는 모델 기반 분석 절차 — NIR, 라만, 다변량 검정 — 가 생애주기 의무를 진다고 명시합니다. 문서화된 검정, 참조 방법에 대한 정식 검증, 정의된 운영 범위, 그리고 모델이 드리프트할 때 재검증을 촉발하는 지속적 성능 모니터링 입니다 [3]. 소프트 센서는 "한 번 학습하고 영원히 신뢰"하는 것이 아닙니다. 유지보수 부담을 지닌 관리되는 절차입니다.

여기가 오픈 소스 도구가 돕는 곳이자 멈추는 곳입니다. MLflow 는 거버넌스의 기술적 등뼈를 줍니다. 실험 추적(모든 실행의 매개변수, 메트릭, 그리고 정확한 데이터셋 해시), 버전과 스테이지 별칭(stage alias)을 갖춘 모델 레지스트리, 그리고 "어느 데이터로 학습된 어느 모델 버전이 이 배치에서 이 예측을 만들었는가?"에 답할 수 있도록 하는 실행-대-모델 계보(lineage)입니다 [11]. 서비스로 제공되는 경로는 바로 이 이유로 소프트 센서의 R²와 RMSE를 MLflow에 로깅하게 됩니다.

소프트 센서 거버넌스 파이프라인의 흐름도: 히스토리언(라만 + 태그)에서 특징 파이프라인(pandas)으로, 다시 PLS 학습(scikit-learn)으로, 그리고 MLflow(실행 + 메트릭 + 데이터셋 해시)로 이어지고, 이어서 모델 레지스트리(버전, 스테이지 별칭)에서 서빙되는 소프트 센서, Grafana(라이브 역가)로 감싸여 이어진다. 서빙되는 모델은 예측을 감사 및 드리프트 모니터로 로깅하며, 그 모니터는 오프라인 검정으로부터 참조 검사도 받는다.

그러나 MLflow는 추적할 뿐 검증하지는 않습니다. 정직한 GxP의 마지막 한 마장(last mile)은 이 책 전체가 거듭 도착하는 바로 그것입니다. 누가 모델 버전을 승격했는지에 대한 감사 추적, 검증 보고서에 대한 전자 서명(e-signature), 재학습을 관장하는 변경 관리(change-control) 절차, 그리고 모델이 무엇을 결정하도록 허용되는지를 한정하는 문서화된 의도된 용도(intended use)입니다. 그것들은 검증된 시스템과 절차 의 속성이지 pip install의 속성이 아닙니다. MLflow는 여러분에게 계보를 줍니다. 그것을 둘러싼 검증된 생애주기는 여러분이 해야 할 일입니다.

왜 중요한가

이전의 모든 장은 인프라였습니다. 이 장은 그 인프라가 존재하는 이유입니다. 드리프트하는 전하-변이체 속성을 규격에서 탈락하기 전에 잡아내는 관리도, 이탈 중인 반응기를 몇 시간 일찍 표시하는 골든 배치 엔벨로프, 네 시간짜리 검정을 실시간 숫자로 바꾸는 소프트 센서 — 이것들이야말로 플랜트를 마지막에 제품에 품질을 시험해 넣는 것 에서 공정 전반에 걸친 공정 이해 위에 품질 보증을 세우는 것 으로 옮겨 가게 합니다 [2]. 그리고 그것은 여기 도착하는 데이터가 깨끗하고, 맥락화되어 있으며, 귀속 가능하기 때문에만 작동합니다. 세상에서 가장 정교한 PLS 모델도 신뢰할 수 없는 데이터 위에서는 무가치하고, 가장 신뢰할 수 있는 데이터도 아무도 그것을 결정으로 바꾸지 않으면 낭비됩니다. 분석은 그 두 절반이 만나는 곳입니다.

실제 현장에서는

상업용 mAb 플랜트에서 SPC와 CPV 계층은 흔히 검증된 통계 스위트(JMP, Minitab, 또는 Discoverant 방식의 공정 인텔리전스 플랫폼)이고, MVDA는 자주 SIMCA(Sartorius/Umetrics) — 배치 모니터링을 위해 다방향 PCA/PLS를 제품화한 도구 — 입니다. 소프트 센서는 — 가장 흔하게는 synTQ(Optimal Industrial Technologies)나 Siemens SIPAT 같은 — PAT 데이터 관리·오케스트레이션 플랫폼 위에서, 인라인 라만 분석기에 배선되어 돌아갑니다 — 대표적인 공정용 라만 헤드(head)로는 Endress+Hauser Kaiser Raman Rxn2/Rxn4 공정 분석기가 있고, 대안으로 Renishaw VirsaTornado Spectral Systems 가 있습니다(업계에서 흔한 기기로서 거명한 것입니다). 우리의 오픈 소스 스택은 피드 펌프를 제어하는 검증된 PAT 시스템을 대체하는 척하지 않습니다. 그 곁에서 분석, 프로토타이핑, 그리고 맥락화된 히스토리언 피드를 해내며 — SPC/CPV 추세화는 진정으로 잘해 냅니다.

구체적인 닻 몇 개.

  • N-GLYcanyzer 테스트베드 는 이 PAT 비전의 구체적 사례입니다 — 라만 지문으로부터 품질 속성을 추론하는 대신, 두 가지를 실제로 온라인에서 측정하는 자동화 인라인 시스템입니다: 크로마토그래피 분리를 돌려 항체의 글리칸 프로파일(거기 붙은 당 사슬로, 핵심 품질 속성)과 단백질 A 역가(항체가 얼마나 있는지를 재는 빠른 친화도 측정)를 보고하며, CHO 세포 기반 트라스투주맙(trastuzumab) 항체 바이오시밀러에서 시연되었습니다 — 이 장의 소프트 센서가 스케치하는 바로 그 실시간 공정 중 측정 아이디어입니다.
  • 연속(continuous) 변형 은 분석의 판돈을 올립니다. 관류(perfusion) / 3MCC(다중 컬럼 연속 포착, multi-column continuous capture) 라인은 거의 정상 상태에서 몇 주씩 가동되므로, SPC는 배치당 지점에서 시간 창(time-windowed) 추세화로 옮겨 가고, 소프트 센서의 드리프트는 배치당 사안이 아니라 일상적 운영 관심사가 됩니다 — 위의 드리프트 모니터링 규율이 강화 공정(intensified processing)에서 타협 불가인 이유가 바로 그것입니다.

이 계층에 대한 정직한 OSS 대 상업용 평결: 오픈 소스는 이 책의 어느 계층보다도 이 계층에서 더 많은 부분을 이깁니다. pandas/NumPy/SciPy, scikit-learn [9], 그리고 statsmodels [10] 는 상업용 스위트가 감싸는 동일한 알고리즘입니다. Jupyter 노트북 더하기 MLflow는 믿을 만하고 재현 가능한 분석 환경이며, SPC 차트나 소프트 센서 예측을 Grafana로 서빙하는 데는 엔지니어링 외에 아무 비용도 들지 않습니다. 순수 OSS가 멈추는 곳은 이렇습니다. 그것은 검증되고 벤더가 책임지는 PAT 제어 시스템이 아니고, 코딩하지 않는 분석가를 위한 유지보수되는 Part 11 수준의 SPC GUI가 없으며, 모델 거버넌스 생애주기(검증 증거, 서명된 승인, 잠금된 변경 관리)는 다운로드하는 소프트웨어가 아니라 여러분이 만드는 절차입니다. 분석은 오픈 소스로 확보하고, 출하에 닿는 결정을 위한 검증된 래퍼(wrapper)는 사거나 만드세요.

핵심 용어

  • SPC(통계적 공정 관리, statistical process control) — 공정 자체의 변동을 사용해 관리 한계를 정하고 이상 원인 편차를 표시하는 것.
  • I-MR 차트(I-MR chart) — 배치당 값 하나에 대한 개별값 / 이동 범위 관리도. 산포는 d2 = 1.128을 통해 연속 쌍 차이로부터 추정.
  • 관리 한계 대 규격(control limits vs specification) — 한계는 데이터에서 나오고(공정이 하는 것), 규격은 제품 요구에서 나옴(제품이 해야 하는 것). 같은 띠가 아님.
  • Cpk — 공정 능력 지수. 평균에서 더 가까운 규격 한계까지의 거리를 3-시그마 단위로 표현. ≥ 1.33이면 넉넉히 능력 있음.
  • 골든 배치 엔벨로프(golden-batch envelope) — 배치 시간의 각 지점에서 계산한 평균 ± 3-시그마 띠. 라이브 배치를 과거 표준 위에 겹치기 위함.
  • MVDA — 다변량 데이터 분석. 상관된 많은 변수(와 그들의 관계)를 한꺼번에 모델링.
  • PCA / 다방향 PCA(PCA / multiway PCA) — 주성분 분석. 다방향 PCA는 배치 × 변수 × 시간 데이터를 펼쳐 궤적 전체를 모니터링.
  • PLS — 부분 최소 제곱 회귀. 스펙트럼처럼 넓고 공선적인 데이터를 위한 지도 학습 잠재 변수 모델링.
  • 호텔링 T² / SPE (Q)(Hotelling's T² / SPE) — 두 가지 다변량 모니터링 통계량. T²는 모델 평면 안의 거리(극단적이지만 알아볼 수 있는 배치), SPE/Q는 평면 밖의 거리(진정으로 새로운 거동).
  • 이상 원인 런 규칙(Western Electric / Nelson)(special-cause run rules) — 단일 3-시그마 지점을 넘어서는 패턴 검정 — 런, 추세, 구역 검정 — 으로, 모든 지점이 여전히 관리 한계 안에 있는 동안 드리프트하는 공정을 표시.
  • 기여도 도표(contribution plot) — 관리 이탈된 다변량 점수를 특정 변수에 귀속시키는 MVDA 진단.
  • 소프트 센서(가상 센서, soft-sensor) — 측정하기 어려운 양(역가)을 측정하기 쉬운 입력(라만 스펙트럼)으로부터 추론하는 모델.
  • 라만 스펙트럼(Raman spectrum) — 인라인 광학 측정. 여기서는 파수에 걸친 701개 강도 지점으로, 배양액의 분자 지문을 담음.
  • NIR(근적외선, near-infrared) — 라만과 같은 PLS/화학계량학적 처리를 받는, 형제 격의 인라인 진동 분광 PAT 측정. 그래서 소프트 센서 패턴은 기법에 구애받지 않음.
  • CPV(지속적 공정 검증, Continued Process Verification) — 공정 검증 생애주기의 3단계. 일상 생산 데이터의 지속적 통계 추세화.
  • PAT — 공정 분석 기술(Process Analytical Technology). 품질 결정을 이끄는 실시간 공정 중 측정.
  • 잠재 성분(잠재 변수, latent component) — PCA/PLS가 원시 열 대신 사용하는, 압축된 합성 축(상관된 많은 입력의 가중 혼합). 소프트 센서는 701개 파수 전부가 아니라 이 가운데 6개로 작동.
  • R² / RMSE — 모델 적합 점수. R²는 모델이 설명하는 분산의 비율(1.0 = 완벽), RMSE는 타깃 자체 단위(여기서는 g/L)로 나타낸 전형적 예측 오차. 전체 다룸은 ML 책 참조.
  • ICH Q14 — 분석 절차 개발에 관한 국제 규제 가이드라인. 모델 기반 절차를 생애주기 의무(검증, 운영 범위, 지속적 모니터링, 재검증 촉발 조건)로 만듦.
  • GxP — 규제되는 우수 실무 표준(우수 제조 관리 기준과 그 형제들)을 아우르는 우산. 모델이 규제 대상 결정에 닿는 순간 충족해야 하는 기준.
  • 드리프트 모니터링(drift monitoring) — 모델 입력과 잔차를 학습 분포와 대조해 추적하여 모델이 낡았을 때를 감지.
  • Leave-one-batch-out(그룹) 교차 검증(grouped cross-validation) — 배치 전체를 떼어 두어(batch_id로 분할) 테스트 배치의 어떤 행도 학습으로 새어 들지 않게 검증하는 것. 본 적 없는 배치에 대한 소프트 센서 오차의 정직한 추정치.
  • 적용 범위(applicability domain, AD) — 검정선이 믿어질 자격이 있는 입력 공간의 영역. 학습 PCA 모델에 대한 스펙트럼별 호텔링 T²와 SPE로 검정.
  • 모델 드리프트 대 공정 드리프트(model drift vs process drift) — 모델 드리프트는 변하지 않은 공정에 대해 모델이 진부해지는 것(처방: 재검정/재학습), 공정 드리프트는 공정 자체가 움직이는 것(처방: 공정에 대한 CAPA). 진짜 공정 이탈을 좇아 재학습하면 SPC가 표면화하려고 존재하는 편차를 숨김.
  • RDF 트리플 / SHACL / PROV-O(분석 레코드에 대해) — SPC와 소프트 센서 레코드는 하나의 IRI 위의 RDF 트리플이 될 수 있고, SHACL NodeShape(bp:ReleaseShape의 모델 거버넌스 등가물)로 게이트되며, prov:wasDerivedFrom이 데이터셋 계보를 기록 — 시맨틱출하 게이트 장 참조.

다음 이야기

이제 우리는 전체 도구 세트를 갖추었습니다 — 포착, 히스토리언, 맥락, 시맨틱, 신뢰, 그리고 그 모든 것을 통찰로 바꾸는 분석입니다. 마지막 빌드 장 캡스톤: 한 배치, 처음부터 끝까지(Capstone: One Batch, End to End) 는 모든 계층을 하나의 라인에 담습니다. 센서에서 수집, 히스토리언, 맥락화, 서명된 기록, 감사 추적, 그리고 바로 이 분석까지로 구동되는 완전한 시뮬레이션 유가식 CHO + 단백질 A 런으로, 검토 가능하고 출하 준비가 된 하나의 데이터셋과 대시보드로 끝맺습니다 — 여러분이 만든 모든 것이 실제로 서로 연결됨을 증명하는 것입니다.