Pertanyaan terukur dan metrik keberhasilan sudah terpasang; sekarang kita menghadapi bahan bakunya: data. Pada titik ini godaannya adalah melompat langsung ke data yang paling mudah diambil, lalu memaksakannya menjawab pertanyaan yang sebenarnya tidak bisa dijawabnya. Bab ini mengerjakan dua hal secara berurutan: memilih dan mengumpulkan data yang benar, lalu memahami isinya lebih dulu — struktur, lubang, dan keanehannya — sebelum satu analisis pun ditulis. Membaca data sebelum menganalisis terdengar kuno, tetapi justru di sinilah sebagian besar kekeliruan proyek bisa dicegah dengan murah.
Tiga Ujian Data: Relevan, Terwakili, Mencukupi #
Setiap calon data lewat tiga ujian sebelum dipakai. Pertama, relevansi: apakah kolom dan periodenya sungguh menjawab pertanyaan yang dirumuskan? Data transaksi kasir bisa menjawab pertanyaan retensi, tetapi tidak bisa menjawab “mengapa pelanggan pergi” — untuk itu kita butuh data alasan berhenti atau ulasan. Kedua, keterwakilan: apakah sampelnya mewakili populasi yang menjadi sasaran keputusan? Data keanggotaan kedai hanya memuat pelanggan yang mau mendaftar — kelompok yang perilakunya bisa berbeda dari pengunjung lepas. Ketiga, kecukupan: apakah jumlah dan rentang waktunya cukup untuk pola yang dicari? Analisis musiman mingguan butuh data berminggu-minggu, bukan lima hari.
| Ujian | Pertanyaan penguji | Risiko bila gagal |
|---|---|---|
| Relevan | Kolom mana yang menjawab pertanyaan, dan lewat jalur apa? | Analisis rapi atas data yang keliru sasaran |
| Terwakili | Siapa yang tidak masuk sampel, dan apa bedanya dengan yang masuk? | Kesimpulan berlaku hanya pada kelompok sempit |
| Mencukupi | Berapa periode minimum untuk pola yang dicari? | Pola sesaat dibaca sebagai pola tetap |
Ketiga ujian ini dijawab dengan berbicara dengan orang yang mengerti data — kasir yang tahu kapan pencatatan mulai rapi, atau petugas keanggotaan yang tahu insentif pendaftaran. Teknis mengunduh berkas justru bagian termudah; materi lengkap tentang sumber dan teknik pengambilan data sudah kita bahas pada Section Pengumpulan Data , termasuk Sumber Data dan Pencatatan Asal Data .
Data Snapshot dan Data Mengalir #
Dari sisi waktu, data datang dalam dua wujud. Data snapshot adalah potret sekali ambil: berkas ekspor penjualan Desember 2025 yang dibekukan pada saat diekspor. Data mengalir terus bertambah: tabel transaksi yang setiap hari diisi kasir, atau data yang ditarik dari database seperti pada chapter Pengambilan Data dari Database . Bedanya bukan sekadar teknis — dua wujud ini menuntut kebiasaan kerja yang berbeda.
Untuk data snapshot, kebiasaan wajibnya adalah mencatat tanggal pengambilan dan membekukan berkasnya; analisis retensi yang diulang bulan depan atas berkas yang sama harus menghasilkan angka yang sama. Untuk data mengalir, kebiasaan wajibnya adalah menandai batas ambil — “data sampai 31 Januari 2026 pukul 24.00” — supaya analisis yang diulang tidak diam-diam membaca baris baru. Tanpa penanda semacam itu, dua orang di tim bisa mengklaim menganalisis “data Januari” yang isinya berbeda dan berdebat soal angka yang sebenarnya berasal dari dua potret berbeda.
Checklist Kesiapan Data #
Sebelum data dinyatakan siap dianalisis, kita lewati satu daftar periksa singkat. Daftar ini murah dikerjakan dan mahal bila dilewati:
- Definisi setiap kolom dipahami, termasuk satuannya (rupiah? ribuan rupiah? poin?).
- Periode dan tanggal ambil data tercatat, serta kapan data mulai tercatat rapi.
- Nilai yang tidak wajar sudah diselidiki: kode pelanggan kosong, total negatif, tanggal di masa depan.
- Jumlah baris hilang dan duplikat diketahui, beserta keputusan penanganannya.
- Cara data diperoleh dicatat: diekspor oleh siapa, dari sistem apa, dengan penyaring apa.
Profil Cepat Dataset dengan pandas #
Sebagian besar butir daftar periksa di atas bisa dijawab lima menit dengan pandas. Kita pakai cuplikan data transaksi Toko Kopi Kita — lima hari pertama Januari 2026, 24 baris, empat kolom — yang sengaja memuat keanehan khas dunia nyata: satu baris terdeteksi ganda, satu nama pelanggan kosong, dan dua nilai total tidak terisi.
import pandas as pd
transaksi = pd.DataFrame({
"tanggal": ["2026-01-05"] * 4 + ["2026-01-06"] * 4 + ["2026-01-07"] * 4
+ ["2026-01-08"] * 5 + ["2026-01-09"] * 6 + ["2026-01-05"],
"pelanggan": ["Budi", "Siti", "Dewi", "Rani", "Budi", "Agus", "Siti", "Joko",
"Dewi", "Rani", "Agus", "Budi", "Siti", "Dewi", "Joko", "Rani",
"Budi", "Siti", "Agus", "Dewi", None, "Rani", "Budi", "Budi"],
"menu": ["kopi susu", "americano", "matcha", "teh melati",
"kopi susu", "americano", "kopi susu", "matcha",
"americano", "kopi susu", "teh melati", "matcha",
"americano", "kopi susu", "americano", "matcha",
"kopi susu", "teh melati", "matcha", "americano",
"kopi susu", "americano", "matcha", "kopi susu"],
"total": [24000, 18000, 28000, 15000, 24000, 32000, 26000, 30000,
21000, 24000, 16000, 29000, 19000, 25000, 20000, 27000,
24000, None, 31000, None, 23000, 22000, 30000, 24000],
})
print("Jumlah baris :", len(transaksi))
print("Jumlah kolom :", transaksi.shape[1])
print("Baris ganda :", transaksi.duplicated().sum())
print()
print("Tipe dan jumlah nilai hilang per kolom:")
for kolom in transaksi.columns:
print(f" {kolom:<10} {str(transaksi[kolom].dtype):<8} hilang {transaksi[kolom].isna().sum()}")
print()
print("Menu terjual:", sorted(transaksi["menu"].unique()))
print()
print("Ringkasan kolom total:")
print(transaksi["total"].describe().round(0))Output yang Dihasilkan:
Jumlah baris : 24
Jumlah kolom : 4
Baris ganda : 1
Tipe dan jumlah nilai hilang per kolom:
tanggal object hilang 0
pelanggan object hilang 1
menu object hilang 0
total float64 hilang 2
Menu terjual: ['americano', 'kopi susu', 'matcha', 'teh melati']
Ringkasan kolom total:
count 22.0
mean 24182.0
std 4757.0
min 15000.0
25% 21250.0
50% 24000.0
75% 27750.0
max 32000.0
Name: total, dtype: float64Mari kita baca profil tersebut baris demi baris:
transaksi.duplicated().sum()menghitung baris yang identik sepenuhnya dengan baris sebelumnya — hasilnya 1, berasal dari transaksi Budi pada 5 Januari yang tercatat dua kali. Satu baris ganda kecil, tetapi bila pola ini terjadi setiap hari, angka pendapatan tahunan bisa membengkak sendiri.- Kolom
totalterbacafloat64meski isinya bilangan bulat — pandas memilih tipe ini karena ada nilaiNonedi antaranya. Tanda ini penting: kehadiran missing values pada kolom numerik sering baru terlihat dari tipe yang berubah. describe()hanya menghitung 22 nilai (count), bukan 24 — dua baris dengan total kosong otomatis dikeluarkan dari rata-rata dan persentil. Rata-rata Rp24.182 karenanya adalah rata-rata transaksi yang terekam, bukan seluruh transaksi.- Sebaran nilainya wajar: minimum Rp15.000 hingga maksimum Rp32.000, tanah yang masuk akal untuk satu kunjungan di kedai. Bila profil menunjukkan total Rp1.500.000 atau Rp150, kita berhenti dan menyelidiki dulu — salah ketik, salah satuan, atau memang transaksi katering? Pertanyaan seperti inilah yang kita angkat ke tim kasir sebelum analisis lanjut.
Rangkuman #
- Data diuji tiga hal sebelum dipakai: relevan dengan pertanyaan, terwakili terhadap populasi sasaran, dan mencukupi untuk pola yang dicari.
- Data snapshot dibekukan beserta tanggal ambilnya; data mengalir dibatasi penanda waktu ambil supaya analisis yang diulang tetap membaca isi yang sama.
- Checklist kesiapan — definisi kolom, periode, keanehan, duplikat, asal data — murah dikerjakan dan mahal bila dilewati.
- Profil pandas lima menit (
duplicated(), tipe kolom,describe()) menjawab sebagian besar checklist sekaligus mengungkap keanehan sebelum menjadi kekeliruan analisis.
Data kini terkumpul dan isiannya dipahami — keanehan sudah dicatat, batas ambil sudah ditandai. Langkah berikutnya adalah mengubah seluruh pemahaman ini menjadi rencana kerja yang bisa dibaca satu tim, lengkap dengan hipotesis yang akan diuji dan keputusan yang mengikutinya: kita susun pada chapter Menyusun Rencana Analisis .