Satu dataset dapat disusun menjadi tabel panjang maupun tabel lebar, dan kedua susunan itu memengaruhi kemudahan analisis berikutnya. Topik ini membahas prinsip tidy data, perbedaan bentuk panjang dan bentuk lebar pada log sensor suhu tiga ruangan, serta pertimbangan memilih bentuk untuk agregasi, plot, dan laporan. Setelah membaca, keputusan mengubah bentuk tabel dapat diambil secara sadar sebelum menggunakan pivot, melt, stack, unstack, dan crosstab.
Tiga aturan tidy data#
Tidy data adalah konvensi penyusunan tabel yang menuntut setiap variabel menempati satu kolom, setiap pengamatan menempati satu baris, dan setiap unit observasi menempati satu tabel. Variabel adalah besaran yang dicatat, misalnya waktu, ruang, dan suhu. Pengamatan adalah satu kejadian terukur, misalnya satu bacaan sensor pada satu waktu untuk satu ruang. Unit observasi adalah jenis objek yang diamati, dan pada jalur ini unitnya adalah satu bacaan sensor.
Prinsip tersebut dirangkum sebagai berikut:
- setiap variabel menempati satu kolom
- setiap pengamatan menempati satu baris
- setiap unit observasi menempati satu tabel
Ketiga aturan itu tampak sederhana tetapi sering dilanggar ketika laporan disusun untuk manusia. Tabel yang berisi satu kolom per ruangan melanggar aturan pertama karena variabel ruang tersebar pada nama-nama kolom. Pelanggaran semacam ini tidak menghentikan analisis, tetapi menyulitkan operasi umum seperti menyaring baris untuk satu ruangan tertentu atau mengagregasi seluruh ruangan sekaligus. Konvensi tidy data menyelesaikan masalah itu dengan menyimpan kategori pada kolom tersendiri, sehingga setiap operasi cukup membaca nilai kolom tersebut.
Bentuk panjang pada data mini#
Format panjang menyimpan setiap pengamatan sebagai satu baris yang terdiri atas kolom identitas, kolom kategori, dan kolom nilai. Jalankan potongan kode berikut pada data mini enam baris, yaitu bacaan suhu dua titik waktu untuk tiga ruangan.
import pandas as pd
panjang = pd.DataFrame({
"waktu": ["08:00", "08:00", "08:00", "08:15", "08:15", "08:15"],
"ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A", "Lab B", "Ruang Arsip"],
"suhu_c": [23.5, 22.8, 21.0, 23.9, 22.6, 20.9],
})
panjang.to_csv("mini_log.csv", index=False) # disimpan agar blok berikutnya cukup membaca berkas ini
print(panjang) waktu ruang suhu_c
0 08:00 Lab A 23.5
1 08:00 Lab B 22.8
2 08:00 Ruang Arsip 21.0
3 08:15 Lab A 23.9
4 08:15 Lab B 22.6
5 08:15 Ruang Arsip 20.9Kolom ruang menyimpan kategori sebagai data biasa, sehingga menambah ruang baru hanya berarti menambah baris tanpa mengubah struktur tabel. Nilai waktu sengaja diulang pada beberapa baris karena satu titik waktu memuat tiga pengamatan, satu untuk setiap ruang. Susunan seperti ini terlihat bertele-tele bagi manusia, tetapi justru bentuk inilah yang dituntut oleh groupby, penyaringan baris, dan sebagian besar fungsi plot. Diagram berikut merangkum hubungan kedua bentuk beserta fungsi pengubahnya.
Bentuk lebar hasil pivot#
Format lebar menempatkan setiap kategori pada kolom tersendiri, sehingga satu baris memuat satu titik waktu beserta seluruh bacaannya. Fungsi pivot melakukan perubahan itu melalui tiga argumen utama, yaitu index sebagai baris, columns sebagai sumber nama kolom baru, dan values sebagai pengisi sel. Baca kembali data mini dari berkasnya, lalu putar menjadi tabel lebar.
import pandas as pd
panjang = pd.read_csv("mini_log.csv")
lebar = panjang.pivot(index="waktu", columns="ruang", values="suhu_c")
print(lebar)ruang Lab A Lab B Ruang Arsip
waktu
08:00 23.5 22.8 21.0
08:15 23.9 22.6 20.9Nilai unik pada kolom ruang, yaitu Lab A, Lab B, dan Ruang Arsip, menjadi nama kolom baru, sedangkan kolom waktu menjadi indeks baris. Setiap sel kini menyimpan satu suhu dan jumlah barisnya tinggal dua, sesuai jumlah titik waktu yang unik. Perbandingan antarruangan terbaca menyamping tanpa penyaringan apa pun, dan itulah kegunaan utama bentuk lebar.
Memilih bentuk sesuai kebutuhan#
Bentuk panjang menjadi pilihan utama untuk agregasi dan analisis karena kolom kategorinya tersedia sebagai data biasa. Bentuk lebar menjadi pilihan utama untuk laporan karena pembaca manusia membandingkan nilai secara menyamping. Baca kembali data mini, lalu jalankan agregasi berikut untuk melihat alasannya.
import pandas as pd
panjang = pd.read_csv("mini_log.csv")
print(panjang.groupby("ruang")["suhu_c"].mean())ruang
Lab A 23.70
Lab B 22.70
Ruang Arsip 20.95
Name: suhu_c, dtype: float64Satu panggilan groupby langsung menghasilkan rata-rata per ruang tanpa langkah tambahan. Operasi yang sama pada bentuk lebar menuntut pemilihan kolom satu per satu karena kategori tertanam pada nama kolom, bukan pada nilai data. Sebaliknya, laporan bagi petugas gedung lebih mudah dibaca dalam bentuk lebar karena ketiga ruangan terlihat berdampingan pada satu baris waktu. Panduan pemilihannya dirangkum sebagai berikut:
- gunakan bentuk panjang untuk
groupby, penyaringan per kategori, dan plot multi-seri - gunakan bentuk lebar untuk laporan, tabel ringkasan, dan pemeriksaan visual menyamping
- ubah bentuk melalui
pivotdanmeltalih-alih menyalin data secara manual
Ringkasan#
- Tidy data menuntut satu variabel satu kolom, satu pengamatan satu baris, dan satu unit observasi satu tabel.
- Bentuk panjang menyimpan kategori sebagai nilai kolom sehingga siap untuk
groupbydan plot multi-seri. - Bentuk lebar menyimpan kategori sebagai nama kolom sehingga nyaman untuk laporan dan perbandingan menyamping.
pivotmengubah panjang menjadi lebar, sedangkanmeltmengubah lebar menjadi panjang sebagaimana dibahas pada topik melt.
Referensi#
- Reshaping and pivot tables — pandas — Panduan resmi pengubahan bentuk DataFrame, termasuk pivot, stack, dan melt.
- Tidy Data — Journal of Statistical Software — Artikel Hadley Wickham yang merumuskan prinsip tidy data beserta resep mencapainya.