14. 선형회귀분석

Statistics
교재 9장
Author

Kim Jae Sook

Published

February 5, 2024

국민총생산에 영향을 주는 것이 이자율 이외에 수출, 수입, R&D비율, 실업률 등 여러가지일 수 있다. 몸무게를 설명할 수 있는 변수가 키뿐 아니라 하루 칼로리 섭취량과 운동량도 영향을 줄 것이라고 생각한다면 키, 칼로리 섭취량과 운동량을 동시에 고려하여 선형회귀분석을 시도할 수 있다. 이와 같이 둘 이상의 설명변수를 고려하는 것을 다중선형회귀분석이라고 한다.

[엑셀] 실습하기

[R기초] 실습하기

단순선형회귀분석

단순선형회귀분석(Simple Linear Regression)이란 종속변수와 이에 영향을 주는 독립변수가 하나인 분석이다. 독립변수와 종속변수가 모두 수치형 변수이어야 한다. 그런데 범주형 독립변수의 경우 더미변수로 만들어 사용 가능하다. 회귀모형(regression model)은 하나의 종속변수를 여러 개의 독립변수가 설명한다고 보는 통계적 모형이다. 회귀모형은 선형과 비선형으로 나눌 수 있으며, 선형회귀모형은 종속변수 \(Y\)가 독립변수들의 선형 함수로 표현되는 것, 비선형회귀모형은 지수함수, 로그함수 등과 같이 종속변수 \(Y\)가 독립변수들의 비선형 함수로 표현되는 것을 말한다. 단순선형회귀모형은 독립변수가 한 개이고 종속변수와 선형관계가 있는 것을 말하며, 다중선형회귀모형은 독립변수가 두 개 이상이고 종속변수와 선형관계가 있는 것을 말한다.

단순선형회귀분석 실행 방법

회귀모형 설정

\[ Y=\beta_0 + \beta_1 X + \varepsilon, \ \ \varepsilon \sim N(0,\ \sigma^2 ) \]

  • 모든 점들이 선형 위에 놓이는 것은 아니므로 오차항이 들어간다.

  • 오차항이 정규분포를 따르므로 \(Y\)도 정규분포를 따른다.

  • 추정해야할 회귀계수는 \(\beta_0\)(절편), \(\beta_1\)(기울기)이고, 절편보다는 기울기에 관심이 있다. 기울기를 알면 독립변수가 종속변수에 얼만큼 영향을 주는지 알 수 있다. 즉 \(X\)의 변화에 따라 \(Y\)의 변화량이 높으면, 독립변수가 종속변수를 설명하는 부분이 크다는 뜻이다. 반대로 \(X\)의 변화에 따라 \(Y\)의 변화량이 낮으면, 독립변수가 종속변수를 설명하는 부분은 큰 영향력이 없다는 뜻이다.

회귀계수 추정

  • 오차제곱합을 최소화하는 방법(최소제곱법, Least Squared Method)으로 추정한다.

\[ min \left(\sum_{i} \varepsilon^2 _i \right)= \sum_{i=1}^{n} \left(y_i - \beta_0 - \beta_1 X_i \right)^2 \] - 각각 편미분을 통해서 \(\beta_0\), \(\beta_1\)을 추정하며, 최종적으로 추정된 식은 \(\hat{y}\)으로 표현한다.

\[ \hat{y}=\hat{\beta_0} + \hat{\beta_1} \hat{x} \]

회귀모형의 타당성 검정

  • 오차항이 서로 독립이라는 가정에서 회귀계수를 추정하기 때문에 회귀모형의 타당성을 검증할 필요가 있다.

  • 독립변수가 종속변수에 선형적으로 영향을 주는 것인가에 대한 검정이다. 즉 독립변수 각각의 기울기에 대해 종속변수의 영향력을 검정하는 것이다.

  • 단순선형회귀모형에서의 타당성: 회귀모형의 적합성=회귀계수에 대한 검정 결과

  • 모형 전체에 대한 검정:

\(\ \ \ \ \ \ \ \) 귀무가설: \(\beta_1 = \beta_2 = \cdots = \beta_k =0\) (독립변수 \(X_i\)가 종속변수에 영향을 주지 않는다.)

\(\ \ \ \ \ \ \ \) 대립가설: \(\beta_i \neq 0\) (적어도 하나의 독립변수는 종속변수에 영향을 준다.)

  • 회귀계수에 대한 검정의 귀무가설과 대립가설은 다음과 같으며, 회귀계수에 대한 검정은 \(t\)분포를 이용하므로 \(t\)-검정을 통해 가설 검정이 가능하다.

\(\ \ \ \ \ \ \ \) 귀무가설: \(\beta_i =0\) (독립변수 \(X_i\)가 종속변수에 영향을 주지 않는다.)

\(\ \ \ \ \ \ \ \) 대립가설: \(\beta_i \neq 0\) (독립변수 \(X_i\)가 종속변수에 영향을 준다.)

\[ T = \dfrac{\hat{\beta_i}}{\hat{\beta_i}의 표준오차} \]

변수선택

  • 독립변수가 여러 개일때 해당된다.

  • 단순회귀분석은 변수가 하나이므로 변수 선택의 의미가 없다.

결정계수(coefficient of determinant)

  • 하나의 독립변수가 종속변수 \(Y\)를 얼마나 설명해주는가에 대한 비율이다.

  • \(R^2\): \(0 \sim 1\)로 표현되며, \(1\)에 가까울수록 독립변수가 종속변수 \(Y\)를 잘 설명한다고 해석한다.

  • 자연과학에서는 실험을 통해서 자료를 수집하며, \(0.8\) 이상으로 높은 설명력을 보이며, 사회과학에서는 관찰을 통해서 자료를 수집하며, \(0.3\) 근처의 수치로 나타난다.

가정에 대한 검토

  • 회귀모형설정에서 오차에 대한 정규성, 독립성, 등분산성을 가정한다.

  • 추정된 회귀식으로부터 잔차(residual)를 계산할 수 있고, 잔차는 오차항을 추정하는데 사용할 수 있다.

\[ e_i = y_i - \hat{y_i} \]

  • 잔차를 이용하여 모형이 선형인지 적합성 검정을 할 수 있고, 오차항의 정규분포, 오차항의 등분산성 등을 확인할 수 있다.

  • 오차항들은 서로 독립이어야 하므로 자기상관이 있는지 검토해야 한다. 더빈-왓슨(Durbin-Watson) 검정을 통해 하며, 다음 식의 \(d\)의 값이 \(0 \sim 4\)의 값을 가진다. \(2\)근방이면 자기 상관이 없는 것(독립)이고, \(2\) 미만이면 양의 자기상관, \(2\) 초과면 음의 자기상관을 갖는다.

\[ d = \dfrac{\sum\limits_{i=2}^{N}\left(e_i - e_{i-1}\right)^2}{\sum\limits_{i=1}^{N} e^2 _i} \]

참고자료

심장병 자료

  • 리터 단위로 와인을 마셨을 때, 인구 10만명당 사망자수는 어떻게 될 것인가? 와인소비(wine)가 심장병 사망(death)에 영향을 미치는지 검정하시오. 아래 표는 오래된 자료임.

# simple linear regression analysis

heartData = read.csv('heartData.csv', header = T)
str(heartData)
'data.frame':   19 obs. of  3 variables:
 $ Country: chr  "Australias" "Austria" "Belgium/Luxembourg" "Canada" ...
 $ wine   : num  2.5 3.9 2.9 2.4 2.9 0.8 9.1 0.8 0.7 7.9 ...
 $ death  : int  211 167 131 191 220 297 71 211 300 107 ...
# scatter plot
x = heartData$wine
y = heartData$death
plot(x, y)  # 그래프 상 와인을 많이 마실수록 심장사망률이 낮아지고 있음

# correlation coefficient
cor.test(x, y)  # 강한 음의 상관관계가 존재하며, 즉 의미있는 음의 기울기가 나옴

    Pearson's product-moment correlation

data:  x and y
t = -6.4566, df = 17, p-value = 5.913e-06
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.9379588 -0.6296368
sample estimates:
       cor 
