#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.
#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.
netmodel <- nnet(medv/50 ~ ., data = train.set, size = 5, maxit = 500)
## # weights: 76
## initial value 17.143191
## iter 10 value 10.412550
## iter 20 value 9.749809
## iter 30 value 7.121804
## iter 40 value 4.832722
## iter 50 value 3.543512
## iter 60 value 2.869340
## iter 70 value 2.633147
## iter 80 value 2.578845
## iter 90 value 2.550989
## iter 100 value 2.518394
## iter 110 value 2.509834
## iter 120 value 2.504051
## iter 130 value 2.485566
## iter 140 value 2.478893
## iter 150 value 2.469102
## iter 160 value 2.460686
## iter 170 value 2.451363
## iter 180 value 2.442232
## iter 190 value 2.417518
## iter 200 value 2.408812
## iter 210 value 2.407401
## iter 220 value 2.405584
## iter 230 value 2.404566
## iter 240 value 2.404361
## iter 250 value 2.403976
## iter 260 value 2.403376
## iter 270 value 2.402686
## iter 280 value 2.399683
## final value 2.399541
## 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.
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.
mean((medv.predict - test.set$medv)^2)
## [1] 14.75656
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.
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, ]
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] 18.40263
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.
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.
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.
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.
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.
transaksi@itemInfo
Interpretasi: Informasi item terdiri dari 4 item, greentea, roti, sambal, dan yoghurt.
transaksi@itemsetInfo
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.
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.
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.
itemFrequencyPlot(transaksi, topN = 10, type = "relative", main = "Frekuensi Item Transaksi")
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.01s].
## 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.
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”.
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.
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”.
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.
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).
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.
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.
#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’.
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.
#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.