email             :
ntraktir          : https://trakteer.id/contekansial
nyawer          : https://saweria.co/contekansial
github            : https://bit.ly/origin-AL-GitHub
youtube         : https://bit.ly/origin-AL-youtube



1 Customer Segmentation

1.1 Pengantar

Customer Segmentation adalah proses penting yang diperlukan di bisnis untuk mengenal customer dengan lebih baik. Dengan demikian proses bisnis di pemasaran (marketing) 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 profil customer yang cukup banyak dan rutin. Ini bisa dibantu dengan algoritma komputer.

Pembelajaran ini dirancang dengan menggunakan dataset dari kasus skenario nyata di Indonesia. Dataset yang digunakan cukup kecil dengan tujuan kamu dapat lebih mudah memahami dataset ini dan mampu beradaptasi ketika dihadapkan dataset yang lebih kompleks.

Apa yang akan kamu pelajari :

  • Apa dan kenapa Customer Segmentation dalam penggunaan di bisnis?
  • Aplikasi Customer Segmentation secara teknis dengan Algoritma K-Means di R
  • Bagaimana mempersiapkan data profil pelanggan di R agar dapat digunakan oleh Algoritma K-Means
  • Mempaketkan algoritma sebagai model dan mengoperasionalkannya sehingga dapat digunakan sehari-hari oleh bisnis

2 Persiapan Data

2.1 Pengantar

Persiapan data adalah langkah pertama yang kita lakukan sebelum menggunakan algoritma apapun untuk melakukan analisa data. Ini dikarenakan tiap implementasi algoritma menuntut struktur dan tipe data yang berbeda.

Dalam kasus algoritma K-Means yang akan kita gunakan untuk otomatisasi clustering, maka struktur datanya adalah data.frame atau matrix 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. Hal ini perlu dikonversi dulu ke numerik, namun jika diperlukan tetap bisa kembali mengambil data teks.

Nah, untuk lebih jelasnya. Kita akan lakukan langkah-langkah praktek yang akan kita lakukan berikut ini adalah 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 data.matrix
  5. Menggabungkan hasil konversi
  6. Menormalisasikan nilai belanja
  7. Membuat data master

2.2 Dataset Customer Segments

Dataset yang kita gunakan adalah data customer. 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 nilai belanja dalam satu tahun dalam format angka

Nah dengan contoh dataset inilah, kita akan mencoba mencari jumlah segmentasi yang paling optimal dimana antar tiap data pelanggan dalam segmen memiliki kemiripan tinggi.

2.3 Membaca Data dengan Fungsi read.csv

Langkah pertama yang perlu kita lakukan adalah membaca dataset tersebut dari file teks menjadi data.frame di R dengan perintah read.csv().

Begini :

#membuat variabel dataset
AL.Pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t")

#menampilkan data
AL.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

Terlihat kalau ada kolom yang berisi angka saja, yaitu Umur dan NilaiBelanjaSetahun. Sisanya diisi data kategori untuk 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.

Perhatikan jika nama kolom asal terdapat karakter spasi, akan diubah menjadi tanda titik setelah dibaca dengan read.csv(). Sebagai contoh, Nama Pelanggan diubah menjadi Nama.Pelanggan.

Jika kita hanya ingin menampilkan beberapa kolom tertentu, maka perintahnya adalah sebagai berikut:

variabel_dataset[c("nama.kolom1", "nama.kolom2", dst)]

Misalkan kita coba akan menampilkan kolom Nama.Pelanggan dan Profesi.

Begini :

AL.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
7          Cahyono, Agus       Wiraswasta
8         Danang Santosa     Professional
9  Elisabeth Suryadinata     Professional
10        Mario Setiawan     Professional
11        Maria Suryawan     Professional
12       Erliana Widjaja     Professional
13          Cahaya Putri       Wiraswasta
14        Mario Setiawan       Wiraswasta
15      Shirley Ratuwati       Wiraswasta
16          Bambang Rudi     Professional
17             Yuni Sari Ibu Rumah Tangga
18           Nelly Halim Ibu Rumah Tangga
19          Mega Pranoto       Wiraswasta
20        Irene Novianto          Pelajar
21      Lestari Fabianto       Wiraswasta
22          Novita Purba     Professional
23       Denny Amiruddin     Professional
24         Putri Ginting       Wiraswasta
25        Julia Setiawan       Wiraswasta
26     Christine Winarto     Professional
27         Grace Mulyati       Wiraswasta
28         Adeline Huang Ibu Rumah Tangga
29          Tia Hartanti     Professional
30        Rosita Saragih Ibu Rumah Tangga
31         Eviana Handry        Mahasiswa
32       Chintya Winarni       Wiraswasta
33       Cecilia Kusnadi        Mahasiswa
34        Deasy Arisandi       Wiraswasta
35               Ida Ayu     Professional
36        Ni Made Suasti       Wiraswasta
37      Felicia Tandiono     Professional
38          Agatha Salim       Wiraswasta
39          Gina Hidayat     Professional
40        Irene Darmawan          Pelajar
41      Shinta Aritonang Ibu Rumah Tangga
42          Yuliana Wati       Wiraswasta
43          Yenna Sumadi     Professional
44                  Anna       Wiraswasta
45        Rismawati Juni     Professional
46          Elfira Surya       Wiraswasta
47           Mira Kurnia Ibu Rumah Tangga
48      Maria Hutagalung       Wiraswasta
49       Josephine Wahab Ibu Rumah Tangga
50        Lianna Nugraha       Wiraswasta

2.4 Vector untuk Menyiapkan Nama Field

Perhatikan jika nama-nama field yang telah kita gunakan sebelumnya adalah sebuah vector.

c("Nama.Pelanggan", "Profesi")

Ini bisa dimasukkan ke dalam variable, dengan tujuan dapat digunakan berulang kali dalam script R.

Cobalah kamu buat variabel vektor kolom.digunakan dan diisi dengan Jenis.Kelamin, Umur dan Profesi. Kemudian tampilkan isi variabel AL.Pelanggan dengan kolom.digunakan.

Begini :

#Membaca data csv dan dimasukkan ke variable AL.Pelanggan
AL.Pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt",sep="\t")

