아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#14 14일차_회귀분석, 변수 선택 및 제거

ecosso 2026. 4. 30. 16:08

01 회귀분석

 -01 회귀분석 모형 종류

 -02 회귀모형의 가정

 -03 모형 평가

 

02 단순 선형 회귀분석

 -01 회귀계수의 추정

 -02 모형 평가

 -03 모형의 설명력

 

03 다중 선형 회귀분석

 -01 다중 선형 회귀분석이란

 -02 다중공선성

 

04 변수 선택 / 변수 제거 
 -01 의미

 -02 의의

 -03 방법

 -04 예제


01 회귀분석

 -01 회귀분석 모형 종류
1) 단순 선형 회귀
 하나의 종속변수를 하나의 1차 설명변수로 해석하는 모형
2) 다중 회귀
 하나의 종속변수를 둘 이상의 1차 설명변수로 해석하는 모형
3) 다항 회귀
 하나의 종속변수를 하나 이상의 1차 이상 설명변수로 해석하는 모형(비선형 모형)
 
lm(formula, # y ~ x
      data)      # 데이터 이름

* 모든 회귀는 lm으로 해석할 수 있다.
* = 다항 회귀는 x^2가 있으나 데이터 자체에 계산된 값을 집어넣기 때문에
* 새로운 변수가 1차원의 설명변수로 여겨진다.


 -02 회귀모형의 가정
1) 선형성
 -> 독립변수와 종속변수의 산점도를 그려서 확인 가능
2) 독립성
 -> 잔차의 독립성
 -> 잔차가 설명변수와 서로 독립적인지 확인
 -> 더빈왓슨검정으로 확인 가능
3) 등분산성
 -> 잔차의 분산이 일정한지 확인
 -> 잔차산점도를 그려서 확인 가능
4) 정규성
 -> 잔차가 정규분포를 따르는지 확인
 -> 잔차히스토그램, Q-Q plot, 샤피로윌크 검정, ks검정)


 -03 모형 평가
1) 회귀계수 유의성 검정(t.test -> p.value 확인)
2) 모형 유의성 검정(f.test -> p.value 확인)
3) 모형 설명력(결정계수)

 

 -04 실습

cars

> cars
   speed dist
1      4    2
2      4   10
3      7    4
4      7   22
5      8   16
6      9   10
7     10   18
8     10   26
9     10   34
10    11   17

 

# 회귀계수 확인)

m <- lm(dist ~ speed, cars)

> m

Call:
lm(formula = dist ~ speed, data = cars)

Coefficients:
(Intercept)        speed  
    -17.579        3.932 

▲ 회귀 계수 추정량

 

# 회귀계수 직접 확인
coef(m)

> coef(m)
(Intercept)       speed 
 -17.579095    3.932409


# 적합값(예측값) 확인
fitted(m)

> fitted(m)
        1         2         3         4         5 
-1.849460 -1.849460  9.947766  9.947766 13.880175 
        6         7         8         9        10 
17.812584 21.744993 21.744993 21.744993 25.677401 
       11        12        13        14        15 
25.677401 29.609810 29.609810 29.609810 29.609810 
       16        17        18        19        20 
33.542219 33.542219 33.542219 33.542219 37.474628

 

# 잔차 구하기

cars$dist - fitted(m) # 잔차
residuals(m)

> residuals(m)
         1          2          3          4          5 
  3.849460  11.849460  -5.947766  12.052234   2.119825 
         6          7          8          9         10 
 -7.812584  -3.744993   4.255007  12.255007  -8.677401 
        11         12         13         14         15 
  2.322599 -15.609810  -9.609810  -5.609810  -1.609810 
        16         17         18         19         20 
 -7.542219   0.457781   0.457781  12.457781 -11.474628 

 

# 모형 평가)
summary(m)

> summary(m)

Call:
lm(formula = dist ~ speed, data = cars)

Residuals:
    Min      1Q  Median      3Q     Max 
-29.069  -9.525  -2.272   9.215  43.201 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -17.5791     6.7584  -2.601   0.0123 *  
speed         3.9324     0.4155   9.464 1.49e-12 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared:  0.6511,	Adjusted R-squared:  0.6438 
F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

 

* t-test 결과

Coefficients:
                     Estimate   Std. Error   t value      Pr(>|t|)    
(Intercept)    -17.5791       6.7584    -2.601      0.0123 *  
  speed            3.9324       0.4155     9.464   1.49e-12 ***
  ---
  Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

y = -17.5791 + 3.9324*speed

 

* f-test 결과

F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

=> 영가설(H0 : 모형이 유의하지 않다) 기각

 

* 모형의 설명력

Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 

모형의 설명력이 낮은 편이다. (통상 80 ~ 85% 이상을 기대함)

 

# 모형 진단)

(1) 잔차산점도(등분산성에 대한 확인)
par(mfrow = c(1,1))
plot(fitted(m), residuals(m))

 -> 우측 상단에 잔차가 큰 값을 일부 확인할 수 있다.

 

(2) 히스토그램 (잔차의 정규성 확인)
hist(residuals(m))

 -> 잔차가 큰 값이 일부 분포하는 것으로 확인된다.

 

(3) 모형 진단 시각화
plot(m)

->  잔차산점도가 출력된다.

-> 이상치의 경우 해당 샘플 번호도 확인 가능하다.

-> 붉은 선의 경우 잔차의 균등함이 어떠한지 보여준다. (선이 0에 근접할수록 등분산성임을 보여준다.)

 

-> Q-Q plot을 확인할 수 있다.

 

-> 잔차산점도의 일종이며, 스케일링한 값으로 확인 가능하다.

 

-> Cook's distance 바깥으로 나가면 이상치로 간주할 수 있다.

-> 이상치 탐지가 가능하다.

 

# 회귀모형 시각화)
plot(cars$speed, cars$dist)
abline(coef(m))

** 잔차 정렬
sort(abs(residuals(m)), decreasing = T)

> sort(abs(residuals(m)), decreasing = T)
       49        23        35        39        34        22        24        36        45        29        48 
43.201285 42.525372 30.795737 29.069080 22.795737 22.525372 21.407036 21.136672 18.866307 17.271854 16.201285 
       12        25        47        27        40        26        19         9         4         2        20 
15.609810 15.407036 15.201285 13.339445 13.069080 12.592964 12.457781 12.255007 12.052234 11.849460 11.474628 
       32        37        38        13        30        41        10         6        16        46         3 
11.204263 11.136672 10.863328  9.609810  9.271854  9.069080  8.677401  7.812584  7.542219  6.798715  5.947766 
       14        28        42        50         8         1         7        44        43        33        11 
 5.609810  5.339445  5.069080  4.268876  4.255007  3.849460  3.744993  2.933898  2.930920  2.795737  2.322599 
        5        15        21        31        17        18 
 2.119825  1.609810  1.474628  0.728146  0.457781  0.457781 

02 단순 선형 회귀분석

 -01 회귀계수의 추정

 단순 선형 회귀분석은 최소제곱법으로 회귀계수를 추정한다.

 - 최소제곱법 : 관측값과 모델 예측값의 차이(오차)를 제곱하여 그 합이 최소가 되도록 모델을 찾는 방법

 - 최소제곱추정량 : 최소제곱법을 통해 구한 추정량 (회귀 계수)

 

 제곱을 하는 이유는 음수/양수의 오차가 서로 상쇄되는 것을 방지하기 때문이며, 제곱을 하기 때문에 이상치에 더 민감하다.

 

 -02 모형 평가

  1) 회귀계수의 통계적 유의성 검증 (t-검정)

  H0 : 회귀계수가 유의하지 않다. (β0 = 0) = 모든 기울기들이 0이다.

  H1 : 회귀계수가 유의하다. (β0 != 0)

 

 각 독립변수가 종속변수에 대해 선형관계로 나타낼 수 있는지를 검정하며, t-검정을 통해 회귀계수 유의성 검정을 수행한다.

 모든 회귀 계수의 유의성 검정이 통계적으로 검증되어야 선택된 변수들의 조합을 최종 모형으로 사용할 수 있다.

 또한, 모형이 유의하더라도 회귀 계수는 유의하지 않을 수 있다.

 (각 변수들의 회귀계수가 유의한지, 모형 자체가 유의한지 모두 확인해야 한다.)

 t-통계량 : 회귀계수 / 표준오차

 따라서 t-통계량이 클수록 회귀계수는 커지고, 변수간 유의미한 인과관계가 존재하며, 유의확률값(p-value)는 작아진다.

 

  2) 회귀모형의 통계적 유의성 검증 (F-검정)

 H0 : 회귀모형이 유의하지 않다.

 H1 : 회귀모형이 유의하다.

 

