Pendahuluan

adalah proses penting yang diperlukan di bisnis untuk mengenal customer dengan lebih baik. Dengan demikian proses bisnis di marketing (pemasaran) dan CRM (customer relationship management) bisa dilakukan lebih tajam. Contoh: pesan marketing bisa lebih personal untuk setiap segment dengan biaya lebih optimal. Sehingga performa bisnis berpotensi tinggi menjadi lebih baik juga. Untuk menemukan segmentasi yang baik, perlu proses analisa data dari profile customer yang cukup banyak dan rutin. Ini bisa dibantu dengan algoritma komputer. # Library

library(ggplot2)

Persiapan Data Set

Dataset yang kita gunakan saat ini adalah data customer yang bisa di di https://academy.dqlab.id/dataset/customer_segments.txt dengan menggunnakan perintah read.csv(dataset)

pelanggan <- read.csv("https://academy.dqlab.id/dataset/customer_segments.txt", sep="\t")
pelanggan
##    Customer_ID        Nama.Pelanggan Jenis.Kelamin Umur          Profesi
## 1     CUST-001          Budi Anggara          Pria   58       Wiraswasta
## 2     CUST-002      Shirley Ratuwati        Wanita   14          Pelajar
## 3     CUST-003          Agus Cahyono          Pria   48     Professional
## 4     CUST-004      Antonius Winarta          Pria   53     Professional
## 5     CUST-005   Ibu Sri Wahyuni, IR        Wanita   41       Wiraswasta
## 6     CUST-006       Rosalina Kurnia        Wanita   24     Professional
## 7     CUST-007         Cahyono, Agus          Pria   64       Wiraswasta
## 8     CUST-008        Danang Santosa          Pria   52     Professional
## 9     CUST-009 Elisabeth Suryadinata        Wanita   29     Professional
## 10    CUST-010        Mario Setiawan          Pria   33     Professional
## 11    CUST-011        Maria Suryawan        Wanita   50     Professional
## 12    CUST-012       Erliana Widjaja        Wanita   49     Professional
## 13    CUST-013          Cahaya Putri        Wanita   64       Wiraswasta
## 14    CUST-014        Mario Setiawan          Pria   60       Wiraswasta
## 15    CUST-015      Shirley Ratuwati        Wanita   20       Wiraswasta
## 16    CUST-016          Bambang Rudi          Pria   35     Professional
## 17    CUST-017             Yuni Sari        Wanita   32 Ibu Rumah Tangga
## 18    CUST-018           Nelly Halim        Wanita   63 Ibu Rumah Tangga
## 19    CUST-019          Mega Pranoto        Wanita   32       Wiraswasta
## 20    CUST-020        Irene Novianto        Wanita   16          Pelajar
## 21    CUST-021      Lestari Fabianto        Wanita   38       Wiraswasta
## 22    CUST-022          Novita Purba        Wanita   52     Professional
## 23    CUST-023       Denny Amiruddin          Pria   34     Professional
## 24    CUST-024         Putri Ginting        Wanita   39       Wiraswasta
## 25    CUST-025        Julia Setiawan        Wanita   29       Wiraswasta
## 26    CUST-026     Christine Winarto        Wanita   55     Professional
## 27    CUST-027         Grace Mulyati        Wanita   35       Wiraswasta
## 28    CUST-028         Adeline Huang        Wanita   40 Ibu Rumah Tangga
## 29    CUST-029          Tia Hartanti        Wanita   56     Professional
## 30    CUST-030        Rosita Saragih        Wanita   46 Ibu Rumah Tangga
## 31    CUST-031         Eviana Handry        Wanita   19        Mahasiswa
## 32    CUST-032       Chintya Winarni        Wanita   47       Wiraswasta
## 33    CUST-033       Cecilia Kusnadi        Wanita   19        Mahasiswa
## 34    CUST-034        Deasy Arisandi        Wanita   21       Wiraswasta
## 35    CUST-035               Ida Ayu        Wanita   39     Professional
## 36    CUST-036        Ni Made Suasti        Wanita   30       Wiraswasta
## 37    CUST-037      Felicia Tandiono        Wanita   25     Professional
## 38    CUST-038          Agatha Salim        Wanita   46       Wiraswasta
## 39    CUST-039          Gina Hidayat        Wanita   20     Professional
## 40    CUST-040        Irene Darmawan        Wanita   14          Pelajar
## 41    CUST-041      Shinta Aritonang        Wanita   24 Ibu Rumah Tangga
## 42    CUST-042          Yuliana Wati        Wanita   26       Wiraswasta
## 43    CUST-043          Yenna Sumadi        Wanita   31     Professional
## 44    CUST-044                  Anna        Wanita   18       Wiraswasta
## 45    CUST-045        Rismawati Juni        Wanita   22     Professional
## 46    CUST-046          Elfira Surya        Wanita   25       Wiraswasta
## 47    CUST-047           Mira Kurnia        Wanita   55 Ibu Rumah Tangga
## 48    CUST-048      Maria Hutagalung        Wanita   45       Wiraswasta
## 49    CUST-049       Josephine Wahab        Wanita   33 Ibu Rumah Tangga
## 50    CUST-050        Lianna Nugraha        Wanita   55       Wiraswasta
##    Tipe.Residen NilaiBelanjaSetahun
## 1        Sector             9497927
## 2       Cluster             2722700
## 3       Cluster             5286429
## 4       Cluster             5204498
## 5       Cluster            10615206
## 6       Cluster             5215541
## 7        Sector             9837260
## 8       Cluster             5223569
## 9        Sector             5993218
## 10      Cluster             5257448
## 11       Sector             5987367
## 12       Sector             5941914
## 13      Cluster             9333168
## 14      Cluster             9471615
## 15      Cluster            10365668
## 16      Cluster             5262521
## 17      Cluster             5677762
## 18      Cluster             5340690
## 19      Cluster            10884508
## 20       Sector             2896845
## 21      Cluster             9222070
## 22      Cluster             5298157
## 23      Cluster             5239290
## 24      Cluster            10259572
## 25       Sector            10721998
## 26      Cluster             5269392
## 27      Cluster             9114159
## 28      Cluster             6631680
## 29      Cluster             5271845
## 30       Sector             5020976
## 31      Cluster             3042773
## 32       Sector            10663179
## 33      Cluster             3047926
## 34       Sector             9759822
## 35       Sector             5962575
## 36      Cluster             9678994
## 37       Sector             5972787
## 38       Sector            10477127
## 39      Cluster             5257775
## 40       Sector             2861855
## 41      Cluster             6820976
## 42      Cluster             9880607
## 43      Cluster             5268410
## 44      Cluster             9339737
## 45      Cluster             5211041
## 46       Sector            10099807
## 47      Cluster             6130724
## 48       Sector            10390732
## 49       Sector             4992585
## 50       Sector            10569316

