Analisis Diskriminan adalah salah satu perhitungan dalam statistika yang digunakan untuk pengambilan keputusan variabel baru berdasarkan data-data yang sudah terkelompokan sebelumnya. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Analisis Diskriminan memiliki hubungan kedekatan dengan Regresi Linier, sehingga memiliki tujuan yang sama, yaitu mencoba untuk memprediksikan hasil berdasarkan pengelompokan data yang sudah ada.
Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Diterima |
Pelanggan B | 52 | Perempuan | 4.71 | Diterima |
Pelanggan C | 60 | Perempuan | 6.56 | Ditolak |
Pelanggan D | 56 | Laki-laki | 6.8 | Ditolak |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Diterima |
Pelanggan H | 58 | Perempuan | 5.71 | Diterima |
Contoh data awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Jika kondisi Diterima, maka inputan data kolom adalah 1
Jika kondisi Ditolak, maka inputan data kolom adalah 0
Dim data(9)() As Double data(0) = New Double() {44, -1, 3.55, 1} data(1) = New Double() {52, +1, 4.71, 1} data(2) = New Double() {60, +1, 6.56, 0} data(3) = New Double() {56, -1, 6.8 , 0} data(4) = New Double() {51, -1, 6.94, 0} data(5) = New Double() {46, +1, 6.52, 0} data(6) = New Double() {48, -1, 4.25, 1} data(7) = New Double() {58, +1, 5.71, 1}
Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
Contoh data baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1
data(8) = New Double() {47, +1, 6.05, -1} data(9) = New Double() {52, -1, 5, -1}
Langkah-langkah penggunaan algoritma ini adalah
* Lakukan perhitungan pencarian matriks diskriminan w
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 1 – 6)
Dim w()() As Double = HitungDiskriminan(contohData, True)
1. Hitung rata-rata untuk masing-masing data dengan pengelompokan hasil yang telah diketahui
Dalam kasus ini, akan dihitung nilai rata-rata sebanyak 2 kali untuk hasil data Ditolak (0) dan Diterima (1)
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 1a – 1c)
Dim mean0()() As Double = HitungMean(data, 0) Dim mean1()() As Double = HitungMean(data, 1)
Memasuki perhitungan pada fungsi HitungMean
1a. Buat matriks baru berdimensi [jumlah kolom, 1]
Dim hasil(jumlahKolom - 1)() As Double For i As Integer = 0 To jumlahKolom - 1 hasil(i) = New Double(0) {} Next i
1b. Jumlahkan semua data pada masing-masing kolom untuk nilai hasil yang sesuai dengan parameter nilai kolom hasil
dan hitung banyak data yang dihitung
For i As Integer = 0 To data.Length - 1 Dim label As Integer = CInt(Fix(data(i)(jumlahKolom))) ''Ditolak (0) / Diterima (1) If label = nilaiKolomHasil Then For j As Integer = 0 To jumlahKolom - 1 hasil(j)(0) += data(i)(j) Next j jumlahData = jumlahData + 1 End If Next i
1c. Rata-rata masing-masing kolom adalah jumlah data kolom tersebut dibagi dengan banyaknya
For i As Integer = 0 To jumlahKolom - 1 hasil(i)(0) /= jumlahData Next i
2. Hitung matriks JS, yaitu jumlah dari masing-masing matriks scatter yang akan dihitung
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 2a – 2b)
Dim JS()() As Double = HitungPenjumlahanScatter(data) 'Jumlah dari S0 dan S1
2a. Lakukan perhitungan matriks scatter pada masing-masing kolom untuk nilai hasil data Ditolak (0) dan Diterima (1)
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 2a1 – 2a3)
Dim S0()() As Double = HitungScatter(data, 0) Dim S1()() As Double = HitungScatter(data, 1)
Memasuki perhitungan pada fungsi HitungScatter
2a1. Hitung rata-rata pada masing-masing kolom untuk nilai hasil yang sesuai dengan parameter nilai kolom hasil
Penjelasan Fungsi HitungMean sudah dijelaskan pada perhitungan diatas
Dim mean()() As Double = HitungMean(data, nilaiKolomHasil)
2a2. Buat matriks baru berdimensi [jumlah kolom, jumlah kolom]
Dim hasil(jumlahKolom - 1)() As Double For i As Integer = 0 To jumlahKolom - 1 hasil(i) = New Double(jumlahKolom - 1) {} Next i
* Hitung matriks scatter dengan rumus = E(X(X – mean)’)
2a3. Lakukan perhitungan pada semua data (poin 2a3a – 2a3e)
2a3a. Hitung matriks X, yaitu penjumlahkan semua data pada masing-masing kolom untuk nilai hasil yang sesuai dengan parameter nilai kolom hasil
Dim XTotal(jumlahKolom - 1)() As Double For j As Integer = 0 To jumlahKolom - 1 XTotal(j) = New Double(0) {data(i)(j)} Next j
2a3b. Hitung (X – mean), yang menghasilkan matriks dengan dimensi [jumlah kolom, 1]
Dim selisih()() As Double = hitungPenguranganMatriks(XTotal, mean)
* Gunakan fungsi ini untuk menghitung pengurangan matriks
Private Function hitungPenguranganMatriks(ByVal matriksA()() As Double, ByVal matriksB()() As Double) As Double()() If (matriksA.Length <> matriksB.Length) Or (matriksA(0).Length <> matriksB(0).Length) Then Throw New Exception("Pada fungsi hitungPenguranganMatriks, Ukuran matriks A dan B tidak sama") End If Dim ajumlahBaris As Integer = matriksA.Length Dim ajumlahKolom As Integer = matriksA(0).Length Dim hasil(ajumlahBaris - 1)() As Double For i As Integer = 0 To ajumlahBaris - 1 hasil(i) = New Double(ajumlahKolom - 1) {} Next i For i As Integer = 0 To ajumlahBaris - 1 For j As Integer = 0 To ajumlahKolom - 1 hasil(i)(j) = matriksA(i)(j) - matriksB(i)(j) Next j Next i Return hasil End Function
2a3c. Hitung (X – mean)’, yang menghasilkan matriks dengan dimensi [1, jumlah kolom]
Dim TransposSelisih()() As Double = HitungTransposMatriks(selisih)
* Gunakan fungsi ini untuk menghitung transpos matriks
Private Function HitungTransposMatriks(ByVal matriks()() As Double) As Double()() Dim rows As Integer = matriks.Length Dim cols As Integer = matriks(0).Length Dim hasil(cols - 1)() As Double For i = 0 To cols - 1 hasil(i) = New Double(rows - 1) {} Next i For i = 0 To rows - 1 For j = 0 To cols - 1 hasil(j)(i) = matriks(i)(j) Next j Next i Return hasil End Function
2a3d. Hitung X(X – mean)’, yang menghasilkan matriks dengan dimensi [jumlah kolom, jumlah kolom]
Dim SelisihTransposSelisih()() As Double = hitungPerkalianMatriks(selisih, TransposSelisih)
* Gunakan fungsi ini untuk menghitung perkalian matriks
Private Function hitungPerkalianMatriks(ByVal matriksA()() As Double, ByVal matriksB()() As Double) As Double()() Dim ajumlahBaris As Integer = matriksA.Length Dim ajumlahKolom As Integer = matriksA(0).Length Dim bjumlahBaris As Integer = matriksB.Length Dim bjumlahKolom As Integer = matriksB(0).Length If ajumlahKolom <> bjumlahBaris Then Throw New Exception("Pada fungsi hitungPerkalianMatriks, Ukuran Matriks A dan B tidak sama") End If Dim hasil(ajumlahBaris - 1)() As Double For i As Integer = 0 To ajumlahBaris - 1 hasil(i) = New Double(bjumlahKolom - 1) {} Next i For i As Integer = 0 To ajumlahBaris - 1 For j As Integer = 0 To bjumlahKolom - 1 For k As Integer = 0 To ajumlahKolom - 1 hasil(i)(j) += matriksA(i)(k) * matriksB(k)(j) Next k Next j Next i Return hasil End Function
2a3e. Hitung E(X(X – mean)’)
hasil = hitungPenjumlahanMatriks(hasil, SelisihTransposSelisih)
* Gunakan fungsi ini untuk menghitung penjumlahan matriks
Private Function hitungPenjumlahanMatriks(ByVal matriksA()() As Double, ByVal matriksB()() As Double) As Double()() If (matriksA.Length <> matriksB.Length) Or (matriksA(0).Length <> matriksB(0).Length) Then Throw New Exception("Pada fungsi hitungPenjumlahanMatriks, Ukuran matriks A dan B tidak sama") End If Dim ajumlahBaris As Integer = matriksA.Length Dim ajumlahKolom As Integer = matriksA(0).Length Dim hasil(ajumlahBaris - 1)() As Double For i As Integer = 0 To ajumlahBaris - 1 hasil(i) = New Double(ajumlahKolom - 1) {} Next i For i As Integer = 0 To ajumlahBaris - 1 For j As Integer = 0 To ajumlahKolom - 1 hasil(i)(j) = matriksA(i)(j) + matriksB(i)(j) Next j Next i Return hasil End Function
3. Hitung Invers(JS)
Dim InverseJS()() As Double = HitungInversMatriks(JS)
* Gunakan fungsi ini untuk menghitung invers matriks
Private Function HitungInversMatriks(ByVal matriks()() As Double) As Double()() Dim n As Integer = matriks.Length 'Salin Matriks Dim hasil(n - 1)() As Double For i = 0 To n - 1 hasil(i) = New Double(matriks(0).Length - 1) {} For j = 0 To matriks(0).Length - 1 hasil(i)(j) = matriks(i)(j) Next j Next i Dim permutasi() As Integer Dim matriksLU()() As Double = DekomposisiMatriks(matriks, permutasi) If matriksLU Is Nothing Then Throw New Exception("Pada fungsi HitungInversMatriks, tidak dapat menghitung invers matriks") End If Dim b(n - 1) As Double For i = 0 To n - 1 For j = 0 To n - 1 If i = permutasi(j) Then b(j) = 1.0 Else b(j) = 0.0 End If Next j Dim x() As Double = hitungPersamaanAxB(matriksLU, b) For j = 0 To n - 1 hasil(j)(i) = x(j) Next j Next i Return hasil End Function
* Gunakan fungsi ini untuk menghitung dekomposisi matriks
Metode yang digunakan untuk mendekomposisi matriks adalah metode Dolittle
Private Function DekomposisiMatriks(ByVal matriks()() As Double, ByRef permutasi() As Integer) As Double()() If matriks.Length <> matriks(0).Length Then Throw New Exception("Pada fungsi dekomposisiMatriks, ukuran baris dan kolom Matriks harus sama.") End If Dim n As Integer = matriks.Length 'Salin Matriks Dim hasil(n - 1)() As Double For i = 0 To n - 1 hasil(i) = New Double(matriks(0).Length - 1) {} For j = 0 To matriks(0).Length - 1 hasil(i)(j) = matriks(i)(j) Next j Next i permutasi = New Integer(n - 1) {} For i = 0 To n - 1 permutasi(i) = i Next i Dim aij As Double For j = 0 To n - 2 Dim nilaiMaksimalBaris As Double = Math.Abs(hasil(j)(j)) ' nilai terbesar pada baris tersebut 'Cari pivot Dim barisPivot As Integer = j For i = j + 1 To n - 1 aij = Math.Abs(hasil(i)(j)) If aij > nilaiMaksimalBaris Then nilaiMaksimalBaris = aij barisPivot = i End If Next i ' Jika nilai terbesar tidak berada di pivot, tukar baris tersebut dengan baris sekarang ' dan tukar baris yang sama pada matriks permutasi If barisPivot <> j Then Dim rowPtr() As Double = hasil(barisPivot) hasil(barisPivot) = hasil(j) hasil(j) = rowPtr Dim tmp As Integer = permutasi(barisPivot) permutasi(barisPivot) = permutasi(j) permutasi(j) = tmp End If 'Jika setelah penukaran baris, ternyata nilai diagonal ada yang 0, 'maka lakukan pencarian baris data yang diagonalnya tidak 0 antara baris ini sampai baris terakhir 'kemudian tukar baris tersebut dan baris sekarang 'dan tukar baris yang sama pada matriks permutasi If hasil(j)(j) = 0.0 Then Dim barisBaru As Integer = -1 For baris As Integer = j + 1 To n - 1 If hasil(baris)(j) <> 0.0 Then barisBaru = baris End If Next baris If barisBaru = -1 Then Throw New Exception("Pada fungsi hitungDekomposisiMatriks, tidak dapat menggunakan metode Doolittle") End If Dim rowPtr() As Double = hasil(barisBaru) hasil(barisBaru) = hasil(j) hasil(j) = rowPtr Dim tmp As Integer = permutasi(barisBaru) permutasi(barisBaru) = permutasi(j) permutasi(j) = tmp End If 'Lakukan dekomposisi matriks untuk mendapatkan matriks LU For i As Integer = j + 1 To n - 1 hasil(i)(j) /= hasil(j)(j) For k As Integer = j + 1 To n - 1 hasil(i)(k) -= hasil(i)(j) * hasil(j)(k) Next k Next i Next j Return hasil End Function
4. Hitung Selisih dari matriks rata-rata yang sudah dihitung sebelumnya
Dalam kasus ini selisih akan dihitung dari rata-rata hasil data Ditolak (0) dan Diterima (1)
Penjelasan tentang fungsi hitungPenguranganMatriks sudah dijelaskan pada perhitungan diatas
Dim selisih()() As Double = hitungPenguranganMatriks(mean0, mean1)
5. Hitung matriks w = Invers(JS)(mean0 – mean1)
Penjelasan tentang fungsi hitungPerkalianMatriks sudah dijelaskan pada perhitungan diatas
Dim w()() As Double = hitungPerkalianMatriks(InverseJS, selisih)
6. Jika nilai parameter normalisasi bernilai True,
maka lakukan normalisasi pada matriks w agar panjang garis dari titik 0 ke matriks w bernilai 1
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 6a – 6c)
If isNormalisasi = True Then Return HitungNormalisasi(w) Else Return w End If
Memasuki perhitungan pada fungsi HitungNormalisasi
6a. Buat matriks baru berdimensi [jumlah kolom, 1]
Dim hasil(jumlahBaris - 1)() As Double For i As Integer = 0 To jumlahBaris - 1 hasil(i) = New Double(0) {} Next i
6b. Hitung akar dari (jumlah dari (perkalian matriks pada masing-masing data))
Dim total As Double = 0.0 For i As Integer = 0 To jumlahBaris - 1 total += matriks(i)(0) * matriks(i)(0) Next i total = Math.Sqrt(total)
6c. Hitung nilai akhir dengan cara nilai data dibagi dengan totalnya
For i As Integer = 0 To jumlahBaris - 1 hasil(i)(0) = matriks(i)(0) / total Next i
* Setelah memperoleh matriks diskriminan w, Hitung nilai jawaban untuk masing-masing data baru
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 7 – 14)
Dim c As Integer = HitungPrediksi(contohData, dataBaru(i), w)
Memasuki perhitungan pada fungsi HitungPrediksi
7. Buat matriks baru berdimensi [jumlah baris, 1]
Beri nilai awal matriks tersebut dengan masing-masing data pada parameter data baru
Dim x(jumlahBaris - 1)() As Double For i As Integer = 0 To jumlahBaris - 1 x(i) = New Double(0) {dataBaru(i)} Next i
8. Hitung w’, yang menghasilkan matriks dengan dimensi [1, jumlah baris]
‘Penjelasan tentang fungsi HitungTransposMatriks sudah dijelaskan pada perhitungan diatas
Dim wTranspos()() As Double = HitungTransposMatriks(w)
9. Hitung rata-rata untuk masing-masing data dengan pengelompokan hasil yang telah diketahui
Dalam kasus ini, akan dihitung nilai rata-rata sebanyak 2 kali untuk hasil data Ditolak (0) dan Diterima (1)
Penjelasan tentang fungsi HitungMean sudah dijelaskan pada perhitungan diatas
Hasil perhitungan akan menghasilkan matriks dengan dimensi [jumlah baris, 1]
Dim m0()() As Double = HitungMean(data, 0) Dim m1()() As Double = HitungMean(data, 1)
10. Hitung Jumlah dari matriks rata-rata yang sudah dihitung sebelumnya
Dalam kasus ini jumlah akan dihitung dari rata-rata hasil data Ditolak (0) dan Diterima (1)
Penjelasan tentang fungsi hitungPenjumlahanMatriks sudah dijelaskan pada perhitungan diatas
Hasil perhitungan akan menghasilkan matriks dengan dimensi [jumlah baris, 1]
Dim m()() As Double = hitungPenjumlahanMatriks(m0, m1)
11. Hitung penjumlahan matriks diatas (matriks m) setelah dibagi dengan 2
Hasil perhitungan akan menghasilkan matriks dengan dimensi [jumlah baris, 1]
m = hitungPerkalianSkalarMatriks(m, 0.5)
* Gunakan fungsi ini untuk menghitung perkalian skalar matriks
Semua nilai dalam matriks tersebut akan dikalikan dengan sebuah angka skalar x
Private Function hitungPerkalianSkalarMatriks(ByVal matriks()() As Double, ByVal x As Double) As Double()() Dim n As Integer = matriks.Length Dim hasil(n - 1)() As Double For i = 0 To n - 1 hasil(i) = New Double(matriks(0).Length - 1) {} For j = 0 To matriks(0).Length - 1 hasil(i)(j) = matriks(i)(j) * x Next j Next i Return hasil End Function
12. Hitung w’m, yang menghasilkan matriks dengan dimensi [1, jumlah baris][jumlah baris, 1] = [1, 1]
Penjelasan tentang fungsi hitungPerkalianMatriks sudah dijelaskan pada perhitungan diatas
Dim wTransposM()() As Double = hitungPerkalianMatriks(wTranspos, m)
13. Hitung w’x, yang menghasilkan matriks dengan dimensi [1, jumlah baris][jumlah baris, 1] = [1, 1]
Penjelasan tentang fungsi hitungPerkalianMatriks sudah dijelaskan pada perhitungan diatas
Dim wTransposX()() As Double = hitungPerkalianMatriks(wTranspos, x)
14. Hitung nilai prediksi untuk data tersebut
Apabila w’x > w’m, maka nilai prediksi adalah 0, selain itu nilai prediksi akan bernilai 1
Dim prediksi As Integer = -1 If wTransposX(0)(0) - adjust > wTransposM(0)(0) Then prediksi = 0 Else prediksi = 1 End If
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
[sdm_download id=”1589″ fancy=”0″]
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
Leave a Reply