Data Preparation di R

1.Import Data

# Data Titanic sudah tersedia di R
data <- ("Titanic")

# Konversi ke data frame agar lebih mudah diolah
titanic <- as.data.frame(Titanic)
titanic
##    Class    Sex   Age Survived Freq
## 1    1st   Male Child       No    0
## 2    2nd   Male Child       No    0
## 3    3rd   Male Child       No   35
## 4   Crew   Male Child       No    0
## 5    1st Female Child       No    0
## 6    2nd Female Child       No    0
## 7    3rd Female Child       No   17
## 8   Crew Female Child       No    0
## 9    1st   Male Adult       No  118
## 10   2nd   Male Adult       No  154
## 11   3rd   Male Adult       No  387
## 12  Crew   Male Adult       No  670
## 13   1st Female Adult       No    4
## 14   2nd Female Adult       No   13
## 15   3rd Female Adult       No   89
## 16  Crew Female Adult       No    3
## 17   1st   Male Child      Yes    5
## 18   2nd   Male Child      Yes   11
## 19   3rd   Male Child      Yes   13
## 20  Crew   Male Child      Yes    0
## 21   1st Female Child      Yes    1
## 22   2nd Female Child      Yes   13
## 23   3rd Female Child      Yes   14
## 24  Crew Female Child      Yes    0
## 25   1st   Male Adult      Yes   57
## 26   2nd   Male Adult      Yes   14
## 27   3rd   Male Adult      Yes   75
## 28  Crew   Male Adult      Yes  192
## 29   1st Female Adult      Yes  140
## 30   2nd Female Adult      Yes   80
## 31   3rd Female Adult      Yes   76
## 32  Crew Female Adult      Yes   20
# Data airquality sudah tersedia di R
 data("airquality")

