Sepanjang section ini kita mempraktikkan hampir semua cara memindahkan data ke Python: formulir manual, berkas CSV, Excel, JSON, API, database, halaman web, sampai peta geospasial. Setiap berkas yang berhasil dikumpulkan membawa pertanyaan yang tidak tertulis di dalamnya: dari mana data ini berasal, kapan diambil, boleh dipakai untuk apa, dan apa yang sudah kita lakukan padanya? Tanpa jawaban tertulis, analisis yang kelihatan rapi berdiri di atas ingatan orang — dan ingatan cepat memudar. Pada chapter penutup section ini kita membiasakan diri mencatat asal data (provenance): definisinya, alasan pentingnya, isi catatannya, dan praktik membangunnya dengan pandas.

Apa itu Provenance #

Dalam data science, provenance adalah catatan asal-usul sekaligus perjalanan data — dari sumber pertamanya sampai bentuk yang sedang kita analisis. Catatan ini punya dua lapis. Lapis pertama mencatat asal data: siapa penerbitnya, dari alamat mana diambil, kapan, dengan cara apa, dan dengan ketentuan pemakaian apa. Lapis kedua mencatat jejak transformasi: langkah-langkah apa saja yang sudah diterapkan pada data setelah diterima, dari pembacaan berkas mentah sampai tabel akhir.

Ibaratkan label pada kemasan produk: produsen, tanggal produksi, dan komposisi tercetak jelas sehingga siapa pun yang memegang kemasan tahu isinya tanpa harus menelepon pembuatnya. Provenance berperan sama bagi data — siapa pun yang membuka proyek kita, termasuk diri kita sendiri tiga bulan kemudian, bisa menjawab “data ini dari mana” tanpa menebak-nebak.

Mengapa Pencatatan Ini Penting #

Tiga kebutuhan nyata yang dilayani oleh pencatatan asal data:

TujuanPertanyaan yang dijawabTanpa provenance
Audit“Angka laporan ini berasal dari mana?”penelusuran berhenti di folder penuh berkas serupa
Reproduksibilitas“Bisakah analisis ini diulang dengan hasil sama?”tidak ada yang tahu versi data mana yang dipakai
Kepercayaan“Bolehkah data ini dipakai dan dipublikasikan?”lisensi serta batasan pemakaian tidak ketahuan

Bayangkan skenario berikut: tiga bulan setelah laporan penjualan beredar, seorang rekan mempertanyakan satu angka. Bila catatan asal data tertata, kita menjawab dalam hitungan menit — cukup buka tabel catatan, sebut sumber dan tanggalnya, lalu tunjukkan jejak transformasinya. Bila catatan tidak ada, kita menggali folder, membandingkan berkas serupa satu per satu, dan tetap tidak yakin mana yang dipakai saat itu. Selisihnya bukan soal kecerdasan, melainkan kebiasaan mencatat.

Apa yang Dicatat #

Isi catatan provenance yang memadai untuk proyek analisis adalah tujuh hal berikut:

  • Sumber — siapa yang menerbitkan data: lembaga, sistem, atau orang.
  • URL atau lokasi berkas — alamat persis pengambilan: tautan unduhan, endpoint API, atau nama tabel di database.
  • Tanggal ambil — kapan data diambil; data daring berubah seiring waktu sehingga tanggal menentukan versi yang kita pegang.
  • Metode — bagaimana data diambil: ekspor manual, unduh CSV, panggilan API, web scraping.
  • Versi — penanda rilis data bila penerbitnya membedakan versi.
  • Lisensi — ketentuan pemakaian: terbuka, perlu atribusi, atau terbatas untuk keperluan internal.
  • Transformasi — langkah apa saja yang diterapkan setelah data diterima.

Format pencatatannya tidak memerlukan alat khusus. Dua bentuk sederhana yang memadai untuk proyek kecil hingga menengah: sebuah tabel DATA_SOURCES — satu berkas kecil (CSV atau Markdown) di folder proyek, satu baris per dataset — atau sebuah kolom sumber_data pada dataset itu sendiri, bila tiap baris bisa berasal dari sumber yang berbeda. Prinsipnya satu: catatan harus bisa dibaca ulang tanpa penjelasan tambahan dari pembuatnya. Kumpulan dataset terbuka seperti datasets di GitHub mencontohkan praktik ini — setiap dataset menyertakan deskripsi sumber dan lisensi pada berkas keterangannya.

Praktik: Tabel Provenance Mini #

