데이터 분석

[머신러닝 모델링을 통한 타이타닉 데이터 분석]

r-code-for-data-analysis 2023. 7. 9. 21:30

 

knitr::opts_chunk$set(echo=F, fig.align = "center", message=F, warning=F, fig.height = 5, cache=T, dpi = 300)

#데이터 불러오기



데이터 변수와 형식을 보자. Survived 가 우리가 예측해야 하는 종속변수이고, 나머지 컬럼이 독립변수이다. 


```r
str(train)
## 'data.frame':    891 obs. of  12 variables:
##  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
##  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
##  $ Name       : chr  "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
##  $ Sex        : chr  "male" "female" "female" "female" ...
##  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
##  $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
##  $ Ticket     : chr  "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
##  $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
##  $ Cabin      : chr  NA "C85" NA "C123" ...
##  $ Embarked   : chr  "S" "C" "S" "S" ...

데이터 정제

  1. 필요없는 컬럼은 삭제한다. 이때 train을 삭제하면, test도 삭제해야 한다.
  2. 문자형은 범주형으로 바꿔준다.
  3. target 인 Survived는 숫자로 표시되어 있지만 범주형으로 바꿔준다. (분류모델)

PassengerId, Name, Ticket,Cabin 열은 삭제한다. %<>% 오퍼레이터를 사용하면 편하다.

##   Survived Pclass    Sex Age SibSp Parch    Fare Embarked
## 1        0      3   male  22     1     0  7.2500        S
## 2        1      1 female  38     1     0 71.2833        C
## 3        1      3 female  26     0     0  7.9250        S
## 4        1      1 female  35     1     0 53.1000        S
## 5        0      3   male  35     0     0  8.0500        S
## 6        0      3   male  NA     0     0  8.4583        Q

na 가 있는 열 확인하기

colSums(is.na(train))
## Survived   Pclass      Sex      Age    SibSp    Parch     Fare Embarked 
##        0        0        0      177        0        0        0        2
colSums(is.na(test)) 
##   Pclass      Sex      Age    SibSp    Parch     Fare Embarked 
##        0        0       86        0        0        1        0

모델구축

훈련/검증 데이터 나누기

train 데이터를 df_train과 df_test로 나눈다. df_train으로 모델 훈련을 하고, df_test로 검증한다. 나중에 test 데이터를 모델에 넣어 나온 값을 subbmssion 으로 제출한다.

idx <- createDataPartition(train$Survived, p=0.7, list=F)
df_train <- train[idx,]
df_test <- train[-idx,]
head(df_train)
##   Survived Pclass    Sex Age SibSp Parch    Fare Embarked
## 1        0      3   male  22     1     0  7.2500        S
## 3        1      3 female  26     0     0  7.9250        S
## 5        0      3   male  35     0     0  8.0500        S
## 6        0      3   male  NA     0     0  8.4583        Q
## 7        0      1   male  54     0     0 51.8625        S
## 8        0      3   male   2     3     1 21.0750        S

##결측치 대체 (knn)

#결측치 제거거 (knn)

df_train <- df_train %>% na.omit()
df_test <- df_test %>% na.omit()

# na 가 있는 열 확인하기
colSums(is.na(df_train))
## Survived   Pclass      Sex      Age    SibSp    Parch     Fare Embarked 
##        0        0        0        0        0        0        0        0
colSums(is.na(df_test)) 
## Survived   Pclass      Sex      Age    SibSp    Parch     Fare Embarked 
##        0        0        0        0        0        0        0        0

모델만들기

#로지스틱 회귀 모델
m1<-train(Survived~., data=df_train, method="glm") 

#랜덤포레스트 모델
m2<-randomForest(Survived~., data=df_train, ntree=100, proximity=T) 

#의사결정나무 모델 
tree <- rpart(Survived ~ ., data = df_train)

# Fast 램덤포레스트 모델
set.seed(101)
rfo <- ranger(Survived ~ ., data = df_train, importance = "impurity")

# XGBoost 모델
set.seed(102)
bst <- xgboost(
  data = data.matrix(subset(df_train, select = -Survived)),
  label = df_train$Survived, 
  objective = "reg:linear",
  nrounds = 100, 
  max_depth = 5, 
  eta = 0.3,
  verbose = 0  # suppress printing
)
## [21:37:17] WARNING: src/objective/regression_obj.cu:213: reg:linear is now deprecated in favor of reg:squarederror.

모델별 중요도 보기

##예측하기

모델 평가하기 (Accuracy)

모델별 성능 비교 시각화

Best 모델로 다시 모델링하고 test 예측하기

## function(x){as.numeric(levels(x))[x]}
## <bytecode: 0x000001d820b4f6b0>

정답 제출하기

728x90
반응형