Customer Segmentation Menggunakan Agglomerative Clustering | Python

Kaggle: Mall Customer Segmentation Data

Wanda Listathea Putri
7 min readJul 17, 2021
Photo by Alex Hudson on Unsplash

Pada artikel sebelumnya, saya melakukan segmentasi customer menggunakan metode K-Means dari Non Hierarchical Clustering yang dapat diakses di sini. Pada artikel kali ini, saya juga akan melakukan segmentasi customer namun dengan metode yang berbeda yaitu Agglomerative Clustering. Data yang digunakan sama dengan artikel sebelumnya, yaitu data mall customer yang berasal dari Kaggle dengan fitur/variabel di dalamnya adalah ID customer, usia, gender, pendapatan tahunan, dan skor pengeluaran dari masing-masing customer.

Seperti biasa, sebelum masuk ke praktek, kita ulas sedikit yuk apa itu metode Agglomerative Clustering!

Agglomerative Clustering

Di dalam metode Hierarchical Clustering, terdapat dua tipe dasar yaitu agglomerative (pemusatan) dan divisive (penyebaran). Dalam metode agglomerative, setiap obyek atau observasi dianggap sebagai sebuah cluster tersendiri. Kemudian di tahap selanjutnya, dua cluster yang mempunyai kemiripan digabungkan menjadi sebuah cluster baru, dan demikian seterusnya. Sebaliknya, dalam metode divisive kita beranjak dari sebuah cluster besar yang terdiri dari semua obyek atau observasi. Selanjutnya, obyek atau observasi yang paling tinggi nilai ketidakmiripannya kita pisahkan, dan demikian seterusnya.

Ilustrasi Metode Hierarchical Clustering

Tipe agglomerative memiliki lima metode yang cukup terkenal yaitu Single Linkage, Complete Linkage, Average Linkage, Ward’s Method, dan Centroid Method. Penjelasan masing-masing metode adalah sebagai berikut:

  1. Single Linkage -> Didasarkan pada jarak terpendek
  2. Complete Linkage -> Didasarkan pada jarak terjauh
  3. Average Linkage -> Didasarkan pada rata-rata jarak semua data dalam suatu cluster dengan jarak semua data dalam cluster yang lain
  4. Ward’s Method -> Didasarkan pada total sum of square dua cluster pada masing-masing variabel
  5. Centroid Method -> Didasarkan pada jarak centroid dari dua cluster
Ilustrasi Metode di Agglomerative

Oke, semoga sudah ada sedikit bayangan yah mengenai Agglomerative Clustering dan beberapa metode di dalamnya. Selanjutnya, mari kita masuk ke praktek Agglomerative Clustering untuk customer segmentation menggunakan Python. Buka terlebih dahulu Jupyter Notebook atau Google Colab, dan mari praktek!

Agglomerative Clustering Menggunakan Python

Langkah yang dilakukan hampir sama seperti pada artikel sebelumnya saat menggunakan metode K-Means. Perbedaan hanya ada pada bagian clustering karena metode yang digunakan berbeda.

1. Import Library

Import library dasar yang diperlukan yaitu pandas, numpy, matplotlib, dan seaborn.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

2. Import Dataset

Download terlebih dahulu data customer pada link sebelumnya dan lakukan import dataset.

dataset = pd.read_csv("Mall_Customers.csv")
dataset.head()
dataset.head()

Pada artikel ini, fitur/variabel yang akan digunakan untuk clustering hanya 2 yaitu “Annual Income” dan “Spending Score” agar hasil cluster nantinya dapat divisualisasikan pada bidang 2 dimensi.

# Hanya mengambil fitur "Annual Income" dan "Spending Score"
X = dataset.iloc[:, 3:5] # 3:5 artinya adalah mengambil kolom index 3 sampai 4 (atau 5-1)
X.head()
X.head()

3. Eksplorasi Data

# Ukuran data (kolom, baris)
X.shape
X.shape

Data terdiri dari 200 baris atau terdapat 200 customer. Karena kolomnya sudah direduksi, maka kolom sekarang hanya ada 2 yaitu “Annual Income” dan “Spending Score”.

# Cek data missing
X.isnull().sum()
X.isnull().sum()

Tidak terdapat data yang missing.

# Ringkasan data
X.describe()
X.describe()

