Customer Segmentation dengan K-Means menggunakan R

Gifa Delyani Nursyafitri
8 min readAug 13, 2020

--

Source : https://www.retailreco.com/blog/rfm-analysis-methodology/

Holaa! Di kesempatan ini bakalan belajar tentang Customer Segmentation. Penasaran itu apa? Stay tune!

Customer segmentation adalah proses penting yang diperlukan di bisnis untuk mengenal customer dengan lebih baik.

Dengan demikian proses bisnis di marketing (pemasaran) dan CRM (customer relationship management) bisa dilakukan lebih tajam. Contoh: pesan marketing bisa lebih personal untuk setiap segment dengan biaya lebih optimal. Sehingga performa bisnis berpotensi tinggi menjadi lebih baik juga.

Untuk menemukan segmentasi yang baik, perlu proses analisa data dari profile customer yang cukup banyak dan rutin. Ini bisa dibantu dengan algoritma komputer.

Dataset yang kita gunakan saat ini adalah data customer yang bisa di akses di sini. Ini merupakan tampilan data tersebut.

Karena kolom “Customer ID” dan “Nama Pelanggan” meupakan kolom unik maka tidak akan dijadikan variable penentu segmentasi yang kita lakukan, namun sisa kolom lainnya akan digunakan.

Membaca Data

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")    
pelanggan[c("Jenis.Kelamin","Umur","Profesi","Tipe.Residen")]
#Buat variable field_yang_digunakan dengan isi berupa vector "Jenis.Kelamin", "Umur" dan "Profesi"
field_yang_digunakan <- c("Jenis.Kelamin","Umur","Profesi")
#Tampilan data pelanggan dengan nama kolom sesuai isi vector field_yang_digunakan
pelanggan[field_yang_digunakan]

Membuat variabel yang dibutuhkan dalam bentuk vector

#Buat variable field_yang_digunakan dengan isi berupa vector "Jenis.Kelamin", "Umur" dan "Profesi"
field_yang_digunakan <- c("Jenis.Kelamin","Umur","Profesi")
#Tampilan data pelanggan dengan nama kolom sesuai isi vector field_yang_digunakan
pelanggan[field_yang_digunakan]

Tampilan 10 data teratas:

Karena variabel “Jenis.Kelamin”, “Profesi” dan “Tipe.Residen” merupakan data kategori yang berupa teks, maka data tersebut harus dikonversi untuk menjadi data numerik.

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
#Penggabungan data
pelanggan <- data.frame(pelanggan, pelanggan_matrix)

Didapatkan bahwa hasil konversi yang telah digabungkan seperti ini. Variabel Jenis.Kelamin.1, Profesi.1, dan Tipe.Residen.1 merupakan data kategorik yang telah diubah menjadi numerik.

Namun kita akan bingung, angka 1 untuk variabel yang dikonversikan mewakili kategori apa, maka kita akan membuat data masternya.

#Mengisi data master
Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])
Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])
Tipe.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])

Dapat dilihat, bahwa untuk profesi, angka 1 mewakili ibu rumah tangga, 2 mewakili mahasiswa, 3 mewakili pelajar, 4 untuk profesional, dan 5 untuk wiraswasta.

Menormalisasikan Nilai Belanja

Perhatikan kolom “NilaiBelanjaSetahun” isi datanya bernilai jutaan. Ketika kolom ini digunakan untuk clustering, perhitungan Sum of Squared Errors (SSE) akan menjadi sangat besar.

Kita akan menormalisasikan nilainya agar perhitungan lebih sederhana dan mudah dicerna, namun tidak mengurangi akurasi. Normalisasi bisa dilakukan dengan banyak cara. Untuk kasus kita, cukup dengan pembagian sehingga nilai jutaan menjadi puluhan.

#Normalisasi Nilai
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000

Fungsi kmeans

Function kmeans memerlukan minimal 2 parameter, yaitu:

  • x: data yang digunakan, dimana semua isi datanya harus berupa numerik.
  • centers: jumlah cluster yang diinginkan.

Kadang kala berdasarkan pengalaman DQLab, parameter data dan jumlah segmen saja tidak cukup. Perlu digunakan parameter ketiga yaitu nstart, merupakan jumlah kombinasi acak yang dihasilkan secara internal oleh R. Dan dalam jumlah yang kita berikan, algoritma akan memilih mana yang terbaik dari kombinasi-kombinasi tersebut.

Terbaik disini artinya jarak antara tiap titik ke mean dari clusternya sendiri lebih kecil dibandingkan ke mean dari cluster lain.

