본문 바로가기

공부/판다스(Pandas)

Pandas로 배우는 시계열 데이터 분석/날짜 및 시간 핸들링과 리샘플링 기법

시계열 데이터는 시간의 흐름에 따라 변하는 데이터를 말합니다. 예를 들어, 주식 가격 변동, 일별 매출 데이터, 기후 변화 데이터 등이 이에 해당합니다. 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) 등 다양한 심화 분석 기법도 다뤘습니다 .

 

시계열 데이터는 우리가 일상에서 많이 접하는 데이터입니다. 주식 시장의 변화, 일별 매출, 기후 데이터 등 다양한 분야에서 시계열 데이터를 활용해 분석할 수 있습니다.