회귀모형이 통계적으로 유의미한지를 검증하기 위해 F-통계량을 사용한다.

F-통계량은 총편차를 분해하여 종속변수의 총변동량을 오차제곱합(SSE)외 회귀제곱합(SSR)로 나누는 과정에서 만들어지는 통계량이다.

 

총편차 : y - ybar

총변동량(SST) = 오차제곱합(SSE) + 회귀제곱합(SSR)
좋은 회귀모형일수록 SSE는 낮고 SSR은 높아진다.

 

회귀분석의 분산분석표

요인 제곱합 자유도 제곱평균 F
회귀 SSR k MSR MSR / MSE
잔차 SSE n - k - 1 MSE
SST n - 1  

 

 -03 모형의 설명력

 데이터들이 회귀선 근처에 밀집할수록 회귀모형의 설명력이 좋음을 의미한다.

 총 변동에서의 회귀제곱합의 비중으로 모형의 설명력을 계산한다. (0 < R² < 1)

 결정계수는 모형에 유의하지 않은 변수의 개수가 증가해도 증가하는 단점이 있다.

 이를 보완한 것이 수정된 결정계수이다.

 

 결정계수(R²)가 수정된 결정계수(Radj) 보다 항상 크다.

 

[수식 입력]

 

[회귀모델 평가지표 입력 : 평균 절대 오차, 평균제곱오차,평균제곱근오차,평균절대백분률오차,150페이지]

 

 

결정계수

수정결정계수


03 다중 선형 회귀분석

-01 다중 선형 회귀분석이란

독립변수가 2개 이상이고 종속변수가 하나인 회귀분석 모형으로써, 독립변수의 선택이 중요하다.

또한 다중공선성의 문제 진단이 반드시 필요하다.


-02 다중공선성

설명변수끼리 강한 상관관계가 있는 경우를 말하며, 다중공선성이 존재하는 경우 회귀분석 모형의 독립성 가정을 위배한다.

따라서 정확한 회귀 계수의 추정이 어려워진다.

 

다중공선성은 독립변수간 상관계수로써, 분산팽창지수를 통해 진단할 수 있다. (산점도를 그려서도 확인할 수 있다.)

분산팽창지수(VIF) : VIF가 10보다 큰 경우 다중공선성의 문제가 있는 것으로 해석한다.

 

VIF = 1 / (1-R²) 

R² : 결정계수

 

분산팽창지수는 독립변수마다 값을 가정한다.

X1(target) <- X2 + X3 + X4 + X5 (1/(1- R²)

X2(target) <- X1 + X3 + X4 + X5 (1/(1- R²)

...

다른 변수들이 현 변수를 얼마나 설명할 수 있는지 회귀식을 모두 구한다.

( = 정보의 중복이 얼마나 심한지를 확인한다.)

 

> 다중공선성의 해결방법

 - 문제가 있는 변수를 제거

 - 주성분 분석을 사용한 차원 축소

 - 릿지, 라쏘, 엘라스틱넷(패널티 모형) 등의 모형 대체


-03 실습

[ 예제 - 다중회귀분석(주택가격셋) ]

# step1) 데이터 로딩
library(MASS)
Boston

> Boston
      crim    zn indus chas    nox    rm   age    dis rad tax ptratio  black lstat medv
1  0.00632  18.0  2.31    0 0.5380 6.575  65.2 4.0900   1 296    15.3 396.90  4.98 24.0
2  0.02731   0.0  7.07    0 0.4690 6.421  78.9 4.9671   2 242    17.8 396.90  9.14 21.6
3  0.02729   0.0  7.07    0 0.4690 7.185  61.1 4.9671   2 242    17.8 392.83  4.03 34.7
4  0.03237   0.0  2.18    0 0.4580 6.998  45.8 6.0622   3 222    18.7 394.63  2.94 33.4
5  0.06905   0.0  2.18    0 0.4580 7.147  54.2 6.0622   3 222    18.7 396.90  5.33 36.2
6  0.02985   0.0  2.18    0 0.4580 6.430  58.7 6.0622   3 222    18.7 394.12  5.21 28.7
7  0.08829  12.5  7.87    0 0.5240 6.012  66.6 5.5605   5 311    15.2 395.60 12.43 22.9
8  0.14455  12.5  7.87    0 0.5240 6.172  96.1 5.9505   5 311    15.2 396.90 19.15 27.1
9  0.21124  12.5  7.87    0 0.5240 5.631 100.0 6.0821   5 311    15.2 386.63 29.93 16.5
10 0.17004  12.5  7.87    0 0.5240 6.004  85.9 6.5921   5 311    15.2 386.71 17.10 18.9

 

# step2) 학습
m <- lm(medv ~ ., Boston)

> lm(medv ~ ., Boston)

Call:
lm(formula = medv ~ ., data = Boston)

Coefficients:
(Intercept)         crim           zn        indus         chas          nox           rm          age  
  3.646e+01   -1.080e-01    4.642e-02    2.056e-02    2.687e+00   -1.777e+01    3.810e+00    6.922e-04  
        dis          rad          tax      ptratio        black        lstat  
 -1.476e+00    3.060e-01   -1.233e-02   -9.527e-01    9.312e-03   -5.248e-01  

 

# step3) 평가
summary(m)

> summary(m)

Call:
lm(formula = medv ~ ., data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.595  -2.730  -0.518   1.777  26.199 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.646e+01  5.103e+00   7.144 3.28e-12 ***
crim        -1.080e-01  3.286e-02  -3.287 0.001087 ** 
zn           4.642e-02  1.373e-02   3.382 0.000778 ***
indus        2.056e-02  6.150e-02   0.334 0.738288    
chas         2.687e+00  8.616e-01   3.118 0.001925 ** 
nox         -1.777e+01  3.820e+00  -4.651 4.25e-06 ***
rm           3.810e+00  4.179e-01   9.116  < 2e-16 ***
age          6.922e-04  1.321e-02   0.052 0.958229    
dis         -1.476e+00  1.995e-01  -7.398 6.01e-13 ***
rad          3.060e-01  6.635e-02   4.613 5.07e-06 ***
tax         -1.233e-02  3.760e-03  -3.280 0.001112 ** 
ptratio     -9.527e-01  1.308e-01  -7.283 1.31e-12 ***
black        9.312e-03  2.686e-03   3.467 0.000573 ***
lstat       -5.248e-01  5.072e-02 -10.347  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.745 on 492 degrees of freedom
Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7338 
F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16

 

indus, age의 경우 모두 유의하지 않게 나왔으며, 수치형 데이터이다.

수치형 - 수치형 간의 관계를 확인해보아야하므로 상관관계(피어슨 상관관계)를 확인해야 한다.

 

# step4) 진단
(1) 모델 진단 시각화
plot(m)

-> 정규분포를 따르는 것 같지만 이상치를 제거하고도 어느 정도 선에서 떨어져있는 것이 확인되므로, 완전한 정규분포를 따른다고 말하기는 어려울 것으로 판단된다.

 

 

(2) 정규성 검정
> 2-1) 히스토그램
hist(residuals(m))

-> 왼쪽과 오른쪽의 빈도가 유사하며, -20 ~ 20까지의 분포 역시 비슷하게 보인다.

-> 그러나 잔차가 20 이상인 지점부터는 오른쪽 꼬리가 긴 것을 확인할 수 있다.

-> 따라서 정규분포를 따른다고 볼 수 없다.

 

> 2-2) 샤피로윌크 검정
install.packages('car')
library(car)

shapiro.test(m$residuals)

> shapiro.test(m$residuals)

	Shapiro-Wilk normality test

data:  m$residuals
W = 0.90138, p-value < 2.2e-16

 

H0 : 정규분포를 따른다. (영가설 기각)

H1 : 정규분포를 따르지 않는다.

 => 잔차의 정규성 가정은 성립되지 않는다.

 

(3) 등분산선 검정
plot(m$fitted.values, m$residuals)

 => 이상치로 예상되는 세 개의 점(잔차가 매우 큰 세 점)을 제외하고 잔차의 패턴이 점차 줄었다가 커지는 패턴으로 보인다.

      따라서 등분산성을 만족한다고 보기 어렵다.

 

 

(4) 독립성 검정

durbinWatsonTest(m)

> durbinWatsonTest(m)
 lag Autocorrelation D-W Statistic p-value
   1       0.4542626      1.078375       0
 Alternative hypothesis: rho != 0

 

H0 : 잔차가 서로 독립적이다. (영가설 기각)

H1 : 잔차가 서로 독립적이지 않다.

 

=> 잔차의 독립성 가정이 성립된다고 볼 수 없다.

 

# step5) 여러가지 회귀모형의 평가척도
mse : sum((y-yhat)^2)/n

sum((Boston$medv - m$fitted.values)^2) / nrow(Boston) # MSE

sqrt(sum((Boston$medv - m$fitted.values)^2) / nrow(Boston)) # RMSE

sum(abs(Boston$medv - m$fitted.values)) / nrow(Boston) # MAE

> sum((Boston$medv - m$fitted.values)^2) / nrow(Boston) # MSE
[1] 21.89483
> sqrt(sum((Boston$medv - m$fitted.values)^2) / nrow(Boston)) # RMSE
[1] 4.679191
> sum(abs(Boston$medv - m$fitted.values)) / nrow(Boston) # MAE
[1] 3.270863

 

# 함수
install.packages('Metrics')
library(Metrics)
Metrics::mse(Boston$medv, m$fitted.values)
Metrics::rmse(Boston$medv, m$fitted.values)
Metrics::mae(Boston$medv, m$fitted.values)
Metrics::mape(Boston$medv, m$fitted.values)

> Metrics::mse(Boston$medv, m$fitted.values)
[1] 21.89483
> Metrics::rmse(Boston$medv, m$fitted.values)
[1] 4.679191
> Metrics::mae(Boston$medv, m$fitted.values)
[1] 3.270863
> Metrics::mape(Boston$medv, m$fitted.values)
[1] 0.164173

 

# step6) 다중공선성 진단
library(car)
vif(m)

> vif(m)
    crim       zn    indus     chas      nox       rm      age      dis      rad      tax 
1.792192 2.298758 3.991596 1.073995 4.393720 1.933744 3.100826 3.955945 7.484496 9.008554 
 ptratio    black    lstat 
1.799084 1.348521 2.941491 

 

 * vif가 10 이상인 경우 다중공선성 문제가 심각한 것으로 해석하며, 실무에서는 4 이상일 때도 의심스러운 수치로 해석한다.

 

# 직접 계산)
Boston_x <- Boston[, -ncol(Boston)]

m_tax <- lm(tax ~ ., Boston_x) # 설명변수들끼리 한 설명변수에 대한 영향 확인
summary(m_tax)

> summary(m_tax)

Call:
lm(formula = tax ~ ., data = Boston_x)

Residuals:
     Min       1Q   Median       3Q      Max 
-219.122  -20.031   -4.846   16.509  258.135 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 148.43175   60.75444   2.443  0.01491 *  
crim         -0.10357    0.39358  -0.263  0.79255    
zn            0.81476    0.16026   5.084 5.26e-07 ***
indus         7.16172    0.66211  10.816  < 2e-16 ***
chas        -27.76723   10.24257  -2.711  0.00694 ** 
nox          75.77074   45.61937   1.661  0.09736 .  
rm           -8.25524    4.99142  -1.654  0.09879 .  
age           0.10520    0.15813   0.665  0.50619    
dis           1.03253    2.38830   0.432  0.66569    
rad          13.90186    0.48925  28.415  < 2e-16 ***
ptratio       2.62525    1.56237   1.680  0.09353 .  
black        -0.01903    0.03216  -0.592  0.55422    
lstat        -0.20664    0.60732  -0.340  0.73381    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 56.83 on 493 degrees of freedom
Multiple R-squared:  0.889,	Adjusted R-squared:  0.8863 
F-statistic:   329 on 12 and 493 DF,  p-value: < 2.2e-16

 

R^2 : 0.889

1/(1-R^2) => 9.009009 (tax와 유사)


04 변수 선택 / 변수 제거 
 -01 의미
 - 지도학습의 Y예측에 유의한 변수 선택, 유의하지 않은 변수를 제거함으로써 학습 효과를 극대화시킨다.


-02 의의
- 불필요한 변수 제거 시 더 단순한 모델로 예측하게 되므로 과적합 해소가 가능하다.
- 예측력 강화


-03 방법
 1) 필터 기법
  - 변수 하나씩 종속변수와의 유의성을 확인 
  - 종류 : 상관계수, IG, 카이제곱통계량, t.test 등 

 2) 래퍼 기법
  - 여러 변수들의 상관성을 고려하여 모델 전체 학습 측면에서 변수 선택 
  - 종류 : 전진선택법, 후진제거법, 단계적선택법

 3) 임베디드 기법
  - 머신러닝 기법을 사용한 모델의 유의한 변수 확인 
  - 종류 : tree 기반 모델(DT, RF 등), 회귀분석 


 -04 예제

