Introduction

Pada kesempatan kali ini saya akan membuat LBB terkait Unsupervised Learning. Disini saya akan melakukan clustering(pengelompokan) menggunakan K-Means Clustering terhadap data whosale untuk dilakukan segmentasi customer dari sebuah perusahaan wholesale berdasarkan karakteristik tiap customer dalam membeli produk. Pada kasus ini saya akan mengunakan data yang telah disediakan oleh team algoritma

Libarary

library(tidyverse)
library(dplyr)
library(FactoMineR)
library(factoextra)

Read Data

Data set yang akan digunakan yaitu data yang telah disediakan oleh Team Algoritma.

wholesale <- read.csv("wholesale.csv")
str(wholesale)
## 'data.frame':    440 obs. of  8 variables:
##  $ Channel         : int  2 2 2 1 2 2 2 2 1 2 ...
##  $ Region          : int  3 3 3 3 3 3 3 3 3 3 ...
##  $ Fresh           : int  12669 7057 6353 13265 22615 9413 12126 7579 5963 6006 ...
##  $ Milk            : int  9656 9810 8808 1196 5410 8259 3199 4956 3648 11093 ...
##  $ Grocery         : int  7561 9568 7684 4221 7198 5126 6975 9426 6192 18881 ...
##  $ Frozen          : int  214 1762 2405 6404 3915 666 480 1669 425 1159 ...
##  $ Detergents_Paper: int  2674 3293 3516 507 1777 1795 3140 3321 1716 7425 ...
##  $ Delicassen      : int  1338 1776 7844 1788 5185 1451 545 2566 750 2098 ...

Data wholesale merupakan data di bidang retail yang terdiri dari 440 usaha dan 8 variabel.

*Channel = jenis usaha yang terdiri dari horeca (hotel/restoran/cafe) dan retail

*Region = tempat dimana usaha berada. Terdiri dari 3 region, yaitu region 1, 2, dan

*6 variabel sisanya adalah kuantitas pemebelian dari setiap produk

Data Cleansing

Kita tidak akan menguunakan kolom yang tidak diperlukan

wholesale <- wholesale %>% 
  select(-c(Region, Channel)) 

Kemudian kita akan melakukan pengecekan terhadap missing value agar tidak menggangu dalam melakukan pemodelan.

anyNA(wholesale)
## [1] FALSE
summary(wholesale)
##      Fresh             Milk          Grocery          Frozen       
##  Min.   :     3   Min.   :   55   Min.   :    3   Min.   :   25.0  
##  1st Qu.:  3128   1st Qu.: 1533   1st Qu.: 2153   1st Qu.:  742.2  
##  Median :  8504   Median : 3627   Median : 4756   Median : 1526.0  
##  Mean   : 12000   Mean   : 5796   Mean   : 7951   Mean   : 3071.9  
##  3rd Qu.: 16934   3rd Qu.: 7190   3rd Qu.:10656   3rd Qu.: 3554.2  
##  Max.   :112151   Max.   :73498   Max.   :92780   Max.   :60869.0  
##  Detergents_Paper    Delicassen     
##  Min.   :    3.0   Min.   :    3.0  
##  1st Qu.:  256.8   1st Qu.:  408.2  
##  Median :  816.5   Median :  965.5  
##  Mean   : 2881.5   Mean   : 1524.9  
##  3rd Qu.: 3922.0   3rd Qu.: 1820.2  
##  Max.   :40827.0   Max.   :47943.0

Skala antar variabel sangat berbeda dan range nya terlalu jauh, maka kita perlu melakukan scaling. Sebelumnya kita dapat melihat outlier terlebih dahulu dengan biplot dari hasil PCA

wholesale_pca <- PCA(X = wholesale,
                     scale.unit = T)

Insight Variabel-variabel yang sangat berkontribusi tinggi untuk PC 1 (Dim 1) adalah Milk, Grocery, dan Detergents_Paper. Sedangakan kelompok produk Fresh, Frozen, dan Delicassen memiliki kontribusi tinggi terhadap PC2 (Dim 2). Dari 2 kelompok tersebut tidak saling berkorelasi

