Selamat Datang! Dalam rangka mengerjakan Learn By Building milik Algoritma Academy, kita akan menganalisis menggunakan Classification yaitu memprediksi sebuah variabel dengan menggunakan class atau kelompok.
Data yang akan digunakan adalah data mengenai penumpang/korban kapal Titanic.
Seperti yang kita ketahui, peristiwa ini terjadi pada tanggal 15 April 1912. Kecelakaan kapal yang terkenal dalam sejarah manusia yang menewaskan 1502 penumpang dari 2204 yang berada di kapal Titanic.
Kita akan memprediksi penumpang yang selamat pada peristiwa Titanic terjadi, ada beberapa metode yang dapat kita lakukan dalam memprediksi hal tersebut.
Metode yang akan digunakan adalah metode Regresi Logistik dan K-Nearest Neighbor (K-NN) sebagai metode klasifikasi dan memprediksi penumpang yang selamat. Selain itu, kita akan membandingkan kinerja kedua metode ini mana diantara keduanya yang jauh lebih baik.
Kita akan menggunakan Confusion Matrix untuk mengevaluasi model-model tersebut, dan berdasarkan hasil dari Confusion Matrix, kita akan membandingkan kinerjanya.
Dalam data yang kita dapatkan, sudah ada data train dan data test yang telah disediakan, jadi kita dapat langsung melakukan pengimportan pada data - data tersebut.
#Data Submission
titanic <- read.csv(file = "gender_submission.csv")
#Data Train
train_titanic <- read.csv("train.csv")
#Data Test
test_titanic <- read.csv("test.csv")Selanjutnya kita akan melihat Data Train dan Data Test apakah ada perbedaan atau tidak.
#> Rows: 418
#> Columns: 11
#> $ PassengerId <int> 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903…
#> $ Pclass <int> 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 1, 1, 2, 1, 2, 2, 3, 3, 3…
#> $ Name <chr> "Kelly, Mr. James", "Wilkes, Mrs. James (Ellen Needs)", "M…
#> $ Sex <chr> "male", "female", "male", "male", "female", "male", "femal…
#> $ Age <dbl> 34.5, 47.0, 62.0, 27.0, 22.0, 14.0, 30.0, 26.0, 18.0, 21.0…
#> $ SibSp <int> 0, 1, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0…
#> $ Parch <int> 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ Ticket <chr> "330911", "363272", "240276", "315154", "3101298", "7538",…
#> $ Fare <dbl> 7.8292, 7.0000, 9.6875, 8.6625, 12.2875, 9.2250, 7.6292, 2…
#> $ Cabin <chr> "", "", "", "", "", "", "", "", "", "", "", "", "B45", "",…
#> $ Embarked <chr> "Q", "S", "Q", "S", "S", "S", "Q", "S", "C", "S", "S", "S"…
#> 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 <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
#> $ Sex <chr> "male", "female", "female", "female", "male", "male", "mal…
#> $ 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 <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
#> $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
#> $ Cabin <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
#> $ Embarked <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…
Ternyata, terdapat perbedaan kolom pada Data Test dan Data Train
yaitu Data Test tidak memiliki Variavel Survived. Langkah
selanjutnya kita akan memindahkan data Submission alias
titanic ke dalam Data Test
test_titanic <- inner_join(test_titanic, titanic) %>%
mutate(Survived = as.factor(Survived))
test_titanicOkeyy, kita sudah berhasil memindahkan ke dalam Data Test ^^
Berdasarkan Data Test dan Data Train, ada beberapa kolom yang harus diubah ke dalam tipe data lain.
#Mengubah data submission
titanic <- titanic %>%
mutate(PassengerId = as.factor(PassengerId))
#Mengubah data test
test_titanic <- test_titanic %>%
mutate(PassengerId = as.factor(PassengerId),
Pclass = as.factor(Pclass),
Name = as.character(Name),
Age = as.integer(Age))
#Mengubah data train
train_titanic <- train_titanic %>%
mutate(PassengerId = as.factor(PassengerId),
Survived = as.factor(Survived),
Pclass = as.factor(Pclass),
Name = as.character(Name),
Age = as.integer(Age))
#Mengecheck kembali
glimpse(train_titanic)#> Rows: 891
#> Columns: 12
#> $ PassengerId <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
#> $ Survived <fct> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
#> $ Pclass <fct> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
#> $ Name <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
#> $ Sex <chr> "male", "female", "female", "female", "male", "male", "mal…
#> $ Age <int> 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 <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
#> $ Fare <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
#> $ Cabin <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
#> $ Embarked <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…
#> Rows: 418
#> Columns: 12
#> $ PassengerId <fct> 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903…
#> $ Pclass <fct> 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 1, 1, 2, 1, 2, 2, 3, 3, 3…
#> $ Name <chr> "Kelly, Mr. James", "Wilkes, Mrs. James (Ellen Needs)", "M…
#> $ Sex <chr> "male", "female", "male", "male", "female", "male", "femal…
#> $ Age <int> 34, 47, 62, 27, 22, 14, 30, 26, 18, 21, NA, 46, 23, 63, 47…
#> $ SibSp <int> 0, 1, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0…
#> $ Parch <int> 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ Ticket <chr> "330911", "363272", "240276", "315154", "3101298", "7538",…
#> $ Fare <dbl> 7.8292, 7.0000, 9.6875, 8.6625, 12.2875, 9.2250, 7.6292, 2…
#> $ Cabin <chr> "", "", "", "", "", "", "", "", "", "", "", "", "B45", "",…
#> $ Embarked <chr> "Q", "S", "Q", "S", "S", "S", "Q", "S", "C", "S", "S", "S"…
#> $ Survived <fct> 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1…
#> PassengerId Pclass Name Sex Age SibSp
#> 0 0 0 0 86 0
#> Parch Ticket Fare Cabin Embarked Survived
#> 0 0 1 0 0 0
#> PassengerId Survived Pclass Name Sex Age
#> 0 0 0 0 0 177
#> SibSp Parch Ticket Fare Cabin Embarked
#> 0 0 0 0 0 0
Ternyata terdapat Missing Value dari Data Train dan Data Test, hal ini perlu kita atasi dengan menghilangkan kolom tersebut
#Menghilangkan kolom `Age`
test_titanic <- test_titanic %>%
filter(!is.na(Age)) %>%
na.omit()
train_titanic <- train_titanic %>%
filter(!is.na(Age))Data Titanic ini memiliki penjelasan pada beberapa kolomnya, yaitu sebagai berikut :
survive (Survived): Status Selamat (0 = Tidak, 1 =
Ya)pclass (Ticket class): Kelas Tiket (1 = Kelas 1, 2 =
Kelas 2, 3 = Kelas 3)sex (Sex): Jenis Kelaminage (Age): Usia dalam tahunsibsp (# of siblings/spouses aboard the Titanic):
Jumlah saudara/kakak atau pasangan suami/istri yang ikut di kapal
Titanicparch (# of parents/children aboard the Titanic):
Jumlah orangtua/anak-anak yang ikut di kapal Titanicticket (Ticket number): Nomor Tiketfare (Passenger fare): Tarif Penumpangcabin (Cabin number): Nomor Kabinembarked (Port of Embarkation): Pelabuhan Keberangkatan
(C = Cherbourg, Q = Queenstown, S = Southampton)Sebelum kita makin jauh menjelajahi data yang ada, mari kita
memperjelas bahwa variabel Survived merupakab data biner
jadi perlu kita perjelas lebih lanjut
#Mengubah menjadi biner
test_titanic <- test_titanic %>%
mutate(Survived = as.factor(ifelse(Survived == 1, "yes", "no")))
train_titanic <- train_titanic %>%
mutate(Survived = as.factor(ifelse(Survived == 1, "yes", "no")))Ada beberapa kolom yang kita tidak perlukan dalam Modeling, jadi
perlu kita keluarkan terlebih dahulu. Kolom tersebut adalah
PassengerId, Name, dan Cabin.
#Mengeluarkan kolom
test_titanic <- test_titanic %>%
select(-c(PassengerId,Ticket,Name,Cabin))
train_titanic <- train_titanic %>%
select(-c(PassengerId,Ticket,Name,Cabin))Selanjutnya, kita akan mengecheck proporsi pada keseluruhan data
#total row data
total_row <- nrow(test_titanic) + nrow(train_titanic)
#Test data compare total row data
round((nrow(test_titanic) / total_row) * 100, 3)#> [1] 31.675
#> [1] 68.325
#>
#> no yes
#> 0.5938375 0.4061625
Kita telah mendapatkan hasil dari proporsi data Titanic, dimana data tersebut imbalance tapi masih dapat kita gunakan untuk Modeling.
Kita akan membuat model pertama dengan Logistic Regression
#Menggunakan fungsi `glm`
log_model_all <- glm(formula = Survived ~ . ,data = train_titanic, family = "binomial")
summary(log_model_all)#>
#> Call:
#> glm(formula = Survived ~ ., family = "binomial", data = train_titanic)
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) 16.690199 607.920508 0.027 0.978097
#> Pclass2 -1.190492 0.329224 -3.616 0.000299 ***
#> Pclass3 -2.395513 0.343296 -6.978 0.00000000000299 ***
#> Sexmale -2.638768 0.223042 -11.831 < 0.0000000000000002 ***
#> Age -0.043281 0.008310 -5.208 0.00000019039880 ***
#> SibSp -0.362899 0.129307 -2.806 0.005009 **
#> Parch -0.060848 0.123959 -0.491 0.623515
#> Fare 0.001454 0.002595 0.560 0.575255
#> EmbarkedC -12.259056 607.920379 -0.020 0.983911
#> EmbarkedQ -13.082493 607.920581 -0.022 0.982831
#> EmbarkedS -12.660510 607.920362 -0.021 0.983385
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 964.52 on 713 degrees of freedom
#> Residual deviance: 632.29 on 703 degrees of freedom
#> AIC: 654.29
#>
#> Number of Fisher Scoring iterations: 13
Selanjutnya, kita akan membuat model K-NN aka K-Nearest Neighbors.
# Membagi target variable
train_x <- train_titanic %>%
select(-c(Survived, Pclass, Sex, Embarked))
test_x <- test_titanic %>%
select(-c(Survived, Pclass, Sex, Embarked))
train_y <- train_titanic %>%
select(c(Survived))
test_y <- test_titanic %>%
select(c(Survived))# Scaling data prediktor
train_p <- scale(x = train_x, center = T)
test_p <- scale(x = test_x,
center = attr(train_p, "scaled:center"),
scale = attr(train_p, "scaled:scale")
)library(class) # package untuk fungsi `knn()`
knn_survivor_pred <- knn(train = train_p,
test = test_p,
cl = train_y$Survived,
k = 1)#> [1] no no yes yes yes no no no yes no no yes no no yes no no no
#> [19] no yes yes yes no no yes yes yes no no yes yes yes no no yes no
#> [37] no no no no yes no yes no yes yes no no no yes no yes no yes
#> [55] yes no no no no no no yes yes yes yes yes no no yes yes yes no
#> [73] yes yes no no yes no yes yes no no yes yes no no no no no yes
#> [91] yes yes yes no yes yes yes no yes no no no yes no yes yes no no
#> [109] no no no no no yes no yes yes yes no no no no no no yes no
#> [127] yes yes no no yes no no no no yes yes no yes yes yes yes no no
#> [145] yes no no yes yes no yes no no yes yes no yes no no yes yes yes
#> [163] no no no yes no yes no no yes no yes yes no no no yes no no
#> [181] yes yes no yes no yes no yes yes no no no no yes no no no yes
#> [199] yes no yes no no no no no yes no yes yes no no no yes yes no
#> [217] yes no no no yes no yes no yes no no no no yes no no no no
#> [235] no no no yes yes no no yes no yes no no yes no no no no no
#> [253] yes yes no yes no yes yes no no yes no no yes no yes yes no yes
#> [271] yes no no no no yes no no yes yes no yes no no yes no yes yes
#> [289] yes yes yes no yes no yes no yes no yes no yes no no yes no no
#> [307] no no yes yes no no yes yes yes no yes no yes no yes yes no no
#> [325] no yes yes yes no yes no
#> Levels: no yes
Model akan dilakukan evaluasi dengan Confussion Matrix. Confussion Matrix adalah tabel yang menunjukkan empat kategori berbeda: True Positive, True Negative, False Positive, and False Negative.
Menggunakan Library caret
Pertama kita akan melihat dari Model Logistic Regression yang telah kita buat.
log_survivor_pred <- as.factor(if_else(log_survivor_pred > 0.5, "yes", "no"))
confusionMatrix(data = log_survivor_pred,
reference = as.factor(test_y$Survived),
positive = "yes")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction no yes
#> no 186 14
#> yes 18 113
#>
#> Accuracy : 0.9033
#> 95% CI : (0.8663, 0.9329)
#> No Information Rate : 0.6163
#> P-Value [Acc > NIR] : <0.0000000000000002
#>
#> Kappa : 0.7968
#>
#> Mcnemar's Test P-Value : 0.5959
#>
#> Sensitivity : 0.8898
#> Specificity : 0.9118
#> Pos Pred Value : 0.8626
#> Neg Pred Value : 0.9300
#> Prevalence : 0.3837
#> Detection Rate : 0.3414
#> Detection Prevalence : 0.3958
#> Balanced Accuracy : 0.9008
#>
#> 'Positive' Class : yes
#>
Kita dapat melihat bahwa hasil prediksi pada dataset train menggunakan model regresi logistik memiliki akurasi sebesar 90,33%, artinya prediksi data hasil kita sebesar 90,33% diklasifikasikan dengan benar. Nilai presisi/prediksi positif sekitar 86,26%, artinya 86,26% prediksi positif kita terklasifikasi dengan benar.
Nilai sensitivitas 88.98% dan spesifisitas 88.98%, hal ini menunjukkan prediksi positif dan negatif yang diklasifikasikan dengan benar berkisar antara 86-88%.
Selanjutnya kita akan menggunakan model KNN
#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction no yes
#> no 125 61
#> yes 79 66
#>
#> Accuracy : 0.577
#> 95% CI : (0.5218, 0.6309)
#> No Information Rate : 0.6163
#> P-Value [Acc > NIR] : 0.9358
#>
#> Kappa : 0.129
#>
#> Mcnemar's Test P-Value : 0.1508
#>
#> Sensitivity : 0.5197
#> Specificity : 0.6127
#> Pos Pred Value : 0.4552
#> Neg Pred Value : 0.6720
#> Prevalence : 0.3837
#> Detection Rate : 0.1994
#> Detection Prevalence : 0.4381
#> Balanced Accuracy : 0.5662
#>
#> 'Positive' Class : yes
#>
Kita dapat melihat bahwa hasil prediksi pada dataset test menggunakan model K-NN dengan menggunakan K = 1 memiliki Accuracy 57.7%, artinya prediksi data hasil kita 57,7% tergolong benar. Nilai precision/positive sekitar 45,52%, berarti 45,52% prediksi positif kita terklasifikasi dengan benar. Nilai sensitivty sebesar 51,9% dan spesifisitas 61,27%, hal ini menunjukkan prediksi positif dan negatif yang diklasifikasikan dengan benar berkisar antara 50-60%
Kita dapat menyimpulkan, Berdasarkan hasil yang telah dibuat pada kedua model, kinerja regresi logistis lebih baik di setiap aspek dibandingkan model K-NN. Model Logistic Regression memiliki nilai yang cukup tinggi dalam memprediksi dibandingkan Model K-NN
Jadi, dari hasil tersebut kita dapat menggunakan Logistic Regression
untuk memprediksi “Orang yang Selamat” atau Survived dari
kapal karam Titanic.