[시계열분석] 1. 시계열의 탐색적 자료분석
head(EuStockMarkets)
EuStockMarkets은 1991년부터 1998년까지 유럽 4대 주가지수 일일 종가를 나타냅니다.
이 데이터는 형식화 및 샘플링이 잘 되어 있어 이상치 조정 없이 바로 EDA가 가능합니다.
plot(EuStockMarkets)
각 값을 개별 그래프로 그렸습니다.
class(EuStockMarkets)
다양한 시계열을 동시에 다루는 mts 객체를 사용합니다.
(ts는 단일 시계열을 다루는 객체입니다.)
frequency(EuStockMarkets)
데이터의 연간 빈도를 출력하는 frequency 함수 입니다.
start(EuStockMarkets)
end(EuStockMarkets)
데이터의 처음과 마지막 시간을 알아내는 start, end 함수 입니다.
window(EuStockMarkets, start = 1997, end = 1998)
데이터에서 시간의 한 부분 범위를 얻을 수 있는 window 함수 입니다.
hist(EuStockMarkets[,'SMI'], 30)
데이터의 히스토그램입니다. 특별한 인사이트가 없습니다.
hist(diff(EuStockMarkets[,'SMI'], 30))
인접한 데이터간 차이의 히스토그램 입니다. 정규분포와 유사한 모양을 띕니다.
주가지수가 상승추세를 보이므로 차분(diff)은 양수쪽으로 미세하게 치우쳐 있습니다.
plot(EuStockMarkets[,'SMI'], EuStockMarkets[,'DAX'])
시간에 따른 두 주식의 가치를 보여주는 산점도 입니다. 강한 양의 상관관계를 보이네요.
plot(diff(EuStockMarkets[,'SMI']), diff(EuStockMarkets[,'DAX']))
두 주식의 일일가치 변동을 보여주는 산점도입니다. 위 그림과 다르게 상관관계가 강하지 않습니다.
plot(lag(diff(EuStockMarkets[,'SMI']),1), diff(EuStockMarkets[,'DAX']))
두 주식의 일일가치 변동이 참상관관계라도 실제로 적용시키는덴 무리가 있습니다.
주식의 미래 가격을 알고 싶은건데, 같은 미래에 다른 주식의 가격하고 상관관계가 있는것은 의미가 없습니다.
그보다 한 시점 전 타 주식 가격과 미래 주식 가격간의 연관이 있어야 유의미합니다.
lag 함수를 이용해서 한 주가를 1시점 앞으로 당기고 산점도를 구했습니다.
두 주가의 상관관계가 사라졌다는 것을 산점도를 보고 알 수 있습니다.
x <- rnorm(n = 100, mean = 0, sd = 10) + 1:100
mn <- function(n) rep(1/n, n)
plot(x, type = 'l', lwd = 1)
lines(filter(x, mn(5)), col = 2, lwd = 3, lty = 2)
lines(filter(x, mn(50)), col = 3, lwd = 3, lty = 3)
filter(x, mn(5))
filter 함수를 이용해 이동평균 값을 구해서 그래프를 그렸습니다.
install.packages('zoo')
library(zoo)
f1 <- rollapply(zoo(x), 20, function(w) min(w), align = 'left', partial = TRUE)
f2 <- rollapply(zoo(x), 20, function(w) min(w), align = 'right', partial = TRUE)
plot(x, lwd =1, type = 'l')
lines(f1, col = 2, lwd = 3, lty = 2)
lines(f2, col = 3, lwd = 3, lty = 3)
fitter 함수는 일차 선형 변환에 기반하므로 일차결합하지 않은 함수는 사용을 할 수 없습니다.
그래서 zoo 패키지의 rollapply 함수를 사용했는데요. 사용형태로 rollapply(데이터, 원도 크기, 적용함수, 함수 적용 방향) 입니다.
이때 ts 객체는 균등한 간격의 시계열을 가정하나 zoo 객체는 타임스테프를 색인 속성으로 저장하기에 주기적인 시계열을 요구하지 않습니다.
plot(x, type = 'l', lwd = 1)
lines(cummax(x), col = 2, lwd = 3, lty = 2) # 최댓값
lines(cumsum(x)/1:length(x), col = 3, lwd = 3, lty = 3) # 평균
확장 윈도로 cummax, cumsum 함수를 사용했습니다.
plot(x, lwd =1, type = 'l')
lines(rollapply(zoo(x), seq_along(x), function(w) max(w), partial = TRUE, align = 'right'),
col = 2, lwd = 3, lty = 2)
lines(rollapply(zoo(x), seq_along(x), function(w) mean(w), partial = TRUE, align = 'right'),
col = 3, lwd = 3, lty = 3)
윗 그림과 동일한 그림을 출력합니다. 이번엔 rollapply 함수를 사용했죠.
x <- 1:100
y <- sin(x * pi / 3)
plot(y, type = 'b')
acf(y)
acf란 자기상관계수로 위 그림에서 x축인 Lag 값은 떨어진 정도를 의미합니다.
더 자세히 설명하면 자기상관계수란 cor(Yt, Y(t-k))를 의미하는데 이때 k가 Lag 입니다.
install.packages('data.table')
library(data.table)
cor(y, shift(y,1), use = 'pairwise.complete.obs')
cor(y, shift(y,2), use = 'pairwise.complete.obs')
자기 상관 계수를 구하기 위해 data.table 패키지 내 shift 함수를 사용했습니다.
y <- sin(x * pi / 3)
plot(y[1:30], type = 'b')
pacf(y)
pacf은 편자기상관 함수로 cor(et, e(t-k))을 나타냅니다. 즉 설명된 부분을 제외한 잔차의 상관계수를 나타내죠.
다시 말해 k-1까지 설명된 정보 이외에 k번째 이전 변수가 현재 변수에 설명되는 것이 있는지를 나타낸 값이라고 할 수 있습니다.
사인함수와 같이 일정 주기가 있는 경우 Lag(k) 값이 커질 수록 PACF 값이 0에 수렴합니다.
다시말해 ACF와 달리 PACF는 불필요한 중복관계를 제거하는 역할도 합니다.
y1 <- sin(x * pi / 3)
plot(y1, type = 'b')
acf(y1)
pacf(y1)
y2 <- sin(x * pi / 10)
plot(y2, type = 'b')
acf(y2)
pacf(y2)
ACF와 PACF를 비교한 그래프들입니다.
정상 데이터의 ACF는 빠르게 0으로 수렴해야합니다. 하지만 주기함수에서 ACF는 그렇지 못한 모습이죠.
y3 <- y1 + y2
plot(y3, type = 'b')
acf(y3)
pacf(y3)
두 계열을 더한 데이터의 ACF와 PACF를 구했습니다.
ACF는 앞서 구한 두 ACF를 합한 것과 같습니다. 반면 PACF는 단순히 합친것은 아닙니다.
noise1 <- rnorm(100, sd = 0.05)
noise2 <- rnorm(100, sd = 0.05)
y1 <- y1 + noise1
y2 <- y2 + noise2
y <- y1 + y2
plot(y1, type = 'b')
acf(y1)
pacf(y1)
plot(y2, type = 'b')
acf(y2)
pacf(y2)
plot(y, type = 'b')
acf(y)
pacf(y)
노이즈를 조금 추가했는데, 노이즈가 없는 것과 비슷한 결과가 나옵니다.
AirPassengers
colors <- c('green', 'red', 'pink', 'blue','yellow', 'lightsalmon', 'black', 'grey',
'cyan', 'lightblue', 'maroon', 'purple')
matplot(matrix(AirPassengers, nrow = 12, ncol = 12),
type = 'l', col = colors, lty = 1, lwd = 2.5,
xaxt = 'n')
legend('topleft', legend = 1949:1960, col = colors)
AirPassengers 자료를 시각화 했습니다.
install.packages('forecast')
library(forecast)
seasonplot(AirPassengers)
forecast 패키지 내 seasonplot 함수로 비슷한 그림을 그렸습니다.
matplot(t(matrix(AirPassengers, nrow = 12, ncol = 12)),
type = 'l', col = colors, lty = 1, lwd = 2.5,
xaxt = 'n')
이 그래프는 앞 그래프와 다르게 연도 시계열을 나타냅니다.
monthplot(AirPassengers)
달 별로 값을 시각화 해주는 monthplot 함수를 사용했습니다.
시계열 데이터를 분석하기 전 탐색적으로 자료분석 하는 여러가지 시각에 대해 공부했습니다.
그 중 롤링 윈도와 자기 상관 부분이 앞으로 시계열 공부하는데 중요할 것 같네요.
앞으로 공부할 내용이 더욱 기대됩니다.