Q.

[ R ] 다중회귀분석 연습문제 ch15

yul_S2 2022. 11. 27. 14:09
반응형

 1. product.csv 파일의 데이터를 이용하여 다음의 단계별로 다중 회귀분석을 수행하시오.

product<-read.csv('C:/product.csv', header = TRUE)

head(product)
   제품_친밀도      제품_적절성     제품_만족도
1           3                       4                       3
2           3                       3                       2
3           4                       4                       4
4           2                       2                       2
5           2                       2                       2
6           3                       3                       3

 

 

1단계: 학습데이터(train), 검정데이터(test)를 7:3비율로 샘플링 변수모델링:

y변수는 제품_만족도, x변수는 제품_적절성과 제품_친밀도

x <-sample(1:nrow(product), 0.7 * nrow(product))
train <- product[x, ]
test <- product[-x, ]
y = product$제품_만족도
x1 = product$제품_적절성
x2 = product$제품_친밀도
df <- data.frame(x1, x2, y)

 

 

2단계: 학습데이터 이용 회귀모델 생성

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

library(car)

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.68522      0.09593

 

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

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

sqrt(vif(result.lm)) > 3
#         x1        x2 
# FALSE FALSE 

cor(product)
#                      제품_친밀도 제품_적절성 제품_만족도
# 제품_친밀도   1.0000000   0.4992086   0.4671450
# 제품_적절성   0.4992086   1.0000000   0.7668527
# 제품_만족도   0.4671450   0.7668527   1.0000000

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.68522    0.04369    15.684     < 2e-16 ***
#   x2             0.09593    0.03871     2.478       0.0138  
#   ---
#   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

 

# 다중공선성 문제가 발생하는 변수 없으므로 그대로 학습데이터 이용하여 회귀모델 생성

model <- lm(formula = 제품_만족도 ~제품_적절성 + 제품_친밀도, data = train)

summary(model)
# Call:
#   lm(formula = 제품_만족도 ~ 제품_적절성 + 제품_친밀도, data = train)

# Residuals:
#      Min         1Q        Median       3Q          Max 
# -2.00282 -0.19150 -0.00282  0.18587  1.20588 

# Coefficients:
#                        Estimate   Std. Error  t value  Pr(>|t|)    
#      (Intercept)  0.56888    0.15013   3.789    0.000206 ***
#   제품_적절성  0.70697    0.05446  12.981   < 2e-16 ***
#   제품_친밀도  0.10435    0.04902   2.129    0.034636 *  
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Residual standard error: 0.5219 on 181 degrees of freedom
# Multiple R-squared:  0.6371, Adjusted R-squared:  0.6331 
# F-statistic: 158.9 on 2 and 181 DF,  p-value: < 2.2e-16

 

 

# 회귀방정식

model
# Call:
#   lm(formula = 제품_만족도 ~ 제품_적절성 + 제품_친밀도, data = train)

# Coefficients:
#   (Intercept)  제품_적절성  제품_친밀도  
#     0.5689       0.7070       0.1043 

Y = 0.5689 + 0.5689*x1 + 0.5689*x2 
head(train,1)
#      제품_친밀도  제품_적절성 제품_만족도
# 148               4                     4                   4

Y=0.5689 + 0.5689*4 + 0.5689*4
Y
# 5.1201

 

 

# 잔차(오차)계산

Y-4
# 1.1201

residuals(model)[1]
#            148 
# 0.1858727 

 

 

3단계: 검정데이터 이용 모델 예측치 생성

pred <- predict(model,test)
pred

 

 

 

4단계: 모델 평가: cor()함수 이용

cor(pred, test$제품_만족도)
# 0.6969804

상관관계 69% 로 분류 정확도가 높다고 볼 수 있다.

 

 

 

 

 

 

 

 

 2. ggplot2 패키지에서 제공하는 diamonds 데이터 셋을 대상으로 carat, table, depth 변수 중에서 다이아몬드의 가격(price)에 영향을 미치는 관계를 다중회귀 분석을 이용하여 예측하시오.
조건1: 다이아몬드 가격 결정에 가장 큰 영향을 미치는 변수는?
조건2: 다중회귀 분석 결과를 정(+)과 부(-)관계로 해설

 

# 1단계 : 변수 모델링

