Data yang sama dapat tersusun lebar atau panjang, dan memilih bentuk yang
salah membuat setiap langkah analisis menjadi berat. Topik ini memperkenalkan
kedua bentuk itu, mengubahnya satu ke yang lain dengan melt dan pivot
pada tabel ringkasan kecil, serta menunjukkan jalan keluarnya ketika kunci
ganda membuat pivot menolak. Setelah membacanya, keputusan bentuk tabel
untuk setiap kebutuhan, dari agregasi sampai grafik, menjadi pilihan yang
disengaja.
Lebar dan panjang, serta kapan masing-masing cocok#
Bentuk lebar menaruh setiap ukuran pada kolom tersendiri, sehingga satu baris
menampung banyak variabel dan terbaca seperti laporan manusia. Bentuk panjang
menaruh nama ukuran pada satu kolom dan nilainya pada kolom lain, sehingga
satu baris mewakili satu pengukuran, dan inilah bentuk yang disukai hampir
semua mesin, mulai dari groupby, grafik seaborn, sampai model.
Tabel berikut merangkum kapan masing-masing bentuk bekerja paling lancar.
| Kebutuhan | Bentuk yang cocok | Alasannya |
|---|---|---|
| Laporan yang dibaca manusia | lebar | setiap ukuran berdiri sebagai kolom |
| Agregasi dan segmentasi | panjang | groupby bekerja atas pasangan kunci-nilai |
| Grafik seaborn | panjang | hue dan x menunjuk satu kolom |
| Gabungan antar tabel | panjang | kunci tambahan tinggal jadi kolom |
Aturan praktis yang sering dipakai adalah mengerjakan dalam bentuk panjang
dan menampilkan dalam bentuk lebar, dan melt menjadi jembatan utamanya.
Melt: dari lebar ke panjang#
melt mengambil kolom-kolom ukuran dan melipatnya menjadi dua kolom, yaitu
nama ukuran dan nilainya, dengan kolom identitas tetap dipertahankan melalui
id_vars. Skrip berikut melipat ringkasan tiga ukuran untuk dua stasiun,
lalu menunjukkan bahwa agregasi pada bentuk panjang menjadi satu baris kode.
"""Dari lebar ke panjang dengan melt, dan kembali dengan pivot."""
import pandas as pd
lebar = pd.DataFrame(
{
"stasiun": ["Stasiun A", "Stasiun B"],
"pm25": [34.5, 53.5],
"suhu_c": [26.3, 24.9],
"kelembapan": [70.9, 71.6],
}
)
panjang = lebar.melt(id_vars="stasiun", var_name="ukuran", value_name="nilai")
print(panjang.to_string(index=False))
print()
kembali = panjang.pivot(index="stasiun", columns="ukuran", values="nilai")
print(kembali.round(1).to_string())
print()
print(panjang.groupby("ukuran")["nilai"].mean().round(1).to_string())
print()
# duplikat kunci membuat pivot menolak, sedangkan pivot_table menerima
ganda = pd.concat([panjang, panjang.iloc[[0]]])
ringkas = ganda.pivot_table(
index="stasiun", columns="ukuran", values="nilai", aggfunc="mean"
)
print(ringkas.round(1).to_string()) stasiun ukuran nilai
Stasiun A pm25 34.5
Stasiun B pm25 53.5
Stasiun A suhu_c 26.3
Stasiun B suhu_c 24.9
Stasiun A kelembapan 70.9
Stasiun B kelembapan 71.6
ukuran kelembapan pm25 suhu_c
stasiun
Stasiun A 70.9 34.5 26.3
Stasiun B 71.6 53.5 24.9
ukuran
kelembapan 71.2
pm25 44.0
suhu_c 25.6
ukuran kelembapan pm25 suhu_c
stasiun
Stasiun A 70.9 34.5 26.3
Stasiun B 71.6 53.5 24.9Tabel dua baris berubah menjadi enam baris panjang, dan agregasi
groupby("ukuran") langsung memberi rata-rata per ukuran tanpa menyebut satu
kolom pun satu per satu. Pada tabel lebar dengan tiga puluh kolom ukuran,
perbedaan ini berubah menjadi tiga puluh baris kode berbanding satu.
Pivot dan pivot_table: kembali ke lebar#
pivot menyusun ulang bentuk panjang dengan memilih baris, kolom, dan nilai,
dan ia menolak secara tegas apabila ada dua baris dengan pasangan kunci yang
sama, karena tidak ada satu nilai pun yang bisa ditaruh pada sel tersebut.
Penolakan ini adalah fitur, bukan kelemahan, karena memaksa keputusan yang
sad sebelum bentuknya berubah.
pivot_table mengambil keputusan itu dengan aggfunc, yaitu mengagregasi
kunci ganda menjadi satu nilai, dan bagian terakhir keluaran di atas
memperlihatkan hasilnya tetap benar setelah satu baris diduplikasi. Pilihan
aggfunc adalah keputusan analisis, karena mean, sum, atau count menjawab
pertanyaan yang berbeda atas data yang sama, dan fill_value menyertai kunci
kombinasi yang tidak memiliki data.
Pola yang nyata adalah pivot_table langsung pada data mentah untuk
membuat matriks ringkasan, misalnya rata-rata PM2.5 per stasiun per hari,
dan hasilnya yang berbentuk lebar siap ditempel ke laporan.
Bentuk pada dataset utama jalur ini#
Dataset ukuran_udara.csv sudah berbentuk panjang sejak lahirnya, karena satu
baris mewakili satu pengukuran pada satu stasiun dan satu waktu, dan
granularitasnya jelas. Kebutuhan mengubah bentuknya muncul pada dua tempat,
yaitu saat ringkasan per stasiun per ukuran disusun untuk laporan, dan saat
grafik membandingkan dua stasiun sebagai garis terpisah.
Sebaliknya, laporan harian yang berbentuk lebar dengan satu kolom per stasiun justru paling nyaman bagi pembacanya, dan keduanya sah selama granularitas tidak tertukar. Kesalahan yang paling mahal adalah menambahkan baris ringkasan ke dalam tabel mentah, sebab bentuknya berubah tanpa kolom yang menandai, dan agregasi berikutnya menghitung ulang ringkasan itu sebagai data.
Keputusan bentuk juga bersinggungan dengan penggabungan sumber pada topik
berikutnya, karena dua tabel yang akan digabung harus berbagi kunci pada
bentuk yang sama, dan melt sering menjadi langkah persiapannya.
Kesalahan umum#
Kesalahan pertama adalah melt tanpa id_vars yang lengkap, sehingga kolom
identitas ikut terlipat dan hasilnya tidak dapat disusun kembali. Daftar
kolom identitas dicatat sebelum melipat, dan uji mundur dengan pivot
menyusun kembali bentuk awal sebagai pemeriksaannya.
Kesalahan kedua adalah memakai pivot pada data yang kuncinya belum jelas
unik, lalu menangkap errornya dengan pivot_table tanpa memikirkan
aggfunc. Nilai rata-rata yang menyembunyikan dua pengukuran yang
berlawanan arah adalah kesimpulan yang menyesatkan, sedangkan pemeriksaan
duplicated pada kunci menjelaskan apa yang sebenarnya terjadi.
Kesalahan ketiga adalah mengira satu bentuk selalu benar. Laporan yang memaksa pembaca membaca tabel panjang dan analisis yang memaksa kode mengerjakan tabel lebar sama-sama boros, dan perpindahannya satu fungsi, sehingga pilihan yang tepat hampir selalu murah.
Ringkasan#
- Bentuk panjang untuk mesin dan bentuk lebar untuk manusia, dan aturan praktisnya adalah mengerjakan panjang lalu menampilkan lebar.
meltmelipat kolom ukuran menjadi pasangan nama-nilai denganid_varssebagai identitas, dan agregasi menjadi satu baris kode.pivotmenolak kunci ganda secara tegas, sedangkanpivot_tablemengagregasinya denganaggfuncyang dipilih sebagai keputusan analisis.- Dataset utama jalur ini lahir panjang dengan granularitas jelas, dan perubahan bentuk dilakukan pada titik kebutuhan yang disengaja.
Referensi#
- Reshaping and pivot tables — pandas documentation
—
dokumentasi resmi
melt,pivot, danpivot_table. - Tidy Data — Journal of Statistical Software — makalah rujukan tentang bentuk panjang dan prinsip data yang rapi.