PARTITION BASED CLUSTERING

CONTOH 8.1 K-MEANS CLUSTERING

Impor package dan data

data(USArrests)
head(USArrests)

Interpretasi: Pada bagian ini K-MEANS, kita mengimpor dataset USArrests.

Rescaling data

USArrScale <- scale(USArrests, scale=T)
head(USArrScale)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

Interpretasi: Pada bagian ini, kita melakukan rescaling pada dataset USArrests menggunakan fungsi scale.

K-Means dengan K=3

set.seed(123) # untuk memastikan hasil yang konsisten
kMres <- kmeans(USArrScale, centers=3)
kMres $cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              3              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              3              3              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              1              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3
kMres$size
## [1] 20 13 17

Interpretasi: Pada bagian ini, kita melakukan K-Means clustering dengan jumlah cluster (K) ditetapkan sebanyak 3. Hasilnya adalah label cluster untuk setiap baris data dan ukuran masing-masing cluster.

Plot hasil clustering

pairs(USArrScale, col=c(1:3)[kMres $cluster], pch=16, main="K-Means Clustering with K=3")

Interpretasi: Terlihat pada gambar di atas hasil pengelompokkan dari kelompok 1 (berwarna merah), kelompok 2 (berwarna hijau), dan kelompok 3 (berwarna hitam). Negara kelompok 1 adalah negara dengan tingkat kejahatan rendah. Kelompok 2 adalah negara dengan tingkat kejahatan sedang, dan kelompok 3 adalah negara dengan tingkat kejahatan tinggi. Perlu diperhatikan algoritma K-Means menghasilkan hasil yang berbeda-beda karena adanya proses randomisasi.

Perbedaan centroid, memberikan hasil berbeda

set.seed(12)
kMres1 <- kmeans(USArrScale, centers=3)
head(kMres1 $cluster)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          3          1          1
kMres2 <- kmeans(USArrScale, centers=3)
head(kMres2 $cluster)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          2          3          3          2          3          3
#aggreement cluster membership
table(kMres1 $cluster, kMres2 $cluster)
##    
##      1  2  3
##   1  0  7 13
##   2 13  0  0
##   3 16  1  0

Interpretasi: Tabel di atas memperlihatkan agreement/kesesuaian anara cluster membership dari dua kali run. Terlihat dari tabel terdapat beberapa disagreement hasil clustering. Hal ini menunjukkan bahwa K-Means clustering dapat menghasilkan hasil yang berbeda tergantung pada inisialisasi centroid awal. Hal ini dapat diatasi dengan ensemble, dengan melakukan beberapa kali run K-Means clustering dengan inisialisasi centroid yang berbeda, kemudian mengambil hasil clustering yang paling sering muncul (mode) sebagai hasil akhir.

HIERARCHICAL CLUSTERING

#Pakai data scale pada contoh 8.1
head(USArrScale)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207
#Hitung distance euclidean
distArrest <- dist(USArrScale, method = "euclidean")

Interpretasi: Pada bagian ini, kita menghitung jarak antar data menggunakan metode Euclidean. Fungsi dist digunakan untuk menghasilkan matriks jarak antar baris dalam dataset USArrScale.

CONTOH 7.2 SINGLE LINKAGE

res1 <- hclust(distArrest, method = "single")

#dendogram
plot(res1, labels = rownames(USArrests), main = "Single Linkage Dendrogram", xlab = "Distance", ylab = "Cluster")
rect.hclust(res1, k=3, border="red")

Interpretasi: Pada bagian ini dan selanjutnya, kita melakukan hierarchical clustering menggunakan fungsi hclust. Single linkage menghubungkan dua cluster berdasarkan jarak terdekat antara anggota dari kedua cluster. Single linkage cenderung menghasilkan cluster yang lebih panjang dan rantai, karena menghubungkan berdasarkan jarak terdekat.

CONTOH 7.2 COMPLETE LINKAGE

res2 <- hclust(distArrest, method = "complete")
plot(res2, labels = rownames(USArrests), main = "Complete Linkage Dendrogram", xlab = "Distance", ylab = "Cluster")
rect.hclust(res2, k=4, border="red")

Interpretasi: Complete linkage menghubungkan dua cluster berdasarkan jarak terjauh antara anggota dari kedua cluster. dibagi menjadi 4 cluster, dengan garis merah menunjukkan batas cluster. Ini menghasilkan cluster yang lebih terpisah dan kompak dibandingkan dengan single linkage.

