안녕하세요! 오늘은 본캠프 52일차입니다! 🥒
시계열 라이브세션 2회차
통계적 시계열 모델 전처리
statsmodels 라이브러리
시계열 데이터를 추세, 계절성, 불규칙성 성분으로 나누어 plot 그리는 작업

period ⇒ 1년 기준으로 주기를 나타내는 변수(월별 데이터면 12, 주별 데이터면 52, 일별데이터면 365)
Additive (덧셈 모델)
시계열 데이터=추세+계절성+잔차 (변화량이 일정한 크기로 발생하는 데이터에 적합)
즉, 계절성의 크기가 일정한 경우에 사용
multiplicative(곱셈 모델)
시계열 데이터=추세×계절성×잔차 (분들이 곱해지는 모델로, 변화가 비율적으로 증가 데이터에 적합)
즉, 계절성이 증가하거나 감소하는 경우에 사용
잔차 (Residuals)
원본 데이터에서 추세와 계절성을 제거한 후 남는 변동성 만약, 잔차(Residual)에 특정 패턴이 보이면 추가적인 계절성이나 주기성이 존재할 가능성이 있음
비정상성과 정상성
통계적 모델은 비정상 데이터를 정상성 데이터로 변환해야함 단, 통계적 모델이 아닌 경우, 정상성 데이터로 변환하지 않아도 됨
- 비정상성 데이터란?
- 시간이 지날수록 데이터의 평균(Trend)이 증가/감소하는 경우
- 계절성(Seasonality) 이 포함되어 특정 주기마다 패턴이 달라지는 경우
- 시간이 지날수록 데이터의 변동성(Variance)이 증가하는 경우
- 추세(Trend)나 계절성이 없고, 데이터의 평균과 분산이 일정한 경우
- 주어진 시간 간격에서 변동성이 안정적이며 예측 가능한 수준
- 시계열의 통계적 특징(평균, 분산, 자기 상관)이 변하지 않는다. (일정한 패턴을 유지)
- 랜덤한 움직임을 가지지만, 시점마다 유사하게 동작하는 특징이 있어 시간에 따라 안정된 분포를 갖는다.정상성 데이터란?
1) 모든 시점 t에 대해 평균이 같다.
2) 모든 시점 t에 대해 분산이 같다.
3) 자기 공분산 (자기 상관관계)이 시간이 아닌 시차에 의존한다.
정상적이지 않은 시계열 데이터의 경우?
- 로그 변환: 분산이 커지는 경향을 가지는 시계열을 안정화
- 차분: 추세를 제거하는 효과
3. 왜 비정상성데이터를 정상성 데이터로 변화해야할까? 시계열 데이터가 정상성을 띠고 있어야 ARIMA 분석을 통해 미래 시계열 값을 예측할 수 있음 시계열 데이터가 비정상성을 띤다면 평균과 분산이 다르기 때문에 임의의 시점 t-1, t에서 얻은 모델은 미래를 예측 할 수 없게 됨
4. 비정상성 데이터를 정상성 데이터로 변화하는 방법
1) 차분
트렌드(추세)를 제거하여 데이터를 정상성으로 만드는 방법
import pandas as pd
# 예시 시계열 데이터 생성
data = {'value': [100, 102, 105, 110, 108, 115, 120]}
df = pd.DataFrame(data)
# 첫 번째 차분 (1st differencing)
df['1st_diff'] = df['value'].diff()
# 두 번째 차분 (2nd differencing)
df['2nd_diff'] = df['1st_diff'].diff()
print(df)
2) 로그 변환
지수적 성장이나 비대칭적인 분포를 선형적이고 정규분포에 가까운 형태로 변환.
import pandas as pd
import numpy as np
# 예시 시계열 데이터 생성
data = {'value': [100, 120, 140, 160, 180, 200, 220]}
df = pd.DataFrame(data)
# 로그 변환
df['log_value'] = np.log(df['value'])
print(df)
3) 로그 차분
로그 차분(Log Differencing) 은 시계열 데이터에서 트렌드(추세)와 변동성(Variance)을 동시에 안정화하기 위해 사용하는 변환 기법
import pandas as pd
import numpy as np
# 예시 시계열 데이터 생성
data = {'value': [100, 120, 140, 160, 180, 200, 220]}
df = pd.DataFrame(data)
# 로그 변환
df['log_value'] = np.log(df['value'])
# 로그 차분
df['log_diff'] = df['log_value'].diff()
print(df)
4)계절 차분
일정한 주기로 반복되는 계절성(Seasonality)을 제거하는 방법
import pandas as pd
import matplotlib.pyplot as plt
# 예제 데이터 (월별 데이터, 계절성 포함)
data = {'Month': pd.date_range(start='2020-01', periods=36, freq='M'),
'Sales': [200 + 20 * ((i % 12) // 3) + i*2 for i in range(36)]} # 계절성 패턴 추가
df = pd.DataFrame(data).set_index('Month')
# 계절 차분 적용 (s=12개월 주기)
df['Seasonal_Diff'] = df['Sales'].diff(periods=12)
ARIMA모델
ACF (자기상관 함수): 시계열 데이터의 특정 시점과 이전 시점 간의 상관 관계를 나타내는 함수입니다. 시계열 데이터의 전체적인 패턴을 파악하는 데 유용하며, 데이터가 얼마나 주기적으로 반복되는지를 알 수 있습니다.
PACF (부분 자기상관 함수): 자기상관 함수에서 단순히 이전의 시점 간 상관만을 고려하는 것이 아니라, 특정 시점의 값이 이전의 값들과 어떻게 관계가 있는지를 고려하여 직접적인 상관만을 추출하는 함수입니다.
ARIMA 모델
ARIMA 모델은 시계열 데이터의 자기상관성(AR), 차분(D), 이동 평균(MA)을 이용해 미래 값을 예측하는 시계열 통계 모델입니다.
ARIMA(p, d, q)가 중요 d : 시계열 plot을 보고 정상성 여부를 확인하고, 차분을 진행하고, 차분 후의 plot을 보고 여부를 확인하는 프로세스로 진행한다.
1차 차분으로도 트렌드(추세)가 완전히 제거되지 않는 경우 추가적으로 2차 차분을 적용하여 데이터의 평균과 분산을 일정하게 만듬
p, q의 경우 보통 ACF와, PACF를 보고 결정
p: PACF에서 첫 번째 유의미한 지점(즉, 자기상관이 급격히 0으로 떨어지는 시점)을 p 값
q: ACF에서 첫 번째 유의미한 지점(즉, 자기상관이 급격히 0으로 떨어지는 시점)을 q 값
결론 : ARIMA(1, 2, 0) ACF와 PACF를 통해서 비정상성 분석이 가능
- ACF 값이 느리게 감소(서서히 감소)하는 패턴을 보임 ⇒ 트렌드(추세, Trend)나 계절성을 포함하고 있을 가능성이 높음
- 여러 시차(Lag)에서 지속적으로 유의미한 값 → 추세(Trend) 제거 필요 특정 주기마다 강한 피크를 가짐 → 계절성(Seasonality) 제거 필요
AR(p)
현재 값이 과거 값들의 선형 결합으로 표현되는 모델(추세가 강한데이터)
MA(q)
현재 값이 과거 오차(White noise)의 선형 결합으로 표현되는 모델 과거의 오차를 기반으로 미래를 예측
AR(p)+MA(q)
자기회귀(AR) + 이동 평균(MA) 요소를 동시에 반영
SARIMA 모델
✅ 정의:
- ARIMA 모델에 계절성(Seasonality)을 추가한 확장 모델
✅ 수식:
- (p, d, q): ARIMA의 일반적인 차수
- (P, D, Q, s): 계절성 차수
- P: 계절성 자기회귀(Seasonal AR)
- D: 계절 차분(Seasonal Differencing)
- Q: 계절성 이동 평균(Seasonal MA)
- s: 계절 주기(예: 월별 데이터 → 12, 주별 데이터 → 7)
- s (계절 주기) 결정
- 데이터가 주별이면 s=52, 월별이면 s=12 사용
- D (계절 차분 차수) 찾기
- 계절 주기(s)만큼 차분 수행 후 정상성이 확보되면 D=1
- 필요하면 추가 차분
- P, Q 찾기
- 계절 차분 후, ACF/PACF에서 계절 패턴을 분석하여 결정
- 계절성이 있는 데이터에 적합
- 비정상성 + 계절성까지 해결 가능
Streamlit 라이브 세션 1회차
Streamlit이란?
Python을 활용한 간단한 웹앱 제작 라이브러리! Streamlit은 Python을 사용하여 데이터 애플리케이션을 빠르고 쉽게 만들 수 있게 해주는 오픈소스 웹 애플리케이션 프레임워크입니다. 주로 데이터 과학자, 머신러닝 엔지니어, 그리고 데이터 분석가들이 간단한 Python 코드를 통해 데이터 시각화, 대시보드, 인터랙티브 웹 애플리케이션을 개발할 수 있도록 설계되었습니다.
Streamlit의 장점!
- 간단한 사용법: 복잡한 웹 개발 기술 없이도 Python 코드만으로 쉽게 웹 애플리케이션을 만들 수 있습니다. Streamlit은 명령형 프로그래밍 모델을 사용하여 직관적으로 애플리케이션을 작성할 수 있습니다.
- 실시간 업데이트: 코드가 수정될 때마다 애플리케이션이 자동으로 업데이트되므로, 빠른 프로토타이핑과 개발이 가능합니다.
- 대화형 위젯: 슬라이더, 버튼, 셀렉트 박스 등의 다양한 대화형 위젯을 제공하여 사용자와의 상호작용을 쉽게 구현할 수 있습니다.
- 데이터 시각화: Matplotlib, Plotly, Altair 등 다양한 데이터 시각화 라이브러리와의 호환성을 갖추고 있어, 데이터를 손쉽게 시각화할 수 있습니다.
- 배포 용이성: Streamlit 앱은 간단히 터미널에서 실행할 수 있으며, Streamlit Cloud를 통해 쉽게 배포할 수 있습니다.
Tableau vs Streamlit
- 각 툴의 특성
- Tableau: 시각화 및 대시보드 생성에 강점이 있는 BI(Business Intelligence) 도구로, 드래그 앤 드롭 방식으로 쉽게 시각화를 구성할 수 있습니다. 다양한 데이터 소스에 손쉽게 연결하고, 경영자나 실무자를 위한 직관적인 대시보드를 만드는 데 최적화되어 있습니다.
- Streamlit: Python 기반으로, 데이터 사이언스 및 머신러닝 모델을 신속히 시각화하고 앱 형태로 보여주기에 특화된 프레임워크입니다. 테이블이나 간단한 차트뿐 아니라 모델 예측 결과, 사용자 입력에 따른 실시간 분석 등을 손쉽게 구현할 수 있습니다.
- 왜 Tableau를 배운 뒤 Streamlit까지 배워야 할까?
- 고급 데이터 분석/모델링 확장성: Tableau는 BI 관점의 시각화에 탁월하지만, 머신러닝 모델의 배포나 대화형 앱 구성에는 한계가 있을 수 있습니다. Streamlit은 Python 코드를 통해 모델 실행부터 결과 시각화까지를 하나의 앱으로 통합할 수 있습니다.
- 유연한 커스터마이징: Streamlit은 직접 Python 코드를 작성하기 때문에, 원하는 대로 분석 프로세스나 시각화를 커스터마이징하기 쉽습니다.
- 빠른 프로토타이핑 & 배포: Streamlit으로는 간단한 코드만으로 웹 앱을 곧바로 만들고, 공유할 수 있습니다. 모델의 데모나 데이터 분석 결과를 신속하게 다른 사람들과 공유할 수 있죠.
오늘도 수고하셨습니다!!
'2025 내일배움캠프 QAQC_2기' 카테고리의 다른 글
| 2025 내일배움캠프 QAQC_2기 본캠프 54일차 (1) | 2025.07.28 |
|---|---|
| 2025 내일배움캠프 QAQC_2기 본캠프 53일차 (3) | 2025.07.25 |
| 2025 내일배움캠프 QAQC_2기 본캠프 51일차 (1) | 2025.07.23 |
| 2025 내일배움캠프 QAQC_2기 본캠프 50일차 (0) | 2025.07.22 |
| 2025 내일배움캠프 QAQC_2기 본캠프 49일차 (1) | 2025.07.21 |