artikel berikut merupakan hasil pembelajaran dari pdf Forecasting including an Introduction to Forecasting using the SAP R/3 System, Indiana University Kelley School of Business, dengan menggunakan bahasa sendiri. Artikel berikut merupakan lanjutan dari Data Mining: Identifikasi Pola Data Time Series dengan AngularJS & nvD3.

Seorang manajer distribusi jaket ingin meramal jumlah permintaan jaket untuk kwartal pertama tahun 2004, diketahui data historis permintaan jaket yang telah tercatat sejak kwartal pertama tahun 2000 pada tabel berikut, maka dari itu manajer ingin mencari model peramalan terbaik untuk salah satu produk terpopuler milik perusahaannya:

Grafik plot untuk data time series diatas mengindikasikan terdapat faktor musiman dan tren meningkat (seasonal trend time series), sehingga manajer memutuskan untuk menggunakan model peramalan yang ditemukan Winters.



Menentukan Faktor Peramalan Awal

Dalam penggunaan metode winters, faktor level, faktor tren, dan faktor musiman perlu diinisialisasi terlebih dahulu. Untuk mengestimasi faktor level awal dan faktor tren awal bisa menggunakan regresi linier dengan menggunakan data historis permintaan produk diatas (data historis permintaan bisa dari kartu persediaan jika belum ada kasir/point of sales atau data warehouse). Faktor level awal didapatkan dari rumus mencari y intercept/konstanta persamaan garis lurus, sedangkan faktor tren awal didapatkan dari rumus mencari koefisien regresi atau gradien persamaan garis lurus. Namun, jika menggunakan regresi linier, data historis pertama-tama perlu di deseasonalized terlebih dahulu.

Adapun cara untuk men-deseasonalisasi data historis tersebut,

1. kita perlu merata-rata baris pertama hingga keempat,  lalu merata-rata baris kedua hingga baris kelima, dst sampai baris ke 13 hingga baris ke 16 seperti tabel berikut

Angka 111.5 merupakan hasil rata-rata baris ke 1 hingga 4, angka 113.75 merupakan hasil rata-rata baris ke 2 hingga ke 5, dst hingga baris ke 13.

2. Setelah data historis permintaan di’deseasonalisasi pertama, langkah selanjutnya data hasil deseasonalisasi pertama tadi dicari rata-rata baris ke 1 dan ke 2, lalu baris ke 2 dan ke 3, dst sampai baris ke 12 dan ke 13 seperti tabel berikut

Angka 112.625 merupakan hasil rata-rata baris ke 1 dan ke 2, angka 115 merupakan hasil rata-rata baris ke 2 dan ke 3, dst sampai baris ke 12 dan ke 13.

Setelah data historis di-deseasonalisasikan, baru bisa mencari faktor tren awal yang merupakan gradient garis lurus atau koefisien regresi dan faktor level awal yang merupakan y intercept atau konstanta garis lurus. Untuk menghemat tulisan, proses regresi liniar-nya saya lampirkan di berkas excel berikut winters.xls. Dari perhitungan regresi linier didapatkan faktor level awal sebesar 107.8, faktor tren awal sebesar 3.5. Bila dinyatakan dalam persamaan garis lurus maka:

Y = 3.5x + 107.8

Setelah itu, untuk melengkapi perhitungan model winters, faktor musiman awal harus ditentukan pula, caranya

1.  mencari estimasi permintaan

2. menentukan estimasi musiman untuk setiap periode

3. merata-rata estimasi musiman yang sama

Langkah pertama dapat diselesaikan dengan menerapkan persamaan garis lurus yang baru saja dirumuskan diatas terhadap periode X

 Angka 111.389 merupakan hasil dari estimasi periode 1 dengan mensubstitusikan dengan variable independen x persamaan Y = 3.5x + 107.8, sehingga 3.5(1)+107.8 = 111.389, dst sampai periode 16

Langkah kedua yaitu estimasi musiman merupakan rasio permintaan aktual terhadap estimasi permintaan yang baru

Jadi, faktor musiman 0.879 merupakan hasil bagi 98 dengan 111.389, dst sampai periode 16. Angka 0.879 tersebut mengindikasikan bahwa permintaan actual 98 berada sekitar 12% dibawah garis lurus regeresi

Langkah ketiga, dilakukan dengan merata-rata estimasi musiman yang sama

Angka 0.886 merupakan rata-rata dari baris ke 1, ke 5, ke 9, dan ke 13, sedangkan angka 0.91 merupakan rata-rata dari baris ke 2, ke 6, ke 10 dan ke 14, dst sampai baris ke 4. Sehingga didapat empat faktor musiman awal diatas.

Meramal Dengan Model Winters

Sekarang faktor level, tren, dan musiman telah didapatkan, peramalan dengan metode Winters sudah bisa dilakukan. Model winter perlu di-train dengan semua data historis agar dapat digunakan untuk meramal periode ke 17.

Untuk men-training model, faktor-faktor awal digunakan untuk meramal periode pertama, dalam hal ini kwartal ke 1 tahun 2000. Peramalan didapatkan dengan

sehingga hasil forecast untuk periode pertama sebesar (107.8+3.5)*0.8 = 98.786, setelah forecast untuk periode pertama dilakukan, faktor level awal, faktor tren awal, dan faktor musiman awal perlu dimutakhirkan, faktor level awal dimutakhirkan dengan asumsi alpha = 0.25, menggunakan rumus

sehingga hasil pemutakhiran faktor level sebesar 0.25 * 98/0.886 + (1-0.25)*(107.8+3.5)=111.76

setelah itu faktor tren awal dimutakhirkan dengan asumsi beta = 0.2, menggunakan rumus

Sehingga hasil pemutakhiran faktor tren sebesar 0.2 * (111.76-107.86)+(1-0.2)*3.5 = 3.475

Setelah itu faktor musiman awal dimutakhirkan untuk menghasilkan faktor musiman ke 5, dengan asumsi gamma = 0.15, menggunakan rumus

Sehingga hasil pemutakhiran faktor musiman untuk faktor musiman ke 5 sebesar 0.15 * 98/111.16+(1-0.15)*0.88685 = 0.88606.

Setelah setiap faktor dimutakhirkan, training model winter dapat dilanjutkan lagi dengan meramal periode berikutnya, yaitu periode 2. Seluruh perhitungan untuk peramalan dan pemutakhirkan faktor-faktor ditunjukkan di tabel berikut

adapun perbandingan grafik permintaan aktual dengan hasil forecast sebagai berikut

Untuk perhitungan galat peramalan berupa, bias, Mean Absolute Deviation, Mean Squared Error, dan Tracking Signal, bias diukur dengan rumus berikut , MAD dengan rumus berikut: , MSE dengan rumus berikut: , dan tracking signal dengan rumus berikut:

 
Berkas excel untuk proses perhitungan lengkap dapat didapatkan di berkas berikut winters.xls.

Langkah-langkah untuk menghasilkan grafik diatas yaitu sebagai berikut:
NB: source code tidak berkualitas produksi
1. Install Java JDK dan atur variable JAVA_HOME dengan mengikuti langkah ditulisan berikut (Cara Install JDK (Java SE Development Kit 8u66) di Windows 10)
2. Install Notepad++ untuk keperluan penyuntingan kode sumber dengan mengikuti langkah ditulisan berikut (Cara Install Notepad++ di Windows 10)
3. Install Apache Tomcat dan atur variable CATALINA_HOME dengan mengikuti langkah ditulisan berikut (Cara Install Apache Tomcat 8.0.29 di Windows 10)
4. Buka direktori C:\apache-tomcat-8.0.29\webapps, hapus semua folder kecuali folder ROOT berikut:


5. Lalu buka folder ROOT, hapus semua berkas dan sisakan folder WEB-INF, serta hapus semua berkas yang berada di dalam folder WEB-INF:

6. Buka program Notepad++, lalu salin listing program berikut, simpan dengan nama Penjualan.java kedalam direktori C:\apache-tomcat-8.0.29\webapps\ROOT\WEB-INF\classes:

@javax.websocket.server.ServerEndpoint("/penjualan")
public class Penjualan {

    @javax.websocket.OnOpen
    public void ketikaTerhubung(javax.websocket.Session koneksi) throws Exception {
  koneksi.getBasicRemote().sendText(
   "[{\"kuantitas\":98},"
   +"{\"kuantitas\":106},"
   +"{\"kuantitas\":109},"
   +"{\"kuantitas\":133},"
   +"{\"kuantitas\":107},"
   +"{\"kuantitas\":116},"
   +"{\"kuantitas\":121},"
   +"{\"kuantitas\":146},"
   +"{\"kuantitas\":127},"
   +"{\"kuantitas\":130},"
   +"{\"kuantitas\":136},"
   +"{\"kuantitas\":159},"
   +"{\"kuantitas\":139},"
   +"{\"kuantitas\":143},"
   +"{\"kuantitas\":153},"
   +"{\"kuantitas\":177}]"
  );
    }

}

