1. PreProcessing Data

1a. Membaca data dengan fungsi read.csv

Tampilkan data frame dari file berformat csv dengan kolom “Jenis.Kelamin”, “Umur”, “Profesi” dan “Tipe.Residen”.

pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t")   
pelanggan[c("Jenis.Kelamin", "Umur", "Profesi", "Tipe.Residen")]
##    Jenis.Kelamin Umur          Profesi Tipe.Residen
## 1           Pria   58       Wiraswasta       Sector
## 2         Wanita   14          Pelajar      Cluster
## 3           Pria   48     Professional      Cluster
## 4           Pria   53     Professional      Cluster
## 5         Wanita   41       Wiraswasta      Cluster
## 6         Wanita   24     Professional      Cluster
## 7           Pria   64       Wiraswasta       Sector
## 8           Pria   52     Professional      Cluster
## 9         Wanita   29     Professional       Sector
## 10          Pria   33     Professional      Cluster
## 11        Wanita   50     Professional       Sector
## 12        Wanita   49     Professional       Sector
## 13        Wanita   64       Wiraswasta      Cluster
## 14          Pria   60       Wiraswasta      Cluster
## 15        Wanita   20       Wiraswasta      Cluster
## 16          Pria   35     Professional      Cluster
## 17        Wanita   32 Ibu Rumah Tangga      Cluster
## 18        Wanita   63 Ibu Rumah Tangga      Cluster
## 19        Wanita   32       Wiraswasta      Cluster
## 20        Wanita   16          Pelajar       Sector
## 21        Wanita   38       Wiraswasta      Cluster
## 22        Wanita   52     Professional      Cluster
## 23          Pria   34     Professional      Cluster
## 24        Wanita   39       Wiraswasta      Cluster
## 25        Wanita   29       Wiraswasta       Sector
## 26        Wanita   55     Professional      Cluster
## 27        Wanita   35       Wiraswasta      Cluster
## 28        Wanita   40 Ibu Rumah Tangga      Cluster
## 29        Wanita   56     Professional      Cluster
## 30        Wanita   46 Ibu Rumah Tangga       Sector
## 31        Wanita   19        Mahasiswa      Cluster
## 32        Wanita   47       Wiraswasta       Sector
## 33        Wanita   19        Mahasiswa      Cluster
## 34        Wanita   21       Wiraswasta       Sector
## 35        Wanita   39     Professional       Sector
## 36        Wanita   30       Wiraswasta      Cluster
## 37        Wanita   25     Professional       Sector
## 38        Wanita   46       Wiraswasta       Sector
## 39        Wanita   20     Professional      Cluster
## 40        Wanita   14          Pelajar       Sector
## 41        Wanita   24 Ibu Rumah Tangga      Cluster
## 42        Wanita   26       Wiraswasta      Cluster
## 43        Wanita   31     Professional      Cluster
## 44        Wanita   18       Wiraswasta      Cluster
## 45        Wanita   22     Professional      Cluster
## 46        Wanita   25       Wiraswasta       Sector
## 47        Wanita   55 Ibu Rumah Tangga      Cluster
## 48        Wanita   45       Wiraswasta       Sector
## 49        Wanita   33 Ibu Rumah Tangga       Sector
## 50        Wanita   55       Wiraswasta       Sector

Perlu diperiksa terlebih dahulu apakah ada data yang kosong/missing. Pada data ini tidak terdapat data yang hilang.

# list rows of data that have missing values
pelanggan[!complete.cases(pelanggan),]
## [1] Customer_ID         Nama.Pelanggan      Jenis.Kelamin      
## [4] Umur                Profesi             Tipe.Residen       
## [7] NilaiBelanjaSetahun
## <0 rows> (or 0-length row.names)

1b. Vector untuk Menyimpan Nama Field

Tampilkan variable vector bernama field_yang_digunakan dan diisi dengan 3 teks: “Jenis.Kelamin”, “Umur” dan “Profesi” . Kemudian tampilkan isi variable pelanggan dengan field_yang_digunakan.

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

1c. Konversi Data dengan data.matrix dan gabungkan kembali ke pelanggan

Buatlah variable pelanggan_matrix yang diisi dengan konversi teks menjadi numerik dari variable pelanggan pada kolom “Jenis.Kelamin”, “Profesi”, dan “Tipe.Residen”.Gabungkan variable pelanggan dan pelanggan_matrix dengan function data.frame dan masukkan kembali ke variable pelanggan.

Catatan: Jika berhasil, maka isi penggabungan ini akan menambahkan kolom bernama “Jenis.Kelamin.1”, “Profesi.1”, dan “Tipe.Residen.1” yang sebelumnya tidak ada pada kedua variable seperti berikut.

#Konversi data menjadi numerik
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi",  "Tipe.Residen")])
#Penggabungan data
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
#Tampilkan kembali data hasil penggabungan
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

1d. 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.

Ada berbagai jenis normalisasi atau standardisasi data, pada bagian ini digunakan normalisasi sederhana dengan membagi kolom NilaiBelanjaSetahun dengan 1000000.

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

1e. Membuat Data Master

Setelah penggabungan data, kita jadi mengetahui data yang bertipe kategorikal dikonversi menjadi angka numerik. Selanjutnya akan dibuat tiga variable 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”.

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

2. Clustering using K-Means

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:

2a. K-Means Function

Praktek kali ini kita akan melakukan segmentasi langsung pada data pelanggan – yang telah kita lakukan persiapan datanya pada bab sebelumnya – dengan menggunakan function kmeans.

Function kmeans memerlukan minimal 2 parameter, yaitu: - x: data yang digunakan, dimana semua isi datanya harus berupa numerik. - centers: jumlah cluster yang diinginkan.

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

Catatan: Mean atau nilai rata-rata disini sering disebut juga dengan centroid pada berbagai literatur data science.

Dan fungsi kmeans ini biasanya disertai dengan pemanggilan function seet.seed. Ini berguna agar kita “menyeragamkan” daftar nilai acak yang sama dari kmeans sehingga kita mendapatkan output yang sama.

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

#Bagian Data Preparation
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
#Bagian K-Means
set.seed(100)
#fungsi kmeans untuk membentuk 5 cluster dengan 25 skenario random dan simpan ke dalam variable segmentasi
segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
#tampilkan 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 sesuai nomor urut pada gambar sebagai berikut:

  • Size atau Ukuran : jumlah titik data pada tiap cluster
  • Means : Nilai rata-rata (centroid) dari tiap cluster
  • Clustering Vector : Pembagian cluster dari tiap elemen data berdasarkan posisinya
  • Within Cluster sum of squares : Jumlah jarak kuadrat dari tiap titik ke centroidnya
  • Available Components : Komponen informasi lain yang terkandung di dalam objek kmeans ini

2b. Analisa Hasil Clustering Vector

Menambahkan hasil segmentasi ini ke data asal caranya cukup gampang, yaitu dengan cara membuat kolom baru (kita namakan cluster) di variable pelanggan yang isinya dari segmentasi$cluster.

Ketik perintah berikut pada bagian code editor setelah bagian komentar #Penggabungan hasil cluster. Kemudian tampilkan struktur dari data pelanggan dengan perintah str.

2c. Analisa Hasil Cluster Size

#Penggabungan hasil cluster
pelanggan$cluster <- segmentasi$cluster
#Analisa hasil
#Filter cluster ke-1
which(pelanggan$cluster == 1)
## [1]  1  7 13 14 18
length(which(pelanggan$cluster == 2))
## [1] 12

Dengan filter menggunakan fungsi which kita juga dapat mengetahui customer mana yang masuk ke klaster 1 serta berapa banyak customer yang masuk ke klaster 2 dengan fungsi length.

Jika ingin melihat customer yang masuk di beberapa klaster, dalam kasus ini customer yang ada di cluster nomor 3 sampai dengan 5 dapat menggunakan fungsi which dengan condition berupa vektor c(3,4,5).

#Analisa hasil
#Melihat data cluster ke-3,4,5
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
pelanggan[which(pelanggan$cluster == 3 | pelanggan$cluster == 4 | pelanggan$cluster == 5),]
##    Customer_ID      Nama.Pelanggan Jenis.Kelamin Umur          Profesi
## 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
## 8     CUST-008      Danang Santosa          Pria   52     Professional
## 11    CUST-011      Maria Suryawan        Wanita   50     Professional
## 12    CUST-012     Erliana Widjaja        Wanita   49     Professional
## 15    CUST-015    Shirley Ratuwati        Wanita   20       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
## 24    CUST-024       Putri Ginting        Wanita   39       Wiraswasta
## 26    CUST-026   Christine Winarto        Wanita   55     Professional
## 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
## 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
## 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
## 50    CUST-050      Lianna Nugraha        Wanita   55       Wiraswasta
##    Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
## 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
## 8       Cluster            5.223569               1         4              1
## 11       Sector            5.987367               2         4              2
## 12       Sector            5.941914               2         4              2
## 15      Cluster           10.365668               2         5              1
## 20       Sector            2.896845               2         3              2
## 21      Cluster            9.222070               2         5              1
## 22      Cluster            5.298157               2         4              1
## 24      Cluster           10.259572               2         5              1
## 26      Cluster            5.269392               2         4              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
## 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
## 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
## 50       Sector           10.569316               2         5              2
##    cluster
## 2        3
## 3        5
## 4        5
## 5        4
## 6        3
## 8        5
## 11       5
## 12       5
## 15       3
## 20       3
## 21       4
## 22       5
## 24       4
## 26       5
## 28       4
## 29       5
## 30       4
## 31       3
## 32       4
## 33       3
## 34       3
## 35       4
## 37       3
## 38       4
## 39       3
## 40       3
## 41       3
## 44       3
## 45       3
## 46       3
## 47       5
## 48       4
## 50       5

2c. Analisa Hasil Cluster Means

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

#Analisa hasil
#Melihat cluster means dari objek 
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

Pada variabel kategorikal seperti jenis kelamin, interpretasinya perlu diingat bagian di data master, nilai 1: Pria dan 2: Wanita. Nilai di antara 1 dan 1.50 menunjukkan lebih banyak customer berjenis kelamin laki-laki, sedangkan >1.5 menunjukkan dominasi jenis kelamin perempuan. Untuk kalster 3 dan 4 bernilai 2.00 berarti pada dua klaster ini seluruhnya merupakan customer perempuan.

Untuk variabel bertipe numerik seperti umur dan NilaiBelanjaSetahun cukup jelas bahwa rataan seperti yang tertera dengan satuan pada umur yaitu tahun sedangkan NilaiBelanjaSetahun adalah jutaan.

2d. Analisa Hasil 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.

#Membandingkan dengan 2 cluster kmeans, masing-masing 2 dan 5
set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=2, nstart=25)
## K-means clustering with 2 clusters of sizes 23, 27
## 
## Cluster means:
##   Jenis.Kelamin.1     Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1        1.739130 51.17391  3.913043       1.434783            7.551518
## 2        1.888889 25.85185  3.777778       1.296296            6.659586
## 
## Clustering vector:
##  [1] 1 2 1 1 1 2 1 1 2 2 1 1 1 1 2 2 2 1 2 2 2 1 2 1 2 1 2 1 1 1 2 1 2 2 1 2 2 1
## [39] 2 2 2 2 2 2 2 2 1 1 2 1
## 
## Within cluster sum of squares by cluster:
## [1] 1492.481 1524.081
##  (between_SS / total_SS =  72.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
set.seed(100)
kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
## K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
## 
## Cluster means:
##   Jenis.Kelamin.1     Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1            1.40 61.80000  4.200000       1.400000            8.696132
## 2            1.75 31.58333  3.916667       1.250000            7.330958
## 3            2.00 20.07143  3.571429       1.357143            5.901089
## 4            2.00 42.33333  4.000000       1.555556            8.804791
## 5            1.70 52.50000  3.800000       1.300000            6.018321
## 
## Clustering vector:
##  [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
## 
## Within cluster sum of squares by cluster:
## [1]  58.21123 174.85164 316.73367 171.67372 108.49735
##  (between_SS / total_SS =  92.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Terlihat untuk 2 cluster (k=2), SS per cluster lebih besar dibandingkan jika data dibagi menjadi 5 cluster (k=5). 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.

Perhatikan juga persentase rasio antara between_SS dan total_SS, dimana k=5 juga lebih besar. Persentase rasio pada klastering dengan k=2 adalah 72,6% sedangkan untuk k=5 adalah 92,4%.

2e. Available Components

Analisa terakhir kita dari code adalah bagian kelimat, yaitu sembilan komponen objek yang bisa kita gunakan untuk lihat detil dari objek k-means. Beberapa komponen seperti size, centers dan cluster sudah dibahas di bagian sebelumnya.

  • totss : Total Sum of Squares (SS) untuk seluruh titik data
  • withinss : Total Sum of Squares per cluster
  • tot.withinss : Total penjumlahan dari tiap SS dari withinss
  • betweenss : Perbedaan nilai antara totss dan tot.withinss
  • iter : Jumlah iterasi luar yang digunakan oleh kmeans
  • ifault : Nilai integer yang menunjukkan indikator masalah pada algoritma (0 jika tidak ada masalah)
segmentasi$withinss
## [1]  58.21123 174.85164 316.73367 171.67372 108.49735
segmentasi$tot.withinss
## [1] 829.9676

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

  • Ukuran / jumlah titik data pada tiap cluster
  • Nilai rata-rata (centroid) dari tiap cluster
  • Vector item dari cluster
  • Jumlah jarak kuadrat dari tiap titik ke centroidnya (Sum of Squares atau SS)
  • 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 clusternya sehingga menjadi bekal kita untuk menentukan jumlah cluster yang optimal.

2e. Elbow Method

Metode ini adalah salah satu yang digunakan untuk menentukan banyak klaster paling optimal dari suatu metode clustering. 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.

#Bagian K-Means
set.seed(100)
sse <- sapply(1:10,function(param_k){
kmeans(pelanggan[field_yang_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

Kali ini kita akan visualisasikan vector Sum of Squares (SS) atau Sum of Squared Errors (SSE) yang telah kita hasilkan pada praktek sebelumnya.

Kita akan gunakan ggplot untuk visualisasi, datasetnya berupa penggabungan data frame dari sse dan range nilai 1:10, dengan perintah berikut.

library(ggplot2)
jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ggplot(ssdata, aes(x=cluster,y=sse)) +
                geom_line(color="red") + geom_point() +
                ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
                geom_text(aes(label=format(round(sse, 2), nsmall = 2)),hjust=-0.2, vjust=-0.5) +
  scale_x_discrete(limits=c(1:jumlah_cluster_max))
## Warning: Continuous limits supplied to discrete scale.
## Did you mean `limits = factor(...)` or `scale_*_continuous()`?

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

3. “Pemaketan” Model K-Means

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:

Mari kita coba namakan cluster 1 s/d 5 sebagai berikut:

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

Akan sangat baik jika semua variable yaitu dataset pelanggan, objek k-means, variabel referensi data kategorikal, dataframe penamaan klaster, dan vector dari field yang digunakan dengan tipe list, dan ini akan jadi model kita yang dapat disimpan ke dalam file dan digunakan ketika diperlukan.

#Menggabungkan seluruh aset ke dalam variable Identitas.Cluster
Identitas.Cluster <- list(Profesi=Profesi, Jenis.Kelamin=Jenis.Kelamin, Tipe.Residen=Tipe.Residen, Segmentasi=segmentasi, Segmen.Pelanggan=Segmen.Pelanggan, field_yang_digunakan=field_yang_digunakan)
Identitas.Cluster
## $Profesi
##             Profesi Profesi.1
## 1        Wiraswasta         5
## 2           Pelajar         3
## 3      Professional         4
## 17 Ibu Rumah Tangga         1
## 31        Mahasiswa         2
## 
## $Jenis.Kelamin
##   Jenis.Kelamin Jenis.Kelamin.1
## 1          Pria               1
## 2        Wanita               2
## 
## $Tipe.Residen
##   Tipe.Residen Tipe.Residen.1
## 1       Sector              2
## 2      Cluster              1
## 
## $Segmentasi
## K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
## 
## Cluster means:
##   Jenis.Kelamin.1     Umur Profesi.1 Tipe.Residen.1 NilaiBelanjaSetahun
## 1            1.40 61.80000  4.200000       1.400000            8.696132
## 2            1.75 31.58333  3.916667       1.250000            7.330958
## 3            2.00 20.07143  3.571429       1.357143            5.901089
## 4            2.00 42.33333  4.000000       1.555556            8.804791
## 5            1.70 52.50000  3.800000       1.300000            6.018321
## 
## Clustering vector:
##  [1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4
## [39] 3 3 3 2 2 3 3 3 5 4 2 5
## 
## Within cluster sum of squares by cluster:
## [1]  58.21123 174.85164 316.73367 171.67372 108.49735
##  (between_SS / total_SS =  92.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"      
## 
## $Segmen.Pelanggan
##   cluster             Nama.Segmen
## 1       1   Diamond Senior Member
## 2       2 Gold Young Professional
## 3       3       Silver Youth Gals
## 4       4    Diamond Professional
## 5       5 Silver Mid Professional
## 
## $field_yang_digunakan
## [1] "Jenis.Kelamin.1"     "Umur"                "Profesi.1"          
## [4] "Tipe.Residen.1"      "NilaiBelanjaSetahun"

Objek yang sudah digabungkan pada 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.

saveRDS(Identitas.Cluster,"cluster.rds")

4. Mencari klaster dari data baru

Jika terdapat data baru 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.

Kemudian buka 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.

databaru <- data.frame(Customer_ID="CUST-100", Nama.Pelanggan="Rudi Wilamar",Umur=20,Jenis.Kelamin="Wanita",Profesi="Pelajar",Tipe.Residen="Cluster",NilaiBelanjaSetahun=3.5)
databaru    
##   Customer_ID Nama.Pelanggan Umur Jenis.Kelamin Profesi Tipe.Residen
## 1    CUST-100   Rudi Wilamar   20        Wanita Pelajar      Cluster
##   NilaiBelanjaSetahun
## 1                 3.5
readRDS(file="cluster.rds")
## $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
## 
## $field_yang_digunakan
## [1] "Jenis.Kelamin.1"     "Umur"                "Profesi.1"          
## [4] "Tipe.Residen.1"      "NilaiBelanjaSetahun"

Dengan adanya data baru dan objek yang berisi data referensi telah dibaca kembali, 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 Profesi . Lanjutkan perintahnya untuk menggabungkan juga variable Jenis.Kelamin dan Tipe.Residen. Kemudian tampilkan data akhirnya.

#Masukkan perintah untuk penggabungan data
databaru <- merge(databaru, Identitas.Cluster$Profesi)
databaru <- merge(databaru, Identitas.Cluster$Jenis.Kelamin)
databaru <- merge(databaru, Identitas.Cluster$Tipe.Residen)
databaru
##   Tipe.Residen Jenis.Kelamin Profesi Customer_ID Nama.Pelanggan Umur
## 1      Cluster        Wanita Pelajar    CUST-100   Rudi Wilamar   20
##   NilaiBelanjaSetahun Profesi.1 Jenis.Kelamin.1 Tipe.Residen.1
## 1                 3.5         3               2              1

Cara menentukan klaster data baru yaitu dengan tahapan berikut dengan mencari jarak kuadrat minimum atau terdekat dari kolom numerik data baru tersebut ke centroid kolom terkait dari seluruh cluster yang ada.

Kemudian jadikan perintah which.min(…) sebagai index pada referensi nama cluster (Segmen.Pelanggan) sehingga tampilan tidak mengeluarkan nomor cluster, tetapi nama cluster.

Identitas.Cluster$Segmen.Pelanggan[which.min(sapply( 1:5, function( x ) sum( ( databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2 ) )),]
##   cluster       Nama.Segmen
## 3       3 Silver Youth Gals

Sehingga customer baru ini masuk ke klaster 3 yaitu Silver Youth Girls, yaitu kelompok wanita yang rata-rata usianya 20, profesinya bercampur antar pelajar dan professional serta pembelanjaan sekitar 6 juta.