본문 바로가기

데이터 분석 (Data Analysis)/R

[데이터분석기사 실기] 예시문제 풀이 - 의사결정나무모형(Decision Tree) - 실기 작업 2유형

지난번 로지스틱회귀모형으로 예시문제 풀이 이후 다른 모형인 의사결정나무모형으로 문제를 풀어보았습니다.

 

AUC 값 : 0.6369

분석 변경사항

 

1. Validation set 만든 이유?

문제에서 주어진 데이터 중 x.test(테스트셋) 값으로 모형 평가를 반영할 수 없음. 따라서 일반적으로 train, validation, test set 비율을 6:2:2 로 하기때문에 training set과 validation set의 비율이 3:1 이므로 0.25 만큼 validation set을 random으로 추출해서 모형 평가에 적용하였습니다.

2. 실제 시험에서 1분이라는 제한시간은 어떻게?

최대한 코드를 간단하게 할것만 전처리(결측, 이상치, 데이터결합, summary(), str() 등등 함수로 간단하게 파악)를 빠르게 하고 분석기법 4~5개 정도 코드 입력 후

 

1) 세부 전처리를 방향에 맞게 추가

2) 데이터 나누기를 다양한 방법으로 시도 (k-fold, cross-validation 등)

3) 앙상블 기법 고려 (코드 돌리는데 1분이라는 제한시간때문에 추천하지는 않습니다.)

이외에 제가 모르는 좋은 방법들도 분명히 있을겁니다.

 

library(dplyr)
library(knitr)
library(ggplot2)

setwd("../data")

x.train <- read.csv("X_train.csv")
y.train <- read.csv("Y_train.csv")

x.test <- read.csv("X_test.csv")


x.train %>% tail(5)
y.train %>% head(5)

x.test %>% head(5)


# 트레이닝 셋
x.train %>% dim()
y.train %>% dim()

# 테스트 셋
x.test %>% dim()

# 학습할 데이터셋 병합
train <- merge(x.train, y.train, by='cust_id')
train %>% head(5)

# 결측값 처리

train$환불금액[is.na(train$환불금액)== TRUE] = 0
train$환불금액 %>% head()

x.test$환불금액[is.na(x.test$환불금액)== TRUE] = 0

# 범주형변수 factor 처리
str(train)

train$gender <- as.factor(train$gender)
train$주구매상품 <- as.factor(train$주구매상품)
train$주구매지점 <- as.factor(train$주구매지점)

x.test$주구매상품 <- as.factor(x.test$주구매상품)
x.test$주구매지점 <- as.factor(x.test$주구매지점)

train %>% str()
x.test %>% str()

train %>% summary()
x.test %>% summary()

# 모형적합에 불필요한 변수 제거 (cust_id)
train <- train[,-1]


# 데이터셋 나누기(일반적으로 훈련:검증:평가 = 6:2:2 이므로 훈련:검증 = 3:1 로 구성)

train %>% nrow()
x.test %>% nrow() # 훈련, 평가셋 비율 약 7:5

set.seed(210613) # 랜덤샘플링을 위한 시드값 고정
n <- nrow(train)
idx <- 1:n
training_idx <- sample(idx, n * .75)

idx <- setdiff(idx, training_idx) # setdiff() : 차집합
validate_idx <- sample(idx, n * .25)

training <- train[training_idx,]
validation <- train[validate_idx,]

training %>% head(5)
validation %>% head(5)

dim(training)
dim(validation)

# 의사결정나무 (Decision Tree)
library(rpart)
dt_fit <- rpart(gender ~ 총구매액+최대구매액+환불금액+주구매상품+주구매지점+내점일수+내점당구매건수+주말방문비율+구매주기, data=training)
dt_fit

printcp(dt_fit)
summary(dt_fit)



dt_pred <- predict(dt_fit, validation, type='prob')
sum(dt_pred[,2] > .5) # 남성(1)일 확률의 합계 -> 즉, 남성으로 예측한 수

dt_pred[,2] %>% summary() # dt_pred[,2] -> 2열 변수만 출력하는 이유는 문제에서 남자일때 확률을 생각했으므로

# DT모형 평가
library(pROC) # ROC-AUC 평가
? pROC

pROC::roc(validation$gender, dt_pred[,2])
pROC::auc(roc(validation$gender, dt_pred[,2])) # AUC : 0.6369

# 정답 제출
final_predict <- predict(dt_fit, x.test, type="prob")
final <- data.frame(x.test$cust_id, final_predict[,2])
colnames(final) <- c("cust_id", "gender")

final %>% head(10)

write.csv(final, "예측값 정답 제출.csv")