CONTOH 7.2 AVERAGE LINKAGE

res3 <- hclust(distArrest, method = "average")
plot(res3, hang=-2,labels = rownames(USArrests), main = "Average Linkage Dendrogram", xlab = "Distance", ylab = "Cluster")
rect.hclust(res3, k=2, border="red")

Interpretasi: Average linkage menghubungkan dua cluster berdasarkan rata-rata jarak antara anggota dari kedua cluster. Dibagi menjadi 2 cluster, dengan garis merah menunjukkan batas cluster.

CONTOH 7.2 WARD LINKAGE

res4 <- hclust(distArrest, method = "ward.D")
plot(res4, hang=-1, cex=0.6, labels = rownames(USArrests), main = "Ward Linkage Dendrogram", xlab = "Distance", ylab = "Cluster")
rect.hclust(res4, k=4, border="red")

Interpretasi: Ward linkage menghubungkan dua cluster dengan cara meminimalkan jumlah kuadrat jarak antar anggota cluster. Ini menghasilkan cluster yang lebih kompak.

#cluster member res4 k=4
cutree(res4, k=4)
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              2              2              3              2 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              2              3              3              2              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              4              2              3              4 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              3              1              4              2 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              2              4              1              3 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              4              4              2              4              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              2              2              1              4              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              4              1              2              3              4 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              4              4              3
#convert hclust into a dendogram and plot
res4.a <- as.dendrogram(res4)

#horizontal plot
plot(res4.a, main = "Ward Linkage Dendrogram (Horizontal)", xlab = "Height", ylab = "Cluster", horiz = TRUE)

heatmap(USArrScale, Rowv = as.dendrogram(res4), Colv = NA, scale = "row", 
        main = "Heatmap of USArrests with Ward Linkage Dendrogram")

Interpretasi: Pada bagian ini, kita menggunakan fungsi cutree untuk memotong dendrogram menjadi 4 cluster berdasarkan hasil Ward linkage. Hasilnya adalah label cluster untuk setiap baris data. Kemudian, kita mengonversi objek hclust menjadi objek dendrogram dan memplotnya secara horizontal. Terakhir, kita membuat heatmap dari dataset USArrests dengan dendrogram Ward linkage sebagai baris.

FUZZY CLUSTERING

CONTOH 7.8 FUZZY C-MEANS CLUSTERING

Imprort package dan data

#Pakai data USArrScale pada contoh 8.1
#install.packages("e1071")
set.seed(123) # untuk memastikan hasil yang konsisten

# Load the library
library(e1071)

#    (Using k=4 and m=2 as an example)
fuzzcm1 <- cmeans(USArrScale, centers = 3, m = 2, iter.max = 100)

show(fuzzcm1)
## Fuzzy c-means clustering with 3 clusters
## 
## Cluster centers:
##       Murder    Assault   UrbanPop        Rape
## 1  0.9736658  1.0345287  0.3041592  0.85228653
## 2 -0.9585151 -1.0034728 -0.8487070 -0.94414694
## 3 -0.2807109 -0.2810076  0.3812853 -0.09374483
## 
## Memberships:
##                         1          2          3
## Alabama        0.65195593 0.11183197 0.23621211
## Alaska         0.58065895 0.16278717 0.25655388
## Arizona        0.70545052 0.07400973 0.22053976
## Arkansas       0.26727003 0.31225375 0.42047622
## California     0.61391345 0.11248819 0.27359837
## Colorado       0.56735531 0.10886192 0.32378277
## Connecticut    0.09257918 0.36843387 0.53898695
## Delaware       0.21737891 0.16633610 0.61628499
## Florida        0.78779230 0.06719813 0.14500957
## Georgia        0.67409870 0.11299351 0.21290780
## Hawaii         0.13023338 0.25830567 0.61146095
## Idaho          0.02008463 0.89854108 0.08137429
## Illinois       0.65893055 0.07011987 0.27094958
## Indiana        0.05888054 0.13180393 0.80931553
## Iowa           0.01922986 0.90841142 0.07235873
## Kansas         0.04343319 0.17769294 0.77887387
## Kentucky       0.14892969 0.46471260 0.38635771
## Louisiana      0.76242358 0.07309663 0.16447978
## Maine          0.02143751 0.91264121 0.06592128
## Maryland       0.91288915 0.02471598 0.06239487
## Massachusetts  0.12404462 0.17221112 0.70374425
## Michigan       0.89948672 0.02701695 0.07349633
## Minnesota      0.05082595 0.65584652 0.29332752
## Mississippi    0.49924408 0.21892694 0.28182898
## Missouri       0.41523255 0.08377429 0.50099316
## Montana        0.04934620 0.74176769 0.20888611
## Nebraska       0.04346821 0.61916910 0.33736269
## Nevada         0.66900362 0.10439971 0.22659668
## New Hampshire  0.02120758 0.90441674 0.07437568
## New Jersey     0.19751465 0.13421887 0.66826648
## New Mexico     0.94608514 0.01482759 0.03908727
## New York       0.69884943 0.06819119 0.23295937
## North Carolina 0.50914793 0.21286105 0.27799102
## North Dakota   0.05169855 0.81870081 0.12960065
## Ohio           0.04299653 0.04982616 0.90717730
## Oklahoma       0.01124129 0.01695647 0.97180224
## Oregon         0.18627174 0.15306148 0.66066678
## Pennsylvania   0.05951789 0.20109208 0.73939003
## Rhode Island   0.16926091 0.28463281 0.54610628
## South Carolina 0.61291239 0.15300707 0.23408054
## South Dakota   0.02181791 0.91584172 0.06234036
## Tennessee      0.65432725 0.10256082 0.24311193
## Texas          0.68588598 0.06596615 0.24814787
## Utah           0.10775849 0.17257154 0.71966997
## Vermont        0.08441990 0.74177919 0.17380091
## Virginia       0.12310131 0.12304802 0.75385067
## Washington     0.10789234 0.12759871 0.76450896
## West Virginia  0.06592707 0.78597355 0.14809938
## Wisconsin      0.05072671 0.72273738 0.22653591
## Wyoming        0.09636793 0.31152792 0.59210415
## 
## Closest hard clustering:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              3              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              3              3              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              1              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              1              2              1              3 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Available components:
## [1] "centers"     "size"        "cluster"     "membership"  "iter"       
## [6] "withinerror" "call"

Interpretasi: Karena pada contoh dengan package advclust sudah tidak update dan sudah diremove pada CRAN. Kita menggunakan package e1071 untuk melakukan fuzzy c-means clustering pada dataset USArrScale. Contoh ALABAMA Klaster 1 = 0.65, Klaster 2 = 0.11, Klaster 3 = 0. 24. Ini menunjukkan bahwa ALABAMA memiliki derajat keanggotaan yang lebih tinggi di klaster 1, sehingga masuk ke klaster 1.

Visualisasi hasil clustering

#biplot
# Perform PCA on the scaled data
pca_result <- prcomp(USArrScale)

# Plot the first two principal components (PC1 vs PC2)
plot(pca_result$x[, 1:2], 
     main = "Fuzzy C-Means on PCA Biplot",
     xlab = "PC1", 
     ylab = "PC2",
     pch = 19, # Use solid circles for points
     col = fuzzcm1$cluster) # Color points by cluster

# Add a legend to explain the colors
legend("topright", 
       legend = unique(fuzzcm1$cluster), 
       fill = unique(fuzzcm1$cluster),
       title = "Cluster")

Interpretasi: Pada bagian ini, kita melakukan visualisasi hasil fuzzy c-means clustering dengan menggunakan biplot dari PCA (Principal Component Analysis). Kita memplot dua komponen utama (PC1 dan PC2) dari hasil PCA, dan mewarnai titik-titik berdasarkan klaster yang dihasilkan oleh fuzzy c-means clustering. Hasilnya menunjukkan klaster 1 (berwarna hitam), klaster 2 (berwarna hijau), dan klaster 3 (berwarna biru) dalam ruang dua dimensi.

CLUSTER DBSCAN DAN OPTIC

CONTOH 7.10 DBSCAN dengan package dbscan

#install.packages("dbscan")
#generate sampel data 
library(dbscan) 
## 
## Attaching package: 'dbscan'
## The following object is masked from 'package:stats':
## 
##     as.dendrogram
set.seed(42) 
x<-matrix(rnorm(200, sd=0.3),ncol=2) 
x<-rbind(x, matrix(rnorm(100, mean=2, sd=0.5), ncol=2)) 