Data tersebut memiliki tujuh kolom dengan penjelasan sebagai berikut: • Customer ID: Kode pelanggan dengan format campuran teks CUST- diikuti angka • Nama Pelanggan: Nama dari pelanggan dengan format teks tentunya • Jenis Kelamin: Jenis kelamin dari pelanggan, hanya terdapat dua isi data kategori yaitu Pria dan Wanita • Umur: Umur dari pelanggan dalam format angka • Profesi: Profesi dari pelanggan, juga bertipe teks kategori yang terdiri dari Wiraswasta, Pelajar, Professional, Ibu Rumah Tangga, dan Mahasiswa. • Tipe Residen: Tipe tempat tinggal dari pelanggan kita, untuk dataset ini hanya ada dua kategori: Cluster dan Sector. • NilaiBelanjaSetahun: Merupakan Terlihat kalau ada kolom yang berisi angka saja, yaitu Umur dan NilaiBelanjaSetahun. Sisanya diisi data kategori untuku kolom “Jenis Kelamin”, “Profesi” dan “Tipe Residen”. Sedangkan “Customer ID” dan “Nama Pelanggan” kita anggap memiliki nilai yang unik untuk tiap baris data dan mewakili tiap individu. Karena kolom “Customer ID” dan “Nama Pelanggan” karena unik maka tidak akan dijadikan variable penentu segmentasi yang kita lakukan, namun sisa kolom lainnya akan digunakan.

Konversi Data dengan data.matrix

Seperti diketahui, isi data dari tiga kolom pelanggan 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.

pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin","Profesi","Tipe.Residen")])
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
##  [7,]             1       5            2
##  [8,]             1       4            1
##  [9,]             2       4            2
## [10,]             1       4            1
## [11,]             2       4            2
## [12,]             2       4            2
## [13,]             2       5            1
## [14,]             1       5            1
## [15,]             2       5            1
## [16,]             1       4            1
## [17,]             2       1            1
## [18,]             2       1            1
## [19,]             2       5            1
## [20,]             2       3            2
## [21,]             2       5            1
## [22,]             2       4            1
## [23,]             1       4            1
## [24,]             2       5            1
## [25,]             2       5            2
## [26,]             2       4            1
## [27,]             2       5            1
## [28,]             2       1            1
## [29,]             2       4            1
## [30,]             2       1            2
## [31,]             2       2            1
## [32,]             2       5            2
## [33,]             2       2            1
## [34,]             2       5            2
## [35,]             2       4            2
## [36,]             2       5            1
## [37,]             2       4            2
## [38,]             2       5            2
## [39,]             2       4            1
## [40,]             2       3            2
## [41,]             2       1            1
## [42,]             2       5            1
## [43,]             2       4            1
## [44,]             2       5            1
## [45,]             2       4            1
## [46,]             2       5            2
## [47,]             2       1            1
## [48,]             2       5            2
## [49,]             2       1            2
## [50,]             2       5            2

Menggabungkan Hasil Konversi

Setelah melakukan konversi ke angka, data hasil konversi perlu di gabunglan kembali ke variabel asal, Ini berguna terutam apada praktek lanjutan, yaitu ketika kita akan mengenali data pelanggan baru masuk ke segment mana. Untuk menggabungkan data hasil konversi data.matrix ke pelanggan, kita gunakan funtion data.frame.