[ 예제 - 회귀분석시 변수선택 ]
y <- Boston$medv
x <- Boston[,-ncol(Boston)]

# 1. 상관계수
cor(x,y)

> cor(x,y)
              [,1]
crim    -0.3883046
zn       0.3604453
indus   -0.4837252
chas     0.1752602
nox     -0.4273208
rm       0.6953599
age     -0.3769546
dis      0.2499287
rad     -0.3816262
tax     -0.4685359
ptratio -0.5077867
black    0.3334608
lstat   -0.7376627

 

chars는 찰스강 인접여부로 factor형이다.

따라서 종속변수와의 상관관계를 상관계수로 확인하는 행위가 부적절하다.

나머지 변수 중 회귀분석의 각 회귀계수 유의성 검정 결과로 제시된 indus, age 컬럼의 상관성은 무시할정도로 낮다고 볼 수 없다.

(정말로 상관성이 낮은지 아닌지를 보기위해서는 상관관계 검정을 해야한다.)

 

# 2. 전진선택 / 후진제거 / 단계적선택법
step(object,                              # 모델명
        direction = c('both',          # stepwise
                             'backward', # 후진제거법
                             'forward'))   # 전진선택법

# 전진선택법 : b0로부터 시작해서 유의하다고 판단되는 변수들을 하나씩 추가한다. (더 이상 추가할 변수가 없을때까지)
# 후진선택법 : 모든 변수가 삽입된 모형으로부터 가장 유의하지 않다고 판단되는 변수들을 하나씩 제거한다. (더 이상 제거할 변수가 없을때까지)
# stepwise : 모든 변수가 삽입된 모형으로부터 가장 중요하지 않은 변수들을 제거하면서 제거된 변수들 중 다시 추가하는 경우를 고려한다.

