Tutorial K-Means Clustering dengan Python

 

Di Machine Learning, clustering termasuk di dalam unsupervised-algorithm yang berarti bahwa tidak ada proses training. Tujuan dari clustering adalah untuk memisahkan data ke dalam kelompok-kelompok dengan sifat-sifat yang sama dan menetapkannya ke dalam sebuah kategori.

Ada beberapa algoritma clustering yang bisa digunakan, di antaranya adalah: K-Means clustering, Mean-Shift Clustering, DBSCAN, Expectation–Maximization (EM) Clustering, dan Agglomerative Hierarchical Clustering. Namun di antara algoritma tersebut, K-Means lah yang sering digunakan dan diajarkan karena faktor kemudahan dalam pemahaman dan pengimplementasiannya.

Artikel kali ini akan membahas bagaimana mengimplementasikan algoritma K-Means Clustering dengan Python.

Ilustrasi penggunaan K-Means dalam clustering adalah seperti di bawah ini:

Ilustrasi K-Means Clustering
Ilustrasi K-Means Clustering

Pada gambar di atas, awalnya terdapat beberapa titik data yang tersebar di dalam Scatter plot. Selanjutnya dengan K-Means kita akan kelompokkan data-data tersebut berdasarkan kemiripan data.

Supaya lebih jelas bagaimana pengimplementasian K-Means clustering di Python, kita akan belajar sambil praktek.

Di sini kita akan menggunakan data yang berisi penghasilan satu keluarga dan jumlah anggota keluarga. Kemudian kita akan membuat clustering tingkat penghasilan per jumlah anggota keluarga.

Tampilan dataset yang akan kita gunakan adalah sebagai berikut :

Dataset untuk latihan

Import Library

Dalam praktik ini nanti, kita akan menggunakan 5 library yaitu:

  • Pandas
  • Numpy
  • Kmeans
  • Matplotlib.pyplot
  • StandardScaler

Oleh karena itu, terlebih dahulu kita import library-library di atas.

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler

Import CSV ke Dataset

Selanjutnya, kita mengimpor .csv file kita ke dalam dataset dengan cara sebagai berikut:

df = pd.read_csv('penghasilan-per-keluarga.csv')

Visualisasi Persebaran Data

Setelah berhasil mengimpor file dataset, kita sekarang memiliki data yang tiap barisnya berisi penghasilan dan jumlah anggota keluarga. Data itulah yang nanti akan kita buat clustering.

Untuk melihat persebaran data sebelum dilakukan clustering, terlebih dahulu kita bisa membuat scatter plot dengan cara seperti di bawah ini:

plt.scatter(df['JumlahAnggotaKeluarga'], df['Penghasilan (juta rupiah)'])
plt.xlabel('JumlahAnggotaKeluarga')
plt.ylabel('Penghasilan (juta rupiah)')

Perintah di atas akan memunculkan scatter plot seperti pada gambar berikut

Visualisasi persebaran data

Berdasarkan scatter plot tersebut, kita bisa melihat bahwa data masih belum terbagi menjadi kategori-kategori. Persebaran data inilah yang nanti akan kita bagi menjadi beberapa kategori, sehingga kita bisa mengelompokkan titik-titik mana saja yang masuk dalam kategori tersebut.

Data Scaling

Untuk mendapatkan hasil clustering yang optimal, kita perlu melakukan data scaling. Tujuan dari data scaling ini adalah membuat data berada dalam rentang (range) yang tidak terlalu jauh. Terkadang di dalam data muncul outlier atau pencilan, yang nanti bisa menganggu dalam proses clustering.

Dalam tutorial ini, untuk data scaling kita akan mengunakan StandardScaler, yang akan diimplementasikan terhadap data yang ada pada kolom ‘JumlahAnggotaKeluarga’ dan ‘Penghasilan (juta rupiah)’. Caranya adalah sebagai berikut :

scaler = StandardScaler()
scaler.fit(df)
df_scaled = scaler.transform(df)

Hasil dari data scaling di atas adalah berupa data array seperti dibawah ini:

Hasil data scaling

Kemudian setelah dilakukan data scaling, kita perlu nyatakan kembali data array hasil scaling di atas ke dalam dataframe supaya bisa diolah ke dalam K-Means Clustering. Caranya adalah sebagai berikut:

df_scaled = pd.DataFrame(df_scaled, columns=['JumlahAnggotaKeluarga','Penghasilan (juta rupiah)'])

Perintah di atas akan menghasilkan data sebagai berikut:

Scaled data

K-Means Clustering

Setelah dibuat dataframe berisi data setelah discaling, kita masuk ke tahap clustering. Cara melakukan clustering dengan metode K-Means Clustering adalah sebagai berikut:

km = KMeans(n_clusters=3)
km

y_predicted = km.fit_predict(df_scaled[['JumlahAnggotaKeluarga','Penghasilan (juta rupiah)']])
y_predicted

df['tipePenghasilan'] = y_predicted

Perintah di atas diawali dengan kita mendeklarasikan variabel km sebagai K-Means dengan jumlah cluster/kelompok yang diinginkan misalnya 3 buah.

Kemudian pada bagian y_predicted , kita melakukan clustering dari persebaran data penghasilan terhadap jumlah anggota keluarga, lalu menyimpan hasilnya di variabel y_predicted .