#Membuat variabel kolom.digunakan dengan isi berupa vektor "Jenis.Kelamin", "Umur" dan "Profesi"
kolom.digunakan <- c("Jenis.Kelamin", "Umur", "Profesi")

#Menampilan data AL.Pelanggan dengan nama kolom sesuai isi vektor kolom.digunakan
AL.Pelanggan[kolom.digunakan]
   Jenis.Kelamin Umur          Profesi
1           Pria   58       Wiraswasta
2         Wanita   14          Pelajar
3           Pria   48     Professional
4           Pria   53     Professional
5         Wanita   41       Wiraswasta
6         Wanita   24     Professional
7           Pria   64       Wiraswasta
8           Pria   52     Professional
9         Wanita   29     Professional
10          Pria   33     Professional
11        Wanita   50     Professional
12        Wanita   49     Professional
13        Wanita   64       Wiraswasta
14          Pria   60       Wiraswasta
15        Wanita   20       Wiraswasta
16          Pria   35     Professional
17        Wanita   32 Ibu Rumah Tangga
18        Wanita   63 Ibu Rumah Tangga
19        Wanita   32       Wiraswasta
20        Wanita   16          Pelajar
21        Wanita   38       Wiraswasta
22        Wanita   52     Professional
23          Pria   34     Professional
24        Wanita   39       Wiraswasta
25        Wanita   29       Wiraswasta
26        Wanita   55     Professional
27        Wanita   35       Wiraswasta
28        Wanita   40 Ibu Rumah Tangga
29        Wanita   56     Professional
30        Wanita   46 Ibu Rumah Tangga
31        Wanita   19        Mahasiswa
32        Wanita   47       Wiraswasta
33        Wanita   19        Mahasiswa
34        Wanita   21       Wiraswasta
35        Wanita   39     Professional
36        Wanita   30       Wiraswasta
37        Wanita   25     Professional
38        Wanita   46       Wiraswasta
39        Wanita   20     Professional
40        Wanita   14          Pelajar
41        Wanita   24 Ibu Rumah Tangga
42        Wanita   26       Wiraswasta
43        Wanita   31     Professional
44        Wanita   18       Wiraswasta
45        Wanita   22     Professional
46        Wanita   25       Wiraswasta
47        Wanita   55 Ibu Rumah Tangga
48        Wanita   45       Wiraswasta
49        Wanita   33 Ibu Rumah Tangga
50        Wanita   55       Wiraswasta

2.5 Konversi Data dengan data.matrix

Seperti telah dijelaskan sebelumnya, isi data dari tiga kolom AL.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(). Perintahnya cukup sederhana, seperti terlihat pada contoh berikut:

data.matrix(variabel_dataset[c("nama.kolom1", "nama.kolom2")])

Buatlah variabel AL.Pelanggan.Matrix yang diisi dengan konversi teks menjadi numerik dari variabel AL.Pelanggan pada kolom Jenis.Kelamin, Profesi dan Tipe.Residen.

Begini :

#Membaca data csv dan dimasukkan ke variable AL.Pelanggan
AL.Pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt",sep="\t")

#membuat konversi data teks menjadi numerik
AL.Pelanggan.Matrix <- data.matrix(AL.Pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

#melihat gambaran konversi
AL <- AL.Pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")]
pelanggan <- data.frame(AL, AL.Pelanggan.Matrix)
pelanggan
   Jenis.Kelamin          Profesi Tipe.Residen Jenis.Kelamin.1 Profesi.1
1           Pria       Wiraswasta       Sector               1         5
2         Wanita          Pelajar      Cluster               2         3
3           Pria     Professional      Cluster               1         4
4           Pria     Professional      Cluster               1         4
5         Wanita       Wiraswasta      Cluster               2         5
6         Wanita     Professional      Cluster               2         4
7           Pria       Wiraswasta       Sector               1         5
8           Pria     Professional      Cluster               1         4
9         Wanita     Professional       Sector               2         4
10          Pria     Professional      Cluster               1         4
11        Wanita     Professional       Sector               2         4
12        Wanita     Professional       Sector               2         4
13        Wanita       Wiraswasta      Cluster               2         5
14          Pria       Wiraswasta      Cluster               1         5
15        Wanita       Wiraswasta      Cluster               2         5
16          Pria     Professional      Cluster               1         4
17        Wanita Ibu Rumah Tangga      Cluster               2         1
18        Wanita Ibu Rumah Tangga      Cluster               2         1
19        Wanita       Wiraswasta      Cluster               2         5
20        Wanita          Pelajar       Sector               2         3
21        Wanita       Wiraswasta      Cluster               2         5
22        Wanita     Professional      Cluster               2         4
23          Pria     Professional      Cluster               1         4
24        Wanita       Wiraswasta      Cluster               2         5
25        Wanita       Wiraswasta       Sector               2         5
26        Wanita     Professional      Cluster               2         4
27        Wanita       Wiraswasta      Cluster               2         5
28        Wanita Ibu Rumah Tangga      Cluster               2         1
29        Wanita     Professional      Cluster               2         4
30        Wanita Ibu Rumah Tangga       Sector               2         1
31        Wanita        Mahasiswa      Cluster               2         2
32        Wanita       Wiraswasta       Sector               2         5
33        Wanita        Mahasiswa      Cluster               2         2
34        Wanita       Wiraswasta       Sector               2         5
35        Wanita     Professional       Sector               2         4
36        Wanita       Wiraswasta      Cluster               2         5
37        Wanita     Professional       Sector               2         4
38        Wanita       Wiraswasta       Sector               2         5
39        Wanita     Professional      Cluster               2         4
40        Wanita          Pelajar       Sector               2         3
41        Wanita Ibu Rumah Tangga      Cluster               2         1
42        Wanita       Wiraswasta      Cluster               2         5
43        Wanita     Professional      Cluster               2         4
44        Wanita       Wiraswasta      Cluster               2         5
45        Wanita     Professional      Cluster               2         4
46        Wanita       Wiraswasta       Sector               2         5
47        Wanita Ibu Rumah Tangga      Cluster               2         1
48        Wanita       Wiraswasta       Sector               2         5
49        Wanita Ibu Rumah Tangga       Sector               2         1
50        Wanita       Wiraswasta       Sector               2         5
   Tipe.Residen.1
1               2
2               1
3               1
4               1
5               1
6               1
7               2
8               1
9               2
10              1
11              2
12              2
13              1
14              1
15              1
16              1
17              1
18              1
19              1
20              2
21              1
22              1
23              1
24              1
25              2
26              1
27              1
28              1
29              1
30              2
31              1
32              2
33              1
34              2
35              2
36              1
37              2
38              2
39              1
40              2
41              1
42              1
43              1
44              1
45              1
46              2
47              1
48              2
49              2
50              2

Terlihat, teks Pria diubah menjadi angka 1, Sector diubah menjadi angka 2, Pelajar diubah menjadi angka 3, dan seterusnya.

2.6 Menggabungkan Hasil Konversi

Setelah kamu bisa melakukan konversi ke angka, kita perlu mengetahui bagaimana menggabungkan kembali data tersebut ke variabel asal kita. Ini berguna terutam pada praktek lanjutan diakhir pembelajaran, yaitu ketika kita akan mengenali data pelanggan baru masuk ke segmen mana. Untuk menggabungkan data hasil konversi data.matrix() ke AL.Pelanggan, kita gunakan funtion data.frame().

Gabungkan variabel AL.Pelanggan dan AL.Pelanggan.Matrix dengan fungsi data.frame() dan masukkan kembali ke variable AL.Pelanggan.

Begini :

#Membaca data csv dan dimasukkan ke variable AL.Pelanggan
AL.Pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt",sep="\t")

#membuat konversi data teks menjadi numerik
AL.Pelanggan.Matrix <- data.matrix(AL.Pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])

#menggabungkan data
AL.Pelanggan <- data.frame(AL.Pelanggan, AL.Pelanggan.Matrix)

#menampilkan data hasil penggabungan
AL.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

Akhiran .1 ini ditambahkan karena di variabel AL.Pelanggan sudah ada nama kolom yang sama. Sebagai contoh kolom Jenis.Kelamin yang terdapat pada AL.Pelanggan.Matrix sudah ada juga di variabel AL.Pelanggan. Jadi ketika digabungkan, R akan menambahkan akhiran .1 untuk kolom Jenis.Kelamin yang terdapat di AL.Pelanggan.Matrix.

2.7 Menormalisasikan Nilai Belanja

Kali ini kita perhatikan kolom NilaiBelanjaSetahun, isi datanya bernilai jutaan. Ketika kolom ini digunakan untuk clustering, perhitungan sum of squared errors 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.

Begini :

#melakukan normalisasi kolom NilaiBelanjaSetahun
AL.Pelanggan$NilaiBelanjaSetahun <- AL.Pelanggan$NilaiBelanjaSetahun / 1000000

#menampilkan data hasil normalisasi
AL.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            9.497927               1         5              2
2       Cluster            2.722700               2         3              1
3       Cluster            5.286429               1         4              1
4       Cluster            5.204498               1         4              1
5       Cluster           10.615206               2         5              1
6       Cluster            5.215541               2         4              1
7        Sector            9.837260               1         5              2
8       Cluster            5.223569               1         4              1
9        Sector            5.993218               2         4              2
10      Cluster            5.257448               1         4              1
11       Sector            5.987367               2         4              2
12       Sector            5.941914               2         4              2
13      Cluster            9.333168               2         5              1
14      Cluster            9.471615               1         5              1
15      Cluster           10.365668               2         5              1
16      Cluster            5.262521               1         4              1
17      Cluster            5.677762               2         1              1
18      Cluster            5.340690               2         1              1
19      Cluster           10.884508               2         5              1
20       Sector            2.896845               2         3              2
21      Cluster            9.222070               2         5              1
22      Cluster            5.298157               2         4              1
23      Cluster            5.239290               1         4              1
24      Cluster           10.259572               2         5              1
25       Sector           10.721998               2         5              2
26      Cluster            5.269392               2         4              1
27      Cluster            9.114159               2         5              1
28      Cluster            6.631680               2         1              1
29      Cluster            5.271845               2         4              1
30       Sector            5.020976               2         1              2
31      Cluster            3.042773               2         2              1
32       Sector           10.663179               2         5              2
33      Cluster            3.047926               2         2              1
34       Sector            9.759822               2         5              2
35       Sector            5.962575               2         4              2
36      Cluster            9.678994               2         5              1
37       Sector            5.972787               2         4              2
38       Sector           10.477127               2         5              2
39      Cluster            5.257775               2         4              1
40       Sector            2.861855               2         3              2
41      Cluster            6.820976               2         1              1
42      Cluster            9.880607               2         5              1
43      Cluster            5.268410               2         4              1
44      Cluster            9.339737               2         5              1
45      Cluster            5.211041               2         4              1
46       Sector           10.099807               2         5              2
47      Cluster            6.130724               2         1              1
48       Sector           10.390732               2         5              2
49       Sector            4.992585               2         1              2
50       Sector           10.569316               2         5              2

2.8 Membuat Data Master

Setelah penggabungan data, kita jadi mengetahui sebenarnya teks kategori dikonversi menjadi angka numerik berapa. Sebagai contoh, coba kita menampilkan data kolom Profesi dan Profesi.1.

Begini :

AL.Pelanggan[c("Profesi","Profesi.1")]
            Profesi Profesi.1
1        Wiraswasta         5
2           Pelajar         3
3      Professional         4
4      Professional         4
5        Wiraswasta         5
6      Professional         4
7        Wiraswasta         5
8      Professional         4
9      Professional         4
10     Professional         4
11     Professional         4
12     Professional         4
13       Wiraswasta         5
14       Wiraswasta         5
15       Wiraswasta         5
16     Professional         4
17 Ibu Rumah Tangga         1
18 Ibu Rumah Tangga         1
19       Wiraswasta         5
20          Pelajar         3
21       Wiraswasta         5
22     Professional         4
23     Professional         4
24       Wiraswasta         5
25       Wiraswasta         5
26     Professional         4
27       Wiraswasta         5
28 Ibu Rumah Tangga         1
29     Professional         4
30 Ibu Rumah Tangga         1
31        Mahasiswa         2
32       Wiraswasta         5
33        Mahasiswa         2
34       Wiraswasta         5
35     Professional         4
36       Wiraswasta         5
37     Professional         4
38       Wiraswasta         5
39     Professional         4
40          Pelajar         3
41 Ibu Rumah Tangga         1
42       Wiraswasta         5
43     Professional         4
44       Wiraswasta         5
45     Professional         4
46       Wiraswasta         5
47 Ibu Rumah Tangga         1
48       Wiraswasta         5
49 Ibu Rumah Tangga         1
50       Wiraswasta         5

