[ R ] 다중회귀분석 연습문제 ch15
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%로 분류 정확도가 높다고 볼 수 있다.