데이터 분석
[머신러닝 모델링을 통한 타이타닉 데이터 분석]
r-code-for-data-analysis
2023. 7. 9. 21:30
머신러닝 타이타닉 생존자 예측
2023-07-09
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" ...
데이터 정제
- 필요없는 컬럼은 삭제한다. 이때 train을 삭제하면, test도 삭제해야 한다.
- 문자형은 범주형으로 바꿔준다.
- 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
반응형