Project ini dilakukan untuk tugas Learning By Building sebagai pendalaman dan pembelajaran mandiri atas materi Cluster. Analisis menggunakan dataset “Credit_Card” untuk membuat segmentasi kostumer yang nantinya akan dipakai untuk menentukan strategi marketing. Datasest memuat perilaku dari 9000 orang pemilik kartu kredit aktif selama 6 bulan yang disusun atas 17 variabel dan 1 Customer ID.
<- read.csv("Credit_Card/CC GENERAL.csv")
credit glimpse(credit)
## Rows: 8,950
## Columns: 18
## $ CUST_ID <chr> "C10001", "C10002", "C10003", "C10004…
## $ BALANCE <dbl> 40.90075, 3202.46742, 2495.14886, 166…
## $ BALANCE_FREQUENCY <dbl> 0.818182, 0.909091, 1.000000, 0.63636…
## $ PURCHASES <dbl> 95.40, 0.00, 773.17, 1499.00, 16.00, …
## $ ONEOFF_PURCHASES <dbl> 0.00, 0.00, 773.17, 1499.00, 16.00, 0…
## $ INSTALLMENTS_PURCHASES <dbl> 95.40, 0.00, 0.00, 0.00, 0.00, 1333.2…
## $ CASH_ADVANCE <dbl> 0.0000, 6442.9455, 0.0000, 205.7880, …
## $ PURCHASES_FREQUENCY <dbl> 0.166667, 0.000000, 1.000000, 0.08333…
## $ ONEOFF_PURCHASES_FREQUENCY <dbl> 0.000000, 0.000000, 1.000000, 0.08333…
## $ PURCHASES_INSTALLMENTS_FREQUENCY <dbl> 0.083333, 0.000000, 0.000000, 0.00000…
## $ CASH_ADVANCE_FREQUENCY <dbl> 0.000000, 0.250000, 0.000000, 0.08333…
## $ CASH_ADVANCE_TRX <int> 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ PURCHASES_TRX <int> 2, 0, 12, 1, 1, 8, 64, 12, 5, 3, 12, …
## $ CREDIT_LIMIT <dbl> 1000, 7000, 7500, 7500, 1200, 1800, 1…
## $ PAYMENTS <dbl> 201.8021, 4103.0326, 622.0667, 0.0000…
## $ MINIMUM_PAYMENTS <dbl> 139.50979, 1072.34022, 627.28479, NA,…
## $ PRC_FULL_PAYMENT <dbl> 0.000000, 0.222222, 0.000000, 0.00000…
## $ TENURE <int> 12, 12, 12, 12, 12, 12, 12, 12, 12, 1…
# meng-assign nilai dari kolom Distillery menjadi rownames
<- credit %>%
credit column_to_rownames(var = "CUST_ID")
head(credit)
## BALANCE BALANCE_FREQUENCY PURCHASES ONEOFF_PURCHASES
## C10001 40.90075 0.818182 95.40 0.00
## C10002 3202.46742 0.909091 0.00 0.00
## C10003 2495.14886 1.000000 773.17 773.17
## C10004 1666.67054 0.636364 1499.00 1499.00
## C10005 817.71434 1.000000 16.00 16.00
## C10006 1809.82875 1.000000 1333.28 0.00
## INSTALLMENTS_PURCHASES CASH_ADVANCE PURCHASES_FREQUENCY
## C10001 95.40 0.000 0.166667
## C10002 0.00 6442.945 0.000000
## C10003 0.00 0.000 1.000000
## C10004 0.00 205.788 0.083333
## C10005 0.00 0.000 0.083333
## C10006 1333.28 0.000 0.666667
## ONEOFF_PURCHASES_FREQUENCY PURCHASES_INSTALLMENTS_FREQUENCY
## C10001 0.000000 0.083333
## C10002 0.000000 0.000000
## C10003 1.000000 0.000000
## C10004 0.083333 0.000000
## C10005 0.083333 0.000000
## C10006 0.000000 0.583333
## CASH_ADVANCE_FREQUENCY CASH_ADVANCE_TRX PURCHASES_TRX CREDIT_LIMIT
## C10001 0.000000 0 2 1000
## C10002 0.250000 4 0 7000
## C10003 0.000000 0 12 7500
## C10004 0.083333 1 1 7500
## C10005 0.000000 0 1 1200
## C10006 0.000000 0 8 1800
## PAYMENTS MINIMUM_PAYMENTS PRC_FULL_PAYMENT TENURE
## C10001 201.8021 139.5098 0.000000 12
## C10002 4103.0326 1072.3402 0.222222 12
## C10003 622.0667 627.2848 0.000000 12
## C10004 0.0000 NA 0.000000 12
## C10005 678.3348 244.7912 0.000000 12
## C10006 1400.0578 2407.2460 0.000000 12
Berikut adalah deskripsi dari variabel pada dataset di atas.
CUSTID : Identifikasi dari pemegang kartu kredit
BALANCE: Jumlah uang yang tersisa di akun mereka untuk melakukan pembelian
BALANCEFREQUENCY: Seberapa sering balance diupdate, score antara 0 dan 1 (1 = Sering diupdate, 0 = Tidak sering diupdate)
PURCHASES: Jumlah nilai pembelian yang dilakukan
ONEOFFPURCHASES: Maksimum nilai pembelian dilakukan sekali transaksi cash
INSTALLMENTSPURCHASES: Jumlah nilai pembelian yang dilakukan dengan cicilan
CASHADVANCE: Penarikan tunai oleh user
PURCHASESFREQUENCY: Seberapa sering pembelian dilakukan, score antara 0 dan 1 (1 = Sering melakukan pembelian, 0 = Tidak sering melakukan pembelian)
ONEOFFPURCHASESFREQUENCY: Seberapa sering pembelian dilakukan cash, score antara 0 dan 1 (1 = Sering dilakukan, 0 = Tidak sering dilakukan)
PURCHASESINSTALLMENTSFREQUENCY: Seberapa sering pembelian dilakukan cicil, score antara 0 dan 1 (1 = Sering dilakukan, 0 = Tidak sering dilakukan)
CASHADVANCEFREQUENCY: Seberapa sering penarikan tunai dibayar
CASHADVANCETRX: Jumlah transaksi melalui penarikan tunai
PURCHASESTRX: Jumlah transaksi pembelian
CREDITLIMIT: Limit Kartu Kredit
PAYMENTS: Jumlah nilai pembayaran yang dilakukan
MINIMUM_PAYMENTS: Nilai pembayaran minimum yang dilakukan
PRCFULLPAYMENT: Persentase pembayaran full payment
TENURE : Jangka waktu pinjaman
Seluruh variabel yang ada pada dataset akan digunakan dalam proses cluster. Tidak perlu dilakukan perubahan jenis data karena semua data pada dataset sudah berbentuk Numerik sehingga bisa langsung digunakan.
Kita perlu untuk melakukan cek kelengkapan data untuk memastikan tidak ada data yang bolong.
colSums(is.na(credit))
## BALANCE BALANCE_FREQUENCY
## 0 0
## PURCHASES ONEOFF_PURCHASES
## 0 0
## INSTALLMENTS_PURCHASES CASH_ADVANCE
## 0 0
## PURCHASES_FREQUENCY ONEOFF_PURCHASES_FREQUENCY
## 0 0
## PURCHASES_INSTALLMENTS_FREQUENCY CASH_ADVANCE_FREQUENCY
## 0 0
## CASH_ADVANCE_TRX PURCHASES_TRX
## 0 0
## CREDIT_LIMIT PAYMENTS
## 1 0
## MINIMUM_PAYMENTS PRC_FULL_PAYMENT
## 313 0
## TENURE
## 0
Pada datase ditemukan ada beberapa kolom yang datanya tidak lengkap, yakni: MINIMUM_PAYMENTS sebanyak 313 baris dan CREDIT_LIMIT sebanyak 1 baris. Seluruh baris yang datanya tidak lengkap akan dibuang.
<- drop_na(credit)
credit_clean #colSums(is.na(credit_clean))
Setelah data dinilai lengkap dan sesuai selanjutnya dilakukan pengecekan terhadap skala antar variabel.
summary(credit_clean)
## BALANCE BALANCE_FREQUENCY PURCHASES ONEOFF_PURCHASES
## Min. : 0.0 Min. :0.0000 Min. : 0.00 Min. : 0.00
## 1st Qu.: 148.1 1st Qu.:0.9091 1st Qu.: 43.37 1st Qu.: 0.00
## Median : 916.9 Median :1.0000 Median : 375.40 Median : 44.99
## Mean : 1601.2 Mean :0.8950 Mean : 1025.43 Mean : 604.90
## 3rd Qu.: 2105.2 3rd Qu.:1.0000 3rd Qu.: 1145.98 3rd Qu.: 599.10
## Max. :19043.1 Max. :1.0000 Max. :49039.57 Max. :40761.25
## INSTALLMENTS_PURCHASES CASH_ADVANCE PURCHASES_FREQUENCY
## Min. : 0.00 Min. : 0.0 Min. :0.00000
## 1st Qu.: 0.00 1st Qu.: 0.0 1st Qu.:0.08333
## Median : 94.78 Median : 0.0 Median :0.50000
## Mean : 420.84 Mean : 994.2 Mean :0.49600
## 3rd Qu.: 484.15 3rd Qu.: 1132.4 3rd Qu.:0.91667
## Max. :22500.00 Max. :47137.2 Max. :1.00000
## ONEOFF_PURCHASES_FREQUENCY PURCHASES_INSTALLMENTS_FREQUENCY
## Min. :0.00000 Min. :0.0000
## 1st Qu.:0.00000 1st Qu.:0.0000
## Median :0.08333 Median :0.1667
## Mean :0.20591 Mean :0.3688
## 3rd Qu.:0.33333 3rd Qu.:0.7500
## Max. :1.00000 Max. :1.0000
## CASH_ADVANCE_FREQUENCY CASH_ADVANCE_TRX PURCHASES_TRX CREDIT_LIMIT
## Min. :0.0000 Min. : 0.000 Min. : 0.00 Min. : 50
## 1st Qu.:0.0000 1st Qu.: 0.000 1st Qu.: 1.00 1st Qu.: 1600
## Median :0.0000 Median : 0.000 Median : 7.00 Median : 3000
## Mean :0.1376 Mean : 3.314 Mean : 15.03 Mean : 4522
## 3rd Qu.:0.2500 3rd Qu.: 4.000 3rd Qu.: 18.00 3rd Qu.: 6500
## Max. :1.5000 Max. :123.000 Max. :358.00 Max. :30000
## PAYMENTS MINIMUM_PAYMENTS PRC_FULL_PAYMENT TENURE
## Min. : 0.05 Min. : 0.02 Min. :0.0000 Min. : 6.00
## 1st Qu.: 418.56 1st Qu.: 169.16 1st Qu.:0.0000 1st Qu.:12.00
## Median : 896.68 Median : 312.45 Median :0.0000 Median :12.00
## Mean : 1784.48 Mean : 864.30 Mean :0.1593 Mean :11.53
## 3rd Qu.: 1951.14 3rd Qu.: 825.50 3rd Qu.:0.1667 3rd Qu.:12.00
## Max. :50721.48 Max. :76406.21 Max. :1.0000 Max. :12.00
Pada dataset ditemukan perbedaan skala yang cukup besar di antara variabel yang ada karena itu perlu dilakukan scaling agar perbedaan range antar variabel tidak terlalu besar.
<- scale(credit_clean)
credit_clean_scale summary(credit_clean_scale)
## BALANCE BALANCE_FREQUENCY PURCHASES ONEOFF_PURCHASES
## Min. :-0.7641 Min. :-4.30933 Min. :-0.47318 Min. :-0.359139
## 1st Qu.:-0.6934 1st Qu.: 0.06767 1st Qu.:-0.45317 1st Qu.:-0.359139
## Median :-0.3266 Median : 0.50538 Median :-0.29995 Median :-0.332425
## Mean : 0.0000 Mean : 0.00000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 0.2405 3rd Qu.: 0.50538 3rd Qu.: 0.05563 3rd Qu.:-0.003444
## Max. : 8.3232 Max. : 0.50538 Max. :22.15586 Max. :23.841455
## INSTALLMENTS_PURCHASES CASH_ADVANCE PURCHASES_FREQUENCY
## Min. :-0.45881 Min. :-0.46863 Min. :-1.236067
## 1st Qu.:-0.45881 1st Qu.:-0.46863 1st Qu.:-1.028396
## Median :-0.35548 Median :-0.46863 Median : 0.009968
## Mean : 0.00000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 0.06902 3rd Qu.: 0.06515 3rd Qu.: 1.048332
## Max. :24.07116 Max. :21.75062 Max. : 1.256004
## ONEOFF_PURCHASES_FREQUENCY PURCHASES_INSTALLMENTS_FREQUENCY
## Min. :-0.6862 Min. :-0.9265
## 1st Qu.:-0.6862 1st Qu.:-0.9265
## Median :-0.4085 Median :-0.5078
## Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.4247 3rd Qu.: 0.9575
## Max. : 2.6465 Max. : 1.5855
## CASH_ADVANCE_FREQUENCY CASH_ADVANCE_TRX PURCHASES_TRX CREDIT_LIMIT
## Min. :-0.6819 Min. :-0.47941 Min. :-0.5970 Min. :-1.2221
## 1st Qu.:-0.6819 1st Qu.:-0.47941 1st Qu.:-0.5573 1st Qu.:-0.7986
## Median :-0.6819 Median :-0.47941 Median :-0.3190 Median :-0.4160
## Mean : 0.0000 Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.5570 3rd Qu.: 0.09925 3rd Qu.: 0.1178 3rd Qu.: 0.5405
## Max. : 6.7515 Max. :17.31443 Max. :13.6203 Max. : 6.9626
## PAYMENTS MINIMUM_PAYMENTS PRC_FULL_PAYMENT TENURE
## Min. :-0.61325 Min. :-0.36428 Min. :-0.53770 Min. :-4.2216
## 1st Qu.:-0.46942 1st Qu.:-0.29299 1st Qu.:-0.53770 1st Qu.: 0.3552
## Median :-0.30511 Median :-0.23260 Median :-0.53770 Median : 0.3552
## Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.0000
## 3rd Qu.: 0.05728 3rd Qu.:-0.01636 3rd Qu.: 0.02485 3rd Qu.: 0.3552
## Max. :16.81794 Max. :31.83974 Max. : 2.83759 Max. : 0.3552
kita akan melakukan clustering dengan menggunakan metode K-Means. K-means adalah centroid-based clustering algorithms, artinya tiap cluster memiliki satu centroid/titik pusat yang mewakili cluster tersebut (sebanyak k). Pengelompokkan data berdasarkan kemiripan karakteristik, dimana observasi pada satu cluster yang sama semakin mirip dan sebaliknya observasi dari cluster yang berbeda semakin berbeda/jauh.
K
OptimumPenentuan k optimum menggunakan elbow method pada visualisasi dengan
menggunakan fungsi fviz_nbclust()
fviz_nbclust(x = credit_clean_scale, FUNcluster = kmeans, method = "wss")
Terlihat bahwa K-optimum ada di angka 4
# k-means dengan 3 cluster
RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)
<- kmeans(x = credit_clean_scale, centers = 4)
credit_kmeans <- kmeans(x = credit_clean_scale, centers = 6) #sebagai pembanding untuk nilai Rasio BSS/TSS credit_kmeans_6
Untuk melihat kebaikan dari hasil Clustering, analisis ini akan menggunakan Rasio BSS/TSS. Hasil yang bagus adalah ketika angka dari Rasio BSS/TSS mendekati 1 karena kelompok hasil clustering semakin mewakili persebaran data yang sesungguhnya
# cek rasio BSS/TSS
$betweenss/credit_kmeans$totss credit_kmeans
## [1] 0.3485114
$betweenss/credit_kmeans$totss credit_kmeans_6
## [1] 0.4435349
Hasil Rasio BSS/TSS dari cluster yang terbentuk berada di angka 0.3485 tidak jauh berbeda dengan rasionya ketika cluster berjumlah lebih banyak (6). Hal ini berarti cluster yang terbentuk sudah baik karena rasio mendekati angka 1 dan jumlah cluster masih terhitung sedikit (4).
Dari hasil cluster yang sudah dibuat kita dapat melihat jumlah observasi untuk tiap cluster
$size credit_kmeans
## [1] 3814 3276 1155 391
Perlu dilakukan penentuan pusat cluster yang akan digunakan untuk melihat profil dan membuat label untuk masing-masing cluster berdasarkan 17 variabel yang ada pada dataset.
as.data.frame(credit_kmeans$centers)
## BALANCE BALANCE_FREQUENCY PURCHASES ONEOFF_PURCHASES
## 1 -0.2583188 -0.3658865 -0.3465002 -0.233693191
## 2 -0.3262022 0.2468721 0.1126475 0.004264522
## 3 1.4570937 0.3570119 -0.2403425 -0.169600023
## 4 0.9486524 0.4460078 3.1460718 2.744816577
## INSTALLMENTS_PURCHASES CASH_ADVANCE PURCHASES_FREQUENCY
## 1 -0.3895629 -0.1833030 -0.7988029
## 2 0.2582812 -0.3653530 0.9771706
## 3 -0.2566518 1.6943725 -0.5129989
## 4 2.3941088 -0.1559753 1.1200438
## ONEOFF_PURCHASES_FREQUENCY PURCHASES_INSTALLMENTS_FREQUENCY
## 1 -0.3929036 -0.7162568
## 2 0.3222531 0.8691288
## 3 -0.2206328 -0.4552502
## 4 1.7843074 1.0494916
## CASH_ADVANCE_FREQUENCY CASH_ADVANCE_TRX PURCHASES_TRX CREDIT_LIMIT PAYMENTS
## 1 -0.09246162 -0.1599999 -0.4767967 -0.34588946 -0.2654666
## 2 -0.46456538 -0.3613717 0.2977302 -0.06928368 -0.1386313
## 3 1.73410714 1.6120383 -0.2891468 0.85427789 0.6090544
## 4 -0.32820699 -0.1734290 3.0104937 1.43095846 1.9518869
## MINIMUM_PAYMENTS PRC_FULL_PAYMENT TENURE
## 1 -0.12270995 -0.2524492 -0.04363260
## 2 -0.08902596 0.3881404 0.05316575
## 3 0.49496706 -0.4183565 -0.11373867
## 4 0.48076171 0.4462792 0.31614291
Memasukkan nama untuk masing-masing cluster ke data awal dengan nama label_cluster
$label_cluster <- credit_kmeans$cluster credit_clean
Melakukan profiling dengan summarise data
<- credit_clean %>%
credit_clean_centroid group_by(label_cluster) %>%
summarise_all(mean)
credit_clean_centroid
## # A tibble: 4 × 18
## label_cluster BALANCE BALANCE_FREQUENCY PURCHASES ONEOFF_PURCHASES
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 1060. 0.819 275. 211.
## 2 2 918. 0.946 1270. 612.
## 3 3 4655. 0.969 505. 319.
## 4 4 3589. 0.988 7843. 5228.
## # … with 13 more variables: INSTALLMENTS_PURCHASES <dbl>, CASH_ADVANCE <dbl>,
## # PURCHASES_FREQUENCY <dbl>, ONEOFF_PURCHASES_FREQUENCY <dbl>,
## # PURCHASES_INSTALLMENTS_FREQUENCY <dbl>, CASH_ADVANCE_FREQUENCY <dbl>,
## # CASH_ADVANCE_TRX <dbl>, PURCHASES_TRX <dbl>, CREDIT_LIMIT <dbl>,
## # PAYMENTS <dbl>, MINIMUM_PAYMENTS <dbl>, PRC_FULL_PAYMENT <dbl>,
## # TENURE <dbl>
Menampilkan cluster dengan nilai terendah dan tertinggi untuk masing-masing karakteristik
%>%
credit_clean_centroid ::pivot_longer(-label_cluster) %>%
tidyrgroup_by(name) %>%
summarize(cluster_min_val = which.min(value),
cluster_max_val = which.max(value))
## # A tibble: 17 × 3
## name cluster_min_val cluster_max_val
## <chr> <int> <int>
## 1 BALANCE 2 3
## 2 BALANCE_FREQUENCY 1 4
## 3 CASH_ADVANCE 2 3
## 4 CASH_ADVANCE_FREQUENCY 2 3
## 5 CASH_ADVANCE_TRX 2 3
## 6 CREDIT_LIMIT 1 4
## 7 INSTALLMENTS_PURCHASES 1 4
## 8 MINIMUM_PAYMENTS 1 3
## 9 ONEOFF_PURCHASES 1 4
## 10 ONEOFF_PURCHASES_FREQUENCY 1 4
## 11 PAYMENTS 1 4
## 12 PRC_FULL_PAYMENT 3 4
## 13 PURCHASES 1 4
## 14 PURCHASES_FREQUENCY 1 4
## 15 PURCHASES_INSTALLMENTS_FREQUENCY 1 4
## 16 PURCHASES_TRX 1 4
## 17 TENURE 3 4
Cluster 1:
Paling tinggi: None
Paling rendah: Balance Frequency, Credit Limit, Installment Purchase, Minimum Payment, Oneoff Purchase, One Off Purchase Frequency, Payments, Purchase, Purchase Frequency, Purchases Installments Frequency, PurchasesTrx.
Insight: Kustomer dengan penggunaan kartu kredit biasa-biasa saja/minimum, dan sangat mengindari belanja baik dengan atau tanpa cicilan.
Cluster 2:
Paling tinggi: None
Paling rendah: Balance, Cash Advance, Cash Advance Frequency, Cash Advance Transaksi.
Insight: Kustomer dengan penggunaan kartu kredit biasa-biasa saja/minimum, dan sangat menghindari adanya tarik tunai.
Cluster 3:
Paling tinggi: Balance, Cash Advance, Cash Advance Frequency, Cash Advance Transaksi, Minimum Payment.
Paling rendah: Tenure
Insight: Kustomer dengan kebutuhan tarik tunai tinggi, kartu kredit jarang digunkan untuk pembelian cicilan terutama dengan jangka waktu yang panjang.
Cluster 4:
Paling tinggi: Balance Frequency, Credit Limit, Installment Purchase, Oneoff Purchase, Oneoff Purchase Frequency, Payments, Purchase, Purchase Frequency, Purchases Installments Frequency, PurchasesTrx, Tenure.
Paling rendah: None
Insight: Kustomer dengan penggunaan kartu kredit yang sangat maksimal untuk tujuan belanja, baik dengan atau tanpa cicilan.
Insight pada masing-masing cluster di atas kemudian dapat digunakan oleh bank yang memberikan layanan kartu kredit tersebut untuk membuat strategi yang mampu menyasar masing-masing cluster yang disesuaikan tujuan dan jumlah resources yang ingin diinvestasikan, seperti misalnya memberikan informasi promo terbaru untuk kustomer yang sudah sering menggunakan kartu kredit untuk keperluan belanja dan memberikan informasi manfaat-manfaat kartu kredit lainnya di luar pembelanjaan (contoh: cash advance dan asuransi) untuk kustomer yang tidak banyak menggunakan kartu kredit yang mereka miliki untuk keperluan belanja.
Jika kita ingin buat sebuah visualisasi yang mempermudah cluster
profiling, dimana tampil gabungan individual + variable factor map
menjadi satu. Visualisasi dapat dibuat menggunakan fungsi
fviz_pca_biplot()
dari package factoextra
.
# PCA menggunakan FactoMineR
<- PCA(X = credit_clean, # data awal
credit_pca scale.unit = T, #tidak dilakukan scaling
graph = F)
# visualisasi PCA + hasil kmeans clustering
fviz_pca_biplot(X = credit_pca,
habillage = "label_cluster",
geom.ind = "point",
addEllipses = TRUE,
alpha.var = 0.1,
col.var = "#7b7675")