카테고리 없음

현장 데이터는 어디서 오염되는가 — 3가지 데이터 오류 패턴

린코더 2026. 5. 4. 11:53

👉 이전 글: 스마트팩토리 데이터, 무엇을 놓치고 있는가 — 현장 데이터의 현실

린과 코드 시리즈 2 · #1

데이터 오류는 같지 않습니다. 오류마다 움직이는 방식이 있습니다.


#0에서 현장 데이터가 어긋나는 4개 지점을 살펴봤습니다. 센서의 위치 오류, 수집 과정의 누락, 측정 절차의 불일치. 구조는 파악됐습니다.

그런데 현장에서 실제로 마주하는 오염은 다른 방식으로 나타납니다. 오류 메시지가 없습니다. 데이터는 정상적으로 쌓입니다.

이번 글에서는 그 오염이 어떤 경향성을 가지는지를 봅니다. 연속적인가, 불연속적인가, 간헐적으로 사라지는가. 패턴을 이해하면 — 어떤 데이터를 먼저 확인해야 하는지, 어디서부터 원인을 추적해야 하는지, 품질비용을 어느 범위에서 가늠해야 하는지가 달라집니다.

보이지 않는 오류 패턴을 찾아내는 것 — 이것이 데이터 신뢰성의 출발점입니다.

오염의 경향성이 다르면,

확인 방법도 달라야 합니다.


제조 현장의 3가지 데이터 오류 패턴

패턴 1   센서 밀림(Drift) — 연속적, 방향이 있다

센서 밀림(Drift)는 센서가 시간이 지남에 따라 실제 값에서 서서히 벗어나는 현상입니다. 갑자기 튀지 않습니다. 하루에 0.1°C씩, 한 달이면 3°C. 그 자체로는 이상값처럼 보이지 않기 때문에 그냥 통과됩니다.

현장에서 이것이 위험한 이유는 하나입니다. 교정(Calibration)을 마쳤기 때문에 의심하지 않습니다. 교정 기록도 있고, 교정 주기도 지켰습니다. 그런데 마지막 교정 이후 6개월 사이에 센서는 이미 벗어나고 있었습니다.

센서 밀림은 방향성 오류(systematic error)입니다. 노이즈처럼 양쪽으로 흔들리지 않고, 한 방향으로 지속적으로 이동합니다. 데이터 정제로는 해결되지 않습니다 — 정제는 이상값을 걸러내거나 노이즈를 줄이는 데 유효하지만, 측정 기준 자체가 틀어진 경우에는 무력합니다.

# 센서 밀림 시뮬레이션 — 시간이 지날수록 오차가 한 방향으로 누적
import numpy as np
import pandas as pd

np.random.seed(42)
days = 180                        # 교정 주기 6개월
true_temp = 85.0                  # 실제 공정 온도 (고정)
drift_rate = 0.02                 # 하루 0.02°C씩 한 방향으로 누적
drift = np.arange(days) * drift_rate
noise = np.random.normal(0, 0.1, days)
sensor_reading = true_temp + drift + noise

df = pd.DataFrame({
    'day': range(1, days + 1),
    'true_temp': true_temp,
    'sensor_reading': sensor_reading,
    'error': sensor_reading - true_temp
})

checkpoints = [
    ('1개월', 0,   30),
    ('2개월', 30,  60),
    ('3개월', 60,  90),
    ('4개월', 90,  120),
    ('5개월', 120, 150),
    ('6개월', 150, 180),
]
for label, start, end in checkpoints:
    avg = df.iloc[start:end]['error'].mean()
    print(f"{label} 시점 평균 오차: +{avg:.2f}°C")

# 출력:
# 1개월 시점 평균 오차: +0.27°C
# 2개월 시점 평균 오차: +0.88°C
# 3개월 시점 평균 오차: +1.49°C
# 4개월 시점 평균 오차: +2.09°C
# 5개월 시점 평균 오차: +2.68°C
# 6개월 시점 평균 오차: +3.32°C ← 교정 시점 놓치면 이 오차가 반영된 채 생산 지속

비즈니스 임팩트 — 센서 밀림

재작업이 발생한다는 것은 이미 품질비용(COPQ)이 발생하고 있다는 뜻입니다.

· 원재료 손실 — 불량품에 투입된 소재비.

· 재작업 인건비 — 선별·재처리에 투입되는 작업자 시간.

· 설비 점유 비용 — 재처리 시 기계 시간 손실, 유틸리티 비용.

센서 밀림이 위험한 이유는 이 비용이 교정 주기 내내 조용히 누적된다는 것입니다.

패턴 2   기준 이동(Change Point) — 불연속적, 기준이 이동한다

작업자가 바뀌었거나, 설비나 원자재가 교체됐습니다. 데이터는 계속 쌓입니다. 그런데 그 변경이 기록되지 않았습니다.

기준 이동은 센서 밀림처럼 서서히 이동하는 것이 아닙니다. 어느 시점을 기준으로 데이터가 머무는 값 자체가 달라집니다 — 계단처럼, 한 번에.

AI 모델을 학습할 때 특히 문제가 됩니다. 변경 기록이 없으면 모델은 이질적인 두 상태를 같은 공정으로 학습합니다.

