PARTITION BASED CLUSTERING

CONTOH 8.1 K-MEANS CLUSTERING

Impor package dan data

Dataset USArrests yang berisi data tingkat kejahatan di berbagai negara bagian AS dimuat untuk persiapan analisis.

data(USArrests)
head(USArrests)
##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7

Rescaling data

Dilakukan standardisasi data menggunakan fungsi scale. Langkah ini penting agar setiap variabel (Murder, Assault, dll.) memiliki skala yang sebanding, sehingga tidak ada variabel yang mendominasi proses clustering hanya karena rentang nilainya lebih besar.

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

K-Means dengan K=3

Algoritma K-Means diterapkan untuk mengelompokkan data ke dalam 3 cluster (K=3). Penggunaan set.seed(123) memastikan hasil pengelompokan dapat direplikasi.

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

Output menunjukkan alokasi cluster untuk setiap negara bagian dan jumlah anggota dari masing-masing cluster yang terbentuk.

kMres$size
## [1] 20 13 17

Plot hasil clustering

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

Visualisasi ini menampilkan sebaran data yang diwarnai berdasarkan keanggotaan clusternya. Dari plot ini, kita dapat secara visual mengamati bagaimana negara-gama dikelompokkan dan apakah ada pemisahan yang jelas antar cluster pada berbagai kombinasi variabel.

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

Tabel kontingensi ini membandingkan hasil dari dua kali proses K-Means dengan titik awal acak yang berbeda. Angka-angka di luar diagonal utama menunjukkan adanya ketidaksesuaian atau inkonsistensi hasil clustering. Ini membuktikan bahwa K-Means sensitif terhadap pemilihan centroid awal, yang menyoroti pentingnya menjalankan algoritma beberapa kali untuk mendapatkan solusi yang lebih stabil.

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

Matriks jarak antar negara bagian dihitung menggunakan metode jarak Euclidean pada data yang telah distandardisasi. Jarak ini menjadi dasar bagi semua metode clustering hierarkis berikutnya.

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

Metode ini menggabungkan cluster berdasarkan jarak terdekat antara anggota-anggotanya. Hasilnya, seperti yang terlihat pada dendrogram, cenderung menciptakan cluster memanjang atau seperti rantai, di mana satu anggota baru dapat bergabung ke cluster yang sudah ada karena kedekatannya dengan satu anggota saja.

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

Berkebalikan dengan single linkage, metode ini menggabungkan cluster berdasarkan jarak terjauh antar anggotanya. Pendekatan ini menghasilkan cluster-cluster yang cenderung lebih bulat (spherical) dan terpisah dengan jelas satu sama lain.

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

Metode ini mengambil jalan tengah dengan menggabungkan cluster berdasarkan rata-rata jarak dari semua pasangan anggota antar cluster. Ini memberikan keseimbangan antara kecenderungan memanjang dari single linkage dan kekompakan dari complete linkage.

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

Metode Ward bertujuan untuk meminimalkan varians total di dalam cluster. Setiap kali penggabungan terjadi, metode ini memilih pasangan cluster yang menghasilkan kenaikan sum of squared error (SSE) paling minimal. Hasilnya adalah cluster yang sangat kompak dan ukurannya cenderung seimbang.

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

Fungsi cutree digunakan untuk “memotong” dendrogram dari metode Ward pada level yang menghasilkan 4 cluster, lalu memberikan label cluster pada setiap negara bagian. Visualisasi dendrogram horizontal dan heatmap digunakan untuk menginspeksi hasil clustering. Heatmap secara khusus efektif dalam menunjukkan pola variabel yang menjadi ciri khas setiap cluster yang terbentuk.

FUZZY CLUSTERING

CONTOH 7.8 FUZZY C-MEANS CLUSTERING

Import 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"

Algoritma Fuzzy C-Means diterapkan pada data USArrScale untuk membentuk 3 cluster. Berbeda dengan K-Means, setiap negara bagian tidak dimasukkan secara kaku ke dalam satu cluster, melainkan memiliki derajat keanggotaan pada setiap cluster yang ada.

Sebagai contoh, Alabama memiliki nilai keanggotaan 0.65 di Cluster 1, 0.11 di Cluster 2, dan 0.24 di Cluster 3. Meskipun memiliki keanggotaan di semua cluster, Alabama paling dominan di Cluster 1. Hasil “Closest hard clustering” menunjukkan alokasi cluster definitif berdasarkan derajat keanggotaan tertinggi untuk setiap negara bagian.

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