-0.8428127 
# regression analysis
model = lm(y~x)
summary(model)  # hat y = 260.563 - 22.969 x, 포도주소비량은 심장병 사망에 영향을 미치며, 결정계수 값이 0.7103이므로 포도주 소비량이 심장병 사망에 대해 71% 정도 설명함.

Call:
lm(formula = y ~ x)

Residuals:
   Min     1Q Median     3Q    Max 
-62.95 -25.91 -12.35  26.97  55.52 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  260.563     13.835  18.833 7.97e-13 ***
x            -22.969      3.557  -6.457 5.91e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 37.88 on 17 degrees of freedom
Multiple R-squared:  0.7103,    Adjusted R-squared:  0.6933 
F-statistic: 41.69 on 1 and 17 DF,  p-value: 5.913e-06
## normal, equal variance, independent(단순선형회귀 결과의 잔차를 통한 회귀진단)
plot(model, 1)  # linear, 모든 예측값에서 점선을 기준으로 잔차가 비슷하게 분포해야 모형이 선형성을 만족한다고 할 수 있음

plot(model, 2)  # normality, 직선 상에 점들이 놓이면 정규분포임

shapiro.test(model$residuals) # normality, 귀무가설이 정규분포를 따름, p값에 따라 귀무가설 채택

    Shapiro-Wilk normality test

data:  model$residuals
W = 0.93787, p-value = 0.2413
plot(model, 3)  # equal variance, 빨간 실선이 수평선으로 나올수록 오차항의 등분산성 만족

## Durbin-Watson test: Ho: errors are independent
# install.packages('lmtest')  # lmtest 패키지가 없으면 주석을 지우고 설치하기
library(lmtest)
Warning: package 'lmtest' was built under R version 4.3.3
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric

dwtest(model)  # DW값이 2근방에 와야함.

    Durbin-Watson test

data:  model
DW = 2.2068, p-value = 0.7181
alternative hypothesis: true autocorrelation is greater than 0

다중선형회귀분석

다중선형회귀모형은 독립변수가 여러 개인 선형모형이다. 여러 독립변수들은 서로 독립이며, 독립변수의 숫자가 적을수록, 그리고 종속변수를 잘 설명할수록 좋은 모형이다.

단순선형회귀분석 실행 방법

회귀모형 설정

\[ Y=\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k x_k + \varepsilon, \ \ \varepsilon \sim N(0,\ \sigma^2 ) \]

  • 여러 독립변수들이 종속변수에 선형적으로 영향을 미친다. 이때 오차항은 평균이 \(0\), 분산이 \(\sigma^2\)이고, 등분산인 정규분포를 따른다고 가정한다.

회귀계수 추정

  • 절편과 \(k\)개의 기울기: \(k+1\)개의 회귀계수 추정

  • 최소제곱법(Least Squared Method)으로 추정

\[ min \left(\sum_{i} \varepsilon^2 _i \right)= \sum_{i=1}^{n} \left(y_i - \beta_0 - \beta_1 X_{1i} + \cdots + \beta_k X_{ki} \right)^2 \]

회귀모형의 타당성 검정

  • 모형 전체에 대한 적합성 검정: 적어도 하나의 독립변수가 종속변수에 선형적인 영향을 주는가?

\(\ \ \ \ \ \ \ \) 귀무가설: \(\beta_1 = \beta_2 = \cdots = \beta_k =0\) (독립변수 \(X_i\)가 종속변수에 영향을 주지 않는다.)

\(\ \ \ \ \ \ \ \) 대립가설: \(\beta_i \neq 0\) (적어도 하나의 독립변수는 종속변수에 영향을 준다.)

\(\ \ \ \ \ \ \ \) 검정통계량: 분산분석표에 의한 \(F\)통계량 (유의확률이 \(0.05\)보다 작으면 이 선형모형은 타당하다.)

  • 회귀계수에 대한 검정은 독립변수 하나하나에 대한 종속변수의 영향력을 검정하며, 귀무가설과 대립가설은 다음과 같다. 회귀계수에 대한 검정은 \(t\)분포를 이용하므로 \(t\)-검정을 통해 가설 검정이 가능하다.

