Struktur data

Struktur data bertujuan untuk memahami bagaimana karakteristik awal dataset sebelum dilakukan analisis lebih lanjut. Pemahaman struktur data sangat penting agar proses pembersihan data dan analisis statistik dapat dilakukan secara tepat.

df <- read.csv("Titanic-Dataset.csv")
head(df)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked
## 1        A/5 21171  7.2500              S
## 2         PC 17599 71.2833   C85        C
## 3 STON/O2. 3101282  7.9250              S
## 4           113803 53.1000  C123        S
## 5           373450  8.0500              S
## 6           330877  8.4583              Q

Pada kode ini digunakan untuk membaca dataset Titanic-Dataset.csv dan menyimpannya dalam objek df. Fungsi head(df) menampilkan 6 baris pertama data untuk memberikan gambaran awal mengenai struktur data, tipe variabel, serta nilai yang terdapat di dalam dataset.

str(df)
## 'data.frame':    891 obs. of  12 variables:
##  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
##  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
##  $ Name       : chr  "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
##  $ Sex        : chr  "male" "female" "female" "female" ...
##  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ SibSp      : int  1 1 0 1 0 0 0 3 0 1 ...
##  $ Parch      : int  0 0 0 0 0 0 0 1 2 0 ...
##  $ Ticket     : chr  "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
##  $ Fare       : num  7.25 71.28 7.92 53.1 8.05 ...
##  $ Cabin      : chr  "" "C85" "" "C123" ...
##  $ Embarked   : chr  "S" "C" "S" "S" ...

Fungsi str() digunakan untuk melihat struktur internal dataset, seperti jumlah baris, kolom, variabel dan tipe variabel.

dim(df)
## [1] 891  12

Fungsi dim() menampilkan dimensi dataset dalam format: jumlah baris dan jumlah kolom

colSums(is.na(df))
## PassengerId    Survived      Pclass        Name         Sex         Age 
##           0           0           0           0           0         177 
##       SibSp       Parch      Ticket        Fare       Cabin    Embarked 
##           0           0           0           0           0           0

Kode ini digunakan untuk menghitung jumlah missing value (NA) pada setiap kolom.

data_selected <- df[, c("Age", "SibSp", "Parch", "Fare")]
str(data_selected)
## 'data.frame':    891 obs. of  4 variables:
##  $ Age  : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ SibSp: int  1 1 0 1 0 0 0 3 0 1 ...
##  $ Parch: int  0 0 0 0 0 0 0 1 2 0 ...
##  $ Fare : num  7.25 71.28 7.92 53.1 8.05 ...

cleaning data

Cleaning data adalah proses pembersihan dan penyiapan data sebelum dilakukan analisis statistik atau pemodelan.

data_clean <- na.omit(data_selected)
data_clean <- data.frame(lapply(data_clean, as.numeric))
dim(data_clean)
## [1] 714   4
head(df)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked
## 1        A/5 21171  7.2500              S
## 2         PC 17599 71.2833   C85        C
## 3 STON/O2. 3101282  7.9250              S
## 4           113803 53.1000  C123        S
## 5           373450  8.0500              S
## 6           330877  8.4583              Q

Proses cleaning data dilakukan dengan menghapus seluruh observasi yang memiliki nilai kosong (missing value) menggunakan fungsi na.omit(), sehingga hanya data lengkap yang dipertahankan untuk analisis. Selanjutnya, seluruh variabel dikonversi ke dalam tipe numerik menggunakan lapply(as.numeric) untuk memastikan kompatibilitas dengan metode analisis statistik seperti korelasi, variance–covariance, dan analisis eigen. Dengan demikian, dataset yang digunakan telah bersih, konsisten, dan siap untuk dianalisis lebih lanjut tanpa risiko kesalahan akibat missing value maupun ketidaksesuaian tipe data.

Data Visualization

