df<-read.csv("travel_data.csv")
library(caret)
## Warning: 패키지 'caret'는 R 버전 4.1.3에서 작성되었습니다
## 필요한 패키지를 로딩중입니다: ggplot2
## Warning: 패키지 'ggplot2'는 R 버전 4.1.3에서 작성되었습니다
## 필요한 패키지를 로딩중입니다: lattice
library(dplyr)
## Warning: 패키지 'dplyr'는 R 버전 4.1.3에서 작성되었습니다
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(recipes)
## Warning: 패키지 'recipes'는 R 버전 4.1.3에서 작성되었습니다
## 
## 다음의 패키지를 부착합니다: 'recipes'
## The following object is masked from 'package:stats':
## 
##     step
train_list<-createDataPartition(y=df$TravelInsurance,p=0.75,list=FALSE)
df_train<-df[train_list,]
df_test<-df[-train_list,]
NROW(df_train)
## [1] 1491
NROW(df_test)
## [1] 496
df_train %>% glimpse
## Rows: 1,491
## Columns: 10
## $ INDEX               <int> 0, 1, 4, 6, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18, 2~
## $ Age                 <int> 31, 31, 28, 31, 31, 28, 33, 31, 32, 31, 34, 28, 28~
## $ Employment.Type     <chr> "Government Sector", "Private Sector/Self Employed~
## $ GraduateOrNot       <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "~
## $ AnnualIncome        <int> 400000, 1250000, 700000, 1300000, 1350000, 1450000~
## $ FamilyMembers       <int> 6, 7, 8, 4, 3, 6, 3, 9, 6, 6, 7, 4, 7, 5, 6, 3, 4,~
## $ ChronicDiseases     <int> 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,~
## $ FrequentFlyer       <chr> "No", "No", "Yes", "No", "Yes", "Yes", "Yes", "No"~
## $ EverTravelledAbroad <chr> "No", "No", "No", "No", "Yes", "Yes", "No", "No", ~
## $ TravelInsurance     <int> 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0,~
df_test %>% glimpse
## Rows: 496
## Columns: 10
## $ INDEX               <int> 2, 3, 5, 11, 14, 19, 24, 30, 34, 48, 51, 52, 53, 6~
## $ Age                 <int> 34, 28, 25, 26, 31, 34, 31, 30, 28, 28, 29, 31, 28~
## $ Employment.Type     <chr> "Private Sector/Self Employed", "Private Sector/Se~
## $ GraduateOrNot       <chr> "Yes", "Yes", "No", "Yes", "Yes", "Yes", "Yes", "N~
## $ AnnualIncome        <int> 500000, 700000, 1150000, 1400000, 400000, 1500000,~
## $ FamilyMembers       <int> 4, 3, 4, 5, 3, 2, 7, 6, 9, 3, 3, 4, 2, 4, 3, 9, 6,~
## $ ChronicDiseases     <int> 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,~
## $ FrequentFlyer       <chr> "No", "No", "No", "Yes", "No", "Yes", "Yes", "Yes"~
## $ EverTravelledAbroad <chr> "No", "No", "No", "Yes", "No", "Yes", "Yes", "Yes"~
## $ TravelInsurance     <int> 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0,~
df_train %>% mutate(index="train")->df_train
df_test %>% mutate(index='test')->df_test
bind_rows(df_train,df_test)->full
full %>% head
##   INDEX Age              Employment.Type GraduateOrNot AnnualIncome
## 1     0  31            Government Sector           Yes       400000
## 2     1  31 Private Sector/Self Employed           Yes      1250000
## 3     4  28 Private Sector/Self Employed           Yes       700000
## 4     6  31            Government Sector           Yes      1300000
## 5     7  31 Private Sector/Self Employed           Yes      1350000
## 6     8  28 Private Sector/Self Employed           Yes      1450000
##   FamilyMembers ChronicDiseases FrequentFlyer EverTravelledAbroad
## 1             6               1            No                  No
## 2             7               0            No                  No
## 3             8               1           Yes                  No
## 4             4               0            No                  No
## 5             3               0           Yes                 Yes
## 6             6               1           Yes                 Yes
##   TravelInsurance index
## 1               0 train
## 2               0 train
## 3               0 train
## 4               0 train
## 5               1 train
## 6               1 train
full$TravelInsurance<-ifelse(full$TravelInsurance==0,"미가입","가입")
full$TravelInsurance<-as.factor(full$TravelInsurance)
full$GraduateOrNot<-as.factor(full$GraduateOrNot)
full$FrequentFlyer<-as.factor(full$FrequentFlyer)
full$EverTravelledAbroad<-as.factor(full$EverTravelledAbroad)

recipe(TravelInsurance~.,data=full) %>% step_YeoJohnson(Age,AnnualIncome,FamilyMembers) %>% 
  step_center(Age,AnnualIncome,FamilyMembers) %>% 
  step_scale(Age,AnnualIncome,FamilyMembers) %>% prep() %>% juice()->data