\(\ \ \ \ \ \ \ \) 귀무가설: \(\beta_i =0\) (독립변수 \(X_i\)가 종속변수에 영향을 주지 않는다.)

\(\ \ \ \ \ \ \ \) 대립가설: \(\beta_i \neq 0\) (독립변수 \(X_i\)가 종속변수에 영향을 준다.)

변수선택

  • 독립변수가 여러 개인 경우 독립변수는 종속변수에 유의한 영향력이 있는 변수로 구성하는 것이 효과적이다.

  • 독립변수들끼리 서로 독립이라고 가정한다.

  • 다중공선성(multicollinearity): 독립변수들끼리 상관이 높아, 회귀 계수의 분산을 크게 해서 추정 회귀 계수를 믿을 수 없게 되는 문제가 발생하는 것을 말한다. 모형이 이상한 방향으로 나타나기도 한다.

  • 유의하지 않은 독립변수를 제거한다.

  • 전진 선택법(forward selection): 종속변수에 영향을 줄 것으로 생각되는 독립변수들 중 가장 크게 영향을 주는 변수를 하나씩 선택하여 모형에 추가하는 방식이다.(단점: 한번 추가하면 다시는 모형에서 변수를 빼지 않음)

  • 후진 제거법(backward elimination): 다중선형회귀모형에 모든 독립변수를 넣고, 가장 영향력이 적은 독립변수를 선택하여 유의성을 판단하여 유의하지 안흐면 제거한다.(단점: 한번 제거하면 다시는 모형에서 변수를 넣지 않음)

  • stepwise 방법: 전진 선택법과 후진 제거법을 혼합하여, 독립변수를 한번에 하나씩 추가 또는 제거하는 방식이다.

결정계수(coefficient of determinant)

  • 종속변수의 총변동량 중 독립변수에 의해 설명되는 비율

  • \(R^2=\dfrac{SS_R}{SS_T}\): \(0 \sim 1\)로 표현되며, \(1\)에 가까울수록 독립변수들의 설명력이 좋다.

  • 다중상관계수(multiple correlation coefficient): \(Y\)와 예측된 \(\hat{T}\) 사이의 피어슨 상관계수임. 결정계수의 양의 제곱근으로 계산되며 \(1\)에 가까울수록 추정된 회귀식으로 종속변수를 잘 추측할 수 있음을 의미한다.

가정에 대한 검토

  • 회귀모형설정에서 오차에 대한 정규성, 독립성, 등분산성을 가정한다.

  • 추정된 회귀식으로부터 잔차(residual)를 계산할 수 있고, 잔차는 오차항을 추정하는데 활용한다.(모형이 선형모형으로 적절한가, 오차항이 정규분포를 따르는가, 오차항이 등분산을 따르는가, 오차항들이 자기상관(autocorrelation)이 없는가)

  • 다중공선성 검토: 분산팽창계수(Variance Inflation Factor)를 계산하여 \(10\) 이하이면 다중공선성이 없다고 판단한다.

더미변수 독립변수의 처리

  • 명목이나 순서척도변수를 독립변수로 넣고자 할 경우, 그 변수를 더미변수 형태로 변환해서 사용한다. 예를 들어 성별에서 남자를 \(0\), 여자를 \(1\)로 놓거나, 거주지역 중 농촌, 도농복합, 도시를 \(00\), \(10\), \(01\)으로 놓을 수 있다.

Cars93 데이터셋에서의 예시

  • 종속변수: 가격(Price), \(\ \ \)독립변수: 연비(MPG.city), 엔진크기(Enginesize), 분당 회전수(RPM), 연료탱크 용량(Fuel.tank.capacity), 차량 중량(Weight)
# multiple linear regression

library(MASS)

str(Cars93)
'data.frame':   93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
data = Cars93[, c('Price','MPG.city','EngineSize','RPM','Fuel.tank.capacity','Weight')]
head(data)
  Price MPG.city EngineSize  RPM Fuel.tank.capacity Weight