Membuat plot outlier terluar

plot.PCA(x = wholesale_pca,
         choix = "ind",
         select = "contrib10")

Simpan index outlier pada plot ke dalam objek

outlier <- wholesale[-c(184,326,182,24,48,87,61,66,334,86),]

wholesale_normal <- outlier #menyimpan objek

Cek variansi tiap PC

wholesale_pca$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

K-Means Clustering

Cek data yang akan digunakan untuk clustering sudah bebas dari outlier yang dapat mengganggu

summary(wholesale_normal)
##      Fresh            Milk          Grocery          Frozen     
##  Min.   :    3   Min.   :   55   Min.   :    3   Min.   :   25  
##  1st Qu.: 3098   1st Qu.: 1497   1st Qu.: 2132   1st Qu.:  744  
##  Median : 8224   Median : 3596   Median : 4630   Median : 1526  
##  Mean   :11561   Mean   : 5164   Mean   : 7263   Mean   : 2843  
##  3rd Qu.:16641   3rd Qu.: 7011   3rd Qu.:10066   3rd Qu.: 3491  
##  Max.   :76237   Max.   :38369   Max.   :59598   Max.   :35009  
##  Detergents_Paper   Delicassen     
##  Min.   :    3    Min.   :    3.0  
##  1st Qu.:  256    1st Qu.:  405.2  
##  Median :  788    Median :  946.5  
##  Mean   : 2571    Mean   : 1346.8  
##  3rd Qu.: 3806    3rd Qu.: 1779.0  
##  Max.   :26701    Max.   :14472.0

Selanjutnya kita melakukan scaling menggunakan fungsi scale() agar semua data mempunyai skala yang sama

wholesale_s <- scale(wholesale_normal)

Menentukan k-optimum

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
kmeansTunning <- function(data, maxK) {
  withinall <- NULL
  total_k <- NULL
  for (i in 2:maxK) {
    set.seed(303)
    temp <- kmeans(data,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(your_data, maxK = 9)
kmeansTunning(wholesale_s, maxK = 9)

Berdasarkan elbow method pemilihan k optimum diambil dari penurunan total within sum of squares yang tidak lagi signifikan. Saya akan memilih nilai k saat grafik mulai melandai. Disini saya akan memilih nilai k = 4

Buat clustering

RNGkind(sample.kind = "Rounding")
set.seed(303)
ws_kmeans <- kmeans(wholesale_s, centers = 4)

Mengembalikan hasil cluster ke data awal

wholesale_normal$cluster <- ws_kmeans$cluster

Melakukan Profiling

wholesale_normal %>% 
  group_by(cluster) %>% # kelompokan berdasarkan cluster
  summarise_all(mean)

Insight :

  • Cluter 1 : Pada cluster ini pelanggan tidak memiliki prefensi tertentu

  • Cluter 2 : Kebanyakan pelanggan membeli produk Fresh

  • Cluter 3 : Di cluster ini juga banyak pelanggan yang membeli produk fresh namun tidak sebanyak di cluster 2

  • Cluter 4 : Cluster ini pelanggan banyak membeli produk Grodcery dan detergents_paper

fviz_cluster(ws_kmeans, data = wholesale_s)

Berdasarkan hasil visualisasi diatas , Kebanyakan data berada pada titik (0,0) yang artinya data bersifat rata - rata (tidak ada variable yang terlalu dominan mempengaruhi).

Conclusion

  • Setelah dilakukan analisa perilaku dan segmentasi dalam data dapat dibagi menjadi 4 cluster/kelompok

  • Tiap kelompok memiliki karateristik yang berbeda

  • Kebanyakan Data berada berpusat pada sekitar titik 0 yang yang artinya data bersifat rata - rata (tidak ada variable yang dominan mempengaruhi).

  • Pada Cluster 1 berbeda dengan cluster lainnya karena pada cluster ini terlihat customer tidak memiliki perilaku khusus terhadap pembelian suatu tipe produk tertentu.