Studi Kasus Clustering Pelanggan Mall

Data Preparation

Dataset Mall Customers berisi informasi pelanggan, seperti usia, pendapatan tahunan, dan skor pengeluaran. Dataset ini digunakan untuk mengelompokkan pelanggan berdasarkan kemiripan karakteristik belanja.

  • CustomerID: ID pelanggan
  • Gender: Jenis kelamin
  • Age: Usia
  • Annual Income (k$): Pendapatan tahunan dalam ribuan dolar
  • Spending Score: Skor belanja (1-100)
import pandas as pd

# Load data
url = "https://raw.githubusercontent.com/sharmaroshan/Mall-Customer-Segmentation-Dataset/master/Mall_Customers.csv"
df = pd.read_csv(url)
df.columns = df.columns.str.strip()
print(df.head())

Exploratory Data Analysis (EDA)

import matplotlib.pyplot as plt
import seaborn as sns

sns.histplot(df['Age'], kde=True)
plt.title("Distribusi Usia")
plt.show()

sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Gender', data=df)
plt.title("Pendapatan vs Skor Belanja")
plt.show()

Visualisasi scatter menunjukkan ada kelompok pelanggan berdasarkan pola pendapatan dan skor belanja.

Feature Engineering

  • Konversi Gender menjadi numerik (0=Female, 1=Male)
  • Gunakan kolom Annual Income dan Spending Score untuk clustering
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['Gender'] = le.fit_transform(df['Gender'])
X = df[['Annual Income (k$)', 'Spending Score (1-100)']]

Model Training (K-Means)

from sklearn.cluster import KMeans

# Menentukan jumlah cluster optimal dengan Elbow Method
inertia = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X)
    inertia.append(kmeans.inertia_)

plt.plot(range(1, 11), inertia, marker='o')
plt.xlabel("Jumlah Cluster")
plt.ylabel("Inertia")
plt.title("Elbow Method")
plt.show()

# Pelatihan akhir
kmeans = KMeans(n_clusters=5, random_state=42)
df['Cluster'] = kmeans.fit_predict(X)

Model Evaluation & Visualisasi

plt.figure(figsize=(8,6))
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', palette='tab10', data=df)
plt.title("Segmentasi Pelanggan berdasarkan Cluster")
plt.show()

Visualisasi ini menunjukkan pembagian pelanggan menjadi beberapa segmen berdasarkan pengelompokan K-Means.

Tuning & Finalisasi

Untuk meningkatkan hasil clustering, kita dapat menggunakan metrik seperti Silhouette Score untuk menentukan jumlah cluster terbaik secara objektif:

from sklearn.metrics import silhouette_score
  
  for k in range(2, 11):
      model = KMeans(n_clusters=k, random_state=42)
      labels = model.fit_predict(X)
      score = silhouette_score(X, labels)
      print(f"k={k}, Silhouette Score={score:.4f}")

Nilai tertinggi dari silhouette score menandakan jumlah cluster terbaik. Umumnya antara 0.5–0.7 dianggap cukup baik.

Menyimpan dan Memuat Model

Setelah model terbaik diperoleh, simpan model untuk penggunaan berikutnya.

import joblib
  
  # Simpan model
  joblib.dump(kmeans, "model_kmeans.pkl")
  
  # Load model kembali
  loaded_model = joblib.load("model_kmeans.pkl")
  labels = loaded_model.predict(X)

Latihan Teknis

  1. Gunakan fitur tambahan seperti Age dalam clustering dan hitung ulang silhouette score.
  2. Eksperimen dengan algoritma lain seperti DBSCAN atau AgglomerativeClustering.
  3. Visualisasikan pusat cluster dengan menampilkan kmeans.cluster_centers_.
  4. Simpan hasil akhir cluster dalam file .csv dengan df.to_csv("hasil_cluster.csv").