Kelihatan kalau Wiraswasta dikonversi menjadi angka 5, Professional menjadi angka 4, dst. 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.

Nah, masalahnya data di atas terlalu panjang, padahal sebenarnya kita cuma perlu 5 baris data bukan? Di R, kita bisa meringkasnya dengan fungsi unique().

Begini :

unique(AL.Pelanggan[c("Profesi", "Profesi.1")])
            Profesi Profesi.1
1        Wiraswasta         5
2           Pelajar         3
3      Professional         4
17 Ibu Rumah Tangga         1
31        Mahasiswa         2

Terlihat ya datanya sudah diringkas dengan teks kategori beserta pasangan numeriknya. Kemudian perhatikan juga angka-angka 1, 2, 3, 17, 31 yang terdapat di bagian paling Kiri. Ini menunjukkan posisi baris ditemukannya teks tersebut. Data ringkas dan unik ini untuk selanjutnya kita sebut sebagai data referensi atau data master.

Buatlah tiga variabel dengan nama Profesi, Jenis.Kelamin dan Tipe.Residen yang isinya berisi daftar unik dari pasangan kolom Profesi dan Profesi.1, Jenis.Kelamin dan Jenis.Kelamin.1, Tipe.Residen dan Tipe.Residen.1.

Begini :

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

#melihat hasil
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

2.9 Kesimpulan

Selamat, kamu sudah menjalankan praktek-praktek yang menjadi dasar dari semua hal sebelum penggunaan analisa data, yaitu tahap persiapan data atau data preparation.

Untuk algoritma clustering k-means yang akan kita gunakan 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 kita lihat sendiri dan praktekkan dengan contoh dataset yang digunakan pada bab ini dengan langkah-langkah berikut:

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

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 pembelajaran kita.

K-means adalah algoritma yang membagi data menjadi sejumlah partisi dengan cara 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

Algoritma k-means sudah ada di paket dasar R dalam bentuk fungsi bernama kmeans. Sepanjang bab ini, kita akan menggunakan fugsi ini dan menganalisa output yang dihasilkan.

3.2 Fungsi K-Means

Pembelajaran kali ini kita akan melakukan segmentasi langsung pada data AL.Pelanggan yang telah kita lakukan persiapan datanya pada bab sebelumnya dengan menggunakan fungsi k-means.

Fungsi k-means memerlukan minimal 2 parameter, yaitu:

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

Fungsi k-means ini biasanya disertai dengan pemanggilan fungsi seet.seed(). Ini berguna agar kita menyeragamkan daftar nilai acak yang sama dari k-means sehingga kita mendapatkan output yang sama. Berikut adalah contoh penggunaan fungsi kombinasi set.seed() dan kmeans():

set.seed(100)
kmeans(x=pelanggan[c("Umur", "Profesi.1")], centers=3)

Ini artinya kita 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, yang merupakan jumlah kombinasi acak yang dihasilkan secara internal oleh R. Berdasarkan jumlah yang diberikan, algoritma akan memilih mana yang terbaik dari kombinasi-kombinasi tersebut.

Kata terbaik berarti jarak antara tiap titik ke mean dari cluster nya sendiri lebih kecil dibandingkan ke mean dari cluster lain.

Perlu untuk diingat bahwa mean atau nilai rata-rata di sini sering disebut juga dengan centroid pada berbagai literatur data science.

Berikut adalah modifikasi pemanggilan fungsi dengan parameter tambahan nstart sebesar 25.

kmeans(x=pelanggan[c("Umur","Profesi.1")], centers=3, nstart=25)

Sekarang kita akan membuat fungsi kmeans dengan ketentuan berikut: - x : berisi data pelanggan dengan field-field yang diambil dari vektor kolom.digunakan - centers : jumlah segmen / cluster yang kita inginkan. Isi dengan 5. - nstart : isi dengan angka 25

Begini :

#mempersiapkan data
AL.Pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t") #membuat variabel dataset
AL.Pelanggan.Matrix <- data.matrix(AL.Pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")]) #melakukan kategorisasi
Pelanggan <- data.frame(AL.Pelanggan, AL.Pelanggan.Matrix) #menggabungkan dataset

#membuat data master
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")])

#melakukan normalisasi
Pelanggan$NilaiBelanjaSetahun <- Pelanggan$NilaiBelanjaSetahun/1000000

#membuat parameter x(data yang digunakan)
kolom.digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")

#menggunakan K-Means
set.seed(100) #menyeragamkan nilai acak

#membuat fungsi kmeans untuk membentuk 5 cluster dengan 25 skenario pengacakan dan menyimpan dalam variabel Segmentasi
Segmentasi <- kmeans(x=Pelanggan[kolom.digunakan], centers=5, nstart=25)

#menamampilkan hasil k-means
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"      

Hasil ini dapat dibagi dalam lima bagian, dengan penjelasan sebagai berikut:

  1. K-means clustering with 5 clusters of sizes : ukuran / jumlah titik data pada tiap cluster
  2. Cluster means : nilai rata-rata (centroid) dari tiap cluster
  3. Clustering vector : pembagian cluster dari tiap elemen data berdasarkan posisinya
  4. Within cluster sum of squares by cluster : jumlah jarak kuadrat dari tiap titik ke centroid nya
  5. Available components : komponen informasi lain yang terkandung di dalam objek k-means ini

3.3 Analisa Hasil Clustering Vector

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

Vector ini dimulai dari angka 1, yang artinya data pertama dari dataset kita akan dialokasikan pada nomor cluster 1. Dari output 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.

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

Segmentasi$cluster

Nah, sekarang tugas kita adalah menambahkan hasil segmentasi ini ke data asal. Caranya cukup gampang, yaitu dengan cara membuat kolom baru (kita namakan Cluster) di variabel Pelanggan yang isinya dari Segmentasi$cluster. Kemudian tampilkan struktur dari data Pelanggan dengan perintah str().

Begini :

#menggabungkan hasil cluster
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
#membuat kolom Cluster untuk menyimpan data cluster
Pelanggan$Cluster <- Segmentasi$cluster

#melihat tipe data
str(Pelanggan)
'data.frame':   50 obs. of  11 variables:
 $ Customer_ID        : chr  "CUST-001" "CUST-002" "CUST-003" "CUST-004" ...
 $ Nama.Pelanggan     : chr  "Budi Anggara" "Shirley Ratuwati" "Agus Cahyono" "Antonius Winarta" ...
 $ Jenis.Kelamin      : chr  "Pria" "Wanita" "Pria" "Pria" ...
 $ Umur               : int  58 14 48 53 41 24 64 52 29 33 ...
 $ Profesi            : chr  "Wiraswasta" "Pelajar" "Professional" "Professional" ...
 $ Tipe.Residen       : chr  "Sector" "Cluster" "Cluster" "Cluster" ...
 $ NilaiBelanjaSetahun: num  9.5 2.72 5.29 5.2 10.62 ...
 $ Jenis.Kelamin.1    : int  1 2 1 1 2 2 1 1 2 1 ...
 $ Profesi.1          : int  5 3 4 4 5 4 5 4 4 4 ...
 $ Tipe.Residen.1     : int  2 1 1 1 1 1 2 1 2 1 ...
 $ Cluster            : int  1 3 5 5 4 3 1 5 2 2 ...

3.4 Analisa Hasil Cluster Size

Tahap berikutnya, Kita akan analisa hasil pada bagian pertama:

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

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

  • 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 jumlah total 50 data, yang juga merupakan jumlah data total Pelanggan.

Mari kita verifikasi hal tersebut dengan memulai dari cluster 1. Ambil data Pelanggan yang isi dari kolom cluster nya adalah 1 dengan menggunakan fungsi which().

Begini :

which(Pelanggan$Cluster == 1)
[1]  1  7 13 14 18

Hasil di atas menunjukkan 5 angka posisi data untuk cluster 1. Banyaknya angka pada deretan ini sesuai ukuran untuk cluster ke-1 dari informasi di atas.

Sekarang cobalah hitung jumlah deretan dengan menambahkan perintah length() pada fungsi which().

Begini :

length(which(Pelanggan$Cluster == 1))
[1] 5
length(which(Pelanggan$Cluster == 4))
[1] 9

3.5 Melihat Data pada Cluster ke-N

Sejauh ini, kita belum melihat data hasil cluster. Pastinya, penasaran untuk melihat hasil tersebut, bukan ?

Ini dapat dihasilkan dengan cukup mudah setelah kita ikuti praktek sebelumnya, dimana hasil cluster telah diintegrasikan dan juga mengerti cara filter baris-baris data (data rows) dengan which(). Kita akan coba melihat seluruh data pada cluster ke-1.

Begini :

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

Ada 5 data dengan 3 orang berjenis kelamin pria dan 2 orang wanita. Umur pelanggan antara 55-65 tahun dan 4 orang diantaranya berprofesi sebagai wiraswasta. Kecuali yang berprofesi ibu rumah tangga, rata-rata nilai belanjanya sekitar 9 juta.

Silakan coba untuk melihat cluster sisanya.

Begini :

#melihat data cluster 2-5
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
Pelanggan[which(Pelanggan$Cluster == 3),]
   Customer_ID   Nama.Pelanggan Jenis.Kelamin Umur          Profesi
2     CUST-002 Shirley Ratuwati        Wanita   14          Pelajar
6     CUST-006  Rosalina Kurnia        Wanita   24     Professional
15    CUST-015 Shirley Ratuwati        Wanita   20       Wiraswasta
20    CUST-020   Irene Novianto        Wanita   16          Pelajar
31    CUST-031    Eviana Handry        Wanita   19        Mahasiswa
33    CUST-033  Cecilia Kusnadi        Wanita   19        Mahasiswa
34    CUST-034   Deasy Arisandi        Wanita   21       Wiraswasta
37    CUST-037 Felicia Tandiono        Wanita   25     Professional
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
44    CUST-044             Anna        Wanita   18       Wiraswasta
45    CUST-045   Rismawati Juni        Wanita   22     Professional
46    CUST-046     Elfira Surya        Wanita   25       Wiraswasta
   Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
2       Cluster            2.722700               2         3              1
6       Cluster            5.215541               2         4              1
15      Cluster           10.365668               2         5              1
20       Sector            2.896845               2         3              2
31      Cluster            3.042773               2         2              1
33      Cluster            3.047926               2         2              1
34       Sector            9.759822               2         5              2
37       Sector            5.972787               2         4              2
39      Cluster            5.257775               2         4              1
40       Sector            2.861855               2         3              2
41      Cluster            6.820976               2         1              1
44      Cluster            9.339737               2         5              1
45      Cluster            5.211041               2         4              1
46       Sector           10.099807               2         5              2
   Cluster
2        3
6        3
15       3
20       3
31       3
33       3
34       3
37       3
39       3
40       3
41       3
44       3
45       3
46       3
Pelanggan[which(Pelanggan$Cluster == 4),]
   Customer_ID      Nama.Pelanggan Jenis.Kelamin Umur          Profesi
5     CUST-005 Ibu Sri Wahyuni, IR        Wanita   41       Wiraswasta
21    CUST-021    Lestari Fabianto        Wanita   38       Wiraswasta
24    CUST-024       Putri Ginting        Wanita   39       Wiraswasta
28    CUST-028       Adeline Huang        Wanita   40 Ibu Rumah Tangga
30    CUST-030      Rosita Saragih        Wanita   46 Ibu Rumah Tangga
32    CUST-032     Chintya Winarni        Wanita   47       Wiraswasta
35    CUST-035             Ida Ayu        Wanita   39     Professional
38    CUST-038        Agatha Salim        Wanita   46       Wiraswasta
48    CUST-048    Maria Hutagalung        Wanita   45       Wiraswasta
   Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
5       Cluster           10.615206               2         5              1
21      Cluster            9.222070               2         5              1
24      Cluster           10.259572               2         5              1
28      Cluster            6.631680               2         1              1
30       Sector            5.020976               2         1              2
32       Sector           10.663179               2         5              2
35       Sector            5.962575               2         4              2
38       Sector           10.477127               2         5              2
48       Sector           10.390732               2         5              2
   Cluster
5        4
21       4
24       4
28       4
30       4
32       4
35       4
38       4
48       4
Pelanggan[which(Pelanggan$Cluster == 5),]
   Customer_ID    Nama.Pelanggan Jenis.Kelamin Umur          Profesi
3     CUST-003      Agus Cahyono          Pria   48     Professional
4     CUST-004  Antonius Winarta          Pria   53     Professional
8     CUST-008    Danang Santosa          Pria   52     Professional
11    CUST-011    Maria Suryawan        Wanita   50     Professional
12    CUST-012   Erliana Widjaja        Wanita   49     Professional
22    CUST-022      Novita Purba        Wanita   52     Professional
26    CUST-026 Christine Winarto        Wanita   55     Professional
29    CUST-029      Tia Hartanti        Wanita   56     Professional
47    CUST-047       Mira Kurnia        Wanita   55 Ibu Rumah Tangga
50    CUST-050    Lianna Nugraha        Wanita   55       Wiraswasta
   Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
3       Cluster            5.286429               1         4              1
4       Cluster            5.204498               1         4              1
8       Cluster            5.223569               1         4              1
11       Sector            5.987367               2         4              2
12       Sector            5.941914               2         4              2
22      Cluster            5.298157               2         4              1
26      Cluster            5.269392               2         4              1
29      Cluster            5.271845               2         4              1
47      Cluster            6.130724               2         1              1
50       Sector           10.569316               2         5              2
   Cluster
3        5
4        5
8        5
11       5
12       5
22       5
26       5
29       5
47       5
50       5

3.6 Analisa Hasil Cluster Means

Cluster means adalah hasil nilai rata-rata atau titik sentral (centroid) dari seluruh titik tiap cluster. Cobalah melihat hasil dari cluster means ini dengan langsung mengakses variabel Segmentasi pada komponen centers.

Beegini :

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 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 cluster 3 dan 4 terlihat bahwa hanya ada angka 2, artinya cluster tersebut hanya berisi data dengan profil berjenis kelamin wanita. Nah, untuk cluster 1 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 ke-N.

Kolom Umur adalah representasi dari dataset awal tanpa mengalami konversi. Terlihat untuk cluster ke-3 umur rata-rata adalah 20 tahun, umur 42 tahun untuk cluster ke-4, dan seterusnya.

Kolom Profesi.1 menunjukkan nilai rata-rata data Profesi untuk tiap cluster yang telah dikonversi menjadi numerik, yaitu angka 1 s/d 5. Angka 1, 2, 3, 4, dan 5 di kolom ini masing-masingnya secara berurutan mewakili Ibu Rumah Tangga, Mahasiswa, Pelajar, Professional, dan Wiraswasta. Terlihat untuk seluruh cluster bahwa nilai profesi berada dalam rentang 3.5 s/d 4.2 (3.5 < profesi <= 4.2). Hal ini menunjukkan bahwa profesi cenderung ke ke Professional, dan secara tegas cluster keempat memiliki profesi berupa Professional.

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. 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. Cluster ke-1 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan ketiga cluster lainnya. Ini mungkin target customer yang bisa lebih disasar melalui marketing campaign, karena cluster ke-1 saat ini hanya berisi 5 data. Cukup kecil proporsinya, dan ingin ditingkatkan.

3.7 Analisa Hasil Sum of Squares

Kita akan melakukan analisa berikutnya, yaitu nilai metrik sum of squares seperti terlihat berikut:

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

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

Berdasarkan konsep tersebut, berikut adalah penjelasan untuk hasil output k-means di atas:

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

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

Teknik penggunaan metrik ini cukup panjang, namun untuk kepentingan praktis kali ini kita hanya melihat perbedaan nilai ini dengan contoh. Kita akan membandingkan dengan 2 cluster k-means, masing-masing 2 dan 5.

Begini :

#Mmmbandingkan dengan 2 cluster kmeans, masing-masing 2 dan 5
set.seed(100)
kmeans(x=Pelanggan[kolom.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[kolom.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"      

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

3.8 Available Components

Analisa terakhir kita adalah bagian kelima, yaitu sembilan komponen objek yang bisa kita gunakan untuk melihat detil dari objek k-means. Berikut adalah penjelasan singkat dari sembilan komponen tersebut.

Seluruh komponen tersebut bisa diakses dengan menggunakan aksesor $. Contoh, dengan variabel k-means kita bernama Segmentasi dan kita ingin mengakses komponen withinss, cluster dan tot.withinss.

Begini :

#mengakses available components
Segmentasi$withinss
[1]  58.21123 174.85164 316.73367 171.67372 108.49735
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$tot.withinss
[1] 829.9676

3.9 Kesimpulan

Pada bab ini kamu telah menyelesaikan penggunaan algoritma K-Means dengan fungsi kmeans() dari dataset yang telah dipersiapkan pada bab kedua. Fungsi kmeans() sederhana digunakan tapi output nya memiliki informasi yang kaya yaitu:

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

Dengan menganalisa hasil output ini, kita mampu menggabungkan nomor cluster ke data asal. Selain itu kita juga mengetahui bagaimana kedekatan tiap titik data dari cluster nya sehingga menjadi bekal kita untuk menentukan jumlah cluster yang optimal.


4 Menentukan Jumlah Cluster Terbaik

4.1 Pengantar

Dari informasi yang dihasilkan oleh fungsi k-means, metrik 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.
  • 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 kita mengambil titik sikunya. Pada contoh di atas kita bisa mengambil 4 atau 5. Proses pengambilan keputusan berdasarkan plotting siku ini biasa kita sebut Elbow Effect atau Elbow Method.

4.2 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 k-means. Metrik ini akan dicari progresif nilai tot.withinss untuk tiap kombinasi jumlah cluster, dan disimpan dalam bentuk vektor di R. Untuk keperluan ini, kita akan gunakan sapply(). Fungsi sapply() akan digunakan untuk memanggil fungsi kmeans() untuk suatu range jumlah cluster. Range ini akan kita gunakan 1 sampai dengan 10. Code lengkapnya sebagai berikut:

sse <- sapply(1:10,
function(param_k)
{
kmeans(pelanggan[field_yang_digunakan], param_k, nstart=25)$tot.withinss
}
)

Berikut adalah penjelasan lengkap elemen-elemen perintah di Atas: Mari kita coba perintah di Atas.

Begini :

#simulasi
set.seed(100)

SSE <- sapply(1:10,
function(param_k)
{
kmeans(Pelanggan[kolom.digunakan], param_k, nstart=25)$tot.withinss
}
)

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

Kali ini kita akan visualisasikan vektor Sum of Squares (SS) atau Sum of Squared Errors (SSE) yang telah kita hasilkan sebelumnya. Kita akan gunakan ggplot untuk visualisasi. Dataset berupa penggabungan data frame dari SSE dan range nilai 1:10.

Begini :

#set library yang digunakan
library("ggplot2")

#membuat grafik elbow effect
cluster.max <- 10
ssdata = data.frame(cluster=c(1:cluster.max),SSE)
ggplot(ssdata, aes(x=cluster,y=SSE)) +
                geom_line(color="red") + geom_point() +
                ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
                geom_text(aes(label=format(round(SSE, 2), nsmall = 2)),hjust=-0.2, vjust=-0.5) +
  scale_x_discrete(limits=c(1:cluster.max))

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

4.4 Kesimpulan

Dengan memanfaatkan nilai Sum of Squares (SS) atau Sum of Squared Errors (SSE) kita bisa mengambil keputusan jumlah segmentasi optimal yang kita gunakan. Ini dilakukan dengan membuat simulasi iterasi jumlah cluster dari 1 sampai dengan jumlah maksimum yang kita inginkan. Pada contoh di bab ini, kita gunakan angka iterasi 1 sampai dengan 10. Setelah mendapatkan nilai SS dari tiap jumlah cluster, kita bisa plotting ke grafik garis dan menggunakan elbow method untuk menentukan jumlah cluster optimal.

Tahap berikutnya adalah mempaketkan objek k-means ini dan semua informasi yang berkaitan sehingga dapat digunakan untuk operasional.


5 Model K-Means

5.1 Pengantar

Kita telah berhasil mempersiapkan data, menggunakan algoritma k-means, dan akhirnya bisa memutuskan jumlah cluster terbaik. Tahapan berikutnya adalah memaketkan atau membungkus seluruh referensi hasil konversi dan objek k-means 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 variabel Segmen.Pelanggan.
  • Menggabungkan variabel 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 bagi kita.

5.2 Menamakan Segmen

Pada praktek kali ini kita akan menamakan segmen sesuai dengan karakteristiknya. Mari kita coba namakan cluster 1 s/d 5 sebagai berikut:

  • Cluster 1 = Diamond Senior Member : alasannya adalah karena umurnya rata-rata adalah 61 tahun dan pembelanjaan di atas 8 juta.
  • Cluster 2 = Gold Young Professional : alasannya adalah karena umurnya rata-rata adalah 31 tahun, professional dan pembelanjaan cukup besar.
  • Cluster 3 = 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 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.

Buatlah satu variabel data frame bernama Segmen.Pelanggan yang terdiri dari dua kolom:

  • cluster : vektor dengan isi 1,2,3,4 dan 5.
  • Nama.Segmen : vektor dengan isi “Silver Youth Gals”, “Diamond Senior Member”, “Gold Young Professional”, “Diamond Professional”, dan “Silver Mid Professional”.

Begini :

#membuat variabel dengan dua vektor bernama cluster dan Nama.Segmen
Segmen.Pelanggan <- data.frame(cluster = c(1, 2, 3, 4, 5),
                               Nama.Segmen = c("Diamond Senior Member", 
                                               "Gold Young Professional", 
                                               "Silver Youth Gals", 
                                               "Diamond Professional", 
                                               "Silver Mid Professional"))

5.3 Menggabungkan 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 kolom NilaiBelanjaSetahun.
  • Objek k-means 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.
  • Variabel data.frame dengan nama Pelanggan yang berisi penamaan cluster sesuai analisa karakteristik dari centroid kolom-kolom pelanggan yang digunakan.
  • Vektor dari kolom yang digunakan.

Akan sangat baik jika semuanya digabungkan di satu variabel dengan tipe list, dan ini akan jadi model kita yang dapat disimpan ke dalam file dan digunakan ketika diperlukan.

Begini :

#menggabungkan seluruh aset ke dalam variabel Identitas.Cluster
Identitas.Cluster <- list(Profesi=Profesi, Jenis.Kelamin=Jenis.Kelamin, Tipe.Residen=Tipe.Residen, Segmentasi=Segmentasi, Segmen.Pelanggan=Segmen.Pelanggan, kolom.digunakan=kolom.digunakan)

#menampilkan hasil
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   Diamond Senior Member
2       2 Gold Young Professional
3       3       Silver Youth Gals
4       4    Diamond Professional
5       5 Silver Mid Professional

$kolom.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 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 fungsi saveRDS(). File ini kemudian dapat dibuka kembali sebagai objek kedepannya. Kita akan menyimpan objek Identitas.Cluster ke dalam file bernama cluster.rds.

Begini :

#menympan ke dalam file
saveRDS(Identitas.Cluster, "cluster.rds")

5.5 Kesimpulan

Pada penutup bab ini, kamu sudah menggabungkan seluruh aset yang diperlukan untuk membentuk suatu model. Model ini adalah objek yang bisa digunakan untuk mengolah data baru dan terdiri dari objek k-means, variabel referensi hasil konversi teks ke numerik, dan juga penamaan cluster. Bab berikutnya kita akan mengoperasionalkan objek ini.


6 Mengoperasionalkan Model K-Means

6.1 Pengantar

Apa yang dimaksud dengan mengoperasionalkan seperti judul pada bab ini? Ini artinya objek hasil pengolahan algoritma K-Means dan variabel-variabel 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.

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

Begini :

#membuat data baru
data.baru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Darlin Valentine", Umur=20, Jenis.Kelamin="Wanita", Profesi="Pelajar", Tipe.Residen="Cluster", NilaiBelanjaSetahun=3.5)

#melihat hasil
data.baru
  Customer_ID   Nama.Pelanggan Umur Jenis.Kelamin Profesi Tipe.Residen
1    CUST-100 Darlin Valentine   20        Wanita Pelajar      Cluster
  NilaiBelanjaSetahun
1                 3.5

6.3 Memuat Objek Clustering dari File

Kita akan 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 fungsi readRDS().

Begini :

#membuka file sebelumnya
Identitas.Cluster <- readRDS(file="cluster.rds")

#melihat hasil
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   Diamond Senior Member
2       2 Gold Young Professional
3       3       Silver Youth Gals
4       4    Diamond Professional
5       5 Silver Mid Professional

$kolom.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, kita bisa menggabungkan data baru ini untuk mendapatkan konversi numerik dari kolom Jenis.Kelamin, Profesi dan Tipe.Residen. Tujuannya adalah kita akan 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 data.baru dengan variabel Identitas.Cluster$Profesi.

merge(data.baru, Identitas.Cluster$Profesi)
  Profesi Customer_ID   Nama.Pelanggan Umur Jenis.Kelamin Tipe.Residen
1 Pelajar    CUST-100 Darlin Valentine   20        Wanita      Cluster
  NilaiBelanjaSetahun Profesi.1
1                 3.5         3

Maka prosesnya akan terlihat sebagai berikut: - Variabel data.baru 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 data.baru, 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.

Perhatikan kalau kolom kunci, yaitu Profesi digeser ke depan, dan sisanya adalah kolom-kolom dari kedua variabel.

Kita akan menggabungkan Profesi, Jenis.Kelamin dan Tipe.Residen yang ada di data.baru dengan Identitas.Cluster.

Begini :

#memasukkan perintah untuk penggabungan data
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)

#melihat hasil
data.baru
  Tipe.Residen Jenis.Kelamin Profesi Customer_ID   Nama.Pelanggan Umur
1      Cluster        Wanita Pelajar    CUST-100 Darlin Valentine   20
  NilaiBelanjaSetahun Profesi.1 Jenis.Kelamin.1 Tipe.Residen.1
1                 3.5         3               2              1

6.5 Menentukan Cluster

Kini saatnya penentuan untuk melakukan praktek terpenting bagi bisnis: data baru ini masuk ke segmen mana?

Gampang!

Yaitu 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 fungsi 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 k-means.
  • sum : digunakan untuk menjumlahkan jarak kuadrat

Untuk saat ini agar tidak membuang waktu, kita coba terapkan secara praktis perintah untuk menentukan cluster seperti pada contoh di atas. Ketika berhasil menjalankan kode di atas, hasil akhir adalah tampilan nomor cluster yang isinya 3. Kemudian jadikan perintah which.min(...) sebagai index pada referensi nama cluster (Segmen.Pelanggan) sehingga tampilan tidak mengeluarkan nomor cluster, tetapi nama cluster.

Petunjuk:

Index yang menggunakan which.min(...) sebagai index harus mengikuti format berikut. Perhatikan koma di penutup kurung siku.

Identitas.Cluster$Segmen.Pelanggan[which.min(...),]

Begini :

#membuat data baru
data.baru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Darlin Valentine", Umur=20, Jenis.Kelamin="Wanita", Profesi="Pelajar", Tipe.Residen="Cluster", NilaiBelanjaSetahun=3.5)

Identitas.Cluster <- readRDS(file="cluster.rds")

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)

#menentukan data baru di cluster mana
Identitas.Cluster$Segmen.Pelanggan[which.min(sapply( 1:5, function( x ) sum( ( data.baru[Identitas.Cluster$kolom.digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2 ) )),]
  cluster       Nama.Segmen
3       3 Silver Youth Gals

6.6 Kesimpulan

Pembelajaran terakhir menunjukkan bagaimana data pelanggan baru dianalisa oleh model kita dan mengeluarkan nomor cluster atau segmen. Dengan berakhirnya pembelajaran ini, berarti menunjukkan kita sudah menjalani siklus tahap demi tahap memodelkan dan menggunakan customer segmentation terhadap data kita.

Selamat, kamu sudah menyelesaikan rangkaian langkah untuk mengerti penggunaan algoritma k-means di R dengan tujuan segmentasi pelangggan. Dimulai dari persiapan data, menggunakan algoritma dan menganalisa hasilnya, mencari jumlah segmentasi paling optimal, memaketkan model yang dihasilkan agar dapat digunakan dalam operasional untuk membantu tim marketing melakukan otomatisasi dan menyampaikan pesan ke target yang tepat.


7 Kuis

7.1 Kenapa Customer Segmentation Penting

Apa tujuan utama Customer Segmentation bagi bisnis ?

Pilihan

  • Biaya pemasaran bisa menjadi lebih rendah
  • Bisa meminjam uang dari bank dengan lebih gampang
  • Bisa memilih produk yang dijual, sesuai kebutuhan pelanggan
  • Bisa lebih mengenal customer / pelanggan
  • Dapat membuat pesan pemasaran yang lebih mengena ke tiap pelanggan

7.2 Kenapa Perlu Bantuan Algoritma untuk Customer Segmentation

Apa alasan paling kuat kenapa kita akhirnya harus menggunakan algoritma komputer untuk membantu proses Customer Segmentation ?

Pilihan

  • Dapat memberikan hasil jauh lebih cepat
  • Dapat membantu kita menentukan jumlah clustering yang optimal
  • Bisa memilih produk yang dijual, sesuai kebutuhan pelanggan
  • Agar kita dapat membagi-bagi segmen customer dengan gampang
  • Karena bisa memberikan best practice