Prediksi Biaya Asuransi dengan Multiple Linear Regression

Photo by Vlad Deep on Unsplash

Prediksi Biaya Asuransi dengan Multiple Linear Regression

Pendahuluan

Sebelumnya kita telah belajar untuk melakukan prediksi menggunakan Linear Regression dengan satu variabel. Namun pada kenyataannya seringkali kita tidak bisa bergantung pada satu variabel independen saja. Oleh karena itu, kali ini kita akan mempelajari penggunaan Multiple Linear Regression. Multiple Linear Regression merupakan metode statistika yang digunakan untuk memprediksi nilai dari sebuah variabel dependen berdasarkan nilai dari beberapa variabel independen. Jika sebelumnya pada Linear Regression sederhana, kita hanya memiliki satu variabel independen, maka dalam multiple linear regression, kita bisa memiliki dua atau lebih variabel independen. Model multiple linear regression memiliki bentuk umum sebagai berikut:

\(Y = a + b_1X_1 + b_2X_2 + ... + b_nX_n\)

Dimana:

  • \(Y\) adalah variabel dependen (target)

  • \(X_1, X_2, ..., X_n\) adalah variabel independen (features)

  • \(a\) adalah intercept

  • \(b_1, b_2, ..., b_n\) adalah koefisien regresi yang menunjukkan pengaruh masing-masing variabel independen terhadap variabel dependen

Dalam artikel ini, kita akan menggunakan Multiple Linear Regression untuk memprediksi biaya asuransi medis berdasarkan data yang tersedia.

Mengumpulkan Data

Pertama-tama, kita perlu mengumpulkan dan memuat data yang akan digunakan untuk analisis. Data yang digunakan dalam contoh ini berasal dari dataset biaya asuransi medis yang tersedia di Kaggle.

import pandas as pd

# Load the data
data = pd.read_csv('/kaggle/input/medical-insurance-cost-prediction/medical_insurance.csv')

# Check for missing values
data.isnull().sum()

# Display first few rows
data.head()

Di sini, kita memuat data dari file CSV dan memeriksa apakah terdapat nilai yang kosong. Kemudian, kita menampilkan beberapa baris pertama dari dataset untuk mendapatkan gambaran awal.

Exploratory Data Analysis

Sebelum melanjutkan ke pemodelan, kita perlu melakukan exploratory data analysis untuk memahami distribusi data dan hubungan antara variabel.

import matplotlib.pyplot as plt
import seaborn as sns
# Pair plot to see relationships
sns.pairplot(data)
plt.show()

