# Membaca dataset
titanic <- read.csv("~/smt 4/pemodelan statistika dan simulasi/Titanic-Dataset.csv", sep=";", stringsAsFactors=FALSE)
# Mengecek missing values
colSums(is.na(titanic))
## PassengerId Survived Pclass Name Gender Age
## 0 0 0 0 0 177
## SibSp Parch Ticket Fare Cabin Embarked
## 0 0 0 0 0 0
# Mengecek duplikasi
sum(duplicated(titanic$PassengerId))
## [1] 0
# Mengecek tipe data
sapply(titanic, class)
## PassengerId Survived Pclass Name Gender Age
## "integer" "integer" "integer" "character" "character" "numeric"
## SibSp Parch Ticket Fare Cabin Embarked
## "integer" "integer" "character" "character" "character" "character"
# Mengecek nilai unik di kolom kategorikal
table(titanic$Gender)
##
## female male
## 314 577
table(titanic$Embarked)
##
## C Q S
## 2 168 77 644
# Ringkasan statistik untuk mendeteksi anomali
summary(titanic)
## PassengerId Survived Pclass Name
## Min. : 1.0 Min. :0.0000 Min. :1.000 Length:891
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000 Class :character
## Median :446.0 Median :0.0000 Median :3.000 Mode :character
## 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
##
## Gender Age SibSp Parch
## Length:891 Min. : 0.42 Min. :0.000 Min. :0.0000
## Class :character 1st Qu.:20.12 1st Qu.:0.000 1st Qu.:0.0000
## Mode :character Median :28.00 Median :0.000 Median :0.0000
## Mean :29.70 Mean :0.523 Mean :0.3816
## 3rd Qu.:38.00 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :80.00 Max. :8.000 Max. :6.0000
## NA's :177
## Ticket Fare Cabin Embarked
## Length:891 Length:891 Length:891 Length:891
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
Dataset Titanic memiliki beberapa permasalahan yang perlu diperbaiki sebelum analisis lebih lanjut. Beberapa kolom seperti Age, Cabin, dan Embarked memiliki missing values yang perlu diisi atau ditangani dengan strategi tertentu. Selain itu, terdapat kemungkinan duplikasi data berdasarkan PassengerId, yang harus diverifikasi agar tidak mempengaruhi hasil analisis. Tipe data pada beberapa kolom juga tidak sesuai, seperti Fare yang seharusnya numerik dan Gender yang masih berbentuk teks sehingga perlu dikonversi ke format angka. Distribusi kategori pada kolom Gender dan Embarked juga harus diperiksa untuk memastikan keseimbangannya. Terakhir, potensi adanya anomali dalam data numerik, seperti nilai ekstrem pada Fare dan Age, perlu dianalisis lebih lanjut. Oleh karena itu, preprocessing data sangat diperlukan agar dataset lebih bersih dan siap digunakan dalam analisis atau model prediktif.
# Load library yang diperlukan
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Membaca dataset Titanic (Pastikan file ada di direktori kerja R)
titanic <- read.csv("~/smt 4/pemodelan statistika dan simulasi/Titanic-Dataset.csv", sep=";", stringsAsFactors=FALSE)
# Menghapus duplikasi berdasarkan PassengerId
if ("PassengerId" %in% colnames(titanic)) {
titanic <- titanic[!duplicated(titanic$PassengerId), ]
}
# Mengisi missing values pada Age menggunakan median
if ("Age" %in% colnames(titanic)) {
titanic$Age[is.na(titanic$Age)] <- median(titanic$Age, na.rm=TRUE)
}
# Mengisi missing values pada Embarked dengan modus
if ("Embarked" %in% colnames(titanic)) {
mode_value <- names(sort(table(titanic$Embarked), decreasing=TRUE))[1]
titanic$Embarked[is.na(titanic$Embarked)] <- mode_value
}
# Menangani kolom Cabin yang banyak missing values
if ("Cabin" %in% colnames(titanic)) {
# Mengubah Cabin menjadi fitur biner (1 = memiliki kabin, 0 = tidak memiliki kabin)
titanic$Cabin <- ifelse(is.na(titanic$Cabin) | titanic$Cabin == "", 0, 1)
}
# Konversi Gender menjadi numerik (male = 0, female = 1)
if ("Gender" %in% colnames(titanic)) {
titanic$Gender <- ifelse(titanic$Gender == "male", 0, 1)
}
# Membersihkan data di kolom Fare sebelum konversi ke numerik
if ("Fare" %in% colnames(titanic)) {
titanic$Fare <- gsub(",", ".", titanic$Fare) # Mengubah koma menjadi titik jika ada
titanic$Fare <- as.numeric(titanic$Fare) # Konversi ke numerik
titanic$Fare[is.na(titanic$Fare)] <- median(titanic$Fare, na.rm=TRUE) # Isi NA dengan median
}
## Warning: NAs introduced by coercion
# Menangani kategori dengan frekuensi kecil (Re-group kategori langka di Embarked)
if ("Embarked" %in% colnames(titanic)) {
freq_table <- table(titanic$Embarked)
rare_categories <- names(freq_table[freq_table < 10]) # Jika kategori muncul < 10 kali
titanic$Embarked <- ifelse(titanic$Embarked %in% rare_categories, "Other", titanic$Embarked)
}
# Menangani outlier dengan metode IQR pada Age dan Fare
handle_outliers <- function(x) {
Q1 <- quantile(x, 0.25, na.rm=TRUE)
Q3 <- quantile(x, 0.75, na.rm=TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
x[x < lower_bound] <- lower_bound
x[x > upper_bound] <- upper_bound
return(x)
}
if ("Age" %in% colnames(titanic)) {
titanic$Age <- handle_outliers(titanic$Age)
}
if ("Fare" %in% colnames(titanic)) {
titanic$Fare <- handle_outliers(titanic$Fare)
}
# Normalisasi (scaling) pada Age dan Fare agar skala lebih seragam
normalize <- function(x) {
return((x - min(x, na.rm=TRUE)) / (max(x, na.rm=TRUE) - min(x, na.rm=TRUE)))
}
if ("Age" %in% colnames(titanic)) {
titanic$Age <- normalize(titanic$Age)
}
if ("Fare" %in% colnames(titanic)) {
titanic$Fare <- normalize(titanic$Fare)
}
# Menampilkan ringkasan dataset setelah preprocessing
summary(titanic)
## PassengerId Survived Pclass Name
## Min. : 1.0 Min. :0.0000 Min. :1.000 Length:891
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000 Class :character
## Median :446.0 Median :0.0000 Median :3.000 Mode :character
## 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
## Gender Age SibSp Parch
## Min. :0.0000 Min. :0.0000 Min. :0.000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.3750 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.0000 Median :0.4904 Median :0.000 Median :0.0000
## Mean :0.3524 Mean :0.5104 Mean :0.523 Mean :0.3816
## 3rd Qu.:1.0000 3rd Qu.:0.6250 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :8.000 Max. :6.0000
## Ticket Fare Cabin Embarked
## Length:891 Min. :0.00000 Min. :0.000 Length:891
## Class :character 1st Qu.:0.05781 1st Qu.:0.000 Class :character
## Mode :character Median :0.15318 Median :0.000 Mode :character
## Mean :0.31407 Mean :0.229
## 3rd Qu.:0.43468 3rd Qu.:0.000
## Max. :1.00000 Max. :1.000
```
Diperlukan beberapa teknik preprocessing yang tepat. Missing values pada kolom Age dapat diisi dengan median atau imputasi berdasarkan kelompok Pclass dan Gender, sementara kolom Cabin, yang memiliki banyak data hilang, bisa dihapus atau diubah menjadi fitur biner untuk menunjukkan apakah seorang penumpang memiliki kabin atau tidak. Pada kolom Embarked, nilai yang hilang dapat diisi dengan modus, yaitu nilai yang paling sering muncul. Jika ditemukan data duplikat berdasarkan PassengerId, maka baris yang duplikat harus dihapus agar tidak mempengaruhi analisis. Selain itu, tipe data perlu disesuaikan, seperti mengubah Gender menjadi numerik (male = 0, female = 1) dan memastikan Fare berada dalam format numerik. Untuk menyeimbangkan distribusi kategori, kategori dengan frekuensi yang sangat kecil bisa dikelompokkan ulang atau dilakukan metode sampling agar distribusi lebih seimbang. Anomali dalam data, seperti nilai ekstrem pada Age dan Fare, dapat dideteksi dan ditangani menggunakan metode IQR (Interquartile Range) atau Z-score. Jika dataset akan digunakan dalam model machine learning, normalisasi atau standarisasi pada Age dan Fare juga bisa diterapkan agar skala data lebih seragam. Dengan menerapkan teknik preprocessing ini, dataset akan menjadi lebih bersih dan siap untuk analisis atau pemodelan lebih lanjut.
Preprocessing data memiliki dampak yang signifikan terhadap analisis data selanjutnya. Dengan menangani missing values, dataset menjadi lebih lengkap dan mengurangi bias dalam perhitungan statistik atau model prediktif. Menghapus duplikasi data memastikan bahwa setiap entri unik, sehingga tidak ada pengaruh ganda yang dapat menyebabkan hasil analisis menjadi tidak valid. Penyesuaian tipe data, seperti mengubah Gender menjadi numerik dan memastikan Fare berada dalam format yang benar, membuat dataset lebih mudah diolah dalam analisis statistik maupun machine learning. Selain itu, menyeimbangkan distribusi kategori dapat meningkatkan keakuratan model dengan mencegah ketimpangan dalam prediksi. Penanganan anomali pada Age dan Fare membantu mengurangi distorsi dalam hasil analisis, terutama dalam metode berbasis regresi atau clustering. Jika diterapkan dalam machine learning, normalisasi dan standarisasi memungkinkan algoritma bekerja lebih optimal dengan skala data yang seragam. Secara keseluruhan, preprocessing meningkatkan kualitas dataset, membuat analisis lebih akurat, dan memastikan hasil yang lebih dapat diandalkan.