#Bagian Data Preparation
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])
Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])
Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
#Bagian K-Means
set.seed(100)
#fungsi kmeans untuk membentuk 5 cluster dengan 25 skenario random dan simpan ke dalam variable segmentasi
segmentasi <- kmeans(x=field_yang_digunakan, centers=5, nstart=25)
#tampilkan hasil k-means
segmentasi

Sehingga didapatkan hasil seperti ini.

Hasil ini dapat dibagi dalam lima bagian, dengan penjelasan sesuai nomor urut pada gambar sebagai berikut:

  1. Ukuran / jumlah titik data pada tiap cluster
  2. Nsilai rata-rata (centroid) dari tiap cluster
  3. Pembagian cluster dari tiap elemen data berdasarkan posisinya
  4. Jumlah jarak kuadrat dari tiap titik ke centroidnya
  5. Komponen informasi lain yang terkandung di dalam objek kmeans ini

Analisa Hasil Clustering Vector

Clustering vector ini adalah rangkaian vector yang berisi angka cluster. Dari hasil kita, vector berisi angka 1 sampai dengan 5, maksimum sesuai dengan jumlah cluster yang kita inginkan.

Vector ini dimulai dari angka 2, yang artinya data pertama dari dataset kita akan dialokasikan pada nomor cluster 2. Dari gambar juga terlihat isi vector kedua bernlai 1, ini artinya data kedua dari dataset kita dialokasikan pada nomor cluster 1, dan seterusnya. Posisi data terakhir (ke-50) memiliki nomor cluster 5.

Hasil ini dapat diakses dengan komponen cluster dari objek hasil seperti berikut:

segmentasi$cluster

Ini akan mendapatkan hasil yang sama dengan gambar di atas.

Analisa Hasil Cluster Size

Tahap berikutnya, Kita akan analisa hasil pada bagian pertama

K-means clustering with 5 clusters of sizes 14, 5, 9, 12, 10

Ini artinya dengan k-means kita telah membagi dataset pelanggan dengan 5 cluster, dimana:

  • Cluster ke-1 memiliki 14 data
  • Cluster ke-2 memiliki 5 data
  • Cluster ke-3 memiliki 9 data
  • Cluster ke-4 memiliki 12 data
  • Cluster ke-5 memiliki 10 data

Dengan jumlah total 50 data, yang juga merupakan jumlah data total pelanggan.

Melihat Data pada Cluster ke-N

Misalkan kita akan melihat pada cluster pertama dan kedua,

pelanggan[which(pelanggan$cluster == 1),]

Jika berhasil dieksekusinya, hasilnya akan terlihat sebagai berikut.

Pada cluster pertama ada 14 data dengan seluruh data berjenis kelamin wanita dan umur antara 14 s/d 25 tahun. Untuk penghasilan, profesi, nilai belanja dan tipe residen cukup bervariasi.

pelanggan[which(pelanggan$cluster == 2),]

Kemudian pada cluster kedua, terlihat umur mayoritas sudah masuk usia 50 tahun ke atas dan kebanyakan adalah wiraswasta kecuali satu yang ibu rumah tangga. Dan rata-rata nilai belanja adalah sekitar 9 juta, kecuali yang berprofesi ibu rumah tangga.

Menarik bukan pembagian dari algoritmanya?

Analisa Hasil Cluster Means

Cluster means adalah hasil nilai rata-rata atau titik sentral (centroid) dari seluruh titik tiap cluster.

Apa artinya hasil tersebut?

  • Kolom pertama yang berisi angka 1 sampai dengan 5 adalah mewakili nomor cluster.
  • Kolom Kelamin.1 menunjukkan nilai rata-rata dari data jenis kelamin yang telah dikonversi menjadi numerik, dengan angka 1 mewakili Pria dan angka 2 mewakili wanita.

Pada cluster 1 terlihat bahwa hanya ada angka 2, artinya cluster 1 hanya berisi data dengan profil berjenis kelamin wanita. Nah, untuk cluster ke-2 berupa angka 1.40 artinya data bersifat campuran namun cenderung ke Pria (1).

Kedua interpretasi angka ini sesuai dengan hasil praktek “Melihat Data pada Cluster-N”.

  • Kolom Umur adalah representasi dari dataset awal tanpa mengalami konversi. Terlihat untuk cluster ke-1 umur rata-rata adalah 20 tahun, umur 61 tahun untuk cluster ke-2, dan seterusnya.
  • Kolom 1 menunjukkan nilai rata-rata data Profesi untuk tiap cluster yang telah dikonversi menjadi numerik.

Angka 1, 2, 3, 4 dan 5 masing-masing mewakili Wiraswasta, Pelajar, Professional, Ibu Rumah Tangga dan Mahasiswa.

