작업유형 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)으로 짠 코딩이다.