Cara menggunakan KMEANS++ pada Python

Analisis Cluster atau Clustering merupakan salah satu metode pada analisis multivariat, yang memiliki tujuan untuk mengelompokkan objek-objek berdasarkan karakteristik yang dimilikinya.

Analisis cluster akan mengelompokkan individu atau objek penelitian, sehingga setiap objek yang paling dekat kesamaannya dengan objek lain berada dalam cluster yang sama [1].

K-Means Clustering

K-Means merupakan salah satu algoritma clustering, dimana pada algoritma ini, komputer akan mengelompokkan sendiri data-data yang menjadi masukannya tanpa mengetahui terlebih dulu target kelasnya[2].

Pembelajaran ini termasuk dalam Unsupervised Learning. Input yang diterima berupa data [objek] dan k buah kelompok [cluster] yang diinginkan. Algoritma ini akan mengelompokkan data [objek] ke dalam k buah kelompok tersebut. Pada setiap cluster terdapat titik pusat [centroid] yang merepresentasikan cluster tersebut [2].

Algoritma K-Means Clustering

Berikut ini langkah-langkah dari algoritma untuk melakukan K-Means clustering [3]:

  1. Pilih K buah titik centroid secara acak.
  2. Kelompokkan data sehingga terbentuk K buah cluster dengan titik centroid dari setiap cluster merupakan titik centroid yang telah dipilih sebelumnnya.
  3. Perbaharui nilai titik centroid.
  4. Ulangi langkah 2 dan 3 sampai nilai dari titik centroid tidak lagi berubah.

Proses pengelompokkan data ke dalam suatu cluster dapat dilakukan dengan cara menghitung jarak terdekat dari suatu data ke sebuah titik centroid. Rumus untuk menghitung jarak tersebut adalah [4] :

dengan:

Sedangkah untuk pembaharuan suatu titik centroid dapat dilakukan dengan rumus berikut [4]:

The Business Goal

Tujuan dari penyelesaian permasalahan ini, yaitu untuk melakukan segmentasi customer berdasarkan RFM [Recency, Frequency dan Monetary], sehingga perusahaan dapat menargetkan segmentasi customer secara lebih efisien.

Berikut ini, merupakan langkah-langkah untuk menyelesaikan permasalahan segmentasi customer pada dataset OnlineRetail menggunakan K-Means Clustering:

Step 1 : Importing the Library

Hal pertama yang harus dilakukan adalah meng-import beberapa Library Python untuk kebutuhan dataframe, visualisasi dan clustering, dengan langkah-langkah sebagai berikut:

# Library untuk dataframe dan visualisasi
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime as dt
# Import library untuk Clustering
import sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

Step 2 : Reading and Understanding the Data

Langkah selanjutnya, yaitu meng-input dataset. Dataset yang akan digunakan pada tulisan ini adalah dataset OnlineRetail. Klikdisini untuk mengakses dataset tersebut. Dataset OnlineRetail merupakan sekumpulan data transaksional dari toko-toko online/retail di UK yang terdaftar di suatu perusahaan retail online, dengan rentang waktu periode 1 Desember 2010 sampai dengan tanggal 9 Desember 2011. Berikut adalah langkah untuk meng-input dataset dan melihat detail informasi tentang dataset:

# Load dataset OnlineRetail
df = pd.read_csv['OnlineRetail.csv', sep=",", encoding="ISO-8859-1", header=0]
df.head[]

Berdasarkan output diatas, dapat disimpulkan bahwa dataset tersebut memiliki 8 atribut, diantaranya: InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID dan Country. Untuk detail info dan statistika deskriptif terkait dataset tersebut dapat diperoleh pada output-output dibawah ini:

df.info[]

df.describe[]

Step 2 : Data Cleansing

Langkah selanjutnya yaitu akan dilihat komposisi persentase missing value yang terdapat pada dataset, dengan langkah sebagai berikut:

df_null = round[100*[df.isnull[].sum[]]/len[df], 2]
df_null

Berdasarkan output tersebut, dapat disimpulkan bahwa masih terdapat beberapa atribut yang memiliki missing value. Oleh karena itu, akan dilakukan penghapusan terhadap baris-baris yang mengandung missing value, dengan langkah sebagai berikut:

Pada output df.info[], diperoleh informasi bahwa atribut CustomerID memiliki tipe data float64, selanjutnya akan dilakukan pengubahan tipe data pada atribut tersebut menjadi str, dengan langkah sebagai berikut:

df['CustomerID'] = df.CustomerID.astype[str]

Step 3 : Data Preparation

Seperti yang telah disebutkan sebelumnya bahwa, tujuan analisis yang dilakukan pada case ini adalah untuk memperoleh segmentasi dari atribut Customers, yang didasarkan pada 3 faktor berikut:

  • R [Recency] : Jumlah hari sejak pembelian terakhir
  • F [Frequency] : Jumlah ‘proses transaksi’
  • M [Monetary] : Jumlah total transaksi [kontribusi pendapatan]

