Menentukan Jumlah Cluster: Elbow, Silhouette, dan Akal Sehat
Blog/Tips & Trik/Menentukan Jumlah Cluster: Elbow, Silhouette, dan Akal Sehat

Menentukan Jumlah Cluster: Elbow, Silhouette, dan Akal Sehat

BimaBima
·21 Oktober 2025·10 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Jumlah cluster optimal ditentukan dari tiga hal sekaligus: elbow method yang lihat titik di mana penurunan inertia mulai melandai, silhouette score yang ngukur seberapa rapi tiap titik masuk ke clusternya (skala -1 sampai 1, makin tinggi makin bagus), dan kemampuan tim bisnis buat ngasih perlakuan beda ke tiap segmen. Kalau tiga sinyal itu nunjuk angka berbeda, menangin yang bisa dieksekusi.

Jumlah cluster yang tepat adalah angka terkecil yang masih bikin tiap kelompok punya perilaku beda, dan masih sanggup ditindaklanjuti sama tim yang megang datanya.

Masalahnya, K-Means minta kamu nentuin angka itu di depan. Sebelum ngeliat hasilnya.

Aku sering nemu tim marketing yang milih k=8 gara-gara grafik elbow-nya kelihatan turun terus, lalu bingung sendiri waktu harus bikin delapan versi promo Ramadan. Di sini aku tunjukin tiga alat yang aku pakai bareng-bareng: elbow method, silhouette score, dan pertanyaan bisnis yang paling nentuin.

Apa itu jumlah cluster optimal dalam K-Means?

Jumlah cluster optimal adalah nilai k yang bikin titik-titik di dalam satu cluster saling berdekatan, sementara antar cluster jaraknya jauh. Secara teknis kamu nyari titik seimbang antara kerapatan internal dan pemisahan antar kelompok. Nambah k terus-terusan selalu bikin angka kerapatan membaik, jadi angka mentah gak bisa dipakai sendirian.

K-Means kerjanya nempatin k titik pusat, terus mindahin tiap data ke pusat terdekat, lalu geser pusatnya ke rata-rata anggotanya. Diulang sampai posisinya stabil.

Karena kamu yang kasih angka k, algoritmanya gak punya pendapat soal berapa segmen yang wajar. Dia cuma nurut.

Kalau kamu belum familiar sama istilah dasarnya, konsep segmentation ini pondasi yang sama dipakai di analisis RFM maupun clustering.

Gimana cara pakai elbow method buat nentuin jumlah cluster?

Elbow method jalanin K-Means berulang dari k kecil ke k besar, lalu plot inertia (total jarak kuadrat tiap titik ke pusat clusternya) terhadap k. Titik di mana kurvanya berhenti turun tajam dan mulai melandai itu kandidat jumlah cluster. Bentuk kurvanya mirip lengan yang nekuk, makanya disebut siku.

Ini kode buat bikin kurvanya. Datanya data pelanggan toko_berkah dengan tiga kolom: berapa hari sejak transaksi terakhir, berapa kali belanja, dan total rupiah yang dibelanjain.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

df = pd.read_csv("toko_berkah_pelanggan.csv")
fitur = df[["recency_hari", "frekuensi_transaksi", "total_belanja"]]

# skala kolom disamain dulu, biar total_belanja gak mendominasi
scaler = StandardScaler()
X = scaler.fit_transform(fitur)

inertia = []
rentang_k = range(2, 11)

for k in rentang_k:
    km = KMeans(n_clusters=k, n_init=10, random_state=42)
    km.fit(X)
    inertia.append(km.inertia_)

plt.plot(list(rentang_k), inertia, marker="o")
plt.xlabel("Jumlah cluster (k)")
plt.ylabel("Inertia")
plt.show()

Dua argumen yang sering dilewat orang. random_state=42 bikin hasilnya bisa diulang, soalnya posisi pusat awal K-Means diacak. n_init=10 nyuruh scikit-learn ngulang proses sepuluh kali dengan titik awal beda, lalu ambil yang inertia-nya paling kecil.

