Pengubahan Bentuk Tabel

Melt dan pivot, serta keputusan antara format panjang dan lebar.

Daftar isi

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.

KebutuhanBentuk yang cocokAlasannya
Laporan yang dibaca manusialebarsetiap ukuran berdiri sebagai kolom
Agregasi dan segmentasipanjanggroupby bekerja atas pasangan kunci-nilai
Grafik seabornpanjanghue dan x menunjuk satu kolom
Gabungan antar tabelpanjangkunci 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.

python pengubahan_bentuk.py
"""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())
text Keluaran
  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.9

Tabel 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.
  • melt melipat kolom ukuran menjadi pasangan nama-nilai dengan id_vars sebagai identitas, dan agregasi menjadi satu baris kode.
  • pivot menolak kunci ganda secara tegas, sedangkan pivot_table mengagregasinya dengan aggfunc yang dipilih sebagai keputusan analisis.
  • Dataset utama jalur ini lahir panjang dengan granularitas jelas, dan perubahan bentuk dilakukan pada titik kebutuhan yang disengaja.

Referensi#