#create DBSCAN object 
dbscan_res<-dbscan(x,eps=0.5,MinPts=5) 
## Warning in dbscan(x, eps = 0.5, MinPts = 5): converting argument MinPts (fpc)
## to minPts (dbscan)!
#Get the predicted labels and core sample indices 
labels<-dbscan_res$cluster 
core_samples_mask<-dbscan_res$cluster!=0 

#plot the result 
plot(x,col=labels)

Pada contoh ini, data simulasi dibangkitkan menggunakan fungsi ‘rnorm’. Kemudian buat DBSCAN object menggunakan fungsi ‘dbscan’ dari library dbscan dengan hyperparameter yang telah ditentukan (dalam hal ini, eps=0.5 dan minPts=5). Hasilnya kita akan memperoleh label klaster hasil prediksi dengan melihat pada atribut cluster dan dari atribut cluster juga kita bisa melihat mana sampel yang merupakan core dan noise (memiliki nilai 0). Terakhir, kita plot hasilnya dengan fungsi ‘plot’.

CONTOH 7.10 OPTICS dengan package dbscan

d<-dist(x) 
res<-optics(d, minPts=5) 
plot(res)

labels2<-extractDBSCAN(res, eps_cl = 0.5) 
plot(x, col=labels2$cluster+1) 

Pertama buatlah terlebih dahulu matriks jarak dengan menggunakan fungsi ‘dist’. Matriks jarak ini dijadikan input pada fungsi optics bersama dengan parameter minPts=5. Kemudian hasl dari fungsi optics (object res) kita visualisasikan dengan plot untuk menentukan jumlah klaster dari menetapkan epsilon. Dari plot terlihat bahwa ada 2 klaster yang terbentuk. Sehingga bisa dipilih nilai epsilon 0.5. Berikutnya kita ekstrak hasil klaster dengan fungsi ‘extractDBSCAN’ dengan parameter eps_cl=0.5. Hasilnya adalah label klaster yang bisa kita plot kembali.

CONTOH 7.11 DBSCAN dengan package fpc

#install.packages("fpc")
library(fpc) 
## 
## Attaching package: 'fpc'
## The following object is masked from 'package:dbscan':
## 
##     dbscan
#generate sampe data 
set.seed(123) 
x<-cbind(x1=rnorm(50), x2=rnorm(50)) 
# Run DBSCAN with epsilon =0.15 
dbscan_output<-fpc::dbscan(x,eps=0.15) 
labels3 = dbscan_output$cluster  
plot(x, col = labels)

Pada contoh ini, kita menggunakan package fpc untuk melakukan DBSCAN. Pertama, kita buat data sampel dengan fungsi ‘rnorm’. Kemudian, kita jalankan DBSCAN dengan fungsi ‘dbscan’ dari package fpc dengan parameter eps=0.15. Hasilnya adalah label klaster yang bisa kita plot.

ASSOCIATION RULES

1. Install dan aktifkan package “arules”

library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
library(arulesViz) 

Interpretasi: Pada bagian ini, kita mengimpor package arules yang digunakan untuk melakukan frequent pattern mining, serta arulesViz untuk visualisasi aturan asosiasi. Package ini menyediakan fungsi-fungsi yang diperlukan untuk menganalisis data transaksi dan menemukan pola asosiasi di dalamnya.

2. Import data

transaksi <- read.transactions( 
  file = "C:/Users/ihsan/OneDrive - Politeknik Statistika STIS/Desktop/KULIAH STIS/Tingkat 3 SD/Semester 6/Data Mining/Tugas Datmin UAS/data_transaksi.txt", 
  format = "single", 
  sep = "\t", 
  cols = c(1, 2), 
  skip = 1 
)

Interpretasi: Pada bagian ini, kita mengimpor data transaksi dari file teks yang berisi informasi tentang item yang dibeli dalam setiap transaksi. Fungsi read.transactions digunakan untuk membaca data tersebut dengan format “single”, di mana setiap baris mewakili satu transaksi. Parameter sep menentukan pemisah antar kolom, dan cols menunjukkan kolom mana yang akan digunakan sebagai ID transaksi dan item. Parameter skip digunakan untuk melewati baris pertama yang biasanya berisi header.

3. Tampilkan Hasil

print(transaksi) 
## transactions in sparse format with
##  10 transactions (rows) and
##  4 items (columns)

Interpretasi: Pada bagian ini, kita mencetak objek transaksi yang berisi data transaksi yang telah diimpor. Terdiri dari 10 transaksi dan 4 item.

