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:
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 :
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
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:
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:
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:
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 :
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 :
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.












2 Comments
muh faiq
November 28, 2021 at 1:16 pmSaat menajalankan
km = KMeans(n_clusters=3)
km
y_predicted = km.fit_predict(df_scaled[[‘JumlahAnggotaKeluarga’,’Penghasilan (juta rupiah)’]])
y_predicted
df[‘tipePenghasilan’] = y_predicted
muncul pesan seperti ini
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:7: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
import sys
Rosihan Ari Yuana
November 30, 2021 at 5:47 amItu hanya sekedar warning saja, bukan fatal error. Itu biasa muncul krn beda versi di Pandas nya, shg memberikan saran untuk mengubah style codingnya sesuai versi terbaru. Warningnya bisa dihilangkan dg mendisable confignya spt yang dijelaskan di https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas