Customer Segmentation

Baik sebelum melakukan analysis ada beberapa tahapan yang harus kita pahami yaitu 6 FASE ANALISIS DATA

  1. Bertanya/ ask kita melakukan dua hal yaitu mendefinisikan masalah yang harus dipecahkan dan kita memastikan bahwa kita memahami sepenuhnya harapan dari pemangku kepentingan/ stakeholder. Ini membantu anda tetap fokus pada masalah itu sendiri bukan hanya gejalanya. Pertanyaan 5 whys membantu pada tahap ini. Berkomunikasi dengan pemangku kepentingan anda adalah kunci untuk membuat anda tetap terlibat dan di jalur yang tepat selama pelaksanaan proyek. Mendefinisikan masalah berarti anda melihat keadaan saat ini dan mengidentifikasi keadaan dibandingkan dengan keadaan ideal. Berikut ini adalah beberapa pertanyaan yang sering diajukan Apa masalah yang kita coba selesaikan?, Apa tujuan dari analisis ini?, Apa pelajaran yang kita harapkan dari masalah itu?

  2. Mempersiapkan/ prepare Ini adalah langkah dimana data analyst mengumpulkan dan menyimpan data yang akan kita gunakan untuk proses analisis berikutnya. Mengidentifikasi jenis data apa yang paling berguna untuk memecahkan suatu masalah tertentu. data dan hasil analisis Anda yang objektif dan tidak bias adalah sangat penting. Dengan kata lain, setiap keputusan yang dibuat dari analisis Anda harus selalu didasarkan pada fakta dan kejujuran, serta tidak memihak

  3. Memproses/ process Hal yang dilakukan pada tahap ini adalah menemukan dan menghilangkan setiap kesalahan dan ketidakakuratan yang dapat menghambat perolehan hasil. Biasanya yang dilakukan adalah membersihkan data, mengubahnya menjadi format yang lebih berguna, menggabungkan dua atau lebih, untuk memperoleh informasi lebih lengkap dan menghilangkan data pencilan (outlier) yaitu data observasi yang dapat memberatkan ketimpangan informasi. Memeriksa data yang kita persiapkan untuk memastikan data yang lengkap dan benar. Tahap ini adalah tahap di mana kita harus memperoleh detail data dengan benar. Jadi Kita juga akan memperbaiki kesalahan ketik, inkonsistensi, atau data yang hilang dan tidak akurat. Untuk melengkapinya, kita juga menerapkan strategi untuk memverifikasi dan membagikan pembersihan data kita dengan pemangku kepentingan

  4. Menganalisis/ analyze Menganalisis data untuk menemukan pola, hubungan, dan tren. Diperlukan penggunaan alat untuk mengubah dan mengatur informasi sehingga Anda dapat menarik kesimpulan yang bermanfaat, membuat prediksi, serta memberi saran yang tepat untuk pengambilan keputusan. Misal menggunakan spreadshet, R, Python, SQL

  5. Membagikan/share Visualisasi Para analis membagikan temuan dan rekomendasi mereka kepada pihak yang memang berkepentingan. Bagaimana analis data menafsirkan hasil dan membagikannya dengan orang lain untuk membantu pemangku kepentingan membuat keputusan berdasarkan data secara efektif. Pada tahap berbagi, visualisasi adalah teman terbaik seorang analis data. visualisasi itu penting untuk membuat orang lain memahami apa yang data Anda katakan. Dengan visual yang tepat, fakta dan angka menjadi jauh lebih mudah untuk dilihat dan konsep yang kompleks menjadi lebih mudah dipahami.

  6. Bertindak/ act Hal ini berkaitan erat dengan menerapkan wawasan kita untuk menyelesaikan masalah, mengambil keputusan, membuat hal baru. Saat yang menyenangkan ketika suatu perusahaan menerima semua wawasan yang telah kita sediakan, sebagai data analyst, dan mengelola data tersebut sedemikian rupa untuk memecahkan asal masalah perusahaan tersebut


STUDY CASE

Untuk project kali ini saya hanya akan menggunakan dataset yang jumlahnya sedikit tapi cukup mewakili. Hasil dari project ini adalah menerapkan algoritma tertentu untuk menghasilkan clustering terhadap customer berdasarkan dataset yang tersedia .Dalam project ini saya menggunakan algoritma K-Means Clustering, kemudian melakukan ETL pada dataset, membuat visualisasi, dan membuat objek clustering agar model dapat digunakan untuk mengcluster data baru



Bertanya/ ask

Dalam study case sudah dijelaskan bahwa tujuan dari project ini adalah melakukan clustering terhadap dataset yang tersedia dan membaut objek clustering agar model dapat digunakan untuk mengcluster data baru.



Mempersiapkan/ prepare

disini saya menggunakan dataset bernama customer_segments.txt yang mana datanya dipisahkan oleh tab



Memproses/ process

Seperti yang sudah disinggung di study case. saya menggunakan R dan algoritma K-Mean Clustering. Sebelum melakukan tahap process saya akan jelaskan sedikit apa itu clustering dan algoritma K-Means

clustering
Clustering adalah proses pembagian objek-objek ke dalam beberapa kelompok (cluster) berdasarkan tingkat kemiripan antara satu objek dengan yang lain

algoritma K-Mean Clustering
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. K-means merupakan tipe clustering dengan centroid based (titik pusat)(centroid artinya rata-rata cluster ). Artinya kesamaan dari objek/sampel dihitung dari seberapa dekat objek itu dengan centroid atau titik pusat.

Kenapa Perlu Bantuan Algoritma untuk Customer Segmentation?
Agar kita dapat membagi-bagi segmen customer dengan gampang, Dapat membantu kita menentukan jumlah clustering yang optimal, Dapat memberikan hasil jauh lebih cepat Karena bisa memberikan best practice

Pentingnya Customer Segmentation
Setelah kita mengetahui apa itu clustering dan k-means sekarang saya akan menjelaskan Kenapa Customer Segmentation Penting. Customer segmentation itu penting karena dapat membuat pesan pemasaran yang lebih mengena ke tiap pelanggan, Bisa lebih mengenal customer / pelanggan, dan Biaya pemasaran bisa menjadi lebih rendah.

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



Cek data isi data frame

#import dataset
dataset_raw = read.csv('customer_segments.txt', sep="\t")

#cek tipe data
class(dataset_raw)
## [1] "data.frame"
#tampilkan 6 data teratas
head(dataset_raw)
##   Customer_ID      Nama.Pelanggan Jenis.Kelamin Umur      Profesi Tipe.Residen
## 1    CUST-001        Budi Anggara          Pria   58   Wiraswasta       Sector
## 2    CUST-002    Shirley Ratuwati        Wanita   14      Pelajar      Cluster
## 3    CUST-003        Agus Cahyono          Pria   48 Professional      Cluster
## 4    CUST-004    Antonius Winarta          Pria   53 Professional      Cluster
## 5    CUST-005 Ibu Sri Wahyuni, IR        Wanita   41   Wiraswasta      Cluster
## 6    CUST-006     Rosalina Kurnia        Wanita   24 Professional      Cluster
##   NilaiBelanjaSetahun
## 1             9497927
## 2             2722700
## 3             5286429
## 4             5204498
## 5            10615206
## 6             5215541


#Menyajikan informasi tiap kolom dataset dalam format yang compact
str(dataset_raw)
## 'data.frame':    50 obs. of  7 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: int  9497927 2722700 5286429 5204498 10615206 5215541 9837260 5223569 5993218 5257448 ...

Dari data diatas dapat kita ketahui jumlah baris data ada 50 baris yang terdiri dari 7 column yaitu Customer_ID, Nama.Pelanggan, Jenis.Kelamin, Umur, Profesi, Tipe.Residen, NilaiBelanjaSetahun


#Cek nilai null
is.null(dataset_raw)
## [1] FALSE

Dari hasil diatas kita dapat mengetahui bahwa dataset tidak memiliki nilai null



Konversi Data dari chr ke int
Seperti yang kita lihat diatas ada beberapa kolom yang tipe datanya masih chr alias berupa tipe kategorik berupa text.Untuk menggunakan algoritma K-Mean Clustering kita harus merubah tipe data kategori yang berupa teks menjad numerik, hal ini karena algoritma tsb hanya bisa memproses data bertipe numerik. Disini kita akan merubah tipe data dari kolom “Jenis.Kelamin”, “Profesi”, “Tipe.Residen” menjadi numerik menggunakan fungsi data.matrix

#Konversi Data dengan data.matrix
pelanggan_matrix <- data.matrix(dataset_raw[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
#tampilkan 6 data teratas
head(pelanggan_matrix)
##      Jenis.Kelamin Profesi Tipe.Residen
## [1,]             1       5            2
## [2,]             2       3            1
## [3,]             1       4            1
## [4,]             1       4            1
## [5,]             2       5            1
## [6,]             2       4            1

Jika kita lihat diatas data sudah berhasil di convert ke bentuk numerik



Menggabungkan Hasil Konversi

# Penggabungan data
dataset_raw <- data.frame(dataset_raw, pelanggan_matrix)

# Tampilkan kembali data hasil penggabungan
# tampilkan 6 data teratas
head(dataset_raw)
##   Customer_ID      Nama.Pelanggan Jenis.Kelamin Umur      Profesi Tipe.Residen
## 1    CUST-001        Budi Anggara          Pria   58   Wiraswasta       Sector
## 2    CUST-002    Shirley Ratuwati        Wanita   14      Pelajar      Cluster
## 3    CUST-003        Agus Cahyono          Pria   48 Professional      Cluster
## 4    CUST-004    Antonius Winarta          Pria   53 Professional      Cluster
## 5    CUST-005 Ibu Sri Wahyuni, IR        Wanita   41   Wiraswasta      Cluster
## 6    CUST-006     Rosalina Kurnia        Wanita   24 Professional      Cluster
##   NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1 Tipe.Residen.1
## 1             9497927               1         5              2
## 2             2722700               2         3              1
## 3             5286429               1         4              1
## 4             5204498               1         4              1
## 5            10615206               2         5              1
## 6             5215541               2         4              1

penggabungan ini akan menambahkan kolom bernama “Jenis.Kelamin.1”, “Profesi.1”, dan “Tipe.Residen.1”



Menormalisasikan Nilai Belanja

#kita cek nilai dari column "NilaiBelanjaSetahun"
cek_NilaiBelanjaSetahun = dataset_raw[c("NilaiBelanjaSetahun")]
head(cek_NilaiBelanjaSetahun)
##   NilaiBelanjaSetahun
## 1             9497927
## 2             2722700
## 3             5286429
## 4             5204498
## 5            10615206
## 6             5215541

Dapat dilihat diatas nominal dari column “NilaiBelanjaSetahun” berkisar jutaan yang mana ini harus dilakukan normalisasi hal ini karena nilai pada column lain yaitu column “Jenis.Kelamin.1”, “Profesi.1”, dan “Tipe.Residen.1” hanya bernilai satuan. Hal ini menunjukkan column “NilaiBelanjaSetahun” ini berada pada skala yang sangat jauh berbeda. Sehingga bisa dikatakan bahwa data tidak seimbang.

Ketika membangun sebuah model, seperti regresi linear, atau pun k-means ini column “NilaiBelanjaSetahun” akan sangat mempengaruhi prediksi dari model karena nilainya yang jauh lebih besar daripada column lainnya, walaupun bukan berarti column “NilaiBelanjaSetahun” jauh lebih penting dari column lainnya tersebut. Solusinya, kita bisa menerapkan normalization untuk menyeimbangkan data.

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

#kita cek nilai dari column "NilaiBelanjaSetahun"
cek_NilaiBelanjaSetahun = dataset_raw[c("NilaiBelanjaSetahun")]
head(cek_NilaiBelanjaSetahun)
##   NilaiBelanjaSetahun
## 1            9.497927
## 2            2.722700
## 3            5.286429
## 4            5.204498
## 5           10.615206
## 6            5.215541

Dapat kita lihat nilai hasil normalisasi pada column “NilaiBelanjaSetahun” sudah menjadi jauh lebih kecil dan sudah seimbang dengan data numerik pada column “Jenis.Kelamin.1”, “Profesi.1”, dan “Tipe.Residen.1”



Membuat Data Master
Data ringkas dan unik ini untuk selanjutnya kita sebut sebagai data referensi atau data master.

#Membuat Data Master
Profesi <- unique(dataset_raw[c("Profesi","Profesi.1")])
Profesi
##             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 dan 31 yang terdapat di bagian paling kiri. Ini menunjukkan posisi baris ditemukannya teks tersebut. untuk column yang lain juga sama

Jenis.Kelamin <- unique(dataset_raw[c("Jenis.Kelamin","Jenis.Kelamin.1")])
Jenis.Kelamin
##   Jenis.Kelamin Jenis.Kelamin.1
## 1          Pria               1
## 2        Wanita               2
Tipe.Residen <- unique(dataset_raw[c("Tipe.Residen","Tipe.Residen.1")])
Tipe.Residen
##   Tipe.Residen Tipe.Residen.1
## 1       Sector              2
## 2      Cluster              1



Fungsi kmeans
Sebelum masuk ke coding. disini saya akan jelaskan lebih dalam tentang K-means clustering

perlu mendefinisikan jumlah centroid (K) yang diinginkan
semisalnya kita menetapkan jumlah K = 3; maka pada awal iterasi, algorithm akan secara random menentukan 3 centroid. Setelah itu, objek/sample/data point yang lain akan dikelompokkan sebagai anggota dari salah satu centroid yang terdekat, sehingga terbentuk 3 cluster data. Clustering yang baik adalah cluster yang data point-nya saling rapat/sangat berdekatan satu sama lain dan cukup berjauhan dengan objek/data point di cluster yang lain

Penjelasan beberapa variable dan fungsi yang digunakan
x: data yang digunakan, dimana semua isi datanya harus berupa numerik.
centers: jumlah cluster yang diinginkan
nstart: 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.
function seet.seed : Ini berguna agar kita “menyeragamkan” daftar nilai acak yang sama dari kmeans sehingga kita mendapatkan output yang sama.

#mendefinisikan column yang digunakan dalam algoritma k-means
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
# Bagian K-Means misal kita coba untuk 5 cluster
set.seed(100)
segmentasi <- kmeans(x=dataset_raw[field_yang_digunakan], centers=5, nstart=25)
#cek hasil clustering
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"

Mungkin banyak yang bingung maksud dari output dari variable segmentasi diatas. Baik saya akan jelaskan perbagian

K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10
bagian tersebut menunjukkan Ukuran / jumlah titik data pada tiap cluster, Ini artinya dengan k-means kita telah membagi dataset pelanggan dengan 5 cluster, dimana: Cluster ke-1 memiliki 14 data, Cluster ke-2 memiliki 5 data, Cluster ke-3 memiliki 9 data, Cluster ke-4 memiliki 12 data, Cluster ke-5 memiliki 10 data

Cluster means:
bagian tersebut menunjukkan Nilai rata-rata (centroid) dari tiap cluster. yang berisi angka 1 sampai dengan 5 adalah mewakili nomor cluster.

kolom ke 1, Kolom pertama Kolom Kelamin.1 menunjukkan nilai rata-rata dari data jenis kelamin yang telah dikonversi menjadi numerik, dengan angka 1 mewakili Pria dan angka 2 mewakili wanita. jika kita lihat pada cluster 1 nilanya 1.40 itu artinya pada cluster lebih didominasi jenis kelamin laki-laki

kolom ke 2, Kolom Umur adalah representasi dari dataset awal tanpa mengalami konversi. Terlihat untuk cluster ke-1 umur rata-rata adalah 61 tahun, umur 31 tahun untuk cluster ke-2, dan seterusnya.

kolom ke 3, Kolom Profesi.1 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 ke 4, Kolom Tipe.Residen.1 menunjukkan representasi data Tipe.Residen yang telah dikonversi menjadi numerik dengan angka 1 mewakili Cluster dan 2 mewakili Sector. Ini juga didapatkan dari hasil konversi data menjadi numerik pada praktek sebelumnya. Untuk seluruh cluster, terlihat data cukup tersebar antara Sector dan Cluster terutama untuk cluster ke-4 dimana nilai kolom ini di angka 1.555.

kolom ke 5, kolom NilaiBelanjaSetahun cukup signifikan pembagiannya untuk tiap cluster. Cluster ke-1 dan ke-4 memiliki nilai belanja lebih tinggi dibandingkan ketiga cluster lainnya.

Clustering vector:
Pembagian cluster dari tiap elemen data berdasarkan posisinya, Vector ini dimulai dari angka 1, yang artinya data pertama dari dataset kita akan dialokasikan pada nomor cluster 1 dst

Within cluster sum of squares by cluster:
Jumlah jarak kuadrat dari tiap titik ke centroidnya. Ini adalah metrik yang bisa kita gunakan untuk menjawab seberapa baik jumlah cluster yang kita bentuk? Apakah dibagi 2, 5, 10 atau 30?. Clustering yang ideal adalah yang jumlah SSE paling kecil dan jumlah Cluster yang kecil

sum of squares (SS) / Sum of Squared Errors (SSE) adalah jumlah “jarak kuadrat” perbedaan tiap titik data dengan mean atau centroidnya. Semakin besar nilai SS menyatakan semakin lebarnya perbedaan antar tiap titik data di dalam cluster tersebut.Nilai 58.21123 adalah SS untuk cluster ke-1, 174.85164 adalah SS untuk cluste ke-2, dan seterusnya. Semakin kecil nilainya berpotensi semakin baik.
rumus SSE = Σ(yi-centroid tiap cluster)²
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. Semakin kecil nilainya berpotensi semakin baik.
between_SS adalah total_SS dikurangi dengan jumlah nilai SS seluruh cluster.
(between_SS / total_SS) adalah rasio antara between_SS dibagi dengan total_SS. Semakin besar persentasenya, umumnya semakin baik.
Nilai 92.4% adalah nilai persentase rasio antara between_SS dan total_SS

Clustering vector:
Merupakan informasi tentang Komponen informasi lain yang terkandung di dalam objek kmeans ini(segmentasi$withinssr)

DIATAS TADI ADALAH NILAI JIKA KITA MENGGUNAKAN NILAI CENTERS = 5, SEKARANG KITA COBA BANDINGKAN JIKA NILAI CENTERS = 2

#mendefinisikan column yang digunakan dalam algoritma k-means
field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
# Bagian K-Means misal kita coba untuk 5 cluster
set.seed(100)
segmentasi2 <- kmeans(x=dataset_raw[field_yang_digunakan], centers=2, nstart=25)
#cek hasil clustering
segmentasi2
## 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"

bisa dilihat niali SSE per cluster sekarang jauh lebih tinggi dan rasio antara between_SS dan total_SS semakin mengecil hal ini umum terjadi karena jika jumlah cluster semakin banyak maka nilai SSE nya juga semakin kecil . Tapi clustering yang optimal adalah yang memiliki Jumlah cluster paling sedikit dengan nilai SSE yang besar hal tersebut dapat kita ketahui dengan menerapkan elbow effect yang mana akan kita bahas setelah ini

Simulasi Jumlah Cluster dan SS

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

Penjelasan
tot.withinss = total nilai dari withinss merupakan Total penjumlahan dari tiap SS dari withinss withinss = Total Sum of Squares per cluster, misal pada centers=5 diatas nilai ss nya untuk tiap cluster itu disebut withinss yaitu 58.21123, 174.85164, 316.73367, 171.67372, 108.49735 jika semua nilai itu dijumlahkan akan menjadi nilai dari tot.withinss = 829.9676

maksud kode Simulasi Jumlah Cluster dan SS diatas adalah merupakan nilai tot.withinss untuk setiap nilai centers antara nilai centers 1 sampai 10 yang mana nilai nya kita gunakan untuk membuat grafik agar kita dapat melihak elbow effect nya

Grafik Elbow Effect

#pertama kita import library ggplot2 untuk membuat grafiknya
library(ggplot2)
#membuat grafik agar kita dapat melihat elbow effectnya
set.seed(100)
sse <- sapply(1:10, function(param_k){kmeans(dataset_raw[field_yang_digunakan], param_k, nstart=25)$tot.withinss})

jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ggplot(ssdata, aes(x=cluster,y=sse)) +
                geom_line(color="red") + geom_point() +
                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()`?

memilih jumlah cluster yang terletak pada “elbow” dalam SSE plot, yaitu ketika nilai SSE mulai menurun secara perlahan. Jika dilihat pada gambar maka jumlah cluster yang optimal adalah K = 5.



Menamakan Segmen
kita akan menamakan segmen sesuai dengan karakteristiknya

#cek hasil segmentasi yang optimal yaitu centers=5
segmentasi$center
##   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
#menamakan segmen
Segmen.Pelanggan <- data.frame(cluster = c(1,2,3,4,5),
                               Nama.Segmen = c("Silver Youth Gals", "Diamond Senior Member", 
                                               "Gold Young Professional", "Diamond Professional", 
                                               "Silver Mid Professional"))

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.

Menggabungkan Referensi semuanya digabungkan di satu variable dengan tipe list, dan ini akan jadi model kita yang dapat disimpan ke dalam file dan digunakan ketika diperlukan

#membentuk suatu model
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) 
#Menyimpan Objek dalam Bentuk File
#File ini kemudian dapat dibuka kembali sebagai objek ke depannya
saveRDS(Identitas.Cluster, "cluster.rds")

jadi hasil coding Identitas.Cluster diatas akan menghasilkan variabel Segmen.Pelanggan yang berisi data master dari profesi, jenis.kelamin,tipe.residen, segmentasi, segmen.pelanggan, field_yang_digunakan. yang mana memiliki semua aset yang diperlukan untuk mengalokasikan data baru ke segmen yang sesuai alias anda sudah membentuk suatu model. Model ini adalah objek yang bisa digunakan untuk mengolah data baru dan terdiri dari objek kmeans, variable referensi hasil konversi teks ke numerik, dan juga penamaan cluster.

objek hasil pengolahan algoritma K-Means dan variable-variable terkait yang kita hasilkan sebelumnya harus dapat digunakan ke kasus riil sehingga satu siklus lengkap terjadi. Kasus riil untuk clustering kita adalah cukup sederhana: bagaimana data baru dapat otomatis membantu tim marketing dan CRM untuk mengidentifikasi segmen mana pelanggan tersebut berada dengan cepat. Dengan kecepatan identifikasi, maka organisasi atau bisnis dapat dengan cepat bergerak dengan pesan marketing yang efektif dan memenangkan persaingan.

Menerapkan hasil model pada kasus rill

Data Baru Disini model clustering k-means kita coba untuk mengclussterkan data baru

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



Memuat Objek Clustering dari File

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

Merge dengan Data Referensi
digunakan untuk menggabungkan data baru ini untuk mendapatkan konversi numerik dari field Jenis.Kelamin, Profesi dan Tipe.Residen

# 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



Menentukan Cluster

# menentukan data baru di cluster mana
which.min(sapply(1:5, 
                 function(x) 
                   sum((databaru[Identitas.Cluster$field_yang_digunakan] - 
                          Identitas.Cluster$Segmentasi$centers[x,])^2)))
## [1] 3
Identitas.Cluster$Segmen.Pelanggan[which.min(sapply(1:5,
                                                    function(x) 
                                                      sum((databaru[Identitas.Cluster$field_yang_digunakan] -
                                                             Identitas.Cluster$Segmentasi$centers[x,])^2))),]
##   cluster             Nama.Segmen
## 3       3 Gold Young Professional

min: merupakan function untuk mencari nilai minimum
1:5 : adalah range nomor cluster dari 1 sampai dengan 5 (atau lebih sesuai dengan ukuran cluster)
sapply: digunakan untuk melakukan iterasi berdasarkan range (dalam kasus ini 1 s/d 5)
function(x): digunakan untuk proses dengan x diisi 1 s/d 5 per proses
(data[kolom] – objekkmeans$centers[x,]) ^2: adalah jarak kuadrat data. Ingat centers adalah komponen dari objek kmeans.
sum: digunakan untuk menjumlahkan jarak kuadrat



Praktek terakhir menunjukkan bagaimana data pelanggan baru dianalisa oleh model kita dan mengeluarkan nomor cluster atau segmen. Dari hasil diatas databaru di masukkan ke clusster 3 pada segment Gold Young Professional