Prinsip Tidy Data

Prinsip satu observasi per baris dan satu variabel per kolom.

Daftar isi

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.

kelasGanjil 2025Genap 20257A78827B7479kelassemesterrata_rata7AGanjil 2025787AGenap 2025827BGanjil 202574⋮nama kolomisi sel
Pemetaan dari tabel lebar ke tabel panjang

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.

r Contoh: tabel dengan semester sebagai nama kolom
library(tidyverse)
kotor <- tribble(
  ~kelas, ~`Ganjil 2025`, ~`Genap 2025`,
  "7A",   78,             82,
  "7B",   74,             79
)
kotor
text Keluaran
── 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           79

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

r Contoh: satu observasi yang tersebar di dua baris
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
text Keluaran
# 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    74

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

r Contoh: tabel yang sudah tidy
rapikan <- tribble(
  ~kelas, ~semester, ~peserta, ~rata_rata,
  "7A",   "Ganjil",  32,       78,
  "7A",   "Genap",   32,       82,
  "7B",   "Ganjil",  30,       74,
  "7B",   "Genap",   31,       79
)
rapikan
text Keluaran
# 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        79

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

r Contoh: rekap rata-rata per semester
rapikan |>
  group_by(semester) |>
  summarize(rata_rata_semester = mean(rata_rata))
text Keluaran
# A tibble: 2 × 2
  semester rata_rata_semester
  <chr>                 <dbl>
1 Ganjil                 76
2 Genap                  80.5

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