Dataset Mall Customers berisi informasi pelanggan, seperti usia, pendapatan tahunan, dan skor pengeluaran. Dataset ini digunakan untuk mengelompokkan pelanggan berdasarkan kemiripan karakteristik belanja.
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())
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.
Gender
menjadi numerik (0=Female, 1=Male)Annual Income
dan Spending Score
untuk clusteringfrom sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Gender'] = le.fit_transform(df['Gender'])
X = df[['Annual Income (k$)', 'Spending Score (1-100)']]
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)
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.
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.
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)
Age
dalam clustering dan hitung ulang silhouette score.kmeans.cluster_centers_
..csv
dengan df.to_csv("hasil_cluster.csv")
.