Dalam statistika, regresi linier adalah sebuah pendekatan untuk memodelkan hubungan antara variabel terika Y dan satu atau lebih variabel beas yang disebut X. Salah satu kegunaan dari regresi linier adalah untuk melakukan prediksi berdasarkan data-data yang telah dimiliki sebelumnya Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Ada beberapa cara menyelesaikan permasalahan regresi linier, salah satunya adalah melalui teknik Dekomposisi QR. Teknik ini disebut juga faktorisasi QR, dan yang dilakukan adalah mendekomposisi sebuah matriks A menjadi 2 matriks Q dan R. Q adalah matriks ortogonal dan R adalah matriks segitiga atas. Matriks ortogonal adalah matriks yang matriks yang memenuhi persamaan Q’*Q = I, dimana I adalah matriks identitas, yaitu matriks yang berisi nilai 1 untuk diagonal matriks tersebut.
Diasumsikan ada 3 tipe motor yang sudah diketahui datanya, yaitu Motor A,B,C
Masing-masing tipe motor memiliki kriteria, yaitu harga, jarak tempuh per liter, cc, dan memiliki hasil jual dalam unit
Diasumsikan data dari 4 tipe motor tersebut adalah sebagai berikut:
| Motor | Harga | Jarak tempuh per liter | cc | Unit Terjual |
|---|---|---|---|---|
| Motor A | 10.000.000 | 35 | 110 | 20 |
| Motor B | 11.000.000 | 40 | 150 | 12 |
| Motor C | 14.000.000 | 37.5 | 125 | 17 |
Contoh data awal adalah sebagai berikut:
Dim dataSisiKiri As Double()() = {New Double() {10000000, 35, 110}, _
New Double() {11000000, 40, 150}, _
New Double() {14000000, 37.5, 125}}
Dim dataSisiKanan As Double()() = {New Double() {20}, _
New Double() {12}, _
New Double() {17}}
Selanjutnya ada 4 buah motor lagi, yaitu E,F,G,H, yang baru akan diluncurkan, sehingga tidak diketahui hasil jualnya
Maka tentukan data-data ini nantinya diperkirakan memiliki hasil jual berapa unit
Diasumsikan data awalnya adalah sebagai berikut:
| Motor | Harga | Jarak tempuh per liter | cc |
|---|---|---|---|
| Motor E | 13.000.000 | 45 | 125 |
| Motor F | 12.000.000 | 47 | 110 |
| Motor G | 10.500.000 | 43 | 110 |
| Motor H | 13.500.000 | 35 | 125 |
Contoh data baru adalah sebagai berikut:
Dim dataBaru As Double()() = {New Double() {13000000, 45, 125}, _
New Double() {12000000, 47, 110}, _
New Double() {10500000, 43, 110}, _
New Double() {13500000, 35, 125}}
Langkah-langkah penggunaan algoritma ini adalah
* Catat matriks persamaan sisi kiri pada layar
Dim A As New ObyekMatriks(dataSisiKiri)
* Catat matriks persamaan sisi kanan pada layar
Dim b As New ObyekMatriks(dataSisiKanan)
1. Lakukan proses dekomposisi matriks menggunakan metode dekomposisi QR
Dim QRD As QRDecomposition = New QRDecomposition(A)
* Skrip tersebut akan melakukan inisialisasi pada Class QRDecomposition. Class ini berisi tentang variabel dan fungsi-fungsi yang digunakan untuk melakukan dekomposisi. Deklarasi Class QRDecomposition adalah sebagai berikut:
Public Class QRDecomposition
Private QR As Double()()
Private ukuranBaris As Integer, ukuranKolom As Integer
Private Rdiag As Double()
'Proses dekomposisi QR, dihitung menggunakan Householder
Public Sub New(A As ObyekMatriks)
' Inisialisasi
QR = A.SalinArray
ukuranBaris = A.GetUkuranBaris
ukuranKolom = A.GetUkuranKolom
Rdiag = New Double(ukuranKolom - 1) {}
For k As Integer = 0 To ukuranKolom - 1
' Hitung jarak dari kolom k tanpa under/overflow
Dim nrm As Double = 0
For i As Integer = k To ukuranBaris - 1
nrm = Maths.Hypot(nrm, QR(i)(k))
Next
If nrm <> 0.0 Then
' Buat vektor Householder k
If QR(k)(k) < 0 Then
nrm = -nrm
End If
For i As Integer = k To ukuranBaris - 1
QR(i)(k) /= nrm
Next
QR(k)(k) += 1.0
' Lakukan transformasi pada sisa kolom
For j As Integer = k + 1 To ukuranKolom - 1
Dim s As Double = 0.0
For i As Integer = k To ukuranBaris - 1
s += QR(i)(k) * QR(i)(j)
Next
s = (-s) / QR(k)(k)
For i As Integer = k To ukuranBaris - 1
QR(i)(j) += s * QR(i)(k)
Next
Next
End If
Rdiag(k) = -nrm
Next
End Sub
. . .
End Class
2. Dapatkan matriks ortogonal (Q) dari proses dekomposisi tersebut
Dim Q As ObyekMatriks = QRD.Q
3. Dapatkan matriks segitiga atas (R) dari proses dekomposisi tersebut
Dim R As ObyekMatriks = QRD.R
4. Lakukan rekonstruksi matriks A dengan rumus:
A = Q * R
Dim hasil As ObyekMatriks = Q.PerkalianMatriks(R)
5. Hitung koefisien dari masing-masing kolom yang ada
Dim X As ObyekMatriks = QRD.HitungPenyelesaian(b)
* Lakukan proses penyelesaian persamaan linier A * X = B
Hasil pengembalian nilai fungsi adalah matriks X, sehingga X menghasilkan jarak paling minimal dari Q * R * X – B.
Public Overridable Function HitungPenyelesaian(B As ObyekMatriks) As ObyekMatriks
If B.GetUkuranBaris <> ukuranBaris Then
Throw New ArgumentException("Ukuran baris matriks harus sama.")
End If
If Not Me.FullRank Then
Throw New SystemException("Matriks harus full rank.")
End If
'Salin array B sebagai array hasil output persamaan
Dim nx As Integer = B.GetUkuranKolom
Dim X As Double()() = B.SalinArray
Console.WriteLine("Perlu diingat bahwa X harus memenuhi syarat Q * R * X = B")
Console.WriteLine("1. Lakukan perhitungan substitusi Q * Y = B untuk mendapatkan matriks Y")
' Hitung Y = Transpos(Q) * B
For k As Integer = 0 To ukuranKolom - 1
For j As Integer = 0 To nx - 1
Dim s As Double = 0.0
For i As Integer = k To ukuranBaris - 1
s += QR(i)(k) * X(i)(j)
Next
s = (-s) / QR(k)(k)
For i As Integer = k To ukuranBaris - 1
X(i)(j) += s * QR(i)(k)
Next
Next
Next
Console.WriteLine("2. Lakukan perhitungan substitusi R * X = Y untuk mendapatkan matriks X")
' Hitung R * X = Y;
For k As Integer = ukuranKolom - 1 To 0 Step -1
For j As Integer = 0 To nx - 1
X(k)(j) /= Rdiag(k)
Next
For i As Integer = 0 To k - 1
For j As Integer = 0 To nx - 1
X(i)(j) -= X(k)(j) * QR(i)(k)
Next
Next
Next
Console.WriteLine("")
Return (New ObyekMatriks(X, ukuranKolom, nx).GetMatriks(0, ukuranKolom - 1, 0, nx - 1))
End Function
6. Lakukan perhitungan dari masing-masing data awal menggunakan matriks koefisien X yang sudah ditemukan
Kemudian catat tingkat kecocokan perhitungan data dengan hasil awal pada data, untuk membandingkan apakah nilai X sudah cocok pada contoh data
Dim jumlahBenar As Integer = 0, jumlahSalah As Integer = 0
For i As Integer = 0 To dataSisiKiri.Length - 1
Console.Write("Motor " & Chr(i + 65) & " ")
Console.Write(dataSisiKiri(i)(0).ToString("N0").PadRight(11) & " ")
Console.Write(dataSisiKiri(i)(1).ToString.PadRight(23) & " ")
Console.Write(dataSisiKiri(i)(2).ToString.PadRight(4) & " ")
Dim y As Double = HitungUnitTerjual(dataSisiKiri(i), X.GetArray)
Console.Write(y.ToString("F0").PadRight(23))
If Math.Round(y) = dataSisiKanan(i)(0) Then
jumlahBenar += 1
Console.Write("Benar" & vbCrLf)
Else
jumlahSalah += 1
Console.Write("Salah" & vbCrLf)
End If
Next
Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah)
Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F4"))
* Gunakan fungsi ini untuk menghitung hasil persamaan linier untuk data yang baru
Public Function HitungUnitTerjual(ByVal data() As Double, X()() As Double) As Double Dim hasil As Double = 0 For i As Integer = 0 To data.Length - 1 hasil += data(i) * X(i)(0) Next Return hasil End Function
7. Untuk masing-masing data baru, hitung perkiraan hasil unit terjual menggunakan koefisien beta yang sudah ditentukan
For i As Integer = 0 To dataBaru.Length - 1
Console.Write("Motor " & Chr(i + 65 + 4) & " ")
Console.Write(dataBaru(i)(0).ToString("N0").PadRight(11) & " ")
Console.Write(dataBaru(i)(1).ToString.PadRight(23) & " ")
Console.Write(dataBaru(i)(2).ToString.PadRight(4) & " ")
Dim y As Double = HitungUnitTerjual(dataBaru(i), X.GetArray)
Console.Write(y.ToString("F0") & vbCrLf)
Next
Hasil akhir adalah: (klik untuk perbesar gambar)

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
[sdm_download id=”3132″ 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.