1 Kasus Bisnis

K-means adalah algoritma unsupervised machine learning yang digunakan untuk menemukan kelompok pengamatan (cluster) yang memiliki karakteristik serupa.

Sebuah cluster didefinisikan sebagai sekelompok pengamatan yang lebih mirip satu sama lain daripada pengamatan di kelompok lain.

Analisis cluster banyak digunakan dalam ilmu biologi, psikologi, pemasaran, dan penelitian medis. Misalnya, seorang peneliti psikologis mungkin mengelompokkan data tentang gejala dan demografi pasien depresi, berusaha mengungkap subtipe depresi. Harapannya adalah menemukan subtipe seperti itu dapat mengarah pada perawatan yang lebih bertarget dan efektif dan pemahaman yang lebih baik tentang gangguan tersebut. Peneliti pemasaran menggunakan analisis cluster sebagai strategi segmentasi pelanggan. Pelanggan diatur ke dalam kelompok berdasarkan kesamaan demografi dan perilaku pembelian mereka. Kampanye pemasaran kemudian disesuaikan untuk menarik satu atau lebih subkelompok ini.

Dua pendekatan pengelompokan paling populer adalah pengelompokan aglomeratif hierarkis dan pengelompokan partisi.

Dalam topik ini, kita akan melakukan analisis K means clustering untuk mengelompokkan konsumen.

1.1 Libraries and Setup

# chunk options
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  fig.align = "center",
  comment = "#>"
)

# scientific notation
options(scipen = 9999)
# import libs
packages<-function(x){
  x<-as.character(match.call()[[2]])
  if (!require(x,character.only=TRUE)){
    install.packages(pkgs=x,repos="http://cran.r-project.org")
    require(x,character.only=TRUE)
  }
}

packages(tidyverse) # data manipulation
packages(corrplot)
packages(gridExtra)
packages(GGally)
packages(cluster) # clustering algorithms 
packages(factoextra) # clustering algorithms & visualization

1.2 Impor Dataset

Mengimpor dataset yang akan digunakan dan memberi nama variabel

konsumen <- read.csv("konsumen.csv")
names(konsumen) <- c("tinggal", "daerah","status","usia","anak","income","medsos","tv","motor","mobil","kredit","beli",
                   "konsumsi","kerja","shopping")
konsumen

tinggal : kota tempat tinggal daerah : kategori kota (1 = kota besar, 2 = kota menengah, 3 = kota kecil) status : status pernikahan (1 = belum menikah, 2 = menikah, 3 = duda/janda) usia : usia konsumen anak : jumlah anak income : penghasilan dalam seminggu (Rp.) medsos : waktu yang dihabiskan untuk ber-medsos dalam seminggu (jam) tv : waktu yang dihabiskan untuk menonton televisi dalam seminggu (jam) motor : jumlah motor yang dimiliki mobil : jumlah mobil yang dimiliki kredit : jumlah kartu kredit yang dimiliki beli : jumlah barang yang dibeli dalam sebulan kerja : jam kerja selama seminggu shopping: waktu yang dihabiskan untuk belanja dalam seminggu (jam)

Membuang variabel yang tidak dipakai

konsumen<-konsumen %>% 
  select(-c("tinggal","daerah","status"))
konsumen

Kita dapat melihat bahwa semua variabel baik numerik maupun integer, oleh karena itu kita dapat menggunakan variabel-variabel tersebut di sini. Tetapi selalu disarankan untuk menggunakan hanya variabel yang relevan untuk analisis Cluster.

Mari kita visualisasikan variabel yang tersedia dalam data. Plot histogram dari setiap atribut.

konsumen %>%
  gather(attributes, value, 1:10) %>%
  ggplot(aes(x = value)) +
  geom_histogram(fill = 'lightblue2', color = 'black') +
  facet_wrap(~attributes, scales = 'free_x') +
  labs(x="Values", y="Frequency") +
  theme_bw()

2 Hubungan Antar Variabel

Mari kita buat matriks korelasi untuk memahami hubungan antara setiap atribut

corrplot(cor(konsumen), type = 'upper', method = 'number', tl.cex = 0.9)

Dari visualisasi korelasi antar variabel, terlihat ada beberapa variabel yang memiliki korelasi yang cukup tinggi. Kita akan melihat hubungan linear variabel-variabel yang memiliki korelasi yang kuat antara lain:

  1. jam kerja dengan kegiatan shopping
