Struktur tabular adalah wajah data yang paling akrab: tabel transaksi di spreadsheet, tabel pelanggan di aplikasi kasir, tabel harga di kertas menu. Akan tetapi akrab tidak selalu berarti terbaca — banyak orang menatap tabel setiap hari tanpa pernah menyebut nama bagiannya, padahal istilah-istilah itu (baris, kolom, kunci, relasi) dipakai nonstop di seluruh dokumentasi pandas dan machine learning. Chapter ini membedah anatomi tabel data sampai ke istilah setiap bagiannya, memakai dua tabel kecil milik Toko Kopi Kita yang saling berhubungan.

Anatomi Tabel: Baris dan Kolom #

Dua arah tabel memuat dua hal yang berbeda. Baris merekam satu observasi — satu peristiwa atau satu objek yang diamati utuh: satu transaksi, satu pelanggan, satu menu. Kolom merekam satu variabel — sifat yang dicatat untuk setiap observasi: waktu transaksi, nama menu, banyak cangkir. Istilah-istilah ini punya padanan di berbagai dunia:

DuniaBarisKolom
Statistikaobservasivariabel
Machine learningsample / contohfeature / fitur
Basis datarecord / barisfield / kolom
pandasbaris (index)kolom (Series)

Konvensi yang kita pegang sepanjang Course: satu baris = satu observasi, satu kolom = satu variabel. Konvensi sederhana ini menjauhkan kita dari dua pelanggaran paling umum di tabel buatan tangan: mencampur dua hal dalam satu sel (misalnya “2 cangkir + roti” dalam kolom jumlah) dan mencampur dua jenis observasi dalam satu tabel (transaksi dan pelanggan di baris yang sama).

Primary Key: Kartu Identitas Baris #

Setiap tabel yang sehat memiliki kolom (atau gabungan kolom) yang nilainya unik untuk setiap baris — disebut primary key pada dunia basis data. Fungsinya seperti nomor identitas: id_transaksi T001 menunjuk tepat satu transaksi, id_produk P01 menunjuk tepat satu menu. Dengan kunci, baris bisa dirujuk tanpa ragu meski datanya berubah; tanpa kunci, dua transaksi bernilai sama persis tidak bisa dibedakan dan duplikasi mulai merayap masuk tanpa terdeteksi.

Relasi Antar Tabel dan Penggabungannya #

Tabel yang baik tidak menyalin ulang informasi. Harga kopi susu cukup tersimpan sekali di tabel produk; tabel transaksi hanya menyimpan id_produk sebagai rujukan. Hubungan semacam ini disebut relasi: satu transaksi menunjuk satu produk, satu produk bisa ditunjuk banyak transaksi — relasi banyak-ke-satu. Saat analisis membutuhkan keduanya sekaligus, merge() menggabungkan tabel pada kolom kunci:

python
import pandas as pd

produk = pd.DataFrame({
    "id_produk": ["P01", "P02", "P03"],
    "nama": ["kopi susu", "matcha latte", "teh tawar"],
    "harga_rupiah": [24000, 28000, 20000],
})

transaksi = pd.DataFrame({
    "id_transaksi": ["T001", "T002", "T003", "T004"],
    "id_produk": ["P01", "P02", "P01", "P03"],
    "jumlah": [2, 1, 1, 3],
})

gabung = transaksi.merge(produk, on="id_produk")
gabung["total_rupiah"] = gabung["jumlah"] * gabung["harga_rupiah"]

print(gabung[["id_transaksi", "nama", "jumlah", "harga_rupiah", "total_rupiah"]])
print()
print("Pendapatan:", gabung["total_rupiah"].sum(), "rupiah")

Output yang Dihasilkan:

text
  id_transaksi          nama  jumlah  harga_rupiah  total_rupiah
0         T001     kopi susu       2         24000         48000
1         T002  matcha latte       1         28000         28000
2         T003     kopi susu       1         24000         24000
3         T004     teh tawar       3         20000         60000

Pendapatan: 160000 rupiah

Mari kita telaah baris-baris kode di atas:

  1. Dua DataFrame terpisah: produk menyimpan data master menu (tiga baris, satu menu satu baris), transaksi menyimpan empat peristiwa pembelian. Kolom id_produk hadir di keduanya sebagai jembatan.
  2. merge(produk, on="id_produk") mencocokkan setiap baris transaksi dengan baris produk yang id_produk-nya sama, lalu menempelkan seluruh kolom produk (nama, harga) ke baris tersebut. Hasilnya tabel kaya yang siap dihitung.
  3. Kolom total_rupiah dihitung dari hasil gabungan: jumlah dikali harga_rupiah. Inilah keuntungan nyata relasi: kolom turunan lahir hanya saat dibutuhkan, sumber tetap satu.
  4. .sum() menjumlahkan seluruh transaksi menjadi pendapatan — angka yang mustahil dihitung dari tabel transaksi saja karena tabel tersebut tidak memuat harga.

Format Lebar dan Panjang #

Tabel yang sama bisa diletakkan dua gaya. Format lebar (wide) meletakkan satu observasi per baris dengan kolom per periode: satu baris pelanggan, kolom belanja Januari, Februari, Maret. Format panjang (long) meletakkan satu observasi per pasangan pelanggan-bulan: kolomnya cukup pelanggan, bulan, belanja, dan jumlah barisnya bertambah. Ringkasnya:

GayaSatu baris mewakiliCocok untuk
Lebar (wide)satu pelanggan lengkapdibaca manusia, tabel pivot
Panjang (long)satu pengukurandisimpan dan diolah komputer

Pilihan gaya menentukan kemudahan analisis, dan pandas menyediakan alat untuk berpindah antar keduanya. Kita latih konversinya nanti pada Section Data Cleaning bersama operasi pembentukan ulang data lainnya.

Rangkuman #

  • Anatomi tabel: baris = observasi/record, kolom = variabel/fitur; konvensi satu baris satu observasi menjaga tabel tetap sehat.
  • Primary key adalah kolom bernilai unik yang menjadi identitas baris; relasi antar tabel dibangun di atas kunci bersama.
  • merge() menggabungkan dua tabel pada kolom kunci sehingga informasi tidak perlu disalin berulang dan kolom turunan dihitung saat dibutuhkan.
  • Format lebar enak dibaca manusia, format panjang enak diolah mesin; keduanya representasi data yang sama.

Tabel yang baris-kolomnya tertata seperti di atas adalah wujud data terstruktur — tetapi tidak semua data datang setertib itu. Ada data yang berlabel tapi bebas bentuk, ada pula yang sama sekali tanpa kerangka. Kita susuri spektrumnya pada chapter berikutnya, Data Terstruktur dan Tidak Terstruktur .

Referensi #

  1. pandas — DataFrame.merge
  2. pandas — User Guide