Pandas는 NumPy 기반의 데이터 분석용 라이브러리로,
시계열 데이터를 효율적으로 다룰 수 있는 구조를 제공한다.
import pandas as pd
import numpy as np
| 객체 | 형태 | 주요 특징 |
|---|---|---|
| Series | 1차원 | 인덱스 + 값 구조 |
| DataFrame | 2차원 | 행(Row) + 열(Column)로 구성된 테이블 |
# Series 예시
s = pd.Series([10, 20, 30], index=['A', 'B', 'C'])
# DataFrame 예시
df = pd.DataFrame({
'월': [1, 2, 3],
'매출': [250, 300, 420]
})
속성 및 메서드
df.info() # 데이터 개요
df.describe() # 요약 통계
df.isnull() # 결측값 확인
df.dtypes # 열별 데이터 타입
시계열 데이터에서는 누락된 날짜나 값이 자주 발생한다.
이때 Pandas의 결측 처리 기능이 중요하다.
df.fillna(method='ffill') # 이전 값으로 채우기
df.fillna(df.mean()) # 평균으로 채우기
df.dropna() # 결측값 제거
그룹별 통계나 집계는 시계열의 기간별 요약 통계 계산에 활용된다.
df.groupby('월')['매출'].mean()
df.groupby(['연도', '분기']).sum()
일반 연산
df['매출_증가율'] = df['매출'].pct_change()
df['매출_로그'] = np.log(df['매출'])
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)
이후 시계열 데이터는 CSV나 API(JSON) 등으로 로드된다.
시계열 분석의 핵심은 날짜를 인덱스로 사용하는 것이다.
dates = pd.date_range(start='2020-01-01', end='2020-12-31', freq='D')
| 파라미터 | 설명 |
|---|---|
start, end | 시작·종료 날짜 |
freq | 간격 (‘D’, ‘W’, ‘M’, ‘Q’, ‘A’) |
periods | 생성할 날짜 개수 |
pd.to_datetime(['2024/01/01', '2024-02-01', '2024.03.01'])
→ 다양한 문자열 포맷을 자동 인식해 Datetime 객체로 변환한다.
df = pd.read_csv('sales.csv')
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
이제 df의 인덱스가 DatetimeIndex로 바뀌어,
시간 단위로 접근·집계·시각화가 가능하다.
df.loc['2024-06'] # 특정 월
df['2024-06-01':'2024-06-10'] # 날짜 범위 슬라이싱
dt 접근자를 이용해 날짜의 구성요소를 추출한다.
df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
df['weekday'] = df.index.day_name()
→ 요일, 분기, 연도별 집계 및 시각화에 유용
시간 단위별로 데이터를 요약(집계)하거나 세분화할 때 사용한다.
df.resample('M').mean() # 월별 평균
df.resample('Q').sum() # 분기별 합계
df.resample('A').max() # 연도별 최대값
| 주기 코드 | 설명 | 예시 |
|---|---|---|
'D' | 일(day) 단위 | 일별 평균 |
'W' | 주(week) 단위 | 주간 매출 |
'M' | 월(month) 단위 | 월간 지표 |
'Q' | 분기(quarter) 단위 | 분기별 합계 |
'A' | 연도(year) 단위 | 연간 요약 |
결과 시각화
df.resample('M').mean()['매출'].plot(title='월별 평균 매출')
시간을 기준으로 데이터를 앞뒤로 이동시킨다.
예: 하루 전 대비 증감률 계산
df['prev'] = df['매출'].shift(1)
df['증감'] = df['매출'] - df['prev']
shift(n) → n일 뒤로 이동shift(-n) → n일 앞으로 이동시계열 노이즈를 줄이고 추세(Trend)를 확인할 때 필수적이다.
df['MA_7'] = df['매출'].rolling(window=7).mean() # 7일 이동평균
df['Expanding_Sum'] = df['매출'].expanding().sum()
| 함수 | 설명 |
|---|---|
.rolling(window) | 일정 구간 평균, 표준편차, 최대값 등 |
.expanding() | 누적 평균, 누적 합계 등 |
예시
df[['매출', 'MA_7']].plot(figsize=(12,6), title='7일 이동평균 비교')
시각화는 시간 축에서 변화의 패턴을 직관적으로 보여준다.
import matplotlib.pyplot as plt
df['매출'].plot(figsize=(12,6), color='royalblue')
plt.title('일별 매출 추세')
plt.xlabel('날짜')
plt.ylabel('매출')
서브플롯
df[['매출', 'MA_7']].plot(subplots=True, layout=(2,1), figsize=(10,6))
df[['제품A', '제품B', '제품C']].plot(figsize=(12,6))
plt.legend()
df.groupby(df.index.month)['매출'].mean().plot(kind='bar', color='orange')
→ 월별 평균 매출 변동을 시각화하여 계절적 패턴 탐색
monthly_avg = df['매출'].resample('M').mean()
monthly_avg.rolling(window=3).mean().plot(title='3개월 이동평균')
df['2023'].resample('Q').mean().plot(label='2023')
df['2024'].resample('Q').mean().plot(label='2024')
plt.legend()
예시: 매출 데이터 예측을 위한 준비 단계
interpolate, fillna)df['매출_rolling'] = df['매출'].rolling(30).mean()
df.plot(y=['매출', '매출_rolling'], figsize=(10,5))
Set 1 연습: Datetime 인덱스 생성과 리샘플링
Set 2 연습: 이동평균, 시각화, 추세 비교 실습
| 상황 | 사용 메서드 | 목적 |
|---|---|---|
| 일별 데이터 → 월별 집계 | .resample('M').sum() | 데이터 요약 |
| 누락된 날짜 채우기 | .asfreq('D').fillna(method='ffill') | 결측 보간 |
| 변동 완화 및 추세 시각화 | .rolling(7).mean() | 이동평균 |
| 전일 대비 증감 분석 | .shift(1) | 변화량 계산 |
| 항목 | 주요 내용 |
|---|---|
| DatetimeIndex | 날짜 기반 인덱스로 슬라이싱, 연도·월별 연산 가능 |
| Resampling | 시간 주기별 요약 통계 계산 |
| Shift | 이전 값 비교, 시차 데이터 생성 |
| Rolling / Expanding | 이동평균·누적합으로 추세 및 분산 확인 |
| 시각화 | 시간 축 기반 변화 추이 시각적으로 파악 |