오늘은 시계열 데이터를 모델이 이해할 수 있는 Feature로 변환하는 기법 + 실전 KPI & ML 예측 대시보드를 Streamlit으로 만드는 법을 배웠다.
[ 시계열 Feature Engineering ]
1. 왜 Feature로 변환해야 하는가?
- 사람은 그래프만 봐도 "어? 5분 전보다 압력이 올랐네?", "최근에 변동이 좀 심한데?" 하고 한눈에 파악함.
- 하지만 모델은 눈이 없어서 현재 행의 숫자 하나밖에 못 봄!
- 따라서 [시간의 흐름 / 최근 변동성 / 과거 상태] 같은 정보들을 직접 Feature로 만들어서 주입해 줘야 함.
- 주의: 컬럼을 무작정 많이 만드는 게 장땡이 아님! 설비 반응 시간과 도메인 맥락에 맞는 과거 정보를 똑똑하게 선택하는 게 핵심.
2. 예측 문제 정의의 4요소
모델을 만들기 전에 이 4가지를 무조건 먼저 정의해야 함.
| 요소 | 정의 | 설명 및 주의사항 |
| Target | 무엇을 예측할 것인가? | df["sensor"].shift(-5)처럼 미래 값으로 생성 (미래 정보 누수 주의!) |
| Forecast Horizon | 얼마나 먼 미래를 예측할 것인가? | 짧으면 현재 값 영향이 크고, 길면 장기 추세가 중요해짐 (현장 조치 가능 시간과 연결 필수) |
| Granularity | 한 행이 의미하는 시간 단위는? | 초/분/시간 단위 등 수집 주기에 맞춰 설정 |
| Input Window | 과거 얼마나 긴 구간을 볼 것인가? | 모델 학습 및 Feature 생성에 쓸 연속된 과거 데이터 길이 |
3. 핵심 Feature 3대장 (Lag, Difference, Rolling)
| Feature 종류 | 개념 및 의미 | 주요 활용 및 특징 |
| Lag Feature | 과거 특정 시점의 값 (.shift(k)) | 과거에 얼마였는가? (자기 자신의 과거값 or 타 센서의 반응 시차 이용) |
| Difference | 현재 값 - 과거 값 | 얼마나 변했는가? (상승/하락 방향과 변화 크기 파악, 정상성 확보) |
| Rolling Feature | 최근 구간의 이동 통계량 (Mean, Std, Range 등) | 최근 공정 수준 및 불안정성 파악 (Window 길이는 센서 반응 속도에 맞춤) |
💡Difference만 쓰면 "현재 절대적인 수준" 자체를 잃어버리므로, 보통 [현재값 + Lag + Difference]를 함께 조합해서 씀
4. 상태형 Feature & 센서 간 관계
- 단순히 센서 수치만 보는 게 아니라, 현재 가동 상태(COMP_last), 가동 비율(COMP_on_ratio), "상태가 방금 막 바뀌었는지(COMP_change)" 같은 조건도 중요한 Feature가 됨
- 다변량 센서 데이터에서는 평소에 같이 움직이던 센서 간 상관관계가 깨지는 것 자체가 이상 신호(Anomaly)의 힌트!
5. 시계열 데이터 분리 & 평가
- 시간 순서 유지: 시계열은 절대 랜덤 셔플 금지! 미래 데이터로 과거를 예측하는 누수가 생김(과거 80% Train, 최근 20% Test)
- Gap (Embargo): Forecast Horizon이 Train/Test 경계를 넘어가면 데이터 누수가 생길 수 있으므로 경계 부분 데이터를 살짝 비워둠
- Walk-forward Validation: 시간에 따른 성능 변화를 보기 위해 학습 구간을 뒤로 늘려가며 여러 번 검증
- Baseline 모델: 짧은 Horizon에서는 "현재 값이 미래에도 유지된다"는 Naive Forecast가 생각보다 엄청 강력함. 복잡한 ML 모델은 무조건 이 Naive baseline보다 성능이 잘 나와야 쓸 모가 있음!
평가지표 3종 비교
| 지표 | 장점 | 단점 / 주의사항 |
| MAE | 원본 데이터와 단위가 같아서 현장 직관적 해석 쉬움 | 큰 오차에 특별한 가중치를 주지 않음 |
| RMSE | 제곱을 취하므로 큰 오차에 더 큰 패널티를 부여 | 이상치에 유독 민감함 |
| MAPE | 퍼센트(%) 비율 오차라 상대적 비교 가능 | actual 값이 0 근처면 값이 폭발함 (모터 전류 등에 부적합) |
[ Streamlit 실전 대시보드 구축 ]
1. 멀티페이지 모듈화 구조
하나의 파일에 몰아넣지 않고, 역할별로 깔끔하게 분리
main.py (페이지 라우팅 및 공통 로직)
➔ dashboard_page.py (KPI 시각화 및 현황 모니터링)
➔ prediction_page.py (ML 모델 기반 결함/이상 예측)
2. KPI 대시보드 개발 패턴
- @st.cache_data로 CSV 데이터 로딩 속도 최적화
- 사이드바 연월 선택 시, 지난달(df_prev)과 이번 달(df_selected)을 계산해 st.metric의 delta(증감율) 속성으로 한눈에 비교
- Plotly의 go.Indicator 게이지 차트로 목표 대비 달성률 시각화
3. ML 예측 대시보드 개발 패턴
- 사전 학습된 머신러닝 모델(.pkl)을 @st.cache_data로 불러와서 재로드 방지
- st.form()을 사용해 슬라이더, 입력창 등의 값들을 묶어서 [예측 실행] 버튼 한 번으로 폼 제출 처리 (매번 재실행되는 현상 방지)
- model.predict_proba()로 결함 확률을 계산하고, 결과에 따라 st.success / st.error 알림창 구분 출력
- 입력된 센서값이 전체 데이터 분포 중 어디 위치에 있는지 히스토그램 위 빨간 점선으로 표시해 직관성 극대화
~ 정리 ~
- 시계열 모델링에서 중요한 것은 모델이 사람처럼 과거 흐름을 알아볼 수 있게 Feature(Lag, Difference, Rolling)를 만드는 것
- 오늘 만든 Streamlit KPI 대시보드에 오늘 배운 시계열 Feature(Rolling Mean, Difference 변동폭 등)를 그대로 얹으면, 실무에서 바로 쓸 수 있는 실시간 조기경보 대시보드가 되겠죠??
- 프로젝트 때 이 두 파트를 깔끔하게 엮어서 포트폴리오로 만들어야겠다

'Today I Learned' 카테고리의 다른 글
| [내일배움캠프 QA/QC 6기] TIL #055 (1) | 2026.07.31 |
|---|---|
| [내일배움캠프 QA/QC 6기] TIL #054 (0) | 2026.07.29 |
| [내일배움캠프 QA/QC 6기] TIL #052 (0) | 2026.07.27 |
| [내일배움캠프 QA/QC 6기] TIL #051 (0) | 2026.07.24 |
| [내일배움캠프 QA/QC 6기] TIL #050 스트림릿 입문 (0) | 2026.07.23 |