📈📉 비즈니스 어낼리틱스/🕑 시계열 분석

🕑시계열데이터 분석 09 - 자기상관 해결 1. 차분

nyamin9 2023. 4. 20. 16:14

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!

 

 


🕑 오차의 자기상관 해결 01. 차분

 

 

🚩 선형회귀 모델의 타당성을 파악하기 위해서, 모집단 모형에는 8가지 가정이 존재합니다.

 

  • 가정1 : 변수 $Y$와 $X$의 관계는 선형이다.
    • scatter plot으로 검증.

 

  • 가정2 : $X$는 확률변수가 아닌 주어진 상수값이다.
    • Cross sectional data에서는 그냥 받아들이지만, 시계열데이터에서는 고려.

 

  • 가정3 : $X$값이 주어져 있을 때, 오차항의 평균은 0이다.
    • $E(εi|X)=0$
    • 즉, X값이 주어져 있을 때 Y의 평균은 체계적인 부분.
    • 잔차플롯으로 검증. 전반적인 잔차가 0에 모여있는지 확인.

 

  • 가정4 : $X$값이 주어졌을 때, 오차항의 분산은 $σ^2$으로 모든 개체 i에 대해 동일하다.
    • 등분산가정으로써, $X$값이 주어졌을 때 $Y$의 분산은 $σ^2$으로 모든 개체i에 대해 동일함.
    • 잔차플롯으로 검증. 전반적인 잔차의 분포가 사각형이거나, 원 형태를 띌 때 만족함.
    • 로그 변환을 통해 점점 변하는 분산을 잡아줌.

 

  • 가정5 : 서로 다른 개체 간 오차항들은 상관되어 있지 않다. 즉, 자기상관이없다.
    • 시계열 데이터에서는 이 가정을 만족시키기 어려움.
    • 서로 다른 개체 간 $Y$변수들은 상관되어 있지 않다.
    • 자기상관이 없다.
    • Acf, Durbin Watson Test, BG test 등의 방법을 사용해 검증.

 

  • 가정6 : 여러 개의 $X$변수들 사이에는 선형관계가 심하지 않다. 다중공선성 문제가 심하지 않다.
    • 상관계수로 검정.

 

  • 가정7 : 모형설정에 오류가 없다.
    • 이는 그냥 참이라고 받아들인다.

 

  • 가정8 : 오차항은 정규분포를 따름을 가정한다.
    • 평균0. 등분산성. $Y$는 정규분포를 따름을 가정함.
    • 객체수만 많으면 괜찮음.

 

 

🚩 이 중에서, 5번 가정인 오차의 자기상관을 해결하기 위해 일반적으로 차분을 진행합니다.

 

 


🕑 차분

 

오차의 자기상관 해결을 위해서는 몇 가지 방법이 있습니다. 이번에는 차분을 알아보도록 하겠습니다.

차분 이후 모델의 해석이 아예 바뀌게 되기는 하지만, 자기상관 해결을 위한 가장 확실한 방법입니다.

 

일반적으로 1차 차분을 진행하지만, 계절의 경우 12차 차분을 하기도 합니다.

계절 자기회귀모형의 경우 1차 계절차분을 통해 자기상관을 줄이기도 합니다.

12차 차분 하기 싫으면, 계절조정해서 데이터를 가져오는 편이 좋습니다.




🕑 변환모델 해석

 

☑️ 차분 모델 해석 : $Y$변수의 전 시점 대비 변화량으로 해석 (원래 Y변수의 단위 유지).

 

☑️ log 변환 모델 해석 : $Y$변수의 증가율(%)로 해석.

 

☑️ log log 변환 모델 해석 : $Y$변수 증가율의 증가율, 즉 %의 증가율로 해석. %p 단위.

 

☑️ log & 차분 모델 해석 : $Y$변수의 전 시점 대비 변화율로 해석 (단위 유지 안됨, %로 변환가능(×100))

 

☑️ Y변수가 금융상품의 가격이라면 수익률 (로그 수익률이라고 부르기도 함)로 해석가능.

 

 

