1 Introduction

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.

2 Data Exploration

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.

3 Principal Component Analysis (PCA)

3.1 Build Principal Component

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.

3.2 Create PCA

# 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

4 K-Means Clustering

Step-by-step k-means clustering:

  1. Menentukan pusat cluster (centroid) sebanyak k secara random (hanya dilakukan di awal saja)
  2. Menghitung jarak setiap observasi ke setiap pusat cluster
  3. Assign setiap observasi ke cluster terdekat
  4. Menghitung ulang pusat cluster (mean setiap cluster)
  5. Kembali ke tahap 2, hingga observasi yang ter-assign ke setiap cluster sudah tidak berubah lagi

4.1 Read Data

Data yang digunakan masih menggunakan data yang telah dicleansing sebelumnya yaitu data wholesale. Berikut tampilan sebagian datanya.

# read data
head(wholesale)

4.2 Optimum K

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).

  • semakin banyak k, wss semakin mendekati 0
  • semakin banyak k, rasion semakin mendekati 1

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)

4.3 Building Cluster

# 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)

5 Kesimpulan

  1. Pada analisa kali ini digunakan 2 metode dariunsupervised learning yaitu : PCA dan K-Means Clustering.
  2. Dengan menggunakan PCA kita mendapatkan sebanyak 6 PC untuk mendapatkan 100% dari informasi data.
  3. Dengan menggunakan K_means kita mendapatkan 6 pengelompokkan (clustrering), karena kita menggunakan metode Elbow.