1️⃣ Pandas 기본 구조 복습

Pandas는 NumPy 기반의 데이터 분석용 라이브러리로,
시계열 데이터를 효율적으로 다룰 수 있는 구조를 제공한다.

import pandas as pd
import numpy as np

(1) Series와 DataFrame

객체형태주요 특징
Series1차원인덱스 + 값 구조
DataFrame2차원행(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       # 열별 데이터 타입

(2) 결측값 처리

시계열 데이터에서는 누락된 날짜나 값이 자주 발생한다.
이때 Pandas의 결측 처리 기능이 중요하다.

df.fillna(method='ffill')   # 이전 값으로 채우기
df.fillna(df.mean())        # 평균으로 채우기
df.dropna()                 # 결측값 제거

(3) GroupBy와 연산

그룹별 통계나 집계는 시계열의 기간별 요약 통계 계산에 활용된다.

df.groupby('월')['매출'].mean()
df.groupby(['연도', '분기']).sum()

일반 연산

df['매출_증가율'] = df['매출'].pct_change()
df['매출_로그'] = np.log(df['매출'])

(4) 데이터 입출력

df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)

이후 시계열 데이터는 CSV나 API(JSON) 등으로 로드된다.


2️⃣ 시계열 데이터의 본격 시작


(1) DatetimeIndex 생성

시계열 분석의 핵심은 날짜를 인덱스로 사용하는 것이다.

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 객체로 변환한다.


(2) 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']  # 날짜 범위 슬라이싱

(3) Datetime 속성 활용

dt 접근자를 이용해 날짜의 구성요소를 추출한다.

df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
df['weekday'] = df.index.day_name()

→ 요일, 분기, 연도별 집계 및 시각화에 유용


3️⃣ 리샘플링(Resampling)

시간 단위별로 데이터를 요약(집계)하거나 세분화할 때 사용한다.

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='월별 평균 매출')

4️⃣ 시계열 이동(Shift)

시간을 기준으로 데이터를 앞뒤로 이동시킨다.
예: 하루 전 대비 증감률 계산

df['prev'] = df['매출'].shift(1)
df['증감'] = df['매출'] - df['prev']
  • shift(n) → n일 뒤로 이동
  • shift(-n) → n일 앞으로 이동

5️⃣ 이동 평균(Rolling)과 누적(Expanding)

시계열 노이즈를 줄이고 추세(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일 이동평균 비교')

6️⃣ 시계열 데이터 시각화

시각화는 시간 축에서 변화의 패턴을 직관적으로 보여준다.

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))

(1) 다중 시계열 비교

df[['제품A', '제품B', '제품C']].plot(figsize=(12,6))
plt.legend()

(2) 계절성(Seasonality) 시각화

df.groupby(df.index.month)['매출'].mean().plot(kind='bar', color='orange')

→ 월별 평균 매출 변동을 시각화하여 계절적 패턴 탐색


7️⃣ 실습 예제

(1) 리샘플링과 이동평균 결합

monthly_avg = df['매출'].resample('M').mean()
monthly_avg.rolling(window=3).mean().plot(title='3개월 이동평균')

(2) 기간별 비교

df['2023'].resample('Q').mean().plot(label='2023')
df['2024'].resample('Q').mean().plot(label='2024')
plt.legend()

8️⃣ 시계열 실전 프로젝트 연습

예시: 매출 데이터 예측을 위한 준비 단계

  1. CSV 파일 로드 후 Datetime 변환
  2. 결측값 처리 (interpolate, fillna)
  3. 월/분기 단위로 리샘플
  4. Rolling 평균으로 변동성 완화
  5. 추세 시각화 및 이상치(outlier) 탐색
df['매출_rolling'] = df['매출'].rolling(30).mean()
df.plot(y=['매출', '매출_rolling'], figsize=(10,5))

Set 1 연습: Datetime 인덱스 생성과 리샘플링
Set 2 연습: 이동평균, 시각화, 추세 비교 실습


9️⃣ 실무 적용 포인트

상황사용 메서드목적
일별 데이터 → 월별 집계.resample('M').sum()데이터 요약
누락된 날짜 채우기.asfreq('D').fillna(method='ffill')결측 보간
변동 완화 및 추세 시각화.rolling(7).mean()이동평균
전일 대비 증감 분석.shift(1)변화량 계산

🔍 핵심 요약

항목주요 내용
DatetimeIndex날짜 기반 인덱스로 슬라이싱, 연도·월별 연산 가능
Resampling시간 주기별 요약 통계 계산
Shift이전 값 비교, 시차 데이터 생성
Rolling / Expanding이동평균·누적합으로 추세 및 분산 확인
시각화시간 축 기반 변화 추이 시각적으로 파악
profile
okorion's Tech Study Blog.

0개의 댓글