Saatnya membangun catatan untuk proyek latihan Toko Kopi Kita. Agar catatan bisa dipakai ulang oleh skrip mana pun, seluruhnya kita simpan sebagai modul kecil catatan_data.py berisi dua fungsi — pembangun tabel provenance dan pembangun log transformasi — dengan pola “modul sendiri” dari chapter Fungsi dan Modul :

python
"""Catatan asal data (provenance) untuk proyek latihan Toko Kopi Kita."""

import pandas as pd


def buat_provenance():
    """Kembalikan tabel asal seluruh dataset yang dipakai proyek."""
    return pd.DataFrame(
        {
            "nama_dataset": ["penjualan_harian", "cuaca_kota", "batas_kecamatan"],
            "sumber": ["ekspor aplikasi kasir", "API cuaca kota (contoh)", "berkas kecamatan.geojson"],
            "tanggal_ambil": ["2026-01-15", "2026-01-15", "2026-01-15"],
            "metode": ["unduh CSV", "permintaan GET", "baca GeoJSON"],
            "lisensi": ["milik sendiri", "terbuka, sebut sumber", "contoh latihan"],
        }
    )


def buat_log_transformasi():
    """Kembalikan jejak transformasi dari penjualan mentah ke bersih."""
    langkah = [
        {"urutan": 1, "langkah": "baca penjualan_mentah.csv", "baris": 520},
        {"urutan": 2, "langkah": "hapus 8 baris duplikat", "baris": 512},
        {"urutan": 3, "langkah": "buang 5 transaksi uji kasir", "baris": 507},
        {"urutan": 4, "langkah": "seragamkan format tanggal", "baris": 507},
        {"urutan": 5, "langkah": "simpan penjualan_bersih.csv", "baris": 507},
    ]
    return pd.DataFrame(langkah)

Fungsi pertama membangun tabel dari dictionary berisi daftar nilai per kolom; fungsi kedua membangun tabel dari list berisi dictionary — dua pola pembentukan DataFrame pada tutorial intro pandas . Sekarang kita cetak tabel provenance-nya:

python
from catatan_data import buat_provenance

provenance = buat_provenance()
print(provenance.to_string(index=False))

Output yang Dihasilkan:

text
    nama_dataset                   sumber tanggal_ambil         metode               lisensi
penjualan_harian    ekspor aplikasi kasir    2026-01-15      unduh CSV         milik sendiri
      cuaca_kota  API cuaca kota (contoh)    2026-01-15 permintaan GET terbuka, sebut sumber
 batas_kecamatan berkas kecamatan.geojson    2026-01-15   baca GeoJSON        contoh latihan

Mari kita bedah isi tabel dan caranya dicetak:

  1. Baris 3 (buat_provenance()): tabel berisi tiga dataset proyek; baris batas_kecamatan merujuk berkas GeoJSON yang kita pakai pada chapter Pengambilan Data Geospasial .
  2. Kolom tanggal_ambil: seluruhnya dibekukan ke 2026-01-15 agar keluaran contoh selalu sama — pada proyek nyata, isi tanggal pengambilan yang sebenarnya, dan biarkan nilainya string agar formatnya tidak berubah.
  3. Baris 4 (to_string(index=False)): dengan lima kolom, print() biasa memotong tampilan; to_string(index=False) mencetak seluruh kolom tanpa indeks supaya catatan terbaca utuh.

Mencatat Jejak Transformasi #

Lapis kedua provenance adalah log langkah-langkah yang berantai: setiap operasi pembersihan atau pengolahan dicatat satu baris — urutannya, deskripsinya, dan jumlah baris hasilnya. Fungsi buat_log_transformasi() di atas sudah menyimpan contohnya; kita cetak:

python
from catatan_data import buat_log_transformasi

log = buat_log_transformasi()
print(log)

Output yang Dihasilkan:

text
   urutan                      langkah  baris
0       1    baca penjualan_mentah.csv    520
1       2       hapus 8 baris duplikat    512
2       3  buang 5 transaksi uji kasir    507
3       4    seragamkan format tanggal    507
4       5  simpan penjualan_bersih.csv    507

