본문 바로가기
머신러닝 with Python

[머신러닝 with Python] Ruptures 라이브러리를 활용한 시계열 변화점 탐

by CodeCrafter 2025. 6. 7.
반응형

 

이번에는 Ruptures라는 라이브러리를 활용해서 시계열 데이터에 대한 변화점을 탐지해보겠습니다.

 

1. Ruptures 라이브러리

Ruptures는 시계열 데이터의 변화점 탐지(change point detection)를 위한 파이썬 라이브러리입니다.

 

통계적 특징이 바뀌는 시점을 자동으로 찾아내는 데에 특화되어 있으며, 다음과 같은 특징을 가지고 있습니다.

 

항목 설명
목적 시계열에서 평균, 분산, 추세 등의 급격한 변화 시점(change points) 탐지
알고리즘 PELT, Binary Segmentation, Window-based Search 등 다양한 탐지 알고리즘 제공
비용 함수 l1 및 l2 (평균 변화), rbf(복합 변화) linear(추세 변화) 등 다양한 cost model 지원
시각화 탐지된 변화점을 시계열 위에 시각화할 수 있는 함수 지원

 

 

2. Colab 환경에서, NYC Taxi dataset을 활용한 ruptures 라이브러리 구현

이번에는 Colab 환경에서, NYC Taxi Dataset을 활용하여 ruptures 라이브러리를 구현해보겠습니다.

 

1) 먼저 ruptures 라이브러리를 설치해줍니다.

!pip install ruptures

 

 

2) 다음은 라이브러리와 데이터를 불러오고 기본적인 전처리와 시각화를 해줍니다.

# 1. 라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
import ruptures as rpt

# 2. 데이터 불러오기 및 전처리
df = pd.read_csv(url, parse_dates=['timestamp'], index_col='timestamp')
df = df.resample('1H').sum()
df = df.fillna(method='ffill')

# 3. 기본 시각화
plt.figure(figsize=(15, 4))
plt.plot(df.index, df['value'], color='steelblue', label='Taxi Demand')
plt.title("NYC Taxi Passenger Count (Hourly)", fontsize=14)
plt.xlabel("Time")
plt.ylabel("Passenger Count")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

 

잘 불러와졌음이 확인되었습니다.

 

 

3) 이제 pelt 알고리즘과 rbf 비용함수의 조합을 통해 Trend 및 평균의 변화를 포착해줍니다.

# 4. 변화점 탐지 (트렌드 + 평균 변화)
signal = df['value'].values
model = rpt.Pelt(model="rbf").fit(signal)
change_points = model.predict(pen=10)  # penalty 값으로 민감도 조절

# 5. 변화점 시각화
plt.figure(figsize=(15, 4))
plt.plot(df.index, signal, label='Taxi Demand', color='steelblue')
for cp in change_points[:-1]:  # 마지막은 시계열 끝이라 제외
    plt.axvline(df.index[cp], color='red', linestyle='--', alpha=0.7)
plt.title("NYC Taxi - Detected Change Points (Ruptures - RBF Model)")
plt.xlabel("Time")
plt.ylabel("Passenger Count")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

 

 

약 6분 정도의 시간이 소요되었고 다음과 같이 평균 또는 트렌드가 감소 또는 상승하는 부분들의 시점에 대해서 시각화 해주고 있음을 확인할 수 있습니다.

 

반응형

댓글