acf_features(AirPassengers) |>
knitr::kable(col.names = "acf_features")| acf_features | |
|---|---|
| x_acf1 | 0.9480473 |
| x_acf10 | 5.6700871 |
| diff1_acf1 | 0.3028553 |
| diff1_acf10 | 0.4088376 |
| diff2_acf1 | -0.1910059 |
| diff2_acf10 | 0.2507803 |
| seas_acf1 | 0.7603950 |
tsfeatures패키지는 머신러닝에서 사용될 시계열 데이터의 특징을 자동으로 생성합니다.
원본, 1차 차분, 2차 차분 시계열의 자기상관함수를 통해 특징을 생성합니다.
x_acf1 : 원본 시계열의 lag 1 autocorr
x_acf10 : 원본 시계열의 lag 1~10 autocorr의 제곱합
단기 자기상관의 전체 강도로 자기상관이 얼마나 강하게 남아있는지 의미
\(0 \le \text{x\_acf10} \le 10\)
diff1_acf1 : 1차 차분 시계열의 lag 1 autocorr
diff1_acf10 : 1차 차분 시계열의 lag 1~10 autocorr의 제곱합
diff2_acf1 : 2차 차분 시계열의 lag 1 autocorr
diff2_acf10 : 2차 차분 시계열의 lag 1~10 autocorr의 제곱합
seas_acf1 : 계절성 주기의 첫 번째 autocorr
acf_features(AirPassengers) |>
knitr::kable(col.names = "acf_features")| acf_features | |
|---|---|
| x_acf1 | 0.9480473 |
| x_acf10 | 5.6700871 |
| diff1_acf1 | 0.3028553 |
| diff1_acf10 | 0.4088376 |
| diff2_acf1 | -0.1910059 |
| diff2_acf10 | 0.2507803 |
| seas_acf1 | 0.7603950 |
ARCH(Autoregressive Conditional Heteroskedasticity, 조건부 이분산성)의에 대한 통계치\((R^2)\)를 계산합니다. 기본적으로 ARCH는 시계열의 분산이 시간에 따라 자기상관 구조를 가진다고 가정하며 1에 가까울수록 변동성이 시간적으로 의존적(clustering)을 의미합니다.
arch_stat(AirPassengers) ARCH.LM
0.9171945
hctsa 패키지를 활용한 특징을 생성합니다.
embed2_incircle_1, embed2_incircle_2 : \([x_{t}, x_{t+1}, ...]\) 와 같이 표준화된 시계열 데이터로부터, 시간 지연(time delay)을 통해 위상구조를 복원하고 원점이 0인 원 안에 포함되는 비율을 계산
값이 클수록 원 안에 비율이 크다는 의미로 선형성이 높고 안정적임
값이 작을수록 시계열 변화가 크고 비선형적임
두 지표의 차이는 원의 반지름 차이
ac_9 : lag 9 autocorr, 중기 지속성 신호
firstmin_ac : ACF가 처음으로 최소가 되는 lag
trev_num : 시간가역성(time-reversibility) 지표로 시계열의 시간 순서를 뒤집었을 때 통계적 구조가 얼마나 달라지는지 측정하여 대칭성을 확인
trev_num > 0 : 상승이 빠르고 하락이 느림
trev_num < 0 : 하락이 빠르고 상승이 느림
trev_num = 0 : 시간 대칭(white noise)
motiftwo_entro3 : 시계열의 패턴 복잡도를 측정
motiftwo_entro3 < 1 : 완전 주기적(패턴이 1가지 뿐)
motiftwo_entro3 > 1 : 불규칙한 구조
보통 0.5~1.5 사이 값을 가지며 3 은 white noise 수준임
walker_propcross : 시계열이 얼마나 평균을 자주 넘나드는지 측정
walker는 시계열의 시간축을 따라 이동하는 가상의 입자로 시계열 값과의 차이를 좁히려는 방향으로 움직임
walker_propcross = 0 ~ 0.2 : 워커가 거의 교차하지 않고 Trend-following
walker_propcross > 0.6 : 워커가 자주 교차하며 Mean-reverting
autocorr_features(AirPassengers) |>
knitr::kable(col.names = "autocorr_features")| autocorr_features | |
|---|---|
| embed2_incircle_1 | 0.0000000 |
| embed2_incircle_2 | 0.0000000 |
| ac_9 | 0.6709483 |
| firstmin_ac | 8.0000000 |
| trev_num | -4902.1958042 |
| motiftwo_entro3 | 1.1302445 |
| walker_propcross | 0.2027972 |
시계열을 평균보다 크면 1, 작으면 0인 벡터로 변환
binarize_mean(AirPassengers) [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
[75] 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[112] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
시계열이 중앙값(median)을 기준으로 얼마나 교차하는지를 측정하며 값이 클수록 mean-reversion이 강하고, 작을수록 trend persistence가 강합니다.
crossing_points(AirPassengers)crossing_points
7
histogram_mode_10 : 시계열 히스토그램(bin = 10)에서 최빈값(mode)
outlierinclude_mdrmd : 점점 더 많은 극단치(outlier)를 포함시킬 때, 중앙값(median)이 얼마나 안정적인지 측정
dist_features(AirPassengers) |>
knitr::kable(col.names = "dist_features")| dist_features | |
|---|---|
| histogram_mode_10 | 125.0000000 |
| outlierinclude_mdrmd | 0.4166667 |
시계열이 얼마나 특정 주파수에 집중되어 있는가를 측정하며 값이 작다면 시계열이 그만큼 특정 주파수에 집중되어 있으며 이는 높은 예측가능성을 의미합니다.
entropy(AirPassengers) entropy
0.2961049
시계열의 ACF가 처음으로 0 아래로 떨어지는 lag 반환
10개의 구간으로 시계열을 나누고 각 구간에 속한 연속된 관측값들의 길이를 계산하고 가장 긴 연속 구간을 반환합니다. 이는 국면 지속성(regime persistence)를 의미하며 시계열이 얼마나 오랫동안 비슷한 수준에 머누는가를 측정합니다.
flat_spots(AirPassengers)flat_spots
18
시계열의 이분산성을 정량화한 지표
시계열 전처리 - 평균, 추세, 자기회귀(AR) 제거하여 \(X_t\) 생성
\(X_t\)에 GARCH(1,1) 적합하여 잔차 \(z_t\) 생성
이론상 GARCH로 생성된 잔차 \(z_t\)는 white noise에 가까워야함
여전히 남아있다면 아직 heterogeneityd이 있다는 의미
arch_acf : \(X_t^2\) 의 1~12개 ACF의 제곱합
garch_acf : \(z_t^2\) 의 1~12개 ACF의 제곱합
arch_r2 : \(X_t^2\) 에 AR 적합 후 \(R^2\)
garch_r2 : \(z_t^2\) 에 AR 적합 후 \(R^2\)
arch 가 클수록 단기적 변동성이 크고, garch 가 클수록 장기적 변동성이 큼
heterogeneity(AirPassengers) |>
knitr::kable(col.names = "heterogeneity")| heterogeneity | |
|---|---|
| arch_acf | 0.2295944 |
| garch_acf | 0.2277382 |
| arch_r2 | 0.2106310 |
| garch_r2 | 0.2101623 |
holt_parameters : Holt’s linear trend(ETS(A,A,N)) - 추세형 시계열
\(\alpha\) : level smoothing parameter - 현재 시점 수준 반영(클수록 최근 변화 빠르게 반영)
\(\beta\) : trend smoothing parameter - 추세 반영
hw_parameters : Holt-Winters additive model(ETS(A,A,A)) - 계절성 포함 시계열
holt_parameters(AirPassengers) |>
knitr::kable(col.names = "holt_parameters")| holt_parameters | |
|---|---|
| alpha | 0.9998999 |
| beta | 0.0001000 |
hw_parameters(AirPassengers) |>
knitr::kable(col.names = "hw_parameters")| hw_parameters | |
|---|---|
| alpha | 0.9934804 |
| beta | 0.0001912 |
| gamma | 0.0005800 |
\(H = 0.5 + d^2\)
\(d\) : 최대우도방식으로 계산된 분수차분 차수
시계열의 장기기억을 측정하며 과거 패턴이 미래에도 지속되는가를 의미하며 값이 클수록 강한 추세 지속성과 비정상성을 의미
hurst(AirPassengers) hurst
0.9992466
시계열을 겹치지 않는(non-overlapping) 윈도우로 나눠 구간별 평균과 분산의 변동성을 계산
lumpiness : 구간별 분산들의 분산
stability : 구간별 평균들의 분산
AirPassengers 데이터의 경우, 분산은 일정하고 평균이 큰 편으로 변동성은 안정적이나 추세가 강한 시계열
lumpiness(AirPassengers) lumpiness
0.01924803
stability(AirPassengers)stability
0.9330704
시계열이 특정 창(overlapping)으로 나눠 구조적인 변화를 계산
max_level_shift : 평균이 가장 크게 변하는 시점
max_var_shift : 분산이 가장 크게 변하는 시점
max_kl_shift : 전체 분포가 가장 크게 변하는 시점(체제 변화)
max_level_shift(AirPassengers) max_level_shift time_level_shift
54.5 127.0
max_var_shift(AirPassengers) max_var_shift time_var_shift
2342.152 117.000
max_kl_shift(AirPassengers) max_kl_shift time_kl_shift
0.1210444 132.0000000
값이 클수록 nonlinear, 작을수록 linear
nonlinearity(AirPassengers)nonlinearity
0.4238969
x_pacf5 : 원본 시계열의 1~5 PACF 제곱합
diff1x_pacf5 : 1차 차분 시계열의 1~5 PACF 제곱합
diff2x_pacf5 : 2차 차분 시계열의 1~5 PACF 제곱합
seas_pacf
pacf_features(AirPassengers) |>
knitr::kable(col.names = "pacf_features")| pacf_features | |
|---|---|
| x_pacf5 | 0.9670971 |
| diff1x_pacf5 | 0.2122454 |
| diff2x_pacf5 | 0.2476615 |
| seas_pacf | -0.1354311 |
시계열의 예측가능성 측정
localsimple_mean1 : 단순 이동평균 예측법에서 잔차의 autocorr이 처음 0이 되는 시점
localsimple_lifitac : 단순 선형회귀 예측법에서 잔차의 autocorr이 처음 0이 되는 시점
sampen_first : 시계열의 복잡도(complexity)와 무작위성(randomness)를 측정하는 엔트로피 지표
값이 작을수록 규칙적이며 클수록 무작위성이 증가함
Inf 는 완전 주기적이거나 패턴이 너무 동일해서 계산이 불가능한 상태
pred_features(AirPassengers) |>
knitr::kable(col.names = "pred_features")| pred_features | |
|---|---|
| localsimple_mean1 | 2 |
| localsimple_lfitac | 3 |
| sampen_first | Inf |
DFA(Detrended fluctuation analysis)란?
시계열의 장기적인 추세를 제거하고 나머지 변동성을 분석하는 기법
누적 편차 계산
시계열을 non-overlapping 하게 분할하고 구간별로 1차 다항식으로 fitting하여 추세를 제거
각 구간별 RMS(root mean square) 계산
여러 구간 크기별로 위 과정을 반복하여 나온 값들을 log-scale해서 나온 기울기 H 계산 가능
scal_features < 0.5 : 평균회귀 or 무기억성
scal_features = 0.5 ~ 0.7 : 약한 장기기억
scal_features = 0.7 ~ 0.9 : 강한 장기기억
scal_features(AirPassengers)fluctanal_prop_r1
0.7692308
시계열의 정상성과 관련된 특징
std1st_der : 1차 차분 값들의 표준편차
spreadrandomlocal_meantual_50 : 무작위 100개의 국소구간(50)에서의 ACF 가 0이 되는 시점의 평균
spreadrandomlocal_meantual_ac2 : 무작위 100개의 국소구간(50)에서의 lag 2 ACF 의 평균
station_features(AirPassengers) |>
knitr::kable(col.names = "station_features")| station_features | |
|---|---|
| std1st_der | 33.75428 |
| spreadrandomlocal_meantaul_50 | 13.30000 |
| spreadrandomlocal_meantaul_ac2 | 38.89000 |
STL(Seasonal-Trend decomposition using Loess)에 기반한 시계열의 추세와 계절성 척도 계산
\[ \begin{aligned} x_t &= f_t + s_{1, t} + ... + s_{M, t} + e_t \\ f_t &: \text{the smoothed trend component} \\ s_{i, t} &: \text{the } i \text{-th seasonal component} \\ e_t &: \text{a remainder component} \end{aligned} \]
nperiods : 데이터 내 존재하는 계절 주기 수
seasonal_period : 존재하는 계절 주기
trend : 추세 강도
seasonal.strength: 계절성 강도
peak : 계절 주기의 최고점
trough : 계절 주기의 최저점
spike : 잔차 \(e_t\) 의 leave-one-out 분산의 분산
leave-one-out이란 한 시점을 제외했을 때의 분산 변화량을 의미하며 전체 평균 분산 대비 어느 시점이 분산을 spike하게 만드는지 측정
값이 클수록 일부 시점이 전체 분산에 미치는 영향이 크다는 의미로 이는 급등락이나 이상치가 존재한다는 의미
linearity : 시계열의 선형성
curvature : 시계열의 비선형성
e_acf1 : 잔차 \(e_t\) 의 ACF lag 1 autocorr
e_acf10 : 잔차 \(e_t\) 의 ACF lag 1~10 autocorr 제곱합
stl_features(AirPassengers) |>
knitr::kable(col.names = "stl_features")| stl_features | |
|---|---|
| nperiods | 1.0000000 |
| seasonal_period | 12.0000000 |
| trend | 0.9909550 |
| spike | 3.0277699 |
| linearity | 1325.3317266 |
| curvature | 131.0646804 |
| e_acf1 | 0.5091751 |
| e_acf10 | 0.9303664 |
| seasonal_strength | 0.9406725 |
| peak | 7.0000000 |
| trough | 11.0000000 |
시계열의 정상성 검정 통계량 계산
unitroot_kpss(..., type = c("mu", "tau"))
다른 단위근 검정과 다르게 시계열이 정상이다인 귀무가설을 가짐
기본값은 수준 정상성
mu : level stationary(수준 정상성) 으로 추세가 없다고 가정하여 검정(단순히 평균 위주로 변동하는지 여부 파악)
tau : trend stationary(추세 정상성) 으로 추세를 설명변수에 넣어 추세를 제거 후 정상성 검정(추세선 주의로 변동하는 여부 파악)
unitroot_kpss(AirPassengers, type = "mu")[1] 2.739474
통계치가 크므로 시계열은 비정상으로 단위근이 존재한다.
unitroot_kpss(AirPassengers, type = "tau")[1] 0.09614985
반면, 추세선을 제거한 시계열의 경우 시계열은 정상성을 가진다.
unitroot_pp
unitroot_pp(AirPassengers)[1] -6.565597
시계열 내 0의 비율
zero_proportion(AirPassengers)[1] 0
다음 5가지 features를 한번에 계산한다.
autocorr_features
pred_features
station_features
dist_features
scal_features
compengine(AirPassengers) |>
knitr::kable(col.names = "compengine")| compengine | |
|---|---|
| embed2_incircle_1 | 0.0000000 |
| embed2_incircle_2 | 0.0000000 |
| ac_9 | 0.6709483 |
| firstmin_ac | 8.0000000 |
| trev_num | -4902.1958042 |
| motiftwo_entro3 | 1.1302445 |
| walker_propcross | 0.2027972 |
| localsimple_mean1 | 2.0000000 |
| localsimple_lfitac | 3.0000000 |
| sampen_first | Inf |
| std1st_der | 33.7542815 |
| spreadrandomlocal_meantaul_50 | 12.4000000 |
| spreadrandomlocal_meantaul_ac2 | 38.8900000 |
| histogram_mode_10 | 125.0000000 |
| outlierinclude_mdrmd | 0.4166667 |
| fluctanal_prop_r1 | 0.7692308 |
# 1748개 시계열이 연결된 mts class
yahoo <- yahoo_data()
hwl <- bind_cols(
tsfeatures(yahoo, c("acf_features", "entropy",
"lumpiness", "flat_spots",
"crossing_points")),
tsfeatures(yahoo, "stl_features", s.window = "periodic", robust = TRUE),
tsfeatures(yahoo, "max_kl_shift", width = 48),
tsfeatures(yahoo, c("mean", "var"), scale = F, na.rm = T),
tsfeatures(yahoo, c("max_level_shift", "max_var_shift"), trim = T)
) |>
select(mean, var, x_acf1, trend, linearity, curvature,
seasonal_strength, peak, trough,
entropy, lumpiness, spike, max_level_shift, max_var_shift, flat_spots,
crossing_points, max_kl_shift, time_kl_shift)
hwl_pac$x |>
as_tibble() |>
ggplot(aes(x = PC1, y = PC2)) +
geom_point()hwl_pac$x |>
as_tibble() |>
ggplot(aes(x = PC1, y = PC2)) +
geom_point() +
theme_bw()