Visualisasi data dilakukan menggunakan histogram untuk memahami pola distribusi dan sebaran nilai dari masing-masing variabel numerik yang digunakan dalam analisis, yaitu Age, SibSp, Parch, dan Fare.

par(mfrow = c(2, 2))

hist(
  data_clean$Age,
  main = "Distribusi Age",
  xlab = "Age",
  col = "#00B4D8",
  border = "white"
)

hist(
  data_clean$SibSp,
  main = "Distribusi SibSp",
  xlab = "SibSp",
  col = "#52B788",
  border = "white"
)

hist(
  data_clean$Parch,
  main = "Distribusi Parch",
  xlab = "Parch",
  col = "#F77F00",
  border = "white"
)

hist(
  data_clean$Fare,
  main = "Distribusi Fare",
  xlab = "Fare",
  col = "#E63946",
  border = "white"
)

par(mfrow = c(1, 1))

Histogram Age menunjukkan bahwa sebagian besar penumpang berada pada rentang usia sekitar 20–40 tahun, dengan frekuensi tertinggi pada usia dewasa muda. Distribusi usia tampak condong ke kanan (right-skewed), di mana jumlah penumpang berusia lanjut relatif lebih sedikit dibandingkan kelompok usia produktif. Hal ini mengindikasikan bahwa penumpang Titanic didominasi oleh individu usia dewasa.

Distribusi SibSp memperlihatkan bahwa mayoritas penumpang memiliki nilai 0 atau 1, yang berarti sebagian besar penumpang bepergian tanpa atau hanya dengan satu saudara/pasangan. Nilai SibSp yang lebih besar (≥2) muncul dengan frekuensi yang sangat kecil, sehingga distribusi variabel ini sangat tidak simetris dan condong ke kanan.

Histogram Parch menunjukkan pola yang serupa dengan SibSp. Sebagian besar penumpang memiliki nilai 0, yang berarti tidak membawa orang tua atau anak. Nilai Parch di atas 1 sangat jarang ditemukan, sehingga distribusi variabel ini juga bersifat right-skewed dan didominasi oleh nilai rendah.

Sementara itu, distribusi Fare terlihat sangat tidak merata dengan kemencengan ke kanan yang kuat. Mayoritas penumpang membayar tiket dengan harga rendah, sedangkan hanya sedikit penumpang yang membayar tiket dengan harga sangat tinggi hingga ratusan. Pola ini mencerminkan perbedaan kelas kabin dan fasilitas yang signifikan di antara penumpang Titanic.

correlation matrix

Correlation matrix digunakan untuk mengetahui hubungan linier antara variabel numerik yang digunakan dalam analisis. Pada data ini, variabel yang dianalisis adalah Age, SibSp, Parch, dan Fare. Data yang digunakan merupakan data yang telah melalui tahap cleaning, yaitu penghapusan missing value dan memastikan seluruh variabel bertipe numerik, sehingga hasil korelasi lebih akurat dan valid.

cor_matrix <- cor(data_clean)
cor_matrix
##               Age      SibSp      Parch       Fare
## Age    1.00000000 -0.3082468 -0.1891193 0.09606669
## SibSp -0.30824676  1.0000000  0.3838199 0.13832879
## Parch -0.18911926  0.3838199  1.0000000 0.20511888
## Fare   0.09606669  0.1383288  0.2051189 1.00000000

Variabel Age dan SibSp memiliki korelasi negatif sebesar −0,308. Hal ini menunjukkan bahwa penumpang dengan usia yang lebih tua cenderung bepergian dengan jumlah saudara atau pasangan yang lebih sedikit. Hubungan ini tergolong lemah hingga sedang dan masih masuk akal secara logis.

Variabel SibSp dan Parch memiliki korelasi positif sebesar 0,384, yang merupakan korelasi tertinggi di antara pasangan variabel lainnya. Temuan ini menunjukkan bahwa penumpang yang membawa saudara atau pasangan cenderung juga membawa orang tua atau anak, sehingga kedua variabel ini merepresentasikan struktur keluarga penumpang.