# Correlation matrix
plt.figure(figsize=(10, 8))
sns.heatmap(data[['age','bmi','children','charges']].corr(), annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Correlation Matrix')
plt.show()

Dalam langkah ini, kita membuat pair plot untuk melihat hubungan antar variabel, dan membuat matriks korelasi untuk mengidentifikasi seberapa kuat hubungan antara variabel-variabel tersebut.

One-Hot Encoding

Jika kita lihat lagi, tidak semua kolom pada data kita berupa data numerik. Terdapat juga kolom yang memiliki data kategorikal seperti sex yang isinya antara male atau female. Karena model machine learning tidak dapat menangani variabel kategoris secara langsung, kita perlu mengubahnya menjadi data numerik terlebih dahulu. Metode yang kita gunakan adalah one hot encoding. Dalam one hot encoding, setiap kategori unik dalam variabel kategoris diubah menjadi kolom biner (0 dan 1). Misalnya, jika kita memiliki variabel kategoris "warna" dengan nilai {Merah, Hijau, Biru}, maka one hot encoding akan mengonversi variabel ini menjadi tiga kolom terpisah: "warna_Merah", "warna_Hijau", dan "warna_Biru". Setiap kolom akan berisi 1 jika baris tersebut memiliki kategori yang sesuai dan 0 jika tidak. Contoh: jika kita memiliki data:

| Warna |
|-------|
| Merah |
| Hijau |
| Biru  |
| Merah |

Setelah one hot encoding, data akan menjadi:

| warna_Merah | warna_Hijau | warna_Biru |
|-------------|-------------|-------------|
|      1      |      0      |      0      |
|      0      |      1      |      0      |
|      0      |      0      |      1      |
|      1      |      0      |      0      |

Rumus umum untuk one hot encoding adalah: jika kita memiliki kategori \(C\)dengan \(n\)nilai unik, kita akan membuat \(n\) kolom biner baru. Setiap entri dalam kategori \(C\) akan diwakili oleh vektor biner dengan panjang \(n\), di mana hanya satu elemen yang bernilai 1 (menunjukkan kategori tersebut) dan sisanya bernilai 0. Hal ini membantu model machine learning memahami dan bekerja dengan data kategoris. Pada data yang kita gunakan, kolom yang akan diproses antara lain sex, region, dan smoker.

# Encode categorical variables
data = pd.get_dummies(data, dtype=int)

Pada kode di atas, kita menggunakan metode get_dummies dari pandas untuk melakukan one hot encoding. Hasilnya bisa dilihat bahwa data-data kategorik sudah berubah menjadi data numerik dengan nilai 0 dan 1.

Membagi Data Menjadi Train dan Test

Selanjutnya, kita perlu membagi data menjadi set pelatihan (train) dan set pengujian (test) untuk melatih dan menguji model kita.

from sklearn.model_selection import train_test_split

# Define features and target
X = data.drop('charges', axis=1)
y = data['charges']

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Di sini, kita mendefinisikan charges sebagai variabel target (y) dan variabel lainnya sebagai fitur (X). Kemudian, kita membagi data menjadi set pelatihan dan set pengujian dengan proporsi 80-20.

Melatih Model Regresi Linear

Setelah data siap, kita bisa melatih model regresi linear menggunakan data pelatihan.

from sklearn.linear_model import LinearRegression

# Initialize the model
model = LinearRegression()

# Train the model
model.fit(X_train, y_train)

Evaluasi Model

Setelah model dilatih, kita perlu mengevaluasi kinerjanya menggunakan data pengujian.

from sklearn.metrics import mean_absolute_error, r2_score

# Predict on the test set
y_pred = model.predict(X_test)

# Calculate metrics
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f'Mean Absolute Error: {mae}')
print(f'R^2 Score: {r2}')

Di sini, kita menggunakan data pengujian untuk memprediksi charges dan menghitung metrik evaluasi seperti Mean Absolute Error (MSE) dan R^2 Score untuk mengukur kinerja model.

Visualisasi Hasil

Mari kita visualisasikan hasil prediksi model kita dibandingkan dengan biaya sebenarnya.

plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue', label='Predicted Charges')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2, label='Perfect Prediction')
plt.xlabel('Actual Charges')
plt.ylabel('Predicted Charges')
plt.title('Actual vs Predicted Charges')
plt.legend()
plt.show()

Blok kode ini menghasilkan plot yang membandingkan biaya sebenarnya (y_test) dengan biaya yang diprediksi (y_pred). Dari visualisasi ini bisa diketahui bagaimana performa model yang kita buat dalam memprediksi biaya asuransi medis.

Koefisien dan Intercept Model

Untuk lebih memahami model, mari kita lihat koefisien dan intercept dari model regresi linear kita.

# Model coefficients
coef = model.coef_
intercept = model.intercept_

features = X.columns
coef_dict = dict(zip(features, coef))

print(f'Intercept: {intercept}')
print('Coefficients:')
for feature, coeff in coef_dict.items():
    print(f'{feature}: {coeff}')

Kode di atas berfungsi untuk mendapatkan hasil koefisien (slope) dan intercept dari model regresi linear yang dilatih. Dari sini kita bisa mengetahui pengaruh masing-masing variabel independen terhadap variabel dependen charges.

Penutup

Dalam artikel ini, kita telah mempelajari cara menggunakan multiple linear regressionuntuk memprediksi biaya asuransi medis berdasarkan berbagai faktor seperti usia, jenis kelamin, BMI, jumlah anak, status perokok, dan wilayah. Kita juga dapat melihat bagaimana model ini bekerja dan memahami pengaruh masing-masing variabel terhadap biaya asuransi. Jika kita lihat hasil yang didapatkan, prediksi yang dibuat memang miss pada sejumlah data, ini terjadi karena memang kebanyakan data tidak serta merta bisa diprediksi dengan membuat satu garis lurus. Untuk mengatasi hal ini, kita bisa menggunakan algoritma-algoritma lain yang lebih advance daripada Linear Regression. Terima kasih sudah membaca, selamat belajar dan semoga sukses.


Source Code: Link to Kaggle Notebook