공정데이터를 활용한 실전 이상탐지 및 품질 이상 조기 예측_1회차
1. 이상치 탐지 유형
1) Point Anomalies (포인트 이상치) : 단일 센서 값 또는 측정값이 다른 정상 데이터와 비교했을 때 급격히 벗어난 경우. 즉, 오직 하나의 데이터에만 이상이 생긴 것

🛠 제조 예시:
- 온도 센서가 갑자기 비정상적으로 높은 값을 기록 (예: 정상 범위 20~50°C인데 100°C가 기록됨).
- 특정 부품의 길이, 무게, 두께 등의 측정값이 허용 공차를 초과.
2) Contextual Anomalies (문맥적 이상치) : 값 자체는 정상 범위에 있지만, 특정 조건이나 문맥에서 비정상적인 경우. 즉, 데이터의 맥락(Contextual)을 고려했을 때 생긴 이상이 생긴 것

🛠 제조 예시:
- 온도 센서 데이터: 일반적으로 밤에는 온도가 낮아야 하는데, 특정 공정에서 낮보다 높은 온도 기록.
- 진동 데이터: 정상적으로 기계가 작동할 때는 진동이 강해야 하는데, 부하가 적은 공정에서 강한 진동이 발생.
3) Collective Anomalies(집단적 이상치) : 개별 값들은 정상 범위 내에 있지만, 여러 값이 특정한 패턴을 이루며 비정상적인 경우 즉, 복수의 데이터 포인터들에게서 이상이 생긴 것(연속적)

🛠 제조 예시:
- 모터 전류 데이터: 특정 시간 동안 꾸준히 정상 범위를 유지하던 전류가 갑자기 연속적으로 변동이 심해짐.
- 생산 공정 시간: 개별적인 조립 공정 시간은 정상이지만, 조립 후 검사 시간이 연속적으로 길어짐.
- 불량률 패턴 변화: 개별 불량률은 낮지만, 한 시간 동안 연속적으로 작은 불량이 누적되는 경우.

