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 #

AspekFormat wideFormat long
Satu baris mewakiliSatu unit observasi (satu kota)Satu pengukuran (satu kota-bulan)
Identitas variabelBerada di judul kolomBerada di kolom kategori (bulan)
Jumlah barisSedikit, satu per unitBanyak, unit kali variabel
Kegunaan utamaLaporan siap bacaAgregasi, 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.

python
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:

text
       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: 945

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 9-11: melt() menghasilkan enam baris dari tiga; setiap sel angka kini punya baris sendiri dengan label bulan dan omzet.
  2. Baris 14-15: groupby("bulan") menghitung rata-rata per bulan tanpa pengolahan tambahan; inilah keunggulan format panjang.
  3. Baris 18-19: pivot() mengembalikan bentuk lebar, tetapi kolomnya terurut alfabetis (Feb sebelum Jan) dan judul axis bulan masih menempel.
  4. Baris 23-24: seleksi kembali[["Jan", "Feb"]] memulihkan urutan kolom, rename_axis(columns=None) menghapus nama axis kolom, dan reset_index() mengembalikan kota menjadi kolom biasa; bentuk akhirnya identik dengan tabel awal.
  5. 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.