[tsfeatures] List of features

tsfeatures패키지는 머신러닝에서 사용될 시계열 데이터의 특징을 자동으로 생성합니다.

1. acf_feature

원본, 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

2. arch_stat

ARCH(Autoregressive Conditional Heteroskedasticity, 조건부 이분산성)의에 대한 통계치\((R^2)\)를 계산합니다. 기본적으로 ARCH는 시계열의 분산이 시간에 따라 자기상관 구조를 가진다고 가정하며 1에 가까울수록 변동성이 시간적으로 의존적(clustering)을 의미합니다.

arch_stat(AirPassengers)
  ARCH.LM 
0.9171945 

3. autocorr_features

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

4. binarize_mean

시계열을 평균보다 크면 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

5. crossing_points

시계열이 중앙값(median)을 기준으로 얼마나 교차하는지를 측정하며 값이 클수록 mean-reversion이 강하고, 작을수록 trend persistence가 강합니다.

crossing_points(AirPassengers)
crossing_points 
              7 

6. dist_features

  • histogram_mode_10 : 시계열 히스토그램(bin = 10)에서 최빈값(mode)

  • outlierinclude_mdrmd : 점점 더 많은 극단치(outlier)를 포함시킬 때, 중앙값(median)이 얼마나 안정적인지 측정

    • 값이 클수록 분포는 fat tail을 가지며, 중앙값이 극단값에 영향을 많이 받음
dist_features(AirPassengers) |> 
  knitr::kable(col.names = "dist_features")
dist_features
histogram_mode_10 125.0000000
outlierinclude_mdrmd 0.4166667

7. entropy

시계열이 얼마나 특정 주파수에 집중되어 있는가를 측정하며 값이 작다면 시계열이 그만큼 특정 주파수에 집중되어 있으며 이는 높은 예측가능성을 의미합니다.

entropy(AirPassengers)
  entropy 
0.2961049 

8. firstzero_ac

시계열의 ACF가 처음으로 0 아래로 떨어지는 lag 반환

9. flat_spots

10개의 구간으로 시계열을 나누고 각 구간에 속한 연속된 관측값들의 길이를 계산하고 가장 긴 연속 구간을 반환합니다. 이는 국면 지속성(regime persistence)를 의미하며 시계열이 얼마나 오랫동안 비슷한 수준에 머누는가를 측정합니다.

flat_spots(AirPassengers)
flat_spots 
        18 

10. heterogeneity

시계열의 이분산성을 정량화한 지표

  1. 시계열 전처리 - 평균, 추세, 자기회귀(AR) 제거하여 \(X_t\) 생성

  2. \(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

11. holt_parameters / hw_parameters

  • 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)) - 계절성 포함 시계열

    • \(\gamma\) : seasonal smoothing parameter - 계절성 반영
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

12. hurst

  • \(H = 0.5 + d^2\)

    • \(d\) : 최대우도방식으로 계산된 분수차분 차수

    • 시계열의 장기기억을 측정하며 과거 패턴이 미래에도 지속되는가를 의미하며 값이 클수록 강한 추세 지속성과 비정상성을 의미

hurst(AirPassengers)
    hurst 
0.9992466 

13. lumpiness / stability

시계열을 겹치지 않는(non-overlapping) 윈도우로 나눠 구간별 평균과 분산의 변동성을 계산

  • lumpiness : 구간별 분산들의 분산

  • stability : 구간별 평균들의 분산

  • AirPassengers 데이터의 경우, 분산은 일정하고 평균이 큰 편으로 변동성은 안정적이나 추세가 강한 시계열

lumpiness(AirPassengers)
 lumpiness 
0.01924803 
stability(AirPassengers)
stability 
0.9330704 

14. max_level_shift / max_var_shift / max_kl_shift

시계열이 특정 창(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 

15. nonlinearity

값이 클수록 nonlinear, 작을수록 linear

nonlinearity(AirPassengers)
nonlinearity 
   0.4238969 

16. pacf_features

  • 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

17. pred_features

시계열의 예측가능성 측정

  • 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

18. scal_features

  • DFA(Detrended fluctuation analysis)란?

    • 시계열의 장기적인 추세를 제거하고 나머지 변동성을 분석하는 기법

      1. 누적 편차 계산

      2. 시계열을 non-overlapping 하게 분할하고 구간별로 1차 다항식으로 fitting하여 추세를 제거

      3. 각 구간별 RMS(root mean square) 계산

      4. 여러 구간 크기별로 위 과정을 반복하여 나온 값들을 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 

19. station_features

시계열의 정상성과 관련된 특징

  • 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

20. stl_features

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 : 추세 강도

    • \(\text{trend} = 1 - \frac{Var(e_t)}{Var(f_t + e_t)}\)
  • seasonal.strength: 계절성 강도

    • \(\text{seasonal.strength} = 1 - \frac{Var(e_t)}{Var(s_{i, t} + e_t)}\)
  • 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

21. unitroot_kpss / unitroot_pp

시계열의 정상성 검정 통계량 계산

  • 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

22. zero_proportion

시계열 내 0의 비율

zero_proportion(AirPassengers)
[1] 0

23. compengine feature set

다음 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

* Hyndman, Wang and Laptev (ICDM 2015)

# 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()