1  15.9       25        1.8 6300               13.2   2705
2  33.9       18        3.2 5500               18.0   3560
3  29.1       20        2.8 5500               16.9   3375
4  37.7       19        2.8 5500               21.1   3405
5  30.0       22        3.5 5700               21.1   3640
6  15.7       22        2.2 5200               16.4   2880
## scatter plot(산점도 행렬)
pairs(data)

## multiple linear regression analysis
fit = lm(Price~., data = data)  # Price~.에서 .의 의미는 Price를 뺀 나머지를 독립변수로 설정
summary(fit)  #검정결과 EngineSize와 RPM이 가격에 영향을 줌

Call:
lm(formula = Price ~ ., data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.344  -3.552  -0.556   2.252  35.390 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -38.107015  14.098134  -2.703  0.00826 ** 
MPG.city            -0.290017   0.231941  -1.250  0.21451    
EngineSize           4.303060   1.329544   3.236  0.00171 ** 
RPM                  0.007066   0.001378   5.127 1.76e-06 ***
Fuel.tank.capacity   0.111959   0.481680   0.232  0.81675    
Weight               0.004375   0.003386   1.292  0.19973    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.508 on 87 degrees of freedom
Multiple R-squared:  0.5707,    Adjusted R-squared:  0.546 
F-statistic: 23.13 on 5 and 87 DF,  p-value: 1.053e-14
## hat price = -38.10 - 0.29 * MPG.city + 4.30 * Enginsize
##             + 0.007* RPM + 0.11 * Fuel.tank.capacity
##             + 0.004 * Weight

## error  linearity normality, equal variance  independence multicollinearity
plot(fit, 1)  # linearity(점선을 기준으로 특별한 패턴없이 움직여야 함)

plot(fit, 2)  # normality(데이터가 직선 상에 놓여야 함)

shapiro.test(fit$residuals)  # 검정 결과 정규분포가 아님, 그런데 대표본은 정규성 가정이 가능함

    Shapiro-Wilk normality test

data:  fit$residuals
W = 0.8608, p-value = 7.139e-08
plot(fit, 3)  # equal variance(빨간선이 수평인 직선으로 나와야 함)

## multicollineariy : VIF > 10 
# install.packages('car')  # car 패키지가 없으면 주석기호를 지우고 설치하기
library(car)
Warning: package 'car' was built under R version 4.3.3
Loading required package: carData
vif(fit)  # 10을 넘은 값이 없기에 다중공선성은 없음
          MPG.city         EngineSize                RPM Fuel.tank.capacity 
          3.690362           4.131796           1.468805           5.419632 
            Weight 
          8.666616 
# variable selection
## forward selection(전진선택법)

fit.con = lm(Price~ 1, data=data)
fit.forward = step(fit.con, scope = list(lower=fit.con, upper=fit), direction='forward')
Start:  AIC=422.83
Price ~ 1

                     Df Sum of Sq    RSS    AIC
+ Weight              1    3595.3 4988.7 374.36
+ Fuel.tank.capacity  1    3294.2 5289.9 379.81
+ EngineSize          1    3063.8 5520.2 383.77
+ MPG.city            1    3034.5 5549.5 384.26
<none>                            8584.0 422.83
+ RPM                 1       0.2 8583.8 424.83

Step:  AIC=374.36
Price ~ Weight

                     Df Sum of Sq    RSS    AIC
+ RPM                 1    777.41 4211.3 360.60
<none>                            4988.7 374.36
+ EngineSize          1     76.62 4912.1 374.92
+ Fuel.tank.capacity  1     71.50 4917.2 375.01
+ MPG.city            1     71.00 4917.7 375.02

Step:  AIC=360.6
Price ~ Weight + RPM

                     Df Sum of Sq    RSS    AIC
+ EngineSize          1    446.63 3764.6 352.18
<none>                            4211.3 360.60
+ MPG.city            1     73.18 4138.1 360.97
+ Fuel.tank.capacity  1     26.05 4185.2 362.02

Step:  AIC=352.18
Price ~ Weight + RPM + EngineSize

                     Df Sum of Sq    RSS    AIC
<none>                            3764.6 352.18
+ MPG.city            1    77.370 3687.3 352.24
+ Fuel.tank.capacity  1    13.436 3751.2 353.84
summary(fit.forward)

Call:
lm(formula = Price ~ Weight + RPM + EngineSize, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.511  -3.806  -0.300   1.447  35.255 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -51.793292   9.106309  -5.688 1.62e-07 ***
Weight        0.007271   0.002157   3.372  0.00111 ** 
RPM           0.007096   0.001363   5.208 1.22e-06 ***
EngineSize    4.305387   1.324961   3.249  0.00163 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.504 on 89 degrees of freedom
Multiple R-squared:  0.5614,    Adjusted R-squared:  0.5467 
F-statistic: 37.98 on 3 and 89 DF,  p-value: 6.746e-16
## backward elimination(후진제거법)

fit.con = lm(Price~ 1, data=data) # 상수항만 들어있는 항을 만듦
fit.backward = step(fit, scope = list(lower=fit.con, upper=fit), direction = 'backward')
Start:  AIC=354.19
Price ~ MPG.city + EngineSize + RPM + Fuel.tank.capacity + Weight

                     Df Sum of Sq    RSS    AIC
- Fuel.tank.capacity  1      2.29 3687.3 352.24
- MPG.city            1     66.22 3751.2 353.84
- Weight              1     70.72 3755.7 353.95
<none>                            3685.0 354.19
- EngineSize          1    443.68 4128.7 362.76
- RPM                 1   1113.58 4798.6 376.74

Step:  AIC=352.24
Price ~ MPG.city + EngineSize + RPM + Weight

             Df Sum of Sq    RSS    AIC
- MPG.city    1     77.37 3764.6 352.18
<none>                    3687.3 352.24
- Weight      1    122.89 3810.2 353.29
- EngineSize  1    450.82 4138.1 360.97
- RPM         1   1152.50 4839.8 375.54

Step:  AIC=352.18
Price ~ EngineSize + RPM + Weight

             Df Sum of Sq    RSS    AIC
<none>                    3764.6 352.18
- EngineSize  1    446.63 4211.3 360.60
- Weight      1    480.84 4245.5 361.35
- RPM         1   1147.43 4912.1 374.92
summary(fit.backward)

Call:
lm(formula = Price ~ EngineSize + RPM + Weight, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.511  -3.806  -0.300   1.447  35.255 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -51.793292   9.106309  -5.688 1.62e-07 ***
EngineSize    4.305387   1.324961   3.249  0.00163 ** 
RPM           0.007096   0.001363   5.208 1.22e-06 ***
Weight        0.007271   0.002157   3.372  0.00111 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.504 on 89 degrees of freedom
Multiple R-squared:  0.5614,    Adjusted R-squared:  0.5467 
F-statistic: 37.98 on 3 and 89 DF,  p-value: 6.746e-16
## stepwise 

fit.con = lm(Price~ 1, data=data)
fit.stepwise = step(fit.con, scope = list(lower=fit.con, upper=fit), direction = 'both')
Start:  AIC=422.83
Price ~ 1

                     Df Sum of Sq    RSS    AIC
+ Weight              1    3595.3 4988.7 374.36
+ Fuel.tank.capacity  1    3294.2 5289.9 379.81
+ EngineSize          1    3063.8 5520.2 383.77
+ MPG.city            1    3034.5 5549.5 384.26
<none>                            8584.0 422.83
+ RPM                 1       0.2 8583.8 424.83

Step:  AIC=374.36
Price ~ Weight

                     Df Sum of Sq    RSS    AIC
+ RPM                 1     777.4 4211.3 360.60
<none>                            4988.7 374.36
+ EngineSize          1      76.6 4912.1 374.92
+ Fuel.tank.capacity  1      71.5 4917.2 375.01
+ MPG.city            1      71.0 4917.7 375.02
- Weight              1    3595.3 8584.0 422.83

Step:  AIC=360.6
Price ~ Weight + RPM

                     Df Sum of Sq    RSS    AIC
+ EngineSize          1     446.6 3764.6 352.18
<none>                            4211.3 360.60
+ MPG.city            1      73.2 4138.1 360.97
+ Fuel.tank.capacity  1      26.0 4185.2 362.02
- RPM                 1     777.4 4988.7 374.36
- Weight              1    4372.5 8583.8 424.83

Step:  AIC=352.18
Price ~ Weight + RPM + EngineSize

                     Df Sum of Sq    RSS    AIC
<none>                            3764.6 352.18
+ MPG.city            1     77.37 3687.3 352.24
+ Fuel.tank.capacity  1     13.44 3751.2 353.84
- EngineSize          1    446.63 4211.3 360.60
- Weight              1    480.84 4245.5 361.35
- RPM                 1   1147.43 4912.1 374.92
summary(fit.stepwise )

Call:
lm(formula = Price ~ Weight + RPM + EngineSize, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.511  -3.806  -0.300   1.447  35.255 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -51.793292   9.106309  -5.688 1.62e-07 ***
Weight        0.007271   0.002157   3.372  0.00111 ** 
RPM           0.007096   0.001363   5.208 1.22e-06 ***
EngineSize    4.305387   1.324961   3.249  0.00163 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.504 on 89 degrees of freedom
Multiple R-squared:  0.5614,    Adjusted R-squared:  0.5467 
F-statistic: 37.98 on 3 and 89 DF,  p-value: 6.746e-16

광고비 및 설비투자와 매출액 연관성 비교 자료

  • 다음 표는 광고비와 설비투자가 매출액에 어떤 영향을 미치는지 보여주고 있다.
광고비 5 6 7 8 9 11 12 13 14 15
설비투자 2 1.9 4 5.6 6.1 6.2 7 7.2 8 9
매출액 16 19 18 20 24 26 30 32 31 34

매출액(\(Y\))에 대한 광고비(\(X_{1}\))와 설비투자(\(X_{2}\))의 다중선형회귀모형을 구하시오.

x =matrix(c(5,6,7,8,9,11,12,13,14,15,2,1.9,4,5.6,6.1,6.2,7,7.2,8,9,16,19,18,20,24,26,30,32,31,34), nrow=10, ncol=3)
colnames(x)=c("광고비","설비투자","매출액")
x=data.frame(x)
attach(x)
x
   광고비 설비투자 매출액
1       5      2.0     16
2       6      1.9     19
3       7      4.0     18
4       8      5.6     20
5       9      6.1     24
6      11      6.2     26
7      12      7.0     30
8      13      7.2     32
9      14      8.0     31
10     15      9.0     34
fit <- lm(매출액 ~ 광고비 + 설비투자)
fit

Call:
lm(formula = 매출액 ~ 광고비 + 설비투자)

Coefficients:
(Intercept)       광고비     설비투자  
      6.099        2.257       -0.643  
anova(fit)
Analysis of Variance Table

Response: 매출액
          Df Sum Sq Mean Sq  F value    Pr(>F)    
광고비     1 370.95  370.95 232.5153 1.256e-06 ***
설비투자   1   1.89    1.89   1.1828    0.3128    
Residuals  7  11.17    1.60                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit)

Call:
lm(formula = 매출액 ~ 광고비 + 설비투자)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.5477 -0.8391 -0.1286  1.0417  1.5139 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   6.0985     1.3618   4.478 0.002872 ** 
광고비        2.2567     0.4048   5.575 0.000838 ***
설비투자     -0.6430     0.5913  -1.088 0.312805    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.263 on 7 degrees of freedom
Multiple R-squared:  0.9709,    Adjusted R-squared:  0.9626 
F-statistic: 116.8 on 2 and 7 DF,  p-value: 4.195e-06
confint(fit)
                2.5 %    97.5 %
(Intercept)  2.878488 9.3186072
광고비       1.299484 3.2138731
설비투자    -2.041147 0.7550655
plot(fit$fitted, fit$residuals, xlab="예측치 매출액", ylab="잔차", main="잔차그림")
abline(0,0)