Pendahuluan

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.


1. Pemilihan Target Variabel

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.


2. Eksplorasi Data & Feature Selection

2.1 Eksplorasi Data

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…

2.2 Analisis Feature Selection

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.

3. Pre-processing Data

3.1 Data Cleansing

# 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)

3.2 Cross Validation

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)

4. Pembangunan Model dan Evaluasi

4.1 Model Naive Bayes

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.

4.2 Model Decision Tree

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

5. Peningkatan Performa Model

5.1 Pruning pada Decision Tree

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.

5.2 Perbandingan Model: Naive Bayes vs Decision Tree

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.

6. Kesimpulan

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.