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

🕑시계열데이터 분석 08 - 시계열 회귀분석

nyamin9 2023. 4. 15. 19:33

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

 

 


🕑 시계열 회귀분석

 

 

서로 다른 개체 간 오차항들은 서로 자기상관이 없다는 가정의 영향을 고려해줘야 합니다.

특히 시계열 데이터의 특성 상, 각 개체 간 자기상관이 없을 수 없기 때문에 꼭 이에 대한 처리를 해주어야 합니다.

대표적으로, 차분을 진행해서 자기상관을 줄이는 방법이 있겠습니다.

 

 


🕑 선형회귀 : lm(Y ~ X1 + X2 + X3, data = DATA)

 

 

🕑 먼저, 일반 데이터프레임에 대해 회귀분석을 진행하겠습니다.

 

## 데이터프레임
head(df1)
##    year consumption income    wealth   interest lnconsump    lndpi  lnwealth
## 1  1947       976.4 1035.2  5166.815 -10.350940  6.883873 6.942350  8.550012
## 2  1948       998.1 1090.0  5280.757  -4.719804  6.905853 6.993933  8.571825
## 3  1949      1025.3 1095.6  5607.351   1.044063  6.932741 6.999057  8.631834
## 4  1950      1090.9 1192.7  5759.515   0.407346  6.994758 7.083975  8.658608
## 5  1951      1107.1 1227.0  6086.056  -5.283152  7.009499 7.112328  8.713756

##      dlnconsump       dlndpi     dlnwealth   dinterest rlnconsump   rlndpi
## 1            NA           NA            NA          NA         NA       NA
## 2   0.021980762  0.051583290  2.181339e-02  5.63113594   4.670862 4.739956
## 3   0.026887417  0.005124092  6.000900e-02  5.76386690   4.690612 4.728332
## 4   0.062017441  0.084917545  2.677441e-02 -0.63671696   4.743900 4.811586
## 5   0.014740944  0.028352737  5.514717e-02 -5.69049835   4.738506 4.812368

##    rlnwealth   rinterest   dconsump    dincome       dwealth  rconsump
## 1         NA          NA         NA         NA            NA        NA
## 2   5.795887 -1.35915709  21.699951  54.800049  1.139419e+02  704.3560
## 3   5.848814  2.57644486  27.200073   5.599976  3.265942e+02  725.0278
## 4   5.856105  0.06836937  65.599976  97.099976  1.521641e+02  782.4448
## 5   5.902559 -5.41540527  16.199951  34.300049  3.265410e+02  778.9094

##      rincome   rwealth  rinterest2 time
## 1         NA        NA          NA    1
## 2   778.5664  3726.352 -1.60578680    2
## 3   767.6801  4018.668  2.46398711    3
## 4   863.0954  4072.578  0.09324604    4
## 5   868.1835  4353.341 -5.40569973    5

 

class(df1)
## [1] "data.frame"

 

model1 <- lm(lnconsump ~ lndpi + lnwealth + interest, data = df1)
summary(model1)
## 
## Call:
## lm(formula = lnconsump ~ lndpi + lnwealth + interest, data = df1)
## 
## 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

 


🕑 이번에는 ts 데이터로 변환해서 회귀분석을 진행하겠습니다.

 

세부적으로 데이터의 요인을 파악하고 이를 고려한 분석을 진행해 보겠습니다.

 

## ts 데이터로 변환
df1.ts <- ts(df1[, 2:8], start = 1947, frequency = 1)
head(df1.ts)
## Time Series:
## Start = 1947 
## End = 2000 
## Frequency = 1 
##      consumption income    wealth   interest lnconsump    lndpi  lnwealth
## 1947       976.4 1035.2  5166.815 -10.350940  6.883873 6.942350  8.550012
## 1948       998.1 1090.0  5280.757  -4.719804  6.905853 6.993933  8.571825
## 1949      1025.3 1095.6  5607.351   1.044063  6.932741 6.999057  8.631834
## 1950      1090.9 1192.7  5759.515   0.407346  6.994758 7.083975  8.658608
## 1951      1107.1 1227.0  6086.056  -5.283152  7.009499 7.112328  8.713756

 

is.ts(df1.ts)
## [1] TRUE

 

 

가장 먼저 확인해야 하는 plot은 time plot입니다!!

time plot에서 확인할 점은 각 변수의 트렌드, 계절성, 툭 떨어졌다가 올라가는 부분이 있는지의 여부입니다.

 

• 만약 떨어진 부분이 있으면 이유를 파악하고 제대로 된 데이터인지 확인해야 합니다.

 

 또한 월별 데이터인데도 seasonality가 없다면 계절조정이 된 데이터인지 반드시 확인해야 합니다.

 

 어느 column에는 계절성이 있고, 다른 column에는 없으면 이 데이터는 쓰면 안됩니다. 혹은 사용할 부분만 사용합시다.

 

 

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

image

 

plot 결과, 전반적인 데이터의 트렌드가 함께 움직이고 있습니다.

또한 년도별 데이터이므로 눈에 확 띄는 seasonality는 없습니다.

 

 

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

 

R-square 값이 굉장히 높지만, 트렌드가 이유일 수 있으므로 잘못된 값일수도 있습니다.

해당 모형을 사용하려면 몇 가지 장기 균형 관계에 대한 테스트를 거쳐야 합니다.

 

모델 평가를 위해서 residual plot을 그려보았습니다.

 

 

library(lmtest)
plot(model.ts$residuals, type = 'b')

image




🕑 오차항의 자기상관 파악

 

 

모델의 자기상관 차수 파악 : acf(MODEL$residuals)

 

더빈왓슨 테스트 : dwtest(MODEL)  durbinWatsonTest(MODEL, max.lag)

 

bg 테스트 : bgtest(MODEL, order)

 

 

두 테스트의 귀무가설은 자기상관이 없다는 것이므로, p-value가 유의수준보다 작다면 모델에 이상이 있다는 것입니다.

 

 

☑️ acf

acf(model.ts$residuals)

image

 

☑️ dwtest

## 잔차의 자기상관 검정 : dwtest
## p-value가 0.05보다 작음 -> 귀무가설 기각
## 문제가 없다, 자기상관이 없다는 것이 귀무가설이므로 해당 모델은 문제가 있는 모델임

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

## 잔차의 자기상관 검정 : durbinWatsonTest
## 1차 자기 상관 외의 다른 자기상관도 확인이 가능함

# install.packages('car')
library(car)
durbinWatsonTest(model.ts, max.lag = 1)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.2977555      1.289232       0
##  Alternative hypothesis: rho != 0

 


☑️ bgtest

## p-value가 0.05보다 작기 때문에 자기상관이 없다는 귀무가설을 기각함
bgtest(model.ts, order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  model.ts
## LM test = 5.312, df = 1, p-value = 0.02118

 

 

☑️ bgtest

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

 

 

여러 검정 수치 비교 결과, 해당 모델은 사용할 수 없습니다.

즉, 오차항의 자기상관 문제를 해결해야 합니다. 대표적으로 차분 등의 방법이 있겠습니다!!

 

다음 포스팅에서 여러 가지 방법으로 자기상관을 해결해보겠습니다.