Tanpa dua itu, kamu bisa dapat grafik yang beda tiap kali script dijalanin.

Cara baca grafiknya tanpa nipu diri sendiri

Inertia selalu turun setiap k nambah. Di k sebanyak jumlah barisnya, inertia jadi nol soalnya tiap titik jadi pusatnya sendiri.

Jadi yang kamu cari bukan nilai terkecil. Yang kamu cari titik di mana tambahan satu cluster berhenti kasih perbaikan berarti.

Cara paling gampang: hitung selisih inertia antar k berturut-turut. Kalau turun dari k=3 ke k=4 masih 18 persen tapi dari k=4 ke k=5 cuma 4 persen, sikunya ada di k=4.

for i in range(1, len(inertia)):
    turun = (inertia[i-1] - inertia[i]) / inertia[i-1] * 100
    print(f"k={list(rentang_k)[i]} : turun {turun:.1f}%")

Kalau kamu mau otomatis, paket kneed punya KneeLocator yang nebak titik siku secara numerik. Tetap cek manual hasilnya, soalnya dia bisa salah baca kurva yang mulus.

Apa itu silhouette score dan kenapa lebih tegas dari elbow?

Silhouette score ngukur seberapa cocok tiap titik sama clusternya dibanding cluster tetangga terdekat. Rumusnya (b dikurang a) dibagi nilai terbesar antara a dan b, di mana a itu rata-rata jarak ke sesama anggota cluster dan b rata-rata jarak ke anggota cluster terdekat. Hasilnya antara -1 sampai 1, dan skor rata-rata seluruh titik jadi nilai buat k itu.

Bedanya sama elbow ada di huruf b. Elbow gak pernah ngelirik cluster sebelah, jadi dia gak tahu kalau dua cluster sebenernya nempel dan lebih baik digabung.

from sklearn.metrics import silhouette_score

hasil = {}
for k in range(2, 11):
    km = KMeans(n_clusters=k, n_init=10, random_state=42)
    label = km.fit_predict(X)
    hasil[k] = silhouette_score(X, label)

for k, skor in hasil.items():
    print(f"k={k} : silhouette {skor:.3f}")

Angka yang keluar biasanya jauh dari sempurna. Data transaksi ritel itu berantakan dan batas antar segmen emang kabur.

Ini patokan yang aku pakai:

Silhouette rata-rataArtinyaTindakan
0,50 ke atasCluster kepisah rapiLanjut, kasih nama tiap segmen
0,25 sampai 0,50Struktur ada tapi batasnya kaburWajar buat data pelanggan, tetap cek profilnya
0 sampai 0,25Struktur lemahPerbaiki fitur atau ganti pendekatan
Di bawah 0Banyak titik salah kamarJangan dipakai

Dokumentasi resmi scikit-learn punya penjelasan lengkap soal metrik evaluasi clustering lainnya kayak Davies-Bouldin dan Calinski-Harabasz di halaman clustering scikit-learn.

Kombinasi dua metrik

Aku biasanya jalanin dua-duanya lalu bandingin. Kalau elbow nunjuk k=4 dan silhouette juga puncak di k=4, keputusannya gampang.

Kalau beda, silhouette yang aku menangin. Dia ngukur pemisahan, bukan cuma kerapatan.

Kenapa akal sehat bisnis harus ikut nentuin jumlah cluster?

Angka metrik gak tahu berapa banyak kampanye yang sanggup dijalanin tim kamu. Segmentasi yang bagus secara statistik tapi gak bisa dieksekusi itu file yang mati di folder.

