brunch

You can make anything
by writing

C.S.Lewis

by 첨물 Jun 13. 2021

빅분기 실시(최종 준비 2)

작업유형 2

구르미 플랫폼에서는 따로 패키지 설치를 하지 않고, library로 불러오기만 하면 되지만 현재 들어가는 사이트에서는 데이터 불러오기가 안된다. 시험장에서는 아마 각자 계정에 파일이 저장되어 있을 것 같다.


그래서 구르미가 아닌 구글 코랩(R)에서 작업유형 2 예제를 진행하였다. R-Studio 보다는 좀 더 시험장과 유사한 시스템으로 보이고, 주석 처리가 동일하게 작동되었다. 

ctrl+/


그럼 시작해보자



먼저 필요한 패키지 설치, 실제 구르미에서는 불러오기만 해도 금방 됨.


install.packages("rpart") #의사결정나무

library(rpart)

install.packages("randomForest") #랜덤포레스트

library(randomForest)

install.packages("caret") #예측 predict

library(caret)

install.packages("pROC") #ROC Curve

library(pROC)

install.packages("e1071") #서포트 벡터

library(e1071)



다음은 github에 올려놓은 데이터 세트를 읽어오기. Rstudio와 다른 것은 한글이 있으면 read.csv 안에 fileEncoding="euc-kr" 을 쳐 넣어야 한다는 것



y_train<-read.csv("https://raw.githubusercontent.com/Datamanim/dataq/main/y_train.csv")


x_train <- read.csv("https://raw.githubusercontent.com/Datamanim/dataq/main/X_train.csv",fileEncoding="euc-kr")


x_test <-read.csv("https://raw.githubusercontent.com/Datamanim/dataq/main/X_test.csv",fileEncoding="euc-kr")



다음은 x_train과 y_train을 merge 하는 것. 나중에 모델링하기에 편함.


train <- merge(x_train, y_train)

head(train)


데이터에 결측치가 있으면 모델링하는데 에러가 걸리므로 확인 작업하고, NA를 대체하는 코딩



#결측치 확인


sum(is.na(train))

apply(train, 2, function(x) sum(is.na(x)))


확인해보니, 환불금액에서 결측치가 2295개나 발견되었다. 환불을 안 했다고 보고 0으로 대체.

이 작업은 x_train과 x_test 모두 진행한다. 그리고 다시 확인



#결측치 NA를 0으로 대체


train$환불금액 <- ifelse(is.na(train$환불금액), 0, train$환불금액)

x_test$환불금액 <- ifelse(is.na(x_test$환불금액), 0, x_test$환불금액)


apply(train, 2, function(x) sum(is.na(x)))

apply(x_test, 2, function(x) sum(is.na(x)))



데이터 전처리가 끝났으니, 이제 본격적으로 모델링을 해 보자.

여기서 해 볼 것은 남, 녀를 구별 짓는 것이니, 로지스틱 회귀분석, 랜덤포레스트, 서포트 벡터 머신(SVM)을 이용하기로 하고, 세 개 중 가장 AUC가 높은 것으로 답을 내는 것으로 하겠다. 세 개의 모델이 잘 되었는지는 summary()로 확인한다.


#로지스틱 회귀분석

log_model<-glm(gender~., data=train)


#랜덤포레스트

rf_model<-randomForest(gender~., data=train, 

                     ntree=100, mtry=sqrt(length(colnames(train))), proximity=T, importance=T)

#서포트 벡터

svm.model <- svm(gender~., data=train,

                 kernel="radial",  gamma=0.01,  cost=10)




다음은 세 개의 모델을 이용하여 train 데이터에서 gender를 뺀 상태로 예측해 본 후, 원래 값과 맞는지 비교




pred_log <- predict(log_model, train[,-11],type="response") 


pred_rf <- predict(rf_model, train[,-11], type="class")


pred_svm <- predict(svm.model, train[,-11],type="class")



그러면 이렇게 세 개로 모델링한 것을 이용하여 train 데이터에서 gender를 뺀 것을 넣어 얼마나 정합률이 맞는지 확인해보자



#예측된 값 확인, 정합률(accracy) 확인

#로지스틱 회귀 분석법으로 예측한 값

table_log <- table(as.factor(round(pred_log)), train[,11])  

p_log <- (table_log[1,1]+table_log[2,2])/sum(table_log)

table_log

print(p_log)


#랜덤포레스트로 예측한 값

table_rf <- table(as.factor(round(pred_rf)), train[,11])  

p_rf <- (table_rf[1,1]+table_rf[2,2])/sum(table_rf)

table_rf

print(p_rf)


#서포트벡터머신으로 예측한 값

table_svm <- table(as.factor(round(pred_svm)), train[,11])  

p_svm <- (table_svm[1,1]+table_svm[2,2])/sum(table_svm)

table_svm

print(p_svm)


출력 값을 보니, 랜덤포레스트로 한 것이 월등히 정합률이 높았다.


성능 분석은 ROC Curve 및 AUC를 통해 확인하자. 세 개의 분석법을 비교해서 가장 높은 것을 찾아보자.

시험장에서는 ROC Curve를 그릴 수 없지만, 그래도 그려보고 결과를 확인해보았다.



#로지스틱 회귀법 ROC, AUC 구하기

roc_log <- roc( as.numeric(train[,11]), as.numeric(pred_log))

auc_log <- auc(roc_log)

print(auc_log)

plot.roc(roc_log, col="blue",

         print.auc=T, max.auc.polygon = T,

         auc.polygon = T, auc.polgon.col="gray",

         print.thres = T, print.thres.pch = 19, print.thres.col = "red")




#랜던포레스트법 ROC, AUC 구하기


roc_rf <- roc(as.numeric(train[,11]),as.numeric(pred_rf))

auc_rf <- auc(roc_rf)

print(auc_rf)

plot.roc(roc_rf, col="blue",

         print.auc=T, max.auc.polygon = T,

         auc.polygon = T, auc.polgon.col="gray",

         print.thres = T, print.thres.pch = 19, print.thres.col = "red")




#서포트벡터머신으로 ROC, AUC 구하기


roc_svm <- roc( as.numeric(train[,11]), as.numeric(pred_svm))

auc_svm <- auc(roc_svm)

print(auc_svm)

plot.roc(roc_svm, col="blue",

         print.auc=T, max.auc.polygon = T,

         auc.polygon = T, auc.polgon.col="gray",

         print.thres = T, print.thres.pch = 19, print.thres.col = "red")




세 개의 AUC를 평가했을 때, 랜덤 포레스트> 서포트 벡터 머신> 로지스틱 회귀분석 순으로 AUC가 나왔다.

이를 통해 test 데이터를 랜덤 포레스트 법으로 남, 녀를 예측할 확률을 구해보자.




#x_test 데이터를 랜덤 포레스트로 gender 예측하고, cust id로 merge 하여 표현하기


pred_rf_test <- predict(rf_model, x_test, type="class") 

x_test_rf <- mutate(x_test, gender=pred_rf_test)

print(x_test_rf[,c(1, 11)])



이제 이걸 수험번호로 저장해서 제출하는 것으로 마무리.



아래는 구글 코랩(R)으로 짠 코딩이다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari