Lampiran 1 Form 01 unit Skripsi; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, math; type TForm1 = class(tform) Label1: TLabel; btnpilih: TButton; btnkeluar: TButton; ListData: TListBox; Label3: TLabel; btnproses: TButton; btnuji: TButton; procedure btnpilihclick(sender: TObject); procedure btnkeluarclick(sender: TObject); procedure FormCreate(Sender: TObject); procedure btnprosesclick(sender: TObject); procedure btnujiclick(sender: TObject); private { Private declarations } public { Public declarations } 53
var Form1: TForm1; jml_data,flag,jml_ramal : integer; hasil1,hasil2,hasil3 : array of double; data : array of integer; implementation {$R *.dfm} uses unit3, Unit4; procedure TForm1.btnPilihClick(Sender: TObject); var AmbilDialog : TOpenDialog; AmbilFile : TextFile; i : integer; AmbilLine : string; if flag = 1 then if (MessageDlg('Data telah ada, apakah mau diubah??',mtconfirmation, [mbyes, mbno], 0) = mryes) then listdata.clear; 54
// siapin dialog box untuk open file AmbilDialog := TOpenDialog.Create(self); AmbilDialog.InitialDir := GetCurrentDir; AmbilDialog.Filter := 'textfile *.txt'; //mulai ambil file if AmbilDialog.execute then AssignFile(AmbilFile, AmbilDialog.FileName); Reset(AmbilFile); //mulai ambil data ReadLn(AmbilFile,AmbilLine); jml_data := StrToInt(AmbilLine); if jml_data < 8 then showmessage('data harus lebih dari 8, masukkan file yg baru!!!'); AmbilDialog.free; CloseFile(AmbilFile); exit; unit3.jml_data := jml_data; setlength(data,jml_data); for i:= 0 to jml_data - 1 do ReadLn(AmbilFile,AmbilLine); data[i] := StrToInt(AmbilLine); listdata.additem('periode - '+inttostr(i+1)+' : '+ambilline,listdata); CloseFile(AmbilFile); flag := 1; 55
AmbilDialog.free; procedure TForm1.btnKeluarClick(Sender: TObject); application.terminate; procedure TForm1.FormCreate(Sender: TObject); flag := 0; procedure TForm1.btnProsesClick(Sender: TObject); var temp : string; i,j,n,half,flg : integer; a,b,c,d,d3,s,avg,avg2,avg21,avg22,avg_dif : double; avg31,avg32,avg3,bt,st,ct : double; alpha,gamma : double; if flag = 1 then flg := 0; while (flg <> 1) do temp := InputBox('Silahkan Masukkan Data','Berapa periode yang mau diramalkan?',''); flg := 1; for i := 1 to length(temp) do 56
if ((ord(temp[i])<48) or (ord(temp[i])>57)) then flg := 0; break; jml_ramal := strtoint(temp); unit3.jml_ramal := jml_ramal; setlength(hasil1,jml_ramal); setlength(unit3._single,jml_ramal); setlength(hasil2,jml_ramal); setlength(unit3._double,jml_ramal); setlength(hasil3,jml_ramal); setlength(unit3._triple,jml_ramal); n := jml_data; form3.periodbox.clear; for i := 0 to (jml_ramal-1) do form3.periodbox.additem('periode - '+inttostr(i+1),form3.periodbox); //proses //proses Single Exponential Smoothing alpha := 1/n; if i = 0 then d := data[n-1]; avg := 0; for j := 0 to (n-1) do 57
avg := avg + data[j]; avg := avg/n; end else d := hasil1[i-1]; avg := hasil1[i-1]; hasil1[i] := alpha*d + (1-alpha)*avg; unit3._single[i] := hasil1[i]; //proses Double Exponential Smoothing if i = 0 then half := ceil(n / 2); avg21 := 0; avg22 := 0; for j := 0 to half-1 do avg21 := avg21 + data[j]; for j := half to n-1 do avg22 := avg22 + data[j]; avg21 := avg21/half; avg22 := avg22/(half-1); avg2 := (avg21 + avg22)/2; avg_dif := avg22-avg21; S := avg2 + avg_dif; 58
avg_dif := avg_dif/half; hasil2[i] := S + (i+1)*avg_dif; unit3._double[i] := hasil2[i]; //proses Triple Exponential Smoothing alpha := 0.15; gamma := 0.2; avg31 := 0; avg32 := 0; for j := jml_data-8 to jml_data-5 do avg31 := avg31+data[j]; avg31 := avg31/4; for j:= jml_data-4 to jml_data-1 do avg32 := avg32+data[j]; avg32 := avg32/4; BT := (avg32-avg31)/4; avg3 := (avg31+avg32)/2; if i = 0 then ST := avg3 + ((jml_data-1)/2)*bt; CT := data[jml_data-4]/(st-bt*(3)); end else ST := alpha*(hasil3[i-1]/ct)+(1-alpha)*(st+bt); CT := gamma*(hasil3[i-1]/st)+(1-gamma)*ct; 59
hasil3[i] := (ST+(i+1)*BT)*CT; unit3._triple[i] := hasil3[i]; n := n + 1; //menambahkan jumlah data //siapin output textbox form3.single_.text := inttostr(round(hasil1[0])); form3.double_.text := inttostr(round(hasil2[0])); form3.triple_.text := inttostr(round(hasil3[0])); form3.periodbox.itemindex := 0; //tampilkan form3 form3.visible := true; form3.height := 230; form1.visible := false; end else showmessage('data belum diisi atau jumlah data terlalu sedikit!!'); procedure TForm1.btnUjiClick(Sender: TObject); var d,i,j : integer; alpha,avg,avg2,avg21,avg22,avg_dif : double; avg3,avg31,avg32,bt,st,ct : double; err1,err2,err3,temp1,temp2,temp3 : double; 60
uji1,uji2,uji3 : array of double; if flag = 1 then setlength(uji1,jml_data-4); setlength(uji2,jml_data-4); setlength(uji3,jml_data-8); form4.chartuji.series[0].clear; form4.chartuji.series[1].clear; form4.chartuji.series[2].clear; form4.chartuji.series[3].clear; for i := 0 to jml_data-1 do form4.chartuji.series[0].add(data[i],'periode - ' + inttostr(i+1),clred); for i := 0 to 3 do form4.chartuji.series[1].add(0,'periode - ' + inttostr(i+1),0); form4.chartuji.series[2].add(0,'periode - ' + inttostr(i+1),0); for i := 0 to 7 do form4.chartuji.series[3].add(0,'periode - ' + inttostr(i+1),0); alpha := 0.25; err1 := 0; err2 := 0; err3 := 0; for i := 0 to jml_data-5 do 61
//uji untuk Single Exponential d := data[i+3]; if i = 0 then avg := 0; for j := 0 to 3 do avg := avg + data[j]; avg := avg/4; end else avg := uji1[i-1]; uji1[i] := alpha*d + (1-alpha)*avg; form4.chartuji.series[1].add(uji1[i],'periode - ' + inttostr(i+1),clblue); //uji untuk Double Exponential avg21 := (data[i]+data[i+1])/2; avg22 := (data[i+2]+data[i+3])/2; avg2 := (avg21+avg22)/2; avg_dif := (avg22-avg21); uji2[i] := avg2 + avg_dif + avg_dif/2; form4.chartuji.series[2].add(uji2[i],'periode - ' + inttostr(i+1),clyellow); //hitung nilai error temp1 := ((data[i+4]-uji1[i])/data[i+4]); temp2 := ((data[i+4]-uji2[i])/data[i+4]); //memutlakkan 62
if temp1 < 0 then temp1 := temp1*(-1); if temp2 < 0 then temp2 := temp2*(-1); err1 := err1 + temp1; err2 := err2 + temp2; alpha := alpha/2; for i := 0 to jml_data-9 do //uji untuk Triple Exponential avg31 := (data[i]+data[i+1]+data[i+2]+data[i+3])/4; avg32 := (data[i+4]+data[i+5]+data[i+6]+data[i+7])/4; BT := (avg32-avg31)/4; avg3 := (avg31+avg32)/2; ST := avg3 + (3.5)*BT; CT :=data[i+4]/(st-bt*(3)); uji3[i] := (ST + BT)*CT; temp3 := ((data[i+8]-uji3[i])/data[i+8]); if temp3 < 0 then temp3 := temp3*(-1); err3 := err3 + temp3; form4.chartuji.series[3].add(uji3[i],'periode - ' + inttostr(i+1),clgreen); 63
err1 := (100/(jml_data-4))*err1; err2 := (100/(jml_data-4))*err2; err3 := (100/(jml_data-8))*err3; form4.txtsingle.text := inttostr(round(err1)); form4.txtdouble.text := inttostr(round(err2)); form4.txttriple.text := inttostr(round(err3)); if (err1 < err2) and (err1 < err3) then form4.txthasil.text := ('Untuk data ini paling tepat menggunakan Metode Single Exponential Smoothing'); end else if (err2 < err1) and (err2 < err3) then form4.txthasil.text := ('Untuk data ini paling tepat menggunakan Metode Double Exponential Smoothing'); end else if (err3 < err1) and (err3 < err2) then form4.txthasil.text := ('Untuk data ini paling tepat menggunakan Metode Triple Exponential Smoothing'); end else form4.txthasil.text := ('Ada lebih dari 1 metode yang tepat untuk meramalkan pola data ini'); form4.visible := true; form1.visible := false; end else 64
showmessage('data belum diisi atau jumlah data terlalu sedikit!'); end. Form 02 unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(tform) Label1: TLabel; btnmulai: TButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; procedure btnmulaiclick(sender: TObject); private { Private declarations } public { Public declarations } 65
var Form2: TForm2; implementation uses Skripsi; {$R *.dfm} procedure TForm2.btnMulaiClick(Sender: TObject); form2.visible := false; form1.visible := true; end. Form 03 unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, StdCtrls, Series; type TForm3 = class(tform) PeriodBox: TComboBox; 66
single_: TEdit; double_: TEdit; triple_: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; btnsingle: TButton; btndouble: TButton; btntriple: TButton; chart: TChart; btnkeluar: TButton; btnkembali: TButton; Series1: TLineSeries; btntutup: TButton; procedure btnkeluarclick(sender: TObject); procedure PeriodBoxChange(Sender: TObject); procedure btnsingleclick(sender: TObject); procedure btndoubleclick(sender: TObject); procedure btntripleclick(sender: TObject); procedure btntutupclick(sender: TObject); procedure btnkembaliclick(sender: TObject); private { Private declarations } public { Public declarations } var Form3: TForm3; jml_data,jml_ramal :integer; _single,_double,_triple : array of double; 67
implementation {$R *.dfm} uses skripsi; procedure TForm3.btnKeluarClick(Sender: TObject); application.terminate; procedure TForm3.PeriodBoxChange(Sender: TObject); single_.text := inttostr(round(_single[periodbox.itemindex])); double_.text := inttostr(round(_double[periodbox.itemindex])); triple_.text := inttostr(round(_triple[periodbox.itemindex])); procedure TForm3.btnSingleClick(Sender: TObject); var i : integer; chart.series[0].clear; for i := 0 to jml_data-1 do chart.series[0].add(skripsi.data[i],'periode - ' + inttostr(i+1),clred); for i := 0 to jml_ramal-1 do chart.series[0].add(_single[i],'periode - ' + inttostr(i+1),clblue); 68
form3.height := 506; procedure TForm3.btnDoubleClick(Sender: TObject); var i : integer; chart.series[0].clear; for i := 0 to jml_data-1 do chart.series[0].add(skripsi.data[i],'periode - ' + inttostr(i+1),clred); for i := 0 to jml_ramal-1 do chart.series[0].add(_double[i],'periode - ' + inttostr(i+1),clyellow); form3.height := 506; procedure TForm3.btnTripleClick(Sender: TObject); var i : integer; chart.series[0].clear; for i := 0 to jml_data-1 do chart.series[0].add(skripsi.data[i],'periode - ' + inttostr(i+1),clred); for i := 0 to jml_ramal-1 do chart.series[0].add(_triple[i],'periode - ' + inttostr(i+1),clgreen); form3.height := 506; 69
procedure TForm3.btnTutupClick(Sender: TObject); form3.height := 230; procedure TForm3.btnKembaliClick(Sender: TObject); form1.visible := true; form3.visible := false; end. Form 04 unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart; type TForm4 = class(tform) Label1: TLabel; Chartuji: TChart; Series1: TLineSeries; Series2: TLineSeries; 70
Series3: TLineSeries; Series4: TLineSeries; btnkeluar: TButton; btnkembali: TButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; txtsingle: TEdit; txtdouble: TEdit; txttriple: TEdit; Label5: TLabel; Label6: TLabel; Label7: TLabel; txthasil: TEdit; procedure btnkeluarclick(sender: TObject); procedure btnkembaliclick(sender: TObject); private { Private declarations } public { Public declarations } var Form4: TForm4; implementation uses Skripsi; {$R *.dfm} 71
procedure TForm4.btnKeluarClick(Sender: TObject); application.terminate; procedure TForm4.btnKembaliClick(Sender: TObject); form1.visible := true; form4.visible := false; end. 72
Lampiran 2 Pengujian pertama dilakukan dengan menggunakan data yang berpola stationer, seperti yang ditunjukkan pada gambar berikut : Seperti yang terlihat pola data tersebut bersifat stationer karena data yang ada berkisar antara 130-170, tidak ada data yang berbeda jauh, pada teorinya hasil peramalan yang paling akurat adalah dengan menggunakan metode Single Exponential Smoothing. Lalu dapat kita lihat hasil pengujian nya pada gambar berikut : 3
Didapat hasil uji dalam bentuk grafik, nilai-nilai hasil peramalan ada yang mendekati dan menjauhi data aslinya, namun yang paling akurat adalah dengan menggunakan metode Single Exponential Smoothing. Hal ini juga dapat dilihat dari hasil pengukuran kesalahan dengan nilai yang terkecil pada bagian Single. Dianjurkan agar meramalkan data untuk pola data ini dengan menggunakan metode Single Exponential Smoothing. Hasil peramalan untuk 5 periode ke depan dapat dilihat pada gambar berikut : Dari gambar di atas dapat dilihat hasil peramalan dengan metode Single Exponential Smoothing tingkat penjualan untuk 1 periode ke depan adalah 155. Dapat dilihat juga grafiknya : 4
5
Pengujian kedua dilakukan dengan menggunakan data yang berpola trend, seperti yang ditunjukkan pada gambar berikut : Seperti yang terlihat pola data tersebut bersifat trend karena data yang ada peningkatan yang signifikan per-periode, pada teorinya hasil peramalan yang paling akurat adalah dengan menggunakan metode Double Exponential Smoothing. Lalu dapat kita lihat hasil pengujian nya pada gambar berikut : 6
Didapat hasil uji dalam bentuk grafik, nilai-nilai hasil peramalan ada yang mendekati dan menjauhi data aslinya, namun yang paling akurat adalah dengan menggunakan metode Double Exponential Smoothing. Hal ini juga dapat dilihat dari hasil pengukuran kesalahan dengan nilai yang terkecil pada bagian Double. Dianjurkan agar meramalkan data untuk pola data ini dengan menggunakan metode Double Exponential Smoothing. Hasil peramalan untuk 5 periode ke depan dapat dilihat pada gambar berikut : Dari gambar di atas dapat dilihat hasil peramalan dengan metode Double Exponential Smoothing tingkat penjualan untuk 1 periode ke depan adalah 293. Dapat dilihat juga grafiknya : 7
8
Pengujian ketiga dilakukan dengan menggunakan data yang berpola kuadratis, seperti yang ditunjukkan pada gambar berikut : Seperti yang terlihat pola data tersebut bersifat kuadratis karena data yang ada terdapat perubahan yang cukup mencolok setiap periodenya dengan perbedaan yang cukup besar membentuk pola seperti kurva, pada teorinya hasil peramalan yang paling akurat adalah dengan menggunakan metode Triple Exponential Smoothing. Lalu dapat kita lihat hasil pengujian nya pada gambar berikut : 9
Didapat hasil uji dalam bentuk grafik, nilai-nilai hasil peramalan ada yang mendekati dan menjauhi data aslinya, namun yang paling akurat adalah dengan menggunakan metode Triple Exponential Smoothing. Hal ini juga dapat dilihat dari hasil pengukuran kesalahan dengan nilai yang terkecil pada bagian Triple. Dianjurkan agar meramalkan data untuk pola data ini dengan menggunakan metode Triple Exponential Smoothing. Hasil peramalan untuk 5 periode ke depan dapat dilihat pada gambar berikut : Dari gambar di atas dapat dilihat hasil peramalan dengan metode Triple Exponential Smoothing tingkat penjualan untuk 1 periode ke depan adalah 98. Dapat dilihat juga grafiknya : 0
1