Menurut Shopify, definisi dari Customer Segmentation/Segmentasi Pelanggan adalah proses membagi pelanggan menjadi beberapa kelompok berdasarkan karakteristik umum sehingga perusahaan dapat memasarkan kepada setiap kelompok secara efektif dan tepat.
Dalam marketing B2B (Business-to-business), perusahaan atau sebuah badan munngkin akan mengelompokkan konsumen berdasarkan beberapa faktor:
Dalam marketing B2C (Business-to-consumer), perusahaan atau badan sering mengelompokkan berdasarkan beberapa demografisnya:
Kenapa Customer Segmentation penting?
Kenapa perlu bantuan algoritma untuk Customer Segmentation?
Customer Segmentation dapat dilakukan oleh semua bisnis terlepas dari ukuran atau jenis industrinya dan apakah yang dijual secara online atau secara langsung. Tahap dimulai dengan mengumpulkan dan menganalisis data dan diakhiri dengan bertindak berdasarkan informasi yang dikumpulkan dengan cara yang sesuai dan efektif.
Persiapan data adalah langkah pertama yang harus lakukan sebelum menggunakan algoritma apapun untuk melakukan analisa data.
Ini dikarenakan tiap implementasi algoritma menuntut struktur dan tipe data yang berbeda.
Dan untuk kasus algoritma K-Means yang akan digunakan untuk otomatisasi clustering, maka struktur datanya adalah data.frame atau matriks yang di dalamnya berisi angka semua. Tidak ada yang boleh bertipe karakter.
Namun pada kasus riil, hal ini tentulah tidak mungkin. Contoh, isi data profesi seperti “Professional”, “Ibu Rumah Tangga” adalah teks. Dan ini perlu dikonversi dulu ke numerik, namun jika diperlukan tetap bisa kembali mengambil data teks.
Untuk lebih jelasnya. Akan dilakukan langkah-langkah praktek berikut ini untuk mempersiapkan data sebelum dapat digunakan algoritma clustering:
Dataset dapat diunduh di sini.
*Untuk menyimpan file .txt dari URL cukup buka URL nya dan klik “Save As” maka akan tersimpan.
pelanggan <- read.csv("customer_segments.txt", sep = "\t")
head(pelanggan)
## Customer_ID Nama.Pelanggan Jenis.Kelamin Umur Profesi Tipe.Residen
## 1 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector
## 2 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster
## 3 CUST-003 Agus Cahyono Pria 48 Professional Cluster
## 4 CUST-004 Antonius Winarta Pria 53 Professional Cluster
## 5 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster
## 6 CUST-006 Rosalina Kurnia Wanita 24 Professional Cluster
## NilaiBelanjaSetahun
## 1 9497927
## 2 2722700
## 3 5286429
## 4 5204498
## 5 10615206
## 6 5215541
head(pelanggan[c("Nama.Pelanggan", "Profesi")])
## Nama.Pelanggan Profesi
## 1 Budi Anggara Wiraswasta
## 2 Shirley Ratuwati Pelajar
## 3 Agus Cahyono Professional
## 4 Antonius Winarta Professional
## 5 Ibu Sri Wahyuni, IR Wiraswasta
## 6 Rosalina Kurnia Professional
Atau bisa menggunakan cara lain untuk mengambil vektor data variabel pelanggan. Seperti dibawah ini.
vector_pelanggan <- c("Jenis.Kelamin", "Umur", "Tipe.Residen")
pelanggan[vector_pelanggan]
Isi data dari tiga kolom pelanggan diatas yaitu “Jenis.Kelamin”, “Profesi” dan “Tipe.Residen” merupakan data kategori yang berupa teks.
Untuk fungsi k-means, ketiga kolom ini tidak bisa digunakan kecuali isi dikonversi menjadi numerik. Salah satu caranya adalah dengan menggunakan fungsi data.matrix().
Perintahnya cukup sederhana, seperti terlihat pada contoh berikut.
# Konversi data menjadi numerik
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
head(pelanggan_matrix)
## Jenis.Kelamin Profesi Tipe.Residen
## [1,] 1 5 2
## [2,] 2 3 1
## [3,] 1 4 1
## [4,] 1 4 1
## [5,] 2 5 1
## [6,] 2 4 1
Maka hasilnya akan berupa numerik yang mewakili suatu nilai di suatu kolom.
Sepeti contoh kolom “Jenis.Kelamin”, pria = 1 dan wanita = 2. Dan seterusnya untuk setiap kolom.
Setelah dikonversi, perlu juga mengetahui bagaimana menggabungkan kembali data tersebut ke variable asal.
Ini berguna terutama ketika ingin mengenali data pelanggan baru masuk ke segment mana.
Untuk menggabungkan data hasil konversi data.matrix ke pelanggan, digunakan funtion data.frame().
Sebagai contoh, untuk menggabungkan variable pelanggan dan pelanggan_matrix maka perintahnya adalah sebagai berikut.
pelanggan <- read.csv("customer_segments.txt",sep="\t")
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
# Penggabungan data
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
# Output kembali data hasil penggabungan
head(pelanggan)
## Customer_ID Nama.Pelanggan Jenis.Kelamin Umur Profesi Tipe.Residen
## 1 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector
## 2 CUST-002 Shirley Ratuwati Wanita 14 Pelajar Cluster
## 3 CUST-003 Agus Cahyono Pria 48 Professional Cluster
## 4 CUST-004 Antonius Winarta Pria 53 Professional Cluster
## 5 CUST-005 Ibu Sri Wahyuni, IR Wanita 41 Wiraswasta Cluster
## 6 CUST-006 Rosalina Kurnia Wanita 24 Professional Cluster
## NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
## 1 9497927 1 5 2
## 2 2722700 2 3 1
## 3 5286429 1 4 1
## 4 5204498 1 4 1
## 5 10615206 2 5 1
## 6 5215541 2 4 1
Catatan: Jika berhasil, maka isi penggabungan ini akan menambahkan kolom bernama “Jenis.Kelamin.1”, “Profesi.1”, dan “Tipe.Residen.1” yang sebelumnya tidak ada pada kedua variable.
Akhiran “.1” ini ditambahkan karena di variabel pelanggan sudah ada nama kolom yang sama.
Sebagai contoh kolom “Jenis.Kelamin” yang terdapat pada pelanggan_matrix sudah ada juga di variabel pelanggan. Jadi ketika digabungkan, R akan menambahkan akhiran .1 untuk kolom “Jenis.Kelamin” yang terdapat di pelanggan_matrix.
Kali ini perhatikan kolom “NilaiBelanjaSetahun”. Isi datanya bernilai jutaan. Ketika kolom ini digunakan untuk clustering, perhitungan sum of squared errors akan menjadi sangat besar.
Dilakukan menormalisasikan nilainya agar perhitungan lebih sederhana dan mudah dicerna, namun tidak mengurangi akurasi. Ini terutama akan sangat bermanfaat jika jumlah data sangat banyak, misalkan memiliki 200 ribu data.
Normalisasi bisa dilakukan dengan banyak cara. Untuk kasus ini, cukup dengan pembagian sehingga nilai jutaan menjadi puluhan.
pelanggan <- read.csv("customer_segments.txt", sep="\t")
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
# Normalisasi Nilai
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
# Output variabel pelanggan$NilaiBelanjaSetahun
pelanggan$NilaiBelanjaSetahun
## [1] 9.497927 2.722700 5.286429 5.204498 10.615206 5.215541 9.837260
## [8] 5.223569 5.993218 5.257448 5.987367 5.941914 9.333168 9.471615
## [15] 10.365668 5.262521 5.677762 5.340690 10.884508 2.896845 9.222070
## [22] 5.298157 5.239290 10.259572 10.721998 5.269392 9.114159 6.631680
## [29] 5.271845 5.020976 3.042773 10.663179 3.047926 9.759822 5.962575
## [36] 9.678994 5.972787 10.477127 5.257775 2.861855 6.820976 9.880607
## [43] 5.268410 9.339737 5.211041 10.099807 6.130724 10.390732 4.992585
## [50] 10.569316
Setelah penggabungan data, disini jadi mengetahui sebenarnya teks kategori dikonversi menjadi angka numerik berapa.
Sebagai contoh, jika menampilkan data kolom “Profesi” dan “Profesi.1” dengan perintah berikut.
pelanggan[c("Profesi","Profesi.1")]
Maka sebagian hasilnya akan tampil sebagai berikut.
## Profesi Profesi.1
## 1 Wiraswasta 5
## 2 Pelajar 3
## 3 Professional 4
## 4 Professional 4
## 5 Wiraswasta 5
## 6 Professional 4
Terlihat kalau Wiraswasta dikonversi menjadi angka 5, Pelajar menjadi angka 3, Professional menjadi angka 4, Ibu Rumah Tangga menjadi angka 1, dan satu lagi adalah Mahasiswa yang dikonversi menjadi angka 2 (tidak terlihat disini). Setiap angka mewakili suatu nilai/teks/data.
Daftar data kategori dan hasil konversinya sangat penting untuk dijadikan referensi sehingga nanti ketika ada data baru, dapat “petakan” menjadi data numerik yang siap digunakan untuk algoritma clustering.
Nah, masalahnya data di atas terlalu panjang, padahal sebenarnya cuma perlu 5 baris data bukan? Di R, dapat meringkasnya dengan fungsi unique().
Contoh perintahnya adalah sebagai berikut:
unique(pelanggan[c("Profesi","Profesi.1")])
Hasilnya akan tampak sebagai berikut.
## Profesi Profesi.1
## 1 Wiraswasta 5
## 2 Pelajar 3
## 3 Professional 4
## 17 Ibu Rumah Tangga 1
## 31 Mahasiswa 2
Terlihat datanya sudah diringkas dengan teks kategori beserta pasangan numeriknya. Kemudian perhatikan juga angka-angka 1, 2, 3, 17 dan 31 yang terdapat di bagian paling kiri. Ini menunjukkan posisi baris ditemukannya teks tersebut. Dengan kata lain, fungsi unique() ini membuat data yang duplikat.
Data ringkas dan unik ini untuk selanjutnya akan sebut sebagai data referensi atau data master.
Untuk algoritma clustering k-means yang akan digunakan di R, maka tahap data preparation-nya adalah menyiapkan data yang di dalamnya harus berisi numerik.
Namun pada banyak kasus riil, data tidak sepenuhnya berisi numerik seperti telah dilihat sendiri dan praktekkan dengan contoh dataset yang digunakan pada bab ini dengan langkah-langkah berikut:
Dengan demikian, selanjutnya sudah siap melangkah ke bagian berikutnya: Clustering dan Algoritma K-Means.
Clustering adalah proses pembagian objek-objek ke dalam beberapa kelompok (cluster) berdasarkan tingkat kemiripan antara satu objek dengan yang lain.
Beberapa contoh clustering:
Banyak algoritma telah dikembangkan untuk melakukan clustering secara otomatis, salah satu yang sangat populer adalah K-Means yang akan menjadi fokus utama latihan ini.
K-means adalah algoritma yang membagi data menjadi sejumlah partisi dengan cara sederhana: mencari kedekatan dari tiap titik pada suatu cluster dengan sejumlah nilai rata-rata atau mean.
Ada dua konsep kunci yang juga menjadi nama asal k-means:
Algoritma k-means sudah ada di paket dasar R dalam bentuk function bernama kmeans. Sepanjang praktek ini, akan digunakan fungsi ini dan menganalisa output-nya.
Catatan: Syarat yang harus dipenuhi dalam melakukan k-means di R;
Praktek kali ini akan melakukan segmentasi langsung pada data pelanggan – yang telah dilakukan persiapan datanya pada praktek sebelumna – dengan menggunakan function kmeans().
Fungsi kmeans memerlukan minimal 2 parameter, yaitu:
Terbaik disini artinya jarak antara tiap titik ke mean dari cluster-nya sendiri lebih kecil dibandingkan ke mean dari cluster lain.
Catatan: Mean atau nilai rata-rata disini sering disebut juga dengan centroid pada berbagai literatur data science.
Dan fungsi kmeans ini biasanya disertai dengan pemanggilan function seet.seed(). Ini berguna agar dapat “menyeragamkan” daftar nilai acak yang sama dari kmeans sehingga mendapatkan output yang sama.
Berikut adalah contoh penggunaan fungsi kombinasi set.seed dan kmean.
set.seed(100)
kmeans(x = pelanggan[c("Umur", "Profesi.1")], centers = 3)
Ini artinya membagi data pelanggan berdasarkan “Umur” dan “Profesi” menjadi 3 segmen.
Kadang kala berdasarkan pengalaman, 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 diberikan, algoritma akan memilih mana yang terbaik dari kombinasi-kombinasi tersebut.
Berikut adalah modifikasi pemanggailan fungsi dengan parameter tambahan nstart sebesar 25.
kmeans(x = pelanggan[c("Umur", "Profesi.1")], centers = 3, nstart = 25)
Contoh praktek:
Bagian kode/chunk dibawah sudah dilengkapi fungsi kmeans tersebut dengan:
# Bagian persiapan data
pelanggan <- read.csv("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)
# Function kmeans untuk membentuk 5 cluster dengan 25 skenario random dan simpan ke dalam variable segmentasi
segmentasi <- kmeans(x = pelanggan[field_yang_digunakan], centers = 5, nstart = 25)
#tampilkan hasil k-means
segmentasi
Ketika dieksekusi dengan lancar, harusnya mendapatkan hasil seperti gambar di bawah ini.
Hasil ini dapat dibagi dalam lima bagian, dengan penjelasan sesuai nomor urut pada gambar sebagai berikut:
Clustering vektor ini adalah rangkaian vektor yang berisi angka cluster. Dari hasil ini, vektor berisi angka 1 sampai dengan 5, maksimum sesuai dengan jumlah cluster yang diinginkan.
Vektor ini dimulai dari angka 2, yang artinya data pertama dari dataset akan dialokasikan pada nomor cluster 2. Dari gambar juga terlihat isi vektor kedua bernlai 1, ini artinya data kedua dari dataset 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
Contoh praktek:
Sekarang tugasnya adalah menambahkan hasil segmentasi ini ke data asal. Caranya mudah, yaitu dengan membuat kolom baru (“cluster”) di variable pelanggan yang isinya dari segmentasi$cluster.
pelanggan$cluster <- segmentasi$cluster
str(pelanggan)
Tahap berikutnya, akan dianalisa hasil pada bagian pertama.
Ini artinya dengan k-means nya telah membagi dataset pelanggan dengan 5 klaster, dimana:
Dengan jumlah total 50 data, yang juga merupakan jumlah data total pelanggan.
Mari verifikasi hal tersebut dengan memulai dari cluster 1. Ambil data pelanggan yang isi dari kolom clusternya adalah 1 dengan menggunakan fungsi which(), seperti perintah berikut pada chunk di bawah ini.
which(pelanggan$cluster == 1)
Paling tidak mendapatkan hasil sebagai berikut:
Hasil di atas menunjukkan 14 angka posisi data untuk cluster 1. Banyaknya angka pada deretan ini sesuai ukuran untuk cluster ke-1 dari informasi di atas.
Sekarang dicoba hitung jumlah deretan dengan menambahkan fungsi length() pada fungsi which(). Jika dijalankan akan mendapatkan angka yang terkadang berbeda. Seperti berikut:
# Mengambil file .csv dari URL
pelanggan <- read.csv("customer_segments.txt", sep = "\t")
# Mengkonversi kolom-kolom tersebut menjadi numerik
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
# Menggabungkan dua dataset
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
# Mencari hasil yang unik atau tidak duplikat
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")])
# Menyederhanakan/menormalisasi suatu nilai
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
# Mendeklarasikan nama-nama kolom yang akan dipakai
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1", "NilaiBelanjaSetahun")
# Menyeragamkan nilai acak yang sama dengan kmeans
set.seed(100)
# Pengklasteran rata-rata, dengan jumlah 5 cluster dan kombinasi acak sebanyak 25
segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers = 5, nstart = 25)
# Menambahkan kolom "cluster" berisi hasil dari k-means di variabel "segmentasi"
pelanggan$cluster <- segmentasi$cluster
# Analisa hasil, filter cluster ke-1
which(pelanggan$cluster == 2)
## [1] 9 10 16 17 19 23 25 27 36 42 43 49
# Menghitung jumlah deretan/menampilkan ukuran cluster ke-2 dari pelanggan
length(which(pelanggan$cluster == 2))
## [1] 12
Hasil diatas menunjukkan 12 angka posisi data untuk klaster 1. Banyaknya angka pada deretan ini sesuai ukuran klaster ke-2 dari informasi diatas.
Sejauh ini, belum terlihat data hasil klaster. Dapat dilihat klaster ke-N atau istilahnya melihat klaster dengan kondisi tertentu. Misal melihat klaster ke-1, maka dalam R digunakan operator “==” atau equal/sama dengan.
Berikut adalah perintah untuk melihat seluruh data pada klaster ke-1:
pelanggan[which(pelanggan$cluster == 1),]
## Customer_ID Nama.Pelanggan Jenis.Kelamin Umur Profesi Tipe.Residen
## 1 CUST-001 Budi Anggara Pria 58 Wiraswasta Sector
## 7 CUST-007 Cahyono, Agus Pria 64 Wiraswasta Sector
## 13 CUST-013 Cahaya Putri Wanita 64 Wiraswasta Cluster
## 14 CUST-014 Mario Setiawan Pria 60 Wiraswasta Cluster
## 18 CUST-018 Nelly Halim Wanita 63 Ibu Rumah Tangga Cluster
## NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1 cluster
## 1 9.497927 1 5 2 1
## 7 9.837260 1 5 2 1
## 13 9.333168 2 5 1 1
## 14 9.471615 1 5 1 1
## 18 5.340690 2 1 1 1
Dimana ada 5 data denangan seluruh data dominan berjenis kelamin pria dan umur antara 58 s/d 64 tahun. Penghasilan, profesi, nilai belanja dan tipe residen cukup bervariasi.
Baris kode diatas yaitu dimana memanggil semua kolom di dataset “pelanggan” dengan kondisi dimana setiap rows/baris yang memiliki klaster ke-1.
Dan coba untuk merubah perintah melihat klaster ke-2.
pelanggan[which(pelanggan$cluster == 2),]
## Customer_ID Nama.Pelanggan Jenis.Kelamin Umur Profesi
## 9 CUST-009 Elisabeth Suryadinata Wanita 29 Professional
## 10 CUST-010 Mario Setiawan Pria 33 Professional
## 16 CUST-016 Bambang Rudi Pria 35 Professional
## 17 CUST-017 Yuni Sari Wanita 32 Ibu Rumah Tangga
## 19 CUST-019 Mega Pranoto Wanita 32 Wiraswasta
## 23 CUST-023 Denny Amiruddin Pria 34 Professional
## 25 CUST-025 Julia Setiawan Wanita 29 Wiraswasta
## 27 CUST-027 Grace Mulyati Wanita 35 Wiraswasta
## 36 CUST-036 Ni Made Suasti Wanita 30 Wiraswasta
## 42 CUST-042 Yuliana Wati Wanita 26 Wiraswasta
## 43 CUST-043 Yenna Sumadi Wanita 31 Professional
## 49 CUST-049 Josephine Wahab Wanita 33 Ibu Rumah Tangga
## Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
## 9 Sector 5.993218 2 4 2
## 10 Cluster 5.257448 1 4 1
## 16 Cluster 5.262521 1 4 1
## 17 Cluster 5.677762 2 1 1
## 19 Cluster 10.884508 2 5 1
## 23 Cluster 5.239290 1 4 1
## 25 Sector 10.721998 2 5 2
## 27 Cluster 9.114159 2 5 1
## 36 Cluster 9.678994 2 5 1
## 42 Cluster 9.880607 2 5 1
## 43 Cluster 5.268410 2 4 1
## 49 Sector 4.992585 2 1 2
## cluster
## 9 2
## 10 2
## 16 2
## 17 2
## 19 2
## 23 2
## 25 2
## 27 2
## 36 2
## 42 2
## 43 2
## 49 2
Hasil diatas terlihat umur mayoritas sudah masuk usia 20 tahun ke atas dan kebanyakan adalah wiraswasta dan profesional. Dan rata-rata nilai belanja adalah sekitar 5 sampai 9 juta.
Klaster means adalah hasil nilai rata-rata atau titik sentral (centroid) dari seluruh titip tiap klaster.
Apa penjelasan hasil diatas?
Pada klaster ke-1 terlihat bahwa hanya ada angka 2, artinya klaster 1 hanya berisi data dengan profil berjenis kelamin wanita. Sedangkan, untuk klaster 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”.
Angka 1, 2, 3, 4 dan 5 masing-masing mewakili profesi; Wiraswasta, Pelajar, Professional, Ibu Rumah Tangga dan Mahasiswa.
Terlihat untuk seluruh klaster profesi cenderung ke Professional terutama untuk klaster 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 klaster, terlihat data cukup tersebar antara Sector dan Cluster terutama untuk klaster ke-4 dimana nilai kolom ini di angka 1.555.
Terakhir, kolom NilaiBelanjaSetahun cukup signifikan pembagiannya untuk tiap klaster. Dimana klaster ke-2 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan ketiga klaster lainnya.
Ini mungkin target customer yang bisa lebih disasar melalui marketing campaign, karena klaster ke-2 saat ini hanya berisi 5 data. Cukup kecil proporsinya, dan ingin ditingkatkan.
Ini terlihat dari hasil output kmeans bagian pertama yang menunjukkan distribusi jumlah data dari tiap klaster:
Contoh pratek:
Cara melihat hasil dari cluster means ini dengan langsung mengakses variabel segmentasi pada komponen “centers”. Caranya:
segmentasi$centers
## Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1 1.40 61.80000 4.200000 1.400000 8.696132
## 2 1.75 31.58333 3.916667 1.250000 7.330958
## 3 2.00 20.07143 3.571429 1.357143 5.901089
## 4 2.00 42.33333 4.000000 1.555556 8.804791
## 5 1.70 52.50000 3.800000 1.300000 6.018321
Yang akan dianalisa berikutnya adalah bagian keempat, yaitu nilai metrik sum of squares seperti terlihat berikut ini.
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 klaster 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 klaster tersebut.
Berdasarkan konsep tersebut, berikut adalah penjelasan untuk hasil output kmeans di atas:
Ini adalah metrik yang bisa digunakan untuk menjawab seberapa baik jumlah klaster yang dibentuk? Apakah dibagi 2, 5, 10 atau 30?
Teknik penggunaan metrik ini cukup panjang, namun untuk kepentingan praktis kali ini hanya melihat perbedaan nilai ini dengan contoh.
# Membandingkan dengan 2 cluster kmeans, masing-masing 2 dan 5
set.seed(100)
kmeans(x = pelanggan[field_yang_digunakan], centers = 2, nstart = 25)
## K-means clustering with 2 clusters of sizes 23, 27
##
## Cluster means:
## Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1 1.739130 51.17391 3.913043 1.434783 7.551518
## 2 1.888889 25.85185 3.777778 1.296296 6.659586
##
## Clustering vector:
## [1] 1 2 1 1 1 2 1 1 2 2 1 1 1 1 2 2 2 1 2 2 2 1 2 1 2 1 2 1 1 1 2 1 2 2 1 2 2 1
## [39] 2 2 2 2 2 2 2 2 1 1 2 1
##
## Within cluster sum of squares by cluster:
## [1] 1492.481 1524.081
## (between_SS / total_SS = 72.6 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
set.seed(100)
kmeans(x = pelanggan[field_yang_digunakan], centers = 5, nstart = 25)
## K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
##
## Cluster means:
## Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1 1.40 61.80000 4.200000 1.400000 8.696132
## 2 1.75 31.58333 3.916667 1.250000 7.330958
## 3 2.00 20.07143 3.571429 1.357143 5.901089
## 4 2.00 42.33333 4.000000 1.555556 8.804791
## 5 1.70 52.50000 3.800000 1.300000 6.018321
##
## Clustering vector:
## [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
##
## Within cluster sum of squares by cluster:
## [1] 58.21123 174.85164 316.73367 171.67372 108.49735
## (between_SS / total_SS = 92.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Penjelasan hasil dapat diilustrasikan sesuai gambar dibawah.
Terlihat untuk 2 klaster (k=2), SS per klaster lebih besar dibandingkan jika data dibagi menjadi 5 klaster (k=5). Perhatikan juga persentase rasio antara between_SS dan total_SS, dimana k=5 juga lebih besar.
Analisa terakhir dari kode adalah bagian ini, yaitu sembilan komponen objek yang bisa digunakan untuk lihat detil dari objek k-means.
Berikut adalah penjelasan singkat dari sembilan komponen tersebut.
Seluruh komponen tersebut bisa diakses dengan menggunakan aksesor “$”. Contoh, dengan variabel kmeans bernama segmentasi dan ingin mengakses komponen withinss dan yang lainnya, maka dapat menggunakan perintah berikut:
segmentasi$cluster
## [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
segmentasi$withinss
## [1] 58.21123 174.85164 316.73367 171.67372 108.49735
segmentasi$tot.withinss
## [1] 829.9676
Fungsi kmeans sederhana digunakan tapi outputnya memiliki informasi yang kaya yaitu:
Dengan menganalisa hasil output ini, sudah mampu menggabungkan nomor cluster ke data asal. Selain itu dapat juga mengetahui bagaimana kedekatan tiap titik data dari clusternya sehingga menjadi bekal untuk menentukan jumlah cluster yang optimal.
Dari informasi yang dihasilkan oleh fungsi kmeans, metrick Sum of Squares (SS) atau sering disebut Sum of Squared Errors (SSE) sangat penting untuk dijadikan dasar dalam menentukan jumlah cluster yang paling optimal.
Secara teoritis, berikut adalah beberapa hal yang bisa diaamati dengan SS:
Jika dimasukkan ke dalam grafik garis, maka plotting dari total SS untuk tiap cluster berbentuk sebagai berikut.
Titik paling kiri adalah jumlah SS untuk 1 jumlah cluster, titik kedua adalah untuk 2 jumlah cluster, dan seterusnya. Perhatikan semakin ke kanan perbedaan jarak antar tiap titik semakin mengecil.
Grafik garis ini memiliki bentuk seperti siku tangan, dan untuk optimal jumlah cluster biasanya dengan mengambil titik sikunya. Pada contoh di atas bisa mengambil 4 atau 5.
Proses pengambilan keputusan berdasarkan plotting siku ini biasa disebut Elbow Effect atau Elbow Method.
Penjelasan interaktif selengkapnya lihat video ini.
Metrik elbow method yang digunakan sebagai basis justifikasi adalah Sum of Squares (SS), atau lebih tepatnya komponen tot.withinss dari objek kmeans.
Metrik ini akan dicari progressive nilai tot.withinss untuk tiap kombinasi jumlah klaster, dan disimpan dalam bentuk vector di R.
Untuk keperluan ini, akan gunakan fungsi sapply(). Function sapply akan digunakan untuk memanggil function kmeans untuk suatu range jumlah klaster. Range yang digunakan 1 sampai dengan 10.
set.seed(100)
sse <- sapply(1:10,
function(param_k){
kmeans(pelanggan[field_yang_digunakan], param_k, nstart = 25)$tot.withinss
}
)
Penjelasan baris kode diatas:
sse : Nama variable yang akan digunakan untuk menyimpan nilai tot.withinss dari tiap objek kmeans
sapply : Merupakan function yang digunakan untuk menghasilkan vector dari iterasi (looping) dari eksekusi fungsi tertentu (pada kasus ini: kmeans) dengan nilai range yang diberikan
1:10 : Range jumlah klaster dari 1 sampai dengan 10
param_k : Parameter yang akan berisi nilai 1 sampai dengan 10, sesuai range di atas
kmeans(pelanggan[field_yang_digunakan], param_k, nstart=25) : Fungsi kmeans yang dipanggil sebanyak nilai range 1 sampai dengan 10 (param_k) dari dataset pelanggan
$tot.withinss : Total penjumlahan dari tiap SS dari “withinss”
Dan hasil dari kode diatas adalah berikut.
print(sse)
## [1] 10990.9740 3016.5612 1550.8725 1064.4187 829.9676 625.1462
## [7] 508.1568 431.6977 374.1095 317.9424
Sekarang akan memvisualisasikan vektor Sum of Squares (SS) atau Sum of Squared Errors (SSE) yang telah dihasilkan pada sebelumnya.
Visualisasi menggunakan fungsi ggplot(), maka harus menggunakan library ggplot2. Datasetnya berupa penggabungan data frame dari sse dan range nilai 1:10, dengan perintah berikut.
library(ggplot2)
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() +
theme(panel.background = element_blank(),
axis.line = element_line(colour = "black")) +
labs(title = "Sum of Squares",
subtitle = "Sum of Squares (SS) pada range cluster 1:10",
caption = "Sumber data: DQLab",
x = "Jumlah Cluster",
y = "Within Cluster Sum of Squares") +
geom_text(aes(label = format(round(sse, 2), nsmall = 2)),
hjust = 0.1,
vjust = -0.8,
size = 2.5) +
scale_x_discrete(limits = c(1:jumlah_cluster_max))
Penjelasan baris kode diatas:
library(ggplot2) : mengambil fungsi-fungsi dari package atau library “ggplot2” yang digunakan untuk urusan visualisasi
ssdata <- data.frame(cluster = c(1:jumlah_cluster_max), sse) : menggabungkan range klaster 1:10 (jumlah_cluster_max) dengan variabel “sse”
ggplot(ssdata, aes(x = cluster, y = sse)) : fungsi ggplot ini mengambil 3 argumen; data (ssdata), sumbu x (cluster), dan sumbu y (sse)
geom_line(color = “red”) : untuk menambahkan bentuk grafik garis berwarna merah
geom_point() : untuk menambahkan titik-tik atau bulat-bulat sesuai dimana nilai berada
theme(panel.background = element_blank(), axis.line = element_line(colour = “black”)) : fungsi theme() ini untuk tampilan estetis. Ada dua argumen; yang pertama untuk menghilangkan grid (latar garis kota-kotak), yang kedua untuk memberikan warna hitam pada garis sumbu x dan y
labs(x = …, y = …, …) : fungsi labs() untuk memberikan deskripsi/tulisan pada grafik
geom_text(aes(…)…) : fungsi geom_text() untuk memberikan keterangan pada setiap titik tertentu (kasus ini: klaster). Argumen yang ada di dalam aes() untuk membuat nilai dibulatkan dimana kondisi 2 angka setelah koma, termasuk argumen “nsmall”. Argumen hjust dll untuk mengatur posisi keterangan
scale_x_discrete(limits = c(1:jumlah_cluster_max) : untuk memberikan batas rentang nilai (limit) pada sumbu x, yaitu 1 sampai 10 (variabel jumlah_cluster_max menyimpan nilai 10)
Berikut hasil grafik dari baris kode diatas:
Dengan memanfaatkan nilai Sum of Squares (SS) atau Sum of Squared Errors (SSE) dapat mengambil keputusan jumlah segmentasi optimal yang digunakan.
Ini dilakukan dengan membuat simulasi iterasi jumlah klaster dari 1 sampai dengan jumlah maksimum yang diinginkan. Pada kasus, menggunakan angka iterasi 1 sampai dengan 10.
Setelah mendapatkan nilai SS dari tiap jumlah klaster, langsung bisa plotting ke grafik garis dan menggunakan elbow method untuk menentukan jumlah klaster optimal.
Setelah berhasil mempersiapkan data, menggunakan algoritma kmeans, dan akhirnya bisa memutuskan jumlah cluster terbaik.
Maka tahapan berikutnya adalah “memaketkan” atau “membungkus” seluruh referensi hasil konversi dan objek kmeans ini supaya bisa digunakan untuk mengolah data baru dan berguna di bisnis.
Untuk ini tahapannya adalah sebagai berikut:
Pada bagian ini, dimana akan menamakan segmen sesuai dengan karakteristiknya. Untuk membantu, gambar berikut menunjukkan nilai mean tiap kolom yang digunakan tiap klaster dan juga nilai kolom sebelum konversi.
Berikut contoh menamakan klaster 1 s/d 5:
Cluster 1 : Silver Youth Gals: alasannya adalah karena umurnya rata-rata adalah 20, wanita semua, profesinya bercampur antar pelajar dan professional serta pembelanjaan sekitar 6 juta.
Cluster 2 : Diamond Senior Member: alasannya adalah karena umurnya rata-rata adalah 61 tahun dan pembelanjaan di atas 8 juta.
Cluster 3 : Gold Young Professional: alasannya adalah karena umurnya rata-rata adalah 31 tahun, professional dan pembelanjaan cukup besar.
Cluster 4 : Diamond Profesional: alasannya adalah karena umurnya rata-rata adalah 42 tahun, pembelanjaan paling tinggi dan semuanya professional.
Cluster 5 : Silver Mid Professional: alasannya adalah karena umurnya rata-rata adalah 52 tahun dan pembelanjaan sekitar 6 juta.
Nama-nama klaster ini bisa dimasukkan ke dalam data frame. Agar setiap klaster memiliki nama-namanya sendiri. Berikut perintahnya:
Segmen.Pelanggan <- data.frame(cluster = c(1,2,3,4,5),
Nama.Segmen = c("Silver Youth Gals",
"Diamond Senior Member",
"Gold Young Professional",
"Diamond Professional",
"Silver Mid Professional"
)
)
print(Segmen.Pelanggan)
## cluster Nama.Segmen
## 1 1 Silver Youth Gals
## 2 2 Diamond Senior Member
## 3 3 Gold Young Professional
## 4 4 Diamond Professional
## 5 5 Silver Mid Professional
Pada bagian-bagian sebelumnya, sudah banyak aset-aset data yang dipahami bersama, yaitu:
Akan sangat baik jika semuanya digabungkan di satu variabel dengan tipe list, dan ini akan jadi model yang dapat disimpan ke dalam file dan digunakan ketika diperlukan. Layaknya seperti function pada pemrograman atau stored procedure pada SQL.
Baris kode dibawah ini (pada variabel Indentitas.Cluster) untuk menggabungkan beberapa variabel.
# Membaca data csv dan memasukkan ke variabel
pelanggan <- read.csv("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.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])
pelanggan$NilaiBelanjaSetahun = pelanggan$NilaiBelanjaSetahun/1000000
# Bagian K-Means
set.seed(100)
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
Segmen.Pelanggan <- data.frame(cluster = c(1,2,3,4,5),
Nama.Segmen = c("Silver Youth Gals",
"Diamond Senior Member",
"Gold Young Professional",
"Diamond Professional",
"Silver Mid Professional"
)
)
#Menggabungkan seluruh aset ke dalam variable Identitas.Cluster dengan tipe "list"
Identitas.Cluster <- list(Profesi = Profesi,
Jenis.Kelamin = Jenis.Kelamin,
Tipe.Residen = Tipe.Residen,
Segmentasi = segmentasi,
Segmen.Pelanggan = Segmen.Pelanggan,
field_yang_digunakan = field_yang_digunakan
)
Identitas.Cluster
## $Profesi
## Profesi Profesi.1
## 1 Wiraswasta 5
## 2 Pelajar 3
## 3 Professional 4
## 17 Ibu Rumah Tangga 1
## 31 Mahasiswa 2
##
## $Jenis.Kelamin
## Jenis.Kelamin Jenis.Kelamin.1
## 1 Pria 1
## 2 Wanita 2
##
## $Tipe.Residen
## Tipe.Residen Tipe.Residen.1
## 1 Sector 2
## 2 Cluster 1
##
## $Segmentasi
## K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
##
## Cluster means:
## Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1 1.40 61.80000 4.200000 1.400000 8.696132
## 2 1.75 31.58333 3.916667 1.250000 7.330958
## 3 2.00 20.07143 3.571429 1.357143 5.901089
## 4 2.00 42.33333 4.000000 1.555556 8.804791
## 5 1.70 52.50000 3.800000 1.300000 6.018321
##
## Clustering vector:
## [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
##
## Within cluster sum of squares by cluster:
## [1] 58.21123 174.85164 316.73367 171.67372 108.49735
## (between_SS / total_SS = 92.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
##
## $Segmen.Pelanggan
## cluster Nama.Segmen
## 1 1 Silver Youth Gals
## 2 2 Diamond Senior Member
## 3 3 Gold Young Professional
## 4 4 Diamond Professional
## 5 5 Silver Mid Professional
##
## $field_yang_digunakan
## [1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
## [4] "Tipe.Residen.1" "NilaiBelanjaSetahun"
Objek yang sudah digabungkan pada sebelumnya sudah memiliki semua aset yang diperlukan untuk mengalokasikan data baru ke segmen yang sesuai.
Untuk menyimpan objek ini ke dalam file menggunakan fungsi saveRDS(). File ini kemudian dapat dibuka kembali sebagai objek ke depannya.
Sebagai contoh, perintah untuk menyimpan objek Identitas.Cluster ke file cluster.rds adalah sebagai berikut.
saveRDS(object = Identitas.Cluster, file = "cluster.rds")
Catatan: Hasil file akan disimpan di direktori yang sama dimana project R disimpan di local file.
Sampai bagian ini, sudah mampu menggabungkan seluruh aset yang diperlukan untuk membentuk suatu model.
Model ini adalah objek yang bisa digunakan untuk mengolah data baru dan terdiri dari objek kmeans, variable referensi hasil konversi teks ke numerik, dan juga penamaan klaster.
Apa yang dimaksud dengan mengoperasionalkan pada judul diatas?
Ini artinya objek hasil pengolahan algoritma K-Means dan variabel-variabel terkait yang telah dihasilkan sebelumnya harus dapat digunakan ke kasus riil sehingga satu siklus lengkap terjadi.
Kasus riil untuk clustering adalah cukup sederhana: bagaimana data baru dapat otomatis membantu tim marketing dan CRM untuk mengidentifikasi segmen mana pelanggan tersebut berada dengan cepat.
Dengan kecepatan identifikasi, maka organisasi atau bisnis dapat dengan cepat bergerak dengan pesan marketing yang efektif dan memenangkan persaingan.
Pada teks sebelumnya, disebutkan data pelanggan baru harus cepat dipetakan ke segmen.
Dengan asumsi tiap data pelanggan baru diinput ke dalam sistem, maka pengolahan adalah per record/baris. Kali ini, akan dibuat data.frame dengan satu data dimana nama-nama kolomnya persis dengan dataset awal.
databaru <- data.frame(Customer_ID = "CUST-100",
Nama.Pelanggan = "Rudi Wilamar",
Umur = 20,
Jenis.Kelamin = "Wanita",
Profesi = "Pelajar",
Tipe.Residen = "Cluster",
NilaiBelanjaSetahun = 3.5)
databaru
## Customer_ID Nama.Pelanggan Umur Jenis.Kelamin Profesi Tipe.Residen
## 1 CUST-100 Rudi Wilamar 20 Wanita Pelajar Cluster
## NilaiBelanjaSetahun
## 1 3.5
Maksud disini adalah membuka/membaca file yang telah disimpan simpan sebelumnya dengan sebuah fungsi, dan supaya dikenali di R sebagai objek yang akan digunakan untuk mengolah data baru.
Untuk membuka file tersebut, menggunakan fungsi readRDS().
Perintahnya sangat sederhana, berikut adalah untuk membuka file cluster.rds yang telah disimpan sebelumnya.
Identitas.Cluster <- readRDS(file = "cluster.rds")
Identitas.Cluster
## $Profesi
## Profesi Profesi.1
## 1 Wiraswasta 5
## 2 Pelajar 3
## 3 Professional 4
## 17 Ibu Rumah Tangga 1
## 31 Mahasiswa 2
##
## $Jenis.Kelamin
## Jenis.Kelamin Jenis.Kelamin.1
## 1 Pria 1
## 2 Wanita 2
##
## $Tipe.Residen
## Tipe.Residen Tipe.Residen.1
## 1 Sector 2
## 2 Cluster 1
##
## $Segmentasi
## K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
##
## Cluster means:
## Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1 1.40 61.80000 4.200000 1.400000 8.696132
## 2 1.75 31.58333 3.916667 1.250000 7.330958
## 3 2.00 20.07143 3.571429 1.357143 5.901089
## 4 2.00 42.33333 4.000000 1.555556 8.804791
## 5 1.70 52.50000 3.800000 1.300000 6.018321
##
## Clustering vector:
## [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
##
## Within cluster sum of squares by cluster:
## [1] 58.21123 174.85164 316.73367 171.67372 108.49735
## (between_SS / total_SS = 92.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
##
## $Segmen.Pelanggan
## cluster Nama.Segmen
## 1 1 Silver Youth Gals
## 2 2 Diamond Senior Member
## 3 3 Gold Young Professional
## 4 4 Diamond Professional
## 5 5 Silver Mid Professional
##
## $field_yang_digunakan
## [1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
## [4] "Tipe.Residen.1" "NilaiBelanjaSetahun"
Dengan adanya data baru dan objek yang berisi data referensi telah dibaca kembali, bisa menggabungkan data baru ini untuk mendapatkan konversi numerik dari field Jenis.Kelamin, Profesi dan Tipe.Residen.
Tujuannya adalah agar bisa mencari segmen pelanggannya dengan data numerik hasil penggabungan.
Cara menggabungkannya adalah dengan menggunakan fungsi merge(), dimana kedua data akan digabungkan dengan mencari persamaan nama kolom dan isinya.
Sebagai contoh, perintah berikut akan menggabungkan variabel databaru dengan variable Identitas.Cluster$Profesi.
merge(databaru, Identitas.Cluster$Profesi)
## Profesi Customer_ID Nama.Pelanggan Umur Jenis.Kelamin Tipe.Residen
## 1 Pelajar CUST-100 Rudi Wilamar 20 Wanita Cluster
## NilaiBelanjaSetahun Profesi.1
## 1 3.5 3
Proses dari merge kedua data frames sebagai berikut:
Bisa penggabungan dengan dua lebih variabel seperti berikut.
databaru <- merge(databaru, Identitas.Cluster$Profesi)
databaru <- merge(databaru, Identitas.Cluster$Jenis.Kelamin)
databaru <- merge(databaru, Identitas.Cluster$Tipe.Residen)
databaru
## Tipe.Residen Jenis.Kelamin Profesi Customer_ID Nama.Pelanggan Umur
## 1 Cluster Wanita Pelajar CUST-100 Rudi Wilamar 20
## NilaiBelanjaSetahun Profesi.1 Jenis.Kelamin.1 Tipe.Residen.1
## 1 3.5 3 2 1
Tahap ini merupakan yang terpenting bagi bisnis; data baru ini masuk ke segmen mana?
Mudah! Yaitu dengan tahapan berikut:
Kalau diterjemahkan ke bentuk rumus sebagai berikut:
which.min(sapply(1:5, function(x) sum((databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2)))
Penjelasan baris kode diatas:
Jika di-run, maka output nya akan seperti berikut:
## [1] 3
Output yang diberikan yaitu 3. Angka 3 disini masih belum jelas angka ini berisi sebuah nilai apa karena yang keluar hanya nomor klasternya.
Maka agar lebih mudah dibaca, baris kode dari fungsi which.min(…), dimasukkan ke dalam indeks (kurung sikut “[]”). Seperti berikut:
Identitas.Cluster$Segmen.Pelanggan[which.min(sapply(1:5, function(x) sum((databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2 ))),]
## cluster Nama.Segmen
## 3 3 Gold Young Professional
Terlihat lebih jelas bahwa angka 3/klaster ke-3 berisi nilai “Gold Young Professional” dari kolom Nama.Segmen.
Catatan: pada baris kode diatas, terdapat tanda koma (,) di akhir sebelum penutup kurung sikut. Dalam indeks, setelah koma berarti mengambil semua nilai dari suatu kolom. Contoh: data[1:3,2] : mengambil baris 1 sampai 3 dari kolom 1 dan 2. Jika setelah koma kosong, maka semua kolom diambil.
Praktek terakhir menunjukkan bagaimana data pelanggan baru dianalisa oleh model yang dibuat dan mengeluarkan nomor klaster atau segmen.
Sejauh ini topik teknis untuk customer segmentation yang sudah dilakukan adalah mengenai algoritma K-Means yang diimplementasikan di R.
Perlu diingat bahwa K-Means bukan satu-satunya algoritma clustering, masih banyak algoritma lain seperti Hierarchical Clustering, Parallelized Hierarchical Clustering, dan lain-lain.
Dan setiap algoritma juga memiliki kekurangan dan kelebihan masing-masing. Namun pengetahuan dasar dengan berangkat dari satu algoritma yang populer dan menuntaskannya pastinya akan menjadi bekal berharga.