1 Objektif

Pada LBB ini saya akan memprediksi kluster berapa aja yang terbentuk dari dataset yang saya miliki. Dataset yang saya gunakan, saya ambil dari https://www.kaggle.com/vjchoudhary7/customer-segmentation-tutorial-in-python

2 Library

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(GGally)
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(FactoMineR)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

3 Read Data

customer <- read.csv("dataset/Mall_Customers.csv")
customer
glimpse(customer)
## Rows: 200
## Columns: 5
## $ CustomerID             <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ Gender                 <chr> "Male", "Male", "Female", "Female", "Female"...
## $ Age                    <int> 19, 21, 20, 23, 31, 22, 35, 23, 64, 30, 67, ...
## $ Annual.Income..k..     <int> 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, ...
## $ Spending.Score..1.100. <int> 39, 81, 6, 77, 40, 76, 6, 94, 3, 72, 14, 99,...

4 Data Preprocessing

4.1 Check Missing Value

Dari data diatas, maka saya akan melakukan cek apakah ada missing value atau tidak.

colSums(is.na(customer))
##             CustomerID                 Gender                    Age 
##                      0                      0                      0 
##     Annual.Income..k.. Spending.Score..1.100. 
##                      0                      0

Setelah itu, langkah selanjutnya yaitu melakukan pengubahan tipe data yang belum sesuai dan menghilangkan kolom yang tidak dibutuhkan. Disini kolom yang saya hilangkan adalah kolom CustomerID.

customer <- customer %>% 
  select(-CustomerID) %>% 
  mutate(Gender = as.factor(Gender))

5 Exploratory Data Analysis

Setelah melakukan data preprocessing, selanjutnya saya akan melakukan exploratory data analysis dengan melihat kemungkinan PCA terbentuk.

5.1 Possibility for Principle Component Analysis (PCA)

Pada tahap ini ingin melihat jika terdapat korelasi yang begitu tinggi antara komponen data akan dapat di jadikan sebagai dimensi atau feature yang digunakan untuk PCA.

ggcorr(customer, low = "red", high = "blue")
## Warning in ggcorr(customer, low = "red", high = "blue"): data in column(s)
## 'Gender' are not numeric and were ignored

6 PCA

Pada tahap pertama saya melakukan proses PCA terlebih dahulu. Pada proses PCA ini hanya membutuhkan kolom yang bertipe faktor yang digunakan untuk ewarnai plot sehingga plot lebih informatif. Pada proses PCA ini saya menggunakan library FactoMineR.

customer
# # indeks kolom numerik
# qantivar <- c(2:4)
# # indeks kolom kategorik
# qualivar <- c(1)

#Ketika memiliki kolom yang cukup banyak
index_quanti <-  customer %>%
                 select_if(is.numeric) %>% # untuk data kategorik gunakan is.factor
                 colnames()
quanti <- which(names(customer) %in% index_quanti)

index_quali <-  customer %>%
                select_if(is.factor) %>% # untuk data kategorik gunakan is.factor
                 colnames()
quali <- which(names(customer) %in% index_quali)

Selanjutnya membuat PCA dengan PCA() dengan memanfaatkan library FactoMineR.

customer_pca <- PCA(X = customer, scale.unit = T, quali.sup = quali, graph = F, ncp = 4)
head(customer_pca$ind$coord)
##         Dim.1     Dim.2       Dim.3
## 1  0.61572002 -1.763481 -1.32423216
## 2  1.66579271 -1.820747 -0.06995224
## 3 -0.33786191 -1.674799 -2.17902515
## 4  1.45657325 -1.772430 -0.07802913
## 5  0.03846521 -1.662740 -0.68734219
## 6  1.48168526 -1.735002 -0.15602269

Dari hasil diatas maka saya mendapatkan PCA atau Dim sebanyak 3 yang terdiri dari Dim.1, Dim.2 dan Dim.3. Langkah selanjutnya dengan melakukan proses visualisasi dengan menggunakan plot.PCA().

6.1 Individual Factor Map

Visualisasi pertama yang saya lakukan yaitu Individual Factor Map dengan melihat sebaran datanya.

plot.PCA(x = customer_pca, choix = "ind", invisible = "quali", select = "contrib10", habillage = "Gender")

Dari hasil visualisasi diatas maka saya simpulkan bahwa terdapat outlier didata. Outlier yang terluar yaitu 199,198,200, 31,9,11 merupakan kelompok Male dan 195 dan 197 merupakan kelompok Female.

6.2 Variabel Factor Map

Visualisasi kedua yaitu Variabel Factor Map. Visualisasi kedua ini digunakan untuk mengetahui kontribusi informasi yang dirangkum dari tiap variabel ke tiap PC. Plot korelasi antar variabel awal dengan tiap PC.

plot.PCA(x = customer_pca, choix = "var")

Dari visualisasi diatas maka saya dapat simpulkan bahwa: - PC 1 banyak dirangkum oleh Age dan Spending Score - PC 2 dirangkum oleh Annual Income.

Selanjutnya untuk lebih jelas dan objektif kontribusi/korelasi tiap variabel ke tiap PC dapat dilihat dengan menggunakan dimdesc().

dim_customer <- dimdesc(customer_pca)
as.data.frame(dim_customer$Dim.1$quanti)

Dari data diatas maka yang saling berkorelasi yaitu Age dan Spending Score namun korelasinya negative.

7 K-Means

7.1 Scalling

Tahap pertama dari K-means yaitu dengan melakukan scale. Scalling ini perlu dilakukan untuk data dengan skala yang sangat berbeda. Hal ini K-means melakukan clustering dengan menggunakan fungsi jarak, sehingga perbedaan skala dapat memberikan hasil yang kurang tepat.

customer_clean <- customer %>% 
  select(is.numeric)
## Warning: Predicate functions must be wrapped in `where()`.
## 
##   # Bad
##   data %>% select(is.numeric)
## 
##   # Good
##   data %>% select(where(is.numeric))
## 
## i Please update your code.
## This message is displayed once per session.
customer_z <- scale(customer_clean)

7.2 Elbow Method

Tahap selanjutnya dengan pemilihan nilai K dengan menggunakan Elbow Method dengan menggunakan fviz_nbclus().

fviz_nbclust(x = customer_z, FUNcluster = kmeans, method = "wss")

Dari hasil visualisasi diatas maka kita ambil nilai K optimumnya yaitu K = 5.

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(150)

customer_km2 <- kmeans(x = customer_z, centers = 5)

7.3 Interpretasi/ Cluster Profilling

Tahap selanjutnya yaitu melakukan interpretasi dari data yang sudah terbentuk dan melihat kluster berapa yang terbentuk.

customer_clean$cluster <- customer_km2$cluster
head(customer_clean)

Dari hasil diatas maka akan saya lakukan visualisasi clustering. Hasil Visualisasi Clustering yang terbentuk yaitu:

fviz_cluster(object = customer_km2, data = customer_clean)

8 Summary

Dari analisis unsupervised learning diatas, maka dapat disimpulkan bahwa: 1. PC 1 banyak dirangkum oleh Age dan Spending Score 2. PC 2 dirangkum oleh Annual Income. 3. Dari data yang saya dimensi yang terbentuk sebanyak 3 dimensi. 4. Dari data diatas maka yang saling berkorelasi yaitu Age dan Spending Score namun korelasinya negative.