59doit

[ R ] 회귀분석 #2 다중회귀분석 본문

통계기반 데이터분석

[ R ] 회귀분석 #2 다중회귀분석

yul_S2 2022. 11. 27. 12:04
반응형

(3) 다중 회귀분석

 

여러 개의 독립변수가 동시에 한 개의 종속변수에 미치는 영향을 분석할 때 이용하는 분석 방법

공차한계(Tolerance) : 한 독립변수가 다른 독립변수들에 의해서 설명되지 않은 부분

분산팽창요인(Variance Inflation Factor, VIF) : 공차한계의 역수

 

다중 공선성(Multicollinearity)문제

다중 공선성: 한 독립변수의 값이 증가할 때 다른 독립변수의 값이 증가하거나 감소하는 현상

독립변수들이 강한 상관관계를 보이는 경우는 회귀분석의 결과를 신뢰하기 어렵다.

상관관계가 높은 독립 변수 중 하나 혹은 일부를 제거하거나 변수를 변형시켜서 해결

독립변수 제거를 통한 정보손실 vs. 다중 공선성 문제 해결 → 판단 필요

 

귀무가설: 적절성과 친밀도는 제품의 만족도에 영향을 미친다고 볼 수 없다.

대립가설: 적절성과 친밀도는 제품의 만족도에 영향을 미친다고 볼 수 있다

 

 

ex)  다중 회귀분석

#1 변수 모델링

y=product$제품_만족도
x1=product$제품_친밀도
x2=product$제품_적절성
df <- data.frame(x1,x2,y)

 

 

#2 다중 회귀분석

result.lm <- lm(formula=y~x1+x2,data=df)
result.lm
# Call:
#   lm(formula = y ~ x1 + x2, data = df)

# Coefficients:
#   (Intercept)           x1           x2  
# 0.66731       0.09593      0.68522 

 

 

ex)  다중 공선성(Multicollinearity)문제 확인

 

#1 패키지 설치

install.packages("car")
library(car)

 

#2 분산팽창요인(VIF)

vif(result.lm)
#             x1           x2 
# 1.331929 1.331929 

 

 

 

ex)  다중 회귀분석 결과보기

summary(result.lm)
# Call:
#   lm(formula = y ~ x1 + x2, data = df)

# Residuals:
#   Min       1Q   Median       3Q      Max 
# -2.01076 -0.22961 -0.01076  0.20809  1.20809 

# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.66731    0.13094   5.096 6.65e-07 ***
#   x1           0.09593    0.03871   2.478   0.0138 *  
#   x2           0.68522    0.04369  15.684  < 2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Residual standard error: 0.5278 on 261 degrees of freedom
# Multiple R-squared:  0.5975, Adjusted R-squared:  0.5945 
# F-statistic: 193.8 on 2 and 261 DF,  p-value: < 2.2e-16

결과 제시 방법 가설, 분석결과, 가설검정, 회귀모형 결정계수, 수정결정계수, 회귀모형의 적합성, 독립변수 설명

 

 

 

 

 

(4) 다중 공선성 문제 해결과 모델 성능평가

 

다중 공선성 문제 해결 방법 실습순서: 다중 공선성 문제 해결  회귀모델 생성  예측치 생성  모델 성능평가

 

 (1) 다중 공선성 문제 해결 

다중 공선성 문제: 독립변수 간의 강한 상관관계로 인하여 회귀분석의 결과를 신뢰할 수 없는 현상 강한 상관관계를 갖는 독립변수를 제거하여 해결

 

ex)  다중 공선성 문제 확인

#1  패키지 설치 및 데이터 로딩

install.packages("car")
library(car) 
data(iris)

 

#2 iris 데이터 셋으로 다중 회귀분석

model <- lm(formula = Sepal.Length ~ Sepal.Width + 
              Petal.Length + Petal.Width, data = iris)

vif(model)
# Sepal.Width Petal.Length  Petal.Width 
# 1.270815    15.097572    14.234335 

sqrt(vif(model)) > 3
# Sepal.Width Petal.Length  Petal.Width 
# FALSE         TRUE         TRUE

 

#3 iris 변수 간의 상관계수 구하기

cor(iris[,-5])
#                         Sepal.Length Sepal.Width Petal.Length Petal.Width
# Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
# Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
# Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
# Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

상관계수로 변수간의 강한 상관관계 구분

 

 

 (2) 회귀모델 생성 

동일한 데이터 셋을 7:3 비율로 학습데이터와 검정데이터로 표본 추출한 후 학습데이터를 이용하여 회귀모델을 생성

 

ex)  데이터 셋 생성과 회귀모델 생성

#1  학습데이터와 검정데이터 표본 추출

x <- sample(1:nrow(iris),0.7*nrow(iris))
train <- iris[x,]
test <- iris[-x,]

sample()함수 이용하여 70% 데이터 추출하여 학습데이터, 나머지 데이터는 검정데이터로 설정

다중 공선성 문제가 발생하는 Petal.Width변수를 제거한 후 학습데이터를 이용하여 회귀모델 생성

 

 

#2 변수 제거 및 다중 회귀분석

model <- lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train) 

model
# Call:
#   lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train)

# Coefficients:
#   (Intercept)   Sepal.Width  Petal.Length  
#      2.2251        0.6200        0.4614  

summary(model)
# Call:
#   lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train)

# Residuals:
#         Min         1Q     Median          3Q         Max 
# -0.95132 -0.23691 -0.02525  0.21571  0.80048 

# Coefficients:
#                        Estimate  Std. Error   t value      Pr(>|t|)    
# (Intercept)       2.22509     0.29653    7.504     2.39e-11 ***
#   Sepal.Width   0.62003    0.08542   7.259     7.93e-11 ***
#   Petal.Length  0.46137    0.02021  22.833   < 2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Residual standard error: 0.34 on 102 degrees of freedom
# Multiple R-squared:  0.8368, Adjusted R-squared:  0.8336 
# F-statistic: 261.4 on 2 and 102 DF,  p-value: < 2.2e-16  

 

 

 (3) 회귀방정식 도출 

절편, 기울기, 독립변수(x)의 관측치를 이용하여 회귀방정식을 도출

 

ex)  회귀방정식 도출

#1  회귀방정식을 위한 절편과 기울기 보기

model
# Call:
#   lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train)

# Coefficients:
#   (Intercept)   Sepal.Width  Petal.Length  
#       2.2251        0.6200        0.4614  

 

#2 회귀방정식 도출

head(train,1)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 32             5.4              3.4                1.5               0.4  setosa

 

 

 (4) 회귀방정식 도출 

검정데이터를 이용하여 회귀모델의 예측치를 생성.

학습데이터에 의해 생성된 회귀모델을 검정데이터에 적용하여 모델의 예측치를 생성 predict()함수

 predict(model, data)

model: 회귀모델(회귀분석 결과가 저장된 객체)

data: 독립변수(x)가 존재하는 검정데이터 셋

 

ex)  검정데이터의 독립변수를 이용한 예측치 생성

pred <- predict(model,test)
pred

 

 (5) 회귀모델 평가 

 

모델평가는 일반적으로 상관계수를 이용 모델의 예측치(pred)와 검정데이터의 종속변수(y)를 이용하여 상관계수(r)를 구하여 모델의 분류정확도를 평가한다. 상관관계가 높다면 분류정확도가 높다고 볼 수 있음.

 

ex)  상관계수를 이용한 회귀모델 평가

cor(pred,test$Sepal.Length)
# 0.9239866

 

 

 

(5) 기본 가정 충족으로 회귀분석 수행

회귀분석은 선형성, 다중 공선성, 잔차의 정규성 등 몇가지 기본 가정이 충족되어야 수행할 수 있는 모수 검정방법 회귀분석의 기본 가정을 충족하는지 확인

ex)  회귀분석의 기본 가정 충족으로 회귀분석 수행

#1회귀모델 생성

#1-1 변수 모델링

formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width

 

 

#1-2 회귀모델 생성

model <- lm(formula=formula, data=iris)
model
# Call:
#   lm(formula = formula, data = iris)

# Coefficients:
#   (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
# 1.8560        0.6508        0.7091       -0.5565

 

 

#2 잔차(오차)분석

#2-1 독립성 검정 – 더빈 왓슨 값으로 확인

install.packages('lmtest')
library(lmtest)
dwtest(model)
# Durbin-Watson test

# data:  model
# DW = 2.0604, p-value = 0.6013
# alternative hypothesis: true autocorrelation is greater than 0

더빈 왓슨 값의 p-value가 0.05이상(DW값 1-3범위)이면 잔차에 유의미한 자기 상관이 없다고 볼 수 있다. 즉 독립성이 있다고 볼 수 있다.

 

 

 

#2-2 등분산성 검정 – 잔차와 적합값의 분포

plot(model,which=1)

잔차(residual) 0을 기준으로 적합값(fitted values)의 분포가 좌우 균등하면 잔차들은 등분산성과 차이가 없다고 볼 수 있다.

 

 

#2-3 잔차의 정규성 검정

attributes(model)
# $names
# [1] "coefficients"  "residuals"     "effects"       "rank"         
# [5] "fitted.values" "assign"        "qr"            "df.residual"  
# [9] "xlevels"       "call"          "terms"         "model"        

# $class
# [1] "lm"

res <- residuals(model) 

shapiro.test(res) 
# Shapiro-Wilk normality test

# data:  res
# W = 0.99559, p-value = 0.9349

shapiro.test()함수 이용하여 정규성 검정 hist()함수로 히스토그램과 qqnorm()함수를 통해 Normal Q-Q plot으로 정규성 확인 가능

 

 

#3 다중 공선성 검사

library(car)
sqrt(vif(model))>3
# Sepal.Width Petal.Length  Petal.Width 
#          FALSE          TRUE         TRUE

Petal.Length와 Petal.Width변수 간에는 다중 공선성 문제가 의심스러워 두 변수 중 하나 제거하여 회귀모델 다시 생성

 

#4 회귀모델 생성과 평가

formula = Sepal.Length ~ Sepal.Width + Petal.Length 
model <- lm(formula = formula, data = iris) 
summary(model)
# Call:
#   lm(formula = formula, data = iris)

# Residuals:
#         Min          1Q      Median          3Q        Max 
# -0.96159 -0.23489    0.00077  0.21453  0.78557 

# Coefficients:
#                         Estimate   Std. Error  t value    Pr(>|t|)    
# (Intercept)        2.24914    0.24797    9.07      7.04e-16 ***
#   Sepal.Width   0.59552    0.06933    8.59      1.16e-14 ***
#   Petal.Length  0.47192    0.01712   27.57      < 2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Residual standard error: 0.3333 on 147 degrees of freedom
# Multiple R-squared:  0.8402, Adjusted R-squared:  0.838 
# F-statistic: 386.4 on 2 and 147 DF,  p-value: < 2.2e-16

Petal.Width제거 후 회귀모델 생성 모델이 유의하고 모델의 설명력(Adjusted R square)가 높음

 

반응형
Comments