2. 다변수 시계열 데이터를 그룹화해야 하는 이유
단순히 모든 변수를 하나의 그룹으로 처리하는 방식과 유사한 변수끼리 그룹을 나눠 이상 감지를 수행하는 방식을 비교해봄
사례 1: 모든 변수를 하나의 그룹으로 처리하는 경우
예제: 우주선 이상 감지 시스템
- 우주선에는 100개의 센서(변수)가 존재. ⇒ 1개의 칼럼
- 전체 데이터를 하나의 모델에서 감지하여 이상 발생 시 우주선 전체에 대한 이상 감지만 인지 가능.
- 하지만, 어느 부분에서 문제가 발생했는지 알 수 없어 대응이 어려움.
- 예를 들어, 1단 로켓, 2단 로켓, 엔진, 궤도 등 어떤 시스템에서 이상이 발생했는지 알기 어렵다.
- 결과적으로, 경고 알람이 발생해도 세부적인 대응이 어려움.
사례 2: 변수들을 유사한 그룹으로 나누어 독립적인 이상 감지 모델 운영
예제: 우주선 이상 감지 시스템 (개선된 방식)
- 100개의 변수 중 유사한 변수들끼리 10개의 그룹으로 나누어 각각 독립적인 모델을 운영.
- 예를 들어,
- 1단 로켓 그룹 → 관련 변수만 포함 (온도, 압력, 연료 상태 등)
- 엔진 그룹 → 엔진 관련 변수들만 포함
- 궤도 그룹 → 궤도 조정 관련 변수만 포함
- 각 그룹별로 독립적인 이상 감지 모델을 구축하여 운영.
- 만약 엔진 그룹에서 이상 감지가 발생하면, 엔진 관련 문제임을 바로 인지하고 대응 가능.
- 모니터링 담당자는 경고 발생 시 즉시 해당 그룹을 확인하여 세부적인 원인 분석 및 대응 가능.
이 방식의 장점:
- 이상 감지의 정확도 향상 → 서로 다른 패턴을 가진 변수들을 하나의 모델에서 학습하는 것이 아니라, 유사한 변수끼리 학습하므로 모델이 더 잘 학습할 수 있음.
- 문제 발생 시 즉각적인 원인 분석 가능 → 특정 그룹에서 이상 발생 시 해당 시스템의 문제임을 빠르게 판단 가능. =
- 운영 및 유지보수 용이 → 한 그룹의 모델을 수정해도 다른 그룹에는 영향을 미치지 않음.
3. 실제 운영에서 그룹을 나누는 것이 중요한 이유
- 다변수 시계열 데이터에서는 일부 변수들 간에 서로 연관이 깊고, 유사한 움직임을 보이는 변수들이 존재함.
- 예를 들어, 한 그룹의 변수가 A ~ E까지 있다고 할 때, A 변수에서 이상이 발생하면 B, D 변수도 영향을 받는 경우가 많음. 온도 a 온도 b ⇒ 99.99% ⇒ 온도 a 이상이있다면? b에도 이상이 있겠죠? 온도 a만 이상이있고, b에는 이상이 없어요.
- 이러한 도메인 지식을 반영하여, 서로 밀접한 관계가 있는 변수들을 같은 그룹으로 묶고, 독립적으로 학습하는 것이 바람직.
4. 다변수 시계열 이상 감지 시스템 구축 방법
① 변수 그룹화 (Domain Knowledge 반영)
- 전문가의 도메인 지식을 활용하여 유사한 변수들을 그룹으로 묶음.
- 예: 엔진 관련 변수, 궤도 관련 변수, 온도 관련 변수 등.
② 각 그룹별 독립적인 이상 감지 모델 구축
- 각 그룹에 맞는 이상 감지 모델을 개별적으로 학습 ( Isolation Forest 등).
- 그룹별 데이터의 특성을 반영하여 최적화.
③ 이상 감지 후 세부적인 원인 분석 가능하도록 설계
- 하나의 모델에서 "이상 감지 발생"만 판단하는 것이 아니라,
- 어느 그룹에서 이상이 발생했는지까지 즉각적으로 확인 가능하도록 설계.
④ 운영 및 유지보수의 용이성 확보
- 특정 그룹의 데이터 특성이 변경되더라도 다른 그룹의 모델에는 영향을 주지 않음.
- 유지보수 및 개선이 더 쉬워짐.
🎯 결론: 그룹 기반 이상 감지 시스템이 필수적이다!
✔ 모든 변수를 하나의 모델에서 처리하면, 이상 감지 후 원인 분석이 어렵고 대응이 늦어질 수 있음.
✔ 유사한 변수들끼리 그룹을 묶어 각각의 독립적인 모델을 운영하면, 정확한 감지 및 빠른 대응이 가능.
✔ 각 그룹의 변수 특성을 반영한 모델 학습이 가능하여, 이상 탐지의 성능이 향상됨.
✔ 운영 및 유지보수가 용이하며, 실시간 대응이 훨씬 수월해짐.
따라서, 다변수 시계열 데이터의 이상 감지에서는 "변수 그룹화 및 독립 모델 운영"이 핵심 전략이다!
5. 이상치 탐지모델
1) Elliptic Envelope(타원형 경계 기반 이상치 탐지) : 데이터가 정규 분포를 따른다고 가정하고, 타원형 경계(Elliptical Boundary)를 생성하여 이상치를 탐지하는 방법.

