1 METODE PENELITIAN
Pada bab ini, kita menggunakan dua packages yaitu
cluster dan
factoextra untuk perhitungan dan
visualisasi cluster-nya. Kemudian, dilanjutkan memulai
menyiapkan data yang digunakan untuk Clustering Analysis.
1.1 Packages atau Library yang Dibutuhkan
Berikut merupakan dua packages utama yang dibutuhkan dalam penyelesaian laporan kali ini.
Untuk detail lengkap dari dua packages diatas, sebagai berikut:
clusteruntuk perhitungan atau komputasi algoritma clusteringfactoextrauntuk visualisasi hasil dari clustering
Packages factoextra berisi
banyak functions untuk kebutuhan analisis cluster dan
visualisasinya, antara lain:
| Functions | Deskripsi |
|---|---|
| dist(fviz_dist, get_dist) | Komputasi Jarak Matriks dan Visualisasi |
| get_clust_tendency | Menilai Banyaknya Clustering |
| fviz_nbclust(fviz_gap_stat) | Menentukan Jumlah Optimal Cluster |
| fviz_dend | Meningkatkan Visualisasi Dendogram |
| fviz_cluster | Memvisualisasikan Hasil Clustering |
| fviz_mclust | Memvisualisasikan Hasil Model Clustering |
| fviz_silhouette | Memvisualisasikan Bentuk Silhouette dari Clustering |
| hcut | Menghitung Clustering Hirarki dan Memotong Jumlah Cluster |
| hkmeans | Clustering untuk K-Means Hirarki |
| eclust | Memvisualisasikan Penyebaran Cluster |
2 Data
2.1 Persiapan Data
Data merupakan data primer produk Category Moto Exterior Accessories, cutoff tarikan data yaitu 01 Maret 2022.
library(readxl)
dataPKL <- read_excel("D:/MBKM/Laporan PKL (LAZADA INDONESIA)/Data PKL (Moto Exterior Accessories)/Data PKL - Analisis Cluster.xlsx")Berikut merupakan data yang akan digunakan dalam laporan praktik kerja lapang ini.
library(FSA)
library(knitr)
library(dplyr)
headtail (dataPKL) %>%
kable(digits = 6,
align = "c",
col.names = c("Region", "Revenue (GMV dalam $)", "Average Selling Price (ASP dalam $)", "Item Page View Unique Visit (IPV UV)", "Average of Conversion Rate (UV CR by %)", "Stock Availability"),
caption = "**Tabel 2. Data Produk *Category Moto Exterior Accessories* Lazada Indonesia per *Region***")| Region | Revenue (GMV dalam $) | Average Selling Price (ASP dalam $) | Item Page View Unique Visit (IPV UV) | Average of Conversion Rate (UV CR by %) | Stock Availability | |
|---|---|---|---|---|---|---|
| 1 | Bali | 437.7003 | 7.895685 | 15034 | 0.041514 | 1384 |
| 2 | Banten | 10790.0620 | 2.332879 | 154884 | 0.160735 | 25596624 |
| 3 | Daerah Istimewa Yogyakarta | 43767.6846 | 11.788060 | 156738 | 0.085087 | 438426 |
| 18 | Sumatera Barat | 30.8884 | 30.888404 | 43 | 0.023256 | 0 |
| 19 | Sumatera Selatan | 13316.2715 | 7.627544 | 85361 | 0.084697 | 321571 |
| 20 | Sumatera Utara | 8603.2989 | 3.402987 | 81909 | 0.074093 | 16193478 |
Untuk melakukan analisis cluster dengan R, data harus disiapkan dengan ketentuan sebagai berikut:
- Baris merupakan observasi, dan kolom merupakan variabel (field).
- Setiap data yang missing atau hilang harus dihilangkan atau diperkirakan.
- Data yang digunakan harus telah distandarisasi (dengan: di-scaled) agar data memiliki satuan yang seragam. Oleh karena itu, perlu dilakukan proses standardisasi data terlebih dahulu ke bentuk z-score.
# Memanggil kembali Dataset produk Category Moto Exterior Accessories, kemudian assign dataset ke variabel df dari variabel dataPKL sebelumnya
df <- dataPKL- Untuk menghilangkan missing values yang mungkin ada dalam dataset yang dipakai, dengan menggunakan perintah berikut:
- Melakukan standarisasi data atau scaling agar data memiliki
satuan yang seragam. Dilakukan proses standardisasi data terlebih dahulu
ke bentuk z-score dengan fungsi
scale(), berikut perintahnya:
# Menampilkan 3 data teratas dan terbawah dari Data Pengguna Internet yang telah distandarisasi ke bentuk Z-Score
headtail(df) %>%
kable(digits = 5,
align = "c",
col.names = c("Revenue", "ASP", "IPV UV", "CR", "Stock"),
caption = "**Tabel 3. Data Produk *Category Moto Exterior Accessories* Lazada Indonesia per *Region* yang Telah Distandarisasi ke dalam Bentuk *Z-Score***")| Revenue | ASP | IPV UV | CR | Stock | |
|---|---|---|---|---|---|
| [1,] | -0.37925 | -0.22453 | -0.38145 | -0.63805 | -0.25670 |
| [2,] | -0.34610 | -0.96995 | -0.32250 | 0.23455 | -0.25578 |
| [3,] | -0.24051 | 0.29705 | -0.32171 | -0.31913 | -0.25668 |
| [18,] | -0.38056 | 2.85651 | -0.38777 | -0.77168 | -0.25670 |
| [19,] | -0.33802 | -0.26046 | -0.35180 | -0.32198 | -0.25669 |
| [20,] | -0.35311 | -0.82655 | -0.35326 | -0.39960 | -0.25612 |
Proses yang terjadi dalam fungsi
scale() adalah menghitung rata-rata
(mean) dan standar deviasi dari seluruh vektor yaitu dataset
produk Category Moto Exterior Accessories atau variabel
df, lalu menskalakan
setiap elemen dengan nilai-nilai tersebut dengan mengurangi
mean dan membaginya dengan
sd.
\[ z = \frac{x - \bar{X}}\sigma \]
Dimana:
- \(z\) : Nilai data setelah distandarisasi
- \(x\) : Nilai data asli
- \(\bar{X}\) : Nilai rata-rata keseluruhan data
- \(\sigma\) : Simpangan baku
Berikut contoh prosesnya:
3 Menentukan Ukuran Kemiripan Antar Data atau Objek
3.1 Definisi
Dalam analisis cluster diperlukan beberapa ukuran untuk mengetahui seberapa mirip objek-objek yang akan dikelompokan ke dalam cluster yang sama. Untuk penelitian kali ini digunakan ukuran jarak untuk menentukan kemiripan antar data.
3.1.1 Ukuran Jarak
Ada dua metode klasik yang digunakan mengukur jarak yaitu Euclidean dan Manhattan distances, yang berumus seperti berikut:
- Euclidean Distance
\[ d_{ij} = \sqrt{\sum^{p}_{k=1}(x_{ik} - y_{jk})^2} \]
- Manhattan Distance
\[ d_{ij}= {\sum^{p}_{k=1}{|(x_{ik} - y_{jk})}|} \] Dimana, \(x\) dan \(y\) adalah dua vektor dengan panjang \(n\).
3.2 Perhitungan Jarak Matrix
Untuk percobaan perhitungan kali ini menggunakan dataset Data
Produk Category Moto Exterior Accessories Lazada Indonesia per
Region . Data yang diambil akan di-subset
atau hanya menggunakan 15 baris acak yang diambil dari 20 baris yang
ada. Perintah subset dilakukan dengan fungsi
sample(). Selanjutnya, dilakukan
standardized data yang diambil dengan fungsi
scale().
set.seed(123)
ss <- sample(1:20, 15)
df <-dataPKL[ss, ]
df.scaled <- scale(df[,2:6])
print(df.scaled)
GMV ASP IPV_UV CR Stock
[1,] -0.3347284 1.1267285 -0.3398382 -0.93846029 -0.2944481
[2,] -0.2965974 -0.3195891 -0.3075269 -0.04489488 -0.2944381
[3,] -0.3304643 -0.1418262 -0.3326819 -0.16291137 -0.2944474
[4,] -0.2090102 0.1763876 -0.2801795 -0.03907059 -0.2944345
[5,] -0.3348421 1.1239572 -0.3402202 -0.82796009 -0.2944481
[6,] -0.3038635 -0.9507683 -0.2808899 1.09057087 -0.2936502
[7,] 0.6112243 -0.5493752 0.7392172 0.52785410 0.2470200
[8,] -0.3325065 0.4860723 -0.3383692 -0.97805671 -0.2944481
[9,] -0.3348740 -0.8852312 -0.3401451 -1.11231465 -0.2944481
[10,] 3.5080499 -0.6044661 3.4757479 0.48968811 3.5794784
[11,] -0.3348101 2.4533471 -0.3402156 -0.96238942 -0.2944481
[12,] -0.3337309 0.6680655 -0.3401202 2.72106479 -0.2944481
[13,] -0.3101533 -0.8232002 -0.3088495 -0.20325201 -0.2939433
[14,] -0.3348881 -1.0043968 -0.3402286 0.34954128 -0.2944481
[15,] -0.3288056 -0.7557051 -0.3257003 0.09059087 -0.2944478
attr(,"scaled:center")
GMV ASP IPV_UV CR Stock
1.164342e+05 1.030843e+01 8.880109e+05 8.770358e-02 9.445613e+09
attr(,"scaled:scale")
GMV ASP IPV_UV CR Stock
3.476696e+05 8.388530e+00 2.610015e+06 6.696642e-02 3.207904e+10 Dimana:
set.seed(123): Fungsi yang digunakan untuk menentukan seed/Random Number Generator (RNG) agar data/keacakan sesuatu dapat diatur sehingga antara percobaan pertema dan seterusnya menggunakan data acak yang sama.dataPKL[ss, ]: Semua baris di dalam dataset Region mengikuti kondisi yang sesuai pada variabelss, kecuali kolom/field-nya.scale(df[,2:5]): Fungsiscale()akan menghitung mean dan standar deviasi dari seluruh variabeldf, lalu menskalakan setiap elemen dengan nilai-nilai hasil tersebut yaitu mengurangi dengan mean dan membaginya dengan sd. Sebagai contoh perhitungan manualnya di bawah ini.
x <- df$GMV # Mengambil semua baris pada kolom GMV
(x - mean(x)) / sd(x) # Rumus manual fungsi scale()
[1] -0.3347284 -0.2965974 -0.3304643 -0.2090102 -0.3348421 -0.3038635
[7] 0.6112243 -0.3325065 -0.3348740 3.5080499 -0.3348101 -0.3337309
[13] -0.3101533 -0.3348881 -0.32880563.2.1 Menghitung Jarak Euclidean
Untuk menghitungnya, kita dapat menggunakan fungsi
dist().
dist(): Fungsi dari paketstats. Hanya menerima tipe data numerik sebagai input-an.
Dari argumen method juga dapat menerima metode lain,
diantaranya seperti: “euclidean”, “maximum”,
“manhattan”, “canberra”,
“binray”, “minkowski”.
Untuk memudahkan dalam melihat jarak yang dihasilkan oleh fungsi
dist(), kita bisa format ulang vektor
jaraknya ke bentuk matriks menggunakan fungsi
as.matrix().
# Menampilkan matriks 5x5 dari perhitungan jarak Euclidean
round(as.matrix(dist.eucl)[1:5, 1:5], 1)
1 2 3 4 5
1 0.0 1.7 1.5 1.3 0.1
2 1.7 0.0 0.2 0.5 1.6
3 1.5 0.2 0.0 0.4 1.4
4 1.3 0.5 0.4 0.0 1.2
5 0.1 1.6 1.4 1.2 0.0Hasil matriks diatas, nilai merepresentasikan jarak antar objek. Nilai-nilai pada diagonal matriks mewakili jarak antara objek dan dirinya sendiri (yang bernilai nol: 0.0, 0.0, 0.0).
Dimana:
round(..., 1): Fungsi ini membulatkan nilai dengan menetapkan satu bilangan setelah koma.as.matrix(): Fungsi untuk mengkonversi ke bentuk matriks.(dist.eucl)[1:5, 1:5]: Mengambil baris 1 sampai 5 dan kolom 1 sampai 5 dari variabeldist.eucl.
3.2.2 Visualisasi Jarak Matrix
Untuk memvisualisasikan matrix jarak adalah dengan
menggunakan fungsi fviz_dist() dari
packages factoextra.
Dimana untuk heatmap diatas:
- Merah (Warna Orange Tua) yaitu tingkat kesamaan yang tinggi.
- Biru yaitu tingkat kesamaan yang rendah.
Tingkat warna sebanding dengan nilai ketidaksamaan antara hasil pengamatan: Merah jika \(dist(x_i,x_j) = 0\) dan Biru sesuai dengan nilai tertinggi jarak euclidean yang dihitung (lihat bagian legend value). Objek yang termasuk dalam cluster yang sama ditampilkan secara berurutan.
4 Hasil Dan Pembahasan
4.1 Packages atau Library yang Digunakan
4.2 Persiapan Data
Berikut merupakan tahap persiapan data untuk melakukan analisis cluster.
library(readxl)
dataPKL <- read_excel("D:/MBKM/Laporan PKL (LAZADA INDONESIA)/Data PKL (Moto Exterior Accessories)/Data PKL - Analisis Cluster.xlsx")
df <- dataPKL
df <- na.omit(object = df)
df <- scale(df[ ,2:6])
headtail(df) %>%
kable(digits = 4,
align = "c",
col.names = c("Revenue", "ASP", "IPV UV", "CR", "Stock"),
caption = "**Tabel 4. Data Produk *Category Moto Exterior Accessories* Lazada Indonesia per *Region* yang Telah Distandarisasi ke dalam Bentuk *Z-Score***")| Revenue | ASP | IPV UV | CR | Stock | |
|---|---|---|---|---|---|
| [1,] | -0.3793 | -0.2245 | -0.3815 | -0.6380 | -0.2567 |
| [2,] | -0.3461 | -0.9699 | -0.3225 | 0.2346 | -0.2558 |
| [3,] | -0.2405 | 0.2971 | -0.3217 | -0.3191 | -0.2567 |
| [18,] | -0.3806 | 2.8565 | -0.3878 | -0.7717 | -0.2567 |
| [19,] | -0.3380 | -0.2605 | -0.3518 | -0.3220 | -0.2567 |
| [20,] | -0.3531 | -0.8266 | -0.3533 | -0.3996 | -0.2561 |
4.3 K-Means Clustering
K-Means adalah teknik pengelompokan atau clustering yang membagi kumpulan data menjadi sekumpulan k grup, dimana k adalah jumlah grup yang sudah ditentukan sebelumnya.
4.3.1 Menentukan Jumlah Cluster yang Optimal
Untuk menentukan jumlah cluster yang optimal dengan
menggunakan fungsi fviz_nbclust().
fviz_nbclust(x = df, FUNcluster = kmeans, method = "wss", k.max = 15) + labs(subtitle = "Elbow Method")fviz_nbclust(x = df, FUNcluster = kmeans, method = "silhouette", k.max = 15) + labs(subtitle = "Silhouette Method")fviz_nbclust(x = df, FUNcluster = kmeans, method = "gap_stat", k.max = 15) + labs(subtitle = "Statistik Kesenjangan (Gap Statistic)")
Berdasarkan visualisasi ketiga metode di atas, jumlah cluster paling
optimum yaitu k = 4 dan k = 5 dari metode
Elbow (WSS) dan Silhouette. Maka,
proses selanjutnya akan dibandingkan cluster mana yang akan dipakai
dengan nilai between sum of square dan total sum of square. Jumlah
cluster tidak bergantung penuh pada Teknik-teknik penentuan k-optimal.
Jumlah cluster juga dapat kita tentukan sendiri sesuai dengan
kebutuhan.
Dimana penjelasan code diatas yaitu:
fviz_nbclust(): Fungsi yang menentukan dan memvisualisasikan jumlah cluster yang optimal.x = df: Variabelxuntuk memanggil dataframedf.FUNcluster = kmeans: Parameter partisi atau yang berfungsi untuk membagi clustermethod = "wss": Metode yang digunakan untuk memperkirakan jumlah cluster dapat juga menggunakan"silhouette"atau"gap_stat".
4.3.2 Menghitung dan Visualisasi K-Means Clustering
Analisis cluster dapat dilakukan dengan fungsi
kmeans() dan menggunakan data yang telah
distandardisasi.
4.3.2.1 k = 4
set.seed(123)
km.resultk4 <- kmeans(x = df, centers = 4, nstart = 25)
str(km.resultk4) #Menampilkan struktur variabel km.result
List of 9
$ cluster : int [1:20] 2 2 2 3 2 2 2 2 4 1 ...
$ centers : num [1:4, 1:5] -0.38 -0.103 3.898 -0.38 1.557 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:4] "1" "2" "3" "4"
.. ..$ : chr [1:5] "GMV" "ASP" "IPV_UV" "CR" ...
$ totss : num 95
$ withinss : num [1:4] 2.6 9.09 0 3.18
$ tot.withinss: num 14.9
$ betweenss : num 80.1
$ size : int [1:4] 4 12 1 3
$ iter : int 3
$ ifault : int 0
- attr(*, "class")= chr "kmeans"
km.resultk4$cluster #Menampilkan hasil K-Means Cluster dari 34 Provinsi yang menjadi 3 Cluster
[1] 2 2 2 3 2 2 2 2 4 1 1 2 4 2 1 4 2 1 2 2
fviz_cluster(object = km.resultk4, data = df, palette = "viridis", ggtheme = theme_gray())4.3.2.2 k = 5
set.seed(123)
km.resultk5 <- kmeans(x = df, centers = 5, nstart = 25)
str(km.resultk5) #Menampilkan struktur variabel km.result
List of 9
$ cluster : int [1:20] 3 3 3 5 3 2 2 3 4 1 ...
$ centers : num [1:5, 1:5] -0.38 0.881 -0.3 -0.38 3.898 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:5] "1" "2" "3" "4" ...
.. ..$ : chr [1:5] "GMV" "ASP" "IPV_UV" "CR" ...
$ totss : num 95
$ withinss : num [1:5] 2.598 0.386 3.032 3.178 0
$ tot.withinss: num 9.19
$ betweenss : num 85.8
$ size : int [1:5] 4 2 10 3 1
$ iter : int 3
$ ifault : int 0
- attr(*, "class")= chr "kmeans"
km.resultk5$cluster #Menampilkan hasil K-Means Cluster dari 34 Provinsi yang menjadi 3 Cluster
[1] 3 3 3 5 3 2 2 3 4 1 1 3 4 3 1 4 3 1 3 3
fviz_cluster(object = km.resultk5, data = df, palette = "viridis", ggtheme = theme_gray())Dimana penjelasan code diatas yaitu:
kmeans(): Proses Clustering pada data matriks dengan perhitungan K-Means.x = df: Variabelxuntuk memanggil dataframedf.centers = 4 atau 5: Jumlah k atau cluster yang didapat atau diinginkan.nstart = 25: Jumlah random sets yang dipilih (berlaku hanya jika parametercenterberisi angka)fviz_cluster(): Fungsi untuk memvisualisasikan hasil clustering.object = km.result: Objek yang berisi hasil partisi dari fungsikmeans().data = df:dfadalah data yang sudah digunakan untuk clustering. Ini hanya digunakan bila objeknya berbentuk class yang terlihat seperti di akhir baris dari kodestr(km.result)diatas.ggtheme = theme_gray(): Tema yang disediakan packagesggplot2. Terdapat beberapa pilihan sepertitheme_minimal(),theme_classic(), dan lain-lain.
4.3.3 Mengembalikan Nilai Centroid
Nilai mean/centroid yang termuat masih dalam nilai yang distandardisasi, maka nilainya perlu dikembalikan ke nilai awal untuk mengidentifikasi karakteristik sebenarnya dari tiap cluster.
nilai.centroid <- dataPKL %>%
mutate(Cluster = km.resultk5$cluster) %>%
group_by(Cluster) %>%
summarise(Mean_GMV = mean(GMV), Mean_ASP = mean(ASP), Mean_IPVUV = mean(IPV_UV), Mean_CR = mean(CR), Mean_Stock = mean(Stock))- Untuk mempermudah melihat karakteristik tiap cluster dari nilai centroid akan dibentuk Tabel berikut:
nilai.centroid %>%
kable(digits = 6,
align = "c",
col.names = c("Cluster", "Mean_GMV", "Mean_ASP", "Mean_IPVUV", "Mean_CR", "Mean_Stock"),
caption = "**Tabel 5. Nilai Centroid Tiap Cluster**")| Cluster | Mean_GMV | Mean_ASP | Mean_IPVUV | Mean_CR | Mean_Stock |
|---|---|---|---|---|---|
| 1 | 235.4167 | 21.192766 | 1491.0000 | 0.025645 | 291 |
| 2 | 394010.7787 | 6.470760 | 3365306.5000 | 0.122818 | 9234299007 |
| 3 | 25184.2291 | 5.689610 | 170062.4000 | 0.085852 | 18456759 |
| 4 | 220.1754 | 10.526238 | 152.6667 | 0.415516 | 633 |
| 5 | 1336076.3491 | 5.237845 | 9959766.0000 | 0.120496 | 124271838136 |
4.3.4 Pengelompokkan Objek ke dalam Cluster
Pengelompokkan objek ke dalam cluster yang terbentuk dapat dilihat dari code berikut:
final.kmeans <- dataPKL %>%
mutate(Cluster = km.resultk5$cluster) %>%
select(`Region`, Cluster) %>%
arrange(Cluster)- Untuk mempermudah pengelompokkan objek ke dalam cluster dibuat Tabel berikut:
final.kmeans %>%
kable(digits = 2,
align = "c",
col.names = c("Region", "Cluster"),
caption = "**Tabel 6. Hasil Pengelompokkan Objek ke dalam Cluster**")| Region | Cluster |
|---|---|
| Kalimantan Utara | 1 |
| Kepulauan Riau | 1 |
| Sulawesi Barat | 1 |
| Sumatera Barat | 1 |
| Jawa Barat | 2 |
| Jawa Tengah | 2 |
| Bali | 3 |
| Banten | 3 |
| Daerah Istimewa Yogyakarta | 3 |
| Jambi | 3 |
| Jawa Timur | 3 |
| Lampung | 3 |
| Riau | 3 |
| Sulawesi Utara | 3 |
| Sumatera Selatan | 3 |
| Sumatera Utara | 3 |
| Kalimantan Tengah | 4 |
| Nusa Tenggara Barat | 4 |
| Sulawesi Selatan | 4 |
| JABODETABEK | 5 |
4.4 Hasil Akhir K-Means Clustering
- Untuk mempermudah dalam menginterpretasikan hasil K-Means Clustering akan dibuat Tabel berikut:
# Memanggil & menampilkan hasil clustering Tabel 6. yang dikelompokkan per Cluster, kemudian menggabungkannya dengan Tabel 5. Nilai Centroid untuk mempermudah interpretasi
tabelfinal.kmeansregion <- read_excel("D:/MBKM/Laporan PKL (LAZADA INDONESIA)/Data PKL (Moto Exterior Accessories)/Tabel 7. Hasil Clustering Region.xlsx")
tabelFINAL <- as.data.frame(c(nilai.centroid, tabelfinal.kmeansregion[,2]))
tabelFINAL %>%
kable(digits = 7,
align = "c",
col.names = c("Cluster", "Mean_GMV", "Mean_ASP", "Mean_IPVUV", "Mean_CR", "Mean_Stock", "Region"),
caption = "**Tabel 7. Nilai Centroid & Hasil Pengelompokkan Region Tiap Cluster**")| Cluster | Mean_GMV | Mean_ASP | Mean_IPVUV | Mean_CR | Mean_Stock | Region |
|---|---|---|---|---|---|---|
| 1 | 235.4167 | 21.192766 | 1491.0000 | 0.0256447 | 291 | Kalimantan Utara, Kepulauan Riau, Sulawesi Barat, & Sumatera Barat |
| 2 | 394010.7787 | 6.470760 | 3365306.5000 | 0.1228178 | 9234299007 | Jawa Barat dan Jawa Tengah |
| 3 | 25184.2291 | 5.689610 | 170062.4000 | 0.0858517 | 18456759 | Bali, Banten, Daerah Istimewa Yogyakarta, Jambi, Jawa Timur, Lampung, Riau, Sulawesi Utara, Sumatera Selatan, & Sumatera Utara |
| 4 | 220.1754 | 10.526238 | 152.6667 | 0.4155159 | 633 | Kalimantan Tengah, Nusa Tenggara Barat, dan Sulawesi Selatan |
| 5 | 1336076.3490 | 5.237845 | 9959766.0000 | 0.1204962 | 124271838136 | JABODETADEK |