7. salin juga listing html berikut, simpan dengan nama index.html ke dalam direktori C:\apache-tomcat-8.0.29\webapps\ROOT\ :
<!DOCTYPE html>
<html lang="jv" ng-app="penjualan">
 <head>
  <meta charset="utf-8"></meta>
  <title>Pengenalan Pola Data</title>
  <link rel="stylesheet" href="//cdn.rawgit.com/novus/nvd3/v1.8.1/build/nv.d3.css">
 </head>
 <body ng-controller="jualCtrl as jc">
  <nvd3 options="jc.opsibaris" data="jc.databaris" api="jc.apibaris" config="{deepWatchDataDepth: 0}"></nvd3>
  <nvd3 options="jc.opsikorelasi" data="jc.datakorel" api="jc.apikorel" config="{deepWatchDataDepth: 0}"></nvd3>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script src="//cdn.rawgit.com/novus/nvd3/v1.8.1/build/nv.d3.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/angular-nvd3/1.0.4/angular-nvd3.min.js"></script>
  <script language="javascript" type="text/javascript">
   angular.module('penjualan', ['nvd3'])
   .controller('jualCtrl', function(){
    self = this;
    //dokumentasi tersedia di http://krispo.github.io/angular-nvd3/#/quickstart
    self.opsibaris = {
     chart: {
      type: 'lineChart',
      height: 400,
      margin : { top: 5, right: 20, bottom: 40, left: 60 },
      x: function(d){ return d.kwartal; },
      y: function(d){ return d.penjualan; },
      xAxis: { axisLabel: 'kwartal' },
      yAxis: { axisLabel: 'Penjualan', tickFormat: function(d){ return d3.format('.1f')(d); }}
     }
    };
    self.databaris = [{key: 'Penjualan Aktual',values:[],color: '#4A7EBB'},
        {key: 'Peramalan Permintaan',values: [],color: '#BE4B48'}];
    self.opsikorelasi = {
     chart: {
      type: 'discreteBarChart',
      height: 400,
      margin : { top: 40, right: 20, bottom: 40, left: 60 },
      x: function(d){ return d.label; },
      y: function(d){ return d.kuantitas; },
      xAxis: { axisLabel: 'Lag ke' },
      yAxis: { axisLabel: 'Autocorrelation', tickFormat: function(d){ return d3.format('.1f')(d); }}
     }
    };
    self.datakorel = [{key: "",values:[]}];
    //dokumentasi tersedia di https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
    var koneksi = new WebSocket("ws://127.0.0.1:8080/penjualan");
    koneksi.onmessage = function(kontenDariServer) {
     var larikData = JSON.parse(kontenDariServer.data).map(function(nilai, indeks, larik){
       //menyiapkan data untuk grafik penjualan
       self.databaris[0].values.push({kwartal: indeks+1, penjualan: nilai.kuantitas});
       return nilai.kuantitas;
      }
     );

     //menyiapkan data untuk grafik autocorrelation
     for (var i=1; i<larikData.length;i++){
      var sumOfr1 = larikData.map(function(value, indeks, larik){
       var sebelum = larik[indeks-i];
       if(typeof(sebelum) === 'undefined') return 0;
       return (value - larik.jumlah()/larik.length)*(sebelum - larik.jumlah()/larik.length);
      }).jumlah();
      self.datakorel[0].values.push({ label: i , kuantitas: sumOfr1/larikData.variasi() });
     }
     //menyiapkan data untuk grafik ramalan
     var di = [];
     for(var i=0; i<larikData.length-3; i++){
      di.push((larikData[i]+larikData[i+1]+larikData[i+2]+larikData[i+3])/4);
     }
     var dd = [];
     for(var i=0; i<di.length-1; i++){
      dd.push((di[i]+di[i+1])/2);
     }
     var x = [];
     var x2 = [];
     var xy = dd.map(function(nilai, indeks, larik){
      x.push(indeks+1);
      x2.push((indeks+1)*(indeks+1));
      return x[indeks]*nilai;
     });
     var konstanta = (dd.jumlah()*x2.jumlah()-x.jumlah()*xy.jumlah())/(dd.length*x2.jumlah()-Math.pow(x.jumlah(),2.0));
     var gradien = (dd.length*xy.jumlah()-x.jumlah()*dd.jumlah())/(dd.length*x2.jumlah()-Math.pow(x.jumlah(),2.0));
     var estimD = larikData.map(function(nilai,indeks){
      return gradien*(indeks+1) + konstanta;
     });
     var musims = larikData.map(function(nilai, indeks){
      return nilai/estimD[indeks];
     });
     var initMusims = [];
     for(var i=0; i<4; i++){
      initMusims.push((musims[i]+musims[i+4]+musims[i+8]+musims[i+12])/4);
     }
     var alpha = 0.25, beta = 0.2, gamma = 0.15;
     var ramalan = larikData.map(function(nilai, indeks, larik){
      var kembali = (konstanta + gradien)*initMusims[indeks % 4];
      self.databaris[1].values.push({kwartal: indeks+1, penjualan: kembali});
      var konstantaOld = konstanta;
      konstanta = alpha * nilai / initMusims[indeks % 4] + (1-alpha) * (konstanta + gradien);
      gradien = beta * (konstanta - konstantaOld) + (1 - beta) * gradien;
      initMusims[indeks % 4] = gamma * larikData[indeks] / konstanta + (1 - gamma) * initMusims[indeks % 4];
      return kembali;
     });
     ramalan.push((konstanta+gradien)*initMusims[0]);
     self.databaris[1].values.push({kwartal: ramalan.length, penjualan: ramalan[ramalan.length-1]});
     self.apibaris.update();
     self.apikorel.update();
    };
    Array.prototype.jumlah = function() {
     return this.reduce(function(a,b){return a+b;});
    };
    Array.prototype.variasi = function(){
     return this.map(function(value,indeks,larik){
      return Math.pow(value - larik.jumlah()/larik.length,2);
     }).jumlah();
    };
   });
  </script>
 </body>