3a. data

inspect(transaksi)
##      items                       transactionID
## [1]  {Greentea, Roti, Yoghurt}   01           
## [2]  {Greentea, Sambal}          02           
## [3]  {Roti, Yoghurt}             03           
## [4]  {Greentea, Yoghurt}         04           
## [5]  {Greentea, Sambal, Yoghurt} 05           
## [6]  {Greentea, Roti}            06           
## [7]  {Greentea, Roti, Yoghurt}   07           
## [8]  {Greentea}                  08           
## [9]  {Greentea, Sambal}          09           
## [10] {Roti, Sambal, Yoghurt}     10

Interpretasi: Setiap item dalam transaksi ditampilkan dengan format yang menunjukkan ID transaksi dan item yang dibeli. Misalnya, transaksi pertama berisi item “Greentea”, “Roti”, “Yoghurt”. Ini memberikan gambaran tentang kombinasi item yang sering dibeli bersama dalam setiap transaksi.

3b. data

transaksi@itemInfo

Interpretasi: Informasi item terdiri dari 4 item, greentea, roti, sambal, dan yoghurt.

3c. Daftar itemset transaksi

transaksi@itemsetInfo

4. Membuat matriks transaksi

transaksi@data
## 4 x 10 sparse Matrix of class "ngCMatrix"
##                         
## [1,] | | . | | | | | | .
## [2,] | . | . . | | . . |
## [3,] . | . . | . . . | |
## [4,] | . | | | . | . . |

Interpretasi: berikut matriks transaksi yang menunjukkan hubungan antara ID transaksi dan item yang dibeli. Setiap baris mewakili satu transaksi, dan setiap kolom mewakili satu item. Nilai 1 menunjukkan bahwa item tersebut ada dalam transaksi, sedangkan nilai 0 menunjukkan bahwa item tersebut tidak ada.Contoh item 1 (yoghurt) memiliki nilai 1 di item 1 dan 2, lalu di 3 tidak ada sesuai dengan daftar list di atas.

5. Frekuensi item

5a. Persentase

itemFrequency(transaksi, type = "relative")
## Greentea     Roti   Sambal  Yoghurt 
##      0.8      0.5      0.4      0.6

Interpretasi: Pada bagian ini, kita menghitung frekuensi relatif dari setiap item dalam transaksi. Fungsi itemFrequency digunakan untuk mendapatkan persentase kemunculan setiap item dibandingkan dengan total transaksi. Hasilnya Greentea menunjukkan item yang paling populer atau sering dibeli oleh pelanggan.

5b. Jumlah sebenarnya (Absolute)

itemFrequency(transaksi, type = "absolute")
## Greentea     Roti   Sambal  Yoghurt 
##        8        5        4        6

Interpretasi: Pada bagian ini, kita menghitung frekuensi absolut dari setiap item dalam transaksi. Fungsi itemFrequency digunakan untuk mendapatkan jumlah kemunculan setiap item dalam transaksi. Hasilnya menunjukkan greentea dibeli sebanyak 8 kali dari jumlah sebenarnya.

5c. Grafik

itemFrequencyPlot(transaksi, topN = 10, type = "relative", main = "Frekuensi Item Transaksi")

6. Rules dengan apriori

