자기계발/자격증

[빅데이터 분석기사] 실기 모의고사 2회 - 2/2

혁이e 2022. 6. 20.

작업형 2

1. 고객의 대출 정보인 Loan 데이터 세트에서 전체 데이터를 7:3 으로 훈련 / 테스트 데이터로 분할하고, 테스트 데이터로 고객의 대출상환 (loan_status)을 예측하고 csv 포맷으로 제출하시오.

 → 해설 이상. 정보 부족한 문제임

 → 대출상환 (loan_status)가 PAIDOFF 인 경우는 삭제하고, 다른 경우일 때만 가지고 모델링 연습

Loan payments data.csv
0.04MB

 

 

 

# 데이터 로드

> ds <- read.csv("c:/data/Loan payments data.csv")
> str(ds)
'data.frame': 500 obs. of  11 variables:
 $ Loan_ID       : chr  "xqd20166231" "xqd20168902" "xqd20160003" "xqd20160004" ...
 $ loan_status   : chr  "PAIDOFF" "PAIDOFF" "PAIDOFF" "PAIDOFF" ...
 $ Principal     : int  1000 1000 1000 1000 1000 300 1000 1000 1000 800 ...
 $ terms         : int  30 30 30 15 30 7 30 30 30 15 ...
 $ effective_date: chr  "9/8/2016" "9/8/2016" "9/8/2016" "9/8/2016" ...
 $ due_date      : chr  "10/7/2016" "10/7/2016" "10/7/2016" "9/22/2016" ...
 $ paid_off_time : chr  "9/14/2016 19:31" "10/7/2016 9:00" "9/25/2016 16:58" "9/22/2016 20:00" ...
 $ past_due_days : int  NA NA NA NA NA NA NA NA NA NA ...
 $ age           : int  45 50 33 27 28 35 29 36 28 26 ...
 $ education     : chr  "High School or Below" "Bechalor" "Bechalor" "college" ...
 $ Gender        : chr  "male" "female" "female" "male" ...

 

> summary(ds)
   Loan_ID          loan_status          Principal          terms       effective_date       due_date        
 Length:500         Length:500         Min.   : 300.0   Min.   : 7.00   Length:500         Length:500        
 Class :character   Class :character   1st Qu.:1000.0   1st Qu.:15.00   Class :character   Class :character  
 Mode  :character   Mode  :character   Median :1000.0   Median :30.00   Mode  :character   Mode  :character  
                                       Mean   : 943.2   Mean   :22.82                                        
                                       3rd Qu.:1000.0   3rd Qu.:30.00                                        
                                       Max.   :1000.0   Max.   :30.00                                        
                                                                                                             
 paid_off_time      past_due_days        age         education            Gender         
 Length:500         Min.   : 1.00   Min.   :18.00   Length:500         Length:500        
 Class :character   1st Qu.: 3.00   1st Qu.:27.00   Class :character   Class :character  
 Mode  :character   Median :37.00   Median :30.00   Mode  :character   Mode  :character  
                    Mean   :36.01   Mean   :31.12                                        
                    3rd Qu.:60.00   3rd Qu.:35.00                                        
                    Max.   :76.00   Max.   :51.00                                        
                    NA's   :300                   

# 데이터 형태를 보기. pate_due_days 가 N/A 면 PAIDOFF 임. 

# NA 값 행 날려서 데이터 만들기
> ds2 <- ds
> ds2 <- na.omit(ds)
> summary(ds2$loan_status)
   Length     Class      Mode 
      200 character character 

 

# loan_status 를 factor화한 후 7:3 으로 나눈다

> ds3 <- ds2
> ds3$loan_status <- as.factor(ds2$loan_status)
> summary(ds3$loan_status)
        COLLECTION COLLECTION_PAIDOFF 
               100                100 

> idx <- createDataPartition(ds3$loan_status, p=0.7)
> pre_train <- ds3[idx$Resample1,]
> pre_test <- ds3[-idx$Resample1,]

# 데이터 스케일
> scaled_train <- preProcess(pre_train, method = "range")
> scaled_test <- preProcess(pre_test, method = "range")
  
# 데이터셋 생성
> train <- predict(scaled_train, pre_train)
> test <- predict(scaled_test, pre_test)
  
 # 데이터 모델링
 # glm
> md_glm <- glm(loan_status~., train, family='binomial')
Warning message:
glm.fit: 알고리즘이 수렴하지 않았습니다   - glm pass

 

# svm
> library(e1071)
> md_svm <- svm(loan_status~., train)
> pred_svm <- svm(md_svm, test, type='response')
Error in svm.default(md_svm, test, type = "response") : 
  wrong type specification!
 svm pass

 

# 랜덤포레스트 사용
 md_rf2 <- randomForest(loan_status~., train, ntree=300)
> pred_rf <- predict(md_rf2, test, type='response')
> confusionMatrix(pred_rf, test$loan_status)
Confusion Matrix and Statistics

                    Reference
Prediction           COLLECTION COLLECTION_PAIDOFF
  COLLECTION                 30                  5
  COLLECTION_PAIDOFF          0                 25
                                          
               Accuracy : 0.9167          
                 95% CI : (0.8161, 0.9724)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : 5.191e-12       
                                          
                  Kappa : 0.8333          
                                          
 Mcnemar's Test P-Value : 0.07364         
                                          
            Sensitivity : 1.0000          
            Specificity : 0.8333          
         Pos Pred Value : 0.8571          
         Neg Pred Value : 1.0000          
             Prevalence : 0.5000          
         Detection Rate : 0.5000          
   Detection Prevalence : 0.5833          
      Balanced Accuracy : 0.9167          
                                          
       'Positive' Class : COLLECTION      

# 데이터 저장
> total = as.data.frame(cbind(test$Loan_ID, pred_rf))
> head(total)
 write.csv(total, "12314_556.csv", row.names = FALSE)

댓글

💲 추천 글