Dataset Titanic berisi informasi mengenai penumpang kapal Titanic yang tenggelam pada tahun 1912. Variabel yang tersedia meliputi identitas penumpang, status keselamatan, kelas tiket, nama, jenis kelamin, umur, jumlah saudara/pasangan, jumlah orang tua/anak, nomor tiket, harga tiket, kabin, dan pelabuhan keberangkatan.
Analisis ini bertujuan untuk melakukan eksplorasi
data terhadap karakteristik penumpang Titanic, khususnya
variabel Age, Sex, dan Survived.
Analisis juga mencakup pemeriksaan kualitas data, visualisasi
distribusi, uji normalitas, pemeriksaan homogenitas varians, integrasi
data, transformasi data kategorik, serta transformasi data numerik.
library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(knitr)
data_titanic <- read_excel("data set titanic ensiklopedia sudah cleaning.xlsx")
dim(data_titanic)
## [1] 891 12
names(data_titanic)
## [1] "PassengerId" "Survived" "Pclass" "Name" "Sex"
## [6] "Age" "SibSp" "Parch" "Ticket" "Fare"
## [11] "Cabin" "Embarked"
head(data_titanic)
## # A tibble: 6 × 12
## PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin
## <dbl> <dbl> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
## 1 1 0 3 Braund… male 22 1 0 A/5 2… 7.25 <NA>
## 2 2 1 1 Cuming… fema… 38 1 0 PC 17… 71.3 C85
## 3 3 1 3 Heikki… fema… 26 0 0 STON/… 7.92 <NA>
## 4 4 1 1 Futrel… fema… 35 1 0 113803 53.1 C123
## 5 5 0 3 Allen,… male 35 0 0 373450 8.05 <NA>
## 6 6 0 3 Moran,… male 29 0 0 330877 8.46 <NA>
## # ℹ 1 more variable: Embarked <chr>
Dataset terdiri dari 891 baris dan 12 variabel. Variabel yang
tersedia adalah PassengerId, Survived,
Pclass, Name, Sex,
Age, SibSp, Parch,
Ticket, Fare, Cabin, dan
Embarked.
| Variabel | Keterangan | Jenis | Skala |
|---|---|---|---|
| PassengerId | ID penumpang | Kualitatif | Nominal |
| Survived | Status keselamatan | Kualitatif | Nominal |
| Pclass | Kelas tiket | Kualitatif | Ordinal |
| Name | Nama penumpang | Kualitatif | Nominal |
| Sex | Jenis kelamin | Kualitatif | Nominal |
| Age | Umur | Kuantitatif kontinu | Rasio |
| SibSp | Jumlah saudara/pasangan | Kuantitatif diskrit | Rasio |
| Parch | Jumlah orang tua/anak | Kuantitatif diskrit | Rasio |
| Ticket | Nomor tiket | Kualitatif | Nominal |
| Fare | Harga tiket | Kuantitatif kontinu | Rasio |
| Cabin | Kode kabin | Kualitatif | Nominal |
| Embarked | Pelabuhan keberangkatan | Kualitatif | Nominal |
Materi presentasi menjelaskan bahwa pada data sebelum cleaning
terdapat 177 missing value pada Age, 687 pada
Cabin, dan 2 pada Embarked. Nilai kosong pada
Age kemudian dilengkapi menggunakan sumber tambahan dan
median.
File Excel yang digunakan pada analisis ini sudah merupakan data hasil cleaning. Oleh karena itu, pemeriksaan pada file saat ini digunakan untuk memastikan kondisi data setelah cleaning.
missing_value <- colSums(is.na(data_titanic))
missing_value
## PassengerId Survived Pclass Name Sex Age
## 0 0 0 0 0 0
## SibSp Parch Ticket Fare Cabin Embarked
## 0 0 0 0 687 2
Pada file yang digunakan, Age tidak memiliki missing
value. Kolom Cabin masih memiliki nilai kosong dan
Embarked juga masih memiliki beberapa nilai kosong. Karena
analisis difokuskan pada PassengerId,
Survived, Sex, dan Age, kondisi
missing pada variabel fokus tidak menghambat analisis.
Analisis difokuskan pada empat variabel utama:
PassengerIdSurvivedSexAgeTujuan analisis adalah mengeksplorasi distribusi jenis kelamin dan umur, melihat karakteristik umur berdasarkan jenis kelamin, memeriksa normalitas dan homogenitas, mengintegrasikan data karakteristik dengan status keselamatan, serta melakukan transformasi data kategorik dan numerik.
data_variabel <- data_titanic %>%
select(PassengerId, Survived, Sex, Age)
head(data_variabel)
## # A tibble: 6 × 4
## PassengerId Survived Sex Age
## <dbl> <dbl> <chr> <dbl>
## 1 1 0 male 22
## 2 2 1 female 38
## 3 3 1 female 26
## 4 4 1 female 35
## 5 5 0 male 35
## 6 6 0 male 29
Setelah pemilihan variabel, data analisis terdiri dari 891 observasi
dengan empat variabel utama. Variabel Age digunakan sebagai
variabel numerik utama, sedangkan Sex digunakan sebagai
kelompok pembanding dan Survived sebagai informasi status
keselamatan.
statistik_age <- data_variabel %>%
summarise(
Jumlah = n(),
Mean = mean(Age),
Median = median(Age),
SD = sd(Age),
Minimum = min(Age),
Maksimum = max(Age)
)
kable(statistik_age, digits = 2)
| Jumlah | Mean | Median | SD | Minimum | Maksimum |
|---|---|---|---|---|---|
| 891 | 29.6 | 28 | 14.15 | 0.42 | 80 |
Berdasarkan hasil statistik deskriptif, terdapat 891 data umur. Rata-rata umur penumpang adalah sekitar 29,60 tahun dengan median 28 tahun. Standar deviasi sebesar 14,15 menunjukkan adanya variasi umur yang cukup besar. Umur penumpang berkisar antara 0,42 sampai 80 tahun.
Histogram digunakan untuk melihat bentuk distribusi umur secara visual.
ggplot(data_variabel, aes(x = Age)) +
geom_histogram(bins = 30) +
labs(
title = "Histogram Usia Penumpang Titanic",
x = "Age",
y = "Frekuensi"
) +
theme_minimal()
Distribusi umur menunjukkan konsentrasi data yang cukup besar pada usia muda hingga dewasa dan penyebaran ke arah usia yang lebih tinggi. Bentuk distribusi tidak sepenuhnya simetris.
ggplot(data_variabel, aes(x = Age)) +
geom_density() +
labs(
title = "Density Plot Usia Penumpang Titanic",
x = "Age",
y = "Density"
) +
theme_minimal()
Density plot menunjukkan pola distribusi umur secara lebih halus.
Distribusi Age tidak sepenuhnya simetris dan terdapat
penyimpangan dari bentuk normal.
ggplot(data_variabel, aes(sample = Age)) +
stat_qq() +
stat_qq_line() +
labs(
title = "Q-Q Plot Usia Penumpang Titanic",
x = "Theoretical Quantiles",
y = "Sample Quantiles"
) +
theme_minimal()
Pada Q-Q plot, data yang berdistribusi normal cenderung mengikuti
garis acuan. Pada variabel Age, titik-titik tidak
seluruhnya mengikuti garis, terutama pada bagian ujung distribusi. Hal
ini menunjukkan adanya penyimpangan dari distribusi normal.
Hipotesis yang digunakan:
Age
berdistribusi normal.Age
tidak berdistribusi normal.shapiro_result <- shapiro.test(data_variabel$Age)
shapiro_result
##
## Shapiro-Wilk normality test
##
## data: data_variabel$Age
## W = 0.97916, p-value = 5.666e-10
Hasil uji Shapiro-Wilk memberikan statistik uji sekitar 0,97916
dengan p-value sekitar \(5,666 \times
10^{-10}\). Karena p-value < 0,05, maka \(H_0\) ditolak. Dengan demikian, variabel
Age pada 891 data tidak berdistribusi normal.
Hasil ini tidak berarti bahwa data buruk. Dalam analisis eksploratif, distribusi yang tidak normal tetap dapat memberikan informasi mengenai karakteristik data. Normalitas perlu dipertimbangkan sesuai tujuan analisis dan metode statistik yang digunakan.
Selanjutnya, karakteristik umur dibandingkan berdasarkan kelompok jenis kelamin.
karakteristik_sex <- data_variabel %>%
group_by(Sex) %>%
summarise(
Jumlah = n(),
Mean_Age = mean(Age),
Median_Age = median(Age),
Varians = var(Age)
)
kable(karakteristik_sex, digits = 2)
| Sex | Jumlah | Mean_Age | Median_Age | Varians |
|---|---|---|---|---|
| female | 314 | 27.94 | 27 | 195.64 |
| male | 577 | 30.51 | 28 | 200.88 |
Penumpang laki-laki berjumlah 577 orang, sedangkan penumpang perempuan berjumlah 314 orang. Rata-rata umur laki-laki sekitar 30,51 tahun dan rata-rata umur perempuan sekitar 27,94 tahun. Dengan demikian, kelompok laki-laki cenderung memiliki rata-rata umur yang lebih tinggi. Varians kedua kelompok relatif berdekatan.
ggplot(data_variabel, aes(x = Sex, y = Age)) +
geom_boxplot() +
labs(
title = "Boxplot Usia Berdasarkan Jenis Kelamin",
x = "Jenis Kelamin",
y = "Age"
) +
theme_minimal()
Boxplot menunjukkan bahwa penyebaran umur antara kelompok laki-laki dan perempuan relatif mirip. Hal ini menjadi dasar untuk pemeriksaan homogenitas varians.
Hipotesis:
levene_result <- leveneTest(Age ~ Sex, data = data_variabel)
levene_result
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 0.2307 0.6311
## 889
Hasil uji Levene memberikan \(F = 0,2307\) dan p-value = 0,6311. Karena p-value > 0,05, maka \(H_0\) tidak ditolak. Artinya, tidak terdapat bukti yang cukup bahwa varians umur laki-laki dan perempuan berbeda secara statistik, sehingga varians dapat dianggap homogen.
Data karakteristik dan data keselamatan diintegrasikan menggunakan
PassengerId sebagai key. Pada data yang digunakan,
informasi Sex dan Age digabungkan dengan
Survived.
data_karakteristik <- data_titanic %>%
select(PassengerId, Sex, Age)
data_keselamatan <- data_titanic %>%
select(PassengerId, Survived)
data_integrasi <- left_join(
data_karakteristik,
data_keselamatan,
by = "PassengerId"
)
head(data_integrasi)
## # A tibble: 6 × 4
## PassengerId Sex Age Survived
## <dbl> <chr> <dbl> <dbl>
## 1 1 male 22 0
## 2 2 female 38 1
## 3 3 female 26 1
## 4 4 female 35 1
## 5 5 male 35 0
## 6 6 male 29 0
dim(data_integrasi)
## [1] 891 4
left_join() menggunakan PassengerId sebagai
kunci penggabungan. Hasilnya merupakan satu dataset yang memuat
karakteristik penumpang dan status keselamatan setiap penumpang.
Variabel Sex pada awalnya berbentuk kategori teks, yaitu
male dan female. Untuk mengubah kategori
menjadi bentuk numerik, digunakan one-hot encoding.
data_encoding <- data_integrasi %>%
mutate(
Sex_male = ifelse(Sex == "male", 1, 0),
Sex_female = ifelse(Sex == "female", 1, 0)
)
head(data_encoding)
## # A tibble: 6 × 6
## PassengerId Sex Age Survived Sex_male Sex_female
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 1 male 22 0 1 0
## 2 2 female 38 1 0 1
## 3 3 female 26 1 0 1
## 4 4 female 35 1 0 1
## 5 5 male 35 0 1 0
## 6 6 male 29 0 1 0
Hasil encoding menghasilkan kolom indikator 0/1. Nilai 1 menunjukkan bahwa penumpang termasuk kategori tersebut, sedangkan nilai 0 menunjukkan bukan kategori tersebut. Transformasi ini membuat variabel kategorik lebih mudah digunakan dalam proses analisis atau pemodelan.
summary(data_variabel$Age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.42 20.00 28.00 29.60 38.00 80.00
sd(data_variabel$Age)
## [1] 14.15357
Usia penumpang berkisar antara 0,42 hingga 80 tahun dengan rata-rata
sekitar 29,60 tahun dan standar deviasi sekitar 14,15. Rentang yang
cukup luas menunjukkan bahwa Age dapat digunakan untuk
melihat pengaruh beberapa bentuk transformasi numerik.
Rumus normalisasi Min-Max:
\[ X' = \frac{X - X_{\min}}{X_{\max} - X_{\min}} \]
data_transformasi <- data_variabel %>%
mutate(
Age_minmax = (Age - min(Age)) / (max(Age) - min(Age))
)
summary(data_transformasi$Age_minmax)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.2460 0.3466 0.3667 0.4722 1.0000
Hasil normalisasi mengubah Age ke rentang 0 sampai 1.
Nilai minimum menjadi 0 dan nilai maksimum menjadi 1, sedangkan urutan
relatif nilai umur tetap dipertahankan.
Rumus Z-Score:
\[ Z = \frac{X - \bar{X}}{s} \]
data_transformasi <- data_transformasi %>%
mutate(
Age_zscore = (Age - mean(Age)) / sd(Age)
)
summary(data_transformasi$Age_zscore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2.0618 -0.6784 -0.1132 0.0000 0.5934 3.5608
Hasil Z-Score memiliki mean yang mendekati 0 dan standar deviasi mendekati 1. Nilai Z positif menunjukkan umur berada di atas rata-rata, sedangkan nilai Z negatif menunjukkan umur berada di bawah rata-rata. Z-Score merupakan ukuran posisi relatif, bukan skala umur baru.
Transformasi invers dapat menghasilkan nilai yang sangat besar jika
nilai awal mendekati nol. Oleh karena itu, perlu dipastikan bahwa tidak
terdapat nilai Age sama dengan nol.
min(data_variabel$Age)
## [1] 0.42
sum(data_variabel$Age == 0)
## [1] 0
Nilai minimum Age adalah 0,42 dan tidak terdapat nilai
Age = 0. Dengan demikian, transformasi invers dapat
dilakukan. Meskipun demikian, nilai yang sangat dekat dengan nol tetap
dapat menghasilkan nilai transformasi yang besar.
Transformasi yang digunakan:
\[ X' = \frac{1}{X^2} \]
data_transformasi <- data_transformasi %>%
mutate(
Age_inverse_square = 1 / Age^2
)
summary(data_transformasi$Age_inverse_square)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0001562 0.0006925 0.0012755 0.0321395 0.0025000 5.6689342
sd(data_transformasi$Age_inverse_square)
## [1] 0.2507269
Hasil transformasi memiliki nilai minimum sekitar 0,000156, maksimum sekitar 5,67, rata-rata sekitar 0,0321, dan standar deviasi sekitar 0,251. Semakin besar umur, semakin kecil nilai transformasinya. Sebaliknya, umur yang mendekati nol menghasilkan nilai yang lebih besar sehingga transformasi ini lebih sensitif terhadap usia rendah.
Transformasi yang digunakan:
\[ X' = \frac{1}{X^3} \]
data_transformasi <- data_transformasi %>%
mutate(
Age_inverse_cubic = 1 / Age^3
)
summary(data_transformasi$Age_inverse_cubic)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000e-06 1.820e-05 4.560e-05 3.964e-02 1.250e-04 1.350e+01
sd(data_transformasi$Age_inverse_cubic)
## [1] 0.4949466
Inverse Cubic menghasilkan perubahan yang lebih tajam dibandingkan Inverse Square. Semakin besar umur, nilai transformasi semakin kecil, sedangkan usia yang rendah menghasilkan nilai yang jauh lebih besar karena menggunakan pangkat tiga.
ggplot(data_transformasi, aes(x = Age)) +
geom_histogram(bins = 30) +
labs(
title = "Distribusi Age Sebelum Transformasi",
x = "Age",
y = "Frekuensi"
) +
theme_minimal()
Visualisasi sebelum transformasi digunakan sebagai dasar untuk membandingkan perubahan skala dan penyebaran data setelah transformasi.
tabel_transformasi <- data.frame(
Variabel = c(
"Age",
"Age Min-Max",
"Age Z-Score",
"Age Inverse Square",
"Age Inverse Cubic"
),
Minimum = c(
min(data_transformasi$Age),
min(data_transformasi$Age_minmax),
min(data_transformasi$Age_zscore),
min(data_transformasi$Age_inverse_square),
min(data_transformasi$Age_inverse_cubic)
),
Mean = c(
mean(data_transformasi$Age),
mean(data_transformasi$Age_minmax),
mean(data_transformasi$Age_zscore),
mean(data_transformasi$Age_inverse_square),
mean(data_transformasi$Age_inverse_cubic)
),
SD = c(
sd(data_transformasi$Age),
sd(data_transformasi$Age_minmax),
sd(data_transformasi$Age_zscore),
sd(data_transformasi$Age_inverse_square),
sd(data_transformasi$Age_inverse_cubic)
),
Maksimum = c(
max(data_transformasi$Age),
max(data_transformasi$Age_minmax),
max(data_transformasi$Age_zscore),
max(data_transformasi$Age_inverse_square),
max(data_transformasi$Age_inverse_cubic)
)
)
kable(tabel_transformasi, digits = 4)
| Variabel | Minimum | Mean | SD | Maksimum |
|---|---|---|---|---|
| Age | 0.4200 | 29.6018 | 14.1536 | 80.0000 |
| Age Min-Max | 0.0000 | 0.3667 | 0.1779 | 1.0000 |
| Age Z-Score | -2.0618 | 0.0000 | 1.0000 | 3.5608 |
| Age Inverse Square | 0.0002 | 0.0321 | 0.2507 | 5.6689 |
| Age Inverse Cubic | 0.0000 | 0.0396 | 0.4949 | 13.4975 |
Perbandingan menunjukkan bahwa setiap transformasi mengubah skala dan
karakteristik penyebaran Age dengan cara yang berbeda.
Min-Max membatasi nilai pada 0–1, Z-Score memusatkan data di sekitar
rata-rata 0, sedangkan transformasi invers menghasilkan hubungan
non-linear dan lebih sensitif terhadap nilai umur yang rendah.
Berdasarkan analisis eksploratif, dataset Titanic yang digunakan
terdiri dari 891 observasi dengan 12 variabel. Analisis difokuskan pada
PassengerId, Survived, Sex, dan
Age.
Variabel Age memiliki rata-rata 29,60 tahun, median 28
tahun, standar deviasi 14,15 tahun, serta rentang usia 0,42–80 tahun.
Histogram, density plot, dan Q-Q plot menunjukkan bahwa distribusi umur
tidak sepenuhnya normal. Hasil Shapiro-Wilk juga menunjukkan p-value
< 0,05 sehingga data Age tidak berdistribusi normal.
Berdasarkan jenis kelamin, terdapat 314 penumpang perempuan dan 577 penumpang laki-laki. Rata-rata umur laki-laki sekitar 30,51 tahun, sedangkan perempuan sekitar 27,94 tahun. Uji Levene menghasilkan p-value 0,6311 > 0,05 sehingga varians umur berdasarkan jenis kelamin dapat dianggap homogen.
Data karakteristik dan status keselamatan berhasil diintegrasikan
menggunakan PassengerId. Variabel Sex kemudian
diubah melalui one-hot encoding menjadi indikator numerik 0/1.
Pada transformasi numerik, Min-Max mengubah Age ke
rentang 0–1, sedangkan Z-Score menghasilkan mean mendekati 0 dan standar
deviasi mendekati 1. Transformasi Inverse Square dan Inverse Cubic
menghasilkan hubungan non-linear dan lebih sensitif terhadap usia yang
mendekati nol. Tidak terdapat Age = 0, sehingga
transformasi invers dapat dilakukan.
Secara keseluruhan, pemilihan transformasi perlu disesuaikan dengan tujuan analisis dan karakteristik data. Transformasi tidak secara otomatis membuat data menjadi normal, tetapi dapat digunakan untuk mengubah skala dan bentuk penyebaran data.