pelanggan <- data.frame(pelanggan, pelanggan_matrix)
pelanggan
##    Customer_ID        Nama.Pelanggan Jenis.Kelamin Umur          Profesi
## 1     CUST-001          Budi Anggara          Pria   58       Wiraswasta
## 2     CUST-002      Shirley Ratuwati        Wanita   14          Pelajar
## 3     CUST-003          Agus Cahyono          Pria   48     Professional
## 4     CUST-004      Antonius Winarta          Pria   53     Professional
## 5     CUST-005   Ibu Sri Wahyuni, IR        Wanita   41       Wiraswasta
## 6     CUST-006       Rosalina Kurnia        Wanita   24     Professional
## 7     CUST-007         Cahyono, Agus          Pria   64       Wiraswasta
## 8     CUST-008        Danang Santosa          Pria   52     Professional
## 9     CUST-009 Elisabeth Suryadinata        Wanita   29     Professional
## 10    CUST-010        Mario Setiawan          Pria   33     Professional
## 11    CUST-011        Maria Suryawan        Wanita   50     Professional
## 12    CUST-012       Erliana Widjaja        Wanita   49     Professional
## 13    CUST-013          Cahaya Putri        Wanita   64       Wiraswasta
## 14    CUST-014        Mario Setiawan          Pria   60       Wiraswasta
## 15    CUST-015      Shirley Ratuwati        Wanita   20       Wiraswasta
## 16    CUST-016          Bambang Rudi          Pria   35     Professional
## 17    CUST-017             Yuni Sari        Wanita   32 Ibu Rumah Tangga
## 18    CUST-018           Nelly Halim        Wanita   63 Ibu Rumah Tangga
## 19    CUST-019          Mega Pranoto        Wanita   32       Wiraswasta
## 20    CUST-020        Irene Novianto        Wanita   16          Pelajar
## 21    CUST-021      Lestari Fabianto        Wanita   38       Wiraswasta
## 22    CUST-022          Novita Purba        Wanita   52     Professional
## 23    CUST-023       Denny Amiruddin          Pria   34     Professional
## 24    CUST-024         Putri Ginting        Wanita   39       Wiraswasta
## 25    CUST-025        Julia Setiawan        Wanita   29       Wiraswasta
## 26    CUST-026     Christine Winarto        Wanita   55     Professional
## 27    CUST-027         Grace Mulyati        Wanita   35       Wiraswasta
## 28    CUST-028         Adeline Huang        Wanita   40 Ibu Rumah Tangga
## 29    CUST-029          Tia Hartanti        Wanita   56     Professional
## 30    CUST-030        Rosita Saragih        Wanita   46 Ibu Rumah Tangga
## 31    CUST-031         Eviana Handry        Wanita   19        Mahasiswa
## 32    CUST-032       Chintya Winarni        Wanita   47       Wiraswasta
## 33    CUST-033       Cecilia Kusnadi        Wanita   19        Mahasiswa
## 34    CUST-034        Deasy Arisandi        Wanita   21       Wiraswasta
## 35    CUST-035               Ida Ayu        Wanita   39     Professional
## 36    CUST-036        Ni Made Suasti        Wanita   30       Wiraswasta
## 37    CUST-037      Felicia Tandiono        Wanita   25     Professional
## 38    CUST-038          Agatha Salim        Wanita   46       Wiraswasta
## 39    CUST-039          Gina Hidayat        Wanita   20     Professional
## 40    CUST-040        Irene Darmawan        Wanita   14          Pelajar
## 41    CUST-041      Shinta Aritonang        Wanita   24 Ibu Rumah Tangga
## 42    CUST-042          Yuliana Wati        Wanita   26       Wiraswasta
## 43    CUST-043          Yenna Sumadi        Wanita   31     Professional
## 44    CUST-044                  Anna        Wanita   18       Wiraswasta
## 45    CUST-045        Rismawati Juni        Wanita   22     Professional
## 46    CUST-046          Elfira Surya        Wanita   25       Wiraswasta
## 47    CUST-047           Mira Kurnia        Wanita   55 Ibu Rumah Tangga
## 48    CUST-048      Maria Hutagalung        Wanita   45       Wiraswasta
## 49    CUST-049       Josephine Wahab        Wanita   33 Ibu Rumah Tangga
## 50    CUST-050        Lianna Nugraha        Wanita   55       Wiraswasta
##    Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
## 1        Sector             9497927               1         5              2
## 2       Cluster             2722700               2         3              1
## 3       Cluster             5286429               1         4              1
## 4       Cluster             5204498               1         4              1
## 5       Cluster            10615206               2         5              1
## 6       Cluster             5215541               2         4              1
## 7        Sector             9837260               1         5              2
## 8       Cluster             5223569               1         4              1
## 9        Sector             5993218               2         4              2
## 10      Cluster             5257448               1         4              1
## 11       Sector             5987367               2         4              2
## 12       Sector             5941914               2         4              2
## 13      Cluster             9333168               2         5              1
## 14      Cluster             9471615               1         5              1
## 15      Cluster            10365668               2         5              1
## 16      Cluster             5262521               1         4              1
## 17      Cluster             5677762               2         1              1
## 18      Cluster             5340690               2         1              1
## 19      Cluster            10884508               2         5              1
## 20       Sector             2896845               2         3              2
## 21      Cluster             9222070               2         5              1
## 22      Cluster             5298157               2         4              1
## 23      Cluster             5239290               1         4              1
## 24      Cluster            10259572               2         5              1
## 25       Sector            10721998               2         5              2
## 26      Cluster             5269392               2         4              1
## 27      Cluster             9114159               2         5              1
## 28      Cluster             6631680               2         1              1
## 29      Cluster             5271845               2         4              1
## 30       Sector             5020976               2         1              2
## 31      Cluster             3042773               2         2              1
## 32       Sector            10663179               2         5              2
## 33      Cluster             3047926               2         2              1
## 34       Sector             9759822               2         5              2
## 35       Sector             5962575               2         4              2
## 36      Cluster             9678994               2         5              1
## 37       Sector             5972787               2         4              2
## 38       Sector            10477127               2         5              2
## 39      Cluster             5257775               2         4              1
## 40       Sector             2861855               2         3              2
## 41      Cluster             6820976               2         1              1
## 42      Cluster             9880607               2         5              1
## 43      Cluster             5268410               2         4              1
## 44      Cluster             9339737               2         5              1
## 45      Cluster             5211041               2         4              1
## 46       Sector            10099807               2         5              2
## 47      Cluster             6130724               2         1              1
## 48       Sector            10390732               2         5              2
## 49       Sector             4992585               2         1              2
## 50       Sector            10569316               2         5              2

