USER MANUAL INCREMENTAL UPDATING PADA APLIKASI FUZZY TEMPORAL ASSOCIATION RULE UNTUK DATA TRANSAKSI
TRI ENDAH WIJAYANTI G64104067
DEPARTEMEN ILMU KOMPUTER FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM INSTITUT PERTANIAN BOGOR 2008
User Manual Incremental Updating pada Aplikasi Fuzy Temporal Association Rule Mining Tahap 1 : Pembersihan Data Pada tahap ini, transaksi yang mengandung 1 jenis barang saja dihapuskan. Kemudian, barang yang sama namun berulang lebih dari 1 record secara berurutan dijadikan 1 record saja. Proses pembersihan masih manual, dalam arti dilihat satu persatu lalu dihapuskan. Proses ini juga dilakukan lebih dari 1 kali agar data benar-benar bersih. Tahap 2 : Transformasi Data Tanggal yang semula berformat date ditransformasikan ke dalam bentuk numerik (datenum). Prosesnya dan perintah dalam Matlab, adalah sebagai berikut, Perintah : DateNumber = datenum(DateString) DateString diisi dengan tanggal, yaitu tahun, bulan, hari Contoh : DateString untuk tanggal 1 Maret 2004, yaitu 2004,03,01 DateNumber = datenum (2004,03,01) DateNumber = 732007 ID dari barang yang semula berupa 1 digit ditransformasikan menjadi 2 digit. Hal ini disebabkan oleh proses perhitungan yang menggunakan matriks pada Matlab, sehingga ukuran dari ID harus sama. Contoh : ID 1 sampai 9 diubah menjadi 10, 20, 30, ..., 90 ID 10 sampai 18 diubah menjadi 11, 12, 13, ..., 19 ID 19 diubah menjadi 21 ID 20 sampai 27 diubah menjadi 22, 23, 24, ..., 29 ID 28, 29 diubah menjadi 31, 32 ID 30 sampai 35 diubah menjadi 33, 34,..., 38 Proses transformasi masih menggunakan cara khusus, yaitu menggunakan fungsi find and replace pada excel. Tahap 3 : Seleksi Data Pada tahap ini, data transaksi tanggal 1 Maret – 21 Mei 2004 dibagi menjadi 11 minggu. Setiap minggu terdiri dari 7 hari. Kemudian, setiap minggu dibuat mejadi 50, 100, dan 150 transaksi. Prosesnya adalah sebagai berikut : 1. Pembagian peluang setiap tanggal Caranya : Fungsi getpartisi.m : fungsi ini mencari banyaknya transaksi pembelian yang terjadi setiap minggu. Code : function partisi=getpartisi(z) data = z; d=data; [k l] = size (d); b=1; j=1; x=1; s=[ ]; bn=[ ]; s=0.4; for i=1:k if (i==k) b=b+0; else p=num2str(d(i,j)); p1=num2str(d((i+1),j)); p2=num2str(d(i,(j+1))); p3=num2str(d((i+1),(j+1))); if (strcmp(p,p1)==1) if (strcmp(p2,p3)==1) b=b+0;
1
else b=b+1; end else b=0; if (strcmp(p2,p3)==1) b=b+0; else b=b+1; end end end bn=[bn;b]; end [f g]=size(bn); p=[ ]; for i=1:f if (i==f) part=bn(i,1); p=[p;part]; elseif (bn(i,1)<=bn((i+1),1)) part = 0; elseif (bn(i,1)>bn((i+1),1)) part = bn(i,1); p=[p;part]; end end partisi=p; d=xlsread(minggupertama.xls'); %membaca file m=getpartisi(d) % jalankan fungsi getpartisi pel = 0; %inisialisasi for i=1:a peluang=(m(i,1)/count)*50 (atau) *100 (atau) *150; % menghitung peluang yang terjadi, bisa 50, 100, dan 150 transaksi pel=[pel;peluang]; %manghimpun peluang end 2. Setelah semua peluang dari masing-masing minggu diperoleh, tahap selanjutnya adalah memilih transaksi berdasarkan TID secara acak menggunakan kalkulator sesuai dengan peluang dari masing-masing tanggal. Simpan hasilnya dalam folder dengan nama yang berbeda untuk tiap minggu dan jenis transaksinya. Tahap 4 : Data Mining Tahap ini merupakan proses data mining untuk incremental updating pada aplikasi Fuzzy Temporal Association Rule yang telah dikerjakan pada penelitian sebelumnya oleh Handayani Retno Suminar pada tahun 2007. Hasil yang telah diperoleh dari enelitian sebelumnya akan digunakan pada proses incremental updating. %nama program yang dijalankan adalah FTAR_IU function varargout = FTAR_IU_OutputFcn(hObject, eventdata, handles) %menginisialisasikan variabel menjadi variabel global agar dapat dipakai di fungsi yang lain global data global minggu global hari global bulan global c1
2
global c2 global f1 global support global con global kc2 global Mn global part1 global data2 global data3 global matriksc2 global matriks_x global matriks_w global hasil_CK global cLK global LK global kc1 %fungsi untuk membaca file yang ditambahkan dalam bentuk .xls function tmbh_file_Callback(hObject, eventdata, handles) filenya = guidata(gcbo); [filename2, pathname2] = uigetfile({'*xls';'*.*'},'Pilih data2 '); if isequal(filename2,0) return; else Fileku = fullfile(pathname2,filename2); set(handles.file2,'String',Fileku); eval (['data=xlsread(''' filename2 ''');']); set (filenya.figure1,'Userdata',data); % data transaksi yang dibaca disimpan dengan variable data end %fungsi untuk menampilkan file yang dipilih function file2_Callback(hObject, eventdata, handles) %fungsi untuk menyimpan support threshold yang dimasukkan oleh pengguna function support_Callback(hObject, eventdata, handles) global support global con s1=str2num(get(handles.support,'String')); support=s1/100; guidata(hObject,handles); %fungsi untuk menyimpan confidence threshold yang dimasukkan oleh pengguna function confidence_Callback(hObject, eventdata, handles) global s global con conf=str2num(get(handles.confidence,'String')); con=conf/100; handles.con=con; guidata(hObject,handles); %fungsi yeng memproses fuzzy calendar yang pertama function fc1_Callback(hObject, eventdata, handles) %mendefinisikan variable yang dapat dipakai oleh fungsi lain global data global dt2 global c1 global c2 global f1 global support global con
3
global part1 global kc2 k1=get(handles.fc1,'Value'); fileku = guidata(gcbo); data=get(fileku.figure1,'Userdata'); data1=data; switch k1 %pilihan fuzzy calendar case 1 kal1='Awal Minggu'; case 2 kal1='Tengah Minggu'; case 3 kal1='Akhir Minggu'; case 4 kal1='Awal Bulan'; case 5 kal1='Tengah Bulan'; case 6 kal1='Akhir Bulan'; case 7 kal1='Awal Tahun'; case 8 kal1='Tengah Tahun'; case 9 kal1='Akhir Tahun'; end d=[ ]; %fungsi weekday fungsi yang mengambil jenis hari dalam 1 minggu, %misalnya 1 untuk Senin, 2 untuk Selasa, dst. %fungsi day fungsi yang mengambil tanggal dalam bulan, yaitu %tanggal 1 sampai 30 atau 31. %fungsi month fungsi yang mengambil jenis bulan dalam 1 tahun, %misalnya 1 untuk Januari sampai 12 untuk Desember. if (strcmp(kal1,'Awal Minggu')==1) [k l]=size(data1); for baris_data=1:k a=weekday(data(baris_data,1)); y=beginningdotw(a,0,0,2,4); %fungsi yang mengambil derajat keanggotaan untuk awal minggu hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Tengah Minggu')==1) [k l]=size(data1); for baris_data=1:k a=weekday(data(baris_data,1)); % fungsi yang mengambil derajat keanggotaan untuk tengah minggu y=middledotw(a,2,4,6); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Akhir Minggu')==1) [k l]=size(data1); for baris_data=1:k a=weekday(data(baris_data,1));
4
% fungsi yang mengambil derajat keanggotaan untuk akhir minggu y=enddotw(a,4,6,7,7); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Awal Bulan')==1) [k l]=size(data1); for baris_data=1:k b=day(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk awal bulan y=beginningdotm(b,0,0,5,15); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Tengah Bulan')==1) [k l]=size(data1); for baris_data=1:k b=day(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk tengah bulan y=middledotm(b,10,15,16,21); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Akhir Bulan')==1) [k l]=size(data1); for baris_data=1:k b=day(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk akhir bulan y=enddotm(b,15,26,31,31); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Awal Tahun')==1) [k l]=size(data1); for baris_data=1:k c=month(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk awal tahun y=beginningmoty(c,0,0,3,6); hasil=y; d=[d;hasil]; end c1=d; elseif (strcmp(kal1,'Tengah Tahun')==1) [k l]=size(data1); for baris_data=1:k c=month(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk tengah tahun y=middlemoty(c,3,6,7,10); hasil=y; d=[d;hasil]; end
5
c1=d; elseif (strcmp(kal1,'Akhir Tahun')==1) [k l]=size(data1); for baris_data=1:k c=month(data(baris_data,1)); %fungsi yang mengambil derajat keanggotaan untuk akhir tahun y=endmoty(c,7,10,12,12); hasil=y; d=[d;hasil]; end c1=d; end handles.c1=c1; guidata(hObject,handles); %fungsi yang sama juga berlaku pada fuzzy calendar yang kedua, %hanya saja variabel kal1 diubah menjadi kal2, d diubah menjadi d1, %y diubah menjadi x, dan c1 diubah menjadi c2. %fungsi untuk melakukan operasi pada fuzzy calendar function operator_Callback(hObject, eventdata, handles) %mendefinisikan variabel menjadi variabel global sehingga dapat %dipakai oleh fungsi lain. global c1 global c2 global f1 global support global con %definisi variabel op=get(handles.operator,'Value'); switch op %pilihan operator fuzzy calendar case 1 ope='FC1'; case 2 ope='FC2'; case 3 ope='AND'; case 4 ope='OR'; case 5 ope='XOR'; case 6 ope='FC1 - FC2'; case 7 ope='FC2 - FC1'; case 8 ope='NOT FC1'; case 9 ope='NOT FC2'; end guidata(hObject,handles); %operasi kondisional yang menghitung bobot dari masing-masing partisi if (strcmp(ope,'FC1')==1) f1=c1;%bobot elseif (strcmp(ope,'FC2')==1) f1=c2;%bobot elseif (strcmp(ope,'AND')==1) f1=c1.*c2;%bobot elseif (strcmp(ope,'OR')==1)
6
f1=(c1+c2)-(c1.*c2);%bobot elseif (strcmp(ope,'XOR')==1) f1=(c1.*((1-c2).*(1-c2)))+(c2.*((1-c1).*(1-c1)))+(c1.*c2.*(1-c1.*c2));%bobot elseif (strcmp(ope,'FC1 - FC2')==1) f1=c1-(c1.*c2);%bobot elseif (strcmp(ope,'FC2 - FC1')==1) f1=c2-(c2.*c1);%bobot elseif (strcmp(ope,'NOT FC1')==1) f1=1-c1;%bobot elseif (strcmp(ope,'NOT FC2')==1) f1=1-c2;%bobot end guidata(hObject,handles); %fungsi untuk mencari frequent itemset baru dengan adanya penambahan data function cr_lk_baru_Callback(hObject, eventdata, handles) %mendefinisikan variable yang dapat dipakai oleh fungsi lain global data global f1 global support global part1 global mn_unik global Mn global matriksc2 global LK global cLK global matriksX_baru global matriksc2_gabung global LK3_baru global cLK3_baru global LK2_baru global cLK2_baru global t3 %fungsi untuk menghitung waktu eksekusi time3=clock; set(handles.lk,'String',''); %fungsi untuk menandakan masih dalam eksekusi tm3= waitbar(0,'Loading...'); for i=1:1000 waitbar(i/1000) end %mengambil jumlah transaksi di masing-masing partisi d=data; part=getpartisi(d [part3 part4]=size(part);%part1 diambil [g h]=size(d); q=1; j=1; mn=[]; %menghitung weighted count threshold dimasing-masing partisi for i=1:g if (i==1) m=support.*part(j,1).*f1(i,1); elseif (i==g) m=support.*part(j,1).*f1(i,1); else p0=num2str(d(i-1,1));
7
p=num2str(d(i,1)); p1=num2str(d((i+1),1)); if (strcmp(p,p1)==1 && strcmp(p0,p1)==1) m=support.*part(j,1).*f1(i,1); elseif (strcmp(p,p1)~=1 && strcmp(p0,p1)==1) m=support.*part(j,1).*f1(i,1); j=j+1; elseif (strcmp(p,p1)==1 && strcmp(p0,p1)~=1) j=j+1; m=support.*part(j,1).*f1(i,1); end end mn=[mn;m]; end %mendapatkan data tanggal date=[]; for i=1:g tgl1=d(i,1); date=[date;tgl1]; end %mendapatkan data bobot w_data=[]; for i=1:g w_dt=f1(i,1); w_data=[w_data;w_dt]; end mn_unik2=unik(mn,date); [brs klm]=size(mn_unik2); %menghitung cumulative weighted count threshold Mn2=[]; for i=1:brs for j=1:brs if (i==j) M(i,j)=mn_unik2(i,klm); elseif (i>j) M(i,j)=0; elseif (i<j) M(i,j)=M(i,j-1)+mn_unik2(j,klm); end end end Mn2=M; d=data; [k l] = size (d); b=1; t=2; j=1; x(1,1)=d(1,3); %menyusun items yang ada pada tiap transaksi menjadi bentuk matriks sesuai dengan TID-nya for i=2:k if (i==k) x(t,b)=d(i,3); else p=num2str(d(i-1,j)); p1=num2str(d(i,j)); p2=num2str(d(i-1,(j+1)));
8
p3=num2str(d(i,(j+1))); p4=num2str(d(i+1,(j+1))); if (strcmp (p2,p3)==1)&&(strcmp(p3,p4)==1) x(t,b)=d(i,3); t=t+1; elseif (strcmp(p2,p3)==1)&&(strcmp(p3,p4)~=1) x(t,b)=d(i,3); t=2; elseif (strcmp(p2,p3)~=1)&&(strcmp(p3,p4)==1) b=b+1; x(t-1,b)=d(i,3); end end end matriks_x2=x; [v w]=size(x); TID2=[ ]; com2=[ ]; IDtrans2=[ ]; %ngambil TID supaya unik for i=1:k T=d(i,2); TID2=[TID2;T]; end TIDunik2=unique(TID2); %membuat kombinasi 2 items (com) %menyusun ID transaksi secera berurutan (IDtrans) for j=1:w for i=1:v if (i==v) kom2=[ ]; com2=[com2;kom2]; else for p=i:v if (p==v) kom2=[ ]; com2=[com2;kom2]; elseif (x(i,j)==0 && x(p+1,j)==0) kom2=[ ]; com2=[com2;kom2]; elseif (x(i,j)~=0 && x(p+1,j)~=0) s=num2str(x(i,j)); s1=num2str(x(p+1,j)); kom2=strcat(s,s1); com2=[com2;kom2]; trans2=TIDunik2(j,1); IDtrans2=[IDtrans2;trans2]; end end end end end m1=mn_unik2; bbt=unik(w_data,date); %bobot yang diperoleh dibuat unik tgl_u=unique(date); %tanggal yang diperoleh dibuat unik t=getpartisi(d); [a b]=size(t);
9