Analisis Diskriminan


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:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Diterima
Pelanggan B52Perempuan4.71Diterima
Pelanggan C60Perempuan6.56Ditolak
Pelanggan D56Laki-laki6.8Ditolak
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Diterima
Pelanggan H58Perempuan5.71Diterima

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 I47Perempuan6.05
Pelanggan J52Laki-Laki5

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)

cmd76

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *