Selama empat chapter terakhir kita memutar-mutar tabel penjualan antara dua bentuk tanpa menyebut namanya secara resmi. Bentuk lebar (wide) menaruh setiap variabel ukuran pada kolom tersendiri, sedangkan bentuk panjang (long) menaruh setiap satu pengukuran pada satu baris. Keduanya memuat informasi yang sama persis; yang berbeda adalah pertanyaan mana yang paling mudah dijawab pada masing-masing bentuk. Pada Chapter ini kita merumuskan definisi keduanya, membandingkan kegunaannya, dan mempraktikkan konversi bolak-balik dengan melt() dan pivot() dalam satu skrip utuh.
Dua Konvensi Bentuk Tabel #
| Aspek | Format wide | Format long |
|---|---|---|
| Satu baris mewakili | Satu unit observasi (satu kota) | Satu pengukuran (satu kota-bulan) |
| Identitas variabel | Berada di judul kolom | Berada di kolom kategori (bulan) |
| Jumlah baris | Sedikit, satu per unit | Banyak, unit kali variabel |
| Kegunaan utama | Laporan siap baca | Agregasi, groupby, plotting |
Tabel di atas menegaskan bahwa perbedaannya terletak pada penyimpanan metadata: format lebar menempelkan nama bulan pada struktur tabel, format panjang menyimpannya sebagai data biasa. Konsekuensinya, menambah periode baru pada format lebar berarti menambah kolom dan mengubah skema, sementara pada format panjang cukup menambah baris tanpa mengubah skema sama sekali. Prinsip inilah yang membuat database, file CSV besar, dan library analisis lebih menyukai format panjang.
Kapan Format Long Lebih Sesuai #
Format panjang adalah pilihan utama ketika data akan diolah, bukan sekadar dilihat. Agregasi groupby("bulan") berjalan satu baris pada format panjang; plotting per kelompok, model statistik, dan penulisan ke database juga mengharapkan struktur ini. Ketika satu tabel harus memuat dimensi tambahan seperti kota, produk, dan tahun sekaligus, format lebar akan bengkak menjadi matriks kolom yang sulit dirawat, sedangkan format panjang tetap ramping. Uji praktis yang bisa kita pakai: bila pertanyaan analisis berbunyi “rata-rata per kategori”, format panjang biasanya sudah benar.
Kapan Format Wide Lebih Sesuai #
Format lebar menang saat pembaca manusia perlu membandingkan nilai berdampingan; selisih Januari dan Februari terlihat langsung tanpa mencocokkan baris. Laporan manajemen, dashboard ringkas, dan berkas kerja spreadsheet umumnya berbentuk lebar karena kolom sejajar mengikuti kebiasaan membaca tabel. Format ini juga cocok sebagai keluaran akhir, bukan sebagai bahan mentah: bentuknya stabil karena jumlah kolomnya terbatas pada jumlah kategori yang memang ada. Dengan kata lain, format panjang untuk bekerja, format lebar untuk menyajikan.
Konversi Bolak-Balik dalam Satu Skrip #
Skrip berikut merangkai seluruh alat Chapter sebelumnya: melt() melelehkan tabel lebar, groupby membuktikan format panjang siap agregasi, dan pivot() mengembalikan bentuk awal.
import pandas as pd
lebar = pd.DataFrame({
"kota": ["Bandung", "Jakarta", "Surabaya"],
"Jan": [120, 200, 150],
"Feb": [135, 180, 160],
})
# wide -> long: melt
panjang = lebar.melt(id_vars="kota", var_name="bulan", value_name="omzet")
print(panjang)
print()
# format long memudahkan agregasi per kelompok
print(panjang.groupby("bulan")["omzet"].mean())
print()
# long -> wide: pivot
kembali = panjang.pivot(index="kota", columns="bulan", values="omzet")
print(kembali)
print()
# merapikan label axis agar bentuknya sama seperti tabel awal
rapi = kembali[["Jan", "Feb"]].rename_axis(columns=None).reset_index()
print(rapi)
print()
# Jumlah baris berubah, total nilai tidak
print("baris lebar:", len(lebar), "| baris panjang:", len(panjang))
print("total lebar:", lebar[["Jan", "Feb"]].to_numpy().sum(),
"| total panjang:", panjang["omzet"].sum())Output yang Dihasilkan:
kota bulan omzet
0 Bandung Jan 120
1 Jakarta Jan 200
2 Surabaya Jan 150
3 Bandung Feb 135
4 Jakarta Feb 180
5 Surabaya Feb 160
bulan
Feb 158.333333
Jan 156.666667
Name: omzet, dtype: float64
bulan Feb Jan
kota
Bandung 135 120
Jakarta 180 200
Surabaya 160 150
kota Jan Feb
0 Bandung 120 135
1 Jakarta 200 180
2 Surabaya 150 160
baris lebar: 3 | baris panjang: 6
total lebar: 945 | total panjang: 945Mari kita telaah bagian-bagian pentingnya:
- Baris 9-11:
melt()menghasilkan enam baris dari tiga; setiap sel angka kini punya baris sendiri dengan labelbulandanomzet. - Baris 14-15:
groupby("bulan")menghitung rata-rata per bulan tanpa pengolahan tambahan; inilah keunggulan format panjang. - Baris 18-19:
pivot()mengembalikan bentuk lebar, tetapi kolomnya terurut alfabetis (FebsebelumJan) dan judul axisbulanmasih menempel. - Baris 23-24: seleksi
kembali[["Jan", "Feb"]]memulihkan urutan kolom,rename_axis(columns=None)menghapus nama axis kolom, danreset_index()mengembalikankotamenjadi kolom biasa; bentuk akhirnya identik dengan tabel awal. - Baris 28-31: jumlah baris berubah 3 menjadi 6, sedangkan total omzet tetap 945; konversi bentuk tidak boleh mengubah isi.
Panduan lengkap membentuk ulang tabel terkumpul di user guide reshaping
, dengan rincian parameter di pandas.DataFrame.melt
dan pandas.DataFrame.pivot
. Ketika pertanyaan analisis berbunyi “berapa banyak kejadian tiap kombinasi dua kategori”, pandas menyediakan jalan pintas khusus bernama pd.crosstab(); itulah pembahasan Chapter penutup Section ini.