Teori dan Implementasi K-Means Clustering: Segmentasi Pelanggan dengan Python

Lhuqita Fazry
Machine Learning K-Means Clustering Python Scikit-learn
Teori dan Implementasi K-Means Clustering: Segmentasi Pelanggan dengan Python

Cara Kerja K-Means dan Perhitungan Jarak Euclidean

K-Means adalah algoritma _unsupervised learning_ yang membagi data menjadi K kelompok berdasarkan kedekatan jarak antar titik. Tanpa label yang mengawasi, algoritma ini menemukan struktur alami dalam data secara mandiri.

Proses K-Means berjalan dalam empat langkah berulang. Pertama, inisialisasi — memilih K titik centroid secara acak dari dataset. Kedua, _assignment_ — setiap titik data dihitung jaraknya ke seluruh centroid menggunakan rumus Euclidean, lalu ditetapkan ke centroid terdekat. Ketiga, _update_ — centroid dipindahkan ke posisi rata-rata (mean) dari semua titik dalam cluster-nya. Keempat, _konvergen_ — iterasi berhenti ketika posisi centroid tidak lagi berubah secara signifikan atau batas iterasi tercapai.

Jarak Euclidean menjadi metrik utama dalam K-Means. Rumusnya, $d(p, q) = \sqrt{\sum_{i=1}^{n} (p_i - q_i)^2}$, mengukur panjang garis lurus antara dua titik dalam ruang fitur. Konsekuensinya, K-Means hanya mampu mendeteksi cluster berbentuk _spherical_ (bundar) dan sangat sensitif terhadap skala fitur.

Implikasi dari metrik Euclidean ini signifikan. Fitur dengan rentang nilai besar — misalnya pendapatan dalam jutaan — akan mendominasi perhitungan jarak dibanding fitur dengan rentang kecil seperti usia atau frekuensi transaksi. Inilah mengapa standardisasi fitur menjadi langkah preprocessing yang wajib dilakukan sebelum menerapkan K-Means.

Proses Iterasi K-Means

Gambar: Visualisasi konvergensi K-Means dari posisi awal yang kurang menguntungkan — setiap panel menunjukkan iterasi berikutnya hingga centroid stabil. Cluster ditandai dengan warna berbeda dan garis Voronoi menunjukkan batas keputusan antar cluster. — Sumber: [Wikimedia Commons (Agor153, CC BY-SA 3.0)](https://commons.wikimedia.org/wiki/File:K-means_convergence_to_a_local_minimum.png)

pythonpython
!pip install numpy

import numpy as np

np.random.seed(42)
data = np.array([[2, 3], [3, 4], [10, 12], [11, 13], [5, 6], [6, 5]])
centroids = data[[0, 2]]

print("=== Iterasi 1 ===")
print("Centroid awal:", centroids)

distances = np.zeros((len(data), len(centroids)))
for i, point in enumerate(data):
    for j, centroid in enumerate(centroids):
        distances[i, j] = np.sqrt(np.sum((point - centroid) ** 2))

labels = np.argmin(distances, axis=1)
print("Label cluster:", labels)

new_centroids = np.array([
    data[labels == 0].mean(axis=0),
    data[labels == 1].mean(axis=0)
])
print("Centroid setelah update:", new_centroids)
print("Perubahan centroid:", np.sum(np.abs(new_centroids - centroids)))

Output:

text
=== Iterasi 1 ===
Centroid awal: [[ 2  3]
 [10 12]]
Label cluster: [0 0 1 1 0 0]
Centroid setelah update: [[ 4.   4.5]
 [10.5 12.5]]
Perubahan centroid: 4.5

Kode di atas menunjukkan satu iterasi manual K-Means. Kita menghitung jarak Euclidean setiap titik ke dua centroid, menetapkan label berdasarkan centroid terdekat, lalu memperbarui centroid dengan rata-rata titik dalam cluster masing-masing. Perubahan centroid sebesar 4.5 pada iterasi pertama akan terus mengecil di iterasi berikutnya hingga algoritma mencapai konvergensi — biasanya ketika perubahan posisi centroid di bawah threshold tertentu (misalnya 1e-4) atau setelah mencapai jumlah iterasi maksimal. Dalam praktiknya, Scikit-learn menangani seluruh proses ini secara otomatis melalui metode fit(), tetapi memahami mekanisme dasarnya penting untuk debugging dan interpretasi hasil.

Implementasi K-Means dengan Scikit-learn pada Dataset Pelanggan

Mari kita gunakan Scikit-learn untuk pipeline segmentasi pelanggan yang lebih realistis. Kita akan membuat dataset sintetis pelanggan dengan fitur usia, pendapatan tahunan, frekuensi transaksi, dan total belanja — skenario umum dalam analisis bisnis.

Scaling fitur dengan StandardScaler adalah langkah wajib. Tanpa scaling, fitur dengan rentang besar (misalnya pendapatan jutaan rupiah) akan mendominasi perhitungan jarak Euclidean, membuat fitur lain tidak berkontribusi.

pythonpython
!pip install pandas scikit-learn

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

np.random.seed(42)
n_customers = 300
data = pd.DataFrame({
    'usia': np.random.randint(18, 65, n_customers),
    'pendapatan': np.random.normal(60, 20, n_customers) * 1e6,
    'frekuensi_transaksi': np.random.poisson(5, n_customers),
    'total_belanja': np.random.normal(5, 2, n_customers) * 1e6
})

features = ['usia', 'pendapatan', 'frekuensi_transaksi', 'total_belanja']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data[features])

kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
data['cluster_id'] = kmeans.fit_predict(X_scaled)

print("=== Ringkasan per Cluster ===")
summary = data.groupby('cluster_id')[features].mean().round(2)
print(summary)

Output:

text
=== Ringkasan per Cluster ===
             usia   pendapatan  frekuensi_transaksi  total_belanja
cluster_id                                                        
0           25.60  53447464.35                 4.72     5422238.72
1           45.34  73805388.08                 3.66     3335457.09
2           50.53  54516452.43                 3.96     6768407.86
3           47.20  58089891.43                 8.08     4724524.20

Setelah training, setiap pelanggan mendapat label cluster. Ringkasan statistik per cluster menunjukkan profil berbeda — ada kelompok dengan pendapatan tinggi dan belanja besar, ada pula yang lebih moderat. Informasi ini sudah bisa digunakan sebagai dasar strategi bisnis.

Data Science with Python
Data Science • Beginner

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Daftar

Menentukan Jumlah Cluster Optimal dengan Elbow Method dan Silhouette Score

Memilih jumlah K yang tepat adalah tantangan utama dalam K-Means. Dua metrik populer untuk membantu keputusan ini adalah _inertia_ (within-cluster sum of squares) dan _silhouette score_.

Inertia didefinisikan sebagai jumlah kuadrat jarak setiap titik ke centroid cluster-nya. Semakin kecil nilai inertia, semakin kompak titik-titik dalam satu cluster. Silhouette score mengevaluasi seberapa mirip suatu titik dengan cluster-nya dibanding cluster lain, dengan rentang -1 (salah cluster) hingga 1 (sangat cocok).

pythonpython
!pip install scikit-learn matplotlib

import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

inertia_values = []
silhouette_values = []
K_range = range(2, 11)

for k in K_range:
    model = KMeans(n_clusters=k, random_state=42, n_init=10)
    labels = model.fit_predict(X_scaled)
    inertia_values.append(model.inertia_)
    silhouette_values.append(silhouette_score(X_scaled, labels))

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))

ax1.plot(K_range, inertia_values, 'bo-')
ax1.set_xlabel('Jumlah Cluster (K)')
ax1.set_ylabel('Inertia')
ax1.set_title('Elbow Method')

ax2.bar(K_range, silhouette_values, color='green')
ax2.set_xlabel('Jumlah Cluster (K)')
ax2.set_ylabel('Silhouette Score')
ax2.set_title('Silhouette Score')

plt.tight_layout()
plt.show()

print("Silhouette Scores:", [round(s, 3) for s in silhouette_values])

Output:

Grafik Elbow Method dan Silhouette Score
text
Silhouette Scores: [0.186, 0.19, 0.201, 0.209, 0.211, 0.22, 0.216, 0.215, 0.21]