Korelasi antara Fare dan Age serta antara Fare dengan SibSp dan Parch menunjukkan nilai yang relatif kecil (mendekati nol). Hal ini menunjukkan bahwa harga tiket tidak memiliki hubungan linier yang kuat dengan usia maupun jumlah anggota keluarga, dan kemungkinan lebih dipengaruhi oleh faktor lain.

library(corrplot)
## corrplot 0.95 loaded
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  number.cex = 0.9,
  tl.col = "black",
  tl.srt = 45
)

## Variance-Covariance Matrix Variance–Covariance matrix digunakan untuk mengukur tingkat variasi masing-masing variabel (variance) serta arah hubungan antar variabel (covariance) dalam satuan aslinya. Berbeda dengan correlation matrix, nilai covariance dipengaruhi oleh skala data, sehingga lebih sesuai digunakan untuk analisis lanjutan seperti Principal Component Analysis (PCA).

cov_matrix <- cov(data_clean)
round(cov_matrix, 2)
##          Age SibSp Parch    Fare
## Age   211.02 -4.16 -2.34   73.85
## SibSp  -4.16  0.86  0.30    6.81
## Parch  -2.34  0.30  0.73    9.26
## Fare   73.85  6.81  9.26 2800.41

Variance–Covariance matrix menunjukkan besarnya variasi masing-masing variabel serta arah hubungan antar variabel dalam satuan asli data. Berdasarkan hasil perhitungan, variabel Fare memiliki nilai variance terbesar dibandingkan variabel lainnya, yang mengindikasikan bahwa harga tiket memiliki tingkat variasi yang sangat tinggi antar penumpang. Hal ini sejalan dengan hasil visualisasi histogram yang menunjukkan sebaran Fare yang sangat lebar.

Sebaliknya, variabel SibSp dan Parch memiliki nilai variance yang relatif kecil, menunjukkan bahwa jumlah saudara/pasangan serta orang tua atau anak yang dibawa penumpang cenderung tidak banyak bervariasi dan didominasi oleh nilai rendah.

Nilai covariance antara SibSp dan Parch bernilai positif, yang menunjukkan bahwa peningkatan jumlah saudara atau pasangan cenderung diikuti oleh peningkatan jumlah orang tua atau anak. Sementara itu, covariance antara Age dan SibSp bernilai negatif, yang menunjukkan hubungan berlawanan arah antara usia penumpang dan jumlah saudara atau pasangan yang dibawa.

cov_matrix <- cov(data_clean)

library(corrplot)

corrplot(
  cov_matrix,
  method = "color",
  type = "upper",
  is.corr = FALSE,
  tl.col = "black",
  tl.srt = 45,
  addCoef.col = "black",
  number.cex = 0.8
)

Eigen Value & Eigen Vector

Eigen value dan eigen vector diperoleh dari variance–covariance matrix dan digunakan untuk mengetahui besarnya variasi data yang dijelaskan oleh masing-masing komponen utama. Analisis ini merupakan dasar dari Principal Component Analysis (PCA) dan membantu menentukan jumlah komponen yang perlu dipertahankan.

eigen_result <- eigen(cov_matrix)
eigen_result$values
## [1] 2802.5636587  209.0385659    0.9438783    0.4787214
eigen_table <- data.frame(
  Komponen = paste0("PC", 1:length(eigen_result$values)),
  Eigen_Value = eigen_result$values,
  Proporsi_Variansi = eigen_result$values / sum(eigen_result$values),
  Kumulatif = cumsum(eigen_result$values / sum(eigen_result$values))
)
eigen_table[, -1] <- round(eigen_table[, -1], 4)

knitr::kable(
  eigen_table,
  caption = "Tabel Eigen Value dan Proporsi Variansi"
)
Tabel Eigen Value dan Proporsi Variansi
Komponen Eigen_Value Proporsi_Variansi Kumulatif
PC1 2802.5637 0.9301 0.9301
PC2 209.0386 0.0694 0.9995
PC3 0.9439 0.0003 0.9998
PC4 0.4787 0.0002 1.0000

