Learn by Building 7: Unsupervised Learning

Introduction

Salah satu jenis algoritma pada Machine Learning adalah Unsupervised Learning. Unsupervised learning adalah salah satu tipe algoritma machine learning yang digunakan untuk menarik kesimpulan dari dataset. Metode ini hanya akan mempelajari suatu data berdasarkan kedekatannya saja atau yang biasa disebut dengan clustering.

1. Pengertian

Pada algoritma unsupervised learning, data tidak memiliki label secara eksplisit dan model mampu belajar dari data dengan menemukan pola yang implisit. Sangat berbeda dengan supervised learning, unsupervised learning merupakan jenis learning yang hanya mempunyai variabel input tapi tidak mempunyai variabel output yang berhubungan. Tujuan dari Machine Learning ini adalah untuk memodelkan struktur data dan menyimpulkan fungsi yang mendeskripsikan data tersebut.

Unsupervised learning adalah salah satu tipe algoritma machine learning yang digunakan untuk menarik kesimpulan dari dataset. Metode ini hanya akan mempelajari suatu data berdasarkan kedekatannya saja atau yang biasa disebut dengan clustering. Metode unsupervised learning yang paling umum adalah analisis cluster, yang digunakan pada analisa data untuk mencari pola-pola tersembunyi atau pengelompokan dalam data.

2. Cara Kerja

Cara kerja algoritma ini yaitu akan mencari pola tersembunyi (eksplisit) dari dataset yang diberikan. Unsupervised machine learning bekerja dengan menganalisis data yang tidak berlabel untuk menemukan pola tersembunyi dan menentukan korelasinya. Pendekatan ini tidak menggunakan data training dan data test untuk melakukan prediksi maupun klasifikasi dengan tujuan mengelompokkan objek yang hampir sama dalam suatu area tertentu. Beberapa contoh algoritma yang dapat digunakan dalam unsupervised learning seperti, K-Means, Hierarchical clustering, DBSCAN, dan Fuzzy C-Means.

3. Contoh Penerapan

Salah satu contoh implementasi unsupervised learning adalah clustering. Dengan teknologi clustering, sebuah perusahaan dapat mengidentifikasi customer segmen yang berpotensial untuk menjual produk mereka. Perusahaan dapat mengidentifikasi customer segmen yang paling mungkin menggunakan layanan atau membeli produk mereka. Perusahaan juga dapat mengevaluasi segmen pelanggan lalu memutuskan untuk menjual produk guna memaksimalkan keuntungan mereka.

Contoh dataset yang akan digunakan adalah Data Segmentasi Pelanggan Mall. Kumpulan data ini dibuat hanya untuk tujuan pembelajaran konsep segmentasi pelanggan, juga dikenal sebagai market basket analysis. kita akan mendemonstrasikan ini dengan menggunakan teknik unsupervised ML (Algoritma KMeans Clustering) dalam bentuk yang paling sederhana.

Disini kita berperan sebagai pemilik mal supermarket dan melalui kartu keanggotaan, kita memiliki beberapa data dasar tentang pelanggan kita seperti: ID Pelanggan, usia, jenis kelamin, pendapatan tahunan, dan Spending Score. Spending Score adalah sesuatu yang kita tetapkan kepada pelanggan berdasarkan parameter seperti perilaku pelanggan dan data pembelian.

Customer segmentation adalah praktik membagi basis pelanggan menjadi kelompok-kelompok individu yang serupa dalam cara-cara tertentu yang relevan dengan pemasaran, seperti usia, jenis kelamin, minat, dan kebiasaan belanja.

Perusahaan yang menggunakan segmentasi pelanggan beroperasi di bawah kenyataan bahwa setiap pelanggan berbeda dan bahwa upaya pemasaran mereka akan lebih baik dilayani jika mereka menargetkan kelompok yang lebih kecil dan spesifik dengan pesan yang menurut konsumen relevan dan mengarahkan mereka untuk membeli sesuatu. Perusahaan juga berharap untuk mendapatkan pemahaman yang lebih dalam tentang preferensi dan kebutuhan pelanggan mereka dengan gagasan untuk menemukan apa yang menurut setiap segmen paling berharga untuk menyesuaikan materi pemasaran secara lebih akurat ke segmen tersebut.

