Machine Learning: K-Means Clustering

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

Subscribe
Notify of
guest
45 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Rizki
Rizki
11 months ago

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

Eko
Eko
8 months ago

Kalau mengacu pada formula machine learning (Tom M. Mitchell), Formula T,P,E (Task,Performance,Experience) untuk kasus clustering/unsupervised learning ini mengidentifikasinya bagaimana ya pak?

Zulfikar
Zulfikar
6 months ago

cara menampilkan table dataset dan dataframe gimana? thanks

Zulfikar
Zulfikar
Reply to  MB Herlambang
5 months ago

saya kurang paham spyder soalnya saya hanya menggunakan jupyter notebook yg muncul hanya gambar elbow dan hasil clustering nya saja apa ada cara lain jika menggunakan jupyter notebook? Terimakasih pak

Zulfikar
Zulfikar
Reply to  MB Herlambang
5 months ago

kalau tabel basil clustring (y_means) bisa? maaf banya tanya baru belajar? saya coba pake algoritma r sudah bisa cuman install spyder ada error saya ga tau kenapa jadi saya masih penasaran

Zulfikar
Zulfikar
Reply to  MB Herlambang
5 months ago

supaya tahu id mana di cluster mana..karena di website bapak tidak ada keteranganya cluster merah itu id berapa saja dst..terimakasih pak

Zulfikar
Zulfikar
Reply to  MB Herlambang
5 months ago

terimakasih banyak pak infonya sangat membantu semoga ilmunya berkah ya pak ๐Ÿ˜€

dian samuel
dian samuel
5 months ago

halo pak, saya mau bertanya, dari sekian banyak kolom yang ada dalam dataset, bagaimana menentukan 2 kolom terakhir untuk digunakan dalam kmeans clustering?

dian samuel
dian samuel
Reply to  MB Herlambang
5 months ago

misalnya pak, kita mengacu penggunaan data iris yang sering digunakan, nah dari kebanyakan pengaplikasian iris dataset pada kmeans clustering,variabel yang digunakan adalah petal width dan petal length. apakah ada teknik khusus pak? ataukah di kmeans itu sendiri, sudah memilih variabel mana yang cocok untuk dikelompokkan?

dian samuel
dian samuel
Reply to  MB Herlambang
3 months ago

halo pak, mau bertanya lagi, bagaimana pengerjaan taknik elbow secara manual ya pak?

dian samuel
dian samuel
Reply to  MB Herlambang
3 months ago

terimakasih pak, saya sudah mencoba. Saya mau bertanya kembali, apakah bapak ada memuat artikel tentang k-means yang memakai trick kernel (kernel K-Means)? saya sudah mencari di website ini dan hasilnya not found.

Resty
Resty
5 months ago

Saya bary pertama kali memakai RStudio ini, mu tanya kalau muncul “Error : objeck ‘wcss’ not found’ itu kenapa ya?. Itu muncul nya setelah baris for di Run

Resty
Resty
Reply to  MB Herlambang
4 months ago

Terimakasih Pak, yg itu sudah berhasil dan sudah muncul grafiknya. Cuman saya masih bingung dengan hasilnya, hasil bapak kenapa bisa 50000, 100000 dst…? Sedangkan grafik saya hasilnya 0e+00 dan 4e+10, itu kenapa ya? boleh dibantu lagi pak…

Resty
Resty
Reply to  MB Herlambang
4 months ago

Iya pak membahas k-means

Resty
Resty
Reply to  MB Herlambang
4 months ago

Sudah di eksekusi dan grafiknya sudah muncul. Kalau grafik bapak kan bagian wcss di grafiknya itu mucul angka 50000, 100000, 150000 dst. sedangkan saya muncul di bagian wcss grafiknya itu 0e+00, 4e+10. itu kenapa ya pak? apa itu karena pengaruh data yang dimasukkan?

Resty
Resty
Reply to  MB Herlambang
4 months ago

Iya pak datanya menggunakan data sendiri, jadi tidak ada masalah berarti ya pak? saya kira itu ada error atau apa. Terimakasih banyak pak jawabannya sangat membantu sekali

Ramadhan
Ramadhan
4 months ago

caranya gimana pak? apa eksekusi perbaris? saya error terus

Abdul
Abdul
3 months ago

Aslm pak..mo tanya ttg k-means..
Jika data yg saya punya dlm bentuk data categorical sebanyak 7 fitur dan datanya sebanyak 100 baris..
Bagaimana cara mengubah data categorical ke dlm numeric?
Kl menggunakan python source code nya bagaimana?
Terima kasih..

dede brahma
dede brahma
2 months ago

mas izin belajar dari code nya.
terima kasih buat ilmunya ๐Ÿ™‚

Muhammad Taufik
Muhammad Taufik
2 months ago

pak saya mau bertanya kalo untuk data pekanggan hotel bisa di cluster?dan outputnya segementasi pelanggan bisa?saya masih kurang paham pak terimakasih

dian samuel
dian samuel
2 months ago

selamat siang pak, mau bertanya saya punya data facebook untuk user yang melakukan penjualan online baik melalui vidio, status, photo dan link dengan feature status_publis yang berisi tanggal dan waktu publis, dan reaksi terhadap penjualan yakni berupa comment, likes, share. Kemudian setelah saya analisis ternyata status_publis tersebut bisa saya perlebar lagi menjadi hari publis jualan, waktu publis jualan, bulan publis jualan, dan tahun publis jualan dengan satuan yang berbeda-beda. Saya mau bertanya, apakah saya bisa mengelompokkan data saya tersebut menggunakan k-means walaupun satuannya berbeda-beda yakni ada yang satuan bulan, tahun, hari, dan jam serta untuk reaksi seperti commens, likes, shares… Read more »

dian samuel
dian samuel
Reply to  MB Herlambang
2 months ago

oo begitu terimakasih pak. Mau bertanya kembali, apakah bapak pernah membahasa Kernel K-Means?

Linggar bagas
2 months ago

Pak kalau hasil uji k-means pakai silhuette coefficient dan purity measure itu bagaimana penerapannya pada python, mohon bantuanya pak

Ekki Rizki Ramadhan
Ekki Rizki Ramadhan
1 month ago

Hallo pak, Maaf sebelumnya pak, saya ingin bertanya untuk pengukuran kualitas dari clustering. sebenarnya saya sendiri masih bingung dalam hal penerapan Teknik Elbow, silhouette, dan DBI. dan jujur, saya sangat kurang paham dalam statistika karena memang diajarkan hanya untuk digunakan, menurut bapak, dari ketiga metoda diatas yang paling cocok untuk pengukuran clustering itu yang mana ya pak? selain itu untuk keyword dalam mencari di jurnal sekiranya apa ya pak? sudah beberapa belakangan ini saya sedikit buntu. sekian dan terima kasih pak

Ekki Rizki Ramadhan
Ekki Rizki Ramadhan
Reply to  MB Herlambang
1 month ago

Terima kasih pak atas jawabannya. Saya ingin bertanya kembali. Sebelumnya, Saya sudah mencoba ketiganya pak, tapi hasilnya tidak bersinergi. Jika salah satunya hasilnya bagus, apakah saya perlu menggunakan salah satunya saja pak?

Misal, di dalam riset saya silhouette sangat bagus jika k = 2, sedangkan di elbow k=2 & k=3 termasuk, dan pada davies bouldin k=5 yang hasilnya bagus. Nah jika dilihat dari validasinya berarti lebih baik saya memasukkan sillhouette dan elbow ya pak?