보통 돈과 관련된 경제 경영 변수들은 log 차분을 취하는 경우가 많습니다.

차분을 하지 않고 자기상관을 해결하려면 시계열 모형을 사용하는데, 이는 다음 포스팅에서 알아보겠습니다.

 

 


🕑 시계열 자료의 안정성 (Stationary process)

 

Stationarity에는 등분산성, 자기상관성이 포함됩니다. 이를 만족하는 경우에만 시계열 모형 사용이 가능합니다. 따라서, 차분 외의 다른 방법으로 자기상관을 잡기 위해서는 일단 데이터의 stationary를 만족시키고, 다시 위의 가정을 검증해야 합니다.




🕑 1차 차분 - 트렌드 제거

 

데이터를 차분하고 나면 차분 전의 트렌드를 없애줍니다.

예를 들자면, 시간에 따라 증가하는 트렌드를 없애주는 것입니다.



🕑 데이터 확인

 

df1 <- read.csv("Table6_1.csv")
summary(df1)
>>
     year       consumption         income         wealth         interest        
 Min.   :1947   Min.   : 976.4   Min.   :1035   Min.   : 5167   Min.   :-10.35094  
 1st Qu.:1960   1st Qu.:1518.4   1st Qu.:1679   1st Qu.: 8507   1st Qu.: -0.07559  
 Median :1974   Median :2664.8   Median :3062   Median :12858   Median :  1.46251  
 Mean   :1974   Mean   :2888.4   Mean   :3215   Mean   :15439   Mean   :  1.21197  
 3rd Qu.:1987   3rd Qu.:4080.3   3rd Qu.:4559   3rd Qu.:21059   3rd Qu.:  3.11080  
 Max.   :2000   Max.   :6257.8   Max.   :6539   Max.   :39591   Max.   :  5.84833  

   lnconsump         lndpi          lnwealth        dlnconsump            dlndpi         
 Min.   :6.884   Min.   :6.942   Min.   : 8.550   Min.   :-0.008331   Min.   :-0.006662  
 1st Qu.:7.325   1st Qu.:7.426   1st Qu.: 9.048   1st Qu.: 0.024172   1st Qu.: 0.024460  
 Median :7.888   Median :8.027   Median : 9.462   Median : 0.034971   Median : 0.031922  
 Mean   :7.826   Mean   :7.935   Mean   : 9.493   Mean   : 0.035051   Mean   : 0.034778  
 3rd Qu.:8.314   3rd Qu.:8.425   3rd Qu.: 9.955   3rd Qu.: 0.048197   3rd Qu.: 0.045919  
 Max.   :8.742   Max.   :8.786   Max.   :10.586   Max.   : 0.069925   Max.   : 0.084918  
                                                  NA's   :1           NA's   :1          
   dlnwealth          dinterest         rlnconsump        rlndpi        rlnwealth    
 Min.   :-0.09725   Min.   :-5.6905   Min.   :4.671   Min.   :4.728   Min.   :5.796  
 1st Qu.: 0.01980   1st Qu.:-0.6367   1st Qu.:4.964   1st Qu.:5.042   1st Qu.:6.160  
 Median : 0.03993   Median : 0.0368   Median :5.345   Median :5.437   Median :6.398  
 Mean   : 0.03773   Mean   : 0.2628   Mean   :5.309   Mean   :5.382   Mean   :6.435  
 3rd Qu.: 0.06306   3rd Qu.: 0.8381   3rd Qu.:5.631   3rd Qu.:5.700   3rd Qu.:6.740  
 Max.   : 0.10663   Max.   : 5.7639   Max.   :5.919   Max.   :5.944   Max.   :7.184  
 NA's   :1          NA's   :1         NA's   :1       NA's   :1       NA's   :1      
   rinterest         dconsump         dincome         dwealth           rconsump     
 Min.   :-5.415   Min.   :-22.20   Min.   :-20.4   Min.   :-1423.5   Min.   : 704.4  
 1st Qu.: 0.307   1st Qu.: 40.10   1st Qu.: 56.6   1st Qu.:  152.2   1st Qu.:1086.7  
 Median : 1.359   Median : 87.70   Median :101.1   Median :  554.7   Median :1908.6  
 Mean   : 1.051   Mean   : 99.65   Mean   :103.8   Mean   :  622.7   Mean   :2074.6  
 3rd Qu.: 2.193   3rd Qu.:147.50   3rd Qu.:135.9   3rd Qu.:  822.4   3rd Qu.:2915.7  
 Max.   : 4.325   Max.   :289.40   Max.   :314.1   Max.   : 4004.2   Max.   :4462.2  
 NA's   :1        NA's   :1        NA's   :1       NA's   :1         NA's   :1       
    rincome          rwealth        rinterest2           time      
 Min.   : 767.7   Min.   : 3726   Min.   :-5.4057   Min.   : 1.00  
 1st Qu.:1219.2   1st Qu.: 6392   1st Qu.: 0.3217   1st Qu.:14.25  
 Median :2190.4   Median : 9064   Median : 1.3850   Median :27.50  
 Mean   :2308.1   Mean   :11117   Mean   : 1.0789   Mean   :27.50  
 3rd Qu.:3232.7   3rd Qu.:15059   3rd Qu.: 2.2960   3rd Qu.:40.75  
 Max.   :4637.9   Max.   :28885   Max.   : 4.4371   Max.   :54.00  
 NA's   :1        NA's   :1       NA's   :1

 

