Customer Segmentation/Freepik/vectorjuice
Customer Segmentation adalah praktik membagi pelanggan perusahaan ke dalam kelompok-kelompok yang mencerminkan kesamaan di antara pelanggan di setiap kelompok.
Pengelompokkan Customer Segmentation ini umumnya terbagi ke dalam 4 kategori:
demografis
psikografis
perilaku
geografis
Pentingnya melakukan customer Segmentation ini bertujuan untuk memutuskan bagaimana berhubungan dengan pelanggan di setiap segmen untuk memaksimalkan nilai setiap pelanggan dalam berbisnis.
Berikut adalah langkah-langkah dalam melakukan customer segmentation.
pelanggan <- read.csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t")
pelanggan
pelanggan[c("Jenis.Kelamin", "Umur", "Profesi","Tipe.Residen")]
a <- c("Jenis.Kelamin", "Umur", "Profesi")
#Tampilan data pelanggan dengan nama kolom sesuai isi vector field_yang_digunakan
pelanggan[a]
pelanggan_matrix <- data.matrix(pelanggan[c("Jenis.Kelamin", "Profesi", "Tipe.Residen")])
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
[7,] 1 5 2
[8,] 1 4 1
[9,] 2 4 2
[10,] 1 4 1
[11,] 2 4 2
[12,] 2 4 2
[13,] 2 5 1
[14,] 1 5 1
[15,] 2 5 1
[16,] 1 4 1
[17,] 2 1 1
[18,] 2 1 1
[19,] 2 5 1
[20,] 2 3 2
[21,] 2 5 1
[22,] 2 4 1
[23,] 1 4 1
[24,] 2 5 1
[25,] 2 5 2
[26,] 2 4 1
[27,] 2 5 1
[28,] 2 1 1
[29,] 2 4 1
[30,] 2 1 2
[31,] 2 2 1
[32,] 2 5 2
[33,] 2 2 1
[34,] 2 5 2
[35,] 2 4 2
[36,] 2 5 1
[37,] 2 4 2
[38,] 2 5 2
[39,] 2 4 1
[40,] 2 3 2
[41,] 2 1 1
[42,] 2 5 1
[43,] 2 4 1
[44,] 2 5 1
[45,] 2 4 1
[46,] 2 5 2
[47,] 2 1 1
[48,] 2 5 2
[49,] 2 1 2
[50,] 2 5 2
pelanggan <- data.frame(pelanggan, pelanggan_matrix)
#Tampilkan kembali data hasil penggabungan
pelanggan
pelanggan$NilaiBelanjaSetahun <- pelanggan$NilaiBelanjaSetahun/1000000
pelanggan$NilaiBelanjaSetahun
[1] 9.497927 2.722700 5.286429 5.204498 10.615206 5.215541 9.837260 5.223569
[9] 5.993218 5.257448 5.987367 5.941914 9.333168 9.471615 10.365668 5.262521
[17] 5.677762 5.340690 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 3.042773 10.663179
[33] 3.047926 9.759822 5.962575 9.678994 5.972787 10.477127 5.257775 2.861855
[41] 6.820976 9.880607 5.268410 9.339737 5.211041 10.099807 6.130724 10.390732
[49] 4.992585 10.569316
untuk melihat nilai kategori dari variabel yang telah dimodifikasi
Profesi <- unique(pelanggan[c("Profesi","Profesi.1")])
Profesi
Jenis.Kelamin <- unique(pelanggan[c("Jenis.Kelamin","Jenis.Kelamin.1")])
Jenis.Kelamin
Tipe.Residen <- unique(pelanggan[c("Tipe.Residen","Tipe.Residen.1")])
Tipe.Residen
Dalam melakukan segmentasi customer ini digunakanlah penggunaan analisis clustering, dimana metode yang akan digunakan yaitu K-Means.
Kmeans adalah suatu metode yang mencoba untuk mempartisi dataset menjadi K subkelompok (cluster) non-overlapping yang berbeda yang telah ditentukan sebelumnya di mana setiap titik data hanya dimiliki oleh satu grup.
Adapun algoritma K-Means itu sendiri sebagai berikut:
#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[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], 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 3 3 3 2 2
[44] 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"
Disini dapat terlihat dari hasil yang dikeluarkan bahwa data pelanggan telah terbagi ke dalam 5 cluster.
#Penggabungan hasil cluster
segmentasi$cluster
[1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4 3 3 3 2 2
[44] 3 3 3 5 4 2 5
pelanggan$cluster <- segmentasi$cluster
str(pelanggan)
'data.frame': 50 obs. of 11 variables:
$ Customer_ID : chr "CUST-001" "CUST-002" "CUST-003" "CUST-004" ...
$ Nama.Pelanggan : chr "Budi Anggara" "Shirley Ratuwati" "Agus Cahyono" "Antonius Winarta" ...
$ Jenis.Kelamin : chr "Pria" "Wanita" "Pria" "Pria" ...
$ Umur : int 58 14 48 53 41 24 64 52 29 33 ...
$ Profesi : chr "Wiraswasta" "Pelajar" "Professional" "Professional" ...
$ Tipe.Residen : chr "Sector" "Cluster" "Cluster" "Cluster" ...
$ NilaiBelanjaSetahun: num 9.5 2.72 5.29 5.2 10.62 ...
$ Jenis.Kelamin.1 : int 1 2 1 1 2 2 1 1 2 1 ...
$ Profesi.1 : int 5 3 4 4 5 4 5 4 4 4 ...
$ Tipe.Residen.1 : int 2 1 1 1 1 1 2 1 2 1 ...
$ cluster : int 1 3 5 5 4 3 1 5 2 2 ...
pelanggan
pelanggan[which(pelanggan$cluster == 1),]
Banyaknya cluster yang terbentuk
length(which(pelanggan$cluster == 1))
[1] 5
pelanggan[which(pelanggan$cluster == 2),]
Banyaknya cluster yang terbentuk
length(which(pelanggan$cluster == 2))
[1] 12
pelanggan[which(pelanggan$cluster == 3),]
Banyaknya cluster yang terbentuk
length(which(pelanggan$cluster == 3))
[1] 14
pelanggan[which(pelanggan$cluster == 4),]
Banyaknya cluster yang terbentuk
length(which(pelanggan$cluster == 4))
[1] 9
pelanggan[which(pelanggan$cluster == 5),]
Banyaknya cluster yang terbentuk
length(which(pelanggan$cluster == 5))
[1] 10
#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 analisa hasil cluster means ini dapat terlihat bahwa hasilnya adalah sebaran kontinu. Padahal di awal sebelumnya data berdistribusi diskrit.
Meski demikian kita bisa menyimpulkan hasil di atas dengan pendekatan pembulatan, sehingga hasil yang diperoleh dapat dijelaskan.
Pada analisis ini diperoleh:
cluster 1, pada jenis kelamin memiliki kecenderungan yaitu laki-laki dengan rataan umur usia 62 tahun yang memiliki kategori profesi yaitu profesional dengan tipe residen cluster dan rataan belanja adalah 8.7 juta.
Cluster 2, pada jenis kelamin memiliki kecenderungan yaitu laki-laki dengan rataan umur usia 32 tahun yang memiliki kecenderungan kategori profesi yaitu profesional dengan tipe residen cluster dan rataan belanja adalah 7.3 juta.
Cluster 3, pada jenis kelamin yaitu Perempuan dengan rataan umur usia 20 tahun yang memiliki kecenderungan kategori profesi yaitu profesional dengan tipe residen cluster dan rataan belanja adalah 5.9 juta.
Cluster 4, pada jenis kelamin semuanya yaitu Perempuan dengan rataan umur usia 42 tahun yang berprofesi sebagai profesional dengan tipe residen sectorc dan rataan belanja adalah 8.8 juta.
Cluster 5, pada jenis kelamin memiliki kecenderungan yaitu perempuan dengan rataan umur usia 53 tahun yang memiliki kecenderungan kategori profesi yaitu profesional dengan tipe residen cluster dan rataan belanja adalah 6 juta.
Info: Sum of Square digunakan untuk melihat perbedaan tiap titik data dengan mean atau centroidnya.
Rumusannya sebagai berikut:
Semakin besar nilai SS menyatakan semakin lebarnya perbedaan antar tiap titik data di dalam cluster tersebut. Hal ini tentu tidak diinginkan dalam analisa cluster. Sehingga, kita harus memilih nilai SSE yang paling kecil.
Misalnya, disini akan dibandingkan antara cluster yang nantinya akan terbentuk 2 cluster atau 5 cluster
set.seed(100)
kmeans(x=pelanggan[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], 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 2 2 2 2 2
[44] 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[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], 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 3 3 3 2 2
[44] 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"
Hasilnya bisa kita simpulkan sebagai berikut:
| Cluster | Persentase |
|---|---|
| 2 cluster | 72.6% |
| 5 cluster | 92.4% |
Persentase adalah pembagian antara between dengan tots dengan definisi masing-masing yaitu:
Betweens didefinisikan sebagai totss-tot.withinss size: Size (jumlah anggota) dari masing-masing K cluster.
tot.withinss: Jumlah/Sum of K withinss
\(totss=\frac{1}{N} \sum_{i,i'\epsilon \{1,2,\dots N\}}\sum_{j=1}^{p} (x_{ij}-x_{i'j})^2\)
Sehingga, hasil dengan pembentukkan 5 cluster lebih baik daripada pembentukkan 2 cluster.
segmentasi$withinss
[1] 58.21123 174.85164 316.73367 171.67372 108.49735
segmentasi$cluster
[1] 1 3 5 5 4 3 1 5 2 2 5 5 1 1 3 2 2 1 2 3 4 5 2 4 2 5 2 4 5 4 3 4 3 3 4 2 3 4 3 3 3 2 2
[44] 3 3 3 5 4 2 5
segmentasi$tot.withinss
[1] 829.9676
Menjalankan fungsi Kmeans dengan beragam n-cluster (n=10)
#Bagian K-Means
field_yang_digunakan = c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")
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 508.1568
[8] 431.6977 374.1095 317.9424
library(ggplot2)
#jumlah_cluster_max <- 10
ssdata = data.frame(cluster=c(1:10),sse)
k <- ggplot(ssdata, aes(x=cluster,y=sse)) +
geom_line(color="red") + geom_point() +
ylab("Within Cluster Sum of Squares") + xlab("Jumlah Cluster") +
scale_x_discrete(limits=factor(1:10)) + ggtitle("Grafik Elbow", subtitle = "Menunjukkan perubahan nilai SSE") #geom_text(aes(label=format(round(sse, 2), nsmall = 2)),hjust=-0.2, vjust=-0.5)
ggplotly(k)
Segmen.Pelanggan <- data.frame(cluster = c(1:5),Nama.Segmen = c("Diamond Senior Member","Gold Young Professional", "Silver Youth Gals" , "Diamond Professional","Silver Mid Professional"))
Segmen.Pelanggan
#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
$Jenis.Kelamin
$Tipe.Residen
$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
[37] 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
$field_yang_digunakan
[1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
[4] "Tipe.Residen.1" "NilaiBelanjaSetahun"
saveRDS(Identitas.Cluster,"cluster.rds")
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
Identitas.Cluster <- readRDS(file="cluster.rds")
Identitas.Cluster
$Profesi
$Jenis.Kelamin
$Tipe.Residen
$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
[37] 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
$field_yang_digunakan
[1] "Jenis.Kelamin.1" "Umur" "Profesi.1"
[4] "Tipe.Residen.1" "NilaiBelanjaSetahun"
#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
#menentukan data baru di cluster mana
Identitas.Cluster$Segmen.Pelanggan[which.min(sapply( 1:5, function( x ) sum( ( databaru[Identitas.Cluster$field_yang_digunakan] - Identitas.Cluster$Segmentasi$centers[x,])^2 ) )),]
set.seed(100)
xe = kmeans(x=pelanggan[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], centers=5, nstart=25)
plot(x=pelanggan[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], col = xe$cluster)
library(factoextra)
fviz_cluster(xe, data =pelanggan[c("Jenis.Kelamin.1","Umur","Profesi.1","Tipe.Residen.1","NilaiBelanjaSetahun")], label=NA)+theme_bw()
Source:
https://www.optimove.com/resources/learning-center/customer-segmentation#:~:text=Customer%20segmentation%20is%20the%20practice,each%20customer%20to%20the%20business.
Connect with me:)