Hasil clustering divisualisasikan menggunakan PCA (Principal Component Analysis) untuk mereduksi data ke dalam dua dimensi (PC1 dan PC2). Setiap titik mewakili satu negara bagian dan diwarnai sesuai dengan alokasi cluster definitifnya (berdasarkan keanggotaan tertinggi). Plot ini membantu untuk melihat bagaimana cluster-cluster terpisah dalam ruang dua dimensi yang paling signifikan.

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)

Pertama, data simulasi yang terdiri dari dua kelompok dibangkitkan. Kemudian, algoritma DBSCAN diterapkan menggunakan fungsi dbscan dengan dua parameter kunci: eps=0.5 (radius lingkungan) dan minPts=5 (jumlah minimum titik dalam lingkungan).

Hasilnya adalah alokasi cluster untuk setiap titik. Titik yang diberi label 0 dianggap sebagai noise atau outlier, sedangkan sisanya dikelompokkan ke dalam cluster yang terbentuk. Visualisasi plot menunjukkan bagaimana algoritma berhasil memisahkan kedua kelompok data dan mengidentifikasi beberapa titik sebagai noise.

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)

OPTICS adalah variasi dari DBSCAN yang tidak memerlukan parameter eps di awal, sehingga lebih fleksibel untuk data dengan kepadatan yang bervariasi. Algoritma ini dijalankan pada matriks jarak dari data dan menghasilkan sebuah “reachability plot”.

Dari reachability plot tersebut, kita dapat secara visual mengidentifikasi lembah-lembah yang mewakili area padat (cluster). Puncak-puncak di antara lembah menunjukkan jarak antar cluster. Berdasarkan plot ini, eps=0.5 dipilih sebagai ambang batas untuk mengekstraksi cluster menggunakan fungsi extractDBSCAN, yang hasilnya kemudian divisualisasikan.

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)

Contoh ini menunjukkan penerapan DBSCAN menggunakan package fpc yang lebih lawas. Data sampel acak tanpa struktur cluster yang jelas dibangkitkan. Algoritma fpc::dbscan kemudian dijalankan dengan nilai eps yang sangat kecil (0.15). Hasil plot menunjukkan bahwa dengan eps sekecil itu, sebagian besar titik dianggap sebagai noise karena tidak ada lingkungan yang cukup padat yang terbentuk.

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) 

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/asus/Documents/1 - Dok - Back Up/Faruq/STIS/6 - Data Mining/data_transaksi.txt", 
  format = "single", 
  sep = "\t", 
  cols = c(1, 2), 
  skip = 1 
)

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)

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

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
##     labels
## 1 Greentea
## 2     Roti
## 3   Sambal
## 4  Yoghurt

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

3c. Daftar itemset transaksi

transaksi@itemsetInfo
##    transactionID
## 1             01
## 2             02
## 3             03
## 4             04
## 5             05
## 6             06
## 7             07
## 8             08
## 9             09
## 10            10

4. Membuat matriks transaksi

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

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

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

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

Dilakukan perhitungan frekuensi kemunculan setiap item, baik secara relatif (persentase) maupun absolut (jumlah). Grafik itemFrequencyPlot menunjukkan bahwa Greentea adalah item yang paling sering dibeli.

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

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

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

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

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

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

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

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

Aturan asosiasi yang memiliki nilai lift > 1 divisualisasikan dalam bentuk grafik jaringan. Pada grafik ini: Lingkaran (node) mewakili item. Ukuran lingkaran menunjukkan support item tersebut. Panah (edge) menunjukkan sebuah aturan (dari LHS ke RHS). Warna panah menunjukkan nilai lift—semakin merah, semakin kuat asosiasinya. Visualisasi ini mempermudah identifikasi hubungan antar item yang paling signifikan secara visual.

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)

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, ]

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

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

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

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, ]

Seluruh variabel dalam dataset dinormalisasi ke rentang [0, 1] menggunakan metode min-max scaling. Kemudian, data yang telah dinormalisasi dipartisi menjadi data latih dan data uji.

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

Pembuatan Model: Model neural network dibangun menggunakan fungsi neuralnet dengan arsitektur dua hidden layer yang masing-masing berisi 5 dan 3 neuron.

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

Prediksi dan Evaluasi: Model digunakan untuk prediksi pada data uji, di mana hasilnya kemudian dikembalikan ke skala semula. Perhitungan MSE pada model ini menghasilkan nilai 8.99.

Kesimpulan: Model yang dibangun dengan neuralnet menunjukkan MSE yang lebih rendah dibandingkan model nnet, mengindikasikan kinerja prediksi yang lebih akurat pada dataset ini. Plot prediksi vs. aktual juga mengonfirmasi korelasi yang kuat antara nilai prediksi dan nilai sebenarnya.