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