Mengubah Bentuk Data: pivot dan melt
Bangun tabel ringkasan dengan pivot_table() dan aggfunc, kembalikan data wide menjadi long dengan melt(), dan pahami kapan tiap bentuk dipakai di laporan.
Bentuk Data Menentukan Pertanyaannya
Data yang sama bisa disajikan dalam dua bentuk: long (satu baris per observasi, kolomnya sedikit) dan wide (kolomnya banyak, tiap kolom satu periode atau kategori). Ini seperti foto yang sama dilihat portrait atau landscape, isinya sama tapi yang terlihat jelas berbeda. pivot_table() mengubah long menjadi wide agar enak dibaca manusia, sedangkan melt() mengubah wide menjadi long agar enak diolah mesin.
Untuk data analyst, dua fungsi ini adalah jembatan antara analisis dan laporan. Atasan ingin melihat tabel ringkas omzet per kategori per bulan (wide, hasil pivot), tapi untuk membuat grafik tren di library visualisasi, data harus berbentuk long (hasil melt). Bisa berpindah bentuk dengan luwes adalah tanda analis yang sudah naik level.
pivot_table(): Dari Baris Transaksi ke Tabel Laporan
import pandas as pd
df = pd.DataFrame({
"bulan": ["Jan", "Jan", "Feb", "Feb", "Jan", "Feb"],
"kategori": ["Kopi", "Teh", "Kopi", "Teh", "Kopi", "Teh"],
"omzet": [500, 300, 700, 400, 600, 350],
})
laporan = df.pivot_table(index="kategori", columns="bulan",
values="omzet", aggfunc="sum")
print(laporan)Parameter kuncinya: index menjadi baris, columns menjadi kolom, values adalah angka yang diagregasi, dan aggfunc menentukan cara agregasinya (sum, mean, count, dan lain-lain). Hasilnya persis seperti tabel pivot di Excel yang biasa diminta atasan.
melt(): Dari Tabel Wide Kembali ke Long
Seringkali data datang dalam bentuk wide, misalnya satu kolom per bulan, dan kamu butuh bentuk long untuk analisis lanjutan.
import pandas as pd
wide = pd.DataFrame({
"kategori": ["Kopi", "Teh"],
"Jan": [1100, 650],
"Feb": [700, 750],
"Mar": [900, 800],
})
long = wide.melt(id_vars=["kategori"],
var_name="bulan",
value_name="omzet")
print(long)
# Lanjut analisis: total per bulan
print(long.groupby("bulan")["omzet"].sum())id_vars adalah kolom yang dipertahankan sebagai identitas baris, sedangkan kolom-kolom bulan "dilelehkan" menjadi dua kolom baru: bulan dan omzet. Dari bentuk long ini, groupby dan visualisasi jadi mudah. Inilah alasan analis senior selalu menyimpan data mentah dalam bentuk long: satu bentuk yang bisa diubah menjadi laporan apa pun.
Catatan teknis:
pivot()(tanpa _table) akan error kalau ada kombinasi index dan columns yang duplikat, karena dia tidak tahu cara menggabungkannya.pivot_table()aman dari masalah ini justru karena kamu wajib menentukanaggfunc.
Jebakan Umum
SALAH: memakai pivot() di data transaksi yang punya duplikat kombinasi.
df.pivot(index="kategori", columns="bulan", values="omzet") # ValueError: duplikatBENAR: pakai pivot_table() dengan aggfunc yang eksplisit.
df.pivot_table(index="kategori", columns="bulan",
values="omzet", aggfunc="sum")SALAH: melt tanpa id_vars sehingga kolom identitas ikut meleleh.
wide.melt() # kolom 'kategori' ikut jadi baris data, berantakanBENAR: tentukan id_vars dengan jelas supaya hanya kolom periode yang dilelehkan, dan beri nama baru yang bermakna lewat var_name dan value_name.
Tantangan
Susun Laporan Bulanan
Diberikan DataFrame transaksi long (tanggal, kategori, omzet). Buat pivot_table omzet per kategori per bulan dengan aggfunc sum, lalu melt hasilnya kembali ke bentuk long dengan kolom bulan dan omzet.