R Markdown

BAB I: PENDAHULUAN

1.1 Latar Belakang

Tragedi maritim RMS Titanic pada tahun 1912 merupakan salah satu dataset historis yang sering digunakan untuk pembelajaran Sains Data dan Analisis Data Eksploratif (EDA). Sebelum melakukan pemodelan inferensial atau machine learning, tahapan pra-pemrosesan data, pembersihan, pengujian asumsi statistik, serta transformasi fitur sangat krusial untuk memastikan kualitas analisis.

1.2 Tujuan Analisis

  1. Identifikasi struktur data dan penanganan data hilang (missing values).
  2. Analisis deskriptif dan visualisasi distribusi variabel usia (Age).
  3. Pengujian asumsi parametrik berupa Uji Normalitas (Shapiro-Wilk) dan Uji Homogenitas Varians (Levene’s Test).
  4. Menerapkan integrasi data dan rekayasa fitur (One-Hot Encoding & Binary Encoding).

BAB II: ANALISIS DATA DAN PEMBAHASAN

Berikut adalah keseluruhan proses analisis data yang dijalankan dalam satu alur eksekusi:

# ==============================================================================
# 1. INSTALL DAN LOAD LIBRARY
# ==============================================================================
required_packages <- c("tidyverse", "car", "knitr")
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

library(tidyverse)
library(car)
library(knitr)

# ==============================================================================
# 2. PENYIAPAN & SIMULASI DATASET TITANIC
# ==============================================================================
set.seed(123)
n <- 891

titanic_raw <- tibble(
  PassengerId = 1:n,
  Survived = sample(c(0, 1), n, replace = TRUE, prob = c(0.61, 0.39)),
  Pclass = sample(c(1, 2, 3), n, replace = TRUE, prob = c(0.24, 0.21, 0.55)),
  Name = paste("Passenger", 1:n),
  Sex = sample(c("male", "female"), n, replace = TRUE, prob = c(0.65, 0.35)),
  Age = c(rgamma(714, shape = 4, scale = 7), rep(NA, 177)),
  SibSp = sample(0:5, n, replace = TRUE, prob = c(0.68, 0.23, 0.04, 0.02, 0.02, 0.01)),
  Parch = sample(0:5, n, replace = TRUE, prob = c(0.76, 0.13, 0.09, 0.01, 0.005, 0.005)),
  Ticket = paste0("TICK_", sample(100:999, n, replace = TRUE)),
  Fare = c(rgamma(888, shape = 2, scale = 15), rep(512.3292, 3)),
  Cabin = sample(c("C123", "E46", "G6", NA), n, replace = TRUE, prob = c(0.1, 0.1, 0.04, 0.76)),
  Embarked = sample(c("S", "C", "Q", NA), n, replace = TRUE, prob = c(0.72, 0.18, 0.09, 0.01))
)

# Struktur Awal Dataset
glimpse(titanic_raw)
## Rows: 891
## Columns: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
## $ Survived    <dbl> 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1…
## $ Pclass      <dbl> 1, 1, 3, 2, 1, 3, 3, 3, 2, 2, 3, 2, 1, 1, 3, 1, 2, 2, 3, 3…
## $ Name        <chr> "Passenger 1", "Passenger 2", "Passenger 3", "Passenger 4"…
## $ Sex         <chr> "female", "male", "male", "male", "female", "male", "femal…
## $ Age         <dbl> 31.33544, 21.72096, 47.64552, 33.15069, 49.12994, 63.43629…
## $ SibSp       <int> 0, 1, 0, 4, 0, 1, 0, 2, 1, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 4…
## $ Parch       <int> 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 0, 0, 2, 0, 1…
## $ Ticket      <chr> "TICK_370", "TICK_241", "TICK_563", "TICK_607", "TICK_541"…
## $ Fare        <dbl> 23.329218, 36.292773, 42.232290, 58.012474, 28.954200, 20.…
## $ Cabin       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "E46", "C1…
## $ Embarked    <chr> "S", "C", "Q", "S", "C", "S", "C", "S", "S", "Q", "C", "S"…
# ==============================================================================
# 3. IDENTIFIKASI MISSING VALUES
# ==============================================================================
missing_summary <- colSums(is.na(titanic_raw))
kable(as.data.frame(missing_summary), col.names = c("Jumlah Missing Value"), caption = "Ringkasan Missing Values Awal")
Ringkasan Missing Values Awal
Jumlah Missing Value
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 676
Embarked 7
# ==============================================================================
# 4. DATA CLEANING & IMPUTASI MEDIAN
# ==============================================================================
titanic_selected <- titanic_raw %>%
  select(PassengerId, Sex, Age, Survived)

median_age <- median(titanic_selected$Age, na.rm = TRUE)

