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;
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;
// 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;
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
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
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;
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;
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;
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
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
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;
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
showmessage('Data belum diisi atau jumlah data terlalu sedikit !'); end; end; end.
Form 02
unit Unit2; interface usesWindows, 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;
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 usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, StdCtrls, Series;
type
TForm3 = class(TForm) PeriodBox: TComboBox;
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;
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;
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;
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 usesWindows, 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;
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}
procedure TForm4.btnKeluarClick(Sender: TObject); begin
application.terminate; end;
procedure TForm4.btnKembaliClick(Sender: TObject); begin
form1.Visible := true; form4.Visible := false; end;
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 :
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
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 :
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
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 :
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