Maka, langkah pertama yang harus dilakukan adalah membuat atribut baru “Monetary” dengan detail dan perhitungan sebagai berikut:

# Membuat atribut baru : Monetary
df['Monetary'] = df['Quantity']*df['UnitPrice']
rfm_m = df.groupby['CustomerID']['Monetary'].sum[]
rfm_m = rfm_m.reset_index[]
rfm_m.head[]

Langkah selanjutnya, membuat atribut baru “Frequency” dengan detail dan perhitungan sebagai berikut:

# Membuat atribut baru : Frequency
rfm_f = df.groupby['CustomerID']['InvoiceNo'].count[]
rfm_f = rfm_f.reset_index[]
rfm_f.columns = ['CustomerID', 'Frequency']
rfm_f.head[]

Kemudian, akan dilakukan merging[penggabungan] antara dataframe rfm_m dan rmf_f, sebagai berikut:

# Menggabungkan [merging] dua dataframe
rfm = pd.merge[rfm_m, rfm_f, on='CustomerID', how='inner']
rfm.head[]

Langkah selanjutnya, yaitu membuat atribut baru “Recency” dengan cara meng-convert tipe data atribut “InvoiceDate” menjadi datetime terlebih dahulu, dengan langkah sebagai berikut:

# Membuat atribut baru : Recency
df['InvoiceDate'] = pd.to_datetime[df['InvoiceDate'],format='%d-%m-%Y %H:%M']

Kemudian, akan ditampilkan tanggal maksimal, untuk mengetahui tanggal terakhir kali melakukan transaksi :

Selanjutnya akan dihitung selisih nilai antara tanggal terakhir melakukan transaksi [max_date] dengan masing-masing tanggal yang terdapat di atribut “InvoiceDate”. Dimisalkan nilai selisih tersebut didefinisikan sebagai atribut baru “Diff”:

# Menghitung selisih antara max_date dengan InvoiceDate
df['Diff'] = max_date - df['InvoiceDate']
df.head[]

Selanjutnya, akan dihitung waktu terakhir customer melakukan transaksi guna mendefinisikan atribut Recency atau jumlah hari sejak pembelian terakhir.

# Menghitung the last transaction date untuk atribut Recencyrfm_p = df.groupby['CustomerID']['Diff'].min[]
rfm_p = rfm_p.reset_index[]
rfm_p.head[]

Oleh karena, pada atribut Recency hanya dibutuhkan data terkait jumlah hari saja, maka selanjutnya akan dilakukan ekstraksi, atau hanya akan diambil data keterangan hari saja.

# Extract jumlah hari
rfm_p['Diff'] = rfm_p['Diff'].dt.days
rfm_p.head[]

Setelah 3 atribut baru yaitu : Recency [dataframe : rfm_p], Frequency [dataframe : rfm_f]dan Monetary [dataframe : rfm_m] terbentuk, maka langkah selanjutnya yaitu menggabungkan ke-tiga atribut/ kolom tersebut menjadi RFM dataframe, dengan langkah sebagai berikut:

# Menggabungkan dataframe 
rfm = pd.merge[rfm, rfm_p, on='CustomerID', how='inner']
rfm.columns = ['CustomerID', 'Amount', 'Frequency', 'Recency']
rfm.head[]

Langkah selanjutnya akan dilakukan analisis terhadap outlier menggunakan boxplot, dengan langkah sebagai berikut:

# Outlier Analysis of Monetary, Frequency and Recencyattributes = ['Monetary','Frequency','Recency']
plt.rcParams['figure.figsize'] = [10,8]
sns.boxplot[data = rfm[attributes], orient="v", palette="Set2" ,whis=1.5,saturation=1, width=0.7]
plt.title["Outliers Variable Distribution", fontsize = 14, fontweight = 'bold']
plt.ylabel["Range", fontweight = 'bold']
plt.xlabel["Attributes", fontweight = 'bold']

Boxplot merupakan ringkasan distribusi sampel yang disajikan secara grafis sebagai penggambaran bentuk distribusi data, ukuran tendensi sentral dan ukuran penyebaran [keragaman] data pengamatan. Selain itu boxplot juga bisa menunjukkan ada tidaknya nilai outlier dan nilai ekstrem di data pengamatan.

Nilai Outlier merupakan nilai data yang letaknya lebih dari 1.5 x panjang kotak [IQR], dengan formulasi detail sebagai berikut:

Untuk langkah selanjutnya, akan dilakukan penghapusan terhadap outliers yang ada, dengan langkah sebagai berikut:

# Removing [statistical] outliers for Monetary
Q1 = rfm.Monetary.quantile[0.05]
Q3 = rfm.Monetary.quantile[0.95]
IQR = Q3 - Q1
rfm = rfm[[rfm.Monetary >= Q1 - 1.5*IQR] & [rfm.Monetary = Q1 - 1.5*IQR] & [rfm.Recency = Q1 - 1.5*IQR] & [rfm.Frequency

Bài mới nhất

Chủ Đề