Memanggil Data

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'

Mengubah Data ke Bentuk Time Series

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

Melihat nilai Minimum dan Maksimun

Nilai minimum dan maksimum berfungsi untuk pembuatan interval linguistik

min(data4)
## [1] 106
max(data4)
## [1] 3263

Mencari Interval Linguistik

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

Melakukan Peramalan

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.

Plot Data Ramalan dan Real

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