Berdasarkan pertanyaan-pertanyaan yang sering muncul kepada saya tentang langkah2 penerapan metode Dekomposisi Census II, dengan ini saya sampaikan coding yang dibuat dengan bahasa pemrograman Turbo Pascal versi 7.0.

Perlu diketahui bahwa program tersebut adalah “salah satu contoh dan bukan satu-satunya contoh” dari sistem perhitungan metode Dekomposisi Census II yang dapat dijadikan rujukan.

Program yang saya buat ini masih sangat sederhana dan belum disertai dengan GUI yang interaktif, bahkan masih menggunakan Turbo Pascal dengan alasan :
Pertama, goal yang ingin dicapai adalah "pemahaman alur penerapan metode" dan "bukan pembuatan aplikasi"
Kedua, Turbo Pascal adalah bahasa pemrograman terstruktur yang lebih mudah difahami bagian per bagiannya.


Semoga artikel sederhana ini dapat bermanfaat untuk menyudahi segala confius yang sering terjadi saat mempelajari metode dekomposisi Census II. Bagi yang ingin mengetahui ringkasan teorinya dapat mempelajari terlebih dahulu di link ini

Untuk menganalisa data dalam jumlah besar dan bervariasi hendaknya menggunakan aplikasi yang lebih baik atau menggunakan software-software baku dipasaran.

Oh ya, karena pendekatan pada artikel ini masih sederhana maka sistem penyimpanan data yang saya gunakan juga masih sederhana yaitu dengan cara menyimpan data time series pada array sebagai berikut :


Const
L = 12;
n = 72;

NamaFile = 'SKontKLS.txt';

data : array [1..n] of real =
(1.6,1.6,2.3,3,3.1,3.1,3.1,2.8,3,3.2,2.4,2.2,2.2,2.5,3.6,
4,4,4.2,4.1,4.1,3.8,4.1,3.7,3.2,3,3.5,5.3,5.5,5.8,6,5.7,
6.2,5.6,5.5,5.4,4.3,3.9,3.9,6.3,6.8,7.8,7.9,6.8,7.1,6.5,
7.1,6,4.7,4.5,4.6,6.9,6,8.1,7.3,7,7.1,6.2,6.9,4.7,
4.3,4.1,4.3,4.6,4.4,4.5,5.1,6.1,5.9,6.1,6.8,5.8,5.6);



Jika disajikan dalam bentuk tabel, maka rangkaian array di atas akan mewakili data time series ttg kontrak kerja karyawan seperti dibawah ini

Bulan

Tahun

1982

1983

1984

1985

1986

1987

1

1.6

2.2

3

3.9

4.5

4.1

2

1.6

2.5

3.5

3.9

4.6

4.3

3

2.3

3.6

5.3

6.3

6.9

4.6

4

3

4

5.5

6.8

6

4.4

5

3.1

4

5.8

7.8

8.1

4.5

6

3.1

4.2

6

7.9

7.3

5.1

7

3.1

4.1

5.7

6.8

7

6.1

8

2.8

4.1

6.2

7.1

7.1

5.9

9

3

3.8

5.6

6.5

6.2

6.1

10

3.2

4.1

5.5

7.1

6.9

6.8

11

2.4

3.7

5.4

6

4.7

5.8

12

2.2

3.2

4.3

4.7

4.3

5.6



Sebelum melanjutkan ke bagian program / algoritma dekomposisi, maka dipersilakan kepada pembaca yang kebelet pipis untuk pergi ke toilet terlebih dahulu, karena nahan-nahan pipis itu tidak baik untuk kesehatan para ilmuwan

sekedar saran aja loh ya...hehehe... :D
biar suasana bisa lebih cair ... :)

Oke kalo sudah lega, silakan tarik nafas dan mulailah membuka buku Makridakis, Wheelwright and McGee dan kemudian berusaha memahami alur pemrograman di bawah ini.

Selamat belajar....

Catatan bagi mereka yang belum begitu mengenal turbo pascal, bila ada suatu statemen atau code yang ditulis diantara tanda kurung seperti ini {}, maka statemen atau kode tersebut tidak ikut dikompilasi dan hanya dianggap sebagai catatan pengingat saja.



uses crt;

Const
L = 12;
n = 72;

NamaFile = 'SKontKLS.txt';

data : array [1..n] of real =
(1.6,1.6,2.3,3,3.1,3.1,3.1,2.8,3,3.2,2.4,2.2,2.2,2.5,3.6,
4,4,4.2,4.1,4.1,3.8,4.1,3.7,3.2,3,3.5,5.3,5.5,5.8,6,5.7,
6.2,5.6,5.5,5.4,4.3,3.9,3.9,6.3,6.8,7.8,7.9,6.8,7.1,6.5,
7.1,6,4.7,4.5,4.6,6.9,6,8.1,7.3,7,7.1,6.2,6.9,4.7,
4.3,4.1,4.3,4.6,4.4,4.5,5.1,6.1,5.9,6.1,6.8,5.8,5.6);

