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:
| Dunia | Baris | Kolom |
|---|---|---|
| Statistika | observasi | variabel |
| Machine learning | sample / contoh | feature / fitur |
| Basis data | record / baris | field / kolom |
| pandas | baris (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:
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:
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 rupiahMari kita telaah baris-baris kode di atas:
- Dua DataFrame terpisah:
produkmenyimpan data master menu (tiga baris, satu menu satu baris),transaksimenyimpan empat peristiwa pembelian. Kolomid_produkhadir di keduanya sebagai jembatan. merge(produk, on="id_produk")mencocokkan setiap baristransaksidengan barisprodukyangid_produk-nya sama, lalu menempelkan seluruh kolomproduk(nama, harga) ke baris tersebut. Hasilnya tabel kaya yang siap dihitung.- Kolom
total_rupiahdihitung dari hasil gabungan:jumlahdikaliharga_rupiah. Inilah keuntungan nyata relasi: kolom turunan lahir hanya saat dibutuhkan, sumber tetap satu. .sum()menjumlahkan seluruh transaksi menjadi pendapatan — angka yang mustahil dihitung dari tabeltransaksisaja 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:
| Gaya | Satu baris mewakili | Cocok untuk |
|---|---|---|
| Lebar (wide) | satu pelanggan lengkap | dibaca manusia, tabel pivot |
| Panjang (long) | satu pengukuran | disimpan 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 .