Menormalisasikan Nilai Belanja

Kali ini kita perhatikan kolom “NilaiBelanjaSetahun” isi datanya bernilai jutaan. Ketika kolom ini digunakan untuk clustering, perhitungan sum of squared errors (pada bab kmeans) akan menjadi sangat besar. Kita akan 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 kita, cukup dengan pembagian sehingga nilai jutaan menjadi puluhan.

pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
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

Membuat Master Data

Setelah penggabungan data, kita jadi mengetahui sebenarnya teks kategori dikonversi menjadi angka numerik berapa, misalnya Wiraswasta dikonversi menjadi angka 5, Pelajar menjadi angka 3, Professional menjadi angka 4, dan Ibu Rumah Tangga menjadi angka 1 Daftar data kategori dan hasil konversinya sangat penting untuk dijadikan referensi sehingga nanti ketika ada data baru, kita bisa “petakan” menjadi data numerik yang siap digunakan untuk algoritma clustering.untuk melihat data data kategori ketika dikoversi menjadi numerik, data kategori tersebut diwakili oleh angka berapa dapat menggunakan fungsi unique

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")])
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

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. 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 ## Fungsi K-Means Function kmeans memerlukan minimal 2 parameter, yaitu: • x: data yang digunakan, dimana semua isi datanya harus berupa numerik. • centers: jumlah cluster yang diinginkan. Dan fungsi kmeans ini biasanya disertai dengan pemanggilan function seet.seed. Ini berguna agar kita “menyeragamkan” daftar nilai acak yang sama dari kmeans sehingga kita mendapatkan output yang sama.Kadang kala parameter data dan jumlah segmen saja tidak cukup. Perlu digunakan parameter ketiga yaitu nstart, merupakan jumlah kombinasi acak yang dihasilkan secara internal oleh R. Dan dalam jumlah yang kita berikan, algoritma akan memilih mana yang terbaik dari kombinasi-kombinasi tersebut.

set.seed(100)
segmentasi <- kmeans(x=pelanggan[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], centers = 5, nstart = 25)
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"

Analisa Hasil Clustering Vector

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

pelanggan$cluster <- segmentasi$cluster
pelanggan$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

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

Analisa Hasil Cluster Size

K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10 ini artinya k-means membagi data menjadi 5 cluster dengan pembagian: • Cluster ke-1 memiliki 5 data • Cluster ke-2 memiliki 12 data • Cluster ke-3 memiliki 14 data • Cluster ke-4 memiliki 9 data • Cluster ke-5 memiliki 10 data dengan total 50 data yang merupakan total keseluruhan data pelanggan