## 사용할 부분만 ts데이터로 변경
## 년도별 데이터로 주기 설정

df1.ts <- ts(df1[, 2:8], start = 1947, frequency = 1)
head(df1.ts)
is.ts(df1.ts)
>>
     consumption income   wealth   interest lnconsump    lndpi lnwealth
[1,]       976.4 1035.2 5166.815 -10.350940  6.883873 6.942350 8.550012
[2,]       998.1 1090.0 5280.757  -4.719804  6.905853 6.993933 8.571825
[3,]      1025.3 1095.6 5607.351   1.044063  6.932741 6.999057 8.631834
[4,]      1090.9 1192.7 5759.515   0.407346  6.994758 7.083975 8.658608
[5,]      1107.1 1227.0 6086.056  -5.283152  7.009499 7.112328 8.713756
[6,]      1142.4 1266.8 6243.864  -0.277011  7.040886 7.144249 8.739354
>> [1] TRUE

 

데이터의 세부 정보 확인을 위해서는, 각 feature들의 plot 먼저 살펴봐야합니다!!

 

plot(df1.ts, col="red")

image

 

 

plot(df1$lnconsump)

image


plot 결과, 점점 증가하는 트렌드가 눈에 띕니다.

아직 모델을 피팅하지는 않았지만. 차분을 진행해 트렌드를 제거해줘야 할 것 같습니다.

 

 


🕑 자기상관 파악

 

☑️ 1. acf plot

 

모델 혹은 데이터 잔차의 각 차수에 대한 자기상관성을 보여줍니다.

 

par(mfrow=c(2,2))
acf(df1$lnconsump)
acf(df1$lndpi)
acf(df1$lnwealth)

image

 


☑️ 2. 더빈왓슨검정

 

 

dwtest( ) 함수 : 단, 오차항의 1차 자기상관만 검정한다는 한계가 있습니다.

 

## 세 feature 모두 자기상관 존재
library(lmtest)
dwtest(lnconsump~1,data=df1.ts)
dwtest(lndpi~1,data=df1.ts)
dwtest(lnwealth~1,data=df1.ts)
>>
Durbin-Watson test
data:  lnconsump ~ 1
DW = 0.00502, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0


>>
    Durbin-Watson test
data:  lndpi ~ 1
DW = 0.0050353, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0


>>
    Durbin-Watson test
data:  lnwealth ~ 1
DW = 0.009523, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0

 

 