Bacaannya mengikuti alur kerja nyata: berkas mentah dibaca dengan 520 baris, delapan baris duplikat dihapus menjadi 512, lima transaksi uji kasir dibuang menjadi 507, lalu format tanggal diseragamkan — langkah yang mengubah isi tanpa mengubah jumlah baris — sebelum hasilnya disimpan sebagai penjualan_bersih.csv. Angka baris yang berhenti menurun bukan pertanda ada langkah yang terlewat; langkah keempat memang bersifat perbaikan isi, bukan pengurangan baris. Dengan log seperti ini, siapa pun dapat mengulang rantai langkah yang sama dan membandingkan hasilnya — inti dari reproduksibilitas.

Rekonstruksi Asal Data #

Guna sesungguhnya dari kedua catatan itu muncul ketika pertanyaan datang: “data cuaca ini dari mana?” atau “mengapa laporan hanya memuat 507 baris padahal sistem mencatat 520?” Kita jawab dengan satu fungsi kecil yang membaca tabel provenance, lalu merangkai log transformasi menjadi satu kalimat perjalanan:

python
from catatan_data import buat_log_transformasi, buat_provenance

provenance = buat_provenance()
log = buat_log_transformasi()


def telusuri_asal(tabel, nama_dataset):
    """Ringkas asal sebuah dataset dari tabel provenance."""
    tercatat = nama_dataset in tabel["nama_dataset"].tolist()
    if not tercatat:
        return f"{nama_dataset}: tidak tercatat, periksa ulang sumbernya."
    baris = tabel[tabel["nama_dataset"] == nama_dataset].iloc[0]
    return (
        f"{nama_dataset}: diambil {baris['tanggal_ambil']} dari "
        f"{baris['sumber']} ({baris['metode']}; lisensi: {baris['lisensi']})."
    )


for nama in ["penjualan_harian", "cuaca_kota", "stok_gudang"]:
    print(telusuri_asal(provenance, nama))

print()
print("Jejak transformasi penjualan_harian:")
print(" -> ".join(log["langkah"]))

Output yang Dihasilkan:

text
penjualan_harian: diambil 2026-01-15 dari ekspor aplikasi kasir (unduh CSV; lisensi: milik sendiri).
cuaca_kota: diambil 2026-01-15 dari API cuaca kota (contoh) (permintaan GET; lisensi: terbuka, sebut sumber).
stok_gudang: tidak tercatat, periksa ulang sumbernya.

Jejak transformasi penjualan_harian:
baca penjualan_mentah.csv -> hapus 8 baris duplikat -> buang 5 transaksi uji kasir -> seragamkan format tanggal -> simpan penjualan_bersih.csv

Dua baris pertama langsung menjawab pertanyaan audit: sumber, tanggal, metode, dan lisensi hadir dalam satu kalimat. Baris ketiga memperlihatkan penjagaannya — stok_gudang memang tidak ada di tabel, dan alih-alih menebak, fungsi menyatakan bahwa dataset tersebut tidak tercatat. Alur fungsinya sendiri memakai dua pola lama: penyaringan baris dengan mask boolean (tabel["nama_dataset"] == nama_dataset) dan pengambilan baris pertama hasilnya lewat iloc[0]. Terakhir, " -> ".join(log["langkah"]) merangkai kolom deskripsi menjadi satu rantai perjalanan yang utuh — dalam sekejap, asal dan riwayat penjualan_harian terjawab tanpa membuka satu berkas data pun.

Rangkuman #

  • Provenance adalah catatan asal-usul sekaligus perjalanan data: lapis asal data (sumber, lokasi, tanggal, metode, versi, lisensi) dan lapis jejak transformasi.
  • Pencatatan ini melayani audit, reproduksibilitas, dan kepercayaan — tanpa catatan, penelusuran berhenti di tumpukan berkas.
  • Formatnya sederhana: tabel DATA_SOURCES atau kolom sumber_data; log transformasi cukup satu baris per langkah beserta jumlah barisnya.
  • Catatan yang tersimpan sebagai berkas dapat dibaca ulang oleh siapa pun: satu fungsi kecil sudah cukup untuk merangkum asal dan riwayat sebuah dataset.
  • Kebiasaannya dimulai saat pengambilan data, bukan saat data dipertanyakan.

Dengan provenance, seluruh data yang kita kumpulkan kini punya identitas yang jelas dan bisa ditelusuri. Namun perjalanan data science belum selesai di pengumpulan: data nyata hampir selalu tiba dengan nilai yang hilang, baris duplikat, dan format yang tidak konsisten — seperti 520 baris mentah yang harus menempuh lima langkah sebelum layak dianalisis. Section berikutnya, Data Cleaning , membahas penanganan persoalan-persoalan tersebut secara sistematis.