Filter Cluster 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 14 5 data dengan mayoritas jenis kelamin pria dan umur 58 s/d 63 dengan pekerjaan hanya satu yang berprofesi sebagai ibu rumah tangga dan 4 lainnya sebagai wiraswasta dan tipe residen mayoritas cluster

Analisa Hasil Cluster Means

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

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

Apa artinya hasil tersebut? • Kolom pertama yang berisi angka 1 sampai dengan 5 adalah mewakili nomor cluster. • Kolom Kelamin.1 menunjukkan nilai rata-rata dari data jenis kelamin yang telah dikonversi menjadi numerik, dengan angka 1 mewakili Pria dan angka 2 mewakili wanita.Pada cluster 1 terlihat bahwa hanya ada angka 2, artinya cluster 1 hanya berisi data dengan profil berjenis kelamin wanita. Nah, untuk cluster ke-2 berupa angka 1.40 artinya data bersifat campuran namun cenderung ke Pria (1). • Kolom Umur adalah representasi dari dataset awal tanpa mengalami konversi. Terlihat untuk cluster ke-1 umur rata-rata adalah 61.8 artinya campuran tapi cenderung 62 tahun, umur 31.58 tahun untuk cluster ke-2, dan seterusnya. • Kolom Profesi.1 menunjukkan nilai rata-rata data Profesi untuk tiap cluster yang telah dikonversi menjadi numerik, angka 1, 2, 3, 4 dan 5 masing-masing mewakili Wiraswasta, Pelajar, Professional, Ibu Rumah Tangga dan Mahasiswa.Terlihat untuk seluruh cluster, profesi cenderung ke Professional terutama untuk cluster ke-4. • Kolom Tipe.Residen.1 menunjukkan representasi data Tipe.Residen yang telah dikonversi menjadi numerik dengan angka 1 mewakili Cluster dan 2 mewakili Sector. Ini juga didapatkan dari hasil konversi data menjadi numerik pada praktek sebelumnya.terlihat untuk seluruh cluster, terlihat data cukup tersebar antara Sector dan Cluster terutama untuk cluster ke-4 dimana nilai kolom ini di angka 1.555. • Terakhir, kolom NilaiBelanjaSetahun cukup signifikan pembagiannya untuk tiap cluster. Dimana cluster ke-2 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan ketiga cluster lainnya.

Analisa Hasul Sum of Squares

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

Total Sum of Squares per cluster

segmentasi$withinss
## [1]  58.21123 174.85164 316.73367 171.67372 108.49735

Nilai 58.21123 adalah SS untuk cluster ke-1, 174.85164 adalah SS untuk cluste ke-2, dan seterusnya. Semakin kecil nilainya berpotensi semakin baik.

Total Sum of Squares (SS) untuk seluruh titik data

segmentasi$totss
## [1] 10990.97

total_SS: adalah SS untuk seluruh titik terhadap nilai rata-rata global, bukan untuk per cluster. Nilai ini selalu tetap dan tidak terpengaruh dengan jumlah cluster.

Perbedaan nilai antara totss dan tot.withinss

segmentasi$betweenss
## [1] 10161.01

between_SS: adalah total_SS dikurangi dengan jumlah nilai SS seluruh cluster

Rasio antara antara between_ss/total_ss

segmentasi$betweenss/segmentasi$totss
## [1] 0.9244864

hasilnya 0.9244864 atau 92.4 %, semakin besar nilai presentasenya maka semakin baik

Menentukan jumlah Cluster Terbaik

dari proses diatas kita menggunakan 5 cluster sebagai asumsi awal dan mendaptakan nilai 92.4 % yang menunjukan model dengan 5 cluster cukup baik lalu bagaimana dengan jumlah cluster yang lain?, Dari informasi yang dihasilkan oleh function kmeans, metrick Sum of Squares (SS) atau sering disebut Sum of Squared Errors (SSE) sangat penting untuk dijadikan dasar kita menentukan jumlah cluster yang paling optimal. Secara teoritis, berikut adalah beberapa hal yang bisa kita amati 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.

