R

[빅분기 실기] 작업형2번 파생변수 추가후 랜덤포레스트

한번해보즈아 2021. 6. 12. 13:59

이번에는 EDA를 한다음 의미있는 결과가 있으면 파생변수를 추가한후 랜덤포레스트 분석을 시행해보겠습니다.

 

 

> library(dplyr, caret, randomForest,pROC)
> set.seed(1234)
> x_train <- read.csv("C:/R/[Dataset] 작업형 제2유형/X_train.csv")
> y_train <- read.csv("C:/R/[Dataset] 작업형 제2유형/Y_train.csv")
> full <- left_join(x_train, y_train, id="cust_id")
Joining, by = "cust_id"
> full$최대구매액 <- full$최대구매액/10000
> full$총구매액 <- full$총구매액/10000
> full$환불금액 <- full$환불금액/10000
> full$환불금액 <- ifelse(is.na(full$환불금액),0,full$환불금액)
> full$주구매상품 <- as.factor(full$주구매상품)
> full$주구매지점 <- as.factor(full$주구매지점)
> full$gender <- as.factor(full$gender)
> full <- full[,-1] #cust_id 삭제
> full %>% 
+   filter(총구매액 > quantile(full$총구매액, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        545
2 1        155
> full %>% 
+   filter(최대구매액 > quantile(full$최대구매액, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        514
2 1        186
> full %>% 
+   filter(환불금액 > quantile(full$환불금액, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        555
2 1        145
> full %>% 
+   filter(내점일수 > quantile(full$내점일수, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        539
2 1        155
> full %>% 
+   filter(내점당구매건수 > quantile(full$내점당구매건수, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        459
2 1        240
> full %>% 
+   filter(주말방문비율 > quantile(full$주말방문비율, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        346
2 1        329
> full %>% 
+   filter(구매주기 > quantile(full$구매주기, 0.8)) %>% 
+   group_by(gender) %>% 
+   summarise(count=n())
# A tibble: 2 x 2
  gender count
  <fct>  <int>
1 0        383
2 1        303

 

분석결과 상위 20%기준으로 내점일수, 환불금액, 최대구매액, 총구매액 에서 큰차이를 보입니다. 따라서 이변수를 이용하여 파생변수를 만든후 랜덤포레스트를 통한 예측을 해보겠습니다.

 

> full$"파생변수" <- ifelse(full$내점일수 > quantile(full$내점일수, 0.8) |
+          full$환불금액 > quantile(full$환불금액, 0.8) |
+          full$최대구매액 > quantile(full$최대구매액, 0.8) |
+          full$총구매액 > quantile(full$총구매액, 0.8),0,1)
> full$"파생변수" <- as.factor(full$"파생변수")
> full$총구매액 <- scale(full$총구매액)
> full$최대구매액 <- scale(full$최대구매액)
> full$환불금액 <- scale(full$환불금액)
> full$내점일수 <- scale(full$내점일수)
> full$내점당구매건수 <- scale(full$내점당구매건수)
> full$주말방문비율 <- scale(full$주말방문비율)
> full$구매주기 <- scale(full$구매주기)
> idx <- sample(1:nrow(full), 0.7*nrow(full), replace=F)
> train <- full[idx,]
> test <- full[-idx,]
> rf.model <- randomForest(gender~.,
+                          data=train,
+                          ntree=50,
+                          mtry=sqrt(10),
+                          importance=T)
> pred.rf <- predict(rf.model, test[,-10],type="prob")
> auc(test$gender, pred.rf[,1]) # 남자로 예측할 확률 auc 값 확인
Setting levels: control = 0, case = 1
Setting direction: controls > cases
Area under the curve: 0.652

 

파생변수를 추가한후 결과는 0.652로 그냥 단순히 표준화만 했을때보다 auc가 약간 하락하였네요 ...  이 방법은 좋지 않은거같습니다.