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
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
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,...
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))
Setelah melakukan data preprocessing, selanjutnya saya akan melakukan exploratory data analysis dengan melihat kemungkinan PCA terbentuk.
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
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().
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.
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.
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)
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)
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)
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.