type
savedat = array [1..n] of real;
savetab = array [1..25,1..L] of real;

var
per2 : integer;

procedure RasioAwal(Var output : savedat);
var
i,j : byte;
sum,save : real;

begin
per2:=Round(L/2);
for i:=(per2+1) to n-(per2-1) do
begin
sum:=0;
for j:=i-per2 to i+(per2-1) do
sum:=sum+data[j];
if i>(per2+1) then
output[i-1]:=200*L*data[i-1]/(save+sum);
save:=sum;
end;

{Inisialisasi 6 data awal dan akhir yang hilang}
for i:=1 to per2 do
begin
output[i]:=0;
output[n+i-per2]:=0;
end;
end;

procedure Transpose(input : savedat;var Output : Savetab);
var
i,j,k : byte;

begin
k:=0;
for i:=1 to round(n/L) do
begin
for j:=1 to L do
output[i,j]:=input[j+k];
k:=k+L;
end;
end;

procedure DummyTab(Input : savetab; var Dummy : savetab);
var
i,j,Baris : byte;
begin
baris:=Round(n/L);
for i:=1 to 2 do
for j:=1 to L do
begin
Dummy[i,j]:=0;
Dummy[baris+i+2,j]:=0;
end;

for i:=3 to baris+2 do
for j:=1 to L do
Dummy[i,j]:=input[i-2,j];

end;

procedure MA3x3(input : savetab; var output : savetab);
var
i,j,baris : byte;
init : real;
begin
Baris := Round(n/L)+4;

{Mengganti nilai nol}
init:=input[3,1];
for j:=1 to per2 do
begin
{Atas}
if (input [3,j]=0) then
begin
input[2,j]:=(input[4,j]+input[5,j])/2;
input[3,j]:=input[2,j];
end else
begin
input[2,j]:=(input[3,j]+input[4,j])/2;
input[1,j]:=input[2,j];
end;

input[1,j+per2]:=(input[3,j+per2]+input[4,j+per2])/2;
input[2,j+per2]:=input[1,j+per2];

{Bawah}
input[Baris-1,j]:=(input[Baris-2,j]+input[Baris-3,j])/2;
input[Baris,j]:=input[Baris-1,j];
if (input[Baris-2,j+per2]=0) then
begin
input[Baris-1,j+per2]:=
(input[baris-3,j+per2]+input[baris-4,j+per2])/2;
Input[Baris-2,j+per2]:=input[Baris-1,j+per2];
end else
begin
input[Baris-1,j+per2]:=(input[baris-3,j+per2]+
input[baris-2,j+per2])/2;
input[baris,j+per2]:=input[baris-1,j+per2];
end;
end;

for j:=1 to L do
for i:=3 to baris-2 do
output[i-2,j]:=(input[i-2,j]+2*input[i-1,j]+3*input[i,j]+ 2*input[i+1,j]+input[i+2,j])/9;

if init=0 then
for j:=1 to per2 do
begin
output[1,j]:=0;
output[Round(n/L),per2+j]:=0;
end;
end;

procedure MA5x5(input : Savetab; Var output : Savetab);
var
k,h,Baris : byte;
Dum : array [1..20,1..12] of real;
begin
Baris := Round(n/L);
for k:=1 to L do
begin
Dum[4,k]:=(input[1,k]+input[2,k]+input[3,k])/3;
Dum[5+Baris,k]:=(input[BAris,k]+
input[BAris-1,k]+input[Baris-2,k])/3;
end;

for h:=1 to 3 do
for k:=1 to L do
begin
Dum[h,k]:=Dum[4,k];
Dum[5+BAris+h,k]:=Dum[5+Baris,k];
end;

for h:=1 to BAris do
for k:=1 to L do Dum[4+h,k]:=input[h,k];

for k:=1 to L do
for h:=1 to BAris do
Output[h,k]:=(Dum[h,k]+2*Dum[h+1,k]+3*Dum[h+2,k]+
4*Dum[h+3,k]+5*Dum[h+4,k]+
4*Dum[h+5,k]+3*Dum[h+6,k]+2*Dum[h+7,k]+Dum[h+8,k])/25;
end;

Procedure Musim(Rasio,RMA3x3 : Savetab; var FMusim : savetab);
Var
i,j : byte;
Dummy,HAsil : Savetab;
SD,sum : real;
Begin
for j:=1 to L do
begin
SD:=0;
for i:=1 to Round(n/L) do
if not(Rasio[i,j]=0) then
SD:=SD+sqr(Rasio[i,j]-RMA3x3[i,j]);
if (Rasio[1,2]=0) then
SD:=sqrt(SD/(Round(n/L)-1)) else SD:=sqrt(SD/Round(n/L));
for i:=1 to Round(n/L) do
begin
if not(Rasio[i,j]=0) then
if ((Rasio[i,j]<(RMA3x3[i,j]- 2*SD))or(Rasio[i,j]>(RMA3x3[i,j]+2*SD))) then
begin
if ((Rasio[i-1,j]=0)or(Rasio[i+1,j]=0)) then
begin
if Rasio[i-1,j]=0 then
Hasil[i,j]:=(Rasio[i+1,j]+Rasio[i+2,j])/2
else Hasil[i,j]:=(Rasio[i-1,j]+Rasio[i-2,j])/2
end else
HAsil[i,j]:=(Rasio[i-1,j]+Rasio[i+1,j])/2;
end else
Hasil[i,j]:=Rasio[i,j];
end;
end;