durbinWatsonTest( ) 함수 : 차수 설정이 가능한 더빈 왓슨 검정입니다.

 

library(car)
durbinWatsonTest(lm(lnconsump~1,data=df1.ts),max.lag=3)
>>

 lag Autocorrelation D-W Statistic p-value
   1       0.9441254   0.005020027       0
   2       0.8880973   0.018101451       0
   3       0.8326139   0.038208817       0
 Alternative hypothesis: rho[lag] != 0

 

 


☑️ 3.bgtest

 

 

bgtest( ) 함수 : 더빈 왓슨 검정의 단점을 보완해줍니다.

 

## 세 feature 모두 자기상관 존재
bgtest(lnconsump~1,data=df1.ts,order=3)
bgtest(lndpi~1,data=df1.ts,order=3)
bgtest(lnwealth~1,data=df1.ts,order=3)
>>
    Breusch-Godfrey test for serial correlation of order up to 3
data:  lnconsump ~ 1
LM test = 50.823, df = 3, p-value = 5.335e-11


>>
    Breusch-Godfrey test for serial correlation of order up to 3
data:  lndpi ~ 1
LM test = 50.524, df = 3, p-value = 6.179e-11


>>
    Breusch-Godfrey test for serial correlation of order up to 3
data:  lnwealth ~ 1
LM test = 50.627, df = 3, p-value = 5.875e-11

 

 


🕑 모델피팅

 

model.ts <- lm(lnconsump ~ lndpi + lnwealth + interest, data = df1.ts)
summary(model.ts)
>>
Call:
lm(formula = lnconsump ~ lndpi + lnwealth + interest, data = df1.ts)
Residuals:
      Min        1Q    Median        3Q       Max 
-0.018441 -0.010001  0.000337  0.007038  0.032579 
Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.4677120  0.0427780 -10.933 7.33e-15 ***
lndpi        0.8048728  0.0174978  45.998  < 2e-16 ***
lnwealth     0.2012702  0.0175926  11.441 1.43e-15 ***
interest    -0.0026891  0.0007619  -3.529 0.000905 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01193 on 50 degrees of freedom
Multiple R-squared:  0.9996,    Adjusted R-squared:  0.9995 
F-statistic: 3.783e+04 on 3 and 50 DF,  p-value: < 2.2e-16

 

 


🕑 모델 자기상관 체크

 

 ☑️잔차 plot

par(mfrow = c(1,1))
plot(model.ts$residuals, type = 'b')

image

 

☑️ acf plot

acf(model.ts$residuals)

image

 

잔차 plot과 acf plot을 보면, 전반적인 분산은 0 주변에 모여있지만 1차 자기상관이 있는 것을 확인할 수 있습니다.

자기상관성 검증을 위해 몇 가지 테스트를 시행하겠습니다.

 

dwtest(model.ts)
>>

    Durbin-Watson test
data:  model.ts
DW = 1.2892, p-value = 0.0009445
alternative hypothesis: true autocorrelation is greater than 0

 

 

durbinWatsonTest(model.ts, max.lag = 3)
>>
 lag Autocorrelation D-W Statistic p-value
   1      0.29775555      1.289232   0.010
   2     -0.02840612      1.933710   0.694
   3      0.01631809      1.678649   0.218
 Alternative hypothesis: rho[lag] != 0

 

 

bgtest(model.ts, order = 1)
bgtest(model.ts, order = 3)
>>
    Breusch-Godfrey test for serial correlation of order up to 1
data:  model.ts
LM test = 5.312, df = 1, p-value = 0.02118


>>
    Breusch-Godfrey test for serial correlation of order up to 3
data:  model.ts
LM test = 6.6573, df = 3, p-value = 0.08366

 

 

각 테스트에서, 1차 자기상관에 검정 결과 p-value가 모두 유의수준 0.05보다 작기 때문에 귀무가설을 기각합니다.

귀무가설이 자기상관이 없다는 가정이므로, 본 모델의 잔차는 1차 자기상관을 가지고 있음을 의미합니다.

