Regresi Linear

Galih Setiawan Nurohim
6 min readMay 18, 2024

--

Linear regression atau regresi linear adalah salah satu metode statistika paling dasar yang digunakan dalam machine learning dan data analysis. Metode ini digunakan untuk memodelkan hubungan antara dua variabel, yaitu variabel independen (predictor) dan variabel dependen (response).

Dalam konteks regresi linear sederhana, kita mencoba menemukan garis lurus yang paling sesuai dengan data kita. Garis ini dapat digunakan untuk memprediksi nilai dari variabel dependen berdasarkan nilai dari variabel independen.

Konsep Dasar Matematika

Regresi linear sederhana dapat dijelaskan dengan persamaan garis lurus berikut:

y=mx+b

Di mana:

  • 𝑦 adalah variabel dependen (yang ingin kita prediksi).
  • 𝑥 adalah variabel independen (predictor).
  • m adalah koefisien kemiringan (slope) dari garis regresi.
  • b adalah intercept, titik di mana garis memotong sumbu y.

Koefisien kemiringan (slope) menunjukkan seberapa banyak y berubah untuk setiap perubahan unit dalam x. Intercept menunjukkan nilai y ketika x adalah 0.

Implementasi dengan Python

Mari kita lihat bagaimana kita dapat mengimplementasikan regresi linear menggunakan Python. Kita akan menggunakan pustaka numpy untuk manipulasi array dan sklearn untuk membuat model regresi linear. Berikut adalah kode lengkapnya:

import numpy as np
from sklearn.linear_model import LinearRegression

# Dataset (diskon dalam persen dan penjualan setelah diskon)
diskon = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90]).reshape(-1, 1)
penjualan = np.array([90, 80, 70, 60, 50, 40, 30, 20, 10])

# Membuat model Linear Regression
model = LinearRegression()
model.fit(diskon, penjualan)

# Mencetak koefisien kemiringan (slope) dan intercept
print("Koefisien kemiringan (slope):", model.coef_[0])
print("Intercept:", model.intercept_)

# Prediksi jumlah penjualan untuk diskon 75%
diskon_prediksi = np.array([75]).reshape(-1, 1)
penjualan_prediksi = model.predict(diskon_prediksi)

print("Prediksi jumlah penjualan untuk diskon 75%:", penjualan_prediksi[0])

Penghitungan lewat Spreadsheet

Anggap kita punya data diskon dan penjualan seperti data

+------------+-----------+
| Diskon (%) | Penjualan |
+------------+-----------+
| 10 | 90 |
| 20 | 80 |
| 30 | 70 |
| 40 | 60 |
| 50 | 50 |
| 60 | 40 |
| 70 | 30 |
| 80 | 20 |
| 90 | 10 |
+------------+-----------+

Proses Perhitungan

  1. Rata -rata Diskon () =50
  2. Rata-rata Penjualan (Ȳ) =50
  3. Deviasi Diskon = ( X — X̄)= X-50
  4. Deviasi Penjualan= ( Y— Ȳ)= Y- 50
+------------+-----------+----------------+---------------------+
| Diskon (%) | Penjualan | Deviasi Diskon | Deviasi Penjualan |
+------------+-----------+----------------+---------------------+
| 10 | 90 | -40 | 40 |
| 20 | 80 | -30 | 30 |
| 30 | 70 | -20 | 20 |
| 40 | 60 | -10 | 10 |
| 50 | 50 | 0 | 0 |
| 60 | 40 | 10 | -10 |
| 70 | 30 | 20 | -20 |
| 80 | 20 | 30 | -30 |
| 90 | 10 | 40 | -40 |
+------------+-----------+----------------+---------------------+
| Rata-rata X | 50 | | |
| Rata-rata Y | 50 | | |
+------------+-----------+----------------+---------------------+