# Konversi ke data frame agar lebih mudah diolah
airquality <- as.data.frame(airquality)
airquality
##     Ozone Solar.R Wind Temp Month Day
## 1      41     190  7.4   67     5   1
## 2      36     118  8.0   72     5   2
## 3      12     149 12.6   74     5   3
## 4      18     313 11.5   62     5   4
## 5      NA      NA 14.3   56     5   5
## 6      28      NA 14.9   66     5   6
## 7      23     299  8.6   65     5   7
## 8      19      99 13.8   59     5   8
## 9       8      19 20.1   61     5   9
## 10     NA     194  8.6   69     5  10
## 11      7      NA  6.9   74     5  11
## 12     16     256  9.7   69     5  12
## 13     11     290  9.2   66     5  13
## 14     14     274 10.9   68     5  14
## 15     18      65 13.2   58     5  15
## 16     14     334 11.5   64     5  16
## 17     34     307 12.0   66     5  17
## 18      6      78 18.4   57     5  18
## 19     30     322 11.5   68     5  19
## 20     11      44  9.7   62     5  20
## 21      1       8  9.7   59     5  21
## 22     11     320 16.6   73     5  22
## 23      4      25  9.7   61     5  23
## 24     32      92 12.0   61     5  24
## 25     NA      66 16.6   57     5  25
## 26     NA     266 14.9   58     5  26
## 27     NA      NA  8.0   57     5  27
## 28     23      13 12.0   67     5  28
## 29     45     252 14.9   81     5  29
## 30    115     223  5.7   79     5  30
## 31     37     279  7.4   76     5  31
## 32     NA     286  8.6   78     6   1
## 33     NA     287  9.7   74     6   2
## 34     NA     242 16.1   67     6   3
## 35     NA     186  9.2   84     6   4
## 36     NA     220  8.6   85     6   5
## 37     NA     264 14.3   79     6   6
## 38     29     127  9.7   82     6   7
## 39     NA     273  6.9   87     6   8
## 40     71     291 13.8   90     6   9
## 41     39     323 11.5   87     6  10
## 42     NA     259 10.9   93     6  11
## 43     NA     250  9.2   92     6  12
## 44     23     148  8.0   82     6  13
## 45     NA     332 13.8   80     6  14
## 46     NA     322 11.5   79     6  15
## 47     21     191 14.9   77     6  16
## 48     37     284 20.7   72     6  17
## 49     20      37  9.2   65     6  18
## 50     12     120 11.5   73     6  19
## 51     13     137 10.3   76     6  20
## 52     NA     150  6.3   77     6  21
## 53     NA      59  1.7   76     6  22
## 54     NA      91  4.6   76     6  23
## 55     NA     250  6.3   76     6  24
## 56     NA     135  8.0   75     6  25
## 57     NA     127  8.0   78     6  26
## 58     NA      47 10.3   73     6  27
## 59     NA      98 11.5   80     6  28
## 60     NA      31 14.9   77     6  29
## 61     NA     138  8.0   83     6  30
## 62    135     269  4.1   84     7   1
## 63     49     248  9.2   85     7   2
## 64     32     236  9.2   81     7   3
## 65     NA     101 10.9   84     7   4
## 66     64     175  4.6   83     7   5
## 67     40     314 10.9   83     7   6
## 68     77     276  5.1   88     7   7
## 69     97     267  6.3   92     7   8
## 70     97     272  5.7   92     7   9
## 71     85     175  7.4   89     7  10
## 72     NA     139  8.6   82     7  11
## 73     10     264 14.3   73     7  12
## 74     27     175 14.9   81     7  13
## 75     NA     291 14.9   91     7  14
## 76      7      48 14.3   80     7  15
## 77     48     260  6.9   81     7  16
## 78     35     274 10.3   82     7  17
## 79     61     285  6.3   84     7  18
## 80     79     187  5.1   87     7  19
## 81     63     220 11.5   85     7  20
## 82     16       7  6.9   74     7  21
## 83     NA     258  9.7   81     7  22
## 84     NA     295 11.5   82     7  23
## 85     80     294  8.6   86     7  24
## 86    108     223  8.0   85     7  25
## 87     20      81  8.6   82     7  26
## 88     52      82 12.0   86     7  27
## 89     82     213  7.4   88     7  28
## 90     50     275  7.4   86     7  29
## 91     64     253  7.4   83     7  30
## 92     59     254  9.2   81     7  31
## 93     39      83  6.9   81     8   1
## 94      9      24 13.8   81     8   2
## 95     16      77  7.4   82     8   3
## 96     78      NA  6.9   86     8   4
## 97     35      NA  7.4   85     8   5
## 98     66      NA  4.6   87     8   6
## 99    122     255  4.0   89     8   7
## 100    89     229 10.3   90     8   8
## 101   110     207  8.0   90     8   9
## 102    NA     222  8.6   92     8  10
## 103    NA     137 11.5   86     8  11
## 104    44     192 11.5   86     8  12
## 105    28     273 11.5   82     8  13
## 106    65     157  9.7   80     8  14
## 107    NA      64 11.5   79     8  15
## 108    22      71 10.3   77     8  16
## 109    59      51  6.3   79     8  17
## 110    23     115  7.4   76     8  18
## 111    31     244 10.9   78     8  19
## 112    44     190 10.3   78     8  20
## 113    21     259 15.5   77     8  21
## 114     9      36 14.3   72     8  22
## 115    NA     255 12.6   75     8  23
## 116    45     212  9.7   79     8  24
## 117   168     238  3.4   81     8  25
## 118    73     215  8.0   86     8  26
## 119    NA     153  5.7   88     8  27
## 120    76     203  9.7   97     8  28
## 121   118     225  2.3   94     8  29
## 122    84     237  6.3   96     8  30
## 123    85     188  6.3   94     8  31
## 124    96     167  6.9   91     9   1
## 125    78     197  5.1   92     9   2
## 126    73     183  2.8   93     9   3
## 127    91     189  4.6   93     9   4
## 128    47      95  7.4   87     9   5
## 129    32      92 15.5   84     9   6
## 130    20     252 10.9   80     9   7
## 131    23     220 10.3   78     9   8
## 132    21     230 10.9   75     9   9
## 133    24     259  9.7   73     9  10
## 134    44     236 14.9   81     9  11
## 135    21     259 15.5   76     9  12
## 136    28     238  6.3   77     9  13
## 137     9      24 10.9   71     9  14
## 138    13     112 11.5   71     9  15
## 139    46     237  6.9   78     9  16
## 140    18     224 13.8   67     9  17
## 141    13      27 10.3   76     9  18
## 142    24     238 10.3   68     9  19
## 143    16     201  8.0   82     9  20
## 144    13     238 12.6   64     9  21
## 145    23      14  9.2   71     9  22
## 146    36     139 10.3   81     9  23
## 147     7      49 10.3   69     9  24
## 148    14      20 16.6   63     9  25
## 149    30     193  6.9   70     9  26
## 150    NA     145 13.2   77     9  27
## 151    14     191 14.3   75     9  28
## 152    18     131  8.0   76     9  29
## 153    20     223 11.5   68     9  30