Lalu pada bagian akhir yaitu df['tipePenghasilan'] = y_predicted , kita memasukkan hasil clustering yang berupa one-dimensional array ke dataframe di kolom ‘tipe penghasilan’.

Dengan perintah df , maka dataframe yang kita hasilkan adalah sebagai berikut:

Dataframe setelah clustering

Note: nilai hasil cluster (nilai 0, 1, 2) tiap data bisa jadi berbeda dengan hasil di atas, namun setiap data masih berada dalam kelompok/kategori yang sama dengan data lainnya.

Visualisasi Clustered Data

Di awal tutorial ini, kita sudah menampilkan persebaran data yang belum dilakukan clustering. Setelah dilakukan clustering, kita berhasil mendapatkan tiga kelompok (cluster) data.

Adapun cara untuk menampilkan visualisasinya, adalah dengan scatter plot berwarna sebagai berikut:

df1 = df[df.tipePenghasilan==0]
df2 = df[df.tipePenghasilan==1]
df3 = df[df.tipePenghasilan==2]

plt.scatter(df1.JumlahAnggotaKeluarga,df1['Penghasilan (juta rupiah)'],color='green')
plt.scatter(df2.JumlahAnggotaKeluarga,df2['Penghasilan (juta rupiah)'],color='red')
plt.scatter(df3.JumlahAnggotaKeluarga,df3['Penghasilan (juta rupiah)'],color='black')

plt.xlabel('JumlahAnggotaKeluarga')
plt.ylabel('Penghasilan (juta rupiah)')
plt.grid()

Secara sederhana, perintah di atas adalah membuat 3 dataframe baru yang memisahkan masing-masing kategori tipe penghasilan (hasil clustering: 0, 1, dan 2). Kemudian kita membuat visualisasi dari ketiga dataframe tersebut dalam satu scatter plot. Untuk membedakan antar kelompok, kita beri 3 warna yang berbeda untuk masing-masing kategori. Perintah di atas menghasilkan scatter plot seperti di bawah ini :

Scatter plot clustered data with K-Means Clustering
Scatter plot clustered data

OK.. sekarang kita coba melihat interpretasi dari hasil clustering tersebut.

Dari cluster di atas, coba perhatikan pada jumlah anggota keluarga yang minimal terdapat 3 orang. Pada daerah tersebut, kita bisa melihat bahwa warna merah melambangkan kelompok yang berpenghasilan lebih tinggi dari warna hitam. Artinya tingkat penghasilan per anggota keluarga kelompok warna merah lebih tinggi daripada warna hitam.

Kemudian kita lihat juga pada jumlah anggota keluarga 2 orang. Kita bisa melihat bahwa warna hijau melambangkan penghasilan yang lebih tinggi daripada warna hitam. Artinya tingkat penghasilan per anggota keluarga kelompok warna hijau juga lebih tinggi daripada warna hitam.

Lantas bagaimana perbandingan antara kelompok warna hijau dan merah? manakah yang tingkat penghasilan per anggota keluarganya lebih tinggi? Dari cluster kita bisa melihat bahwa warna hijau adalah kelompok jumlah anggota keluarga kecil (1-2 anggota keluarga). Sedangkan warna merah termasuk kelompok jumlah anggota keluarga besar (minimal 3 anggota keluarga). Adapun jika dibandingkan jumlah penghasilan dari kedua kelompok tersebut, keduanya sebagian besar ada di range Rp 5.000.000 ke atas. Sehingga dari hal ini dapat disimpulkan bahwa tingkat penghasilan per anggota keluarga dari kelompok warna hijau lebih besar daripada warna merah.

Dengan demikian, jika dilihat dari tingkat penghasilan per anggota keluarga (misalkan diberi label: tinggi, rata-rata, dan rendah), urutannya adalah sebagai berikut:

  • Hijau (cluster 0) = Tinggi
  • Merah (cluster 1) = Rata-rata
  • Hitam (cluster 2) = Rendah

Memasukkan Hasil K-Means Clustering ke Dataframe

Setelah mengetahui label kategori berdasarkan masing-masing cluster. Kita bisa memasukkan label kategori tersebut pada tiap baris data. Caranya adalah sebagai berikut :

conditions = [
    (df['tipePenghasilan']==0),
    (df['tipePenghasilan']==1),
    (df['tipePenghasilan']==2)]
choices = ['Tinggi','Rata-rata','Rendah']
df['tipePenghasilan'] = np.select(conditions, choices)

Dengan perintah di atas, kita berhasil mengkonversi data tingkat penghasilan per anggota keluarga yang awalnya berupa numerik (0, 1, 2) menjadi data kategori sesuai yang kita buat. Dengan perintah df setelahnya, akan diperoleh dataframe seperti di bawah ini :

Dataframe setelah konversi cluster

Demikian Tutorial K-Means Clustering dengan Python. Mudah bukan? Kode program dan dataset yang digunakan dalam tutorial ini bisa diunduh di tautan di bawah ini.

Semoga bermanfaat.


Alumni dari Pendidikan Teknik Informatika dan Komputer, Universitas Sebelas Maret. Master Graduate of Computer Science and Information Engineering di National Central University, Taiwan. Sekarang bekerja sebagai Data Analyst di Teaching Excellence Center Divison, National Yunlin University of Science and Technology, Yunlin, Taiwan.

2 Comments

Leave a Reply