Fungsi Automatic Clustering di R sebagai berikut:
auto_cluster <- function(data, p) {
data=unique(data) #Mendefinisikan tidak ada data yang sama
data_urut <- data[order(data)] #mengurutkan data
average_diff <- mean(diff(data_urut)) #Menghitung Rata rata data differencing
klaster <- c() #Mendefinisikan Vektor Klaster
klaster[1] = 1 #Mendefinisikan Klaster data ke-1 sebagai Klaster 1
#Prinsip 1
for (i in 2:length(data)){
if (data_urut[i]-data_urut[i-1]<=average_diff){
klaster[i]=1
}
else{
klaster[i]=2
}
if(max(klaster)==2){
break
}
}
a=which.max(klaster) + 1 #Mendefiniskan banyak data yang sudah diklaster ditambah 1
#Prinsip 2 dan 3
for (i in a:length(data)){
#prinsip 3
if (length(klaster[which(klaster==max(klaster))])>1){
if(data_urut[i]-data_urut[i-1]<=average_diff & data_urut[i]-data_urut[i-1]<=mean(diff((data[which(klaster==max(klaster))])))){
klaster[i]=max(klaster)
}
else{
klaster[i]=max(klaster)+1
}
}
else if (length(klaster[which(klaster==max(klaster))])==1){
#Prinsip 2
if (data_urut[i]-data_urut[i-1]<=average_diff & data_urut[i]-data_urut[i-1]<=data_urut[i-1]-data_urut[i-2]){
klaster[i]=max(klaster)
}
else{
klaster[i]=max(klaster)+1
}
}
}
#membuat Klaster dalam format list
isi_klaster = list()
for (i in 1:max(klaster)){
isi_klaster[[i]]=as.vector(data_urut[which(klaster==i)])
}
#Membuat Klaster yang disesuaikan
klaster_penyesuaian = list() #Mendefinisikan List untuk klaster Penyesuaian
for (i in 1:length(isi_klaster)){
#Prinsip 1 dan 2
if (length(isi_klaster[[i]])>=2){
klaster_penyesuaian[[i]]=c(min(isi_klaster[[i]]),max(isi_klaster[[i]]))
}
else{
#Prinsip 3
if (i==1){ #Situasi 1
klaster_penyesuaian[[i]]=c(isi_klaster[[i]], isi_klaster[[i]]+average_diff)
}
else if (i==length(isi_klaster)){ # Situasi 2
klaster_penyesuaian[[i]]=c(isi_klaster[[i]]-average_diff, isi_klaster[[i]])
}
else { #Situasi 3
if (isi_klaster[[i]]-average_diff<min(klaster_penyesuaian[[i-1]])){
klaster_penyesuaian[[i]]=c(isi_klaster[[i]])
}
else{
klaster_penyesuaian[[i]]=c(isi_klaster[[i]]-average_diff,isi_klaster[[i]]+average_diff)
}
}
}
}
i=2 #Mendefinisikan Index dari klaster yang dipakai pada perulangan dibawah ini
c=1 #Mendefinisikan index untuk interval
interval=data.frame(minimum=0, maximum=0)
interval[1,] = as.vector(klaster_penyesuaian[[1]])
repeat {
if (interval$maximum[c]>=min(klaster_penyesuaian[[i]])){
interval[c+1,]=c(interval$maximum[c],max(klaster_penyesuaian[[i]]))
c=c+1
i=i+1
}
else{
if (length(klaster_penyesuaian[[i]])==2){
interval[c+1,]=c(interval$maximum[c],min(klaster_penyesuaian[[i]]))
interval[c+2,]=c(klaster_penyesuaian[[i]])
i=i+1
c=c+2
}
else {
interval[c,]=c(interval$minimum[c],klaster_penyesuaian[[i]])
i=i+1
}
}
if (i==length(klaster_penyesuaian)+1){
break
}
}
a=1
b=0
#Mendefinisikan SUb Interval sebagai data frame kosong
sub_interval= data.frame(minimum=0,maximum=0)
repeat {
range_per_p = (interval[a,2]-interval[a,1])/p
for (i in 1:p){
sub_interval[b+i,]=c(interval$minimum[a]+((i-1)*range_per_p),interval$minimum[a]+(i*range_per_p))
}
a=a+1
b=b+p
if (a>nrow(interval)){
break
}
}
f=list(interval=interval, sub_interval=sub_interval)
return(f)
}
Berikut Fungsi Fuzzy Time Series di R
fuzzy_ts <- function(data,sub_interval){
m = as.vector(rowMeans(sub_interval)) #mencari rata-rata subinterval
A=c()
for (i in 1:length(m)){
if (i==1){
A[i] = (1/m[i])+(0.5/m[i+1])
}
else if (i==length(m)){
A[i] = (0.5/m[i-1])+(1/m[i])
}
else {
A[i] = (0.5/m[i-1])+(1/m[i])+(0.5/m[i+1])
}
}
fuzzify=c() #mendefinisikan vektor fuzzifikasi
for (i in 1:length(data)){
for (j in 1:nrow(sub_interval)){
if (i!=which.max(data)){
if (data[i]>=(sub_interval[j,1])&data[i]<(sub_interval[j,2])){
fuzzify[i]=j
break
}
}
else {
if (data[i]>=(sub_interval[j,1])&data[i]<=(sub_interval[j,2])){
fuzzify[i]=j
break
}
}
}
}
flr <- data.frame(current_state=0, next_state=0)
for(i in 1: length(fuzzify)){
if(i < length(fuzzify)){
flr[i,]=c(fuzzify[i],fuzzify[i+1])
}
else{
flr[i,]=c(fuzzify[i],0)
}
}
nilai_ramalan = c(0)
for (i in 1:length(fuzzify)){
ramal=c()
a=0
for (j in 1:length(fuzzify)){
if (flr$current_state[i]==flr$current_state[j]){
if (flr$next_state[j]==0){
a=a+1
ramal[a]=m[flr$current_state[j]]
}
else{
a=a+1
ramal[a]=m[flr$next_state[j]]
}
}
else{
next
}
}
nilai_ramalan[i+1]=sum(ramal)/a
}
Galat = abs(data[-1]-nilai_ramalan[-c(1,length(nilai_ramalan))])
MSE=mean(Galat^2)
MAPE = mean(Galat/data[-1]*100)
return(list(nilai_ramalan=nilai_ramalan, Error=c(MSE=MSE, MAPE=MAPE)))
}
Di atas sudah didefinisikan dua fungsi yaitu fungsi Automatic Clustering yaitu auto_cluster dan Fuzzy Time Series yaitu fuzzy_ts.
Selanjutnya mencoba fungsi tersebut. Fungsi ini akan dicoba pada data Kebutuhan Hidup Minimum (KHM) yang terdapat pada jurnal PERAMALAN BUTUHAN HIDUP MINIMUM MENGGUNAKAN AUTOMATIC CLUSTERING DAN FUZZY LOGICAL RELATIONSHIP karya Yusuf Priyo Anggodo dan Wayan Firdaus MAhmudy. Jurnal tersebur dapat diakses di link berikut ini
#Menginput data
KHM <- c(339227,580054,458755,544157,706698,856888,731635,731635,825000,825000,825000)
#Auto Clustering : Cluster
Cluster = auto_cluster(KHM,2)
#Menampilkan CLuster
Cluster
## $interval
## minimum maximum
## 1 339227.0 413178.6
## 2 413178.6 532706.6
## 3 532706.6 544157.0
## 4 544157.0 580054.0
## 5 580054.0 706698.0
## 6 706698.0 731635.0
## 7 731635.0 825000.0
## 8 825000.0 856888.0
##
## $sub_interval
## minimum maximum
## 1 339227.0 376202.8
## 2 376202.8 413178.6
## 3 413178.6 472942.6
## 4 472942.6 532706.6
## 5 532706.6 538431.8
## 6 538431.8 544157.0
## 7 544157.0 562105.5
## 8 562105.5 580054.0
## 9 580054.0 643376.0
## 10 643376.0 706698.0
## 11 706698.0 719166.5
## 12 719166.5 731635.0
## 13 731635.0 778317.5
## 14 778317.5 825000.0
## 15 825000.0 840944.0
## 16 840944.0 856888.0
#Fuzzy Time Series :FTM
FTM = fuzzy_ts(KHM, Cluster$sub_interval)
#Menampilkan FTM
FTM
## $nilai_ramalan
## [1] 0.0 611715.0 443060.6 553131.2 712932.2 848916.0 754976.2 793974.1
## [9] 793974.1 832972.0 832972.0 832972.0
##
## $Error
## MSE MAPE
## 6.952381e+08 2.974522e+00
Interpretasi Output nilai_ramalan merupakan hasil peramalan dengan Fuzzy Time Series. peramalan dimulai dari periode ke-2 sehingga periode ke -1 bernilai 0. Nilai Ramalan yang terakhir merupakan nilai ramalan untuk satu periode ke depan.
MSE merupakan Mean Square Error dari model peramalan.
MAPE merupakan Mean Absolute Precentage Error dari model peramalan.
hasil di atas dapat dirangkum sebagai berikut:
dengan MSE dan MAPE masing-masing 4.359646e+08 dan 1.242107e+00 didapatkan peramalan satu periode ke depan sebesar 825159.4.
Plot antara data aktual dan ramalan dapat dilihat di bawah ini.
TAHUN<- c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)
plot(TAHUN,KHM[-1], type="l", col="blue", ylab="KHM")
par(new=TRUE)
plot(TAHUN, FTM$nilai_ramalan[-c(1,length(FTM$nilai_ramalan))],type="l", col="red", lty=2, ylab="KHM", xaxt="n", yaxt="n")
axis(side=4)
legend("topleft", c("data aktual", "data ramalan"), col=c("blue", "red"), lty=c(1,2))