Dataset Titanic dan airquality di R berbentuk array. Supaya lebih enak dipakai, kita ubah dulu ke data.frame.

2.Data Structures

# Lihat struktur data
str(titanic)
## 'data.frame':    32 obs. of  5 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Freq    : num  0 0 35 0 0 0 17 0 118 154 ...
# Ringkasan statistik
summary(titanic)
##   Class       Sex        Age     Survived      Freq       
##  1st :8   Male  :16   Child:16   No :16   Min.   :  0.00  
##  2nd :8   Female:16   Adult:16   Yes:16   1st Qu.:  0.75  
##  3rd :8                                   Median : 13.50  
##  Crew:8                                   Mean   : 68.78  
##                                           3rd Qu.: 77.00  
##                                           Max.   :670.00
  • Variabel Class memiliki 4 kategori: 1st, 2nd, 3rd, dan Crew, masing-masing muncul 8 kali.
  • Variabel Sex terdiri dari Male dan Female, masing-masing muncul 16 kali.
  • Variabel Age terdiri dari Child dan Adult, masing-masing muncul 16 kali.
  • Variabel Survived terdiri dari No dan Yes, masing-masing muncul 16 kali.
  • Variabel Freq adalah data numerik yang menunjukkan frekuensi (jumlah penumpang) untuk kombinasi kategori di atas.
  • Nilai terkecil (Min.) adalah 0 → ada kombinasi kategori tertentu yang tidak memiliki penumpang.
  • Nilai kuartil pertama (1st Qu.) adalah 0.75 → sebagian besar kombinasi kategori hanya punya sedikit penumpang.
  • Nilai Median adalah 13.50 → separuh data frekuensi berada di bawah 13,5.
  • Nilai Mean (rata-rata) adalah 68.78 → lebih tinggi dari median, menandakan distribusi cenderung skewed ke kanan.
  • Nilai kuartil ketiga (3rd Qu.) adalah 77.00.
  • Nilai maksimum (Max.) adalah 670 → ada satu kombinasi kategori dengan jumlah penumpang sangat besar.

3.Missing Value

# Cek apakah ada missing value
colSums(is.na(Titanic))
## , , Survived = No
## 
##         Age
## Sex      Child Adult
##   Male       0     0
##   Female     0     0
## 
## , , Survived = Yes
## 
##         Age
## Sex      Child Adult
##   Male       0     0
##   Female     0     0

Kita bisa langsung lihat jumlah NA di setiap kolom. Dataset Titanic ini bersih (tidak ada NA), jadi hasil semuanya nol.

# Cek apakah ada missing value
colSums(is.na(airquality))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0

Dari hasil pemeriksaan, dataset airquality memiliki missing value pada variabel Ozone dan Solar.R. Sedangkan variabel lain (Wind, Temp, Month, dan Day) lengkap tanpa missing value. Informasi ini penting sebelum melakukan analisis, karena kita perlu menentukan strategi untuk menangani nilai yang hilang, misalnya dengan menghapus baris, mengisi dengan rata-rata/median, atau menggunakan metode imputasi lainnya.

4.Replace Missing Value

# Ganti NA pada kolom Ozone dengan median
airquality$Ozone[is.na(airquality$Ozone)] <- median(airquality$Ozone, na.rm = TRUE)

# Ganti NA pada kolom Solar.R dengan median
airquality$Solar.R[is.na(airquality$Solar.R)] <- median(airquality$Solar.R, na.rm = TRUE)