Terlihat bahwa rata-rata pendapatan tahunan dari customer adalah sebesar $60.560 dan rata-rata score pengeluarannya adalah sebesar 50,2.

4. Mencari Jumlah Cluster

Pada Hierarchical Clustering, cluster akan membentuk semacam “pohon”, di mana ada hirarki (tingkatan) yang jelas antar objek, dari yang paling dekat kemiripannya hingga paling jauh kemiripannya (tidak mirip). Untuk memperjelas proses hirarki tersebut, biasanya digunakan diagram yang disebut dendrogram. Dari hasil dendrogram inilah jumlah cluster juga akan diperoleh.

# Membuat dendrogram
import scipy.cluster.hierarchy as sch
dendrogram = sch.dendrogram(sch.linkage(X, method = "ward"))
plt.title("Dendrogram")
plt.xlabel("Customers")
plt.ylabel("Euclidean Distances")
plt.show()
Hasil Dendrogram

Panjang garis vertikal pada dendrogram menunjukkan seberapa mirip data/objek satu dengan data/objek lainnya. Semakin pendek berarti semakin dekat kemiripannya, semakin panjang berarti semakin jauh kemiripannya (tidak mirip).

Penentuan banyak cluster dari dendrogram dapat dilakukan dengan mencari garis vertikal terpanjang di mana dia tidak berpotongan dengan garis horizontal manapun. Berikut gambarannya.

Jarak Antar Cluster dari Hasil Dendrogram

Garis putus-putus satu dengan garis putus-putus lainnya menunjukkan jarak antar cluster. Terlihat bahwa jarak antar cluster yang terpanjang ditunjukkan pada garis putus-putus merah sehingga penarikan garis horizontal untuk mendapatkan jumlah cluster akan dilakukan pada rentang garis putus-putus merah ini.

Penarikan Garis Horizontal untuk Mendapatkan Jumlah Cluster

Jika ditarik garis horizontal pada jarak cluster yang terpanjang (garis vertikal terpanjang) dan dilihat perpotongannya dengan garis vertikal, maka diperoleh bahwa jumlah cluster yang terbentuk adalah 5.

5. Clustering Menggunakan Agglomerative

Pada artikel ini, hanya akan dicobakan dengan metode Ward saja.

from sklearn.cluster import AgglomerativeClustering# Menggunakan cluster = 5
ac = AgglomerativeClustering(n_clusters = 5, affinity = "euclidean", linkage = "ward")
ac.fit(X)

6. Melihat Hasil Cluster

Hasil cluster untuk masing-masing data dapat dilihat dengan menggunakan atribut “labels_” atau menggunakan fungsi “fit_predict()”.

ac.labels_# Cara lain untuk melihat hasil cluster
# y_pred = ac.fit_predict(X)
ac.labels_

Kemudian, saya menggabungkan hasil cluster ke dalam data frame sebelumnya (X) dengan nama objek yang lain yaitu “hasil_ac”.

hasil_ac = X.copy()
hasil_ac["cluster"] = ac.labels_
hasil_ac.head()
hasil_ac.head()

7. Visualisasi Hasil Clustering

Grafik batang yang menunjukkan frekuensi data pada masing-masing cluster adalah sebagai berikut.

# Nilai untuk sumbu X dan Y
cluster_x1 = hasil_ac["cluster"].value_counts().index
cluster_y1 = hasil_ac["cluster"].value_counts().values
# Visualisasi
sns.barplot(cluster_x1, cluster_y1)
plt.title("Frekuensi Data pada Masing-Masing Cluster (Agglomerative)")
plt.xlabel("Cluster")
plt.ylabel("Frekuensi")
Grafik Batang Frekuensi Data pada Masing-Masing Cluster

Terlihat bahwa mayoritas data masuk ke dalam cluster 1(nantinya disebut sebagai “Cluster 2”). Penulisan cluster 0 (nol) di sini dikarenakan mengikuti index dari Python sendiri yaitu index awal = 0.

Untuk membuat visualisasi scatter plot dari masing-masing cluster, terlebih dahulu mendefinisikan nilai fitur/variabel dari masing-masing cluster.