Tiga pertanyaan yang aku tanya sebelum ngunci angka k:

  1. Tiap cluster bakal dikasih perlakuan apa yang beda? Kalau cluster 3 dan cluster 5 dikasih promo yang sama persis, dua cluster itu sebaiknya satu.
  2. Berapa isi cluster terkecil? Cluster berisi 12 orang dari 1.800 pelanggan biasanya kumpulan outlier, bukan segmen. Pisahin mereka manual dan jalanin ulang clusteringnya.
  3. Bisa gak tiap cluster dikasih nama satu frasa? Kalau kamu susah nyebut cluster 6 selain "yang tengah-tengah", itu tanda segmennya belum jelas.

Pertanyaan ketiga yang paling sering nyelametin aku. Nama yang gampang nempel bikin tim non-teknis ikut pakai hasilnya.

Contoh kasus: segmentasi 1.842 pelanggan toko_berkah

Toko_berkah itu toko sembako grosir di Bekasi dengan data transaksi 14 bulan. Dari dataset ngulikdata, ada 1.842 pelanggan unik dengan total transaksi 11.407 baris.

Setelah kolom recency, frekuensi, dan total belanja distandarisasi, hasilnya begini:

kInertiaPenurunanSilhouette
23.418-0,39
32.55625,2%0,36
41.98422,4%0,41
51.8795,3%0,33
61.7954,5%0,31

Penurunan inertia jatuh dari 22,4 persen ke 5,3 persen begitu masuk k=5. Sikunya jelas di k=4.

Silhouette juga puncak di k=4 dengan 0,41. Dua sinyal setuju, jadi aku ambil empat cluster.

Profil tiap segmen setelah nilai pusatnya dikembalikan ke satuan asli:

SegmenJumlahRecencyFrekuensiRata-rata total belanja
Grosir rutin2146 hari31xRp 24.700.000
Warung aktif59812 hari9xRp 4.150.000
Eceran sesekali82247 hari3xRp 680.000
Tidur panjang208203 hari2xRp 410.000

Angka yang bikin aku berhenti: segmen Grosir rutin cuma 11,6 persen dari pelanggan, tapi nyumbang 61,3 persen dari total omzet 14 bulan.

Empat nama itu langsung kepakai. Tim toko bikin empat perlakuan beda tanpa perlu penjelasan soal inertia.

Kenapa k=5 ditolak walaupun inertia-nya lebih kecil

Waktu aku coba k=5, cluster Warung aktif kepecah dua dengan selisih rata-rata belanja cuma Rp 320.000. Silhouette-nya juga anjlok ke 0,33.

Dua cluster yang beda tipis Rp 320 ribu gak akan dikasih promo beda. Jadi pecahan itu cuma nambah kerjaan.

Kesalahan umum waktu nentuin jumlah cluster

Lupa standarisasi. Ini penyebab nomor satu cluster yang aneh. Kolom total belanja dalam jutaan bakal ngalahin frekuensi yang cuma puluhan, jadi K-Means praktis cuma motong data berdasarkan nominal belanja.

Ngejar silhouette tertinggi apapun caranya. k=2 sering dapat skor tinggi soalnya cuma misahin dua gumpalan besar. Skor 0,52 di k=2 gak berguna kalau kamu butuh strategi buat empat tipe pelanggan.

Masukin ID pelanggan sebagai fitur. Kedengeran konyol tapi sering kejadian waktu df langsung dilempar ke scaler. Kolom ID itu angka, dan K-Means bakal ngitung jaraknya.

Gak buang outlier ekstrem. Satu pelanggan dengan belanja Rp 890 juta bisa narik satu pusat cluster ke dirinya sendiri. Cek distribusi dulu, potong di persentil 99, atau pakai log transform buat kolom nominal.

Percaya hasil sekali jalan. Jalanin ulang dengan random_state beda. Kalau profil clusternya berubah drastis, strukturnya emang rapuh dan k-nya kekecilan atau kegedean.

Nge-cluster fitur yang saling nempel. Frekuensi transaksi dan jumlah item dibeli biasanya jalan bareng. Dua kolom yang isinya hampir sama bikin dimensi itu kehitung dua kali.

FAQ

Berapa jumlah cluster yang paling ideal buat segmentasi pelanggan?