Simulasi jumlah Cluster dan 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 cluster, dan disimpan dalam bentuk vector di R. Untuk keperluan ini, kita akan gunakan sapply. Function sapply akan digunakan untuk memanggil function kmeans untuk suatu range jumlah cluster. Range ini akan kita gunakan 1 sampai dengan 10.

field_digunakan <- c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")
sse <- sapply(1:10, 
              function(param_k){
                kmeans(pelanggan[field_digunakan], param_k, nstart = 25)$tot.withinss
              }
              )
jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:10),sse)
ggplot(ssdata,aes(x=cluster, y=sse))+geom_line(color="red")+geom_point()+
ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
                geom_text(aes(label=format(round(sse, 2), nsmall = 2)),hjust=-0.2, vjust=-0.5) +
  scale_x_discrete(limits=c(1:jumlah_cluster_max))
## Warning: Continuous limits supplied to discrete scale.
## Did you mean `limits = factor(...)` or `scale_*_continuous()`?

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 kita mengambil titik sikunya. Pada contoh di atas kita bisa mengambil 4 atau 5.

Memaketkan Hasil Referensi

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 cluster dengan karakteristik yang lebih mudah dimengerti. Penamaan ini kita simpan dalam variable Segmen.Pelanggan. • Menggabungkan variable Segmen. Pelanggan, Profesi, Jenis.Kelamin, Tipe.Residen, dan Segmentasi ke dalam satu objek bertipe list ke dalam variable Identitas.Cluster. • Menyimpan objek Identitas.Cluster dalam bentuk file sehingga dapat digunakan kemudian, ini bisa disebut model bagi kita

Menamakan Segmen

Pada praktek kali ini kita akan menamakan segmen sesuai dengan karakteristiknya. • 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.

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"))
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

Mengabungkan Referensi

Sejauh ini kita telah mempelajari pembentukan aset-aset data sebagai berikut: • 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 variable 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 cluster sesuai analisa karakteristik dari centroid kolom-kolom pelanggan yang digunakan. • Vector dari field yang digunakan. Akan sangat baik jika semuanya digabungkan di satu variable dengan tipe list, dan ini akan jadi model kita yang dapat disimpan ke dalam file dan digunakan ketika diperlukan. Pada tugas berikut, kita akan namakan list ini dengan Identitas.Cluster.