library(ggplot2)
data(diamonds)
diamonds
idx <-sample(1:nrow(diamonds), 0.7 * nrow(diamonds))
diatrain <- diamonds[idx, ]
diatest <- diamonds[-idx, ]
price = diamonds$price
carat = diamonds$carat
table = diamonds$table
depth = diamonds$depth
df <- data.frame(price, carat, table, depth)

 

# 2단계 :  학습데이터 이용 회귀모델 생성

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

result2.lm <- lm(formula = price ~carat + table + depth, data = df)
result2.lm
# Call:
#   lm(formula = price ~ carat + table + depth, data = df)

# Coefficients:
#   (Intercept)        carat        table        depth  
# 13003.4       7858.8       -104.5       -151.2 

 

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

vif(result2.lm)
#        carat         table       depth 
# 1.042039 1.141032 1.104275

sqrt(vif(result2.lm)) > 2
#     carat    table   depth 
# FALSE FALSE FALSE 

summary(result2.lm)
# Call:
#   lm(formula = price ~ carat + table + depth, data = df)

# Residuals:
#   Min       1Q   Median       3Q      Max 
# -18288.0   -785.9    -33.2    527.2  12486.7 

# Coefficients:
#                      Estimate  Std. Error t value     Pr(>|t|)    
# (Intercept) 13003.441    390.918    33.26   <2e-16 ***
#   carat          7858.771     14.151  555.36   <2e-16 ***
#   table           -104.473       3.141  -33.26   <2e-16 ***
#   depth         -151.236        4.820  -31.38   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Residual standard error: 1526 on 53936 degrees of freedom
# Multiple R-squared:  0.8537, Adjusted R-squared:  0.8537 
# F-statistic: 1.049e+05 on 3 and 53936 DF,  p-value: < 2.2e-16

cor(diamonds[,c(1,5,6,7)])
#                     carat            depth            table          price
# carat 1.00000000  0.02822431  0.1816175  0.9215913
# depth 0.02822431  1.00000000 -0.2957785 -0.0106474
# table 0.18161755 -0.29577852  1.0000000  0.1271339
# price 0.92159130 -0.01064740  0.1271339  1.0000000

 

 

조건1: 다이아몬드 가격 결정에 가장 큰 영향을 미치는 변수는?

조건2: 다중회귀 분석 결과를 정(+)과 부(-)관계로 해설

# Coefficients:
#                      Estimate  Std. Error t value     Pr(>|t|)    
# (Intercept) 13003.441    390.918    33.26   <2e-16 ***
#   carat          7858.771     14.151  555.36   <2e-16 ***
#   table           -104.473       3.141  -33.26   <2e-16 ***
#   depth         -151.236        4.820  -31.38   <2e-16 ***

가격에 가장 큰 영향을 미치는 변수는 carat이다.
가격과 +관계 변수 carat(7858.771) 이고 -관계 변수 table(-104.473),depth(-151.236)이다.

 

# 다중공선성 문제가 발생하는 변수 없으므로 그대로 학습데이터 이용하여 회귀모델 생성

model2 <- lm(formula = price ~ carat+table+depth, data = diatrain)
summary(model2)
model2
# Call:
#   lm(formula = price ~ carat + table + depth, data = diatrain)

# Coefficients:
#   (Intercept)        carat         table        depth  
#    12955.5       7888.8       -103.5       -151.7 

 

# 회귀방정식

Y = 12955.5 + 7888.8*carat - 103.5*table -151.7*depth
head(diatrain,1)
# # A tibble: 1 x 10
#            carat      cut              color       clarity    depth     table      price      x         y         z
#            <dbl>     <ord>         <ord>     <ord>     <dbl>    <dbl>     <int>     <dbl>  <dbl>  <dbl>
#   1       0.4         Premium     F            VS1       61.4       58          982      4.73    4.75     2.91

Y=12955.5 + 7888.8*0.4 - 103.5*58 -151.7*61.4
Y
# 793.64

 

 

# 잔차(오차)계산

Y-13003
# -12209.36

residuals(model2)[1]
#              1 
# 191.3781 

 

 

# 검정데이터 이용 모델 예측치 생성

pred2 <- predict(model2,diatest)
pred2

 

 

 

# 모델 평가: cor()함수 이용

cor(pred2, diatest$price)
# 0.9214867

상관관계 92%로 분류 정확도가 높다고 볼 수 있다.

반응형