코드 출력에서 mean 값을 보면 — 27.95초와 26.51초, 1.44초 차이가 드러납니다.

# 기준 이동 시뮬레이션 — 4M 변경 미기록 시 사이클 타임 변화
import numpy as np
import pandas as pd

np.random.seed(42)
n = 200
change_point = 100

before = np.random.normal(28.0, 0.5, change_point)
after = np.random.normal(26.5, 0.5, n - change_point)
cycle_time = np.concatenate([before, after])
label = ['변경 전'] * change_point + ['변경 후'] * (n - change_point)

df = pd.DataFrame({'shot': range(1, n + 1), 'cycle_time': cycle_time, 'label': label})
print(df.groupby('label')['cycle_time'].agg(['mean', 'std']).round(2))

# 출력:
# mean std
# 변경 전 27.95 0.45
# 변경 후 26.51 0.48

비즈니스 임팩트 — 기준 이동(Change Point)

기준 이동을 모른 채 원인을 찾는 동안 — 불량은 계속 발생하고, 엔지니어 시간이 소모됩니다.

기준 이동 미기록의 핵심은 원인을 추적할 기준점이 사라진다는 것입니다.

패턴 3   빠진 데이터(Missing Data) — 간헐적, 사라진 것은 보이지 않는다

센서 밀림과 기준 이동은 데이터가 있습니다. 틀린 값이지만, 있습니다. 빠진 데이터는 다릅니다. 데이터 자체가 없습니다.

코드가 하는 것은 하나입니다 — 있어야 할 시점과 실제 수집된 시점을 비교해서, 어느 구간에 데이터가 없는지 확인하는 것.

# 빠진 데이터 시뮬레이션 및 수집 스케줄 기반 결측 확인
import pandas as pd
import numpy as np

np.random.seed(42)
full_index = pd.date_range('2024-01-01 08:00', periods=1080, freq='10s')
values = np.random.normal(85.0, 0.3, 1080)
df_full = pd.DataFrame({'timestamp': full_index, 'temp': values})

missing_mask = (df_full['timestamp'] >= '2024-01-01 09:10') & \
               (df_full['timestamp'] < '2024-01-01 09:40')
df_actual = df_full.drop(df_full[missing_mask].index).reset_index(drop=True)

expected = pd.DataFrame({'timestamp': full_index})
missing = expected[~expected['timestamp'].isin(df_actual['timestamp'])]

print(f"수집 기대 건수: {len(expected)}")
print(f"실제 수집 건수: {len(df_actual)}")
print(f"결측 건수: {len(missing)} ({len(missing)/len(expected)*100:.1f}%)")
print(f"결측 시작: {missing['timestamp'].iloc[0]}")
print(f"결측 종료: {missing['timestamp'].iloc[-1]}")

# 출력:
# 수집 기대 건수: 1080
# 실제 수집 건수: 900
# 결측 건수: 180 (16.7%)
# 결측 시작: 2024-01-01 09:10:00
# 결측 종료: 2024-01-01 09:39:50

비즈니스 임팩트 — 빠진 데이터(Missing Data)

· 학습 오염 — 비정상 구간이 '정상'으로 학습됩니다.

· 이상 확인 불가 — 그 구간에 이상이 있었는지 확인할 방법이 없습니다.

그 시간 동안 공정에 무슨 일이 있었는지는 알 수 없습니다.

코드가 할 수 있는 것

코드가 하는 것은 하나입니다 — 빠진 데이터가 있었다는 것을 알고, 그 구간을 분석에서 명시적으로 처리하는 것.


3가지 패턴 — 비교 정리

패턴 경향성 오류 유형 확인 접근
센서 밀림 연속적 · 한 방향으로 방향성 오류 흐름 평균, 방향 확인
기준 이동 불연속적 · 계단식 기준 불일치 기준 이동 확인
빠진 데이터 간헐적 · 불규칙 데이터 누락 수집 스케줄 비교

현장 관찰 — 결국 품질비용 문제와 직결됩니다

한 공정에는 여러 개의 센서가 사용됩니다. 각 센서마다 세 가지 패턴이 독립적으로 발생할 수 있고, 기준 이동과 빠진 데이터까지 조합되면 품질비용은 상당히 늘어납니다.

· 패턴 하나           → 품질비용 최소치

· 패턴 두 개 조합   → 원인 추적 어려움, 비용 급증

· 패턴 세 개 조합   → 확인 자체가 무력화 — 품질비용 최대치

어떤 패턴이 어떻게 조합되어 있는지 — 그것을 먼저 파악하는 것이 출발점입니다.


세 가지 패턴을 이해했다면 — 다음 질문은 자연스럽게 하나로 모입니다.

"내 현장 데이터에 이 패턴이 있는지 어떻게 알 수 있는가?"

다음 글 #2에서는 세 가지 패턴을 실제 데이터로 확인하는 방법을 다룹니다.

린코더 · Series 2

Prologue  |  #0  |  참고 (MSA)  |  #1 (현재)  |  #2  |  #3

린코더 (LeanCoder)
— 현장어를 코드로