다변수 데이터에서 중심에서 멀리 떨어진 데이터를 이상치로 간주.
✔ 통계적 접근법: 데이터의 평균과 공분산을 기반으로 이상 탐지.
✔ 정규 분포를 가정: 데이터가 정규 분포를 따를 때 효과적.
✔ 고속 연산 가능: 다른 이상치 탐지 알고리즘보다 빠르게 동작.
✔ 선형적인 경계: 이상치를 결정하는 기준이 타원형 경계로 단순함.
코드예시)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.covariance import EllipticEnvelope
# 1. 샘플 데이터 생성 (정상 + 이상치)
rng = np.random.RandomState(42)
# 정상 데이터 100개 (2차원 정규분포)
X_normal = 0.3 * rng.randn(100, 2) + [2, 2]
# 이상치 10개 (멀리 떨어진 위치에 배치)
X_outliers = rng.uniform(low=-4, high=8, size=(10, 2))
# 전체 데이터 합치기
X = np.vstack([X_normal, X_outliers])
# 시각화 (데이터 분포만 먼저 확인)
plt.scatter(X[:, 0], X[:, 1], c='gray', label="All Data")
plt.title("Generated Sample Data (with outliers)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.show()
# 2. Elliptic Envelope 모델 생성 및 학습
model = EllipticEnvelope(contamination=0.05) # 이상치 비율 5%
model.fit(X)
pred = model.predict(X) # 정상: 1, 이상치: -1
# 3. 예측 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=pred, cmap='coolwarm', label='Prediction')
plt.title("Elliptic Envelope Anomaly Detection")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()


2) Isolation Forest (격리 기반 이상치 탐지)
- 트리 구조를 사용하여 데이터를 무작위로 분할하며, 이상치는 정상 데이터보다 더 빠르게 격리(Isolation)되는 특성을 이용한 방법.
- 이상치는 다른 데이터보다 고립되기 쉬우므로(트리에서 더 적은 단계에서 분리됨) 이상으로 판단


특징
✔ 비지도 학습(Unsupervised Learning)
✔ 빠른 연산 속도: 트리 구조 기반으로 대용량 데이터에서도 빠르게 동작.
✔ 정규 분포가 아닌 데이터에도 적합
✔ 고차원 데이터에서도 효과적
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
# 1. 샘플 데이터 생성 (정상 + 이상치)
rng = np.random.RandomState(42)
# 정상 데이터 100개 (2D Gaussian)
X_normal = 0.3 * rng.randn(100, 2) + [2, 2]
# 이상치 10개 (멀리 떨어진 위치)
X_outliers = rng.uniform(low=-4, high=8, size=(10, 2))
# 전체 데이터 결합
X = np.vstack([X_normal, X_outliers])
# 데이터 확인 (전체 분포 시각화)
plt.scatter(X[:, 0], X[:, 1], c='gray')
plt.title("Generated Data (with outliers)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
# 2. Isolation Forest 모델 생성 및 학습
iso_forest = IsolationForest(contamination=0.05, random_state=42)
y_pred = iso_forest.fit_predict(X) # 정상: 1, 이상치: -1
# 3. 이상치 탐지 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='coolwarm')
plt.title("Isolation Forest Anomaly Detection")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()


3) Local Outlier Factor (LOF, 지역적 밀도 기반 이상치 탐지)
- 데이터의 밀도를 계산하여 **이웃 데이터들과의 상대적인 차이를 분석(KNN)**하여 이상치를 탐지하는 방법.
- 이상치의 특징: 주변 밀도가 낮고, 정상 데이터와의 밀도 차이가 클 경우 이상치로 판별.

특징
✔ 밀도 기반 이상치 탐지 → 데이터 분포가 균일하지 않아도 탐지 가능
✔ 지역적(Local) 패턴을 반영 → 특정 영역에서의 이상치 감지 가능
✔ 비정규 분포 데이터에서도 효과적
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor
# 1. 샘플 데이터 생성 (정상 + 이상치)
rng = np.random.RandomState(42)
# 정상 데이터 100개 (2D Gaussian)
X_normal = 0.3 * rng.randn(100, 2) + [2, 2]
# 이상치 10개 (멀리 떨어진 위치)
X_outliers = rng.uniform(low=-4, high=8, size=(10, 2))
# 전체 데이터 결합
X = np.vstack([X_normal, X_outliers])
# 전체 데이터 확인
plt.scatter(X[:, 0], X[:, 1], c='gray')
plt.title("Generated Data (with outliers)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
# 2. LOF 모델 생성 및 이상치 탐지
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.05)
y_pred = lof.fit_predict(X) # 정상: 1, 이상치: -1
# 3. 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='coolwarm')
plt.title("Local Outlier Factor (LOF) Anomaly Detection")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

