Kali ini kita akan melakukan analisis dengan menggunakan 2 metode yaitu : - Principal Component Analysis (PCA) dan - K-Means Clustering. Adapun data yang digunakan untuk analisis kali adalah data wholesale.csv, yang yang terdapat pada materi Classfication 1.
Sebelum kita melakukan analisis, kita perlu melakukan eksplorasi data. Kita dapat melihat sekilas struktur dari dataset yang digunakan. Kita dapat menggunakan fungsi str() atau glimpse().
# library yang digunakan
library(tidyverse)
library(GGally)
library(FactoMineR)
library(factoextra)
# read data dan lihat struktur data
wholesale <- read.csv("data_input/wholesale.csv")
glimpse(wholesale)
## Rows: 440
## Columns: 8
## $ Channel <int> 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2,...
## $ Region <int> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,...
## $ Fresh <int> 12669, 7057, 6353, 13265, 22615, 9413, 12126, 7579...
## $ Milk <int> 9656, 9810, 8808, 1196, 5410, 8259, 3199, 4956, 36...
## $ Grocery <int> 7561, 9568, 7684, 4221, 7198, 5126, 6975, 9426, 61...
## $ Frozen <int> 214, 1762, 2405, 6404, 3915, 666, 480, 1669, 425, ...
## $ Detergents_Paper <int> 2674, 3293, 3516, 507, 1777, 1795, 3140, 3321, 171...
## $ Delicassen <int> 1338, 1776, 7844, 1788, 5185, 1451, 545, 2566, 750...
Kita juga dapat melihat sekilas tampilan data dengan menggunakan fungsi head() atau tail().
# lihat data
head(wholesale)
Deskripsi dari data diatas :
Data set yang digunakan terdiri dari 440 baris, dan 8 kolom. Data tersebut berisi data dari toko grosir yang terdiri dari barang-barang consumer goods. Karena dirasa data yang kita gunakan cukup jelas, maka kita tidak perlu menjelaskannya lebih rinci lagi. Kita fokus pada tipe datanya apakah sudah sesuai atau belum.
Dari data diatas, kita ubah data tipe data pada kolom Channel dan Region menjadi factor() dan tipe data lainnya menjadi numeric.
# ubah tipe data
wholesale <- wholesale %>%
mutate(Channel = factor(Channel, levels = c(1,2),
labels = c("Horeca", "Retail"))) %>%
mutate(Region = as.factor(Region)) %>%
mutate_if(is.integer, as.numeric)
Sebelum kita melakukaan ke tahap berikutnya, sebaiknya kita cek terlebih dahulu, apakah ada data yang missing value atau NA.
# cek missing value
colSums(is.na(wholesale))
## Channel Region Fresh Milk
## 0 0 0 0
## Grocery Frozen Detergents_Paper Delicassen
## 0 0 0 0
Didapat dari penjelasan diatas, bahwa di dataset kita tidak terdapat missing value atau NA, maka kita lanjut ke tahap berikutnya yaitu melakukan analisis.
PCA sangat berguna untuk menyimpan informasi sekaligus mereduksi dimensi data. Namun, kita perlu memastikan bahwa data sudah diskalakan (scaled) dengan benar untuk mendapatkan PCA yang berguna. Kita dapat menggunakan fungsi FactoMineR yang menyediakan fungsi untuk membuat PCA yaitu PCA() dan memvisualisasikan PCA yaitu plot.PCA(). Visualisasi PCA dengan FactoMineR dapat melibatkan variabel kategorik untuk membedakan informasi kategori dengan cara memberikan warna pada titik-titik amatan sehingga plot lebih informatif.
# index kolom numerik
quantivar <- c(3:8) # kolom 3, 4, 5, 6, 7, dan 8
# index kolom kategorik
qualivar <- c(1:2)
pca_wholesale <- PCA(X = wholesale, # data
scale.unit = T, # data di-scale terlebih dahulu
quali.sup = qualivar, # index kolom kategorik di data
graph = T, # agar tidak dibuatkan plot, pembuatan plot di plot.PCA() saja
ncp = 6) # jumlah PC yang dihasilkan secara default = 5
## Visualisasi
Visualisasi PCA menggunakan plot.PCA()
Individual Factor Map: plot sebaran data/scatter plot
plot.PCA(pca_wholesale, # objek hasil PCA
choix = "ind", # plot individual (observasi)
select = "contrib5", # menampilkan index 5 observasi outlier terluar
habillage = 1, # mewarnai titik-titik amatan berdasarkan kolom kategorik
invisible = "quali") # menghilangkan label kolom kategori (mengganggu visual)
Variable Factor Map: plot kontribusi setiap variabel pada setiap PC
plot.PCA(pca_wholesale,
choix = "var") # plot variable
## Inspect PCA
Inspect some output from PCA
# summary pca
pca_wholesale$eig
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 2.64497357 44.082893 44.08289
## comp 2 1.70258397 28.376400 72.45929
## comp 3 0.74006477 12.334413 84.79371
## comp 4 0.56373023 9.395504 94.18921
## comp 5 0.28567634 4.761272 98.95048
## comp 6 0.06297111 1.049519 100.00000
Kita dapat melihat kontribusi setiap variabel pada setiap PC dapat dilihat menggunakan dimdesc(), dan hasilnya sbb :
# dimdisc: dimension description
# secara default hanya menampilkan kontribusi dari PC1-PC3
dim <- dimdesc(pca_wholesale)
# kontribusi setiap variabel terhadap PC1
# quanti: variable numerik
dim$Dim.1$quanti
## correlation p.value
## Grocery 0.9420663 6.584197e-210
## Detergents_Paper 0.8922741 2.332450e-153
## Milk 0.8865463 1.021905e-148
## Delicassen 0.4044408 9.572010e-19
Hasil PCA :
# hasil pca
dim(pca_wholesale$ind$coord)
## [1] 440 6
Step-by-step k-means clustering:
k secara random (hanya dilakukan di awal saja)Data yang digunakan masih menggunakan data yang telah dicleansing sebelumnya yaitu data wholesale. Berikut tampilan sebagian datanya.
# read data
head(wholesale)
Penentuan jumlah cluster (k) dapat dilakukan dengan cara: - Berdasarkan bussiness knowledge/kebutuhan analisis: User sudah mengetahui secara pasti jumlah cluster yang diharapkan. Contoh, membagi pelanggan menjadi 3 kelompok berdasarkan daya beli (low, medium, high). - Elbow method: melihat penurunan total WSS yang paling efektif (biasanya memilih k ketika penurunan total WSS k berikutnya sudah tidak signifikan).
Langkah selanjutnya dalam membangun cluster dengan K-means adalah menemukan jumlah cluster optimal untuk memodelkan data kita. Gunakan fungsi kmeansTunning() yang disediakan di bawah ini untuk menemukan K yang optimal menggunakan metode Elbow. Gunakan maksimum maxK sebesar 6 untuk membatasi plot menjadi 6 cluster berbeda.
# buang variabel yang tidak digunakan
wholesale <- wholesale %>%
select(-c(Channel, Region))
Lakukan scaling data
wholesale_scale <- prcomp(wholesale, scale. = T)
RNGkind(sample.kind = "Rounding")
kmeansTunning <- function(wholesale, maxK = 6) {
withinall <- NULL
total_k <- NULL
for (i in 2:maxK) {
set.seed(101)
temp <- kmeans(wholesale,i)$tot.withinss
withinall <- append(withinall, temp)
total_k <- append(total_k,i)
}
plot(x = total_k, y = withinall, type = "o", xlab = "Number of Cluster", ylab = "Total within")
}
kmeansTunning(wholesale, maxK = 6)
# your code here
set.seed(101)
wholesale_cluster <- kmeans(x = wholesale, centers = 6)
library(factoextra)
fviz_cluster(object = wholesale_cluster, data = wholesale)
wholesale_new <- wholesale %>%
mutate(cluster = wholesale_cluster$cluster)
head(wholesale_new)
profil <- wholesale_new %>%
group_by(cluster) %>%
summarise_all(mean)
head(profil)
profil %>%
pivot_longer(cols = -cluster, names_to = "type", values_to = "value") %>%
ggplot(aes(x = factor(cluster), y = value)) +
geom_col(aes(fill = cluster)) +
facet_wrap(~type)
unsupervised learning yaitu : PCA dan K-Means Clustering.K_means kita mendapatkan 6 pengelompokkan (clustrering), karena kita menggunakan metode Elbow.