# 변수선택 과정에서의 모형의 평가
# 선택법을 통해 3개의 변수가 선택되었으나 2개를 추가해야할 필요가 있어
# 선택전, 선택후 모델의 평가점수를 비교하였더니 변수 5개가 더 설명력이 있었다~ 라고 하는 경우 수정결정계수를 봐야한다. (rsqure)

# AIC, BIC는 모형 자체를 평가하는 것이 아니라 변수의 수를 결정할 때 참고
# 최종 스코어 비교는 MSE, MAE로 평가
# 변수의 수도 샘플의 수도 다른 두 모델을 비교할 때는 r^2로 비교하기 어려움, 그럴 때에는 MSE로 비교한다.

 

▶ 전진선택법
step1 <- step(m, direction = 'forward')

> step1 <- step(m, direction = 'forward')
Start:  AIC=1589.64
medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + 
    tax + ptratio + black + lstat

 

▶ 후진제거법
step2 <- step(m, direction = 'backward')

> step2 <- step(m, direction = 'backward')
Start:  AIC=1589.64
medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + 
    tax + ptratio + black + lstat

          Df Sum of Sq   RSS    AIC
- age      1      0.06 11079 1587.7
- indus    1      2.52 11081 1587.8
<none>                 11079 1589.6
- chas     1    218.97 11298 1597.5
- tax      1    242.26 11321 1598.6
- crim     1    243.22 11322 1598.6
- zn       1    257.49 11336 1599.3
- black    1    270.63 11349 1599.8
- rad      1    479.15 11558 1609.1
- nox      1    487.16 11566 1609.4
- ptratio  1   1194.23 12273 1639.4
- dis      1   1232.41 12311 1641.0
- rm       1   1871.32 12950 1666.6
- lstat    1   2410.84 13490 1687.3

Step:  AIC=1587.65
medv ~ crim + zn + indus + chas + nox + rm + dis + rad + tax + 
    ptratio + black + lstat

          Df Sum of Sq   RSS    AIC
