Data Science Project (Marketing): Customer Segmentation (K-Means Method) using Rstudio — DQLab

Muhamad Zain
11 min readJun 17, 2024

--

PENGANTAR

Customer segmentation adalah proses membagi basis pelanggan perusahaan ke dalam kelompok-kelompok yang lebih kecil berdasarkan karakteristik yang serupa. Tujuan dari segmentasi pelanggan adalah untuk memahami lebih baik kebutuhan dan preferensi pelanggan sehingga perusahaan dapat menargetkan strategi pemasaran, penjualan, dan layanan mereka dengan lebih efektif.

Kriteria Segmentasi Pelanggan

  1. Demografis: Usia, jenis kelamin, pendapatan, pendidikan, status pernikahan, dll.
  2. Geografis: Lokasi, seperti negara, wilayah, kota, atau kode pos.
  3. Psikografis: Gaya hidup, kepribadian, nilai-nilai, dan minat.
  4. Behavioral: Pola perilaku, seperti kebiasaan membeli, penggunaan produk, loyalitas, dan respons terhadap kampanye pemasaran.
  5. Firmografis: Untuk B2B, karakteristik perusahaan seperti industri, ukuran perusahaan, pendapatan, dan lokasi.

DATA PREPARATION

DATASET

Dataset yang digunakan adalah data customer. Data tersebut memiliki tujuh kolom dengan type sebagai berikut:

> pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t")
> head(pelanggan,10)
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
Tipe.Residen NilaiBelanjaSetahun
1 Sector 9497927
2 Cluster 2722700
3 Cluster 5286429
4 Cluster 5204498
5 Cluster 10615206
6 Cluster 5215541
7 Sector 9837260
8 Cluster 5223569
9 Sector 5993218
10 Cluster 5257448
> is.data.frame(pelanggan)
[1] TRUE
  • Customer_ID: Berisi kode pelanggan dengan format campuran (teks diikuti angka)
  • Nama Pelanggan: Berisi nama pelanggan dengan format teks.
  • Jenis Kelamin : Berisi jenis kelamin dari pelanggan.
  • Umur : Berisi umur pelanggan dalam format angka.
  • Profesi : Berisi profesi pelanggan dalam format teks kategori.
  • Tipe Residen : Berisi tipe tempat tinggal dari pelanggan.
  • Nilai Belanja Setahun : Berisi nilai belanja dalam satu tahun dalam format angka.

Akan mencoba mencari jumlah segmentasi yang paling optimal dimana antar tiap data pelanggan dalam segmen memiliki kemiripan tinggi.

DATA CLEANING

Membuat vector bernama field_yang_digunakan yang diisi dengan 3 kolom yaitu “Jenis.Kelamin”, “Umur” dan “Profesi”.

> field_yang_digunakan <- c("Jenis.Kelamin","Umur","Profesi")
> 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

Kolom “Jenis.Kelamin”, “Profesi” dan “Tipe.Residen” merupakan kolom dengan type data text akan dikonversi menjadi type data kategori (numerik) untuk keperluan analisis.

> pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
> head(pelanggan_matrix,5)
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

Dengan fungsi data.matrix merubah text menjadi numerik berdasarkan alphabetic ascending.

Menggabungkan hasil konversi dengan sebelum konversi akan memudahkan untuk membaca data sekaligus dapat mengenali data baru yang ada masuk ke segment yang mana.

> pelanggan <- data.frame(pelanggan, pelanggan_matrix)
> head(pelanggan,5)
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
Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1
1 Sector 9497927 1 5
2 Cluster 2722700 2 3
3 Cluster 5286429 1 4
4 Cluster 5204498 1 4
5 Cluster 10615206 2 5
Tipe.Residen.1 Jenis.Kelamin.2 Profesi.2 Tipe.Residen.2
1 2 1 5 2
2 1 2 3 1
3 1 1 4 1
4 1 1 4 1
5 1 2 5 1

Untuk mengetahui lebih jelas hasil konversi data text menjadi data numerik, bisa menggunakan fungsi unique.

> Profesi <- unique(pelanggan[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
> Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])
> Jenis.Kelamin
Jenis.Kelamin Jenis.Kelamin.1
1 Pria 1
2 Wanita 2
> Tipe.Profesi <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])
> Tipe.Profesi
Tipe.Residen Tipe.Residen.1
1 Sector 2
2 Cluster 1

Kolom NilaiBelanjaSetahun, terlihat datanya bernilai jutaan, berbeda dengan kolom-kolom lainnya yang bernilai satuan hingga puluhan. Jika kolom ini digunakan untuk clustering, perhitungan sum of squared errorsnya akan menjadi sangat besar dan akan menjadi sangat bias.

Maka perlu dinormalisasikan supaya tidak terlalu bias dan lebih sederhana dan mudah dicerna. Ada banyak cara untuk melakukan normalisasi. Pada kasus ini hanya perlu membaginya denga 1000000 sehingga isi kolom yang bernilai jutaan dikonversi menjadi puluhan.

> pelanggan$NilaiBelanjaSetahun <- (pelanggan$NilaiBelanjaSetahun)/1000000
> pelanggan$NilaiBelanjaSetahun
[1] 9.497927 2.722700 5.286429 5.204498 10.615206 5.215541
[7] 9.837260 5.223569 5.993218 5.257448 5.987367 5.941914
[13] 9.333168 9.471615 10.365668 5.262521 5.677762 5.340690
[19] 10.884508 2.896845 9.222070 5.298157 5.239290 10.259572
[25] 10.721998 5.269392 9.114159 6.631680 5.271845 5.020976
[31] 3.042773 10.663179 3.047926 9.759822 5.962575 9.678994
[37] 5.972787 10.477127 5.257775 2.861855 6.820976 9.880607
[43] 5.268410 9.339737 5.211041 10.099807 6.130724 10.390732
[49] 4.992585 10.569316

Membuat vector bernama field_yang_digunakan yang diisi dengan 5 kolom yaitu “Jenis.Kelamin.1” (type numerik), “Umur”, “Profesi.1” (type numerik), “Tipe.Residen.1” (type numerik), dan NilaiBelanjaSetahun.

> field_yang_digunakan = c("Jenis.Kelamin.1", "Umur", "Profesi.1", "Tipe.Residen.1","NilaiBelanjaSetahun")
> field_yang_digunakan
[1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
[4] "Tipe.Residen.1" "NilaiBelanjaSetahun"

METHOD (K-Means)

K-Means adalah salah satu algoritma clustering yang paling populer dalam machine learning (unsupervised) yang tidak memerlukan data label. Tujuannya adalah untuk membagi data ke dalam k-kelompok (clusters) berdasarkan rata-rata titik data dalam setiap cluster dan fitur-fitur yang ada sehingga data dalam setiap cluster lebih mirip satu sama lain dibandingkan dengan data di cluster lain. Istilah “means” dalam K-Means mengacu pada “rata-rata” atau “mean”.

Function k-means memerlukan minimal 2 parameter, yaitu:

· x : data yang digunakan (numerik).

· centers: jumlah cluster yang diinginkan.

Fungsi seet.seed() digunakan supaya mengeluarkan daftar nilai acak yang sama sehingga bisa mendapatkan output yang sama juga.

selain dua parameter diatas dapat juga menambahkan parameter ketiga, yaitu nstart. nstart merupakan jumlah kombinasi acak yang dihasilkan secara internal oleh R. Akan membuat model k-means dengan 5 clusters dan 25 kombinasi acak.

> #K-Means
> set.seed(100)
> segmentasi <- kmeans(x=pelanggan[field_yang_digunakan], centers=5, nstart=25)
> segmentasi
K-means clustering with 5 clusters of sizes 5, 12, 14, 9, 10

Cluster means:
Jenis.Kelamin.1 Umur Profesi.1 Tipe.Residen.1
1 1.40 61.80000 4.200000 1.400000
2 1.75 31.58333 3.916667 1.250000
3 2.00 20.07143 3.571429 1.357143
4 2.00 42.33333 4.000000 1.555556
5 1.70 52.50000 3.800000 1.300000
NilaiBelanjaSetahun
1 8.696132
2 7.330958
3 5.901089
4 8.804791
5 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
[33] 3 3 4 2 3 4 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"
[5] "tot.withinss" "betweenss" "size" "iter"
[9] "ifault"

Ini artinya membagi data pelanggan berdasarkan Jenis Keamin, Umur, Profesi, Tipe Residen dan NilaiBelanjaSetahun menjadi 5 segmen.

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

  1. K-means clustering with 5 cluster of sizes : ukuran / jumlah titik data pada tiap cluster
  • Cluster ke-1 memiliki 5 data
  • Cluster ke-2 memiliki 12 data
  • Cluster ke-3 memiliki 14 data
  • Cluster ke-4 memiliki 9 data
  • Cluster ke-5 memiliki 10 data

2. Cluster means : nilai rata-rata (centroid) dari tiap cluster

Kolom Jenis.Kelamin.1 menunjukkan nilai rata-rata dari data jenis kelamin yang telah dikonversi menjadi numerik, dengan angka 1 mewakili Pria dan angka 2 mewakili wanita. Pada cluster 3 dan 4 terlihat bahwa hanya ada angka 2, artinya cluster tersebut hanya berisi data dengan profil berjenis kelamin wanita. Untuk cluster 1 berupa angka 1.4 artinya data bersifat campuran namun cenderung ke Pria (1).

3. Clustering vector : pembagian cluster dari tiap elemen data berdasarkan posisinya

Vector tersebut dimulai dari angka 1, artinya data pertama dari dataset kita akan dialokasikan pada cluster nomor 1. Isi vector kedua bernilai 3, ini artinya data kedua dari dataset kita akan dialokasikan pada cluster nomor 3, dan seterusnya.

4. Within cluster sum of squares by cluster (SSE) : jumlah jarak kuadrat dari tiap titik ke centroid

  • Nilai 58.21123 adalah SS untuk cluster ke-1, 174.85164 adalah SS untuk cluster ke-2, dan seterusnya. Semakin kecil nilainya semakin baik.
  • 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.
  • 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 semakin baik. Pada model ini didapat persentase sebesar 92.4%. Model yang sudah dibuat dapat di adjust parameternya untuk mendapatkan model terbaik dengan persentase yang besar. Rumus: segmentasi$betweenss / segmentasi$totss

5. Available componets : komponen informasi lain yang terkandung di dalam objek k-means

Langkah terakhir adalah menambahkan hasil segmentasi ini ke data asal dengan membuat kolom baru di variabel pelanggan yang isinya dari segmentasi$cluster.

> pelanggan$cluster <- segmentasi$cluster
> head(pelanggan,5)
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
Tipe.Residen NilaiBelanjaSetahun Jenis.Kelamin.1 Profesi.1
1 Sector 9.497927 1 5
2 Cluster 2.722700 2 3
3 Cluster 5.286429 1 4
4 Cluster 5.204498 1 4
5 Cluster 10.615206 2 5
Tipe.Residen.1 cluster
1 2 2
2 1 5
3 1 1
4 1 1
5 1 4

Menentukan Jumlah Cluster Terbaik

Sum of Squared Errors (SSE) dapat dijadikan dasar menentukan jumlah cluster yang paling optimal. Secara teoritis, berikut adalah beberapa hal yang bisa kita amati dengan SS:

  • Semakin sedikit jumlah cluster, maka semakin besar nilai SSE dan sebaliknya.
  • Karena sifatnya kuadratik, jika terdapat perbedaan yang cukup signifikan antara tiap kombinasi cluster, maka perbedaan nilai SSE akan semakin besar.
  • Seiring bertambahnya jumlah cluster, perbedaan tiap SS ini akan semakin kecil.

GRAFIK ELBOW

Grafik elbow digunakan sebagai dasar justifikasi dalam menentukan jumlah cluster menggunakan SSE, atau lebih tepatnya komponen tot.withinss dari objek k-means. Metrik ini akan dicari progresif nilai tot.withinss untuk tiap kombinasi jumlah cluster, dan disimpan dalam bentuk vektor di R.

Akan menggunakan fungsi sapply untuk mengeluarkan nilai SSE pada range cluster tertentu. Fungsi sapply adalah fungsi vector dari keluarga apply yang memungkinkan untuk mengulangi list atau vector tanpa perlu membuat for loop.

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
[6] 625.1462 508.1568 431.6977 374.1095 317.9424

Visualisasikan vector SSE yang sudah diasilkan dengan menggunakan ggplot.

library(ggplot2)
jumlah_cluster_max <- 10

ssdata = data.frame(cluster=c(1:jumlah_cluster_max),sse)
ssdata

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

Untuk menentukan titik Elbow yaitu cari titik di mana penurunan SSE mulai melambat, yang sering disebut sebagai “elbow” atau siku. Titik ini menunjukkan jumlah cluster yang optimal. Pada grafik elbow diatas titik mulai melambat pada cluster ke-4 atau ke-5.

Tahapan berikutnya adalah menggabungkan seluruh referensi hasil konversi dan objek k-means ini supaya bisa digunakan untuk mengolah data baru dan berguna:

  1. Menamakan cluster dengan karakteristik yang lebih mudah dimengerti.
  • Cluster 1 = Diamond Senior Member : cluster dengan umur rata-rata adalah 61 tahun dan pembelanjaan di atas 8 juta.
  • Cluster 2 = Gold Young Professional :cluster dengan umur rata-rata adalah 31 tahun, professional dan pembelanjaan cukup besar.
  • Cluster 3 = Silver Youth Gals : cluster dengan umur rata-rata adalah 20, wanita semua, profesinya bercampur antar pelajar dan professional serta pembelanjaan sekitar 6 juta.
  • Cluster 4 = Diamond Profesional : cluster dengan umur rata-rata adalah 42 tahun, pembelanjaan paling tinggi dan semuanya professional.
  • Cluster 5 = Silver Mid Professional : cluster dengan umur rata-rata adalah 52 tahun dan pembelanjaan sekitar 6 juta.
> Segmen.Pelanggan <- data.frame(cluster=c(1,2,3,4,5),
+ Nama.Segmen=c("Silver Youth Gals",
+ "Diamond Senior Member",
+ "Gold Young Professional",
+ "Diamond Professional",
+ "Silver Mid Professional"))
> Segmen.Pelanggan
cluster Nama.Segmen
1 1 Silver Youth Gals
2 2 Diamond Senior Member
3 3 Gold Young Professional
4 4 Diamond Professional
5 5 Silver Mid Professional

2. Menggabungkan variabel segmen.pelanggan, profesi, jneis kelamin, tipe residen dan segmentasi ke dalam satu objek bertipe list ke dalam variabel 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
1 1.40 61.80000 4.200000 1.400000
2 1.75 31.58333 3.916667 1.250000
3 2.00 20.07143 3.571429 1.357143
4 2.00 42.33333 4.000000 1.555556
5 1.70 52.50000 3.800000 1.300000
NilaiBelanjaSetahun
1 8.696132
2 7.330958
3 5.901089
4 8.804791
5 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
[33] 3 3 4 2 3 4 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"
[5] "tot.withinss" "betweenss" "size" "iter"
[9] "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"

3. Menyimpan variabel identitas cluster dalam bentuk file sehingga dapat digunakan kemudian, yang dapat disebut dengan model.

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

APLIKASI MODEL

Data pelanggan baru perlu segera dipetakan ke segmen yang sesuai. Setiap kali data pelanggan baru dimasukkan ke dalam sistem, pemrosesan dilakukan per record. Akan membuat sebuah data.frame yang berisi satu data dengan nama-nama kolom yang sama persis dengan dataset awal.

> 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

Dengan adanya data baru berisi data referensi yang telah dimuat ulang, dapat menggabungkan data baru untuk mendapatkan konversi numerik dari kolom Jenis.Kelamin, Profesi, dan Tipe.Residen. Tujuannya adalah untuk menentukan segmen pelanggan berdasarkan data numerik hasil penggabungan tersebut. Cara menggabungkannya adalah dengan menggunakan fungsi merge(), di mana kedua set data akan digabungkan berdasarkan kesamaan nama dan isi kolom.

readRDS(file="cluster.rds")
> 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

Untuk menentukan data baru ini masuk ke segmen mana yaitu dengan mencari jarak kuadrat minimum atau terdekat dari kolom numerik data baru tersebut ke centroid kolom terkait dari seluruh cluster yang ada. Jarat kuadrat tersebut selanjutnya akan dicari jumlahnya dengan range cluster 1–5 .

  • min : merupakan fungsi untuk mencari nilai minimum
  • 1:5 : adalah range nomor cluster dari 1 sampai dengan 5 (atau lebih sesuai dengan ukuran cluster)
  • sapply : digunakan untuk melakukan iterasi berdasarkan range (dalam kasus ini 1 s/d 5)
  • function(x) : digunakan untuk proses dengan x diisi 1-5 per proses
  • (data[kolom] — objekkmeans$centers[x,]) ^2 : adalah jarak kuadrat data. Ingat centers adalah komponen dari objek k-means.
  • sum : digunakan untuk menjumlahkan jarak kuadrat
> 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 Silver Youth Gals

KESIMPULAN

Setelah mencoba menentukan clusternya, data baru tersebut masuk ke dalam cluster 3, yaitu Silver Youth Gals. Hal ini sesuai, mengingat usia customer dalam data baru tersebut adalah 22 tahun.

Demikian project Customer Segmentation (K-Means Method) menggunakan Rstudio. Terimakasih telah meluangkan waktu untuk membaca artikel ini. Anda bisa melihat data dan attribut lain yang saya gunakan di artikel ini pada github saya

Jangan ragu untuk menghubungi saya di Linkedin atau Email saya untuk memberikan feedback, diskusi, atau kolaborasi.
email: muhamadzain019@gmail.com
linkedin: https://www.linkedin.com/in/muhamad-nurhikmat-zain/

--

--