identitas.cluster <- list(Profesi=profesi, Jenis.Kelamin=Jenis.Kelamin, Tipe.Residen=Tipe.Residen, Segmentasi=segmentasi, Segmen.Pelanggan=segmen.pelanggan, field_digunakan=field_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_digunakan
## [1] "Jenis.Kelamin.1"     "Umur"                "Profesi.1"          
## [4] "Tipe.Residen.1"      "NilaiBelanjaSetahun"

Menyimpan Objek dalam Bentuk File

Objek yang sudah digabungkan pada praktek sebelumnya sudah memiliki semua aset yang diperlukan untuk mengalokasikan data baru ke segmen yang sesuai. Untuk menyimpan objek ini ke dalam file kita gunakan function saveRDS. File ini kemudian dapat dibuka kembali sebagai objek ke depannya. Sebagai contoh, perintah untuk menyimpan objek Identitas.Cluster ke file cluster.rds

saveRDS(identitas.cluster,"cluster1.rds")

Mengoprasionalkan Model K-Means

Apa yang dimaksud dengan mengoperasionalkan seperti judul pada bab ini? Ini artinya objek hasil pengolahan algoritma K-Means dan variable-variable terkait yang kita hasilkan sebelumnya harus dapat digunakan ke kasus riil sehingga satu siklus lengkap terjadi. Kasus riil untuk clustering kita 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.

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. Pada praktek kali ini, kita akan membuat data.frame dengan satu data dimana nama-nama kolomnya persis dengan dataset awal.

data.baru <- data.frame(Costumer.id="CUST-100", Nama.Pelanggan="Rudi Wilmar", Umur=20, Jenis.Kelamin="Wanita",Profesi="Pelajar",Tipe.Residen="Cluster",NilaiBelanjaSetahun=3.5)
data.baru
##   Costumer.id Nama.Pelanggan Umur Jenis.Kelamin Profesi Tipe.Residen
## 1    CUST-100    Rudi Wilmar   20        Wanita Pelajar      Cluster
##   NilaiBelanjaSetahun
## 1                 3.5

Memuat Objek Clustering dari File

Praktek kali ini adalah membuka file yang telah kita simpan sebelumnya dengan perintah dan dikenali di R sebagai objek yang akan kita gunakan untuk mengolah data baru. Untuk membuka file tersebut, kita gunakan function readRDS.

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_digunakan
## [1] "Jenis.Kelamin.1"     "Umur"                "Profesi.1"          
## [4] "Tipe.Residen.1"      "NilaiBelanjaSetahun"

Merge dengan data Referensi

Dengan adanya data baru dan objek yang berisi data referensi telah dibaca kembali, kita bisa menggabungkan data baru ini untuk mendapatkan konversi numerik dari field Jenis.Kelamin, Profesi dan Tipe.Residen. Tujuannya adalah kita akan bisa mencari segmen pelanggannya dengan data numerik hasil penggabungan. Cara menggabungkannya adalah dengan menggunakan function merge, dimana kedua data akan digabungkan dengan mencari persamaan nama kolom dan isinya. Sebagai contoh, perintah berikut akan menggabungkan variable databaru dengan variable Identitas.Cluster$Profesi.

data.baru <- merge(data.baru, identitas.cluster$Profesi)
data.baru <- merge(data.baru, identitas.cluster$Jenis.Kelamin)
data.baru <- merge(data.baru, identitas.cluster$Tipe.Residen)
data.baruIdentitas.Cluster <- readRDS(file="cluster.rds")
data.baru <- merge(data.baru, identitas.cluster$Profesi)
data.baru
##   Profesi Profesi.1 Tipe.Residen Jenis.Kelamin Costumer.id Nama.Pelanggan Umur
## 1 Pelajar         3      Cluster        Wanita    CUST-100    Rudi Wilmar   20
##   NilaiBelanjaSetahun Jenis.Kelamin.1 Tipe.Residen.1
## 1                 3.5               2              1

• Variable databaru dengan Identitas.Cluster$Profesi memiliki nama kolom yang sama, yaitu Profesi. • Kolom Profesi kemudian akan dijadikan “kunci” untuk menggabungkan kedua variable 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.

Menentukan Cluster

dengan tahapan berikut: • mencari jarak kuadrat minimum atau terdekat • dari kolom numerik data baru tersebut • ke centroid kolom terkait • dari seluruh cluster yang ada Kalau kita terjemahkan jadi rumus sebagai berikut: which.min(sapply( 1:5, function( x ) sum( ( data[kolom] - objekkmeans\(centers[x,])^2 ) )) dimana: • min: merupakan function untuk mencari nilai minimum • 1:5 : adalah range nomor cluster dari 1 sampai dengan 5 (atau lebih sesuai dengan ukuran cluster) • 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 • (data[kolom] – objekkmeans\)centers[x,]) ^2: adalah jarak kuadrat data. Ingat centers adalah komponen dari objek kmeans. • sum: digunakan untuk menjumlahkan jarak kuadrat

which.min(sapply( 1:5, function( x ) sum( ( data.baru[identitas.cluster$field_digunakan] - identitas.cluster$Segmentasi$centers[x,])^2 ) ))
## [1] 3
                identitas.cluster$Segmen.Pelanggan[which.min(sapply( 1:5, function( x ) sum( ( data.baru[identitas.cluster$field_digunakan] - identitas.cluster$Segmentasi$centers[x,])^2 ) )),]
##   cluster             Nama.Segmen
## 3       3 Gold Young Professional