RMS Titanic adalah sebuah kapal penumpang super Britania Raya yang tenggelam di Samudera Atlantik Utara pada tanggal 15 April 1912 setelah menabrak sebuah gunung es pada pelayaran perdananya dari Southampton, Inggris ke New York City. Tenggelamnya Titanic mengakibatkan kematian sebanyak 1.514 orang dalam salah satu bencana maritim masa damai paling mematikan sepanjang sejarah. Titanic merupakan kapal terbesar di dunia pada pelayaran perdananya. Satu dari tiga kapal samudra kelas Olympic dioperasikan oleh White Star Line. Kapal ini dibangun pada 1909 sampai 1911 oleh galangan kapal Harland and Wolff di Belfast. Kapal ini sanggup mengangkut 2.224 penumpang. (source : https://id.wikipedia.org/wiki/RMS_Titanic)
Pada kesempatan kali ini saya akan melakukan Exploratory Data Analysis pada dataset yang berisi tentang biodata dari penumpang kapal Titanic tersebut. Dataset ini didapatkan dari https://www.kaggle.com/c/titanic yang diambil pada bulan Maret 2021. Dari biodata tersebut apakah dapat digunakan untuk memprediksi apakah penumpang dari kapal tersebut selamat atau tidak.
# Membaca dan Mengecek data train.csv
train <- read.csv("data/train.csv")
head(train)# Membaca dan Mengecek data test.csv
test <- read.csv("data/test.csv")
head(test)Agar kedua data di atas (train.csv & test.csv) dapat digunakan, maka perlu dilakukan penggabungan data (join data). Sebelumnya dilakukan proses pembuatan kolom baru pada data test yaitu kolom Survived dengan nilai NA yang bertujuan agar jumlah kolom sama dan dapat dijoinkan.
# Menggabungkan data (train & test)
test$Survived <- NA
titanic <- rbind(train, test)head(titanic)tail(titanic)dim(titanic)## [1] 1309 12
colnames(titanic)## [1] "PassengerId" "Survived" "Pclass" "Name" "Sex"
## [6] "Age" "SibSp" "Parch" "Ticket" "Fare"
## [11] "Cabin" "Embarked"
str(titanic)## 'data.frame': 1309 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 "" "C85" "" "C123" ...
## $ Embarked : chr "S" "C" "S" "S" ...
Dari hasil Data Inspection didapatkan bahwa Data Titanic memiliki 1309 rows dan 12 columns. Terdapat kolom PassengerId yang dapat kita lihat, kolom ini hanyalah sebuah indeks dan bukan merupakan attribute dari penumpang kapal titanic. Berikut attribute atau variabel yang dapat kita analisis, adalah :
Survived : Tipe data Integer, data penumpang (Survived = 1) atau tidak (0)Pclass : Tipe data Integer, data kelas penumpangName : Tipe data Character, data nama penumpangSex : Tipe data Character, data jenis kelamin penumpangAge : Tipe data Numeric, data umur penumpangSibSp : Tipe data Integer, data jumlah saudara kandung (Siblings) atau pasangan (spouses)Parch : Tipe data Integer, data jumlah orang tua (parents) atau anak (children)Ticket : Tipe data Character, data identitas ticket penumpangFare : Tipe data Numeric, data kekayaan atau status sosial penumpangCabin : Tipe data Character, data identitas cabinEmbarked : Tipe data Character, data embarkasiPada kolom Cabin terdapat nilai kosong "", agar dapat mengetahui jumlah Missing Value (NA) pada data maka dapat dilakukan imputasi dengan mengisikan nilai NA pada data.
titanic$Cabin[titanic$Cabin == ""] <- NA# Mengetahui jumlah Missing Value pada masing-masing kolom di Dataset
colSums(is.na(titanic))## PassengerId Survived Pclass Name Sex Age
## 0 418 0 0 0 263
## SibSp Parch Ticket Fare Cabin Embarked
## 0 0 0 1 1014 0
Dari hasil diatas dapat kita lihat, bahwa kolom Age terdapat banyak nilai NA hampir sebanyak 20% dari data, agar datanya dapat kita gunakan lebih optimal maka akan dilakukan proses imputasi dengan nilai NA menggunakan nilai median pada kolom Age, hal yang sama juga dilakukan pada kolom Fare. Sedangkan pada kolom Survived terdapat sebanyak 418 NA yang sudah di set kedalam observasi dan Cabin sebesar 1014 yang akan dihilangkan.
# Median `Age`
median(titanic$Age[!is.na(titanic$Age)])## [1] 28
# Median `Fare`
median(titanic$Fare[!is.na(titanic$Fare)])## [1] 14.4542
titanic <- subset(x = titanic, select = -c(Cabin))
titanic$Age[is.na(titanic$Age)] = 28
titanic$Fare[is.na(titanic$Fare)] = 14.454
titanic$Embarked[titanic$Embarked == ""] = "C"str(titanic)## 'data.frame': 1309 obs. of 11 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 28 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 ...
## $ Embarked : chr "S" "C" "S" "S" ...
Masih terdapat beberapa kolom dengan type data yang belum sesuai, maka dari itu type data dengan kolom yang belum sesuai harus disesuaikan terlebih dahulu. Kolom yang belum sesuai type data nya sebagai berikut :
FactorFactorFactorFactorFactorFactorSebelum itu, dapat kita lihat pada data Pclass dan Embarked isi datanya masih menggunakan alias keterangan, agar lebih jelas mari kita memberikan nama pada masing-masingnya.
# Memberi nama masing-masing data `Pclass`, `Embarked`
titanic$Pclass <- sapply(as.character(titanic$Pclass), switch,
"1" = "1st Class",
"2" = "2nd Class",
"3" = "3rd Class")
titanic$Embarked <- sapply(titanic$Embarked, switch,
"C" = "Cherbourg",
"Q" = "Queenstown",
"S" = "Southampton")# Mengubah data menjadi factor
titanic[, c("Pclass","Sex","SibSp","Parch","Embarked","Survived")] <- lapply(
titanic[, c("Pclass","Sex","SibSp","Parch","Embarked","Survived")], as.factor)str(titanic)## 'data.frame': 1309 obs. of 11 variables:
## $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
## $ Survived : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 1 1 2 2 ...
## $ Pclass : Factor w/ 3 levels "1st Class","2nd Class",..: 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 : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
## $ Age : num 22 38 26 35 35 28 54 2 27 14 ...
## $ SibSp : Factor w/ 7 levels "0","1","2","3",..: 2 2 1 2 1 1 1 4 1 2 ...
## $ Parch : Factor w/ 8 levels "0","1","2","3",..: 1 1 1 1 1 1 1 2 3 1 ...
## $ Ticket : chr "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
## $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
## $ Embarked : Factor w/ 3 levels "Cherbourg","Queenstown",..: 3 1 3 3 3 2 3 3 3 1 ...
Type data di atas sudah sesuai seperti yang diinginkan.
Summary digunakan untuk mendapatkan deskripsi nilai statistik dari data numeric dengan menggunakan function summary(). Function akan membantu untuk mendapatkan quick insight dari data yang kita miliki.
summary(titanic)## PassengerId Survived Pclass Name Sex
## Min. : 1 0 :549 1st Class:323 Length:1309 female:466
## 1st Qu.: 328 1 :342 2nd Class:277 Class :character male :843
## Median : 655 NA's:418 3rd Class:709 Mode :character
## Mean : 655
## 3rd Qu.: 982
## Max. :1309
##
## Age SibSp Parch Ticket Fare
## Min. : 0.17 0:891 0 :1002 Length:1309 Min. : 0.000
## 1st Qu.:22.00 1:319 1 : 170 Class :character 1st Qu.: 7.896
## Median :28.00 2: 42 2 : 113 Mode :character Median : 14.454
## Mean :29.50 3: 20 3 : 8 Mean : 33.281
## 3rd Qu.:35.00 4: 22 4 : 6 3rd Qu.: 31.275
## Max. :80.00 5: 6 5 : 6 Max. :512.329
## 8: 9 (Other): 4
## Embarked
## Cherbourg :272
## Queenstown :123
## Southampton:914
##
##
##
##
PassengerId mendeskripsikan jumlah penumpang dalam kapal Titanic sebanyak 1309.Survived (1) penumpang Titanic selamat 342 orangSex penumpang kapal Titanic masing-masing Laki-laki sebanyak 843 orang dan Perempuan 466Age dari penumpang kapal Titanic berusia paling kecil = 0.17 dan usia paling tua 80Fare paling tinggi sebesar 512.319Embarked tujuan terbanyak penumpang kapal Titanic ke tujuan S= Southampton sebanyak 914, diikuti oleh C = Cherbourg sebanyak 272 dan Q = Queenstown sebanyak 123.Mengelompokkan Usia Age ke dalam beberapa kelompok.
Ages <- function(x){
if(x < 20) {
x <- "<20"
} else if (x >= 20 & x <= 29) {
x <- "20-29"
} else if (x >= 30 & x <= 39) {
x <- "30-39"
} else if (x >= 40 & x <= 49) {
x <- "40-49"
} else if (x >= 50 & x <= 59) {
x <- "50-59"
} else if (x >= 60 & x <= 69) {
x <- "60-69"
} else if (x >= 70 & x <= 79) {
x <- "70-79"
} else ( x <- "+80")
}
titanic$Ages <- as.factor(sapply(titanic$Age, Ages))Mengurutkan Tarif penumpang Fare dari jumlah terbesar ke terendah dengan kondisi apakah Survived (0) atau tidak (1) dan berdasarkan pengelompokkan Usia Age penumpang yang telah dikelompokkan sebelumnya.
# Melakukan Aggregasi dengan nilai SUM
order.fare <- aggregate(Fare ~ Ages + Survived, titanic, FUN = sum)
# Mengurutkan `Fare` dari yang terbesar
order.fare[order(order.fare$Fare, decreasing = T), ]Survived ?table(titanic$Survived)##
## 0 1
## 549 342
Interpretation :
Penumpang kapal Titanic yang Selamat sebanyak 549 dan penumpang Tidak selamat sebanyak 342.
barplot(table(titanic$Survived))Jika dilihat dari Graph di atas maka jumlah penumpang yang Survived memiliki angka lebih dari 500.
Survived sesuai dengan jenis kelamin Sex?prop.table(table(titanic$Sex, titanic$Survived))*100##
## 0 1
## female 9.090909 26.150393
## male 52.525253 12.233446
Penumpang kapal Titanic berjenis kelamin Sex laki-laki lebih banyak yang Selamat sebanyak 52% dibanding penumpang perempuan sebanyak 9.1% dan penumpang Tidak selamat laki-laki lebih sedikit dari penumpang perempuan.
plot(prop.table(table(titanic$Sex, titanic$Survived)))Survived dan tidak, sesuai dengan kelasnya Pclass?table(titanic$Survived, titanic$Pclass)##
## 1st Class 2nd Class 3rd Class
## 0 80 97 372
## 1 136 87 119
plot(table(titanic$Survived, titanic$Pclass))Interpretation :
Terlihat bahwa penumpang yang memesan tiket Fare di kelas Pclass 3 lebih banyak yang selamat tetapi jumlah yang tidak selamat pun cukup banyak, untuk Pclass 1 penumpang yang selamat lebih sedikit daripada penumpang yang tidak selamat sedangkan pada Pclass 2 keduanya cukup seimbang.
Fare ke berbagai tujuan Embarked?fare.embarked <- xtabs(formula = Fare ~ Embarked, data = titanic)
as.data.frame(fare.embarked)Interpretation :
Tujuan pelabuhan Embarked dengan jumlah penjualan tiket Fare terbesar yaitu tujuan ke Southampthon sebesar 25047.840, kemudian Cherbourg 16990.792 dan Queenstown 1526.309.
Fare sesuai dengan Pclass nya ?fare.pclass <- aggregate(formula = Fare ~ Pclass, data = titanic, FUN = sum)
fare.pclass[order(fare.pclass$Fare, decreasing = T), ]Kelas dengan penjualan Fare terbesar ialah Pclass 1 kemudian Pclass 3 dan Pclass 2
Dari hasil Exploratory Data Analysis yang telah dilakukan, dapat ditarik kesimpulan bahwa banyaknya variabel yang mempengaruhi tingkat keselamatan Survived dari penumpang kapal Titanic. Mulai dari usia Age, kelas Pclass dan sebetulnya masih banyak lagi. Dalam hal ini EDA yang dilakukan tidak terlalu mendalam hanya memberikan gambaran secara umumnya saja. Dataset ini masih dapat di explorasi lebih mendalam sehingga dapat mendapatkan insight yang lebih baik dan akurat lagi.