🥇Lab 1

Hierarchical Clustering

Pengantar

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.

Langkah 0 - Download Dataset

⬇️ Download ⬇️

Langkah 1 - Import Library

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Langkah 2 - Load Dataset

Pada tahap ini, load dataset yang telah di unduh. Kemudian lakukan inspeksi terhadap data.

# Load dataset
df = pd.read_csv('Mall_Customers.csv')

# Inspect info
df.info()

Anda akan mendapatkan hasil seperti,

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

Langkah 3 - Slicing Fitur

Selanjutnya, kita akan melakukan proses slicing untuk menggunakan fitur Annual Income dan Spending Score saja.

# Slicing - Select Annual Income and Spending Score only
X = df.iloc[:, [3, 4]].values # property values will take only the 'values' -> return in ndarray

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.

# 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()

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.

# 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)

Langkah 6 - Visualisasi Cluster

Untuk mengetahui hasil cluster, visualisasikan cluster dengan menggunakan scatterplot.

# 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()

Hasilnya adalah sebagai berikut,

Langkah 7 - Evaluasi Hasil Cluster

Lakukan evaluasi hasil cluster dengan menggunakan silhouette coefficient.

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}')

Didapatkan hasil berkisar,

Silhouette Coefficient: 0.5529945955148897

Hasil dari silhouette score menunjukkan hasil yang cukup baik dengan nilai berkisar 0.550.55. Anda dapat bereksperimen dengan mengubah jumlah klaster untuk mengetahui jumlah cluster mana yang terbaik.

Last updated