# Nilai fitur/variabel dari masing-masing cluster
ann_ac0 = hasil_ac[hasil_ac["cluster"] == 0].iloc[:, 0]
spend_ac0 = hasil_ac[hasil_ac["cluster"] == 0].iloc[:, 1]
ann_ac1 = hasil_ac[hasil_ac["cluster"] == 1].iloc[:, 0]
spend_ac1 = hasil_ac[hasil_ac["cluster"] == 1].iloc[:, 1]
ann_ac2 = hasil_ac[hasil_ac["cluster"] == 2].iloc[:, 0]
spend_ac2 = hasil_ac[hasil_ac["cluster"] == 2].iloc[:, 1]
ann_ac3 = hasil_ac[hasil_ac["cluster"] == 3].iloc[:, 0]
spend_ac3 = hasil_ac[hasil_ac["cluster"] == 3].iloc[:, 1]
ann_ac4 = hasil_ac[hasil_ac["cluster"] == 4].iloc[:, 0]
spend_ac4 = hasil_ac[hasil_ac["cluster"] == 4].iloc[:, 1]

Visualisasi scatter plot dilakukan dengan code sebagai berikut.

# VISUALISASI HASIL CLUSTERING (AGGLOMERATIVE)plt.scatter(ann_ac0, spend_ac0, s = 80, c = "green", label = "Cluster 1")
plt.scatter(ann_ac1, spend_ac1, s = 80, c = "blue", label = "Cluster 2")
plt.scatter(ann_ac2, spend_ac2, s = 80, c = "magenta", label = "Cluster 3")
plt.scatter(ann_ac3, spend_ac3, s = 80, c = "red", label = "Cluster 4")
plt.scatter(ann_ac4, spend_ac4, s = 80, c = "orange", label = "Cluster 5")
plt.title("Clusters of Customers")
plt.xlabel("Annual Income (k$)")
plt.ylabel("Spending Score (1-100)")
plt.legend()
plt.show()
Visualisasi Hasil Clustering Menggunakan Agglomerative

8. Interpretasi Hasil Clustering

Dengan melihat hasil scatter plot, kita dapat mengetahui perbedaan perilaku dari customer pada masing-masing cluster sebagai berikut:

  • Cluster 1 -> Annual Income TINGGI, Spending Score RENDAH
  • Cluster 2 -> Annual Income SEDANG, Spending Score SEDANG
  • Cluster 3 -> Annual Income TINGGI, Spending Score TINGGI
  • Cluster 4 -> Annual Income RENDAH, Spending Score TINGGI
  • Cluster 5 -> Annual Income RENDAH, Spending Score RENDAH

Dari hasil cluster ini, kita dapat menerapkan strategi tertentu untuk cluster tertentu. Misalnya adalah aktif melakukan iklan atau penawaran kepada customer di cluster 1 karena mereka memiliki pendapatan yang tinggi, namun score pengeluarannya masih rendah. Hal ini bertujuan agar customer dari cluster 1 dapat semakin banyak melakukan pengeluaran/pembelian di toko kita. Customer di cluster 3 dapat dikatakan sebagai customer yang loyal karena selain memiliki pendapatan yang tinggi, mereka juga melakukan pengeluaran/pembelian yang tinggi pula di toko kita. Strategi yang dapat dilakukan pada cluster 3 ini adalah dengan memberikan reward atau penawaran khusus agar mereka semakin loyal kepada toko kita.

9. Menggabungkan Kembali dengan Identitas Data (Customer ID)

# Memasukkan kembali "Customer ID"-nya
hasil_ac["CustomerID"] = dataset["CustomerID"]
hasil_ac.head()
hasil_ac.head() dengan Customer ID

Hasil akhir clustering ini dapat disimpan dalam format csv dengan cara berikut.

# Menyimpan hasil clustering 
hasil_ac.to_csv("Hasil Clustering Menggunakan Agglomerative.csv", index = False)

— — —

Demikian analisis Hierarchical Clustering menggunakan metode Agglomerative Ward untuk melakukan segmentasi customer. Untuk full code langkah di atas, dapat dilihat pula pada github saya.

Semoga artikel ini bermanfaat. Jika terdapat kekeliruan, mohon koreksinya ya. Terima kasih! :)

Referensi:

  1. https://www.kaggle.com/vjchoudhary7/customer-segmentation-tutorial-in-python
  2. https://www.statistikian.com/2014/03/analisis-cluster.html
  3. https://www.youtube.com/watch?v=LeohSa1yssc

--

--