Explanation

History of Titanic Tragedy

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.

Read Data

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

Preprocessing Data

Feature Engineering

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)

Data Inspection

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 penumpang
  • Name : Tipe data Character, data nama penumpang
  • Sex : Tipe data Character, data jenis kelamin penumpang
  • Age : Tipe data Numeric, data umur penumpang
  • SibSp : 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 penumpang
  • Fare : Tipe data Numeric, data kekayaan atau status sosial penumpang
  • Cabin : Tipe data Character, data identitas cabin
  • Embarked : Tipe data Character, data embarkasi

Data Cleansing

Pada 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"

Adjusted Type Data

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 :

  • Survived dirubah menjadi Factor
  • Pclass dirubah menjadi Factor
  • Sex dirubah menjadi Factor
  • SibSp dirubah menjadi Factor
  • Parch dirubah menjadi Factor
  • Embarked dirubah menjadi Factor

Sebelum 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 Statistic

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

Interpretaion :

  1. Nilai Max. : 1309 pada PassengerId mendeskripsikan jumlah penumpang dalam kapal Titanic sebanyak 1309.
  2. Survived (1) penumpang Titanic selamat 342 orang
  3. Jenis kelamin Sex penumpang kapal Titanic masing-masing Laki-laki sebanyak 843 orang dan Perempuan 466
  4. Usia Age dari penumpang kapal Titanic berusia paling kecil = 0.17 dan usia paling tua 80
  5. Tarif penumpang Fare paling tinggi sebesar 512.319
  6. Embarked tujuan terbanyak penumpang kapal Titanic ke tujuan S= Southampton sebanyak 914, diikuti oleh C = Cherbourg sebanyak 272 dan Q = Queenstown sebanyak 123.

Data Manipulation & Data Transformation

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), ]

Berapa jumlah penumpang yang 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.

Berapa proporsi jumlah penumpang yang 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)))

Berapa jumlah penumpang yang 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.

Berapa jumlah penjualan tiket 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.

Berapa jumlah penjualan tiket 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

Berapa jumlah penumpang Survived menurut category Usianya Ages?

table(titanic$Ages, titanic$Survived)
##        
##           0   1
##   +80     0   1
##   <20    85  79
##   20-29 268 129
##   30-39  94  73
##   40-49  55  34
##   50-59  28  20
##   60-69  13   6
##   70-79   6   0

Interpretation :

  • Penumpang selamat diusia <20 tahun sebanyak 85 orang dan yang tidak selamat sebanyak 79 orang
  • Penumpang selamat diusia 20-29 tahun sebanyak 268 orang dan penumpang yang tidak selamat sebanyak 129 orang
  • Penumpang selamat diusia 30-39 tahun sebanyak 94 orang dan penumpang yang tidak selamat sebanyak 73 orang
  • Penumpang selamat diusia 40-49 tahun sebanyak 55 orang dan penumpang yang tidak selamat sebanyak 34 orang
  • Penumpang selamat diusia 50-59 tahun sebanyak 28 orang dan penumpang yang tidak selamat sebanyak 20 orang
  • Penumpang selamat diusia 60-69 tahun sebanyak 13 orang dan penumpang yang tidak selamat sebanyak 6 orang
  • Penumpang selamat diusia 70-79 tahun sebanyak 6 orang dan tidak ada penumpang yang tidak selamat
  • Tidak ada Penumpang yang selamat diusia >80 tahun dan penumpang yang tidak selamat sebanyak 1 orang

Conclusion

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.