dataf <- readxl::read_xlsx("D:/AKPRIND/Logika Fuzzy/Data Logika Fuzzy.xlsx")
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'tibble'
## Warning: replacing previous import 'lifecycle::last_warnings' by
## 'rlang::last_warnings' when loading 'pillar'
Karena data yang dipanggil tidak terbaca sebagai sebuah data time series oleh sistem, oleh karenanya data tersebut diubah terlebih dahulu menjadi data time series untuk selanjutnya agar dapat dibaca oleh sistem dalam tahapan analisisnya
data4 = ts(dataf, start=c(1,1), frequency = 30)
data4
## Time Series:
## Start = c(1, 1)
## End = c(4, 2)
## Frequency = 30
## Kasus
## [1,] 2234
## [2,] 1932
## [3,] 3263
## [4,] 2720
## [5,] 2881
## [6,] 2557
## [7,] 2137
## [8,] 1760
## [9,] 1390
## [10,] 2057
## [11,] 1954
## [12,] 1690
## [13,] 1624
## [14,] 1414
## [15,] 1142
## [16,] 922
## [17,] 1404
## [18,] 1484
## [19,] 1393
## [20,] 1384
## [21,] 1167
## [22,] 894
## [23,] 620
## [24,] 1261
## [25,] 1233
## [26,] 1053
## [27,] 915
## [28,] 997
## [29,] 747
## [30,] 626
## [31,] 903
## [32,] 914
## [33,] 633
## [34,] 760
## [35,] 802
## [36,] 623
## [37,] 460
## [38,] 611
## [39,] 719
## [40,] 723
## [41,] 683
## [42,] 620
## [43,] 523
## [44,] 403
## [45,] 612
## [46,] 801
## [47,] 628
## [48,] 518
## [49,] 401
## [50,] 444
## [51,] 244
## [52,] 434
## [53,] 480
## [54,] 435
## [55,] 399
## [56,] 359
## [57,] 339
## [58,] 221
## [59,] 347
## [60,] 522
## [61,] 400
## [62,] 360
## [63,] 393
## [64,] 314
## [65,] 186
## [66,] 394
## [67,] 451
## [68,] 372
## [69,] 453
## [70,] 404
## [71,] 264
## [72,] 176
## [73,] 297
## [74,] 278
## [75,] 311
## [76,] 245
## [77,] 246
## [78,] 196
## [79,] 130
## [80,] 261
## [81,] 264
## [82,] 220
## [83,] 192
## [84,] 228
## [85,] 163
## [86,] 106
## [87,] 190
## [88,] 205
## [89,] 213
## [90,] 291
## [91,] 232
## [92,] 164
Nilai minimum dan maksimum berfungsi untuk pembuatan interval linguistik
min(data4)
## [1] 106
max(data4)
## [1] 3263
interval_fuzzy <- function(data4, D1 = 8, D2= 10){
Umin = min(data4)- D1
Umax = max(data4)+ D2
n = round(1 +3.3 *logb(length(data4), 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(data4, D1 = 8, D2 = 10)
b
## mins maxs
## 1 98.0000 551.5714
## 2 551.5714 1005.1429
## 3 1005.1429 1458.7143
## 4 1458.7143 1912.2857
## 5 1912.2857 2365.8571
## 6 2365.8571 2819.4286
## 7 2819.4286 3273.0000
fuzzy_ts <- function(data4,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(data4)){
for (j in 1:nrow(interval)){
if (i!=which.max(data4)){
if (data4[i]>=(interval[j,1])&data4[i]<(interval[j,2])){
fuzzify[i]=j
break
}
}
else {
if (data4[i]>=(interval[j,1])&data4[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(data4))){
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(data4),1]-flr[length(data4)-1,2])/2
Forecasting= m[flr[length(data4),1]]-D
#Menghitung Galat
Galat = abs(data4-ramalan_bener)
MSE=mean(Galat^2, na.rm = TRUE)
MAPE = mean(Galat/data4*100, na.rm=TRUE)
return(list(data_ramalan = ramalan_bener, MSE = MSE, MAPE = MAPE, Forescast = Forecasting))
}
Ramalan=fuzzy_ts(data4,b)
Ramalan
## $data_ramalan
## [1] NA 2139.0714 2592.6429 2365.8571 2819.4286 2365.8571 2365.8571
## [8] 1912.2857 1118.5357 1685.5000 2139.0714 1912.2857 1345.3214 1118.5357
## [15] 1231.9286 1005.1429 983.5442 1458.7143 1118.5357 1231.9286 1231.9286
## [22] 1005.1429 756.7585 983.5442 1231.9286 1231.9286 1005.1429 756.7585
## [29] 756.7585 756.7585 756.7585 756.7585 756.7585 756.7585 756.7585
## [36] 756.7585 529.9728 570.8723 756.7585 756.7585 756.7585 756.7585
## [43] 529.9728 344.0866 570.8723 756.7585 756.7585 529.9728 344.0866
## [50] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [57] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [64] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [71] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [78] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [85] 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866 344.0866
## [92] 344.0866
##
## $MSE
## [1] 26515.94
##
## $MAPE
## [1] 27.64683
##
## $Forescast
## [1] 324.7857
Dari hasil ramalan terlihat di hari ke-49 - 92 memiliki nilai yang sama, hal ini menunjukkan kondis stady state, dimana perubahan yang terjadi pada data aktual stabil.
Hari<- c(1:92)
plot(Hari,data4, type="l", col="blue", ylab="data")
par(new=TRUE)
plot(Hari, Ramalan$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))