Segmentasi pelanggan membantu tim bisnis memahami bahwa pelanggan tidak selalu memiliki pola yang sama. Sebagian sering bertransaksi dengan...
Segmentasi pelanggan membantu tim bisnis memahami bahwa pelanggan tidak selalu memiliki pola yang sama. Sebagian sering bertransaksi dengan nilai kecil, sebagian lain jarang berbelanja tetapi bernilai tinggi, dan kelompok lain mungkin baru mulai berinteraksi. Alih-alih menebak kategori sejak awal, teknik clustering mencari struktur berdasarkan kemiripan karakteristik yang tersedia.
K-Means merupakan salah satu pendekatan yang populer karena konsep dan implementasinya relatif mudah dipahami. Namun, algoritma ini meminta kita menentukan jumlah kelompok, atau k, sebelum pelatihan. Pilihan tersebut bukan sekadar pengaturan teknis: terlalu sedikit kelompok dapat menyatukan perilaku yang berbeda, sedangkan terlalu banyak kelompok dapat menghasilkan segmentasi yang sulit digunakan.
Dalam artikel ini kita membangun contoh dengan data sintetis di lab lokal, menyiapkan fitur, lalu membandingkan elbow dan silhouette score. Contoh ini adalah demonstrasi alur, bukan hasil pengujian pada pelanggan nyata atau bukti bahwa model akan meningkatkan pendapatan. Semua angka hasil evaluasi harus dihasilkan dari data dan eksekusi Anda sendiri.
Memahami K-Means dalam konteks pelanggan
K-Means membagi data menjadi k kelompok dan mencari pusat, disebut centroid, bagi setiap kelompok. Secara bergantian, algoritma menetapkan setiap observasi ke centroid terdekat dan memperbarui centroid berdasarkan rata-rata anggota kelompok. Tujuan optimasinya adalah meminimalkan jumlah kuadrat jarak anggota ke centroid masing-masing, yang lazim disebut inertia.
Dalam contoh pelanggan, satu baris mewakili satu pelanggan dan setiap kolom fitur menggambarkan perilaku yang dipilih. Kita dapat menggunakan frekuensi transaksi dan nilai belanja pada periode yang sama. Kedekatan dalam ruang fitur tersebut berarti kemiripan menurut variabel dan skala yang kita tentukan, bukan kesamaan menyeluruh sebagai manusia.
Asumsi dan keterbatasan yang perlu dikenali
K-Means berbasis jarak Euclidean cenderung lebih mudah menggambarkan kelompok yang kompak, relatif bulat, dan memiliki kepadatan yang tidak terlalu berbeda. Bentuk memanjang, kelompok yang saling tumpang tindih, serta pencilan ekstrem dapat membuat hasilnya kurang representatif. Centroid juga merupakan rata-rata numerik; nilai itu tidak harus sesuai dengan pelanggan yang benar-benar ada.
Karena itu, jangan memasukkan ID pelanggan sebagai fitur numerik. ID adalah penanda, bukan ukuran kemiripan. Variabel kategori juga tidak otomatis cocok dimasukkan sebagai bilangan berkode: selisih antara kode kategori belum tentu memiliki makna jarak. Untuk pilihan algoritma dan keterbatasannya, lihat panduan clustering scikit-learn.
Menyiapkan data sintetis untuk lab lokal
Contoh berikut membuat data simulasi agar alur dapat dicoba tanpa membuka data pribadi. Fitur frekuensi dan belanja dihasilkan secara acak dengan beberapa pusat buatan. Dengan demikian, struktur kelompok memang sudah ditanam dalam proses pembuatan data: keberhasilan menemukan pola pada contoh ini tidak membuktikan kinerja pada data operasional yang lebih kompleks.
Gunakan lingkungan Python yang sudah memiliki NumPy, pandas, matplotlib, dan scikit-learn. Jalankan blok-blok kode secara berurutan dalam sesi Python atau notebook yang sama. Setiap blok menggunakan objek yang dibuat pada blok sebelumnya; sesuaikan instalasi paket dengan kebijakan lingkungan Anda.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
X_sim, _ = make_blobs(
n_samples=450,
centers=[[3, 150], [10, 500], [18, 1100]],
cluster_std=[1.0, 1.5, 2.0],
random_state=42,
)
df = pd.DataFrame(X_sim, columns=["frekuensi", "belanja"])
print(df.head())
Perhatikan bahwa satuan kedua fitur dalam simulasi ini berbeda. Selain itu, data sintetis tersebut tidak dibatasi oleh aturan bisnis nyata: misalnya frekuensi transaksi tidak dipaksa menjadi bilangan bulat. Pada data produksi, tentukan periode pengamatan, satuan mata uang, definisi transaksi yang valid, dan penanganan retur sebelum membuat fitur.
Periksa kualitas sebelum membentuk cluster
Sebelum pemodelan, periksa baris duplikat, nilai hilang, nilai tidak mungkin, dan distribusi setiap variabel. Data hilang dapat berasal dari kegagalan pencatatan, bukan perilaku pelanggan. Penghapusan tanpa analisis dapat menghilangkan segmen tertentu, sedangkan imputasi tanpa pertimbangan dapat menciptakan kemiripan palsu. Dokumentasikan pilihan dan bandingkan dampaknya.
Pencilan juga memerlukan keputusan berbasis konteks. Pelanggan dengan nilai transaksi besar bisa menjadi pelanggan sah yang penting, kesalahan input, atau efek transaksi korporat. Jangan menghapus semuanya hanya agar grafik terlihat rapi. Identifikasi penyebabnya, pertimbangkan transformasi yang sesuai, dan catat observasi yang ditangani secara khusus.
Skala fitur dan bangun kandidat model
Jarak Euclidean sensitif terhadap satuan. Jika belanja dinyatakan dalam angka yang jauh lebih besar daripada frekuensi, fitur belanja dapat mendominasi jarak sekalipun kedua fitur sama-sama penting bagi tujuan analisis. StandardScaler memusatkan fitur dan membaginya dengan simpangan baku berdasarkan data yang digunakan saat fit.
Standardisasi bukan obat untuk semua masalah: pencilan dapat memengaruhi rata-rata dan simpangan baku, dan skala yang sama tidak otomatis berarti kepentingan bisnis yang sama. Tinjau alternatif serta konsekuensinya melalui dokumentasi preprocessing scikit-learn. Bila nantinya digunakan untuk menetapkan pelanggan baru, simpan scaler yang sama bersama model; jangan melakukan fit ulang terpisah pada setiap pelanggan.
fitur = ["frekuensi", "belanja"]
scaler = StandardScaler()
X = scaler.fit_transform(df[fitur])
kandidat = range(2, 9)
model_per_k = {}
metrik = []
for k in kandidat:
model = KMeans(n_clusters=k, random_state=42, n_init=10)
label = model.fit_predict(X)
model_per_k[k] = model
metrik.append({
"k": k,
"inertia": model.inertia_,
"silhouette": silhouette_score(X, label),
})
hasil = pd.DataFrame(metrik)
print(hasil.to_string(index=False))
Rentang kandidat di atas adalah titik awal demonstrasi, bukan aturan universal. Jumlah kandidat harus lebih kecil daripada jumlah sampel dan menghasilkan setidaknya dua label berbeda untuk perhitungan silhouette. Parameter random_state membantu reproduktibilitas pada lingkungan yang sebanding; n_init menjalankan beberapa inisialisasi agar solusi tidak terlalu bergantung pada satu titik awal. Catat versi pustaka dan ulangi analisis dengan seed lain untuk memeriksa kestabilan.
Membaca kurva elbow dan silhouette score
Metode elbow memvisualisasikan inertia untuk beberapa nilai k. Ketika jumlah cluster bertambah, inertia umumnya tidak meningkat; bahkan dapat terus menurun karena model memiliki lebih banyak pusat untuk mendekati observasi. Carilah titik ketika penambahan cluster berikutnya mulai memberikan pengurangan inertia yang semakin kecil, sehingga kurva tampak membentuk siku.
Dalam praktik, siku tidak selalu jelas atau unik. Kurva yang mulus tidak memaksa kita menemukan satu angka ajaib. Penentuan titik siku dapat melibatkan penilaian visual, sedangkan metode deteksi otomatis pun memiliki asumsi dan ambang tersendiri. Karena itu, lihat metrik lain dan tanyakan apakah segmentasi hasilnya dapat dijelaskan.
Apa yang diukur silhouette?
Untuk setiap sampel, silhouette membandingkan rata-rata jarak ke anggota cluster sendiri dengan rata-rata jarak ke cluster lain yang paling dekat. Skor mendekati satu menunjukkan pemisahan yang lebih jelas menurut jarak yang dipakai; skor sekitar nol menunjukkan observasi dekat batas antarkelompok; skor negatif dapat mengindikasikan observasi lebih dekat ke kelompok lain. Skor yang ditampilkan fungsi ini adalah rata-rata seluruh sampel, sehingga dapat menyembunyikan kelompok kecil dengan kualitas buruk.
Silhouette membutuhkan sekurangnya dua label dan jumlah label lebih kecil daripada jumlah sampel. Ia mengukur struktur geometris, bukan nilai bisnis atau kebenaran label pelanggan. Rumus, parameter, dan batas penggunaannya tersedia pada dokumentasi silhouette_score.
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot(hasil["k"], hasil["inertia"], marker="o")
axes[0].set(xlabel="Jumlah cluster (k)", ylabel="Inertia",
title="Kurva elbow")
axes[1].plot(hasil["k"], hasil["silhouette"], marker="o")
axes[1].set(xlabel="Jumlah cluster (k)", ylabel="Silhouette rata-rata",
title="Perbandingan silhouette")
plt.tight_layout()
plt.show()
Baca kedua grafik bersama-sama. Kandidat dengan silhouette tertinggi layak diperiksa, tetapi belum tentu paling berguna bila menghasilkan kelompok yang terlalu kecil untuk ditindaklanjuti. Sebaliknya, siku yang terlihat baik belum menjamin kelompok terpisah dengan jelas. Uji beberapa kandidat yang masuk akal, lalu catat alasan pemilihan, termasuk pertimbangan kapasitas tim dan tujuan penggunaan.
Menafsirkan dan memeriksa profil cluster
Setelah memeriksa grafik, pilih kandidat secara eksplisit. Kode berikut memakai k_pilihan = 3 hanya sebagai contoh yang sesuai dengan konstruksi data simulasi, bukan kesimpulan yang berlaku untuk data pelanggan Anda. Profil dihitung menggunakan fitur asli agar angka lebih mudah dijelaskan dalam satuan awal, meskipun model dilatih pada fitur terstandardisasi.
k_pilihan = 3 # ganti setelah meninjau grafik dan konteks
model = model_per_k[k_pilihan]
profil_data = df.copy()
profil_data["cluster"] = model.labels_
profil = profil_data.groupby("cluster").agg(
jumlah=("frekuensi", "size"),
frekuensi_median=("frekuensi", "median"),
belanja_median=("belanja", "median"),
)
print(profil.to_string())
Dari angka ke keputusan yang dapat diuji
Bandingkan ukuran, median, dan sebaran tiap kelompok. Misalnya, satu kelompok mungkin memiliki frekuensi relatif lebih tinggi daripada kelompok lain pada periode yang sama. Nama seperti “sering bertransaksi” dapat membantu komunikasi, tetapi jangan langsung menyebutnya “loyal” tanpa definisi dan bukti tambahan. Nomor cluster hanyalah label arbitrer; nomor yang sama pada pelatihan ulang tidak dijamin mewakili kelompok yang sama.
Periksa pula hasil pada beberapa seed, perubahan periode, serta sampel yang berbeda. Segmentasi yang berubah drastis akibat perubahan kecil pada input mungkin belum cukup stabil untuk proses operasional. Analisis ukuran per cluster dan distribusi skor silhouette per sampel dapat mengungkap masalah yang tidak terlihat dari satu angka rata-rata.
Untuk data historis, pisahkan periode pengembangan dari periode evaluasi yang lebih baru sesuai tujuan, lalu terapkan scaler dan model yang dipelajari hanya pada data pengembangan. Bandingkan profil dan proporsi kelompok pada periode berikutnya. Hindari memakai informasi masa depan saat menghitung fitur masa lalu karena kebocoran data dapat membuat evaluasi tampak lebih baik daripada kenyataannya.
Dari eksperimen ke penerapan yang bertanggung jawab
Sebelum menghubungkan cluster dengan kampanye, tentukan tindakan dan hipotesis untuk setiap kelompok. Contohnya, tim dapat merancang komunikasi yang relevan untuk kelompok yang jarang bertransaksi, lalu menguji dampaknya dengan rancangan eksperimen dan kelompok pembanding yang sesuai. Hubungan antara cluster dan respons promosi perlu dibuktikan; clustering sendiri tidak membuktikan sebab-akibat maupun peningkatan penjualan.
Libatkan pemilik data dan pihak bisnis saat memeriksa apakah fitur dapat dijelaskan dan digunakan secara sah. Batasi akses ke data pelanggan, minimalkan atribut pribadi, dan tinjau potensi dampak tidak adil sebelum menggunakan segmen untuk keputusan yang memengaruhi individu. Pastikan tersedia prosedur retensi, audit, dan peninjauan ulang yang sesuai dengan kebijakan organisasi dan aturan yang berlaku.
Contoh lab ini belum menguji data pelanggan nyata, ketahanan terhadap pencilan dunia nyata, stabilitas lintas periode, dampak bisnis, privasi operasional, maupun performa pada skala produksi. Data simulasi yang memiliki pusat buatan juga tidak mewakili seluruh bentuk distribusi pelanggan. Langkah berikutnya adalah menguji pipeline pada data yang diizinkan, mendokumentasikan keterbatasan, serta membandingkan pendekatan lain bila struktur kelompok tidak sesuai dengan asumsi K-Means.
Intinya, elbow membantu melihat manfaat tambahan dari peningkatan k, sedangkan silhouette memberikan sudut pandang tentang kekompakan dan pemisahan. Keduanya adalah alat bantu, bukan pengganti penilaian domain. Pilihan cluster yang baik harus dapat dijelaskan, cukup stabil, dan berguna untuk keputusan yang kemudian diuji secara bertanggung jawab.
COMMENTS