1. 프로젝트 배경
모두의연구소 데이터 사이언스 4기의 마지막 과정인 ‘아이펠톤’이 시작됐다. 아이펠톤은 기업과 연계하여 실제 데이터를 분석하거나, 제시된 주제를 기반으로 프로젝트를 수행하는 과정이다.
내가 속한 팀은 한 제조 기업으로부터 데이터를 제공받아 이를 분석하고, AI 기술을 활용해 예측 모델을 구축하는 프로젝트를 맡았다.
우리 팀은 특히, 제공받은 데이터에서 임계값을 설정하고 이를 바탕으로 특정 작업을 진행할지 여부를 분류(Classification) 문제로 접근하기로 했다. 하지만 처음부터 임계값 자체가 정의되어 있지 않아, 이를 어떻게 설정할지가 가장 큰 난관이었다.
여러 차례의 팀 토론 끝에 특정 Feature를 새롭게 생성했고, 그 값을 기준으로 임계값을 설정하는 방법을 찾기 위해 다양한 자료를 검색하던 중 ‘추세 변화 감지(Change Point Detection)’ 기법을 접하게 되었다. 이 글에서는 해당 기법과 이를 구현할 수 있는 Python 라이브러리 ruptures에 대해 정리하고자 한다.
2. 변화점 탐지(Change Point Detection)란?
시계열 데이터에서 통계적 특성이 갑자기 변하는 지점을 찾는 작업을 변화점 탐지(Change Point Detection) 라고 한다.
예시:
- 센서 데이터에서 장비 고장이 발생한 순간
- 금융 데이터에서 시장 상황이 바뀌는 시점
- 웹 트래픽에서 이벤트가 발생한 순간
3. ruptures 라이브러리 특징
- 다양한 탐지 알고리즘 지원: PELT, Binary Segmentation, Window-based, Dynamic Programming 등
- 단일/다중 변화점 탐지 가능
- 연속형 데이터뿐 아니라 다변량 시계열 처리 가능
- 시각화 기능 제공 (ruptures.display)
4. 주요 탐지 알고리즘
| 알고리즘 | 특징 |
|---|---|
| PELT (Pruned Exact Linear Time) | 정확하고 효율적, 다중 변화점 탐지 가능 |
| Binary Segmentation (Binseg) | 빠르고 단순, 근사적 탐지 |
| Window-based | 슬라이딩 윈도우 기반, 실시간 탐지 가능 |
| Dynamic Programming (Dynp) | 최적해 보장, 계산 비용 높음 |
5. 단일 시계열 예제
import ruptures as rpt
import numpy as np
import matplotlib.pyplot as plt
# 예제 시계열 데이터 생성
signal = np.concatenate([
np.random.normal(0, 1, 100),
np.random.normal(5, 1, 100),
np.random.normal(0, 1, 100)
])
# 탐지 모델 생성 (평균 변화점)
model = "l2" # 평균 변화, L2 norm 기반
algo = rpt.Pelt(model=model).fit(signal)
# 변화점 탐지
result = algo.predict(pen=10) # pen: 페널티 값
# 결과 시각화
rpt.display(signal, result)
plt.show()signal: 시계열 데이터model: 변화점 모델 ("l2"=평균, "rbf"=분포, "l1"=중위수 등)pen: 페널티 값, 값이 크면 변화점 개수 감소- 수행 결과

6. 다변량 시계열 예제
import ruptures as rpt
import numpy as np
import matplotlib.pyplot as plt
# 다변량 시계열 데이터 생성 (2차원)
signal1 = np.concatenate([
np.random.normal(0, 1, 100),
np.random.normal(5, 1, 100),
np.random.normal(0, 1, 100)
])
signal2 = np.concatenate([
np.random.normal(0, 2, 100),
np.random.normal(0, 5, 100),
np.random.normal(0, 2, 100)
])
# 2차원 배열로 합치기
multivariate_signal = np.column_stack([signal1, signal2])
# 다변량 탐지 모델: 평균+분산 변화점(rbf 사용)
model = "rbf"
algo = rpt.Pelt(model=model).fit(multivariate_signal)
# 변화점 탐지
result = algo.predict(pen=10)
# 결과 시각화
rpt.display(multivariate_signal, result)
plt.show()- "rbf" 모델: 평균과 분산, 분포 변화를 모두 감지 가능
- 다변량 데이터에도 적용 가능
- 수행 결과

7. 활용 팁
- 데이터 전처리
- 결측치 제거 또는 보간
- 다변량 데이터는 스케일링 고려
- 모델 선택
- 평균 변화: "l2"
- 평균+분산 변화: "rbf"
- 중위수 변화: "l1"
- 정확도 우선: PELT
- 속도 우선: Binary Segmentation
- 실시간: Window-based알고리즘 선택
8. 마무리
이번 프로젝트에서 가장 큰 과제 중 하나는 데이터의 임계값을 어떻게 정의할 것인가였다. 단순히 평균이나 표준편차를 기준으로 잡는 방식은 노이즈에 취약했고, 시간의 흐름에 따른 변화 패턴을 반영하지 못했다.
ruptures 라이브러리를 활용한 추세 변화 감지 기법은 데이터의 통계적 변화 시점을 효과적으로 찾아내어, 임계값 설정의 근거를 마련하는 데 큰 도움이 되었다.
앞으로도 제조 데이터뿐만 아니라, 금융·의료·IoT 센서 데이터 등 다양한 시계열 분석 분야에서 변화점 탐지 기법은 중요한 역할을 할 수 있을 것이다.
실제 프로젝트에서는 변화점 탐지 결과를 후처리하여, 의사결정 로직이나 자동화된 분류 모델과 결합하는 방식으로 발전시킬 수 있다.
'데이터 사이언스 > 프로젝트' 카테고리의 다른 글
| 반지도학습(Semi-Supervised Learning) 정리 (0) | 2025.08.14 |
|---|---|
| Pseudo-labeling (의사 라벨링) 완벽 정리 (0) | 2025.08.14 |
| [LangChain톤 프로젝트 회고] 치매 자산 보호 AI 서비스 개발 기록 (0) | 2025.07.06 |
| [랭체인톤 회고] 신뢰와 몰입으로 완성한 4일간의 챗봇 프로젝트 (0) | 2025.07.06 |
| [프로젝트] 인공지능과 가위바위보 하기 (0) | 2025.06.10 |