Terlihat untuk seluruh cluster, profesi cenderung ke Professional terutama untuk cluster ke-4.

  • Kolom Tipe.Residen.1 menunjukkan representasi data Tipe.Residen yang telah dikonversi menjadi numerik dengan angka 1 mewakili Cluster dan 2 mewakili Sector. Ini juga didapatkan dari hasil konversi data menjadi numerik pada praktek sebelumnya.
  • Terlihat untuk seluruh cluster, terlihat data cukup tersebar antara Sector dan Cluster terutama untuk cluster ke-4 dimana nilai kolom ini di angka 1.555.
  • Terakhir, kolom NilaiBelanjaSetahun cukup signifikan pembagiannya untuk tiap cluster. Dimana cluster ke-2 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan ketiga cluster lainnya.

Ini mungkin target customer yang bisa lebih disasar melalui marketing campaign, karena cluster ke-2 saat ini hanya berisi 5 data. Cukup kecil proporsinya, dan ingin ditingkatkan.

Analisa Hasil Sum of Squares

Yang akan kita analisa berikutnya adalah bagian keempat, yaitu nilai metrik sum of squares seperti terlihat berikut ini.

Within cluster sum of squares by cluster:[1] 316.73367  58.21123 174.85164 171.67372 108.49735(between_SS / total_SS =  92.4 %)

Konsep sum of squares (SS) adalah jumlah “jarak kuadrat” perbedaan tiap titik data dengan mean atau centroidnya. SS ini bisa dengan mean atau centroid untuk tiap cluster atau secara keseluruhan data. Sum of squares dalam literatur data science lain sering disebut dengan Sum of Squared Errors (SSE).

Semakin besar nilai SS menyatakan semakin lebarnya perbedaan antar tiap titik data di dalam cluster tersebut.

Berdasarkan konsep tersebut, berikut adalah penjelasan untuk hasil output kmeans di atas:

  1. Nilai 316.73367 adalah SS untuk cluster ke-1, 58.21123 adalah SS untuk cluste ke-2, dan seterusnya. Semakin kecil nilainya berpotensi semakin baik.
  2. total_SS: adalah SS untuk seluruh titik terhadap nilai rata-rata global, bukan untuk per cluster. Nilai ini selalu tetap dan tidak terpengaruh dengan jumlah cluster.
  3. between_SS: adalah total_SS dikurangi dengan jumlah nilai SS seluruh cluster.
  4. (between_SS / total_SS) adalah rasio antara between_SS dibagi dengan total_SS. Semakin besar persentasenya, ummnya semakin baik.

Ini adalah metrik yang bisa kita gunakan untuk menjawab seberapa baik jumlah cluster yang kita bentuk? Apakah dibagi 2, 5, 10 atau 30?

Misalkan kita akan membandingkan antara 2 cluster dengan 5 cluster,

set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=2, nstart=25)
set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)

Jika berjalan dengan baik, bandingkan hasil antara kedua cluster tersebut. Anda harusnya dapat membandingkan hasil. Gambar akan membantu.

Terlihat untuk 2 cluster (k=2), SS per cluster lebih besar dibandingkan jika data dibagi menjadi 5 cluster (k=5). Perhatikan juga persentase rasio antara between_SS dan total_SS, dimana k=5 juga lebih besar.

Grafik Elbow

Untuk menentukan jumlah cluster terbaik dapat menggunakan Grafik Elbow.

library(ggplot2)#Bagian Data Preparation
pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])
Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])
Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
#Bagian K-Means
set.seed(100)
sse <- sapply(1:10, function(param_k){kmeans(pelanggan[field_yang_digunakan], param_k, nstart=25)$tot.withinss})
jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ggplot(ssdata, aes(x=cluster,y=sse)) +
geom_line(color="red") + geom_point() +
ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
geom_text(aes(label=format(round(sse, 2), nsmall = 2)),hjust=-0.2, vjust=-0.5) +
scale_x_discrete(limits=c(1:jumlah_cluster_max))

Terlihat jika jumlah cluster optimal yang bisa kita gunakan adalah 5, dan ini menjadi keputusan kita sebagai jumlah segmentasi pelanggan.

Okay, setelah mendapatkan jumlah cluster optimal, selanjutnya kita akan coba bisa gak sih kita masukin data baru dan langsung bisa nemuin clusternya? Penasaran kan, stay tune terus.

Part 2 nya bisa kalian akses disini: Customer Segmentation dengan K-Means menggunakan R part 2

See you soon!

--

--

Gifa Delyani Nursyafitri
Gifa Delyani Nursyafitri

Written by Gifa Delyani Nursyafitri

Ku abadikan disini, karena aku paham betul bahwa ingatan manusia terbatas.

No responses yet