Customer segmentation bergantung pada identifikasi pembeda utama yang membagi pelanggan menjadi kelompok-kelompok yang dapat ditargetkan. Informasi seperti demografi pelanggan (usia, ras, agama, jenis kelamin, ukuran keluarga, etnis, pendapatan, tingkat pendidikan), geografi (tempat tinggal dan bekerja), psikografis (kelas sosial, gaya hidup dan karakteristik kepribadian) dan perilaku (pengeluaran , konsumsi, penggunaan, dan manfaat yang diinginkan) diperhitungkan saat menentukan praktik segmentasi pelanggan.

4. Problem Statement

Kita akan berusaha memahami pelanggan seperti yang dapat dengan mudah berkumpul [Target Pelanggan] sehingga pengertian dapat diberikan kepada tim pemasaran dan merencanakan strategi yang sesuai.

Import Library

## Importing packages
library(ggplot2); theme_set(theme_bw())
library(dplyr)
library(skmeans)
library(gridExtra)
library(tidyr)
library(GGally)
library(factoextra)
library(FactoMineR)

Read Data

customers <- read.csv("Mall_Customers.csv")

Data Wrangling

# Cek Data 
glimpse(customers)
#> Rows: 200
#> Columns: 5
#> $ CustomerID             <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, …
#> $ Gender                 <chr> "Male", "Male", "Female", "Female", "Female", "…
#> $ Age                    <int> 19, 21, 20, 23, 31, 22, 35, 23, 64, 30, 67, 35,…
#> $ Annual.Income..k..     <int> 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 19,…
#> $ Spending.Score..1.100. <int> 39, 81, 6, 77, 40, 76, 6, 94, 3, 72, 14, 99, 15…
# Mengubah Tipe Data
customers <- customers %>% 
  rename(Annual = Annual.Income..k..,
         Score = Spending.Score..1.100.) %>% 
  mutate(Gender = as.factor(Gender))

glimpse(customers)
#> Rows: 200
#> Columns: 5
#> $ CustomerID <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
#> $ Gender     <fct> Male, Male, Female, Female, Female, Female, Female, Female,…
#> $ Age        <int> 19, 21, 20, 23, 31, 22, 35, 23, 64, 30, 67, 35, 58, 24, 37,…
#> $ Annual     <int> 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20,…
#> $ Score      <int> 39, 81, 6, 77, 40, 76, 6, 94, 3, 72, 14, 99, 15, 77, 13, 79…

Keterangan:

  • CustomerID: ID unik yang diberikan kepada pelanggan
  • Gender: jenis kelamin pelanggan
  • Age: Usia pelanggan
  • Annual: Pendapatan tahunan pelanggan
  • Score: Skor yang diberikan oleh mal berdasarkan perilaku pelanggan dan sifat pembelanjaan (1-100)

Data terdiri dari 200 observasi dan 5 variables.

Exploratory Data Analysis

  1. Melihat Distribusi Gender
# Distribusi Gender
dist_gender <- customers %>% 
  select(Gender) %>% 
  count(Gender) %>% 
  mutate(pct = n / sum(n),
         pctlabel = paste0(round(pct*100), "%"))

ggplot(dist_gender,
       aes(x = reorder(Gender, -pct),
           y = pct)) +
  geom_bar(stat = "identity",
           fill = rainbow(2),
           color = "azure4") +
  geom_text(aes(label = pctlabel),
                vjust = -0.25) +
  theme_minimal() +
  labs(x = "Gender",
       y = "Frequency",
       title = "Mall Customers by Gender") +
  theme(axis.text.x = element_text(angle = 45,
                                   hjust = 1))

Dari proposional distribusi gender-nya Female 56%, sedangkan Male 44%.

Dari perspektif bisnis, sebagian besar perusahaan yang tampaknya memiliki kisah sukses sangat fokus pada kelompok sasaran tertentu sehingga dapat memberikan pengalaman terbaik bagi mereka. Oleh karena itu, bisnis terutama difokuskan pada kegiatan yang relevan tersebut. Selain itu, kadang-kadang, bisnis dapat memilih lebih dari satu segmen sebagai fokus kegiatannya, dalam hal ini, biasanya akan mengidentifikasi target utama dan target sekunder. Pasar sasaran primer adalah segmen pasar yang menjadi tujuan utama upaya pemasaran dan di mana lebih banyak sumber daya bisnis dialokasikan, sedangkan pasar sekunder seringkali merupakan segmen yang lebih kecil atau kurang vital bagi keberhasilan suatu produk.

  1. Melihat Kategori Usia

Variabel Usia akan menjadi indikator yang baik dari kelompok Usia yang ditargetkan.

# Summary dari Variable Umur
summary(customers$Age)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   18.00   28.75   36.00   38.85   49.00   70.00
# Distribusi Umur
ggplot(customers, 
       aes(y = Age)) + 
  geom_boxplot(fill=rainbow(1))

Dapat dilihat dari summary, bahwa rata-rata umur customer adalah 38.85 tahun.

Range umur dari customer adalah 18 - 70 tahun

  1. Melihat Distribusi Umur Berdasarkan Gender
ggplot(customers, 
       aes( x = Age, fill = Gender)) + 
  geom_density(alpha = 0.4)

Cukup menarik bahwa ada perbedaan antara kedua jenis kelamin. Terlihat bahwa pada kedua kelompok (yaitu Laki-laki & Perempuan) terdapat aktivitas yang kuat pada usia 25-35 tahun, sedangkan data menunjukkan kelompok lain yang sering dari bagian perempuan pada usia sekitar 45 tahun. Sebaliknya, kurva kelompok pria menurun seiring dengan bertambahnya usia mencapai usia maksimal 70 tahun.

  1. Melihat Segmentasi berdasarkan Income dan Skor

Variabel pendapatan dan variabel skor adalah yang paling menarik bagi kita karena kita akan menyimpan variabel ini untuk melakukan pengelompokan kita. Menyelidiki sedikit lebih banyak pada variabel ini kita dapat melihat bahwa mereka berperilaku normal dan tidak ada anomali yang terdeteksi (1 titik data pada variabel Pendapatan dianggap sebagai nilai yang benar).

# Annual Income & Spending Score Boxplot
p1 <- ggplot(customers, 
             aes(y = Annual)) + 
  geom_boxplot(fill='#F8766D') + 
  ylim(c(1,150))

p2 <- ggplot(customers, 
             aes(y = Score)) + 
  geom_boxplot(fill='#00BFC4') + 
  ylim(c(1,150))

grid.arrange(p1, p2, ncol = 2)

Menyelidiki sedikit lebih banyak pada variabel ini kita dapat melihat bahwa mereka berperilaku normal dan tidak ada anomali yang terdeteksi / no outliers detection (1 titik data pada variabel Pendapatan dianggap sebagai nilai yang benar).

Cek Missing Value Data

cat("There are", sum(is.na(customers)), "N/A values.")
#> There are 0 N/A values.

Akhirnya, dataset tidak mengandung nilai N/A sehingga tidak ada teknik nilai yang hilang yang perlu diterapkan karena alasan itu. Model kita sangat sensitif dalam nilai N/A seperti yang akan dibahas selanjutnya.

Data Pre-Processing

K Means

K-means clustering adalah algoritma pembelajaran unsupervised untuk mengelompokkan pengamatan ‘n’ ke dalam kluster ‘k’ di mana k adalah konstanta yang ditentukan sebelumnya atau ditentukan pengguna. Ide utamanya adalah untuk mendefinisikan k centroid, satu untuk setiap cluster.

Algoritma K-Means melibatkan:

  1. Memilih jumlah cluster “k”.
  2. Tetapkan secara acak setiap titik ke sebuah cluster
  3. Sampai cluster berhenti berubah, ulangi hal berikut:
    • Untuk setiap cluster, hitung centroid cluster dengan mengambil vektor rata-rata dari titik-titik dalam cluster.
    • Tetapkan setiap titik data ke cluster yang centroidnya paling dekat.

Dua hal yang sangat penting dalam K mean, yang pertama adalah menskalakan variabel sebelum melakukan clustering data *, dan kedua adalah melihat scatter plot atau tabel data untuk memperkirakan jumlah pusat cluster yang akan ditetapkan untuk parameter k dalam model.

Catatan: Penskalaan diperlukan ketika jarak antar atribut tidak masuk akal (yaitu jarak antara Usia dan Tinggi; metrik yang berbeda juga penting!). Di sisi lain, jika Anda memiliki atribut dengan makna yang terdefinisi dengan baik (misalnya lintang dan bujur) maka Anda tidak boleh menskalakan data Anda, karena ini akan menyebabkan distorsi.

Hipotesis kita dan jawaban yang kita coba berikan menggunakan k-means adalah bahwa ada intuisi bahwa pelanggan dapat dikelompokkan (berkelompok) sesuai dengan skor mereka berdasarkan pendapatan mereka. Hipotesis nol kita (yang kita coba bantah) adalah bahwa tidak ada grup (cluster) pelanggan berdasarkan ini.

Choosing Variable

# Memilih Variabel yang akan digunakan (Income & Score)
Kdata <- customers[,c(4,5)]
head(Kdata)
#>   Annual Score
#> 1     15    39
#> 2     15    81
#> 3     16     6
#> 4     16    77
#> 5     17    40
#> 6     17    76

Scalling

Scaling dilakukan agar antar variabel memiliki skala yang tidak jauh berbeda. Nilai scaling yang digunakan adalah Z-score (mean = 0, standar deviasi = 1). Lakukan scaling dengan z-score, karena asumsinya masing-masing kolom memiliki satuan yang tidak sama. Simpan hasil scaling ke objek Kdata_scale.

summary(Kdata)
#>      Annual           Score      
#>  Min.   : 15.00   Min.   : 1.00  
#>  1st Qu.: 41.50   1st Qu.:34.75  
#>  Median : 61.50   Median :50.00  
#>  Mean   : 60.56   Mean   :50.20  
#>  3rd Qu.: 78.00   3rd Qu.:73.00  
#>  Max.   :137.00   Max.   :99.00
# Scaling
Kdata_scale <- scale(Kdata)
summary(Kdata_scale)
#>      Annual             Score          
#>  Min.   :-1.73465   Min.   :-1.905240  
#>  1st Qu.:-0.72569   1st Qu.:-0.598292  
#>  Median : 0.03579   Median :-0.007745  
#>  Mean   : 0.00000   Mean   : 0.000000  
#>  3rd Qu.: 0.66401   3rd Qu.: 0.882916  
#>  Max.   : 2.91037   Max.   : 1.889750

Menentukan Optimum K

Semakin tinggi k, maka:

  • WSS semakin mendekati 0
  • Rasio BSS/TSS mendekati 1 (BSS semakin mendekati nilai TSS)

Menentukan optimum K, berdasarkan:

  1. Kebutuhan dari segi bisnis, data dibutuhkan menjadi berapa kelompok; atau
  2. Secara statistik: Elbow method, visualisasi dengan fviz_nbclust() dari package factoextra
fviz_nbclust(x = Kdata_scale, # data
             FUNcluster = kmeans, # fungsi kmeans
             method = "wss") # within sum of square

Notes: Pilih nilai k di mana ketika k ditambah, penurunan Total WSS tidak terlalu drastis (atau dapat dikatakan sudah melandai).

Kita pilih k = 5 karena saat di k = 6, ada kenaikan nilai WSS.

Dapat dilihat dari grafik di atas bahwa pilihan yang masuk akal untuk nilai K adalah k = 5. Oleh karena itu, kita akan membuat 5 cluster untuk menghasilkan segmen kita.

Modeling Clustering

# k-Means Clustering with optimum k
RNGkind(sample.kind = "Rounding")
set.seed(28)

# berdasarkan elbow method
customerClusters <- kmeans(x = Kdata_scale, centers = 5)

# hasil
customerClusters
#> K-means clustering with 5 clusters of sizes 22, 23, 81, 35, 39
#> 
#> Cluster means:
#>       Annual       Score
#> 1 -1.3262173  1.12934389
#> 2 -1.3042458 -1.13411939
#> 3 -0.2004097 -0.02638995
#> 4  1.0523622 -1.28122394
#> 5  0.9891010  1.23640011
#> 
#> Clustering vector:
#>   [1] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
#>  [38] 1 2 1 2 1 2 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
#>  [75] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
#> [112] 3 3 3 3 3 3 3 3 3 3 3 3 5 4 5 3 5 4 5 4 5 3 5 4 5 4 5 4 5 4 5 3 5 4 5 4 5
#> [149] 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4
#> [186] 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5
#> 
#> Within cluster sum of squares by cluster:
#> [1]  5.217630  7.577407 14.485632 18.304646 19.655252
#>  (between_SS / total_SS =  83.6 %)
#> 
#> Available components:
#> 
#> [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
#> [6] "betweenss"    "size"         "iter"         "ifault"

Dari hasil clustering, sangat menarik bahwa ukuran tiap cluster tidak proporsional satu sama lain (cluster 1: berjumlah 22; cluster 2: berjumlah 23; cluster 3: berjumlah 81; cluster 4: berjumlah 35; cluster 5: berjumlah 39).

Goodness of Fit