ggplot(konsumen, aes(x = kerja, y = shopping)) +
  geom_point() +
  geom_smooth(method = 'lm', se = FALSE) +
  theme_bw()

  1. jam kerja dengan jumlah kartu kredit yang dimiliki
ggplot(konsumen, aes(x = kerja, y = kredit)) +
  geom_point() +
  geom_smooth(method = 'lm', se = FALSE) +
  theme_bw()

3. jumlah kartu kredit dengan kegiatan shopping

ggplot(konsumen, aes(x = kredit, y = shopping)) +
  geom_point() +
  geom_smooth(method = 'lm', se = FALSE) +
  theme_bw()

  1. jumlah penghasilan dengan jumlah konsumsi
ggplot(konsumen, aes(x = income, y = konsumsi)) +
  geom_point() +
  geom_smooth(method = 'lm', se = FALSE) +
  theme_bw()

3 Analisis Kluster

Mari kita siapkan data kita untuk melakukan K means clustering

Dari ringkasan data, kita telah melihat bahwa ada variabel yang berada pada skala yang berbeda, kita perlu menskalakan data atau menormalkannya. Kita bisa menormalkan data menggunakan mean dan standar deviasi, juga kita bisa menggunakan fungsi skala untuk menormalkan data kita.

konsumen_n <- as.data.frame(scale(konsumen))
head(konsumen_n)

Kita akan mencoba untuk membuat dua kluster (k = 2) terlebih dahulu

set.seed(123)

konsumen_C2 <- kmeans(konsumen_n, centers = 2, nstart = 25)
print(konsumen_C2)
#> K-means clustering with 2 clusters of sizes 43, 17
#> 
#> Cluster means:
#>         usia        anak     income     medsos            tv      motor
#> 1 -0.2135845 -0.04402593 -0.5231439 -0.4262414  0.0002161682 -0.3715613
#> 2  0.5402431  0.11135970  1.3232464  1.0781399 -0.0005467783  0.9398316
#>        mobil     kredit       beli   konsumsi      kerja   shopping
#> 1 -0.3723534 -0.4677665 -0.4486462 -0.5127535 -0.4622667 -0.4442459
#> 2  0.9418351  1.1831742  1.1348109  1.2969647  1.1692627  1.1236808
#> 
#> Clustering vector:
#>  [1] 2 2 1 2 1 1 1 1 1 1 1 1 2 2 2 1 1 1 2 2 2 2 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1
#> [39] 1 1 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 1
#> 
#> Within cluster sum of squares by cluster:
#> [1] 268.2414 155.4012
#>  (between_SS / total_SS =  40.2 %)
#> 
#> Available components:
#> 
#> [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
#> [6] "betweenss"    "size"         "iter"         "ifault"

Kita akan memvisualisasikan data dan hasil. Berikut adalah hasil visualisasi kluster yang telah kita buat.

fviz_cluster(konsumen_C2, data = konsumen_n)

3.1 Membuat Beberapa Kluster

Kita akan mencoba beberapa kluster yaitu kluster k = 3, k = 4, dan k = 5

konsumen_C3 <- kmeans(konsumen_n, centers = 3, nstart = 25)
konsumen_C4 <- kmeans(konsumen_n, centers = 4, nstart = 25)
konsumen_C5 <- kmeans(konsumen_n, centers = 5, nstart = 25)
p1 <- fviz_cluster(konsumen_C2, geom = "point", data = konsumen_n) + ggtitle(" K = 2")
p2 <- fviz_cluster(konsumen_C3, geom = "point", data = konsumen_n) + ggtitle(" K = 3")
p3 <- fviz_cluster(konsumen_C4, geom = "point", data = konsumen_n) + ggtitle(" K = 4")
p4 <- fviz_cluster(konsumen_C5, geom = "point", data = konsumen_n) + ggtitle(" K = 5")

grid.arrange(p1, p2, p3, p4, nrow = 2)

3.2 Membuat Beberapa Kluster

Pengelompokan K-means mengharuskan kita menentukan terlebih dahulu jumlah kluster yang akan diekstrak. Plot dari total jumlah dalam grup terhadap jumlah cluster dalam metode k-means dapat membantu. Sebuah lengkungan pada grafik dapat menunjukkan jumlah cluster yang sesuai.

