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)
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
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
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
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")])
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:
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:
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.
#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
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.
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%.
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.
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:
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.
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.
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")
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.