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 } end; 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;
begin
if flag = 1 then begin if (MessageDlg('Data telah ada, apakah mau diubah??',mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin listdata.Clear; end; end;
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 begin AssignFile(AmbilFile, AmbilDialog.FileName); Reset(AmbilFile); //mulai ambil data ReadLn(AmbilFile,AmbilLine); jml_data := StrToInt(AmbilLine); if jml_data < 8 then begin showmessage('Data harus lebih dari 8, masukkan file yg baru!!!'); AmbilDialog.free; CloseFile(AmbilFile); exit; end; unit3.jml_data := jml_data; setlength(data,jml_data); for i:= 0 to jml_data - 1 do begin ReadLn(AmbilFile,AmbilLine); data[i] := StrToInt(AmbilLine); listdata.AddItem('Periode - '+inttostr(i+1)+' : '+ambilline,listdata); end; CloseFile(AmbilFile); flag := 1; end;
55
AmbilDialog.free; end;
procedure TForm1.btnKeluarClick(Sender: TObject); begin application.Terminate; end;
procedure TForm1.FormCreate(Sender: TObject); begin flag := 0; end;
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;
begin if flag = 1 then begin flg := 0; while (flg <> 1) do begin temp := InputBox('Silahkan Masukkan Data','Berapa periode yang mau diramalkan?',''); flg := 1; for i := 1 to length(temp) do begin
56
if ((ord(temp[i])<48) or (ord(temp[i])>57)) then begin flg := 0; break; end; end; end; 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 begin form3.PeriodBox.AddItem('Periode - '+inttostr(i+1),form3.PeriodBox);
//proses //proses Single Exponential Smoothing alpha := 1/n; if i = 0 then begin d := data[n-1]; avg := 0; for j := 0 to (n-1) do begin
57
avg := avg + data[j]; end; avg := avg/n; end else begin d := hasil1[i-1]; avg := hasil1[i-1]; end; hasil1[i] := alpha*d + (1-alpha)*avg; unit3._single[i] := hasil1[i];
//proses Double Exponential Smoothing if i = 0 then begin half := ceil(n / 2); avg21 := 0; avg22 := 0; for j := 0 to half-1 do begin avg21 := avg21 + data[j]; end; for j := half to n-1 do begin avg22 := avg22 + data[j]; end; 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; end; 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 begin avg31 := avg31+data[j]; end; avg31 := avg31/4; for j:= jml_data-4 to jml_data-1 do begin avg32 := avg32+data[j]; end; avg32 := avg32/4; BT := (avg32-avg31)/4; avg3 := (avg31+avg32)/2; if i = 0 then begin ST := avg3 + ((jml_data-1)/2)*BT; CT := data[jml_data-4]/(ST-BT*(3)); end else begin ST := alpha*(hasil3[i-1]/CT)+(1-alpha)*(ST+BT); CT := gamma*(hasil3[i-1]/ST)+(1-gamma)*CT;
59
end;
hasil3[i] := (ST+(i+1)*BT)*CT; unit3._triple[i] := hasil3[i];
n := n + 1; //menambahkan jumlah data end;
//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 begin showmessage('Data belum diisi atau jumlah data terlalu sedikit!!'); end; end;
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;
begin if flag = 1 then begin 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 begin form4.chartuji.Series[0].add(data[i],'Periode - ' + inttostr(i+1),clred); end; for i := 0 to 3 do begin form4.chartuji.Series[1].add(0,'Periode - ' + inttostr(i+1),0); form4.chartuji.Series[2].add(0,'Periode - ' + inttostr(i+1),0); end; for i := 0 to 7 do begin form4.chartuji.Series[3].add(0,'Periode - ' + inttostr(i+1),0); end; alpha := 0.25; err1 := 0; err2 := 0; err3 := 0;
for i := 0 to jml_data-5 do
61
begin //uji untuk Single Exponential d := data[i+3]; if i = 0 then begin avg := 0; for j := 0 to 3 do begin avg := avg + data[j]; end; avg := avg/4; end else begin avg := uji1[i-1]; end; 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 begin temp1 := temp1*(-1); end; if temp2 < 0 then begin temp2 := temp2*(-1); end; err1 := err1 + temp1; err2 := err2 + temp2;
end; alpha := alpha/2; for i := 0 to jml_data-9 do begin //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 begin temp3 := temp3*(-1); end; err3 := err3 + temp3; form4.chartuji.Series[3].add(uji3[i],'Periode - ' + inttostr(i+1),clgreen); end;
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 begin form4.txtHasil.text := ('Untuk data ini paling tepat menggunakan Metode Single Exponential Smoothing'); end else if (err2 < err1) and (err2 < err3) then begin form4.txtHasil.text := ('Untuk data ini paling tepat menggunakan Metode Double Exponential Smoothing'); end else if (err3 < err1) and (err3 < err2) then begin form4.txtHasil.text := ('Untuk data ini paling tepat menggunakan Metode Triple Exponential Smoothing'); end else begin form4.txtHasil.text := ('Ada lebih dari 1 metode yang tepat untuk meramalkan pola data ini'); end; form4.Visible := true; form1.Visible := false; end else begin
64
showmessage('Data belum diisi atau jumlah data terlalu sedikit !'); end; end;
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 } end;
65
var Form2: TForm2;
implementation
uses Skripsi;
{$R *.dfm}
procedure TForm2.btnMulaiClick(Sender: TObject); begin form2.Visible := false; form1.visible := true; end;
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 } end;
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); begin application.Terminate; end;
procedure TForm3.PeriodBoxChange(Sender: TObject); begin single_.text := inttostr(round(_single[periodbox.ItemIndex])); double_.text := inttostr(round(_double[periodbox.ItemIndex])); triple_.text := inttostr(round(_triple[periodbox.ItemIndex])); end;
procedure TForm3.btnSingleClick(Sender: TObject); var i : integer; begin chart.Series[0].Clear; for i := 0 to jml_data-1 do begin chart.Series[0].add(skripsi.data[i],'Periode - ' + inttostr(i+1),clred); end; for i := 0 to jml_ramal-1 do begin chart.Series[0].add(_single[i],'Periode - ' + inttostr(i+1),clblue); end;
68
form3.Height := 506; end;
procedure TForm3.btnDoubleClick(Sender: TObject); var i : integer; begin chart.Series[0].Clear; for i := 0 to jml_data-1 do begin chart.Series[0].add(skripsi.data[i],'Periode - ' + inttostr(i+1),clred); end; for i := 0 to jml_ramal-1 do begin chart.Series[0].add(_double[i],'Periode - ' + inttostr(i+1),clyellow); end; form3.Height := 506; end;
procedure TForm3.btnTripleClick(Sender: TObject); var i : integer; begin chart.Series[0].Clear; for i := 0 to jml_data-1 do begin chart.Series[0].add(skripsi.data[i],'Periode - ' + inttostr(i+1),clred); end; for i := 0 to jml_ramal-1 do begin chart.Series[0].add(_triple[i],'Periode - ' + inttostr(i+1),clgreen); end; form3.Height := 506;
69
end;
procedure TForm3.btnTutupClick(Sender: TObject); begin form3.Height := 230; end;
procedure TForm3.btnKembaliClick(Sender: TObject); begin form1.Visible := true; form3.Visible := false; end;
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 } end;
var Form4: TForm4;
implementation
uses Skripsi;
{$R *.dfm}
71
procedure TForm4.btnKeluarClick(Sender: TObject); begin application.terminate; end;
procedure TForm4.btnKembaliClick(Sender: TObject); begin form1.Visible := true; form4.Visible := false; end;
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 :
73
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 :
74
75
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 :
76
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 :
77
78
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 :
79
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 :
80
81