Alagoritma Fuzzy Time Series Ruey Chen Tsaur di R

Memanggil data

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

Membuat Algoritma untuk mendapatkan interval linguistik

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

Membuat fungsi Fuzzy Time Series dengan algoritma Ruey Chen Tsaur

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

Membuat Plot antara ramalan dengan data asli

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