titanic_clean <- titanic_selected %>%
  mutate(Age = if_else(is.na(Age), median_age, Age))

missing_clean <- colSums(is.na(titanic_clean))
kable(as.data.frame(missing_clean), col.names = c("Sisa Missing Value"), caption = "Validasi Setelah Imputasi")
Validasi Setelah Imputasi
Sisa Missing Value
PassengerId 0
Sex 0
Age 0
Survived 0
# ==============================================================================
# 5. STATISTIK DESKRIPTIF VARIABEL AGE
# ==============================================================================
stat_deskriptif <- titanic_clean %>%
  summarise(
    Jumlah_Data = n(),
    Mean = mean(Age),
    Median = median(Age),
    Std_Deviasi = sd(Age),
    Minimum = min(Age),
    Maksimum = max(Age)
  )

kable(stat_deskriptif, digits = 2, caption = "Statistik Deskriptif Usia")
Statistik Deskriptif Usia
Jumlah_Data Mean Median Std_Deviasi Minimum Maksimum
891 27.46 25.88 12.41 3.38 100.9
# ==============================================================================
# 6. VISUALISASI EKSPLORASI DATA
# ==============================================================================
# A. Histogram & Density Plot
ggplot(titanic_clean, aes(x = Age)) +
  geom_histogram(aes(y = ..density..), binwidth = 5, fill = "#4E79A7", color = "white", alpha = 0.7) +
  geom_density(color = "#E15759", linewidth = 1) +
  labs(title = "Distribusi Usia Penumpang Titanic", x = "Usia (Tahun)", y = "Density") +
  theme_minimal()

# B. Q-Q Plot
qqnorm(titanic_clean$Age, main = "Q-Q Plot Usia Penumpang", col = "#4E79A7")
qqline(titanic_clean$Age, col = "#E15759", lwd = 2)

# C. Boxplot Usia berdasarkan Jenis Kelamin
ggplot(titanic_clean, aes(x = Sex, y = Age, fill = Sex)) +
  geom_boxplot(alpha = 0.7, outlier.color = "red") +
  scale_fill_manual(values = c("female" = "#FF9DA7", "male" = "#4E79A7")) +
  labs(title = "Boxplot Usia Berdasarkan Jenis Kelamin", x = "Jenis Kelamin", y = "Usia (Tahun)") +
  theme_minimal()

# ==============================================================================
# 7. UJI ASUMSI STATISTIK (NORMALITAS & HOMOGENITAS)
# ==============================================================================
# Uji Normalitas Shapiro-Wilk
shapiro.test(titanic_clean$Age)
## 
##  Shapiro-Wilk normality test
## 
## data:  titanic_clean$Age
## W = 0.91823, p-value < 2.2e-16
# Ringkasan Usia per Jenis Kelamin
stat_sex <- titanic_clean %>%
  group_by(Sex) %>%
  summarise(
    Jumlah = n(),
    Mean_Age = mean(Age),
    Median_Age = median(Age),
    Varians = var(Age)
  )

kable(stat_sex, digits = 2, caption = "Ringkasan Usia Berdasarkan Jenis Kelamin")
Ringkasan Usia Berdasarkan Jenis Kelamin
Sex Jumlah Mean_Age Median_Age Varians
female 304 26.82 25.88 160.15
male 587 27.79 25.88 150.65
# Uji Homogenitas Varians (Levene's Test)
leveneTest(Age ~ factor(Sex), data = titanic_clean)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   1  0.0074 0.9315
##       889
# ==============================================================================
# 8. INTEGRASI DATA & CATEGORICAL ENCODING
# ==============================================================================
titanic_integrated <- titanic_clean %>%
  select(PassengerId, Sex, Age) %>%
  left_join(titanic_clean %>% select(PassengerId, Survived), by = "PassengerId")

titanic_final <- titanic_integrated %>%
  mutate(
    Sex_binary = if_else(Sex == "male", 1, 0),
    Sex_male = if_else(Sex == "male", 1, 0),
    Sex_female = if_else(Sex == "female", 1, 0)
  )

kable(head(titanic_final, 10), caption = "Dataset Final Setelah Transformasi Encoding")
Dataset Final Setelah Transformasi Encoding
PassengerId Sex Age Survived Sex_binary Sex_male Sex_female
1 female 31.33544 0 0 0 1
2 male 21.72096 1 1 1 0
3 male 47.64552 0 1 1 0
4 male 33.15069 1 1 1 0
5 female 49.12994 1 0 0 1
6 male 63.43629 0 1 1 0
7 female 18.71087 0 0 0 1
8 female 30.13362 1 0 0 1
9 male 14.50163 0 1 1 0
10 male 61.49842 0 1 1 0