Setiap proyek analisis yang berhasil dimulai dari masalah yang dipahami, bukan dari data yang tersedia. Pada proyek ini kita berperan sebagai analis yang diminta tolong oleh Bu Rina, pemilik kafe Toko Kopi Kita di Bandung. Beliau punya tumpukan data penjualan dari aplikasi kasir, tetapi keputusan sehari-harinya masih diambil dari ingatan. Bagian ini memetakan masalah bisnisnya, menetapkan tujuan proyek yang terukur, dan menyepakati batasan data — semuanya sebelum kita menulis satu baris kode analisis.

Kafe Bu Rina dan Kebiasaan Lama #

Toko Kopi Kita adalah kafe kecil di dekat kawasan kampus di Bandung. Tempat ini menjual empat menu andalan: kopi susu, matcha latte, americano, dan teh tawar. Setiap transaksi tercatat di aplikasi kasir, dan setiap malam Bu Rina bisa mengekspor catatan tersebut menjadi berkas CSV. Perangkat pencatatnya sudah bagus; yang belum ada adalah kebiasaan membaca datanya.

Akibatnya, keputusan penting berjalan dengan perkiraan. Bu Rina menentukan jumlah belanja susu dan jadwal pegawai dari perasaan: “Sepertinya Sabtu memang ramai.” Kebiasaan ini pernah menimbulkan dua masalah nyata. Pertama, susu segar kehabisan pada Sabtu sore ketika pelanggan sedang banyak, sehingga sebagian pesanan kopi susu tidak bisa dibuat. Kedua, bahan matcha kerap tersisa banyak di hari sepi hingga akhirnya terbuang. Kedua masalah itu bukan karena data tidak ada, melainkan karena data tidak pernah dibaca dengan cara yang bisa dijadikan dasar keputusan.

Tujuan Proyek dan Kegagalan yang Dicegah #

Proyek ini tidak berusaha menjawab semua hal. Kita fokus pada empat tujuan yang langsung berhubungan dengan keputusan harian Bu Rina, dan tiap tujuan dipasangkan dengan kegagalan yang ingin dicegah:

Tujuan proyekKegagalan yang dicegah
Mengukur kontribusi tiap menu terhadap pendapatanBelanja bahan dibagi rata untuk semua menu padahal kontribusinya timpang
Mengenali pola hari ramai dan hari sepiStok dan jadwal pegawai tidak menyesuaikan akhir pekan
Mendokumentasikan anomali penurunan penjualanHari sepi sekali terjadi langsung dianggap tren buruk
Menyusun rekomendasi stok berbasis angkaKeputusan tetap bergantung pada ingatan pemilik

Ruang lingkup yang hanya ada di kepala akan memudar di tengah pengerjaan. Karena itu kita tuliskan sebagai struktur data yang nantinya bisa dirujuk kembali oleh skrip pipeline — mulai dari identitas proyek, sumber data, hingga daftar tujuan:

python
proyek = {
    "nama": "Analisis Penjualan Toko Kopi Kita",
    "pemilik": "Bu Rina",
    "periode": "5-16 Januari 2026 (12 hari)",
    "sumber_data": "ekspor aplikasi kasir (data/penjualan_kotor.csv)",
    "menu": ["kopi susu", "matcha latte", "americano", "teh tawar"],
    "tujuan": [
        "mengukur kontribusi tiap menu terhadap pendapatan",
        "mengenali pola hari ramai dan hari sepi",
        "mendokumentasikan anomali penurunan penjualan",
        "menyusun rekomendasi stok yang berbasis angka",
    ],
}

print(f"Proyek     : {proyek['nama']}")
print(f"Pemilik    : {proyek['pemilik']} (Toko Kopi Kita, Bandung)")
print(f"Periode    : {proyek['periode']}")
print(f"Sumber     : {proyek['sumber_data']}")
print(f"Jumlah menu: {len(proyek['menu'])} -> {', '.join(proyek['menu'])}")
print("Tujuan proyek:")
for nomor, tujuan in enumerate(proyek["tujuan"], start=1):
    print(f"  {nomor}. {tujuan}")

Output yang Dihasilkan:

text
Proyek     : Analisis Penjualan Toko Kopi Kita
Pemilik    : Bu Rina (Toko Kopi Kita, Bandung)
Periode    : 5-16 Januari 2026 (12 hari)
Sumber     : ekspor aplikasi kasir (data/penjualan_kotor.csv)
Jumlah menu: 4 -> kopi susu, matcha latte, americano, teh tawar
Tujuan proyek:
  1. mengukur kontribusi tiap menu terhadap pendapatan
  2. mengenali pola hari ramai dan hari sepi
  3. mendokumentasikan anomali penurunan penjualan
  4. menyusun rekomendasi stok yang berbasis angka

Mari kita bedah kode di atas:

  1. Kamus proyek: seluruh informasi konteks disimpan dalam satu kamus dengan kunci yang jelas. Struktur ini mudah diperluas — misalnya menambah kunci batasan — tanpa mengubah bentuk kode pembacanya.
  2. ', '.join(proyek['menu']): menggabungkan daftar menu menjadi satu kalimat yang rapi dibaca, bukan cetakan list mentah dari Python.
  3. enumerate(..., start=1): memberi nomor urut pada tujuan mulai dari 1, selaras dengan kebiasaan penomoran manusia.
  4. Kenapa dalam kode? Identitas proyek yang tertulis di dalam skrip ikut menjaga kejujuran pipeline: siapa pemiliknya, periode apa yang dianalisis, dan dari berkas mana datanya berasal tidak akan tertukar saat skrip dijalankan ulang berbulan-bulan kemudian.

Batasan Data yang Disepakati #

Kita juga perlu jujur tentang apa yang tidak bisa dijawab oleh data ini. Periode datanya hanya 12 hari (5-16 Januari 2026), dari satu gerai, empat menu, tanpa catatan cuaca, tanpa identitas pelanggan, dan tanpa harga belanja bahan baku. Konsekuensinya ada tiga. Pertama, temuan kita berlaku sebagai pola awal dua pekan, bukan hukum musiman tahunan. Kedua, kita tidak bisa membedakan pelanggan setia dan pelanggan baru. Ketiga, rekomendasi stok akan berbentuk perkiraan kebutuhan harian, bukan kontrak pasti dengan pemasok. Batasan seperti ini sebaiknya disepakati di awal supaya laporan akhir tidak menjanjikan hal yang tidak ditopang datanya.

Dengan masalah, tujuan, dan batasan yang sudah tertulis, langkah berikutnya adalah mengubah keluhan Bu Rina menjadi pertanyaan analisis yang terukur — pertanyaan yang bisa dijawab langsung oleh kolom-kolom data yang kita miliki. Kita kerjakan pada Bagian 2: Menentukan Pertanyaan Analisis .