data %>%filter(index=="train") %>% select(-index)->train 
data %>%filter(index=='test') %>% select(-index)->test

ctrl<-trainControl(method="cv",summaryFunction = twoClassSummary,
                   classProbs = TRUE)
train(TravelInsurance~.,data=train,
      method='rpart',metric="ROC",
      trControl=ctrl)->rpfit

rpfit
## CART 
## 
## 1491 samples
##    9 predictor
##    2 classes: '가입', '미가입' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1342, 1342, 1341, 1342, 1342, 1341, ... 
## Resampling results across tuning parameters:
## 
##   cp          ROC        Sens       Spec     
##   0.01134216  0.7795426  0.5900581  0.9687822
##   0.06427221  0.7361892  0.5105588  0.9688144
##   0.40642722  0.5889670  0.1924528  0.9854811
## 
## ROC was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.01134216.
confusionMatrix(rpfit)
## Cross-Validated (10 fold) Confusion Matrix 
## 
## (entries are percentual average cell counts across resamples)
##  
##           Reference
## Prediction 가입 미가입
##     가입   20.9    2.0
##     미가입 14.6   62.5
##                             
##  Accuracy (average) : 0.8343
test %>% glimpse
## Rows: 496
## Columns: 10
## $ INDEX               <int> 2, 3, 5, 11, 14, 19, 24, 30, 34, 48, 51, 52, 53, 6~
## $ Age                 <dbl> 1.4182229, -0.5150177, -1.7617299, -1.3198997, 0.5~
## $ Employment.Type     <fct> Private Sector/Self Employed, Private Sector/Self ~
## $ GraduateOrNot       <fct> Yes, Yes, No, Yes, Yes, Yes, Yes, No, Yes, Yes, Ye~
## $ AnnualIncome        <dbl> -1.1612874, -0.5655285, 0.6113603, 1.2021095, -1.4~
## $ FamilyMembers       <dbl> -0.3760749, -1.1525825, -0.3760749, 0.2737135, -1.~
## $ ChronicDiseases     <int> 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,~
## $ FrequentFlyer       <fct> No, No, No, Yes, No, Yes, Yes, Yes, No, No, No, No~
## $ EverTravelledAbroad <fct> No, No, No, Yes, No, Yes, Yes, Yes, No, No, No, Ye~
## $ TravelInsurance     <fct> 가입, 미가입, 미가입, 가입, 미가입, 가입, 미가입, ~
predict(rpfit,test,type='prob')->rffit1
predict(rpfit,test,type="raw")->rffit2
confusionMatrix(rffit2,test$TravelInsurance)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction 가입 미가입
##     가입    103     11
##     미가입   78    304
##                                           
##                Accuracy : 0.8206          
##                  95% CI : (0.7839, 0.8533)
##     No Information Rate : 0.6351          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.5798          
##                                           
##  Mcnemar's Test P-Value : 2.634e-12       
##                                           
##             Sensitivity : 0.5691          
##             Specificity : 0.9651          
##          Pos Pred Value : 0.9035          
##          Neg Pred Value : 0.7958          
##              Prevalence : 0.3649          
##          Detection Rate : 0.2077          
##    Detection Prevalence : 0.2298          
##       Balanced Accuracy : 0.7671          
##                                           
##        'Positive' Class : 가입            
## 
head(rffit2)
## [1] 미가입 미가입 미가입 가입   미가입 가입  
## Levels: 가입 미가입
importance<-varImp(rpfit,scale=FALSE)
print(importance)
## rpart variable importance
## 
##                                               Overall
## AnnualIncome                                  205.128
## EverTravelledAbroadYes                        140.858
## FamilyMembers                                  71.928
## Age                                            47.027
## FrequentFlyerYes                               44.681
## Employment.TypePrivate Sector/Self Employed    14.151
## INDEX                                           2.921
## GraduateOrNotYes                                0.000
## `Employment.TypePrivate Sector/Self Employed`   0.000
## ChronicDiseases                                 0.000
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## 다음의 패키지를 부착합니다: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
predict(rpfit,newdata=test,type='raw')->rffit3
rffit3
##   [1] 미가입 미가입 미가입 가입   미가입 가입   가입   미가입 미가입 미가입
##  [11] 미가입 미가입 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입
##  [21] 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 미가입 가입  
##  [31] 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 가입   미가입
##  [41] 미가입 미가입 가입   미가입 미가입 미가입 가입   미가입 미가입 가입  
##  [51] 미가입 미가입 미가입 미가입 미가입 미가입 가입   가입   미가입 미가입
##  [61] 가입   가입   가입   미가입 가입   가입   미가입 미가입 미가입 가입  
##  [71] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입 미가입
##  [81] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
##  [91] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입
## [101] 미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
## [111] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
## [121] 미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입
## [131] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입  
## [141] 미가입 가입   미가입 미가입 미가입 가입   가입   미가입 미가입 가입  
## [151] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입
## [161] 미가입 미가입 미가입 가입   미가입 미가입 가입   미가입 가입   미가입
## [171] 미가입 미가입 미가입 미가입 미가입 미가입 가입   가입   미가입 미가입
## [181] 가입   미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입 가입  
## [191] 미가입 미가입 미가입 미가입 가입   미가입 미가입 미가입 가입   미가입
## [201] 미가입 가입   미가입 미가입 가입   미가입 미가입 미가입 미가입 가입  
## [211] 미가입 미가입 가입   미가입 미가입 미가입 미가입 가입   미가입 미가입
## [221] 가입   미가입 가입   미가입 미가입 미가입 미가입 미가입 가입   미가입
## [231] 미가입 미가입 가입   가입   미가입 미가입 가입   가입   미가입 미가입
## [241] 미가입 가입   미가입 가입   미가입 미가입 미가입 미가입 가입   미가입
## [251] 미가입 미가입 미가입 미가입 미가입 가입   미가입 가입   미가입 미가입
## [261] 미가입 미가입 미가입 미가입 미가입 가입   가입   가입   미가입 미가입
## [271] 미가입 미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입 미가입
## [281] 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입
## [291] 미가입 미가입 미가입 미가입 가입   가입   미가입 가입   가입   미가입
## [301] 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 미가입 가입  
## [311] 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 가입   가입  
## [321] 미가입 가입   미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입
## [331] 가입   미가입 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입
## [341] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
## [351] 미가입 미가입 미가입 가입   미가입 가입   가입   미가입 미가입 미가입
## [361] 미가입 미가입 미가입 가입   미가입 미가입 가입   미가입 미가입 미가입
## [371] 가입   미가입 미가입 미가입 가입   미가입 미가입 가입   미가입 가입  
## [381] 미가입 미가입 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
## [391] 미가입 미가입 가입   가입   미가입 미가입 미가입 미가입 미가입 미가입
## [401] 가입   미가입 가입   가입   미가입 미가입 가입   미가입 미가입 미가입
## [411] 가입   미가입 미가입 가입   미가입 미가입 미가입 가입   미가입 미가입
## [421] 미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입 가입   미가입
## [431] 미가입 미가입 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입
## [441] 가입   미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입 미가입
## [451] 미가입 가입   미가입 미가입 미가입 미가입 미가입 미가입 가입   미가입
## [461] 가입   가입   미가입 미가입 미가입 미가입 가입   미가입 미가입 가입  
## [471] 미가입 미가입 미가입 미가입 가입   미가입 미가입 미가입 미가입 미가입
## [481] 가입   미가입 가입   미가입 가입   미가입 미가입 가입   미가입 미가입
## [491] 가입   미가입 가입   미가입 가입   미가입
## Levels: 가입 미가입
rffit1_num<-as.numeric(rffit3)
rffit1_num
##   [1] 2 2 2 1 2 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 1 2 2 2
##  [38] 2 1 2 2 2 1 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 2 2 1 1 1 2 1 1 2 2 2 1 2 2 2 2
##  [75] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2
## [112] 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 1 1 2
## [149] 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 1 1 2 2 1 2 1 2 2
## [186] 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 1 2 2 1 2 2 2 2 1 2 2 1 2 2 2 2 1 2 2 1 2
## [223] 1 2 2 2 2 2 1 2 2 2 1 1 2 2 1 1 2 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2 2 1 2 1 2
## [260] 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 1
## [297] 2 1 1 2 2 2 2 1 2 2 2 2 2 1 2 2 2 1 2 2 2 2 1 1 2 1 2 1 2 2 2 2 2 2 1 2 2
## [334] 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 1 2 2 2 2 2 2 1 2 2 1 2 2 2
## [371] 1 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 2 2 1 2 2 2 1 1 2 2 2 2 2 2 1 2 1 1 2 2 1
## [408] 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2
## [445] 2 2 2 1 2 2 2 1 2 2 2 2 2 2 1 2 1 1 2 2 2 2 1 2 2 1 2 2 2 2 1 2 2 2 2 2 1
## [482] 2 1 2 1 2 2 1 2 2 1 2 1 2 1 2
result1<-pROC::roc(test$TravelInsurance,rffit1_num)
## Setting levels: control = 가입, case = 미가입
## Setting direction: controls < cases
result1
## 
## Call:
## roc.default(response = test$TravelInsurance, predictor = rffit1_num)
## 
## Data: rffit1_num in 181 controls (test$TravelInsurance 가입) < 315 cases (test$TravelInsurance 미가입).
## Area under the curve: 0.7671
result1$auc
## Area under the curve: 0.7671