brunch

빅분기 2회 기출문제(실기)

작업유형(2)

by 첨물

기출문제로 나왔던 작업유형 2를 풀어보았다.


customer-analysis 데이터 세트를 이용하여 예측모형을 만든 후 높은 Accuracy 값을 가지는 모델의 예측값을 CSV 파일로 제출하시오.


https://www.kaggle.com/prachi13/customer-analytics


전형적인 분류 예측이다.

데이터를 보면 가장 마지막 적시 도착 여부 (0,1) 을 예측하는 것이다.


1. 라이브러리 불러오기


library(dplyr) #전처리

library(caret) #예측

library(ModelMetrics) #confusion matrix

library(e1071) #svm 모델링


2. 데이터 불러오기, 살펴보기


df<-read.csv("train.csv")

str(df)

summary(df)


'data.frame': 10999 obs. of 12 variables:

$ ID : int 1 2 3 4 5 6 7 8 9 10 ...

$ Warehouse_block : Factor w/ 5 levels "A","B","C","D",..: 4 5 1 2 3 5 4 5 1 2 ...

$ Mode_of_Shipment : Factor w/ 3 levels "Flight","Road",..: 1 1 1 1 1 1 1 1 1 1 ...

$ Customer_care_calls: int 4 4 2 3 2 3 3 4 3 3 ...

$ Customer_rating : int 2 5 2 3 2 1 4 1 4 2 ...

$ Cost_of_the_Product: int 177 216 183 176 184 162 250 233 150 164 ...

$ Prior_purchases : int 3 2 4 4 3 3 3 2 3 3 ...

$ Product_importance : Factor w/ 3 levels "high","low","medium": 2 2 2 3 3 3 2 2 2 3 ...

$ Gender : Factor w/ 2 levels "F","M": 1 2 2 2 1 1 1 1 1 1 ...

$ Discount_offered : int 44 59 48 10 46 12 3 48 11 29 ...

$ Weight_in_gms : int 1233 3088 3374 1177 2484 1417 2371 2804 1861 1187 ...

$ Reached.on.Time_Y.N: int 1 1 1 1 1 1 1 1 1 1 ...


3. #y 값 factor로 변경하기/ 필요없는 열 제거하기

(가장 마지막 Reached.on.Time_Y.N 를 factor 0,1 로 만들어야 함. 그리고 id는 제거)

df[,12] <- as.factor(df[,12])

df<-df[,-1]


4. #열별 NA 값 확인. 모든 열에 없음

colSums(is.na(df))


5. #train-test 나누기

idx <- createDataPartition(df$Reached.on.Time_Y.N, p=0.7, list=F)

train <- df[idx, ]

test <- df[-idx, ]


6. #모델링

m1 <- train(Reached.on.Time_Y.N~., data=train, method="rpart") #의사결정나무

m2 <- svm(Reached.on.Time_Y.N~., data = train, type = "C-classification") #서포트벡터머신

m3 <- train(Reached.on.Time_Y.N~., data=train, method="glm") #로지스틱 회귀분석


7. #예측

p1<-predict(m1, test, type="prob")

p11<-as.factor(round(p1[,2])) #factor로 변경 (0,1)


p2<-predict(m2, test, type="prob")


p3<-predict(m3, test, type="prob")

p33<-as.factor(round(p3[,2])) #factor로 변경(0,1)


8. #confusion matrix 확인

tmp1<-caret::confusionMatrix(test$Reached.on.Time_Y.N, p11)

tmp2<-caret::confusionMatrix(test$Reached.on.Time_Y.N, p2)

tmp3<-caret::confusionMatrix(test$Reached.on.Time_Y.N, p33)


9. accuracy 확인

> tmp1$overall[1] #의사결정나무

Accuracy

0.6810188

> tmp2$overall[1] 서포트벡터머신

Accuracy

0.6710127

> tmp3$overall[1] #로지스틱 회귀분석

Accuracy

0.6464524


10. #auc(실측, 예측)

> auc(test$Reached.on.Time_Y.N, p11) #의사결정나무

[1] 0.6907986

> auc(test$Reached.on.Time_Y.N, p2) #의사결정나무

[1] 0.7044738

> auc(test$Reached.on.Time_Y.N, p33) #로지스틱 회귀분석

[1] 0.6350228

>


11. accuracy가 가장 높은 모델로 전체 다시 모델링, test 를 예측


#rpart가 가장 높은 accuracy를 가짐

m <- train(Reached.on.Time_Y.N~., data=df, method="rpart")

p <- predict(m, test, type="prob")


12. 최종 예측값을 CSV 파일로 제출

result <- round(p[,2])

write(result, "1234.csv")




마지막으로 roc curve를 rpart로 모델링 한 것으로 그려보도록 하겠다.

roc(실측, 예측) 을 만들때는 factor가 아닌 numeric으로 변환해야 한다.


library(pROC)

roc_rpart <- roc( as.numeric(test$Reached.on.Time_Y.N), as.numeric(p11))

plot.roc(roc_rpart, 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")





#참고로 정규화를 해서 모델링을 해도 같은 Accuracy 값이 나왔다. 굳이 정규화를 해서 진행하지 않아도 될 듯... (분류 모델)


#정규화 [0,1] 로 만든 후 모델링

normal<-preProcess(train,method='range')

train_normal=predict(normal,train)

test_normal=predict(normal,test)


m1n <- train(Reached.on.Time_Y.N~., data=train_normal, method="rpart")

m2n <- svm(Reached.on.Time_Y.N~., data = train_normal, type = "C-classification")

m3n <- train(Reached.on.Time_Y.N~., data=train_normal, method="glm")


p1n<-predict(m1n, test_normal, type="prob")

p2n<-predict(m2n, test_normal, type="prob")

p11n<-as.factor(round(p1n[,2]))

p3n<-predict(m3n, test_normal, type="prob")

p33n<-as.factor(round(p3n[,2]))


tmp1n<-caret::confusionMatrix(test_normal$Reached.on.Time_Y.N, p11n)

tmp2n<-caret::confusionMatrix(test_normal$Reached.on.Time_Y.N, p2n)

tmp3n<-caret::confusionMatrix(test_normal$Reached.on.Time_Y.N, p33n)


tmp1n$overall[1]

tmp2n$overall[1]

tmp3n$overall[1]


# 빅분기 실기 시험 접수 완료 ^^.

단답형 정리 노트 하나 만들어야겠다.



keyword
매거진의 이전글빅데이터 분석기사 자격증