Proses penghitungan Slope

  1. Deviasi Produk ((𝑋− X̄)(𝑌−Ȳ)(X− X̄)(Y​−Ȳ))
  2. Deviasi Kuadrat ((𝑋−X̄) *(X​−X̄)^2):
  3. Slope (𝑚) = Deviasi Produk / Deviasi Kuadrat (-6000/6000) = -1
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| Diskon (%) | Penjualan | Deviasi Diskon | Deviasi Penjualan | Produk Deviasi | Kuadrat Deviasi Diskon |
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| 10 | 90 | -40 | 40 | -1600 | 1600 |
| 20 | 80 | -30 | 30 | -900 | 900 |
| 30 | 70 | -20 | 20 | -400 | 400 |
| 40 | 60 | -10 | 10 | -100 | 100 |
| 50 | 50 | 0 | 0 | 0 | 0 |
| 60 | 40 | 10 | -10 | -100 | 100 |
| 70 | 30 | 20 | -20 | -400 | 400 |
| 80 | 20 | 30 | -30 | -900 | 900 |
| 90 | 10 | 40 | -40 | -1600 | 1600 |
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| Jumlah | | -6000 | 6000
+-----------------------------------------+---------------------+----------------+--------------------------+
| Rata-rata X | 50 | | | | |
| Rata-rata Y | 50 | | | | |
+-------------+----------+----------------+---------------------+----------------+--------------------------+

Slope uda ketemu lanjut nyari Intercept

Proses penghitungan Intercept

rata-rata 𝑋 dan Y serta kemiringan (m) untuk menghitung intercept (𝑏): b=Ȳ−m

b=50−(−1*50) =100

Intercept =100, Slope = -1

Jika ingin melakukan prediksi berarti tinggal Penjualan berapa ketika diskon (?)

Prediksi Penjualan = Slope*(diskon) +intercept

Gradient Descent

Gradient descent adalah metode yang digunakan untuk menemukan nilai terbaik dari parameter model secara efektif dan efisien. Mari kita bahas apa yang dimaksud dengan “efektif” dan “efisien” dalam konteks ini. Juga perlu diingat Gradient Descent bukanlah proses Evaluasi Model, melainkan algoritma Optimasi yang digunakan untuk melatih model.

Efektif: Meminimalkan Kesalahan

  • Tujuan Utama: Gradient descent bertujuan untuk menemukan parameter model (misalnya, bobot dalam regresi linier) yang meminimalkan fungsi kesalahan (loss function).
  • Fungsi Kesalahan: Ini adalah ukuran seberapa baik model memprediksi output yang diinginkan. Fungsi kesalahan umum adalah Mean Squared Error (MSE) untuk regresi linier.
  • Proses: Dengan menghitung gradien (turunan) dari fungsi kesalahan terhadap parameter model, gradient descent menunjukkan arah yang tepat untuk mengurangi kesalahan. Setiap langkah dalam proses gradient descent mengarah pada pengurangan kesalahan prediksi model.

Efisien: Mencapai Nilai Minimum dengan Cepat

  • Langkah Bertahap: Gradient descent memperbarui parameter model dalam langkah-langkah kecil berdasarkan gradien yang dihitung. Langkah-langkah ini diatur oleh learning rate, yang menentukan seberapa besar setiap pembaruan.
  • Iterasi Berulang: Proses ini diulang berkali-kali (iterasi) hingga fungsi kesalahan mencapai nilai minimum atau sangat dekat dengan nilai minimum.
  • Kecepatan Konvergensi: Learning rate yang tepat dan inisialisasi yang baik membantu mencapai nilai minimum lebih cepat, menjadikan proses ini efisien dalam penggunaan waktu dan sumber daya komputasi.

Contoh Kasus

Kita bayangkan kita mau menemukan jalur terpendek turun dari puncak gunung ke lembah. Gradient descent membantu kita menemukan jalur tersebut dengan mengikuti arah paling curam menurun di setiap langkah.

import numpy as np
import matplotlib.pyplot as plt

# Dataset (diskon dalam persen dan penjualan setelah diskon)
diskon = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
penjualan = np.array([90, 80, 70, 60, 50, 40, 30, 20, 10])

# Inisialisasi parameter
w = 0.0 # slope
b = 0.0 # intercept
learning_rate = 0.0001
num_iterations = 1000

# Menyimpan sejarah untuk visualisasi
w_history = []
b_history = []
cost_history = []

# Gradient Descent
m = len(diskon)

for i in range(num_iterations):
# Forward Propagation: Hitung prediksi
penjualan_prediksi = w * diskon + b

# Perhitungan Kesalahan: Hitung error
error = penjualan_prediksi - penjualan

# Fungsi biaya (MSE)
cost = (1/m) * np.sum(error ** 2)