</html>

8. buka command prompt, lalu masukkan perintah: cd C:\apache-tomcat-8.0.29\webapps\ROOT\WEB-INF\classes, sehingga direktori kerja command prompt telah berganti ke direktori tersebut


9. Lalu jalankan perintah: javac -cp "C:\apache-tomcat-8.0.29\lib\*" Penjualan.java sehingga isi direktori dan sub-direktori dari folder webapps menjadi seperti berikut:


10. Lalu jalankan tomcat dengan berpindah ke direktori ../bin, dan memasukkan perintah startup.bat:

11. Buka browser anda, dan ketikkan alamat web http://127.0.0.1:8080 kedalam address bar berikut:


Adapun alasan pemilihan teknologi, hanya mencoba mengikuti teknologi yang dipilih oleh Korea Advanced Institute of Science and Technology berikut https://github.com/gs1oliot/oliot-epcis/blob/master/pom.xml dengan jurnalnya Oliot EPCIS: New EPC information service and challenges towards the Internet of Things, EPCIS versi open source lainnya yaitu fosstrak, versi komersil proprietary ada SAP Object Event Repository, EPCIS itu sederhananya adalah framework datawarehouse internasional, hanya bisa melakukan capture dan query, capture itu insert, dan query itu select. Kalau ingin ikut diskusi tentang Oliot EPCIS di grup facebook berikut: Oliot, tapi pakai google translate yag :v.

Sebenarnya SAP sendiri sudah komplit paket peramalannya, tapi ya apa harus bergantung terus terhadap bangsa lain?

Daftar Pustaka:
  1. F. Gorunescu, Data Mining: Concepts, Models and Techniques. Berlin: Springer, 2011.
  2. J. Han, M. Kamber and J. Pei, Data Mining: Concepts and Techniques. Amsterdam: Elsevier/Morgan Kaufmann, 2012.
  3. jurnalakuntansikeuangan.com, 'Akuntansi Persediaan: Sistim Periodik Vs Perpetual | Jurnal Akuntansi Keuangan', 2015. [Online]. Available: http://datacomlink.blogspot.co.id/2015/12/akuntansi-persediaan-sistim-periodik-vs-perpetual.html. [Accessed: 02- Dec- 2015].
  4. A. Kanda, 'Forecasting', Department of Mechanical Engineering, Indian Institue of Technology Delhi, 2003.
  5. U. Küsters, B. McCullough and M. Bell, 'Forecasting software: Past, present and future', International Journal of Forecasting, vol. 22, no. 3, pp. 599-615, 2006.
  6. B. Mellor, Data Analytics and Optimization Track, 1st ed. Columbus: Department of Integrated Systems Engineering, Ohio State University, 2015.
  7. K. King, Master of Engineering Student Handbook, 1st ed. Ithaca, NY: School of Operations Research and Information Engineering, Cornell University, 2015, pp. 8-10.
  8. U. Muawanah and F. Poernawati, Konsep Dasar Akuntansi dan Pelaporan Keuangan Jilid 2 untuk SMK. Jakarta: Direktorat Pembinaan Sekolah Menengah Kejuruan, Direktorat Jenderal Manajemen Pendidikan Dasar dan Menengah, Departemen Pendidikan Nasional, 2008.
  9. M. North, Data mining for the masses. Global Text Project, 2012.
  10. S. Makridakis, The Forecasting accuracy of major time series methods. Chichester: Wiley, 1984.
  11. C. Renfro, "Econometric software: The first fifty years in perspective", JOURNAL OF ECONOMIC AND SOCIAL MEASUREMENT., vol. 29, pp. 9-108, 2004.
  12. Help.sap.com, 'Forecast Formulas - Sales & Operations Planning (LO-LIS-PLN) - SAP Library', 2015. [Online]. Available: http://help.sap.com/saphelp_470/helpdata/en/a5/6320e843a211d189410000e829fbbd/content.htm. [Accessed: 05- Dec- 2015]. 

Reactions:

You Might Also Like:

Berikan Komentar Sembunyikan Komentar

Hello, how may we help you? Just send us a message now to get assistance.

Facebook Messenger ×