시계열 분석에서 이동평균(Moving Average)과 이동합계(Moving Sum)은 데이터의 변동성을 줄이거나 패턴을 더 잘 이해하기 위해 자주 사용되는 기법이다. R의 zoo
패키지의 rollapply()
함수는 이러한 계산을 쉽게 할 수 있게 도와준다. 이 글에서는 rollapply()
를 활용해 이동평균과 이동합계를 계산하는 방법을 설명한다.
1. zoo
패키지 소개
zoo
패키지는 비정형 시계열 데이터를 다루는 데 유용한 기능을 제공한다. 특히, rollapply()
함수는 주어진 윈도우 크기(즉, 구간) 내에서 원하는 계산을 반복적으로 적용하는 함수로, 이동평균과 같은 계산에 매우 유용하다.
패키지 설치 및 불러오기
먼저, zoo
패키지를 설치하고 불러와야 한다.
# zoo 패키지 설치
install.packages("zoo")
# 패키지 로드
library(zoo)
2. rollapply()
함수 개요
rollapply()
함수는 주어진 데이터에 대해 윈도우 크기를 설정하고, 각 구간에 함수(예: 평균, 합계 등)를 적용한다. 기본 형식은 다음과 같다:
rollapply(data, width, FUN, by = 1, align = "center", fill = NA)
data
: 분석할 데이터 (벡터나 시계열)width
: 구간의 크기 (윈도우 크기)FUN
: 적용할 함수 (예:mean
,sum
)by
: 계산을 적용할 간격align
: 계산 결과의 정렬 방식 ("left"
,"right"
,"center"
)fill
: 결과를 채울 값 (계산할 수 없는 구간에NA
또는 다른 값을 채울 수 있음)
3. 이동평균 계산하기
이동평균은 특정 구간의 데이터 평균을 구해 데이터의 변동성을 줄여주는 방법이다. 이를 통해 데이터의 전반적인 추세를 더 명확하게 파악할 수 있다.
예제 데이터 생성
# 예제 데이터 생성
set.seed(123)
data <- cumsum(rnorm(20)) # 랜덤하게 생성된 누적합 데이터
print(data)
이동평균 계산
윈도우 크기 3으로 이동평균을 계산하는 예시:
# 윈도우 크기 3으로 이동평균 계산
moving_avg <- rollapply(data, width = 3, FUN = mean, align = "center", fill = NA)
print(moving_avg)
위 코드에서는 구간 크기가 3인 이동평균을 계산한다. align = "center"
옵션을 통해 중앙에 값을 맞추었으며, 계산할 수 없는 첫 번째와 마지막 값을 NA
로 채웠다.
결과 시각화
이동평균 결과를 원본 데이터와 함께 시각화하면 더 쉽게 이해할 수 있다.
# 이동평균 시각화
plot(data, type = "l", col = "blue", lty = 1, ylab = "Value", xlab = "Index", main = "Moving Average Example")
lines(moving_avg, col = "red", lty = 2)
legend("topright", legend = c("Original", "Moving Average"), col = c("blue", "red"), lty = 1:2)
4. 이동합계 계산하기
이동합계는 특정 구간의 데이터를 합산하는 방법이다. 구간 내의 값들이 어떻게 변화하는지를 더 잘 이해할 수 있도록 돕는다.
이동합계 계산
다음은 구간 크기 3으로 이동합계를 계산하는 예시다.
# 윈도우 크기 3으로 이동합계 계산
moving_sum <- rollapply(data, width = 3, FUN = sum, align = "right", fill = NA)
print(moving_sum)
이 코드에서는 FUN = sum
을 사용해 구간 내의 합계를 계산한다. align = "right"
로 설정해 각 결과를 구간의 마지막 값에 맞추었다.
이동합계 시각화
이동합계도 시각화하여 원본 데이터와 비교할 수 있다.
# 이동합계 시각화
plot(data, type = "l", col = "blue", lty = 1, ylab = "Value", xlab = "Index", main = "Moving Sum Example")
lines(moving_sum, col = "green", lty = 2)
legend("topright", legend = c("Original", "Moving Sum"), col = c("blue", "green"), lty = 1:2)
5. 다양한 함수 적용
rollapply()
는 평균과 합계 외에도 사용자 정의 함수를 적용할 수 있어 다양한 분석에 활용될 수 있다. 예를 들어, 구간 내의 최대값 또는 최소값을 구할 수도 있다.
구간 내 최대값 계산
# 윈도우 크기 3으로 구간 내 최대값 계산
moving_max <- rollapply(data, width = 3, FUN = max, align = "center", fill = NA)
print(moving_max)
구간 내 최소값 계산
# 윈도우 크기 3으로 구간 내 최소값 계산
moving_min <- rollapply(data, width = 3, FUN = min, align = "center", fill = NA)
print(moving_min)
6. 결론
zoo::rollapply()
함수는 시계열 데이터 분석에서 이동평균, 이동합계와 같은 계산을 손쉽게 수행할 수 있는 강력한 도구다. 구간 크기와 정렬 옵션을 조정함으로써 다양한 방식으로 데이터를 분석할 수 있으며, 사용자 정의 함수를 적용해 복잡한 계산도 가능하다. 시계열 데이터의 변동성을 줄이거나 패턴을 찾는 데 유용하게 활용할 수 있다.
Leave a comment