Titanic’s Survivor Classification
Introduction
Kita akan melakukan klasifikasi data menggunakan metode Logistic Regression Model. Data yang akan digunakan adalah Titanic dataset dimana kita akan mengklasifikasikan penunmpang yang berhasil selamat atau tidak berdasarkan informasi lain yang diperoleh atas penumpang tsb. Data Titanic dapat didownload disini.
Data Preparation
Load the Required Package
Load the Dataset
Untuk membuat model, kita akan menggunakan data train.csv. Maka tahap pertama yang kita lakukan adalah import data train.csv :
Cek Tipe Data :
## Observations: 891
## Variables: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ...
## $ Survived <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0...
## $ Pclass <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3...
## $ Name <fct> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley ...
## $ Sex <fct> male, female, female, female, male, male, male, male, f...
## $ Age <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 1...
## $ SibSp <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1...
## $ Parch <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0...
## $ Ticket <fct> A/5 21171, PC 17599, STON/O2. 3101282, 113803, 373450, ...
## $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.86...
## $ Cabin <fct> , C85, , C123, , , E46, , , , G6, C103, , , , , , , , ,...
## $ Embarked <fct> S, C, S, S, S, Q, S, S, S, C, S, S, S, S, S, S, Q, S, S...
Data kita terdiri dari 891 baris dengan 12 kolom. Target variable kita ada Survived dan kita akan menggunakan variable lainnya sebagai predictor untuk model kita.
Exploratory Data Analysis
Exploratory data analysis / EDA merupakan tahapan dimana kita melakukan eksplorasi terhadap variabel-variabel di data kita dan menentukan apakah variable tsb layak dipergunakan sebagai predictor untuk model kita.
Explore Data Variables
Variabel yang ada di dataset Titanic adalah :
PassengerId: merupakan ID unik untuk masing-masing penumpang. Variabel ini tidak akan berguna untuk model kita, maka akan kita abaikan nantinya.Survived: status penumpang tsb. 0 = Tidak Selamat, 1 = Selamat. Ini akan menjadi target variable kita, dimana proporsi variabelSurviveduntuk data train kita adalah :
## .
## 0 1
## 61.62 38.38
Pclass: kelas ticketnya. 1 = Kelas 1, 2 = Kelas 2, 3 = Kelas 3, dimana proposi variable adalah:
## .
## 1 2 3
## 24.24 20.65 55.11
Name: merupakan nama penumpang. Variabel ini tidak akan berguna untuk model kita, maka akan kita abaikan nantinya.Sex: jenis kelamin dari masing-masing penumpang. Kita akan ubah jenis kelamin menjadi 0 = female, 1 = male.
## .
## female male
## 35.24 64.76
Age: umur penumpang.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.42 20.12 28.00 29.70 38.00 80.00 177
SibSp: merupakan jumlah saudara / pasangan yang ada di Titanic saat itu.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 0.000 0.523 1.000 8.000
Parch: merupakan jumlah orang tua / anak yang ada di Titanic saat itu.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 0.0000 0.3816 0.0000 6.0000
Ticket: merupakan nomor ticket. Variabel ini tidak akan berguna untuk model kita, maka akan kita abaikan nantinya.Fare: merupakan biaya yang dibayarkan oleh masing-masing penumpang.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 7.91 14.45 32.20 31.00 512.33
Cabin: merupakan nomor kabin. Variabel ini tidak akan berguna untuk model kita, maka akan kita abaikan nantinya.Embarked: merupakan pelabuhan keberangkatan. C = Cherbourg, Q = Queenstown, S = Southampton
## .
## C Q S
## 0.22 18.86 8.64 72.28
Pre-processing Data
Kita akan menghapus variabel-variabel yang tidak akan digunakan oleh model Machine Learning kita :
## Observations: 891
## Variables: 8
## $ Survived <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1...
## $ Pclass <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3...
## $ Sex <fct> male, female, female, female, male, male, male, male, fema...
## $ Age <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, ...
## $ SibSp <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0...
## $ Parch <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0...
## $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,...
## $ Embarked <fct> S, C, S, S, S, Q, S, S, S, C, S, S, S, S, S, S, Q, S, S, C...
Ada variabel-variabel yang tipe data nya belum sesuai, untuk itu kita akan ubah tipe datanya terlebih dulu :
Ubah jenis kelamin :
Cek porsi missing value di kolom Age:
## [1] 19.86532
Karena porsi missing value di kolom Age cukup besar yaitu 19% yaitu lebih besar dari 5%, maka kita akan mengganti missing value dengan rata-rata umur berdasarkan gender dan tempat keberangkatan dari data yang kita ketahui umurnya:
avg_ages <- titanic %>%
filter(is.na(titanic$Age)==0) %>%
group_by(Sex, Embarked) %>%
summarise(
mean_age = round(mean(Age),2)
)
titanic <- titanic %>%
left_join(avg_ages, titanic, by=c("Sex", "Embarked")) %>%
mutate(
Age = if_else(is.na(titanic$Age)==1, mean_age, Age)
)
titanic <- titanic %>%
select(-mean_age)Modeling
Cross Validation
Sebelum membuat model, kita akan membagi data kita menjadi data train dan data test. Kita akan menggunakan data train untuk melakukan training atas model kita, dan data test untuk memvalidasi model kita. Kita akan menggunakan 80% dari data kita untuk menjadi data train dan sisanya menjadi data test.
Modeling
Kita akan menggunakan motode Logistic Regression dengan semua prediktor :
logistic_model <- glm(data = data_train, formula = Survived ~ ., family = "binomial")
summary(logistic_model)##
## Call:
## glm(formula = Survived ~ ., family = "binomial", data = data_train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.5503 -0.6100 -0.4442 0.6316 2.3948
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 16.408909 611.314646 0.027 0.97859
## Pclass2 -1.015659 0.336672 -3.017 0.00255 **
## Pclass3 -2.136076 0.332580 -6.423 0.000000000134 ***
## Sex1 -2.624847 0.224593 -11.687 < 0.0000000000000002 ***
## Age -0.037614 0.008613 -4.367 0.000012583175 ***
## SibSp -0.281436 0.121267 -2.321 0.02030 *
## Parch -0.122567 0.128396 -0.955 0.33978
## Fare 0.001184 0.002885 0.410 0.68150
## EmbarkedC -12.374363 611.314507 -0.020 0.98385
## EmbarkedQ -12.644533 611.314573 -0.021 0.98350
## EmbarkedS -12.774017 611.314493 -0.021 0.98333
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 942.07 on 711 degrees of freedom
## Residual deviance: 638.51 on 701 degrees of freedom
## AIC: 660.51
##
## Number of Fisher Scoring iterations: 13
Berikutnya adalah memprediksi target variabel Survived berdasarkan model yang telah dibuat dengan threshold 50% artinya, jika hasil model kita memiliki minimum nilai 0.5, baru penumpang tsb dinyatakan Selamat (Survived = 1).
Evaluation
Kita akan melakukan evaluasi model kita menggunakan confusionMatrix() dimana kita akan fokus pada penumpang yang dinyatakan Selamat:
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 92 16
## 1 12 59
##
## Accuracy : 0.8436
## 95% CI : (0.7819, 0.8935)
## No Information Rate : 0.581
## P-Value [Acc > NIR] : 0.00000000000003688
##
## Kappa : 0.6763
##
## Mcnemar's Test P-Value : 0.5708
##
## Sensitivity : 0.7867
## Specificity : 0.8846
## Pos Pred Value : 0.8310
## Neg Pred Value : 0.8519
## Prevalence : 0.4190
## Detection Rate : 0.3296
## Detection Prevalence : 0.3966
## Balanced Accuracy : 0.8356
##
## 'Positive' Class : 1
##
Dari matrix di atas, kita bisa menyatakan bahwa kemampaun model kita dalam menebak target sebesar 84.36% (Accuracy) dan bisa menebak dengan presisi sebesar 83.10% (Pos Pred Value).
Model Improvement
Jika kita eliminasi prediktor yang kira-kira kurang berpengaruh seperti Fare dan Embarked, maka model kita akan menjadi :
logistic_model_imp <- glm(data = data_train, formula = Survived ~ Pclass + Sex + Age + SibSp + Parch, family = "binomial")
summary(logistic_model_imp)##
## Call:
## glm(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch,
## family = "binomial", data = data_train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.6010 -0.5953 -0.4384 0.6276 2.3889
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.935566 0.441934 8.905 < 0.0000000000000002 ***
## Pclass2 -1.217384 0.293513 -4.148 0.00003359 ***
## Pclass3 -2.311728 0.270544 -8.545 < 0.0000000000000002 ***
## Sex1 -2.649554 0.219667 -12.062 < 0.0000000000000002 ***
## Age -0.038428 0.008561 -4.489 0.00000716 ***
## SibSp -0.289679 0.119414 -2.426 0.0153 *
## Parch -0.110426 0.124000 -0.891 0.3732
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 942.07 on 711 degrees of freedom
## Residual deviance: 641.73 on 705 degrees of freedom
## AIC: 655.73
##
## Number of Fisher Scoring iterations: 5
Dengan threshold yang sama sebesar 50%, hasil prediksi kita adalah :
pred_value_imp <- predict(logistic_model_imp, data_test, type = "response")
pred_label_imp <- ifelse(pred_value_imp <= 0.5, 0, 1)Evaluation
Kita akan melakukan evaluasi model baru kita menggunakan confusionMatrix() dimana kita akan fokus pada penumpang yang dinyatakan Selamat:
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 85 16
## 1 19 59
##
## Accuracy : 0.8045
## 95% CI : (0.7387, 0.8599)
## No Information Rate : 0.581
## P-Value [Acc > NIR] : 0.0000000001913
##
## Kappa : 0.6006
##
## Mcnemar's Test P-Value : 0.7353
##
## Sensitivity : 0.7867
## Specificity : 0.8173
## Pos Pred Value : 0.7564
## Neg Pred Value : 0.8416
## Prevalence : 0.4190
## Detection Rate : 0.3296
## Detection Prevalence : 0.4358
## Balanced Accuracy : 0.8020
##
## 'Positive' Class : 1
##
Dari matrix di atas, kita bisa menyatakan bahwa kemampuan model kita dalam menebak target sebesar 80.45% (Accuracy) dan bisa menebak dengan presisi sebesar 75.64% (Pos Pred Value).
Conclusion
Berdasarkan paparan di atas, model kita yang menggunakan prediktor : Survived, Pclass, Sex, Age, SibSp, Parch, Fare, dan Embarked mampu menebak target sebesar 84.36% (Accuracy) dan bisa menebak dengan presisi sebesar 83.10% (Pos Pred Value).
Jika kita menghilangkan prediktor Fare dan Embarked dan model kita hanya berdasarkan prediktor : Survived, Pclass, Sex, Age, SibSp dan Parch, kemampuan model kita semakin memburuk karena hanya mampu menebak target sebesar 80.45% (Accuracy) dan bisa menebak dengan presisi sebesar 75.64% (Pos Pred Value).
Diantara kedua model tersebut, model yang menggunakan seluruh prediktor tetap lebih baik untuk digunakan.