# Cek lagi apakah masih ada missing value
colSums(is.na(airquality))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##       0       0       0       0       0       0

5.Select Data

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
# Pilih hanya kolom tertentu
titanic_selected <- select(titanic, Class, Sex, Survived)
head(titanic_selected)
##   Class    Sex Survived
## 1   1st   Male       No
## 2   2nd   Male       No
## 3   3rd   Male       No
## 4  Crew   Male       No
## 5   1st Female       No
## 6   2nd Female       No

select() berguna untuk memilih kolom yang relevan. Misalnya di sini kita hanya ambil informasi kelas, jenis kelamin, dan status selamat.

6.Filter and Sort Data

library(dplyr)

# Filter penumpang anak-anak
titanic_child <- filter(titanic, Age == "Child")

# Urutkan berdasarkan frekuensi (ascending: kecil → besar)
titanic_sorted_asc <- arrange(titanic, Freq)

head(titanic_sorted_asc)
##   Class    Sex   Age Survived Freq
## 1   1st   Male Child       No    0
## 2   2nd   Male Child       No    0
## 3  Crew   Male Child       No    0
## 4   1st Female Child       No    0
## 5   2nd Female Child       No    0
## 6  Crew Female Child       No    0
# Urutkan berdasarkan frekuensi (descending: besar → kecil)
titanic_sorted_desc <- arrange(titanic, desc(Freq))

head(titanic_sorted_desc)
##   Class    Sex   Age Survived Freq
## 1  Crew   Male Adult       No  670
## 2   3rd   Male Adult       No  387
## 3  Crew   Male Adult      Yes  192
## 4   2nd   Male Adult       No  154
## 5   1st Female Adult      Yes  140
## 6   1st   Male Adult       No  118
  • filter() digunakan untuk menyaring baris tertentu, misalnya hanya anak-anak.
  • arrange(titanic, Freq) mengurutkan data dari frekuensi paling kecil ke besar (ascending) → cocok kalau mau tahu kombinasi kategori dengan jumlah penumpang paling sedikit.
  • arrange(titanic, desc(Freq)) mengurutkan data dari frekuensi paling besar ke kecil (descending) → cocok kalau mau tahu kombinasi kategori dengan jumlah penumpang paling banyak. -arrange(titanic, desc(Freq)) mengurutkan data dari frekuensi paling besar ke kecil (descending) → cocok kalau mau tahu kategori dengan jumlah penumpang paling banyak.

Rename and Mutate

# Ganti nama kolom
library(dplyr)
titanic_rename <- rename(titanic, Umur = Age)
titanic_rename
##    Class    Sex  Umur Survived Freq
## 1    1st   Male Child       No    0
## 2    2nd   Male Child       No    0
## 3    3rd   Male Child       No   35
## 4   Crew   Male Child       No    0
## 5    1st Female Child       No    0
## 6    2nd Female Child       No    0
## 7    3rd Female Child       No   17
## 8   Crew Female Child       No    0
## 9    1st   Male Adult       No  118
## 10   2nd   Male Adult       No  154
## 11   3rd   Male Adult       No  387
## 12  Crew   Male Adult       No  670
## 13   1st Female Adult       No    4
## 14   2nd Female Adult       No   13
## 15   3rd Female Adult       No   89
## 16  Crew Female Adult       No    3
## 17   1st   Male Child      Yes    5
## 18   2nd   Male Child      Yes   11
## 19   3rd   Male Child      Yes   13
## 20  Crew   Male Child      Yes    0
## 21   1st Female Child      Yes    1
## 22   2nd Female Child      Yes   13
## 23   3rd Female Child      Yes   14
## 24  Crew Female Child      Yes    0
## 25   1st   Male Adult      Yes   57
## 26   2nd   Male Adult      Yes   14
## 27   3rd   Male Adult      Yes   75
## 28  Crew   Male Adult      Yes  192
## 29   1st Female Adult      Yes  140
## 30   2nd Female Adult      Yes   80
## 31   3rd Female Adult      Yes   76
## 32  Crew Female Adult      Yes   20
# Tambahkan kolom proporsi
titanic_mutate <- mutate(titanic, Proporsi = Freq / sum(Freq))
head(titanic_mutate)
##   Class    Sex   Age Survived Freq   Proporsi
## 1   1st   Male Child       No    0 0.00000000
## 2   2nd   Male Child       No    0 0.00000000
## 3   3rd   Male Child       No   35 0.01590186
## 4  Crew   Male Child       No    0 0.00000000
## 5   1st Female Child       No    0 0.00000000
## 6   2nd Female Child       No    0 0.00000000
  • rename() memberi nama baru agar lebih mudah dibaca.
  • mutate() menambahkan kolom baru atau memodifikasi kolom lama dalam satu dataset. Kolom baru biasanya hasil dari perhitungan atau transformasi variabel. Dataset yang dipakai tetap satu dataset saja.

8.Join Data

  • Fungsinya: menggabungkan dua dataset berbeda berdasarkan kolom kunci tertentu.
  • Ada beberapa jenis join: left_join(), right_join(), inner_join(), full_join().
  • Jadi join dipakai kalau kita punya dua tabel yang perlu disatukan.
# Buat data tambahan
extra <- data.frame(
  Class = c("1st","2nd","3rd","Crew"),
  Kapal = c("Titanic","Titanic","Titanic","Titanic")
)

# Join ke dataset titanic
titanic_joined <- left_join(titanic, extra, by = "Class")

head(titanic_joined)
##   Class    Sex   Age Survived Freq   Kapal
## 1   1st   Male Child       No    0 Titanic
## 2   2nd   Male Child       No    0 Titanic
## 3   3rd   Male Child       No   35 Titanic
## 4  Crew   Male Child       No    0 Titanic
## 5   1st Female Child       No    0 Titanic
## 6   2nd Female Child       No    0 Titanic

Contoh ini menunjukkan bagaimana menggabungkan data lain (misalnya info nama kapal) dengan dataset Titanic berdasarkan Class.

9. Group and Summarize

# Hitung total penumpang selamat vs tidak berdasarkan kelas
titanic_summary <- titanic %>%
  group_by(Class, Survived) %>%
  summarise(total = sum(Freq))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by Class and Survived.
## ℹ Output is grouped by Class.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(Class, Survived))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
titanic_summary
## # A tibble: 8 × 3
## # Groups:   Class [4]
##   Class Survived total
##   <fct> <fct>    <dbl>
## 1 1st   No         122
## 2 1st   Yes        203
## 3 2nd   No         167
## 4 2nd   Yes        118
## 5 3rd   No         528
## 6 3rd   Yes        178
## 7 Crew  No         673
## 8 Crew  Yes        212

Cara membacanya:

1.titanic %>%

  • Artinya: ambil dataset bernama titanic, lalu operasikan ke fungsi berikutnya.
  • Simbol %>% disebut pipe operator, artinya “lanjutkan ke langkah berikutnya”.

2.group_by(Class, Survived)

  • Data dikelompokkan berdasarkan kelas penumpang (Class) dan status selamat/tidak (Survived).
  • Jadi setiap kombinasi Class × Survived akan diperlakukan sebagai satu grup.

3.summarise(total = sum(freq))

  • Untuk tiap grup tadi, jumlahkan nilai Freq (frekuensi jumlah penumpang).
  • Hasilnya disimpan dalam kolom baru bernama total.

4.titanic_summary <- ...

  • Semua hasil perhitungan di atas disimpan dalam dataset baru bernama titanic_summary.

5.titanic_summary

  • Menampilkan hasil akhirnya: jumlah penumpang selamat vs tidak, dibagi berdasarkan kelas.

10.Split Data

set.seed(123)

# Buat indeks sampling 70%
index <- sample(1:nrow(titanic), 0.7*nrow(titanic))

train_data <- titanic[index, ]
test_data  <- titanic[-index, ]

nrow(train_data); nrow(test_data)
## [1] 22
## [1] 10

Dataset sering dibagi menjadi training (untuk membuat model) dan testing (untuk menguji model). Di sini 70% data dipakai sebagai training, sisanya untuk testing.