PC1 menjelaskan proporsi variansi terbesar dari total variasi data, yaitu lebih dari setengah total variasi.

PC2 menambah proporsi variansi kumulatif secara signifikan, sehingga PC1 dan PC2 secara bersama-sama telah mampu menjelaskan sebagian besar informasi yang terkandung dalam data.

PC3 dan PC4 hanya menambah proporsi variansi dalam jumlah kecil, sehingga kontribusinya terhadap keseluruhan variasi data relatif rendah.

plot(
  eigen_result$values,
  type = "b",
  pch = 19,
  xlab = "Komponen Utama",
  ylab = "Eigen Value",
  main = "Scree Plot Eigen Value"
)
# Garis Kaiser Criterion (eigen value > 1)
abline(h = 1, lty = 2)

Scree plot menunjukkan penurunan nilai eigen yang cukup tajam dari PC1 ke PC2, kemudian penurunan yang lebih landai pada PC berikutnya. Pola ini mengindikasikan adanya “elbow point” pada komponen utama kedua, yang menandakan bahwa kontribusi variasi setelah PC2 relatif kecil.

Garis putus-putus horizontal pada nilai eigen = 1 menunjukkan batas Kaiser Criterion. Komponen yang berada di atas garis tersebut dianggap signifikan, sedangkan komponen di bawahnya memberikan kontribusi variasi yang minimal. Berdasarkan grafik ini, hanya komponen awal yang perlu dipertahankan untuk analisis lanjutan.

eigen_vector_table <- eigen_result$vectors
rownames(eigen_vector_table) <- colnames(data_clean)
colnames(eigen_vector_table) <- paste0("PC", 1:ncol(eigen_vector_table))
knitr::kable(
  eigen_vector_table,
  caption = "Tabel Eigen Vector (Kontribusi Variabel terhadap Komponen Utama)"
)
Tabel Eigen Vector (Kontribusi Variabel terhadap Komponen Utama)
PC1 PC2 PC3 PC4
Age 0.0284776 0.9992994 -0.0240181 0.0035789
SibSp 0.0023863 -0.0209314 -0.7736933 0.6332099
Parch 0.0032808 -0.0125379 -0.6330881 -0.7739713
Fare 0.9995862 -0.0283783 0.0046092 0.0009267

Pada PC1, variabel dengan nilai absolut eigen vector terbesar menunjukkan kontribusi paling dominan dalam membentuk komponen tersebut. Hal ini mengindikasikan bahwa PC1 terutama merepresentasikan variasi yang berasal dari variabel-variabel tertentu dengan pengaruh terbesar.

Pada PC2, pola kontribusi variabel berbeda dibandingkan PC1, yang menunjukkan bahwa PC2 menangkap dimensi variasi data yang berbeda. Variabel dengan nilai eigen vector tinggi pada PC2 berperan penting dalam membedakan karakteristik data yang tidak tertangkap oleh PC1.

Sementara itu, PC3 dan PC4 menunjukkan nilai kontribusi yang lebih kecil dan tersebar, yang menandakan bahwa komponen-komponen ini hanya menangkap variasi minor dalam data.

library(corrplot)

eigen_vectors <- eigen_result$vectors
rownames(eigen_vectors) <- colnames(data_clean)
colnames(eigen_vectors) <- paste0("PC", 1:ncol(eigen_vectors))

corrplot(
  eigen_vectors,
  is.corr = FALSE,
  method = "color",
  tl.col = "black",
  tl.srt = 45,
  addCoef.col = "black",
  number.cex = 0.8
)

Visualisasi heatmap eigen vector memberikan gambaran yang lebih intuitif terkait kontribusi variabel terhadap setiap komponen utama. Warna yang lebih intens menunjukkan kontribusi yang lebih besar, sedangkan warna yang lebih pucat menunjukkan kontribusi yang lebih kecil.