Machine Learning: K-Means Clustering

STUDI KASUS

Kali ini kita akan mengaplikasikan metode K-Means ini untuk sebuah permasalahan nyata. Anggap kita adalah seorang data scientist profesional yang diminta oleh klien untuk menganalisis data pelanggan yang berkunjung ke mall mereka. Mereka data pelanggan setia, namun mereka bingung cara mengelompokkan data ini, sehingga nantinya pengelompokan ini bisa mereka gunakan untuk semakin memperkuat hubungan mereka terhadap konsumen. Misal untuk penguatan marketing, strategi penawaran yang tepat, barang-barang apa saja yang cocok bagi mereka, dll.

Untuk bisa memulai, silakan download datasetnya di link ini.

Data yang kita miliki adalah :

  • ID pelanggan
  • Jenis kelamin
  • Usia
  • Penghasilan tahunan
  • Kategori pengeluaran saat belanja (1=kecil, 100=sangat besar)

Berikut adalah solusi K-Means dengan bahasa Python dan R.


Bahasa Python

# Mengimpor library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Mengimpor dataset
dataset = pd.read_csv('Pengunjung_mall.csv')
X = dataset.iloc[:, [3, 4]].values

# Menggunakan metode elbow untuk menentukan angka cluster yang tepat
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Metode Elbow')
plt.xlabel('Jumlah clusters')
plt.ylabel('WCSS')
plt.show()

# Menjalankan K-Means Clustering ke dataset
kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(X)

# Visualisasi hasil clusters
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')
plt.title('Clusters pelanggan')
plt.xlabel('Pendapatan tahunan (juta Rupiah)')
plt.ylabel('Rating pengeluaran (1-100)')
plt.legend()
plt.show()

Penjelasan:

  • Line 2 sampai 4 mengimpor library yang dibutuhkan
  • Line 7, mengimpor dataset

Jika benar, maka datasetnya akan tampak sebagai berikut:

  • Line 8, melakukan slicing, dari dataset yang dimiliki. Kita hanya memerlukan kolom ke 3 (pendapatan) dan 4 (rating pengeluaran) saja

Jika slicing nya benar, maka akan tampak sebagai berikut:

  • Line 11, mengimpor library K-Means.
  • Line 12, membuat list WCSS (mempersiapkan perhitungan WCSS).
  • Line 13 adalah perintah looping, perlu diingat bahwa kita ingin melakukan looping 10 kali. Oleh karena itu di python ditulis range(1,11), karena angka 11 tidak diikutkan oleh python. Sehingga jika ingin iterasi sebanyak 21 kali misalnya, maka penulisannya range (1,22).
  • Line 14 adalah menuliskan objek kmeans untuk melakukan algoritma K-Means. Selanjutnya perintah pertama adalah KMeans (kapital K dan M), yang merupakan class dari library K-Means yang diimpor di line 11, dengan beberapa parameter n_clusters yang merupakan jumlah kluster, diikuti dengan parameter kedua init yang merupakan pemilihan jumlah K di awal (kali ini kita gunakan K++, agar tidak terkena jebakan centroid. Kemudian parameter yang terakhir adalah random_state = 42. Random state ini seperti seed pada R, yang jika dipilih 42, maka ketika kita memilih 42 di kesempatan yang berbeda, maka bilangan random yang dihasilkan akan sama. Tips: Arahkan kurson pada KMeans, lalu ketik CTRL+i pada keyboard untuk menampilkan parameter apa saja yang diperlukan.
  • Line 15 merupakan perintah agar objek kmeans di line 14, digunakan untuk mengolah data X yang sudah kita definisikan di line 8.
  • Line 16 merupakan perintah untuk menghitung WCSS dengan menuliskan perintah append setelah wcss. Append merupakan method di python untuk menambahkan objek. Algoritma wcss dituliskan dengan perintah kmeans.inertia_ (dengan underscore).
  • Line 17 merupakan perintah untuk menampilkan plot. Sumbu x pada plot adalah jumlah kluster dari 1-10, maka ditulis range(1,11). Sumbu y nya adalah skor wcss yang dihitung di line 16.
  • Line 18-20 adalah perintah plot untuk estetika, seperti nama sumbu x, sumbu y dll.
  • Line 21 adalah perintah menampilkan plotnya.

Jika benar, maka tampilan plotnya akan tampak sebagai berikut:

Hasil perhitungan WCSS dari K=1 sampai K=10

Melalui gambar di atas, dapat dilihat bahwa bentuk elbow (siku) terlihat saat jumlah kluster adalah 5. Oleh karena itu, kita tentukan bahwa jumlah K yang baik adalah 5.

Note: Jika pembaca berpendapat bahwa bentuk siku juga terlihat pada K=3, maka itu juga benar. Dalam kondisi seperti ini, di mana K=3 dan K=5 menunjukkan bentuk siku, kita pilih yang nilai K nya lebih besar, dalam hal ini K=5.

  • Sekarang saatnya kita memilih jumlah kluster=5. Line 24 adalah perintah melakukan K-Means clustering terhadap objek kmeans. Perintahnya mirip dengan line 14, namun kali ini parameter n_clusters diisi dengan 5.
  • Line 25 adalah melakukan prediksi seperti apa pengelompokan klusternya jika kita pilih K=5. Kita siapkan objek y_kmeans (tentu saja pemilihan nama ini bebas) dengan method bukan fit melainkan fit_predict terhadap variabel X yang sudah didefinisikan di line 8.

Jika kita bandingkan antara variable dataset dengan y_predict, maka kita bisa lihat bahwa id pelanggan 1 masuk ke kluster no 2, id pelanggan 13 masuk ke kluster no 13, dst. Sebagai catatan, kluster yang ada memiliki nomor urut 0 sampai 4, karena dalam python urutan dimulai dari nol.

Bisa dilihat pembagian tiap id pelanggan ke dalam masing-masing kluster.
  • Line 28-38 menampilkan hasil clusteringnya.
  • Line 28 adalah perintah untuk menampilkan semua data poin yang masuk ke cluster 1. Berikut penjelasan detailnya:

Kita ingin menampilkan scatter plot, sehingga perintahnya adalah plt.scatter. Parameter untuk plt.scatter adalah sumbu x, kemudian diikuti sumbu y nya. Sumbu x adalah pendapatan tahunan, dan sumbu y adalah rating pengeluaran. Sumbu x dan y nya dari objek X yang didefinisikan di line 8.

Kemudian untuk sumbu x nya ditulis X[y_kmeans == 0, 0] artinya data poin nya berasal dari objek X. Penulisan y_kmeans == 0 adalah untuk mewakili baris X yang dipilih, yaitu baris yang clusternya masuk ke cluster 1 (urutan dimulai dari nol).

Untuk kolomnya mudah saja, karena ia adalah data penghasilan tahunan, maka kolom 1 objek X yang kita pilih, sehingga penulisannya setelah
y_kmeans == 0 adalah koma, kemudian diikuti nol.

Untuk sumbu y nya, ditulis X[y_kmeans == 0, 1] di mana bisa langsung dilihat bahwa kolom untuk rating pengeluaran rutin adalah kolom ke 2, ditulis 1 di python.

Begitu seterusnya sampai kluster kelima.

  • Line 38 adalah perintah untuk menampilkan plotnya.

Jika benar, maka tampilan klusternya tampak sebagai berikut:

Melalui gambar di atas bisa dilihat pembagian data points ke dalam kluster yang sangat rapi, di mana terlihat semua data points masuk ke dalam kluster masing-masing. Selain itu pembagian kliusternya juga baik, tampak jarak yang tidak saling berdekatan.


Bahasa R

# Mengimpor dataset
dataset = read.csv('Pengunjung_mall.csv')
dataset = dataset[4:5]

# Menggunakan metode elbow untuk menemukan angka cluster yang optimal
set.seed(6)
wcss = vector()
for (i in 1:10){
  wcss[i] = sum(kmeans(dataset, i)$withinss)
} 
plot(1:10,
     wcss,
     type = 'b',
     main = paste('The Elbow Method'),
     xlab = 'Number of clusters',
     ylab = 'WCSS')

# Menjalankan K-Means Clustering
set.seed(29)
kmeans = kmeans(x = dataset, centers = 5)
y_kmeans = kmeans$cluster

# Visualisasi hasil clusters
library(cluster)
clusplot(dataset,
         y_kmeans,
         lines = 0,
         shade = TRUE,
         color = TRUE,
         labels = 2,
         plotchar = FALSE,
         span = TRUE,
         main = 'Klusters pelanggan',
         xlab = 'Pendapatan tahunan',
         ylab = 'Rating pengeluaran')

Penjelasan:

  • Line 2 adalah mengimpor dataset

Jika benar, maka akan tampak sebagai berikut:

  • Line 3 adalah melakukan slicing dataset. Kita hanya menginginkan kolom ke 4 (penghasilan tahunan) dan 5 (rating pengeluaran rutin) saja.
  • Line 6 adalah menyiapkan random generatornya. Kali ini kita pilih 6 (tentu saja bebas).
  • Line 7 adalah menyiapkan objek wcss untuk membandingkan jumlah kluster nantinya.
  • Line 8-10 adalah looping untuk kalkulasi wcss. Perlu diperhatikan bahwa kita menggunakan tambahan $withinss. Mengapa? Coba arahkan kursor pada kmeans, kemudian ketik F1 maka akan muncul parameter kmeans. Kemudian lihat di bagian values, maka akan terlihat bahwa parameter yang diperlukan untuk menghitung within cluster adalah menggunakan parameter $withinss. Tampilan nya tampak sebagai berikut:
Parameter yang diperlukan
  • Line 11-16 menampilkan plot skor wcss untuk setiap jumlah kluster. Tampilannya tampak sebagai berikut:

Bisa dilihat bahwa bentuk elbow (siku) terlihat saat jumlah kluster adalah 5 (K=5).

  • Line 19 kita menentukan random number generator untuk kalkukasi data yang kita miliki.
  • Line 20 melakukan perhitungan K-Means Clustering dengan jumlah kluster dari penilaian wcss yaitu 5 kluster.
  • Line 21 adalah membuat objek y_kmeans sebagai hasil dari pembagian kluster di line 20. Perlu diperhatikan, tambahkan metode cluster di belakangnya.
  • Line 24, mengimpor library cluster untuk menampilkan visualisasi K-Means nya.
  • Line 25 sampai 35 adalah visualisasi nya. Jika benar, maka akan tampak sebagai berikut:
Hasil K-Means Clustering.
Terlihat ada 5 kluster yang berhasil memasukkan semua data points.

Untuk melanjutkan membaca, silakan klik halaman berikutnya di bawah ini.

Bagikan artikel ini:

Pages: 1 2 3 4

2
Leave a Reply

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
MB HerlambangRizki Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Rizki
Guest
Rizki

makasih pak, sangat jelas detail dan bisa di jalankan tanpa adanya kesulitan