Pengenalan Linear Regresi dan Implementasi Dengan Python
Apa itu Linear Regresi?
Linear regresi adalah sebuah metode dalam machine learning yang termasuk dalam supervised learning. Linear regresi adalah metode yang mencoba untuk memodelkan hubungan antar variabel dengan menyesuaikan persamaan linear. Satu variabel sebagai dependent variable atau target dan variabel yang lain sebagai independent variable (explanatory variable).
Tipe-Tipe Linear Regresi
Terdapat dua tipe dari linear regresi, yaitu:
- Simple Linear Regression
- Multiple Linear Regression
Simple Linear Regression
Sesuai dengan namanya “simple” atau sederhana dikarenakan hanya memiliki satu independent variable. Rumus untuk simple linear regression adalah sebagai beriku:
y=β0+β1X
X=independent variable,
y = dependent variable,
β0=y-intercept (suku tetap),
β1=koefisien untuk independent variable.
Contohnya semisal untuk memprediksi gaji (y)berdasarkan lama pengalaman(X) pada suatu bidang. Model matematisnya akan berbentuk sebagai berikut:
Gaji=β0+β1(Pengalaman)
Multiple Linear Regression
Jika Simple Linear Regression hanya memiliki satu independent variable maka untuk Multiple Linear Regression memiliki lebih dari satu independent variable. Rumus untuk multiple linear regression adalah sebagai berikut:
y=β0+β1x1+β2x2+…+βnxn
dimana, untuk i=n observations:yi=dependent variable
X=independent variable,
y = dependent variable,
β0=y-intercept (suku tetap),
β1=koefisien untuk independent variable.
Contohnya semisal memprediksi harga rumah (y) berdasarkan berapa lama berdirinya (X1), luas tanah (X2), jumlah kamar (X3), jumlah lantai (X4), dsb. Model matematisnya akan berbentuk:
Harga Rumah=β0 + β1(Lama Berdiri) + β2(Luas Tanah) + β3(Jumlah Kamar) + β4 (Jumlah Lantai)
Key Concepts Dari Linear Regresi:
Berikut adalah konsep-konsep yang penting untuk dapat memahami Linear Regresi:
- Korelasi: Menggambarkan hubungan antara dua variabel. Bisa bernilai -1 atau +1. Semakin mendekati nilai +1 maka semakin tinggi hubungan antar variabel.
- Variance: Mengukur ketersebaran data.
- Standar Deviasi: Mengukur penyebaran kumpulan data relatif terhadap rata-rata dan dihitung sebagai akar kuadrat dari variance
- Normal Distribution: Dikenal sebagai Gaussian Distribution, adalah distribusi probabilitas yang simetris terhadap mean, yang menunjukkan bahwa data di dekat mean lebih sering terjadi daripada data yang jauh dari mean. Dalam bentuk grafik, distribusi normal akan muncul sebagai kurva lonceng.
- Residual: Selisih antara nilai aktual dengan nilai prediksi yang dihasilkan oleh linear regresi.
Asumsi-Asumsi Dari Linear Regresi:
Dalam membangun model linear regresi terdapat beberapa asumsi guna membuat model yang efektif dan dapat berjalan dengan baik:
- Dependent variable bernilai kontinu.
- Terdapat sebuah hubungan linear antara dependent variable dan independent variable.
- Tidak terdapat Multicollinearity (tidak ada hubungan antara independent variable).
- Residual harus mengikuti normal distribution.
- Residual harus memiliki varian yang konstan: Homoscedasticity.
- Residual harus didistribusikan secara independen / tidak ada autokorelasi.
Implementation
Dalam implementasi ini akan menggunakan bahasa pemrograman Python. Untuk lebih lengkapnya bisa diakses pada github. Dataset yang digunakan terdapat di kaggle yang berisi data dari sebuah ecommerce fashion. Selain memiliki website dan aplikasi mobile, mereka juga memiliki toko fisik. Customer dapat mengunjungi toko fisik mereka dan melakukan sesi pertemuan untuk mendapatkan saran terkait gaya busana mereka.
Load Dataset
# Import Libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(style='darkgrid')
import warnings
warnings.filterwarnings("ignore")# Load Dataset
df = pd.read_csv("Ecommerce Customers")
df.head()
Dataset memiliki 8 kolom yakni:
- Email: Alamat email customer
- Address: Alamat rumah customer
- Avatar: Warna avatar pada profil customer
- Avg. Session Length: Rata-rata sesi pertemuan dalam saran terkait gaya di dalam toko (dalam menit)
- Time on App: Rata-rata waktu yang dihabisakan memakai aplikasi (dalam menit)
- Time on Website: Rata-rata waktu yang dihabiskan mengakses website (dalam menit)
- Length of Membership: Berapa tahun customer telah menjadi member
- Yearly Amount Spent: Total yang customer habiskan dalam satu tahun ($)
Dengan menggunakan data yang dimiliki ecommerce tersebut mencoba memfokuskan pengembangan mereka apakah lebih memprioritaskan website atau aplikasi mobile.
Exploratory Data Analyst
# Exploratory Data Analyst
sns.pairplot(df)
Dari visualisasi pairplot di atas dapat dilihat bahwa semua feature terdistribusi normal. Sepertinya featur Length of Membership
memiliki korelasi yang kuat dengan fitur Yearly Amount Spent
# Length of membership vs Yearly Amount Spent
sns.lmplot(x=’Length of Membership’, y=’Yearly Amount Spent’, data=df)
Dari bentuk grafiknya dapat dijelaskan bahwa semakin lama customer menjadi member maka semakin banyak pula uang yang customer habiskan untuk berbelanjan pada ecommerce tersebut. Bagaimana dengan Time on App
dan Time on Website
?
# time on app vs Yearly Amount Spent
sns.lmplot(x=’Time on App’, y=’Yearly Amount Spent’, data=df)
# time on website vs Yearly Amount Spent
sns.lmplot(x=’Time on Website’, y=’Yearly Amount Spent’, data=df
Untuk lebih jelasnya berapa nilai korelasinya akan digunakan Heatmap.
Heatmap Correlation
# korelasi dalam heatmap
sns.heatmap(df.corr().round(5), annot=True, cmap=’viridis’)
Dari grafik 2 plot di atas kita dapat berhipotesis jika fitur Time on App
lebih berpengaruh daripada Time on Web
. Berdasarkan grafik heatmap juga dapat dilihat jika fitur Time on App
memiliki korelasi positif sebesar 0.5 sedangkan Time on Web
memiliki korelasi negatif sebasar 0.0026.
Sebelum membangun model data dipecah terlebih dahulu menjadi dataset X dan Y. Dataset X berisi independent variable dan dataset Y berisi dependent variabel.
Splitting Data Training dan Testing
# Splitting Data
X = df.iloc[:, :-1]
y = df.iloc[:, -1]
Pada dataset X dapat dilakukan penghapusan terhadap fitur-fitur yang dianggap tidak berpengaruh seperti Email, Address, dan Avatar. Ketiga atribut dapat dihapus
# drop unused features
X.drop([‘Email’, ‘Address’, ‘Avatar’], axis=1, inplace=True)
Kemudian data dapat dipecah menjadi training data dan testing data. Training data digunakan untuk melatih model linear regresi dan testing data digunakan untuk mengetahui atau mengevaluasi model yang telah dibangun. Dalam pemecahan ini digunakan perbandingan 70:30, yakni 70% data sebagai training data dan 30% sebagai testing data.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
Membangun Model
Selanjutnya adalah membangun model Linear Regresi dengan menggunakan library scikit-learn yakni LinearRegression.
# modelling
from sklearn.linear_model import LinearRegression
linear_regression = LinearRegression()
Setelah model dipanggil selanjutnya melakukan training model dengan menggunakan training data.
Training Model
linear_regression.fit(X_train, y_train)
Testing Model
Kemudian melakukan prediksi terhadap testing data.
# Predict Testing Data
y_pred = linear_regression.predict(X_test)
Evaluation
Dari hasil prediksi tersebut dapat dilakukan evaluasi untuk melihat seberapa baik model dalam memprediksi. Evaluasi yang dilakukan adalah dengan melihat grafik model, MAE, MSE, RMSE, serta Residual.
# Evaluation Graph
plt.scatter(y_test, y_pred)
plt.title(“y_test vs y_pred”, fontsize=15)
plt.xlabel(“Y Test”)
plt.ylabel(“Y Prediction”)
plt.show()
# MAE, MSE, RMSE
from sklearn import metricsprint(f’MAE: {metrics.mean_absolute_error(y_test, y_pred)}’)
print(f’MSE: {metrics.mean_squared_error(y_test, y_pred)}’)
print(f’RMSE: {np.sqrt(metrics.mean_squared_error(y_test, y_pred))}’)
- MAE: Mean Absolute Error mewakili rata-rata selisih absolut antara nilai asli dan nilai prediksi. MAE mengukur rata-rata residual dalam dataset.
- MSE: Mean Squared Error mewakili rata-rata perbedaan kuadrat antara nilai asli dan nilai prediksi. MSE mengukur varians dari residu.
- RMSE: Root Mean Squared Error adalah akar kuadrat dari Mean Squared Error. RMSE mengukur deviasi standar dari residu.
MAE: 7.228148653430838
MSE: 79.81305165097461
RMSE: 8.933815066978642
Rata-rata selisih yang diperoleh antara nilai asli dan nilai prediksi model adalah $8.9. Model cukup baik dalam memprediksi nilai Yearly Amount Spent
dari customer.
# Residual
sns.distplot((y_test — y_pred), bins=30, kde=True)
Grafik dari residualnya berbentuk seperti lonceng menandakan bahwa telah mengikuti Normal Distribution.
Model telah berhasil dibuat dan memiliki performa yang cukup baik. Bagaimana dengan model matematikanya? Untuk mengetahui nilai koefisien dari tiap atribut dapat dilihat melalui fungsi coef_ untuk modelnya.
# Coefficient for each features
coefficient = pd.DataFrame(linear_regression.coef_.round(3), X.columns)
coefficient.columns= [“Coefficient”]
coefficient
Untuk nilai intercept dapat dilihat dengan fungsi intercept_
print(Intercept: ,linear_regression.intercept_)
Intercept: -1044.2574146365555
Sehingga model matematikanya adalah:
Yearly Amount Spent= -1047.932 + 25.596(Avg. Session Length) + 38.785(Time on App) + 0.31(Time on Website) + 61.897(Length of Membership)
Interpretasi Koefisien dari setiap fitur:
- Jika semua fitur lainnya tetap, peningkatan 1 unit di Avg. Session Length dikaitkan dengan peningkatan sebesar $25,596 total yang dikeluarkan.
- Jika semua fitur lainnya tetap, peningkatan 1 unit di Time on App dikaitkan dengan peningkatan sebesar $38.785 total yang dikeluarkan.
- Jika semua fitur lainnya tetap, peningkatan 1 unit di Time on Website dikaitkan dengan peningkatan sebesar $0.31 total yang dikeluarkan.
- Jika semua fitur lainnya tetap, peningkatan 1 unit di Length of Membership dikaitkan dengan peningkatan sebesar $61.897 total yang dikeluarkan.
Kesimpulan yang dapat diambil dari hasil analisis yang telah dilakukan adalah:
- Kembangkan website untuk mengejar ketinggalan kinerja aplikasi mobile,
- Kembangkan aplikasi mobile karena kinerjanya yang baik.