- indus    1      2.52 11081 1585.8
<none>                 11079 1587.7
- chas     1    219.91 11299 1595.6
- tax      1    242.24 11321 1596.6
- crim     1    243.20 11322 1596.6
- zn       1    260.32 11339 1597.4
- black    1    272.26 11351 1597.9
- rad      1    481.09 11560 1607.2
- nox      1    520.87 11600 1608.9
- ptratio  1   1200.23 12279 1637.7
- dis      1   1352.26 12431 1643.9
- rm       1   1959.55 13038 1668.0
- lstat    1   2718.88 13798 1696.7

Step:  AIC=1585.76
medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + 
    black + lstat

          Df Sum of Sq   RSS    AIC
<none>                 11081 1585.8
- chas     1    227.21 11309 1594.0
- crim     1    245.37 11327 1594.8
- zn       1    257.82 11339 1595.4
- black    1    270.82 11352 1596.0
- tax      1    273.62 11355 1596.1
- rad      1    500.92 11582 1606.1
- nox      1    541.91 11623 1607.9
- ptratio  1   1206.45 12288 1636.0
- dis      1   1448.94 12530 1645.9
- rm       1   1963.66 13045 1666.3
- lstat    1   2723.48 13805 1695.0

 

# 첫번째 모델

Start : AIC = 1589.64 (모든 변수를 제거하지 않은 시점에서의 시작점)

<none> 기준으로 윗쪽에는 유의한 값

즉, age, indus 변수는 제거를 고려할 필요가 있으며 그 외의 변수는 제거할 필요가 없다.

 

# 두번째 모델

Start : AIC = 1587.65(age가 제거된 시점에서의 시작점)

<none> 기준으로 윗쪽에는 유의한 값

즉, indus 변수는 제거를 고려할 필요가 있으며 그 외의 변수는 제거할 필요가 없다.

 

# 세번째 모델

Start: Start : AIC = 1585.76(age, indus가 제거된 시점에서의 시작점)

더 이상 제거할 변수가 없어 정지된다.

 

=> 후진제거법에 의해 age, indus 컬럼이 제거된 모형으로 수렴되었다.

     최종모형의 formula는 formula(step2)로 확인이 가능하다.

 

# 수식 확인

m2 <- lm(formula(step2), Boston)

> formula(step2)
medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + 
    black + lstat

▲ 해당 수식을 lm에 작성하면 된다.

 

# 변수의 개수가 다르므로 모델의 성능평가는 수정결정계수를 이용하면 된다.
# 0.7338 -> 0.7348
summary(m2)

> summary(m2)

Call:
lm(formula = formula(step2), data = Boston)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.5984  -2.7386  -0.5046   1.7273  26.2373 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  36.341145   5.067492   7.171 2.73e-12 ***
crim         -0.108413   0.032779  -3.307 0.001010 ** 
zn            0.045845   0.013523   3.390 0.000754 ***
chas          2.718716   0.854240   3.183 0.001551 ** 
nox         -17.376023   3.535243  -4.915 1.21e-06 ***
rm            3.801579   0.406316   9.356  < 2e-16 ***
dis          -1.492711   0.185731  -8.037 6.84e-15 ***
rad           0.299608   0.063402   4.726 3.00e-06 ***
tax          -0.011778   0.003372  -3.493 0.000521 ***
ptratio      -0.946525   0.129066  -7.334 9.24e-13 ***
black         0.009291   0.002674   3.475 0.000557 ***
lstat        -0.522553   0.047424 -11.019  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.736 on 494 degrees of freedom
Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7348 
F-statistic: 128.2 on 11 and 494 DF,  p-value: < 2.2e-16

 

=> age, indus 컬럼 제외 후 수정결정계수가 소폭 증가했으므로 두 변수의 제거는 의미가 있다!

 

▶ 단계적 선택법
step3 <- step(m, direction = 'both')

> step3 <- step(m, direction = 'both')
Start:  AIC=1589.64
medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + 
    tax + ptratio + black + lstat

          Df Sum of Sq   RSS    AIC
- age      1      0.06 11079 1587.7
- indus    1      2.52 11081 1587.8
<none>                 11079 1589.6
- chas     1    218.97 11298 1597.5
- tax      1    242.26 11321 1598.6
- crim     1    243.22 11322 1598.6
- zn       1    257.49 11336 1599.3
- black    1    270.63 11349 1599.8
- rad      1    479.15 11558 1609.1
- nox      1    487.16 11566 1609.4
- ptratio  1   1194.23 12273 1639.4
- dis      1   1232.41 12311 1641.0
- rm       1   1871.32 12950 1666.6
- lstat    1   2410.84 13490 1687.3

