Pada section sebelumnya kita menuntaskan pembersihan data, sehingga tabel transaksi Toko Kopi Kita kini rapi dan siap diolah. Namun sebelum menulis baris kode analisis pertama, ada satu langkah yang sering dilewati: merumuskan pertanyaan. Eksplorasi data tanpa pertanyaan ibarat berbelanja di pasar tanpa daftar keperluan — kita pulang membawa banyak barang, tetapi bukan yang sebenarnya kita butuhkan. Chapter ini melatih kita mengubah tujuan bisnis menjadi pertanyaan analisis yang terukur, lalu menguji pertanyaan tersebut terhadap kolom yang benar-benar tersedia di dataset.

Dari Tujuan Bisnis ke Pertanyaan Analisis #

Tujuan bisnis jarang datang dalam bentuk pertanyaan data. Pemilik Toko Kopi Kita datang dengan keinginan seperti “penjualan harus naik” atau “pelanggan setia harus bertambah”. Kalimat semacam itu belum bisa dijawab kode karena belum menyebutkan ukuran, batas waktu, dan pembanding. Tugas kita sebagai analis adalah menerjemahkannya menjadi pertanyaan analisis — kalimat yang menyebutkan variabel, satuan, dan periode secara eksplisit.

Alur penerjemahannya berjalan dalam tiga langkah. Pertama, tetapkan ukuran: apa yang dihitung — gelas terjual, rupiah, atau jumlah kunjungan. Kedua, tentukan pembanding: hasil dibandingkan per apa — per menu, per pelanggan, per hari, atau per kota. Ketiga, batasi periode: minggu ini versus minggu lalu, atau Januari versus Februari. Tiga langkah tersebut mengubah keinginan yang mengambang menjadi hitungan yang bisa dieksekusi.

Tujuan bisnisPertanyaan analisis yang siap dijawab data
“Penjualan harus naik”Menu mana yang menyumbang pendapatan terbesar sepanjang Januari 2025?
“Pelanggan setia harus bertambah”Pelanggan mana yang bertransaksi tiga kali atau lebih dalam sebulan terakhir?
“Stok jangan sering kosong”Menu apa yang paling sering habis sebelum sore hari?
“Promo berikutnya harus efektif”Bagaimana rata-rata nilai transaksi sebelum dibanding sesudah periode promo?

Perhatikan bahwa setiap pertanyaan pada kolom kanan menyebutkan angka atau pembanding yang konkret. Pertanyaan semacam itu bisa dijawab dengan groupby, value_counts, atau perbandingan antar periode — teknik-teknik yang akan kita kuasai sepanjang section ini.

Pertanyaan Terukur vs Pertanyaan Samar #

Pertanyaan yang baik memenuhi tiga kriteria: spesifik (menyebut subjek dan wilayah), terukur (punya ukuran dan satuan), dan terikat data (kolomnya tersedia atau bisa dikumpulkan). Tabel berikut memperlihatkan beberapa pertanyaan samar beserta versi terukurnya:

Pertanyaan samarVersi terukurYang berubah
“Menu apa yang paling laku?”“Berapa total gelas terjual tiap menu selama Januari 2025?”Menyebut ukuran (gelas) dan periode
“Apakah pelanggan suka menu baru?”“Berapa rata-rata rating menu baru pada 30 hari sejak diluncurkan?”Mengganti kesan pribadi dengan angka
“Kopi susu laris di Bandung?”“Berapa proporsi transaksi kopi susu dari seluruh transaksi cabang Bandung bulan ini?”Menambah pembanding yang eksplisit

Mengapa penerjemahan ini penting? Karena dua orang yang menjawab pertanyaan samar akan memilih cara dan data yang berbeda, lalu berdebat tanpa titik temu. Sebaliknya, pertanyaan terukur punya satu jawaban yang sama siapa pun yang menghitungnya — dan itulah yang membuat hasil analisis dapat direproduksi serta dipertanggungjawabkan.

Menguji Pertanyaan terhadap Data #

Pertanyaan terbaik sekalipun gagal bila kolom yang dibutuhkannya tidak tersedia. Karena itu langkah terakhir perumusan adalah menguji pertanyaan terhadap dataset: apakah variabel yang disebutnya benar-benar ada? Dua contoh berikut memakai catatan transaksi sederhana Toko Kopi Kita dengan kolom pelanggan, menu, dan nilai_ribu (nilai transaksi dalam ribuan rupiah).

Pertanyaan pertama: “Berapa frekuensi kunjungan dan rata-rata belanja tiap pelanggan?” — dua ukuran itu persis tersedia di tabel:

python
import pandas as pd

transaksi = pd.DataFrame({
    "pelanggan": ["Budi", "Siti", "Dewi", "Agus", "Rani",
                  "Budi", "Siti", "Dewi", "Budi", "Siti"],
    "menu": ["kopi susu", "teh tawar", "kopi susu", "matcha latte", "teh tawar",
             "matcha latte", "kopi susu", "teh tawar", "teh tawar", "kopi susu"],
    "nilai_ribu": [24, 40, 48, 28, 20, 28, 24, 40, 20, 48],
})

print("Pertanyaan: frekuensi kunjungan dan rata-rata belanja per pelanggan?")
print(transaksi.groupby("pelanggan")["nilai_ribu"].agg(["count", "mean"]))

Output yang Dihasilkan:

text
Pertanyaan: frekuensi kunjungan dan rata-rata belanja per pelanggan?
           count       mean
pelanggan                  
Agus           1  28.000000
Budi           3  24.000000
Dewi           2  44.000000
Rani           1  20.000000
Siti           3  37.333333

Mari kita telaah baris-baris kode di atas:

  1. Baris 3-8 (transaksi = pd.DataFrame({...})): DataFrame dibangun dari dictionary tiga list sejajar — sepuluh transaksi, masing-masing mencatat pelanggan, menu yang dibeli, dan nilai transaksinya dalam ribuan rupiah.
  2. Baris 12 (groupby("pelanggan")): sepuluh baris dibagi menjadi lima kelompok menurut nama pelanggan; setiap kelompok kemudian dihitung terpisah.
  3. Baris 12 (.agg(["count", "mean"])): dua ukuran dihitung sekaligus — count adalah frekuensi kunjungan, mean adalah rata-rata belanja per kunjungan. Satu ekspresi menjawab pertanyaan dua ukuran.

Hasilnya langsung terbaca sebagai bahan keputusan: Budi dan Siti paling sering datang (tiga kali), sedangkan Dewi mencatat rata-rata belanja terbesar (44 ribu rupiah). Kalau tujuan bisnisnya menjaga pelanggan rajin, Budi dan Siti prioritasnya; kalau menaikkan nilai transaksi, Dewi patut diberi perhatian. Satu tabel kecil, dua arah keputusan berbeda — karena pertanyaannya dirumuskan terukur sejak awal.

Pertanyaan kedua sengaja kita pilih yang tidak bisa dijawab: “Mengapa pelanggan memilih menu itu?” Kode berikut memeriksa apa yang tersedia lalu menangkap galat saat kolom penyebabnya dicari:

python
import pandas as pd

# Tabel yang sama kita bangun kembali agar blok ini bisa dijalankan mandiri.
transaksi = pd.DataFrame({
    "pelanggan": ["Budi", "Siti", "Dewi", "Agus", "Rani",
                  "Budi", "Siti", "Dewi", "Budi", "Siti"],
    "menu": ["kopi susu", "teh tawar", "kopi susu", "matcha latte", "teh tawar",
             "matcha latte", "kopi susu", "teh tawar", "teh tawar", "kopi susu"],
    "nilai_ribu": [24, 40, 48, 28, 20, 28, 24, 40, 20, 48],
})

print("Kolom yang tersedia:", transaksi.columns.tolist())

try:
    transaksi["alasan_memilih"]
except KeyError as e:
    print("Pertanyaan 'mengapa' menabrak kolom yang tidak ada:", e)

Output yang Dihasilkan:

text
Kolom yang tersedia: ['pelanggan', 'menu', 'nilai_ribu']
Pertanyaan 'mengapa' menabrak kolom yang tidak ada: 'alasan_memilih'

Tabel transaksi hanya mencatat perilaku — siapa membeli apa dan berapa nilainya. Tidak ada kolom alasan_memilih, sehingga pertanyaan “mengapa” tidak memiliki bahan jawaban. Ada dua jalan keluar yang jujur: mengumpulkan data baru (survei atau wawancara singkat saat pembayaran), atau mengubah pertanyaan menjadi yang dapat dijawab kolom yang ada, misalnya “menu apa yang paling sering dibeli pelanggan yang datang tiga kali atau lebih?”.

Rangkuman #

  • Tujuan bisnis perlu diterjemahkan menjadi pertanyaan analisis yang menyebutkan ukuran, pembanding, dan periode secara eksplisit.
  • Pertanyaan yang baik bersifat spesifik, terukur, dan terikat data; pertanyaan samar menghasilkan jawaban yang tidak bisa direproduksi.
  • Selalu uji pertanyaan terhadap columns yang tersedia sebelum menganalisis; kolom yang tidak ada berarti pertanyaan harus diubah atau datanya harus dikumpulkan.
  • Satu tabel ringkasan yang tepat sasaran dapat mengarahkan dua keputusan berbeda — frekuensi kunjungan dan nilai belanja adalah dua ukuran loyalitas yang berbeda.

Dengan daftar pertanyaan di tangan, langkah berikutnya adalah mengenal medan: bagaimana bentuk dataset yang akan menjawabnya — berapa barisnya, kolom apa saja, dan tipe data apa yang dikandungnya. Kita bedah struktur dataset secara sistematis pada chapter berikutnya, Memahami Struktur Dataset .

Referensi #

  1. pandas — Getting Started: Intro Tutorials
  2. pandas — User Guide