Customer Segmentation Menggunakan K-Means Clustering | Python

Kaggle: Mall Customer Segmentation Data

Wanda Listathea Putri
6 min readJul 17, 2021
Photo by Jordan Madrid on Unsplash

Halo teman-teman… Kali ini, saya akan mencoba melakukan clustering menggunakan metode K-Means untuk mengelompokkan customer berdasarkan beberapa fitur/variabel (segmentasi customer). Data yang saya gunakan adalah data mall customer yang berasal dari Kaggle.

Bayangkan bahwa kamu adalah pemilik sebuah toko dan kamu memiliki beberapa data tentang customer-mu seperti ID customer, usia, gender, pendapatan tahunan, dan skor pengeluaran dari masing-masing customer. Kemudian, kamu ingin melihat bagaimana perilaku customer dengan cara mengelompokkannya. Pengelompokkan ini juga berguna agar kamu dapat menentukan strategi apa yang tepat untuk diterapkan pada masing-masing kelompok.

Pada artikel ini, akan dilakukan pengelompokkan atau clustering dengan menggunakan salah satu metode dalam analisis Non Hierarchical Clustering yaitu K-Means. Sebelum masuk ke praktek, kita ulas sedikit yuk apa itu metode K-Means!

Metode K-Means

Pada Non Hierarchical Clustering, data akan dikelompokkan ke dalam sejumlah cluster/kelompok tanpa adanya struktur hirarki antara satu data dengan data lainnya. Metode yang paling umum digunakan dalam Non Hierarchical Clustering adalah metode K-Means. Metode ini diawali dengan penentuan banyaknya cluster/kelompok yang akan dibentuk. Kemudian, masing-masing cluster ini akan dihitung nilai rata-rata (mean)-nya yang kemudian disebut sebagai pusat cluster atau centroid. Dari centroid ini, akan dihitung jarak masing-masing data ke masing-masing centroid sehingga diketahui data mana saja yang dekat dengan centroid tertentu. Akan didapatkan pembaharuan anggota cluster sehingga proses akan terus dilakukan sampai anggota masing-masing cluster tidak terjadi perubahan lagi atau berpindah. Kondisi ini disebut sebagai konvergen.

Ilustrasi dari metode K-Means adalah sebagai berikut. Gambar (f) menunjukkan bahwa kondisi sudah konvergen (tidak ada data/anggota yang berpindah).

Ilustrasi Metode K-Means

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

K-Means Menggunakan Python

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. Menentukan Jumlah Cluster (k)

Metode Elbow adalah salah satu cara dalam menentukan jumlah cluster (k) yang paling tepat untuk pemodelan K-Means. Jumlah cluster yang optimum ditunjukkan pada belokan atau siku dari grafik elbow.

wcss = [] # wcss -> Within Cluster Sum of Squaresfor i in range(1, 15):
kmeans = KMeans(n_clusters = i, random_state = 14)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
# Visualisasi Metode Elbow
plt.plot(range(1, 15), wcss)
plt.title("The Elbow Method")
plt.xlabel("Number of Clusters")
plt.ylabel("WCSS")
plt.show()
Grafik Metode Elbow

Dari grafik Elbow, terlihat bahwa belokan atau siku terjadi pada jumlah cluster 5 sehingga inilah jumlah cluster yang akan digunakan pada metode K-Means.

5. Clustering Menggunakan K-Means

# Pakai cluster = 5
kmeans = KMeans(n_clusters = 5, random_state = 14)
kmeans.fit(X)

6. Melihat Hasil Cluster

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

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

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

hasil_kmeans = X.copy()
hasil_kmeans["cluster"] = kmeans.labels_
hasil_kmeans.head()
hasil_kmeans.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_x = hasil_kmeans["cluster"].value_counts().index
cluster_y = hasil_kmeans["cluster"].value_counts().values
# Visualisasi
sns.barplot(cluster_x, cluster_y)
plt.title("Frekuensi Data pada Masing-Masing Cluster (KMeans)")
plt.xlabel("Cluster")
plt.ylabel("Frekuensi")
Grafik Batang Frekuensi Data pada Masing-Masing Cluster