따라서, 차분을 통해 자기상관을 제거한 후 다시 모델을 피팅해보도록 하겠습니다.

 

 


🕑 차분 후 모델 피팅

 

diff(DATA$COLUMN, difference) 함수 : 차분할 데이터의 열과 차수를 지정해줍니다.

 

ynew <- diff(df1$lnconsump, difference = 1)
lndpinew <- diff(df1$lndpi, difference = 1)
lnwealthnew <- diff(df1$lnwealth, difference = 1)
interestnew <- diff(df1$interest, difference = 1)

 

## 모델생성
model.ts2 <- lm(ynew ~ lndpinew + lnwealthnew + interestnew)
summary(model.ts2)
>>
Call:
lm(formula = ynew ~ lndpinew + lnwealthnew + interestnew)
Residuals:
      Min        1Q    Median        3Q       Max 
-0.027777 -0.006015 -0.001278  0.008555  0.021556 
Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.0070456  0.0033955   2.075   0.0433 *  
lndpinew    0.7148135  0.0816885   8.750 1.39e-11 ***
lnwealthnew 0.0782675  0.0381738   2.050   0.0457 *  
interestnew 0.0007339  0.0008010   0.916   0.3640    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01078 on 49 degrees of freedom
Multiple R-squared:  0.6453,    Adjusted R-squared:  0.6236 
F-statistic: 29.72 on 3 and 49 DF,  p-value: 4.303e-11

 

 

☑️ 잔차 plot

plot(model.ts2$residuals, type = 'b')

image

 

☑️ acf plot

acf(model.ts2$residuals)

 

image

 

 

차분 후 모델에 대해 acf plot 결과, 1차 자기상관이 깔끔히 해결되었습니다!!

 

 

library(lmtest)
dwtest(model.ts3)
>>
    Durbin-Watson test
data:  model.ts3
DW = 1.3364, p-value = 0.001143
alternative hypothesis: true autocorrelation is greater than 0

 

 

library(car)
durbinWatsonTest(model.ts3, max.lag = 1)
durbinWatsonTest(model.ts3, max.lag = 3)
>>
 lag Autocorrelation D-W Statistic p-value
   1       0.2642951      1.336395       0
 Alternative hypothesis: rho != 0

>>
 lag Autocorrelation D-W Statistic p-value
   1      0.26429515      1.336395   0.000
   2     -0.11161897      2.086674   0.948
   3     -0.09501358      1.926016   0.696
 Alternative hypothesis: rho[lag] != 0

 

 

bgtest(model.ts3, order = 1)
bgtest(model.ts3, order = 3)
>>

    Breusch-Godfrey test for serial correlation of order up to 1
data:  model.ts3
LM test = 4.4559, df = 1, p-value = 0.03478
>>
    Breusch-Godfrey test for serial correlation of order up to 3
data:  model.ts3
LM test = 6.6822, df = 3, p-value = 0.08275

 

 

더빈 왓슨 테스트, bg 테스트의 결과는 아직 자기상관이 있는 것으로 나옵니다. 하지만 해당 통계량은 항상 정확히 산출되는 값이 아니므로, 이는 참고용으로 사용하고 acf plot을 사용하는 것이 좋다고 합니다!! 따라서 위 모델 역시 acf plot 결과 자기상관이 해결된 것이라 생각해도 큰 문제는 없습니다.

 

5번 가정은 해결했지만, 데이터에 로그변환과 차분을 취했기에 완전히 다른 데이터가 된 셈입니다.

따라서, 8가지 가정 중 1번 가정부터 다시 봐야합니다.

 

보통 잔차 plot을 한 번 그려서 3,4번 가정에 대해 검증하고, 6번 가정을 검증합니다.

 

cor( ) 함수로 정량 변수 간 상관계수를 확인하고,

정량 변수와 범주형 변수 간의 상관관계 확인에는 vif( ) 함수를 사용합니다.

 

 

다음 포스팅에서는 자기상관 제거를 위해 다른 방법을 사용해 보겠습니다.