apriori(transaksi)
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [3 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
## set of 3 rules
mba = apriori(transaksi)
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [3 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(mba)
##     lhs               rhs        support confidence coverage lift     count
## [1] {}             => {Greentea} 0.8     0.8        1.0      1.000000 8    
## [2] {Roti}         => {Yoghurt}  0.4     0.8        0.5      1.333333 4    
## [3] {Roti, Sambal} => {Yoghurt}  0.1     1.0        0.1      1.666667 1

Interpretasi: Pada bagian ini, kita menggunakan algoritma Apriori untuk menemukan aturan asosiasi dalam data transaksi. Fungsi apriori digunakan untuk menghasilkan aturan asosiasi berdasarkan data transaksi yang telah diimpor. Hasilnya adalah sekumpulan aturan yang menunjukkan hubungan antara item-item dalam transaksi. Setiap aturan terdiri dari dua bagian: LHS (Left Hand Side) dan RHS (Right Hand Side), yang menunjukkan item-item yang sering dibeli bersama.

7. Filtering Part 1

7a. Filter RHS

inspect(subset(mba,rhs%in%"Yoghurt")) 
##     lhs               rhs       support confidence coverage lift     count
## [1] {Roti}         => {Yoghurt} 0.4     0.8        0.5      1.333333 4    
## [2] {Roti, Sambal} => {Yoghurt} 0.1     1.0        0.1      1.666667 1

Interpretasi: Pada bagian ini, kita melakukan penyaringan aturan asosiasi untuk menemukan aturan yang memiliki item tertentu di RHS (Right Hand Side). Fungsi subset digunakan untuk memilih aturan yang memiliki item “Yoghurt” di RHS. Hasilnya adalah aturan-aturan yang menunjukkan bahwa jika item-item tertentu dibeli, maka kemungkinan besar pelanggan juga akan membeli “Yoghurt”.

7b. Filter LHS

inspect(subset(mba,lhs%in%"Sambal")) 
##     lhs               rhs       support confidence coverage lift     count
## [1] {Roti, Sambal} => {Yoghurt} 0.1     1          0.1      1.666667 1

Interpretasi: Pada bagian ini, kita melakukan penyaringan aturan asosiasi untuk menemukan aturan yang memiliki item tertentu di LHS (Left Hand Side). Fungsi subset digunakan untuk memilih aturan yang memiliki item “Sambal” di LHS. Hasilnya adalah aturan-aturan yang menunjukkan bahwa jika pelanggan membeli “Sambal”, maka kemungkinan besar mereka juga akan membeli item-item lain yang ada di RHS.

7c. Filter LHS dan RHS

inspect(subset(mba,lhs%in%"Roti"& rhs%in%"Yoghurt"))
##     lhs               rhs       support confidence coverage lift     count
## [1] {Roti}         => {Yoghurt} 0.4     0.8        0.5      1.333333 4    
## [2] {Roti, Sambal} => {Yoghurt} 0.1     1.0        0.1      1.666667 1

Interpretasi: Pada bagian ini, kita melakukan penyaringan aturan asosiasi untuk menemukan aturan yang memiliki item tertentu di LHS dan RHS. Fungsi subset digunakan untuk memilih aturan yang memiliki item “Roti” di LHS dan “Yoghurt” di RHS. Hasilnya adalah aturan-aturan yang menunjukkan bahwa jika pelanggan membeli “Roti”, maka kemungkinan besar mereka juga akan membeli “Yoghurt”.

8. Rules dengan parameter support

mba2= apriori(transaksi, parameter = list(supp = 0.1, conf = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(mba2)
##      lhs                    rhs        support confidence coverage lift     
## [1]  {}                  => {Roti}     0.5     0.5000000  1.0      1.0000000
## [2]  {}                  => {Yoghurt}  0.6     0.6000000  1.0      1.0000000
## [3]  {}                  => {Greentea} 0.8     0.8000000  1.0      1.0000000
## [4]  {Sambal}            => {Yoghurt}  0.2     0.5000000  0.4      0.8333333
## [5]  {Sambal}            => {Greentea} 0.3     0.7500000  0.4      0.9375000
## [6]  {Roti}              => {Yoghurt}  0.4     0.8000000  0.5      1.3333333
## [7]  {Yoghurt}           => {Roti}     0.4     0.6666667  0.6      1.3333333
## [8]  {Roti}              => {Greentea} 0.3     0.6000000  0.5      0.7500000
## [9]  {Yoghurt}           => {Greentea} 0.4     0.6666667  0.6      0.8333333
## [10] {Greentea}          => {Yoghurt}  0.4     0.5000000  0.8      0.8333333
## [11] {Roti, Sambal}      => {Yoghurt}  0.1     1.0000000  0.1      1.6666667
## [12] {Sambal, Yoghurt}   => {Roti}     0.1     0.5000000  0.2      1.0000000
## [13] {Sambal, Yoghurt}   => {Greentea} 0.1     0.5000000  0.2      0.6250000
## [14] {Roti, Yoghurt}     => {Greentea} 0.2     0.5000000  0.4      0.6250000
## [15] {Greentea, Roti}    => {Yoghurt}  0.2     0.6666667  0.3      1.1111111
## [16] {Greentea, Yoghurt} => {Roti}     0.2     0.5000000  0.4      1.0000000
##      count
## [1]  5    
## [2]  6    
## [3]  8    
## [4]  2    
## [5]  3    
## [6]  4    
## [7]  4    
## [8]  3    
## [9]  4    
## [10] 4    
## [11] 1    
## [12] 1    
## [13] 1    
## [14] 2    
## [15] 2    
## [16] 2

Interpretasi: Pada bagian ini, kita menggunakan algoritma Apriori dengan parameter tertentu untuk menemukan aturan asosiasi dalam data transaksi. Parameter supp (support) diatur ke 0.1, yang berarti kita hanya akan mempertimbangkan aturan yang muncul setidaknya dalam 10% dari total transaksi. Parameter conf (confidence) diatur ke 0.5, yang berarti kita hanya akan mempertimbangkan aturan yang memiliki tingkat kepercayaan minimal 50%. Hasilnya adalah sekumpulan aturan yang memenuhi kriteria tersebut.

9. Filtering part 2

9a. Dengan %in%

inspect(subset(mba2, (lhs %in% "Greentea" | rhs %in% "Greentea") & lift  
> 1)) 
##     lhs                 rhs       support confidence coverage lift     count
## [1] {Greentea, Roti} => {Yoghurt} 0.2     0.6666667  0.3      1.111111 2

Interpretasi: Pada bagian ini, kita melakukan penyaringan aturan asosiasi untuk menemukan aturan yang memiliki item tertentu di LHS atau RHS. Fungsi subset digunakan untuk memilih aturan yang memiliki item “Greentea” di LHS atau RHS, dan juga memiliki nilai lift lebih dari 1. Hasilnya adalah aturan-aturan yang menunjukkan bahwa jika pelanggan membeli “Greentea”, maka kemungkinan besar mereka juga akan membeli item-item lain yang ada di RHS, dengan tingkat asosiasi yang kuat (lift > 1).

9b. Dengan %ain%

inspect(subset(mba2, (lhs %ain% c("Roti", "Sambal")))) 
##     lhs               rhs       support confidence coverage lift     count
## [1] {Roti, Sambal} => {Yoghurt} 0.1     1          0.1      1.666667 1

Interpretasi: Pada bagian ini, kita melakukan penyaringan aturan asosiasi untuk menemukan aturan yang memiliki item tertentu di LHS. Fungsi subset digunakan untuk memilih aturan yang memiliki item “Roti” atau “Sambal” di LHS. Hasilnya adalah aturan-aturan yang menunjukkan bahwa jika pelanggan membeli “Roti” atau “Sambal”, maka kemungkinan besar mereka juga akan membeli item-item lain yang ada di RHS.

10. Visualisasi rules dengan graph

library(arulesViz)
mba <- apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
plot(subset(mba, lift > 1), method = "graph")  

Interpretasi: Pada visualisasi graph, setiap node mewakili itemset, dan tepi (edge) antara node menunjukkan adanya asosiasi antara itemset tersebut. Ukuran node menunjukkan jumlah aturan yang mengandung item tersebut, sedangkan ketebalan tepi menunjukkan kekuatan asosiasi (lift) antara itemset. Dengan demikian, kita dapat dengan mudah mengidentifikasi hubungan antar item dalam transaksi.

NEURAL NETWORK

Contoh 4.8 menggunakan mlbench (nnet)

Impor package dan data

#install.packages("mlbench")
#install.packages("caret")
#install.packages("nnet")

library(mlbench)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(nnet)
data(BostonHousing)

Interpretasi: Pada bagian ini, kita mengimpor package mlbench, caret, dan nnet. Package mlbench digunakan untuk menyediakan dataset BostonHousing, yang berisi informasi tentang harga rumah di Boston. Package caret digunakan untuk mempermudah proses pelatihan model, sedangkan nnet digunakan untuk membangun model neural network.

Statistik dan partisi data

#cek range dari medv digunakan untuk scaling data
summary(BostonHousing$medv)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   17.02   21.20   22.53   25.00   50.00
#partisi data untuk training dan testing
inTrain <- createDataPartition(y = BostonHousing$medv, p = 0.75, list = FALSE)

train.set <- BostonHousing[inTrain, ]
test.set <- BostonHousing[-inTrain, ]

Interpretasi: Pada bagian ini, kita memeriksa rentang nilai dari variabel medv (median value of owner-occupied homes in $1000s) untuk melakukan scaling data. Kemudian, kita membagi dataset menjadi dua bagian: training set (75% dari data) dan testing set (25% dari data) menggunakan fungsi createDataPartition dari package caret. Ini memastikan bahwa model yang dibangun akan diuji pada data yang belum pernah dilihat sebelumnya.

Model data

netmodel <- nnet(medv/50 ~ ., data = train.set, size = 5, maxit = 500)
## # weights:  76
## initial  value 19.080293 
## iter  10 value 10.398460
## iter  20 value 10.071831
## iter  30 value 10.030378
## iter  40 value 10.030183
## iter  50 value 9.985011
## iter  60 value 9.882163
## iter  70 value 9.527416
## iter  80 value 7.427559
## iter  90 value 5.751257
## iter 100 value 4.777030
## iter 110 value 4.238808
## iter 120 value 3.217454
## iter 130 value 2.768087
## iter 140 value 2.698467
## iter 150 value 2.626152
## iter 160 value 2.607299
## iter 170 value 2.588017
## iter 180 value 2.578006
## iter 190 value 2.572681
## iter 200 value 2.569926
## iter 210 value 2.567625
## iter 220 value 2.566084
## iter 230 value 2.565212
## iter 240 value 2.564330
## iter 250 value 2.563913
## iter 260 value 2.563698
## final  value 2.563697 
## converged

Interpretasi: Pada bagian ini, kita membangun model neural network menggunakan fungsi nnet. Model ini memprediksi nilai medv (harga rumah) dengan menggunakan semua variabel independen lainnya dalam dataset. Parameter size = 5 menunjukkan bahwa kita menggunakan 5 neuron di hidden layer, dan maxit = 500 menunjukkan jumlah iterasi maksimum untuk pelatihan model. Didapatkan final value 1.606 dari 500 iterasi.

Uji model

medv.predict <- predict(netmodel, test.set[,-14]) * 50

Interpretasi: Pada bagian ini, kita menggunakan model yang telah dibangun untuk memprediksi nilai medv pada data testing. Fungsi predict digunakan untuk menghasilkan prediksi berdasarkan model neural network yang telah dilatih. Hasil prediksi kemudian dikalikan dengan 50 untuk mengembalikan skala nilai medv ke dalam satuan aslinya.

Hitung MSE

mean((medv.predict - test.set$medv)^2)
## [1] 13.5412
plot(test.set$medv, medv.predict, main="Neural Network Prediction", xlab="Actual medv", ylab="Predicted medv")
abline(lm(medv.predict ~ test.set$medv), col="red")

Interpretasi: Dari output di atas terlihat bahwa nilai MSE (Mean Squared Error) adalah 19.97, yang menunjukkan seberapa baik model neural network dalam memprediksi harga rumah. Akurasi prediksi juga terlihat pada plot di atas yang menunjukkan hasil prediksi cukup baik.

Contoh 4.9 Menggunakan fungsi neuralnet

import package dan data

library(mlbench)
library(caret)
library(neuralnet)

data("BostonHousing")
data<-BostonHousing

###Lakukan scaled dan partisi

#karena var chas adalah biner, cukup menggunakan as.numeric
data$chas <- as.numeric(data$chas)

#lakukan scaling pada data
maxs<- apply(data, 2, max)
mins<- apply(data, 2, min)

scaled<- as.data.frame(scale(data, center = mins, scale = maxs - mins))

#partisi data untuk training dan testing
index <- createDataPartition(y = BostonHousing$medv, p = 0.75, list = FALSE)
train <- scaled[index, ]
test <- scaled[-index, ]

Model neural network

n <- names(train)
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = "+")))
nn <- neuralnet(f, data = train, hidden = c(5,3), linear.output = TRUE)

#hitung prediksi pada data test
pr.nn<- compute(nn, test[,1:13])

#unscaling data
pr.nn<-pr.nn$net.result*(max(data$medv)-min(data$medv)) + min(data$medv)
test.r<- (test$medv)*(max(data$medv)-min(data$medv)) + min(data$medv)

#hitung MSE
sum((test.r - pr.nn)^2)/nrow(test)
## [1] 8.988249

plot data prediksi vs data aktual

plot(test.r, pr.nn, main = "Neural Network Prediction", xlab = "Actual medv", ylab = "Predicted medv")
abline(lm(pr.nn ~ test.r), col = "red")

Interpretasi: dari output tersebut, terlihat bahwa neuralnet menghasilkan nilai MSE (Mean Squared Error) sebesar 9.76, jauh lebih kecil dari MSE yang dihasilkan nnet. Akurasi prediksi pada data testing juga terlihat dari plot di atas.