Terlihat bahwa mayoritas data masuk ke dalam cluster 0 (nantinya disebut sebagai “Cluster 1”). 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. Tidak lupa juga mendefinisikan pusat dari cluster (centroid) dengan menggunakan atribut “cluster_centers_”.

# Nilai fitur/variabel dari masing-masing cluster
ann_kmeans0 = hasil_kmeans[hasil_kmeans["cluster"] == 0].iloc[:, 0]
spend_kmeans0 = hasil_kmeans[hasil_kmeans["cluster"] == 0].iloc[:, 1]
ann_kmeans1 = hasil_kmeans[hasil_kmeans["cluster"] == 1].iloc[:, 0]
spend_kmeans1 = hasil_kmeans[hasil_kmeans["cluster"] == 1].iloc[:, 1]
ann_kmeans2 = hasil_kmeans[hasil_kmeans["cluster"] == 2].iloc[:, 0]
spend_kmeans2 = hasil_kmeans[hasil_kmeans["cluster"] == 2].iloc[:, 1]
ann_kmeans3 = hasil_kmeans[hasil_kmeans["cluster"] == 3].iloc[:, 0]
spend_kmeans3 = hasil_kmeans[hasil_kmeans["cluster"] == 3].iloc[:, 1]
ann_kmeans4 = hasil_kmeans[hasil_kmeans["cluster"] == 4].iloc[:, 0]
spend_kmeans4 = hasil_kmeans[hasil_kmeans["cluster"] == 4].iloc[:, 1]
# Pusat dari cluster (centroid)
centroid_cluster = kmeans.cluster_centers_
centroid_cluster

Visualisasi scatter plot dilakukan dengan code sebagai berikut.

# VISUALISASI HASIL CLUSTERINGplt.scatter(ann_kmeans0, spend_kmeans0, s = 80, c = "blue", label = "Cluster 1")
plt.scatter(ann_kmeans1, spend_kmeans1, s = 80, c = "orange", label = "Cluster 2")
plt.scatter(ann_kmeans2, spend_kmeans2, s = 80, c = "green", label = "Cluster 3")
plt.scatter(ann_kmeans3, spend_kmeans3, s = 80, c = "red", label = "Cluster 4")
plt.scatter(ann_kmeans4, spend_kmeans4, s = 80, c = "magenta", label = "Cluster 5")
# Centroid
plt.scatter(centroid_cluster[:, 0], centroid_cluster[:, 1], s = 160, c = "black", label = "Centroids")
plt.title("Clusters of Customers")
plt.xlabel("Annual Income (k$)")
plt.ylabel("Spending Score (1-100)")
plt.legend()
plt.show()
Visualisasi Hasil Clustering Menggunakan K-Means

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 SEDANG, Spending Score SEDANG
  • Cluster 2 -> Annual Income RENDAH, Spending Score RENDAH
  • Cluster 3 -> Annual Income TINGGI, Spending Score RENDAH
  • Cluster 4 -> Annual Income RENDAH, Spending Score TINGGI
  • Cluster 5 -> Annual Income TINGGI, Spending Score TINGGI

Dari hasil cluster ini, kita dapat menerapkan strategi tertentu untuk cluster tertentu. Misalnya adalah aktif melakukan iklan atau penawaran kepada customer di cluster 3 karena mereka memiliki pendapatan yang tinggi, namun score pengeluarannya masih rendah. Hal ini bertujuan agar customer dari cluster 3 dapat semakin banyak melakukan pengeluaran/pembelian di toko kita. Customer di cluster 5 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 5 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_kmeans["CustomerID"] = dataset["CustomerID"]
hasil_kmeans.head()
hasil_kmeans.head() dengan Customer ID

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

# Menyimpan hasil clustering 
hasil_kmeans.to_csv("Hasil Clustering Menggunakan K-Means.csv", index = False)

— — —

Demikian analisis Non Hierarchical Clustering menggunakan metode K-Means 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://socs.binus.ac.id/2017/03/09/clustering/
  3. https://yudiagusta.wordpress.com/k-means/
  4. https://www.youtube.com/watch?v=JBMtFg4Mcz8
  5. https://www.youtube.com/watch?v=1jzvGdIB9bo

--

--