# Backward Propagation: Hitung gradien
dw = (2/m) * np.dot(error, diskon)
db = (2/m) * np.sum(error)

# Pembaruan Parameter
w -= learning_rate * dw
b -= learning_rate * db

# Simpan sejarah
w_history.append(w)
b_history.append(b)
cost_history.append(cost)

# Cetak biaya untuk memonitor kemajuan
if i % 100 == 0:
print(f"Iteration {i}: Cost {cost}, w {w}, b {b}")

# Setelah gradient descent
print("Koefisien kemiringan (slope):", w)
print("Intercept:", b)

# Prediksi jumlah penjualan untuk diskon 75%
diskon_prediksi = np.array([75])
penjualan_prediksi = w * diskon_prediksi + b

print("Prediksi jumlah penjualan untuk diskon 75%:", penjualan_prediksi[0])

# Visualisasi

# Plot Data Asli dan Garis Regresi
plt.figure(figsize=(14, 6))

plt.subplot(1, 2, 1)
plt.scatter(diskon, penjualan, color='blue', label='Data Asli')
plt.plot(diskon, w * diskon + b, color='red', label='Garis Regresi')
plt.xlabel('Diskon (%)')
plt.ylabel('Penjualan')
plt.title('Data Asli dan Garis Regresi')
plt.legend()

# Plot Fungsi Biaya terhadap Jumlah Iterasi
plt.subplot(1, 2, 2)
plt.plot(range(num_iterations), cost_history, color='purple')
plt.xlabel('Jumlah Iterasi')
plt.ylabel('Biaya (MSE)')
plt.title('Fungsi Biaya vs. Jumlah Iterasi')

plt.tight_layout()
plt.show()

# Visualisasi Kontur (Opsional)
W, B = np.meshgrid(np.linspace(min(w_history), max(w_history), 100),
np.linspace(min(b_history), max(b_history), 100))
Z = np.array([np.mean((w * diskon + b - penjualan)**2) for w, b in zip(np.ravel(W), np.ravel(B))])
Z = Z.reshape(W.shape)

plt.figure(figsize=(7, 6))
plt.contour(W, B, Z, levels=np.logspace(-1, 3, 20), cmap='viridis')
plt.plot(w_history, b_history, 'r.-', label='Jalur Gradient Descent')
plt.xlabel('w (Slope)')
plt.ylabel('b (Intercept)')
plt.title('Kontur Fungsi Biaya')
plt.legend()
plt.show()

Inisialisasi Parameter

  • w (slope) dan b (intercept) diinisialisasi dengan nilai 0.
  • learning_rate diatur ke 0.0001.
  • num_iterations diatur ke 1000.
# Inisialisasi parameter
w = 0.0 # slope
b = 0.0 # intercept
learning_rate = 0.0001
num_iterations = 1000

Forward Propagation

Pada setiap iterasi, kita menghitung nilai prediksi Y menggunakan parameter saat ini w dan b: Y​=wX+b

# Forward Propagation: Hitung prediksi
penjualan_prediksi = w * diskon + b

Perhitungan Kesalahan

Kesalahan dihitung sebagai perbedaan antara nilai aktual Y dan nilai prediksi Y​ :

e = Y (aktual) − Y (Prediksi)​

Fungsi biaya (Mean Squared Error, MSE) digunakan untuk mengukur seberapa baik model saat ini:

# Perhitungan Kesalahan: Hitung error
error = penjualan_prediksi - penjualan

# Fungsi biaya (MSE)
cost = (1/m) * np.sum(error ** 2)

Backward Propagation

Gradien dari cost function terhadap parameter w dan b dihitung. Gradien menunjukkan arah dan besarnya perubahan yang diperlukan untuk mengurangi kesalahan.

# Backward Propagation: Hitung gradien
dw = (2/m) * np.dot(error, diskon)
db = (2/m) * np.sum(error)

Pembaruan Parameter

Parameter diperbarui dalam arah negatif dari gradien untuk mengurangi fungsi biaya.

# Pembaruan Parameter
w -= learning_rate * dw
b -= learning_rate * db

Iterasi

Proses di atas diulang untuk sejumlah iterasi yang telah ditentukan

--

--

Galih Setiawan Nurohim
Galih Setiawan Nurohim

No responses yet