Analisis yang kokoh berdiri di atas data yang dikenal baik. Pada bagian ini kita menelusuri bagaimana data member Toko Kopi Kita terbentuk — dari kebiasaan pelanggan menyebut nama di kasir sampai baris yang tercetak pada ekspor — lalu membaca strukturnya dengan pandas. Tujuannya bukan sekadar bisa memuat berkas, melainkan memahami apa yang tercatat, apa yang tidak tercatat, dan tanda-tanda apa yang perlu dicurigai sebelum data dipakai lebih jauh.

Asal-Usul Data Program Member #

Aliran datanya sederhana. Saat membayar, pelanggan member menyebutkan namanya; pegawai memilih nama itu di aplikasi kasir; aplikasi menambahkan catatan kunjungan dan menotal belanjanya. Setiap pagi aplikasi menyimpan ringkasan per pelanggan, dan pada 17 Januari 2026 Bu Rina mengekspor rekap 30 hari terakhir untuk seluruh member aktif: 32 baris, satu baris per pelanggan. Perlu digarisbawahi: berkas ini adalah rekap agregat per pelanggan, bukan catatan transaksi satu per satu. Konsekuensinya kita tidak bisa bertanya “jam berapa pelanggan biasanya datang” atau “menu apa yang dibeli pada kunjungan ke berapa” — analisis kita terbatas pada apa yang memang tercatat.

Lima kolom pada berkas membawa informasi berikut:

KolomMakna
pelangganNama pelanggan terdaftar pada program member
kotaKota tempat tinggal pelanggan
kunjungan_30hariJumlah kunjungan selama 30 hari terakhir
belanja_ribuTotal belanja 30 hari terakhir, dalam ribu rupiah
menu_favoritMenu minuman yang paling sering dibeli

Membaca Berkas dan Mengintip Barisnya #

Berkas data/pelanggan.csv berformat CSV standar: baris pertama berisi nama kolom, nilai dipisah koma, satu baris per pelanggan. pandas membacanya dengan satu panggilan read_csv, lalu kita intip bagian awalnya untuk memastikan asumsi tentang bentuk data memang benar:

python
import pandas as pd

mentah = pd.read_csv("../data/pelanggan.csv")

print("Ukuran data:", mentah.shape)
print(mentah.head(6).to_string(index=False))

Output yang Dihasilkan:

text
Ukuran data: (32, 5)
       pelanggan    kota kunjungan_30hari  belanja_ribu menu_favorit
  Siti Rahmawati Bandung               25           500    americano
Bambang Sutrisno Bandung                4           480    americano
 Andi Firmansyah Bandung               10           400 matcha latte
    Budi Santoso Bandung               22           462    kopi susu
    Budi Santoso Bandung               22           462    kopi susu
      Nurul Aini Bandung               12           420    teh tawar

Mari kita bedah keluarannya:

  1. (32, 5): 32 baris dan 5 kolom, sesuai cerita ekspor — setidaknya untuk ukurannya.
  2. head(6) memperlihatkan enam baris pertama tanpa indeks (index=False) agar tabelnya rapi dibaca. Keenam barisnya sudah cukup mewakili ragam data: nama orang, nama kota, angka, dan nama menu.
  3. Budi Santoso tampil dua kali — baris keempat dan kelima identik seluruhnya. Ini bukan kebetulan yang bisa diabaikan; kita akan diagnosa resmi pada Bagian 3.
  4. belanja_ribu berarti 500 = Rp 500.000. Satuan ribu seperti ini lazim pada ekspor kasir; kita harus ingat terus faktor seribu ini saat membaca angka.

Membaca Tipe Data dan Nilai Unik #

Bentuk luar sudah terbaca; sekarang kita periksa bentuk dalamnya. Tipe data tiap kolom menentukan operasi apa yang bisa dijalankan, dan jumlah nilai unik sering membocorkan kejanggalan sebelum kita melihatnya satu per satu:

python
import pandas as pd

mentah = pd.read_csv("../data/pelanggan.csv")

print("Tipe data tiap kolom:")
print(mentah.dtypes.to_string())
print("\nJumlah nilai unik tiap kolom:")
print(mentah.nunique().to_string())

Output yang Dihasilkan:

text
Tipe data tiap kolom:
pelanggan           object
kota                object
kunjungan_30hari    object
belanja_ribu         int64
menu_favorit        object

Jumlah nilai unik tiap kolom:
pelanggan           31
kota                 4
kunjungan_30hari    20
belanja_ribu        23
menu_favorit         4

Keluaran tersebut menyiapkan tiga temuan yang menuntut penjelasan:

  1. kunjungan_30hari bertipe object, bukan angka. Padahal kolom ini jelas berisi jumlah kunjungan. pandas menurunkan tipe dari isi: kalau ada satu saja sel yang bukan angka, seluruh kolom dibaca sebagai teks. Ada sesuatu di kolom ini yang belum kita lihat.
  2. 32 baris tetapi hanya 31 nama pelanggan unik. Selaras dengan Budi Santoso yang tampil dua kali pada head(6) — ada satu duplikat di dalam data.
  3. 4 nilai kota unik, padahal member Toko Kopi Kita tinggal di tiga kota: Bandung, Cimahi, dan Sumedang. Satu nilai ekstra pasti berasal dari cara penulisan yang tidak seragam.

Tiga kejanggalan itu tidak membuat data rusak berat — 32 baris dengan tiga masalah kecil adalah kondisi yang sehat untuk data dunia nyata. Tetapi ketiganya wajib ditangani dengan sadar sebelum fitur dan clustering menyentuh data, karena duplikat menggelembungkan hitungan, kolom teks memblokir perhitungan angka, dan kota yang tak seragam akan pecah saat diagregasi. Detail pemakaiannya bisa dirujuk pada dokumentasi pandas.read_csv .

Struktur data kini dipahami, dan tiga masalahnya sudah dinamai satu per satu. Semuanya kita bedah dan bereskan pada Bagian 3: Membersihkan Data .