Step:  AIC=1587.65
medv ~ crim + zn + indus + chas + nox + rm + dis + rad + tax + 
    ptratio + black + lstat

          Df Sum of Sq   RSS    AIC
- indus    1      2.52 11081 1585.8
<none>                 11079 1587.7
+ age      1      0.06 11079 1589.6
- chas     1    219.91 11299 1595.6
- tax      1    242.24 11321 1596.6
- crim     1    243.20 11322 1596.6
- zn       1    260.32 11339 1597.4
- black    1    272.26 11351 1597.9
- rad      1    481.09 11560 1607.2
- nox      1    520.87 11600 1608.9
- ptratio  1   1200.23 12279 1637.7
- dis      1   1352.26 12431 1643.9
- rm       1   1959.55 13038 1668.0
- lstat    1   2718.88 13798 1696.7

Step:  AIC=1585.76
medv ~ crim + zn + chas + nox + rm + dis + rad + tax + ptratio + 
    black + lstat

          Df Sum of Sq   RSS    AIC
<none>                 11081 1585.8
+ indus    1      2.52 11079 1587.7
+ age      1      0.06 11081 1587.8
- chas     1    227.21 11309 1594.0
- crim     1    245.37 11327 1594.8
- zn       1    257.82 11339 1595.4
- black    1    270.82 11352 1596.0
- tax      1    273.62 11355 1596.1
- rad      1    500.92 11582 1606.1
- nox      1    541.91 11623 1607.9
- ptratio  1   1206.45 12288 1636.0
- dis      1   1448.94 12530 1645.9
- rm       1   1963.66 13045 1666.3
- lstat    1   2723.48 13805 1695.0

 

# 첫번째 모델

Start : AIC = 1589.64 (모든 변수를 제거하지 않은 시점에서의 시작점)

<none> 기준으로 윗쪽에는 유의한 값

즉, age, indus 변수는 제거를 고려할 필요가 있으며 그 외의 변수는 제거할 필요가 없다.

 

# 두번째 모델

Start : AIC = 1587.65(age가 제거된 시점에서의 시작점)

<none> 기준으로 윗쪽에는 유의한 값

즉, indus 변수는 제거를 고려할 필요가 있으며 그 외의 변수는 제거할 필요가 없다.

제거된 age의 재편입을 고려하였으나 추가하였을 때 의미가 없으므로 age는 제거된다.

 

# 세번째 모델

Start: Start : AIC = 1585.76(age, indus가 제거된 시점에서의 시작점)

제거된 age, indus의 재편입을 고려하였으나 추가하였을 때 의미가 없으므로 age, indus는 제거된다.

더 이상 제거할 변수가 없어 정지된다.

 

 => age, indus 두 변수를 제거하는 것이 효율적으로 보인다.


 

[ 예제 - 회귀모형과 랜덤포레스트 모형 성능 비교(주택가격셋) ] 

# step1) 데이터 로딩
library(MASS)
Boston

# step2) 데이터 분리
set.seed(50)
rn <- sample(1:nrow(Boston), nrow(Boston)*0.7)

Boston_tr <- Boston[rn, ]
Boston_te <- Boston[-rn, ]

# step3) 모델링
m_lm <- lm(medv ~., Boston_tr)

library(randomForest)
m_rf <- randomForest(medv ~ ., Boston_tr)

# step4) 적합값 확인
m_lm$fitted.values
pre_tr_lm <- predict(m_lm, newdata = Boston_tr)
pre_te_lm <- predict(m_lm, newdata = Boston_te)

pre_tr_rf <- predict(m_rf, newdata = Boston_tr)
pre_te_rf <- predict(m_rf, newdata = Boston_te)

# step5) 평가 (mse)
library(Metrics)

# 1) lm
mse(Boston_tr$medv, pre_tr_lm) # 21.16367
mse(Boston_te$medv, pre_te_lm) # 24.8355

# 2) rf
mse(Boston_tr$medv, pre_tr_rf) # 2.427911
mse(Boston_te$medv, pre_te_rf) # 13.91678

# rf 사용 채택