1. Apa saja permasalahan dalam dataset tersebut?

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

2. Teknik preprocessing apa yang paling sesuai untuk menangani permasalahan tersebut?

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

3. Bagaimana dampak preprocessing terhadap analisis data selanjutnya?

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.