1 Customer Segmentation

1.1 Pengantar

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:

  • Industri yang dijalankan
  • Jumlah karyawan/SDM
  • Produk-produk yang dijual sebelumnya
  • Lokasi

Dalam marketing B2C (Business-to-consumer), perusahaan atau badan sering mengelompokkan berdasarkan beberapa demografisnya:

  • Usia
  • Jenis kelamin
  • Status hubungan (Menikah, lajang, dll)
  • Lokasi (Perkotaan, pinggiran kota, pedesaan)
  • Tipe profesi atau pekerjaan

Kenapa Customer Segmentation penting?

  • Dapat membuat pesan pemasaran yang lebih mengena ke setiap pelanggan
  • Bisa lebih mengenal customer/pelanggan
  • Biaya pemasaran bisa menjadi lebih rendah

Kenapa perlu bantuan algoritma untuk Customer Segmentation?

  • Agar kita dapat membagi-bagi segmen customer dengan mudah
  • Dapat membantu kita menentukan jumlah clustering yang optimal
  • Dapat memberikan hasil yang lebih cepat
  • Karena bisa memberikan best practice

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.

1.2 Kesimpulan

  • Customer segmentation adalah proses penting yang diperlukan di bisnis untuk mengenal konsumen 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.
  • Dengan proses yang lebih tajam, 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.

2 Persiapan Data

2.1 Pengantar

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:

  1. Mengenal Contoh File Dataset Pelanggan
  2. Membaca File dengan read.csv
  3. Vektor untuk Menyimpan Nama Field
  4. Konversi Data dengan fungsi data.matrix()
  5. Menggabungkan hasil konversi
  6. Menormalisasikan Nilai Belanja
  7. Membuat Data Master

2.2 Dataset Customer Segments

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]

2.3 Konversi Data dengan Fungsi data.matrix()

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.

2.4 Menggabungkan Hasil Konversi

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.

2.5 Menormalisasikan Nilai Belanja

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

2.6 Membuat Data Master

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.

2.7 Kesimpulan

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:

  1. Mengenal Contoh File Dataset Pelanggan, dimana memahami dulu bagaimana bentuk dan isi dari contoh yang digunakan.
  2. Membaca File dengan read.csv, membaca suatu file teks dengan pemisah berupa tab menggunakan fungsi read.csv().
  3. Vektor untuk Menyimpan Nama Field, dimana nama-nama field/kolom bisa disimpan dalam bentuk vektor sehingga bisa digunakan berulang ketika butuh referensi nama-nama field/kolom yang sama.
  4. Konversi Data dengan data.matrix(), dimana dapat melakukan konversi data dari kategori teks menjadi numerik.
  5. Menggabungkan Hasil Konversi, dimana hasil konversi ini perlu digabungkan kembali ke variabel asal agar tidak kehilangan referensinya.
  6. Menormalisasikan Nilai Belanja, merubah skala data nilai belanja dari jutaan menjadi puluhan dengan tujuan penyederhanaan perhitungan namun tidak mengurangi akurasi.
  7. Membuat Data Master, meringkas data kategori dan numerik ke dalam variabel-variabel yang disebut sebagai data master.

Dengan demikian, selanjutnya sudah siap melangkah ke bagian berikutnya: Clustering dan Algoritma K-Means.

3 Clustering dan Algoritma K-Means

3.1 Apa itu 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:

  • Pengelompokan manusia berdasarkan umur: bayi, balita, anak, remaja, dewasa, tua.
  • Pengelompokan customer berdasarkan daya belinya: regular dan premium.
  • Pengelompokan makanan berdasarkan kandungan gizinya: biji-bijian, sayuran, buah-buahan, minyak, protein, dan lain-lain.

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:

  • Jumlah partisi yang diinginkan, diwakili oleh huruf k
  • Mencari “jarak” kedekatan tiap titik ke sejumlah nilai rata-rata cluster yang diamati, diwakili oleh means. Ini biasa juga disebut centroid dilambang oleh simbol segitiga.

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;

  • Dataset harus berupa matrix dan
  • seluruh nilai data harus dikonversi ke bentuk numerik

3.2 Fungsi K-means

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:

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

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:

  • x: berisi data pelanggan dengan fields yang diambil dari vektor field_yang_digunakan (sudah didefinisikan di potongan kode)
  • centers: jumlah segmen / cluster yang diinginkan. Isi dengan 5.
  • nstart: isi dengan angka 25
# 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:

  1. Ukuran / jumlah titik data pada tiap cluster
  2. Nilai 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

3.3 Analisa Hasil Clustering Vektor

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)

3.4 Analisa Hasil Cluster Size

Tahap berikutnya, akan dianalisa hasil pada bagian pertama.

Ini artinya dengan k-means nya telah membagi dataset pelanggan dengan 5 klaster, 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.

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.

3.5 Melihat Data pada Cluster ke-N

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.

3.6 Analisa Hasil Cluster Means

Klaster means adalah hasil nilai rata-rata atau titik sentral (centroid) dari seluruh titip tiap klaster.

Apa penjelasan hasil diatas?

  • Kolom pertama yang berisi angka 1 sampai dengan 5 adalah mewakili nomor cluster.
  • Kolom Jenis.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 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”.

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

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

3.7 Analisa Hasil Sum of Squares

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:

  1. Nilai 316.73367 adalah SS untuk klaster ke-1, 58.21123 adalah SS untuk klaster 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 klaster. Nilai ini selalu tetap dan tidak terpengaruh dengan jumlah klaster.
  3. between_SS: adalah total_SS dikurangi dengan jumlah nilai SS seluruh klaster.
  4. (between_SS / total_SS) adalah rasio antara between_SS dibagi dengan total_SS. Semakin besar persentasenya, umumnya semakin baik.

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.

3.8 Available Components

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

3.9 Kesimpulan

Fungsi kmeans sederhana digunakan tapi outputnya memiliki informasi yang kaya yaitu:

  1. Ukuran / jumlah titik data pada tiap cluster
  2. Nilai rata-rata (centroid) dari tiap cluster
  3. Vector item dari cluster
  4. Jumlah jarak kuadrat dari tiap titik ke centroidnya (Sum of Squares atau SS)
  5. Komponen-komponen informasi lain

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.

4 Menentukan Jumlah Cluster Terbaik

4.1 Pengantar

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:

  • Semakin sedikit jumlah cluster yang dihasilkan maka semakin besar nilai SS.
  • Begitu juga sebaliknya, semakin banyak jumlah cluster yang dihasilkan maka semakin kecil nilai SS nya.
  • Karena sifatnya kuadratik, jika terdapat perbedaan yang cukup signifikan antara tiap kombinasi cluster maka perbedaan nilai SS akan semakin besar.
  • Dan seiring bertambahnya jumlah cluster, perbedaan tiap SS ini akan semakin kecil.

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.

4.2 Simualasi Jumlah Cluster dan Sum of Square (SS)

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

4.3 Grafik Elbow Effect

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:

4.4 Kesimpulan

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.

5 “Pemaketan” Model K-Means

5.1 Pengantar

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:

  • Menamakan klaster dengan karakteristik yang lebih mudah dimengerti. Penamaan ini disimpan dalam variabel “Segmen.Pelanggan”.
  • Menggabungkan variable Segmen.Pelanggan, Profesi, Jenis.Kelamin, Tipe.Residen, dan Segmentasi ke dalam satu objek bertipe list ke dalam variabel “Identitas.Cluster”.
  • Menyimpan objek Identitas.Cluster dalam bentuk file sehingga dapat digunakan kemudian, ini bisa disebut model.

5.2 Menamakan Segmen

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

5.3 Menggabungkan Referensi

Pada bagian-bagian sebelumnya, sudah banyak aset-aset data yang dipahami bersama, yaitu:

  • Dataset pelanggan yang telah “diperkaya” dengan tambahan kolom hasil konversi teks menjadi numerik, dan menormalisasikan field NilaiBelanjaSetahun.
  • Objek kmeans dengan k=5, dipilih berdasarkan metodologi menggunakan metrik Sum of Squares (SS).
  • Membuat variabel referensi atau pemetaan numerik dan teks asli (kategori) dari kolom Jenis Kelamin, Profesi dan Tipe Residen.
  • Variable data.frame dengan nama Pelanggan yang berisi penamaan klaster sesuai analisa karakteristik dari centroid kolom-kolom pelanggan yang digunakan.
  • Vector dari field yang digunakan.

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"

5.4 Menyimpan Objek dalam Bentuk File

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.

5.5 Kesimpulan

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.

6 Mengoperasionalkan Model K-Means

6.1 Pengantar

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.

6.2 Data Baru

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

6.3 Membuat Objek Clustering dari File

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"

6.4 Merge dengan Data Referensi

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:

  • Variabel databaru dengan Identitas.Cluster$Profesi memiliki nama kolom yang sama, yaitu Profesi.
  • Kolom Profesi kemudian akan dijadikan “kunci” untuk menggabungkan kedua variabel ini.
  • Ternyata isi Profesi dari databaru, yaitu “Pelajar” juga terdapat di Identitas.Cluster. Ini akan membuat penggabungan menjadi berhasil.
  • Penggabungan ini juga akan mengambil kolom Profesi.1 dan isi data yang terkait dengan Pelajar, yaitu nilai 3.

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

6.5 Menentukan Cluster

Tahap ini merupakan yang terpenting bagi bisnis; data baru ini masuk ke segmen mana?

Mudah! Yaitu dengan tahapan berikut:

  1. mencari jarak kuadrat minimum atau terdekat
  2. dari kolom numerik data baru tersebut
  3. ke centroid (nilai rata-rata) kolom terkait
  4. dari seluruh klaster yang ada

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:

  • which.min : merupakan fungsi untuk mencari yang mana (which) nilai minimum (min)
  • 1:5 : adalah range nomor klaster dari 1 sampai dengan 5 (atau lebih sesuai dengan ukuran klaster)
  • sapply : digunakan untuk melakukan iterasi berdasarkan range (dalam kasus ini 1 s/d 5)
  • function(x) : digunakan untuk proses dengan x diisi 1 s/d 5 per proses
  • databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster\(Segmentasi\)centers[x,])^2: adalah jarak kuadrat data. Ingat centers adalah atribut dari objek kmeans
  • sum : digunakan untuk menjumlahkan jarak kuadrat

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.

6.6 Kesimpulan

Praktek terakhir menunjukkan bagaimana data pelanggan baru dianalisa oleh model yang dibuat dan mengeluarkan nomor klaster atau segmen.

7 What’s Next?

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.