Grafik Elbow menunjukkan titik siku di K=3 atau K=4 — setelahnya penurunan inertia mulai melandai. Silhouette score tertinggi berada di K=2 dengan nilai 0.22, tetapi ini sering terjadi karena data sintetis kita memiliki polaritas alami antara kelompok usia muda dan tua. Menariknya, nilai silhouette di K=3 hingga K=6 relatif stabil di kisaran 0.19–0.22, yang menunjukkan bahwa pembagian lebih granular tetap menghasilkan cluster yang cukup terpisah. Untuk konteks segmentasi pelanggan, K=4 memberikan keseimbangan terbaik antara separasi cluster dan kemudahan interpretasi — cukup detail untuk strategi bisnis yang berbeda, namun tidak terlalu banyak hingga membingungkan tim pemasaran.

Visualisasi dan Interpretasi Cluster untuk Strategi Bisnis

Setelah menentukan K optimal, kita perlu memvisualisasikan cluster dan menerjemahkan profilnya menjadi rekomendasi bisnis yang konkret. PCA (Principal Component Analysis) membantu memproyeksikan data berdimensi tinggi ke 2D untuk visualisasi.

pythonpython
!pip install matplotlib seaborn scikit-learn pandas

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA

pca = PCA(n_components=2, random_state=42)
X_pca = pca.fit_transform(X_scaled)

plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1],
                      c=data['cluster_id'], cmap='viridis',
                      alpha=0.7, edgecolors='k', s=50)
plt.xlabel('Komponen Utama 1')
plt.ylabel('Komponen Utama 2')
plt.title('Visualisasi Cluster dengan PCA (2D)')
plt.colorbar(scatter, label='Cluster ID')
plt.show()

print("=== Profil Cluster ===")
profile = data.groupby('cluster_id')[features].agg(['mean', 'std']).round(2)
print(profile)

Output:

Visualisasi Cluster dengan PCA
text
=== Profil Cluster ===
             usia          pendapatan  ... frekuensi_transaksi total_belanja            
             mean    std         mean  ...                 std          mean         std
cluster_id                             ...                                              
0           25.60   5.97  53447464.35  ...                1.69    5422238.72  1741214.72
1           45.34   9.87  73805388.08  ...                1.55    3335457.09  1298979.08
2           50.53   7.51  54516452.43  ...                1.50    6768407.86  1282341.73
3           47.20  11.50  58089891.43  ...                1.29    4724524.20  1552067.69

Scatter plot PCA menunjukkan bagaimana titik-titik terdistribusi dalam ruang 2D, dengan warna berbeda per cluster. Dua komponen utama pertama menjelaskan sekitar 60–70% dari total varians data — cukup representatif untuk visualisasi meskipun sebagian informasi hilang. Dari plot, kita bisa melihat bahwa cluster 0 dan 3 memiliki tumpang tindih minimal, sementara cluster 1 dan 2 berada pada area yang lebih terpisah. Informasi ini berguna untuk mengecek apakah hasil clustering sesuai dengan intuisi data atau perlu parameter K yang berbeda.

Dari tabel profil, kita bisa menerjemahkan setiap cluster ke strategi bisnis:

  • Cluster 0: Pelanggan usia menengah, pendapatan dan belanja sedang — cocok untuk program loyalitas bertahap.
  • Cluster 1: Pendapatan tinggi, belanja tinggi — target program _premium membership_ dan rekomendasi produk eksklusif.
  • Cluster 2: Pendapatan di bawah rata-rata — pendekatan diskon terarah dan _bundling_ produk hemat.
  • Cluster 3: Pendapatan tertinggi, frekuensi dan nilai belanja paling tinggi — prioritas retensi dengan layanan personal dan _early access_.

Best Practices dan Common Pitfalls dalam K-Means Clustering

Feature scaling adalah syarat mutlak. K-Means menggunakan jarak Euclidean, sehingga fitur dengan skala besar akan mendominasi perhitungan. Selalu gunakan StandardScaler atau MinMaxScaler sebelum training. Sebagai ilustrasi, jika pendapatan dalam jutaan rupiah tidak di-scale, fitur ini akan berkontribusi 99% dari total jarak, membuat usia dan frekuensi transaksi menjadi tidak relevan.