{Mengganti nilai yang hilang}
if (Rasio[1,1]=0) then
for j:=1 to Round(L/2) do
begin
Hasil[1,j]:=HAsil[2,j];
Hasil[Round(n/L),j+per2]:=Hasil[Round(n/L)-1,j+per2];
end;

{Penyesuaian 1200}
for i:=1 to Round(n/L) do
begin
sd:=0;
for j:=1 to L do
sd:=sd+Hasil[i,j];
for j:=1 to L do
FMusim[i,j]:=Hasil[i,j]*L*100/sd;
end;

End;


{Tubuh Program Utama}
var
Rasio,TCI,Spencer : savedat;
DS : array [1..n+14] of real;
Trasio,Dummy,HasilMA,Fmusim : savetab;
i,j,k,h,pil : byte;
Awal, akhir : real;
simpan : text;
label 10;

begin
clrscr;
RasioAwal(Rasio);
for h:=1 to 2 do
begin
Transpose(RAsio,TRasio);
DummyTab(TRasio,Dummy);
MA3x3(Dummy,HasilMA);
Musim(TRasio,HasilMA,FMusim);

{Menggunakan MA 3x3 untuk menghilangkan Random}
DummyTab(FMusim,Dummy);
MA3x3(Dummy,FMusim);

{Menggunakan MA 5x5 untuk menghilangkan Random}
{ MA5x5(FMusim,HAsilMA);
for i:=1 to round(n/L) do
for j:=1 to L do
FMusim[i,j]:=HasilMA[i,j];
}

k:=0;i:=1;
for i:=1 to round(n/L) do
begin
for j:=1 to L do
TCI[j+k]:=Data[j+k]/FMusim[i,j]*100;
k:=k+L;
end;

Awal:=0;Akhir:=0;
If L=4 then
Begin
For I:=1 to 2 do
Begin
Awal:=awal+TCI[I];
Akhir:=akhir+TCI[n-2+I];
End;

For I:=1 to 3 do
Begin
DS[I]:=awal/2;
DS[n+3+I]:=akhir/2;
End;

For I:=4 to n+3 do DS[I]:=TCI[I-3];
For I:=1 to n do
Begin
Spencer[I]:=0.06*DS[I]+0.133*DS[I+1]+0.2*DS[I+2]+0.2*
DS[I+3]+0.2*DS[I+4]+0.133*DS[I+5]+0.067*DS[I+6];
Rasio[I]:=data[I]/spencer[I];
End;
end else
begin
for i:=1 to 4 do
begin
Awal:=Awal+TCI[i];
Akhir:=Akhir+TCI[n-4+i];
end;
for i:=1 to 7 do
begin
DS[i]:=Awal/4;
DS[n+7+i]:=Akhir/4;
end;

for i:=8 to n+7 do
DS[i]:=TCI[i-7];
for i:=1 to n do
begin
spencer[i]:= (-0.009*DS[i]-0.019*DS[i+1]-0.016*DS[i+2]+
0.009*DS[i+3]+0.066*DS[i+4]+0.144*DS[i+5]+
0.209*DS[i+6]+0.231*DS[i+7]+0.209*DS[i+8]+
0.144*DS[i+9]+0.066*DS[i+10]+0.009*DS[i+11]-
0.016*DS[i+12]-0.019*DS[i+13]-0.009*DS[i+14]);
RAsio[i]:=data[i]/spencer[i];
end;
end;
end;

{Simpan hasil dalam file text, perlu disipakan dulu folder C:\simpanan\}
assign(simpan,'C:\simpanan\'+NAmaFile);
rewrite(simpan);
writeln;
writeln('Versi data : [1] Lengkap or [2] untuk dimuluskan');
readln(pil);
if not(pil=2) then
writeln(simpan,'bln St TCI TC');
k:=0;
for i:=1 to round(n/L) do
begin
for j:=1 to L do
if pil=2 then
writeln(simpan,data[j+k]:20,(FMusim[i,j]/100):20, TCI[j+k]:20)
else
writeln(simpan,j:5,(FMusim[i,j]/100):15:3,
TCI[j+k]:15:3,Spencer[j+k]:15:3);
k:=k+L;
end;

close(simpan);
writeln('Silahkan lihat hasilnya pada file : '+NamaFile);
readln;
end.



1 komentar:

rahman said...

mas punya algoritma pascal yang dekomposisi klasik gk? thx sblmnya ;)

Post a Comment

Tanggapan, pesan atau pertanyaan hendaknya disertai dengan identitas (minimal mengisi NAMA dgn men-select bagian Comment as dengan "Name/URL"). Terima kasih

(c) DickyRahardi.Com™, 2006