data <- read.table(file.choose(), header=T)
data = as.vector(data$x)
data
## [1] 62468 58491 73368 58244 55102 62639 73642 66318 67300 74720
## [11] 58459 67429 67709 72678 75276 75276 81627 86587 88277 67513
## [21] 97126 95268 97418 107630 80321 85400 86122 86211 89621 91845
## [31] 99745 67849 97126 95268 97418 107630 86750 90863 95806 89165
## [41] 89735 95760 84499 80981 89894 85575 83008 92015 72539 73639
## [51] 84087 78500 80413 84566 60920 68377 77526 77903 79445 86134
## [61] 72083 76337 81061 73877 76099 85393 54648 85069 81832 83267
## [71] 85316 96905 69939 70417 84134 70359 84682 71360
interval_fuzzy <- function(data, D1 = 8, D2= 8){
Umin = min(data)- D1
Umax = max(data)+ D2
n = round(1 +3.3 *logb(length(data), base = 10))
l = (Umax - Umin)/n
intervals = data.frame(mins = 0, maxs = 0)
intervals[1,1] = Umin
intervals[1,2] = Umin + l
for (i in 2:n){
intervals[i,1] = intervals[i-1,2]
intervals[i,2] = intervals[i,1] + l
}
return((intervals = intervals))
}
b= interval_fuzzy(data, D1 = 8, D2 = 10)
b
## mins maxs
## 1 54640.00 62211.43
## 2 62211.43 69782.86
## 3 69782.86 77354.29
## 4 77354.29 84925.71
## 5 84925.71 92497.14
## 6 92497.14 100068.57
## 7 100068.57 107640.00
fuzzy_ts <- function(data,interval){
m = as.vector(rowMeans(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(interval)){
if (i!=which.max(data)){
if (data[i]>=(interval[j,1])&data[i]<(interval[j,2])){
fuzzify[i]=j
break
}
}
else {
if (data[i]>=(interval[j,1])&data[i]<=(interval[j,2])){
fuzzify[i]=j
break
}
}
}
}
#Membuat Fuzzy Relationship
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)
}
}
#Membuat Matriks Transisi
state=matrix(data=as.vector(table(flr)[,-1]),nrow = nrow(interval), byrow = F)
matriks_transisi = state/rowSums(state)
#Menghitung ramalan
ramalan = c()
#Mnghitung Koreksi Ramalan
d = c()
for (i in 2:(length(data))){
ramalan [i] = sum(m*as.vector(matriks_transisi[flr[i-1,1],]))
d[i] = (interval[1,2]-interval[1,1])*-(flr[i-1,1]-flr[i-1,2])/2
}
#Menghitung Ramalan Sebenarnya
ramalan_bener = ramalan + d
#Forecasting
D = (interval[1,2]-interval[1,1])*-(flr[length(data),1]-flr[length(data)-1,2])/2
Forecasting= m[flr[length(data),1]]-D
#Menghitung Galat
Galat = abs(data-ramalan_bener)
MSE=mean(Galat^2, na.rm = TRUE)
MAPE = mean(Galat/data*100, na.rm=TRUE)
return(list(data_ramalan = ramalan_bener, MSE = MSE, MAPE = MAPE, Forescast = Forecasting))
}
###Mencoba Fungsi Fuzzy Time Series dengan data yang sudah dipanggil di atas
coba=fuzzy_ts(data,b)
coba
## $data_ramalan
## [1] NA 72306.67 77354.29 67006.67 69782.86 73568.57 79878.10 70792.38
## [9] 76092.38 79878.10 67006.67 73568.57 76092.38 79878.10 74578.10 74578.10
## [17] 78363.81 84925.71 84925.71 73568.57 91235.24 90225.71 90225.71 94011.43
## [25] 73568.57 84925.71 84925.71 84925.71 84925.71 84925.71 88711.43 75082.86
## [33] 91235.24 90225.71 90225.71 94011.43 77354.29 84925.71 88711.43 86440.00
## [41] 84925.71 88711.43 82654.29 81140.00 84925.71 84925.71 81140.00 84925.71
## [49] 77354.29 74578.10 78363.81 81140.00 81140.00 81140.00 69782.86 73568.57
## [57] 83663.81 81140.00 81140.00 84925.71 77354.29 74578.10 78363.81 77354.29
## [65] 74578.10 82149.52 69782.86 84925.71 81140.00 81140.00 84925.71 88711.43
## [73] 78868.57 74578.10 78363.81 77354.29 78363.81 77354.29
##
## $MSE
## [1] 40961854
##
## $MAPE
## [1] 6.934638
##
## $Forescast
## [1] 73568.57
dengan menggunakan Fuzzy Time Series Ruey Chen Tsaur, dengan MAPE = 6.8 didapatkan hasil satu periode ke depan sebesar 73568.57
TAHUN<- c(1:78)
plot(TAHUN,data, type="l", col="blue", ylab="data")
par(new=TRUE)
plot(TAHUN, coba$data_ramalan,type="l",col="red", lty=2, ylab="Data", xaxt="n", yaxt="n")
axis(side=4)
legend("topleft", c("data aktual", "data ramalan"), col=c("blue", "red"),lty=c(1,2))