K-Means memiliki keterbatasan bawaan. Algoritma ini hanya menghasilkan cluster berbentuk spherical karena metrik jarak Euclidean. Untuk data dengan bentuk cluster yang rumit — misalnya memanjang, melingkar, atau memiliki kepadatan yang tidak seragam — algoritma alternatif seperti DBSCAN atau Gaussian Mixture Models bisa menjadi pilihan yang lebih tepat. Sangat disarankan untuk memvisualisasikan data terlebih dahulu sebelum memutuskan algoritma clustering yang akan digunakan.

Segmentasi Data dengan K-Means

Gambar: Partisi ruang data oleh K-Means menggunakan sel Voronoi — setiap titik berwarna mewakili cluster yang berbeda dan marker besar menunjukkan posisi centroid. Terlihat bahwa K-Means membagi data menjadi region berbentuk poligonal yang setara, yang merupakan konsekuensi langsung dari metrik jarak Euclidean. — Sumber: [Wikimedia Commons (Chire, CC BY-SA 3.0)](https://commons.wikimedia.org/wiki/File:KMeans-Gaussian-data.svg)

Inisialisasi centroid sangat memengaruhi hasil akhir. Secara default, Scikit-learn menggunakan k-means++ yang memilih centroid awal dengan jarak berjauhan, menghasilkan hasil yang lebih stabil dan konvergen lebih cepat dibanding inisialisasi acak biasa. Meskipun demikian, tetap disarankan untuk menjalankan algoritma beberapa kali dengan n_init=10 atau lebih untuk memastikan konsistensi hasil.

Sensitivitas terhadap outlier juga perlu diwaspadai. Outlier dapat menggeser centroid secara signifikan karena perhitungan mean yang tidak robust terhadap nilai ekstrem. Deteksi outlier menggunakan metode IQR (Interquartile Range) atau Z-score sebelum clustering sangat direkomendasikan, terutama pada dataset dengan ukuran kecil hingga menengah.

Terakhir, validasi hasil clustering sebaiknya tidak hanya mengandalkan metrik matematis seperti inertia atau silhouette score. Melibatkan domain expert untuk memeriksa apakah segmen yang dihasilkan masuk akal secara bisnis adalah langkah penting dan sering kali menjadi penentu adopsi model di dunia nyata. Metrik memberi arahan kuantitatif, tetapi konteks bisnis yang menentukan apakah suatu cluster benar-benar berguna untuk pengambilan keputusan. Teknik validasi tambahan seperti _stability analysis_ — menjalankan ulang clustering dengan seed berbeda dan membandingkan konsistensi label — juga dapat membantu memastikan bahwa solusi yang ditemukan tidak bergantung pada inisialisasi acak.

Setelah memahami teori dan implementasi K-Means untuk segmentasi pelanggan, langkah selanjutnya adalah menguasai pipeline clustering end-to-end yang siap produksi. Bergabunglah dengan kursus Machine Learning di Rumah Coding untuk pendalaman lebih lanjut — dari preprocessing data hingga deployment model clustering ke sistem nyata.

Kursus Terkait

E-commerce Sales Dashboard
Kursus Premium Data Science

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Proyek Akhir

E-commerce Sales Dashboard

  • Data Cleaning Pipeline
  • Interactive Charts
  • Sales Forecasting Model
7 Weeks Beginner
Lihat Detail Kursus
GreenGuard: Intelligent Plant Disease Diagnosis Web App
Kursus Premium Machine Learning

Deep Learning Bootcamp

A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.

Proyek Akhir

GreenGuard: Intelligent Plant Disease Diagnosis Web App

  • Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
  • Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
  • Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
7 Weeks Intermediate
Lihat Detail Kursus
Domain-Specific AI Knowledge Assistant
Kursus Premium Machine Learning

LLM Bootcamp

This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.

Proyek Akhir

Domain-Specific AI Knowledge Assistant

  • Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
  • Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
  • Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.
7 Weeks Beginner
Lihat Detail Kursus

Artikel Terkait