Di bawah ini adalah metode untuk menentukan jumlah cluster yang optimal antara lain: Elbow method, Silhouette method, Gap statistic

3.2.1 Elbow Method

Berikut adalah hasil dari elbow method

# Determining Optimal clusters (k) Using Elbow method
fviz_nbclust(x = konsumen_n,FUNcluster = kmeans, method = 'wss' )

Terlihat dari grafik, titik belok ketika jumlah kluster sama dengan 3 (k = 3)

3.2.2 Silhouette Method

Berikut adalah hasil dari elbow method

# Determining Optimal clusters (k) Using Average Silhouette Method

fviz_nbclust(x = konsumen_n,FUNcluster = kmeans, method = 'silhouette' )

Terlihat dari grafik, titik belok ketika jumlah kluster sama dengan 2 (k = 2)

3.2.3 Gap statistic

Berikut adalah hasil dari gap statistic

# compute gap statistic
set.seed(123)
gap_stat <- clusGap(x = konsumen_n, FUN = kmeans, K.max = 15, nstart = 25, B = 50 )
fviz_gap_stat(gap_stat)

Terlihat dari grafik, titik belok ketika jumlah kluster sama dengan 3 (k = 3)

4 Pembuatan Kluster Final

Dari tiga metode pemilihan jumlah kluster, dua metode merekomendasikan jumlah kluster sama dengan 3 (k = 3). Maka kita akan membuat tiga kluster

konsumen_C3 <- kmeans(konsumen_n, centers = 3, nstart = 25)
cluster_final <- fviz_cluster(konsumen_C3, data = konsumen_n)

cluster_final

Beberapa konsumen berkumpul berdasarkan kluter masing-masing. Terdapat 3 kluster yang telah terbentuk.

5 Ringkasan

K Means clustering adalah algoritma sederhana yang digunakan untuk mempartisi sejumlah observasi ke dalam beberapa cluster di mana setiap observasi termasuk dalam cluster dengan mean (rata-rata) terdekat.

Berikut ini adalah profil konsumen berdasarkan kluster:

konsumen$cluster<-konsumen_C3$cluster
head(konsumen)
konsumen %>% 
  group_by(cluster) %>% 
  summarize_all("mean")

Kelompok Konsumen 1:

Usia rata-rata adalah 29,75 tahun. Pendapatan perminggu adalah Rp. 527.500 dan konsumsi perminggu Rp. 156.500. Jam kerja perminggu adalah 30,45. Waktu yang dihabiskan adalah 5,9 jam per minggu di medsos dan 17,95 jam per minggu di TV. Jumlah kartu kredit yang dimiliki ada dua. Jumlah barang yang dibeli dalam sebulan adalah rata-rata 4 barang dan waktu yang dihabiskan untuk belanja adalah 9,5 jam seminggu.Hampir setengahnya punya mobil dan hampir seluruhnya punya motor.

Kelompok Konsumen 2:

Usia rata-rata adalah 27,83 tahun. Pendapatan perminggu adalah Rp. 312.500 dan konsumsi perminggu Rp. 94.167. Jam kerja perminggu adalah 15,41. Waktu yang dihabiskan adalah 3,9 jam per minggu di medsos dan 15,88 jam per minggu di TV. Jumlah kartu kredit yang dimiliki ada 1. Jumlah barang yang dibeli dalam sebulan adalah rata-rata 2 barang dan waktu yang dihabiskan untuk belanja adalah 6,1 jam seminggu.Hampir setengahnya punya motor dan rata-rata tidak punya mobil.

Kelompok Konsumen 3:

Usia rata-rata adalah 33,12 tahun. Pendapatan perminggu adalah Rp. 1.234.357 dan konsumsi perminggu Rp. 363.750. Jam kerja perminggu adalah 50,81. Waktu yang dihabiskan adalah 8,25 jam per minggu di medsos dan 16,25 jam per minggu di TV. Jumlah kartu kredit yang dimiliki ada tiga sampai 4. Jumlah barang yang dibeli dalam sebulan adalah rata-rata 7 barang dan waktu yang dihabiskan untuk belanja adalah 16 jam seminggu.Hampir Rata-rata semuanya punya mobil dan hampir seluruhnya punya motor lebih dari satu.