Kebaikan hasil clustering dapat dilihat dari 3 nilai:

  • Within Sum of Squares ($withinss): jumlah jarak kuadrat dari tiap observasi ke centroid tiap cluster.
  • Between Sum of Squares ($betweenss): jumlah jarak kuadrat terbobot dari tiap centroid ke rata-rata global. Bobotnya berdasarkan banyaknya observasi pada cluster.
  • Total Sum of Squares ($totss): jumlah jarak kuadrat dari tiap observasi ke rata-rata global.
# Cek nilai Within Sum of Squares
customerClusters$tot.withinss
#> [1] 65.24057
# Cek nilai Between Sum of Squares
customerClusters$betweenss
#> [1] 332.7594
# cek rasio BSS/TSS
customerClusters$betweenss / customerClusters$totss
#> [1] 0.836079

Highlights Kriteria clustering yang “baik”:

  • WSS semakin rendah: jarak observasi di satu kelompok yang sama semakin rendah, artinya tiap cluster memiliki karakteristik yang semakin mirip
  • Rasio BSS/TSS mendekati 1, karena kelompok hasil clustering semakin mewakili persebaran data yang sesungguhnya.

Interpretation: Cluster Profiling

Untuk memvisualisasikan hasil clustering K-means kita dapat menggunakan berbagai fungsi dari paket factoextra.

# data preparation for visualization & profiling
customers$cluster <- as.factor(customerClusters$cluster) 
head(customers)
#>   CustomerID Gender Age Annual Score cluster
#> 1          1   Male  19     15    39       2
#> 2          2   Male  21     15    81       1
#> 3          3 Female  20     16     6       2
#> 4          4 Female  23     16    77       1
#> 5          5 Female  31     17    40       2
#> 6          6 Female  22     17    76       1
# Cluster Visualization
fviz_cluster(object = customerClusters, 
             data = Kdata_scale)

# Cluster Profiling
customers %>%
  group_by(cluster) %>% 
  summarise_all(.funs = "mean") %>% 
  select(-Gender, - CustomerID)
#> # A tibble: 5 × 4
#>   cluster   Age Annual Score
#>   <fct>   <dbl>  <dbl> <dbl>
#> 1 1        25.3   25.7  79.4
#> 2 2        45.2   26.3  20.9
#> 3 3        42.7   55.3  49.5
#> 4 4        41.1   88.2  17.1
#> 5 5        32.7   86.5  82.1

Insight & Summary

Dari hasil pembuatan profil, kita dapat memperoleh wawasan:

  • Cluster 1: Pelanggan dengan rata-rata umur 25 tahun, rata-rata pendapatan tahunan rendah dan rata-rata penilaian tinggi.
  • Cluster 2: Pelanggan dengan rata-rata umur 45 tahun, rata-rata pendapatan tahunan rendah dan rata-rata penilaian rendah.
  • Cluster 3: Pelanggan dengan rata-rata umur 42 tahun, rata-rata pendapatan tahunan sedang dan rata-rata penilaian sedang.
  • Cluster 4: Pelanggan dengan rata-rata umur 41 tahun, rata-rata pendapatan tahunan tinggi dan rata-rata penilaian rendah.
  • Cluster 5: Pelanggan dengan rata-rata umur 32 tahun, rata-rata pendapatan tahunan tinggi dan rata-rata penilaian tinggi.

Memiliki pemahaman yang lebih baik tentang segmen pelanggan, perusahaan dapat membuat keputusan yang lebih baik dan lebih tepat. Sebagai contoh, ada pelanggan dengan pendapatan tahunan tinggi tetapi skor pengeluaran rendah. Pendekatan pemasaran yang lebih strategis dan tepat sasaran dapat mengangkat minat mereka dan membuat mereka menjadi pembelanja yang lebih tinggi.

Fokusnya juga harus pada pelanggan “setia” dan menjaga kepuasan mereka.Dengan demikian, kita telah melihat, bagaimana kita dapat mencapai wawasan dan rekomendasi yang berarti dengan menggunakan algoritme pengelompokan untuk menghasilkan segmen pelanggan.

Dari analisis unsupervised learning di atas, kita dapat meringkas bahwa:

K-Means Clustering ini dapat dilakukan pada dataset ini. Demi kesederhanaan, kumpulan data hanya menggunakan 2 variabel - pendapatan dan pengeluaran. Dalam skenario bisnis yang khas, mungkin ada beberapa variabel yang mungkin dapat menghasilkan wawasan yang jauh lebih realistis dan spesifik bisnis.