Cara melakukan regresi linier sederhana dengan python (langkah demi langkah)
Regresi linier sederhana adalah teknik yang dapat kita gunakan untuk memahami hubungan antara satu variabel penjelas dan satu variabel respon .
Teknik ini menemukan garis yang paling “sesuai” dengan data dan mengambil bentuk berikut:
ŷ = b 0 + b 1 x
Emas:
- ŷ : Perkiraan nilai respons
- b 0 : Asal garis regresi
- b 1 : Kemiringan garis regresi
Persamaan ini dapat membantu kita memahami hubungan antara variabel penjelas dan variabel respons dan (dengan asumsi variabel tersebut signifikan secara statistik) persamaan ini dapat digunakan untuk memprediksi nilai variabel respons dengan mempertimbangkan nilai variabel penjelas.
Tutorial ini memberikan penjelasan langkah demi langkah tentang cara melakukan regresi linier sederhana dengan Python.
Langkah 1: Muat data
Untuk contoh ini, kita akan membuat dataset palsu yang berisi dua variabel berikut untuk 15 siswa:
- Jumlah total jam belajar untuk ujian tertentu
- Hasil ujian
Kami akan mencoba menyesuaikan model regresi linier sederhana dengan menggunakan jam sebagai variabel penjelas dan hasil pemeriksaan sebagai variabel respon.
Kode berikut menunjukkan cara membuat kumpulan data palsu ini dengan Python:
import pandas as pd #create dataset df = pd. DataFrame ({' hours ': [1, 2, 4, 5, 5, 6, 6, 7, 8, 10, 11, 11, 12, 12, 14], ' score ': [64, 66, 76, 73, 74, 81, 83, 82, 80, 88, 84, 82, 91, 93, 89]}) #view first six rows of dataset df[0:6] hours score 0 1 64 1 2 66 2 4 76 3 5 73 4 5 74 5 6 81
Langkah 2: Visualisasikan datanya
Sebelum memasang model regresi linier sederhana, kita harus memvisualisasikan data terlebih dahulu untuk memahaminya.
Pertama, kami ingin memastikan bahwa hubungan antara jam kerja dan skor kira-kira linier, karena ini merupakan asumsi yang mendasari regresi linier sederhana.
Kita dapat membuat diagram sebar sederhana untuk memvisualisasikan hubungan antara dua variabel:
import matplotlib.pyplot as plt plt. scatter (df.hours, df.score) plt. title (' Hours studied vs. Exam Score ') plt. xlabel (' Hours ') plt. ylabel (' Score ') plt. show ()
Dari grafik terlihat bahwa hubungannya tampak linier. Seiring bertambahnya jumlah jam , skor juga cenderung meningkat secara linier.
Kemudian kita dapat membuat diagram kotak untuk memvisualisasikan distribusi hasil ujian dan memeriksa outlier . Secara default, Python mendefinisikan observasi sebagai outlier jika observasi tersebut 1,5 kali rentang interkuartil di atas kuartil ketiga (Q3) atau 1,5 kali rentang interkuartil di bawah kuartil pertama (Q1).
Jika observasinya outlier, lingkaran kecil akan muncul di plot kotak:
df. boxplot (column=[' score '])
Tidak ada lingkaran kecil di boxplot, artinya tidak ada outlier di dataset kita.
Langkah 3: Lakukan Regresi Linier Sederhana
Setelah kita memastikan bahwa hubungan antar variabel adalah linier dan tidak ada outlier, kita dapat melanjutkan untuk menyesuaikan model regresi linier sederhana dengan menggunakan jam sebagai variabel penjelas dan skor sebagai variabel respons:
Catatan: Kami akan menggunakan fungsi OLS() dari perpustakaan statsmodels agar sesuai dengan model regresi.
import statsmodels.api as sm #define response variable y = df[' score '] #define explanatory variable x = df[[' hours ']] #add constant to predictor variables x = sm. add_constant (x) #fit linear regression model model = sm. OLS (y,x). fit () #view model summary print ( model.summary ()) OLS Regression Results ==================================================== ============================ Dept. Variable: R-squared score: 0.831 Model: OLS Adj. R-squared: 0.818 Method: Least Squares F-statistic: 63.91 Date: Mon, 26 Oct 2020 Prob (F-statistic): 2.25e-06 Time: 15:51:45 Log-Likelihood: -39,594 No. Observations: 15 AIC: 83.19 Df Residuals: 13 BIC: 84.60 Model: 1 Covariance Type: non-robust ==================================================== ============================ coef std err t P>|t| [0.025 0.975] -------------------------------------------------- ---------------------------- const 65.3340 2.106 31.023 0.000 60.784 69.884 hours 1.9824 0.248 7.995 0.000 1.447 2.518 ==================================================== ============================ Omnibus: 4,351 Durbin-Watson: 1,677 Prob(Omnibus): 0.114 Jarque-Bera (JB): 1.329 Skew: 0.092 Prob(JB): 0.515 Kurtosis: 1.554 Cond. No. 19.2 ==================================================== ============================
Dari ringkasan model, kita dapat melihat bahwa persamaan regresi yang dipasang adalah:
Skor = 65.334 + 1.9824*(jam)
Artinya, setiap tambahan jam belajar dikaitkan dengan peningkatan rata-rata nilai ujian sebesar 1,9824 poin. Dan nilai awal sebesar 65.334 memberi tahu kita rata-rata nilai ujian yang diharapkan untuk seorang siswa yang belajar selama nol jam.
Kita juga dapat menggunakan persamaan ini untuk mencari nilai ujian yang diharapkan berdasarkan jumlah jam belajar seorang siswa. Misalnya, seorang siswa yang belajar selama 10 jam harus mencapai nilai ujian 85.158 :
Skor = 65.334 + 1.9824*(10) = 85.158
Berikut cara menafsirkan ringkasan model lainnya:
- P>|t| : Ini adalah nilai p yang terkait dengan koefisien model. Karena nilai p untuk jam (0,000) secara signifikan kurang dari 0,05, kita dapat mengatakan bahwa terdapat hubungan yang signifikan secara statistik antara jam dan skor .
- R-squared: Angka ini menunjukkan bahwa persentase variasi nilai ujian dapat dijelaskan oleh jumlah jam belajar. Secara umum, semakin besar nilai R-squared suatu model regresi, maka variabel penjelas tersebut semakin mampu memprediksi nilai variabel respon. Dalam hal ini, 83,1% variasi skor dijelaskan oleh jam belajar.
- F-statistik dan nilai p: F-statistik ( 63,91 ) dan nilai p yang sesuai ( 2,25e-06 ) memberi tahu kita signifikansi model regresi secara keseluruhan, yaitu apakah variabel penjelas dalam model berguna dalam menjelaskan variasi . dalam variabel respons. Karena nilai p dalam contoh ini kurang dari 0,05, model kami signifikan secara statistik dan jam dianggap berguna dalam menjelaskan variasi skor .
Langkah 4: Buat Plot Sisa
Setelah model regresi linier sederhana disesuaikan dengan data, langkah terakhir adalah membuat plot sisa.
Salah satu asumsi utama regresi linier adalah bahwa residu model regresi mendekati terdistribusi normal dan bersifat homoskedastik pada setiap tingkat variabel penjelas. Jika asumsi-asumsi ini tidak terpenuhi, hasil model regresi kami bisa menyesatkan atau tidak dapat diandalkan.
Untuk memverifikasi bahwa asumsi ini terpenuhi, kita dapat membuat plot sisa berikut:
Plot residu versus nilai yang dipasang: Plot ini berguna untuk mengkonfirmasi homoskedastisitas. Sumbu x menampilkan nilai yang dipasang dan sumbu y menampilkan residu. Selama residu tampak terdistribusi secara acak dan seragam di seluruh grafik di sekitar nilai nol, kita dapat berasumsi bahwa homoskedastisitas tidak dilanggar:
#define figure size fig = plt. figure (figsize=(12.8)) #produce residual plots fig = sm.graphics. plot_regress_exog (model, ' hours ', fig=fig)
Empat plot diproduksi. Yang di pojok kanan atas adalah plot sisa versus plot yang disesuaikan. Sumbu x pada plot ini menunjukkan nilai sebenarnya dari titik variabel prediktor dan sumbu y menunjukkan sisa nilai tersebut.
Karena residu tampak tersebar secara acak di sekitar nol, hal ini menunjukkan bahwa heteroskedastisitas tidak menjadi masalah pada variabel penjelas.
Plot QQ: Plot ini berguna untuk menentukan apakah residu mengikuti distribusi normal. Jika nilai data pada plot mengikuti garis kira-kira lurus dengan sudut 45 derajat, maka data tersebut berdistribusi normal:
#define residuals res = model. reside #create QQ plot fig = sm. qqplot (res, fit= True , line=" 45 ") plt.show()
Residunya sedikit menyimpang dari garis 45 derajat, namun tidak cukup menimbulkan kekhawatiran serius. Kita dapat berasumsi bahwa asumsi normalitas terpenuhi.
Karena residu berdistribusi normal dan homoskedastik, kami memverifikasi bahwa asumsi model regresi linier sederhana terpenuhi. Dengan demikian, keluaran model kami dapat diandalkan.
Kode Python lengkap yang digunakan dalam tutorial ini dapat ditemukan di sini .