Laporan ini bertujuan untuk mengembangkan model prediktif dengan
menggunakan dataset Titanic yang terdiri atas tiga file, yaitu
train.csv, test.csv, dan
gender_submission.csv, yang meliputi hal-hal berikut -
Pemilihan target variabel tergantung dari perspektif case yang ingin
diambil - Analisis data dan proses pemilihan variabel prediktor /
feature selection - Pre-processing data dari data cleansing hingga cross
validation. - Penjelasan mengenai evaluasi dari model yang digunakan,
apakah metrik terbaik untuk mengevaluasi model dan mengapa. -
Mendokumentasikan analisa tentang cara meningkatkan performa dari
modelnya (misal proses pruning tree) dan/atau perbandingan dari model
naive bayes dan tree.
Berdasarkan dataset dan kasus yang diambil, target variabel yang akan
diprediksi adalah Survived (0: Tidak selamat, 1: selamat).
Insight: Pemilihan target variabel ini membantu kita
dalam mengidentifikasi faktor yang mempengaruhi keselamatan penumpang
dan mengembangkan model prediktif yang relevan dengan kebutuhan
analisis.
Langkah pertama adalah membaca dataset dan melakukan eksplorasi awal untuk memahami struktur data.
# Load data dari file .csv
train <- read.csv("train.csv", stringsAsFactors = TRUE)
test <- read.csv("test.csv")
gender_submission <- read.csv("gender_submission.csv", stringsAsFactors = TRUE)
glimpse(train)
## Rows: 891
## Columns: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
## $ 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…
## $ Name <fct> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
## $ 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…
## $ Ticket <fct> A/5 21171, PC 17599, STON/O2. 3101282, 113803, 373450, 330…
## $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
## $ 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, C…
Pada tahap ini, akan dilakukan analisis variabel untuk menentukan faktor mana yang paling relevan. Asumsi awal untuk beberapa variabel potensial antara lain: - Pclass: kelas penumpang. - Sex: jenis kelamin. - Age: usia penumpang. - SibSp dan Parch: jumlah saudara dan orang tua/anak yang menyertai - Fare: tarif yang dibayarkan. - Embarked: pelabuhan keberangkatan.
# Analisis Hubungan Variabel `Sex` dengan `Survived`
prop.table(table(train$Sex, train$Survived), 1)
##
## 0 1
## female 0.2579618 0.7420382
## male 0.8110919 0.1889081
Insight: - 74.2% perempuan selamat
(Survived = 1) - 81.1% laki-laki tidak selamat
Hal ini menunjukkan bahwa Sex merupakan prediktor kuat
terhadap kemungkinan bertahan hidup, di mana perempuan lebih berpeluang
jauh lebih besar untuk hidup daripada laki-laki.
# Analisis Hubungan Variabel `Pclass` dengan `Survived`
prop.table(table(train$Pclass, train$Survived), 1)
##
## 0 1
## 1 0.3703704 0.6296296
## 2 0.5271739 0.4728261
## 3 0.7576375 0.2423625
Insight: - 62.9% Pclass 1 selamat
(Survived = 1) - 75.7% Pclass 3 tidak selamat
# Visualisasi Hubungan Variabel `Pclass` dengan `Survived`
library(ggplot2)
ggplot(train, aes(x = Pclass, fill = factor(Survived))) +
geom_bar(position = "fill") +
ylab("Proportion Survived") +
labs(fill = "Survived")
Hal ini menunjukkan bahwa penumpang Pclass 1 memiliki
tingkat peluang selamat yang lebih tinggi, diikuti oleh penumpang
Pclass 2, dan di paling terendah pada penumpang
Pclass 3.
# Ringkasan data untuk mengidentifikasi missing values
summary(train)
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 Min. : 0.00
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 1st Qu.: 7.91
## Median :0.000 Median :0.0000 CA. 2343: 7 Median : 14.45
## Mean :0.523 Mean :0.3816 3101295 : 6 Mean : 32.20
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 3rd Qu.: 31.00
## Max. :8.000 Max. :6.0000 CA 2144 : 6 Max. :512.33
## (Other) :852
## Cabin Embarked
## :687 : 2
## B96 B98 : 4 C:168
## C23 C25 C27: 4 Q: 77
## G6 : 4 S:644
## C22 C26 : 3
## D : 3
## (Other) :186
# Mengisi missing value pada `Age` dengan nilai median
train$Age[is.na(train$Age)] <- median(train$Age, na.rm = TRUE)
# Mengisi missing value pada `Embarked` dengan modus
train$Embarked[train$Embarked == ""] <- as.character(names(sort(table(train$Embarked), decreasing = TRUE))[1])
# Konversi variabel ke tipe faktor
train$Pclass <- as.factor(train$Pclass)
train$Survived <- as.factor(train$Survived)
Untuk mengevaluasi model secara robust, digunakan teknik cross validation (80-20 split sebagai validasi awal).
library(caret)
set.seed(123)
trainData <- train[createDataPartition(train$Survived, p = 0.8, list = FALSE), ]
validData <- train[-createDataPartition(train$Survived, p = 0.8, list = FALSE), ]
# Menampilkan distribusi kelas pada data training dan validasi
table(trainData$Survived)
##
## 0 1
## 440 274
table(validData$Survived)
##
## 0 1
## 109 68
Hasilnya menunjukkan distribusi berikut.
Data Training: - 440 penumpang tidak selamat (0) - 274 penumpang selamat (1)
Data Testing: - 109 penumpang tidak selamat (0) - 68 penumpang selamat (1)
Model Naive Bayes bisa dipilih karena simpel dan memiliki kemampuan untuk memberikan baseline performa dengan komputasi yang cepat.
library(e1071)
# Membangun model Naive Bayes dengan fitur yang telah dipilih
model_nb <- naiveBayes(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data = trainData)
# Prediksi pada data validasi
pred_nb <- predict(model_nb, validData)
# Evaluasi model menggunakan confusion matrix
confusionMatrix(pred_nb, validData$Survived)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 98 32
## 1 11 36
##
## Accuracy : 0.7571
## 95% CI : (0.687, 0.8183)
## No Information Rate : 0.6158
## P-Value [Acc > NIR] : 4.823e-05
##
## Kappa : 0.4549
##
## Mcnemar's Test P-Value : 0.002289
##
## Sensitivity : 0.8991
## Specificity : 0.5294
## Pos Pred Value : 0.7538
## Neg Pred Value : 0.7660
## Prevalence : 0.6158
## Detection Rate : 0.5537
## Detection Prevalence : 0.7345
## Balanced Accuracy : 0.7142
##
## 'Positive' Class : 0
##
Insight dari Confusion Matrix: Berdasarkan confusion matrix, model menyatakan bahwa - TN (True Negative): 98 -> prediksi “tidak selamat”, benar-benar tidak selamat - FP (False Positive): 32 -> prediksi “tidak selamat”, padahal selamat - TP (True Positive): 36 -> prediksi “selamat”, benar-benar selamat - FN (False Negative): 11 -> prediksi “selamat”, padahal tidak selamat
Conclusion: - Model Naive Bayes sangat bagus mendeteksi penumpang yang tidak selamat (kelas mayoritas). - Model masih kesulitan mengenali penumpang yang selamat, sehingga ada potensi tinggi false positives. - Untuk meningkatkan performa, dapat dicoba model lain seperti decision tree atau random forest untuk bandingkan.
Decision Tree dapat digunakan untuk menangkap interaksi antar fitur dan memberikan model yang mudah diinterpretasikan.
library(rpart)
# Membangun model Decision Tree
model_tree <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data = trainData, method = "class")
# Prediksi pada data validasi
pred_tree <- predict(model_tree, validData, type = "class")
# Evaluasi model dengan conf matrix
confusionMatrix(pred_tree, validData$Survived)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 98 17
## 1 11 51
##
## Accuracy : 0.8418
## 95% CI : (0.7795, 0.8922)
## No Information Rate : 0.6158
## P-Value [Acc > NIR] : 4.229e-11
##
## Kappa : 0.66
##
## Mcnemar's Test P-Value : 0.3447
##
## Sensitivity : 0.8991
## Specificity : 0.7500
## Pos Pred Value : 0.8522
## Neg Pred Value : 0.8226
## Prevalence : 0.6158
## Detection Rate : 0.5537
## Detection Prevalence : 0.6497
## Balanced Accuracy : 0.8245
##
## 'Positive' Class : 0
##
Insight dari Confusion Matrix: - TN: 98 -> prediksi “tidak selamat”, benar-benar tidak selamat. - FP: 17 -> prediksi “tidak selamat”, padahal selamat. - FN: 11 -> prediksi “selamat”, padahal tidak selamat. - TP: 51 -> prediksi “selamat”, benar-benar selamat.
Conclusion - Model ini memiliki performa yang lebih seimbang dan akurat dibandingkan dengan model sebelumnya (Naive Bayes). - Decision Tree model ini lebih baik dalam mengenali penumpang yang benar-benar selamat (Specificity naik dari 52.94% -> 75%). - Model dapat ditingkatkan kembali menggunakan Pruning tree untuk menghindari overfitting
Proses pruning dapat mengurangi kompleksitas tree sehingga overfitting dapat terhindar dan generalisasi model dapat ditingkatkan.
# Menampilkan tabel kompleksitas parameter (CP) untuk melihat performa tree
printcp(model_tree)
##
## Classification tree:
## rpart(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch +
## Fare + Embarked, data = trainData, method = "class")
##
## Variables actually used in tree construction:
## [1] Age Fare Pclass Sex
##
## Root node error: 274/714 = 0.38375
##
## n= 714
##
## CP nsplit rel error xerror xstd
## 1 0.459854 0 1.00000 1.00000 0.047424
## 2 0.032847 1 0.54015 0.54015 0.039531
## 3 0.027372 2 0.50730 0.53285 0.039332
## 4 0.018248 4 0.45255 0.48540 0.037968
## 5 0.010949 6 0.41606 0.47810 0.037746
## 6 0.010000 9 0.38321 0.47445 0.037634
Insight: - CP optimal ada pada 0.01, karena dapat memberikan xerror paling rendah. - 9 merupakan jumlah split yang ideal untuk menangkap pola tanpa overfitting.
# Melakukan pruning dengan memilih cp yang optimal (cp = 0.01)
pruned_tree <- prune(model_tree, cp = 0.01)
# Prediksi menggunakan pruned tree pada data validasi
pred_pruned <- predict(pruned_tree, validData, type = "class")
# Evaluasi pruned tree
confusionMatrix(pred_pruned, validData$Survived)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 98 17
## 1 11 51
##
## Accuracy : 0.8418
## 95% CI : (0.7795, 0.8922)
## No Information Rate : 0.6158
## P-Value [Acc > NIR] : 4.229e-11
##
## Kappa : 0.66
##
## Mcnemar's Test P-Value : 0.3447
##
## Sensitivity : 0.8991
## Specificity : 0.7500
## Pos Pred Value : 0.8522
## Neg Pred Value : 0.8226
## Prevalence : 0.6158
## Detection Rate : 0.5537
## Detection Prevalence : 0.6497
## Balanced Accuracy : 0.8245
##
## 'Positive' Class : 0
##
Insight: - Akurasi yang sama seperti sebelum di-pruned, menunjukkan bahwa tidak ada penurunan performa setelah pruning. - Model menjadi lebih sederhana setelah di-pruning, tapi tetap efektif.
Secara umum, kedua model memiliki kelebihan dan kekurangan masing-masing: - Naive Bayes - Kelebihan: Cepat, mudah diimplementasikan, dan berfungsi dengan baik sebagai baseline. - Kekurangan: asumsi independen antar fitur yang sering tidak realistis dengan data nyata. - Decision Tree (with Pruning) - Kelebihan: dapat menangkap interaksi antar fitur dan hasilnya mudah diintepretasikan. - Kekurangan: rentan terhadap overfitting tanpa penerapan teknik pruning.
Insight: Walaupun model Naive Bayes memberikan baseline yang baik, Decision Tree yang telah dipruning cenderung menunjukkan performa yang lebih unggul dalam hal akurasi dan interpretabilitas.
Dalam analisis dataset Titanic, telah dilakukan: - Pemilihan target
variabel: Survived sebagai indikator keselamatan penumpang.
- Eksplorasi data dan feature selection: Mengidentifikasi fitur penting
seperti Pclass dan Sex - Pre-processing ->
meliputi data cleansing dan implementasi cross validation untuk validasi
model. - Pembangunan model: dengan model Naive Bayes dan Decision Tree,
yang kemudian dilakukan evaluasi menggunakan metrik seperti accuracy,
dll. - Peningkatan performa: implementasi teknik pruning untuk Decision
Tree, agar dapat mengurangi overfitting serta perbandingan performa
antara kedua model.