시계열 데이터는 시간의 흐름에 따라 변하는 데이터를 말합니다. 예를 들어, 주식 가격 변동, 일별 매출 데이터, 기후 변화 데이터 등이 이에 해당합니다. Pandas는 이러한 시계열 데이터를 쉽게 처리하고 분석할 수 있는 다양한 기능을 제공합니다. 이번 포스팅에서는 Pandas의 강력한 기능인 pd.to_datetime()과 resample() 함수를 사용해 시계열 데이터를 다루는 방법을 소개하겠습니다. 이 과정을 통해 날짜/시간 데이터를 효과적으로 처리하고, 주기별로 데이터를 요약하는 방법을 배우게 됩니다 .
1. 날짜/시간 데이터 핸들링
먼저, 데이터를 분석하기 전에 날짜나 시간을 정확히 다루는 것이 중요합니다. Pandas에서는 pd.to_datetime() 함수를 사용하여 문자열로 된 날짜 데이터를 날짜/시간 형식으로 변환할 수 있습니다.
1.1 pd.to_datetime() 함수로 날짜 변환하기
날짜나 시간이 포함된 데이터를 다룰 때, 종종 날짜가 문자열 형태로 제공됩니다. 이런 데이터를 Pandas에서 처리하려면 pd.to_datetime() 함수를 사용해 날짜로 변환해야 합니다.
import pandas as pd
# 샘플 데이터 생성
data = {
'Date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'Sales': [200, 150, 300, 250]
}
df = pd.DataFrame(data)
# 문자열 형식의 'Date'를 시계열 데이터로 변환
df['Date'] = pd.to_datetime(df['Date'])
print(df)
결과:
Date Sales
0 2024-01-01 200
1 2024-01-02 150
2 2024-01-03 300
3 2024-01-04 250
여기서 pd.to_datetime() 함수는 날짜를 문자열에서 Pandas가 인식할 수 있는 날짜/시간 형식으로 변환해 줍니다. 이 과정을 통해 데이터의 날짜를 효과적으로 처리할 수 있게 됩니다 .
1.2 날짜를 인덱스로 설정하기
시계열 데이터를 분석할 때, 날짜를 인덱스로 설정하면 더 쉽게 데이터를 다룰 수 있습니다. 날짜를 기준으로 데이터를 정렬하거나 날짜 범위를 선택하는 등 여러 작업을 간편하게 처리할 수 있습니다.
# 'Date'를 인덱스로 설정
df.set_index('Date', inplace=True)
print(df)
결과:
Sales
Date
2024-01-01 200
2024-01-02 150
2024-01-03 300
2024-01-04 250
이제 'Date'가 데이터프레임의 인덱스가 되어, 날짜를 기준으로 데이터를 분석할 수 있습니다. 날짜를 인덱스로 설정하면 특정 날짜의 데이터를 쉽게 선택할 수 있고, 리샘플링 등 다양한 분석도 편리해집니다 .
2. 리샘플링 (Resampling)
리샘플링은 시계열 데이터를 다른 주기로 변환하는 것을 말합니다. 예를 들어, 일별 데이터를 주별로 변환하거나, 월별로 요약할 수 있습니다. 이 과정은 Pandas의 resample() 함수를 통해 간단하게 처리할 수 있습니다.
2.1 일별 데이터를 주별로 리샘플링하기
예를 들어, 일별 매출 데이터를 주별로 리샘플링하고 싶다면, resample('W') 함수를 사용하면 됩니다. 여기서는 각 주의 매출 합계를 계산해 보겠습니다.
# 일별 데이터를 주별로 리샘플링하여 합계 계산
weekly_sales = df.resample('W').sum()
print(weekly_sales)
결과:
Sales
Date
2024-01-07 900
resample('W')**는 데이터를 주간(Weekly) 단위로 묶어줍니다. 그 후 sum() 함수를 사용하여 주별 매출 합계를 계산했습니다. 이 예시에서는 첫 번째 주(1월 1일부터 1월 7일까지)의 매출 합계가 900입니다.
2.2 리샘플링하여 평균값 계산하기
리샘플링을 이용해 합계뿐만 아니라 평균값도 계산할 수 있습니다. 아래는 주별 평균 매출을 계산한 예시입니다.
# 주별 평균 매출 계산
weekly_avg_sales = df.resample('W').mean()
print(weekly_avg_sales)
결과:
Sales
Date
2024-01-07 225.0
이번에는 mean() 함수를 사용해 주별 평균 매출을 계산했습니다. 첫 번째 주의 평균 매출은 225로 계산되었습니다. 이처럼 다양한 방식으로 데이터를 요약할 수 있습니다 .
2.3 리샘플링 주기 설정하기
Pandas의 resample() 함수는 다양한 주기를 지원합니다. 아래는 자주 사용되는 주기 코드입니다:
- 'D': 일별 (Daily)
- 'W': 주별 (Weekly)
- 'M': 월별 (Monthly)
- 'Q': 분기별 (Quarterly)
- 'Y': 연간 (Yearly)
아래는 월별로 리샘플링하여 매출 합계를 계산하는 예시입니다.
# 월별로 리샘플링하여 합계 계산
monthly_sales = df.resample('M').sum()
print(monthly_sales)
결과:
Sales
Date
2024-01-31 900
여기서는 일별 데이터를 월별로 리샘플링하여 1월 한 달간의 매출 합계를 계산했습니다. 이처럼 리샘플링을 통해 데이터를 다양한 주기로 변환할 수 있습니다 .
3. 시계열 데이터 주기 분석
시계열 데이터는 일정한 주기를 따라 변동하는 경우가 많습니다. 예를 들어, 특정 계절에 매출이 급증하거나 매주 특정 요일에 매출이 높을 수 있습니다. 이러한 주기를 분석하면 더 나은 인사이트를 얻을 수 있습니다.
3.1 이동 평균 (Moving Average)
이동 평균은 일정 기간 동안의 평균값을 계산하여 데이터의 변동성을 줄이는 데 사용됩니다. 이를 통해 데이터의 추세를 더 쉽게 파악할 수 있습니다.
# 2일 간 이동 평균 계산
df['Moving_Avg'] = df['Sales'].rolling(window=2).mean()
print(df)
결과:
Sales Moving_Avg
Date
2024-01-01 200 NaN
2024-01-02 150 175.0
2024-01-03 300 225.0
2024-01-04 250 275.0
rolling(window=2)는 2일 동안의 평균값을 계산합니다. 이를 통해 매일의 매출 변동을 줄이고, 전반적인 추세를 더 명확하게 파악할 수 있습니다 .
3.2 누적 합계 (Cumulative Sum)
누적 합계는 데이터를 순차적으로 더해 가는 방식으로 계산됩니다. 예를 들어, 특정 기간 동안의 매출의 누적 합을 계산하여 기간 전체 동안의 누적된 성과를 확인할 수 있습니다.
# 누적 합계 계산
df['Cumulative_Sum'] = df['Sales'].cumsum()
print(df)
결과:
Sales Cumulative_Sum
Date
2024-01-01 200 200
2024-01-02 150 350
2024-01-03 300 650
2024-01-04 250 900
cumsum() 함수는 각 날짜별로 매출의 누적 합계를 계산합니다. 이를 통해 특정 기간 동안의 누적 매출을 파악할 수 있습니다.
3.3 누적 곱 (Cumulative Product)
누적 곱은 데이터를 순차적으로 곱해 가는 방식으로 계산됩니다. 이 기법은 금융 분야에서 연속된 기간 동안의 수익률 계산 등에 유용하게 사용됩니다.
# 누적 곱 계산
df['Cumulative_Product'] = (df['Sales'] / df['Sales'].iloc[0]).cumprod()
print(df)
결과:
Sales Cumulative_Product
Date
2024-01-01 200 1.000000
2024-01-02 150 0.750000
2024-01-03 300 1.500000
2024-01-04 250 1.875000
cumprod() 함수는 첫 번째 값과 비교하여 각 날짜별로 연속적인 변화량(배율)을 계산합니다. 예를 들어, 매출이 50% 증가하거나 감소하는 상황을 시각화하는 데 사용할 수 있습니다.
3.4 차분 (Differencing)
차분은 데이터의 변화를 계산하는 방법입니다. 특정 시간 간격마다 값의 차이를 구해, 데이터의 변동성을 더 자세히 분석할 수 있습니다. 이는 데이터의 추세(Trend)를 제거하고 계절성이나 변동성만을 분석할 때 유용합니다.
# 1일 차분 계산
df['Difference'] = df['Sales'].diff()
print(df)
결과:
Sales Difference
Date
2024-01-01 200 NaN
2024-01-02 150 -50.0
2024-01-03 300 150.0
2024-01-04 250 -50.0
diff() 함수는 연속된 값 간의 차이를 계산합니다. 이를 통해 일일 매출의 변화를 파악할 수 있습니다. 예를 들어, 매출이 증가하거나 감소한 정도를 쉽게 확인할 수 있습니다
3.5 지수 가중 이동 평균 (Exponential Moving Average, EMA)
지수 가중 이동 평균은 최근 데이터에 더 높은 가중치를 부여하여 트렌드를 분석하는 방법입니다. 단순 이동 평균과는 달리, EMA는 과거보다 최신 데이터에 더 집중하는 방식입니다.
# 지수 가중 이동 평균 계산
df['EMA'] = df['Sales'].ewm(span=2, adjust=False).mean()
print(df)
결과:
Sales EMA
Date
2024-01-01 200 200.0
2024-01-02 150 162.5
2024-01-03 300 246.1
2024-01-04 250 247.0
ewm() 함수는 지수 가중 이동 평균을 계산합니다. 이 방법은 최신 데이터에 더 큰 가중치를 부여하여 최근의 변동을 더 민감하게 반영합니다.
3.6 상관관계 분석 (Correlation)
시계열 데이터 간의 상관관계를 분석하여 두 데이터가 얼마나 비슷하게 움직이는지 확인할 수 있습니다. 예를 들어, 매출과 광고비의 상관관계를 계산하여 광고비가 매출에 미치는 영향을 분석할 수 있습니다.
# 상관관계 계산
correlation = df['Sales'].corr(df['Moving_Avg'])
print(correlation)
corr() 함수는 두 데이터 간의 상관관계를 계산합니다. 상관계수 값이 1에 가까울수록 두 데이터는 비슷한 방향으로 움직이며, -1에 가까울수록 반대 방향으로 움직입니다
마무리
이번 포스팅에서는 Pandas를 사용해 시계열 데이터를 효율적으로 분석하는 다양한 방법을 살펴보았습니다. 먼저, pd.to_datetime()을 사용해 날짜 데이터를 처리하고, resample() 함수로 주기별로 데이터를 요약하는 방법을 배웠습니다. 또한, 이동 평균을 활용해 데이터의 변동성을 줄이고 추세를 파악하는 방법뿐만 아니라, 누적 합계, 차분, 지수 가중 이동 평균(EMA) 등 다양한 심화 분석 기법도 다뤘습니다 .
시계열 데이터는 우리가 일상에서 많이 접하는 데이터입니다. 주식 시장의 변화, 일별 매출, 기후 데이터 등 다양한 분야에서 시계열 데이터를 활용해 분석할 수 있습니다.
'공부 > 판다스(Pandas)' 카테고리의 다른 글
Pandas와 함께 사용하면 좋은 라이브러리(NumPy, Matplotlib, Seaborn) (0) | 2024.10.23 |
---|---|
상관관계 분석의 다양한 방법/데이터 간의 관계를 이해하는 기법들 (1) | 2024.10.20 |
Pandas로 배우는 기본 통계 함수와 심화 분석 함수 활용법 (0) | 2024.10.18 |
Pandas로 배우는 피벗 테이블과 교차 테이블/ 데이터 요약 및 관계 분석 (0) | 2024.10.17 |
Pandas로 배우는 데이터 그룹화와 집계/효율적인 데이터 분석 방법 (0) | 2024.10.16 |