Pada praktikum ini Anda akan mencoba membuat model clustering menggunakan heirarchical clustering. Anda diminta untuk membuat kelompok-kolompok customer pada toko ritel berdasarkan fitur Annual Income dan Spending Score.
import numpy as npimport matplotlib.pyplot as pltimport pandas as pd
Langkah 2 - Load Dataset
Pada tahap ini, load dataset yang telah di unduh. Kemudian lakukan inspeksi terhadap data.
Anda akan mendapatkan hasil seperti,
Langkah 3 - Slicing Fitur
Selanjutnya, kita akan melakukan proses slicing untuk menggunakan fitur Annual Income dan Spending Score saja.
Langkah 4 - Visualisasi Dendogram
Untuk mempermudah penentuan cluster, kita akan membuat visualisasi dendogram. Visualisasi ini dapat dimanfaatkan untuk menentukan jumlah cluster. Nilai threshold pada sumbu x digunakan untuk menentukan jumlah cluster berdasarkan dendogram.
Hasil dendogram adalah sebagai berikut,
Pada dendogram, dihasilkan 3 buah cluster utama, orange, hijau, dan merah. Akan tetapi, jika kita menggunakan nilai threshold yang rendah, misal 100 - 150, maka kita akan mendapatkan 5 cluster.
Langkah 5 - Membuat Model Agglomerative
Buat cluster dengan menggunakan model Agglomeratvie (bottom-up) dengan jumlah 5 cluster.
Langkah 6 - Visualisasi Cluster
Untuk mengetahui hasil cluster, visualisasikan cluster dengan menggunakan scatterplot.
Hasilnya adalah sebagai berikut,
Langkah 7 - Evaluasi Hasil Cluster
Lakukan evaluasi hasil cluster dengan menggunakan silhouette coefficient.
Didapatkan hasil berkisar,
Hasil dari silhouette score menunjukkan hasil yang cukup baik dengan nilai berkisar 0.55. Anda dapat bereksperimen dengan mengubah jumlah klaster untuk mengetahui jumlah cluster mana yang terbaik.
# Slicing - Select Annual Income and Spending Score only
X = df.iloc[:, [3, 4]].values # property values will take only the 'values' -> return in ndarray
# Build dendogram
import scipy.cluster.hierarchy as sch
# Build dendogram using ward distance
# more info - https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html
dendrogram = sch.dendrogram(sch.linkage(X, method = 'ward'))
# Plot
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Euclidean distances')
plt.show()
# Build Cluster using Agglomerative Method
from sklearn.cluster import AgglomerativeClustering
hc = AgglomerativeClustering(n_clusters = 5, metric = 'euclidean', linkage = 'ward')
y_hc = hc.fit_predict(X)
# Visualize The Result
plt.scatter(X[y_hc == 0, 0], X[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_hc == 1, 0], X[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_hc == 2, 0], X[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_hc == 3, 0], X[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_hc == 4, 0], X[y_hc == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
from sklearn.metrics import silhouette_score
# Evaluate the clustering using silhouette coefficient
silhouette_avg = silhouette_score(X, y_hc)
print(f'Silhouette Coefficient: {silhouette_avg}')