Gak ada angka baku. Buat segmentasi pelanggan UMKM, 3 sampai 5 cluster biasanya paling kepakai soalnya tim masih sanggup bikin perlakuan beda buat tiap segmen. Di atas 6, isi tiap cluster mulai mirip dan promo yang kamu susun jadi tumpang tindih. Mulai dari uji k=2 sampai k=8, lalu potong di angka yang timnya masih bisa eksekusi.

Kenapa grafik elbow aku gak punya siku yang jelas?

Biasanya gara-gara datanya emang gak punya kelompok alami, atau fiturnya belum distandarisasi jadi satu variabel dengan skala besar mendominasi jarak. Coba scaling dulu pakai StandardScaler, kurangi fitur yang gak relevan, lalu ulangi. Kalau kurvanya tetap mulus, jangan paksa K-Means. Segmentasi manual pakai aturan bisnis sering lebih jujur.

Silhouette score berapa yang dianggap bagus?

Skalanya -1 sampai 1. Di atas 0,5 artinya cluster kepisah rapi, 0,25 sampai 0,5 masih kepakai buat data pelanggan yang emang berantakan, di bawah 0,25 tandanya struktur clusternya lemah. Data transaksi ritel jarang tembus 0,5, jadi jangan buang hasil 0,4 cuma gara-gara ngejar angka cantik.

Perlu gak standarisasi data sebelum clustering?

Perlu, kalau satuan antar kolom beda jauh. Total belanja dalam jutaan rupiah bakal ngalahin frekuensi transaksi yang cuma puluhan, jadi cluster kebentuk cuma dari nominal belanja. Pakai StandardScaler dari scikit-learn buat nyamain skalanya. Simpan objek scaler-nya, soalnya kamu butuh itu lagi waktu mau nerjemahin pusat cluster balik ke rupiah.

Bedanya elbow method sama silhouette score apa?

Elbow lihat total jarak titik ke pusat clusternya sendiri, jadi cuma ngukur kerapatan di dalam cluster. Silhouette juga ngitung jarak ke cluster tetangga terdekat, jadi dia tahu apakah dua cluster sebenernya nempel. Elbow cepat tapi subjektif. Silhouette lebih lambat di data besar tapi kasih satu angka yang bisa kamu banding langsung.

Penutup

Tiga hal yang perlu kamu bawa dari sini.

Pertama, elbow cuma kasih kandidat, bukan jawaban. Hitung persentase penurunan inertia biar kamu gak nebak-nebak posisi siku dari bentuk grafik.

Kedua, silhouette score lebih layak dipercaya soalnya dia ngukur jarak ke cluster tetangga. Untuk data pelanggan, 0,35 sampai 0,45 itu hasil yang wajar.

Ketiga, angka k final harus lolos tes nama. Kalau satu cluster susah dinamain dalam satu frasa, gabung dia sama tetangganya.

Mau lanjut ke pola waktu di data penjualanmu? Baca dekomposisi time series buat misahin tren dan efek musiman sebelum kamu masukin fitur waktu ke model clustering.

Dan kalau hasil segmentasimu masih ngendon di notebook, ubah jadi aplikasi kecil yang bisa dipakai tim lewat panduan Streamlit buat aplikasi data internal. Rekap awal RFM-nya juga bisa kamu bikin dulu di spreadsheet pakai SUMIFS dan COUNTIFS sebelum pindah ke Python.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Pandas groupby: Agregasi Data ala Pivot di Python (2026)
Tips & Trik
20 Juli 2026•9 menit baca

Pandas groupby: Agregasi Data ala Pivot di Python (2026)

groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.

BimaBima
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
Tips & Trik
18 Juli 2026•8 menit baca

Pandas to_excel: Ekspor DataFrame ke Excel (2026)

to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.

BimaBima
Pandas read_excel: Baca File Excel di Python
Tips & Trik
16 Juli 2026•8 menit baca

Pandas read_excel: Baca File Excel di Python

pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore