Tabel yang sama dapat disimpan dalam banyak susunan berbeda, tetapi tidak semua susunan sama mudahnya diolah. Topik ini membahas prinsip tidy data, yaitu konvensi penataan tabel yang menetapkan satu variabel per kolom, satu observasi per baris, dan satu nilai per sel. Dua tabel kotor yang khas akan dikenali terlebih dahulu, lalu dibandingkan dengan versi tidynya sebagai acuan perbaikan.
Tiga aturan tidy data#
Prinsip tidy data dirumuskan sebagai tiga aturan yang saling melengkapi. Pertama, setiap variabel membentuk satu kolom. Kedua, setiap observasi membentuk satu baris. Ketiga, setiap nilai pengamatan menempati satu sel yang merupakan perpotongan satu baris dan satu kolom. Ketiga aturan ini terdengar sederhana, tetapi penerapannya menuntut kejelasan tentang apa yang disebut variabel dan observasi pada data yang bersangkutan.
Pada rekap nilai ujian per kelas, variabelnya adalah kelas, semester, dan rata_rata nilai. Satu observasi adalah satu pasang kelas dan semester, misalnya kelas 7A pada semester ganjil, sedangkan nilainya berupa rata_rata 78 yang diukur pada observasi tersebut. Apabila data juga mencatat jumlah peserta, jumlah peserta menjadi variabel keempat dan tetap menempati satu kolom tersendiri. Batasan antarobservasi seperti ini perlu diputuskan lebih dahulu, karena ketiga aturan tidy data seluruhnya bergantung padanya.
Pemetaan dari tabel lebar ke tabel panjang#
Perubahan dari bentuk lebar (wide) ke bentuk panjang (long) mengikuti pemetaan yang tetap. Nama kolom yang menyimpan nilai, yaitu Ganjil 2025 dan Genap 2025, dipindahkan menjadi isi kolom baru bernama semester, sedangkan isi sel yang berada di bawahnya dipindahkan menjadi isi kolom baru bernama rata_rata. Kolom kelas tidak tersentuh karena sudah berperan sebagai variabel. Diagram berikut memperlihatkan pemetaan tersebut pada contoh rekap nilai ujian, dengan warna yang menyandingkan sumber dan sasarannya.
Fungsi yang melaksanakan pemetaan ini adalah pivot_longer(), yang dibahas dalam modul yang sama. Dengan mengenal pemetaannya lebih dahulu, pembentukan ulang bentuk data tinggal diterjemahkan menjadi pemanggilan fungsi. Pemetaan yang sama berlaku sebesar apa pun tabelnya, sehingga bertambahnya jumlah semester tidak mengubah pola penerapannya.
Dua bentuk kotor yang lazim#
Kesalahan penataan yang paling khas adalah menaruh nilai ke dalam nama kolom. Tabel berikut menyimpan nama semester Ganjil 2025 dan Genap 2025 sebagai header kolom, padahal nama-nama tersebut seharusnya menjadi isi dari variabel semester. Gejalanya mudah dikenali, yaitu jumlah kolom bertambah setiap kali periode baru masuk.
library(tidyverse)
kotor <- tribble(
~kelas, ~`Ganjil 2025`, ~`Genap 2025`,
"7A", 78, 82,
"7B", 74, 79
)
kotor── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.1 ✔ readr 2.2.0
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.3 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
✔ purrr 1.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# A tibble: 2 × 3
kelas `Ganjil 2025` `Genap 2025`
<chr> <dbl> <dbl>
1 7A 78 82
2 7B 74 79Tabel semacam itu nyaman dibaca manusia, tetapi menyulitkan pengolahan. Menambahkan satu semester baru berarti menambah satu kolom, sehingga struktur tabel berubah setiap kali datanya bertambah. Selain itu, variabel semester tersembunyi di dalam nama-nama kolom, sehingga fungsi pengolah data tidak dapat menemukannya sebagai kolom biasa.
Bentuk kotor kedua adalah satu observasi yang tersebar di beberapa baris. Pada tabel berikut, kolom jenis menyimpan nama variabel, sedangkan kolom angka menyimpan nilainya, sehingga satu observasi kelas dan semester terpecah menjadi dua baris. Susunan seperti ini menaikkan jumlah baris tanpa menaikkan jumlah informasinya.
tersebar <- tribble(
~kelas, ~semester, ~jenis, ~angka,
"7A", "Ganjil", "peserta", 32,
"7A", "Ganjil", "rata_rata", 78,
"7B", "Ganjil", "peserta", 30,
"7B", "Ganjil", "rata_rata", 74
)
tersebar# A tibble: 4 × 4
kelas semester jenis angka
<chr> <chr> <chr> <dbl>
1 7A Ganjil peserta 32
2 7A Ganjil rata_rata 78
3 7B Ganjil peserta 30
4 7B Ganjil rata_rata 74Kolom jenis melanggar aturan pertama karena isinya bukan nilai, melainkan nama variabel yang sesungguhnya. Angka 32 dan 78 untuk kelas 7A semester Ganjil adalah nilai dari dua variabel yang berbeda, yaitu peserta dan rata_rata, tetapi keduanya bercampur di dalam satu kolom angka. Bentuk seperti ini sering dihasilkan perangkat survai atau formulir daring yang menyimpan setiap jawaban sebagai satu baris.
Bentuk tidy sebagai sasaran#
Kedua tabel kotor di atas dapat disusun ulang menjadi bentuk tidy dengan memindahkan nama semester ke dalam kolom semester, serta memisahkan peserta dan rata_rata menjadi dua kolom yang berdiri sendiri. Susunan ini menampung seluruh informasi kedua tabel kotor sekaligus, sehingga tidak ada data yang hilang dalam perapihan. Hasilnya seperti berikut.
rapikan <- tribble(
~kelas, ~semester, ~peserta, ~rata_rata,
"7A", "Ganjil", 32, 78,
"7A", "Genap", 32, 82,
"7B", "Ganjil", 30, 74,
"7B", "Genap", 31, 79
)
rapikan# A tibble: 4 × 4
kelas semester peserta rata_rata
<chr> <chr> <dbl> <dbl>
1 7A Ganjil 32 78
2 7A Genap 32 82
3 7B Ganjil 30 74
4 7B Genap 31 79Ketiga aturan kini terpenuhi. Variabel kelas, semester, peserta, dan rata_rata masing-masing menempati satu kolom, setiap baris memuat satu observasi, dan setiap sel memuat satu nilai. Menambahkan semester baru hanya menambah baris, sehingga struktur tabel tetap sama. Jumlah baris juga langsung menyatakan jumlah observasi, yaitu empat pasang kelas dan semester.
Mengapa bentuk panjang disukai dplyr dan ggplot2#
Verba dplyr bekerja pada kolom, sehingga setiap variabel perlu berada di satu kolom agar dapat dirujuk dengan satu nama. Pada tabel panjang, penghitungan per semester cukup dikelompokkan lewat kolom semester tanpa menyebut kolom Ganjil 2025 dan Genap 2025 satu per satu. Keunggulan ini makin terasa apabila jumlah semester bertambah, karena kode pada tabel panjang tidak perlu diubah sama sekali.
rapikan |>
group_by(semester) |>
summarize(rata_rata_semester = mean(rata_rata))# A tibble: 2 × 2
semester rata_rata_semester
<chr> <dbl>
1 Ganjil 76
2 Genap 80.5ggplot2 juga mengandalkan pemetaan kolom ke peran grafik. Aestetik (aesthetic), yaitu peran visual seperti sumbu x, sumbu y, dan warna, diisi dengan menyebut nama kolom, sehingga tabel panjang menyediakan seluruh variabel yang dibutuhkan dalam bentuk yang siap dipetakan. Pada tabel lebar, menggambar grafik garis dua semester menuntut dua pemanggilan terpisah atau penataan ulang data terlebih dahulu. Bentuk panjang dengan demikian menjadi format kerja utama, sedangkan bentuk lebar disimpan untuk keperluan penyajian.
Ringkasan#
- Tidy data menetapkan tiga aturan, yaitu satu variabel per kolom, satu observasi per baris, dan satu nilai per sel.
- Tabel kotor yang khas menaruh nilai ke dalam header kolom atau menyebar satu observasi ke beberapa baris.
- Tabel tidy menambah data dengan menambah baris tanpa mengubah struktur tabelnya.
- dplyr dan ggplot2 merujuk variabel lewat nama kolom, sehingga tabel panjang siap dipakai secara langsung.
Referensi#
- tidyr: Tidy Messy Data — tidyverse — dokumentasi resmi paket tidyr yang menetapkan konsep dan fungsi perapian data.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — bagian Tidy data menjelaskan tiga aturan tidy beserta contoh perapiannya.