import pandas as pd
import numpy as np
import plotly.graph_objs as go
from sklearn.linear_model import LinearRegression
# Data tambang
data = {
'Jam_Operasi': [5, 7, 8, 6, 9, 4, 7, 10, 6, 8],
'Produksi_Ore': [50, 65, 70, 60, 80, 45, 68, 90, 62, 75]
}
df = pd.DataFrame(data)
# Model regresi linear
X = df[['Jam_Operasi']]
y = df['Produksi_Ore']
model = LinearRegression()
model.fit(X, y)
intercept = model.intercept_
slope = model.coef_[0]
df['Produksi_pred'] = model.predict(X)
df['epsilon'] = df['Produksi_Ore'] - df['Produksi_pred']
# Garis regresi
x_line = np.linspace(df['Jam_Operasi'].min()-1, df['Jam_Operasi'].max()+1, 100)
y_line = intercept + slope * x_line
line_regresi = go.Scatter(
x=x_line,
y=y_line,
mode='lines',
name='Garis Regresi',
line=dict(color='red', width=3)
)
# Titik data aktual
scatter_actual = go.Scatter(
x=df['Jam_Operasi'],
y=df['Produksi_Ore'],
mode='markers',
name='Data Aktual',
marker=dict(color='blue', size=8)
)
# Garis residual epsilon (vertikal)
residual_lines = []
for i, row in df.iterrows():
residual = go.Scatter(
x=[row['Jam_Operasi'], row['Jam_Operasi']],
y=[row['Produksi_pred'], row['Produksi_Ore']],
mode='lines',
line=dict(color='gray', width=2, dash='dot'),
showlegend=(i==0),
name='Error ε'
)
residual_lines.append(residual)
# Label epsilon
epsilon_labels = go.Scatter(
x=df['Jam_Operasi'] + 0.1,
y=(df['Produksi_Ore'] + df['Produksi_pred']) / 2,
mode='text',
text=[f'ε{i+1}' for i in range(len(df))],
showlegend=False,
textposition='middle right',
textfont=dict(color='black', size=12)
)
# Anotasi formula model dan keterangan data aktual
annotations = [
dict(
x=0, y=1.12, xref='paper', yref='paper',
text=f"<b>Model Regresi:</b><br>Ŷ = {intercept:.2f} + {slope:.2f} × Jam_Operasi",
showarrow=False,
font=dict(size=14, color='darkred'),
align='left'
),
dict(
x=0.95, y=1.2, xref='paper', yref='paper',
text="<b>Data Aktual:</b><br>Y = Produksi Ori",
showarrow=False,
font=dict(size=14, color='blue'),
align='right'
)
]
layout = go.Layout(
title='Regresi Linear Sederhana: Produksi Ore vs Jam Operasi',
xaxis=dict(title='Jam Operasi (jam)'),
yaxis=dict(title='Produksi Ore (ton)'),
annotations=annotations,
margin=dict(t=100)
)
fig = go.Figure(data=[scatter_actual, line_regresi] + residual_lines + [epsilon_labels], layout=layout)
fig.show();11 Pemodelan Regresi
Pemodelan regresi adalah salah satu metode statistik paling fundamental yang digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen (prediktor) dengan variabel dependen (respon). Tujuan utama dari regresi adalah memprediksi, menjelaskan, atau mengestimasi nilai dari variabel respon berdasarkan informasi dari variabel prediktor (Bevans, 2023; University, n.d.).
11.1 Regresi Linear Sederhana
Regresi Linear Sederhana adalah metode untuk memodelkan hubungan antara satu variabel independen (\(X\)) dan satu variabel dependen (\(Y\)) menggunakan persamaan garis lurus:
\[ Y = \beta_0 + \beta_1 X + \varepsilon \]
Keterangan: - \(Y\): variabel dependen
- \(X\): variabel independen
- \(\beta_0\): intercept (titik potong)
- \(\beta_1\): slope (kemiringan garis)
- \(\varepsilon\): error (noise)
Persamaan ini diasumsikan memiliki hubungan linier antara \(X\) dan \(Y\), dengan error \(\varepsilon\) yang berdistribusi normal dengan rata-rata nol dan variansi konstan (homoskedastisitas) (Bevans, 2023; Wikipedia contributors, 2025).
11.1.1 Studi Kasus 1
Prediksi produksi ore (bijih) harian berdasarkan jam operasi alat berat.
- Variabel bebas (\(X\)): Jam operasi alat berat per hari (jam)
- Variabel terikat (\(Y\)): Produksi ore per hari (ton)
11.1.2 Data Kasus 1
Misal data pengukuran 10 hari operasi alat berat di tambang adalah:
| i | \(X_i\) (Jam Operasi) | \(Y_i\) (Produksi Ore) |
|---|---|---|
| 1 | 5 | 50 |
| 2 | 7 | 65 |
| 3 | 8 | 70 |
| 4 | 6 | 60 |
| 5 | 9 | 80 |
| 6 | 4 | 45 |
| 7 | 7 | 68 |
| 8 | 10 | 90 |
| 9 | 6 | 62 |
| 10 | 8 | 75 |
11.1.3 Rata-rata \(R\bar{X}\) & \(\bar{Y}\)
\[ \bar{X} = \frac{1}{n} \sum_{i=1}^n X_i, \quad \bar{Y} = \frac{1}{n} \sum_{i=1}^n Y_i \]
\[ \bar{X} = \frac{5 + 7 + 8 + 6 + 9 + 4 + 7 + 10 + 6 + 8}{10} = \frac{70}{10} = 7.0 \]
\[ \bar{Y} = \frac{50 + 65 + 70 + 60 + 80 + 45 + 68 + 90 + 62 + 75}{10} = \frac{665}{10} = 66.5 \]
11.1.4 Koefisien Slope \(b_1\)
\[ b_1 = \frac{\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y})}{\sum_{i=1}^n (X_i - \bar{X})^2} \]
| \(X_i\) | \(Y_i\) | \(X_i - \bar{X}\) | \(Y_i - \bar{Y}\) | \((X_i - \bar{X})(Y_i - \bar{Y})\) | \((X_i - \bar{X})^2\) |
|---|---|---|---|---|---|
| 5 | 50 | \(5 - 7 = -2\) | \(50 - 66.5 = -16.5\) | \((-2) \times (-16.5) = 33\) | 4 |
| 7 | 65 | 0 | -1.5 | 0 | 0 |
| 8 | 70 | 1 | 3.5 | 3.5 | 1 |
| 6 | 60 | -1 | -6.5 | 6.5 | 1 |
| 9 | 80 | 2 | 13.5 | 27 | 4 |
| 4 | 45 | -3 | -21.5 | 64.5 | 9 |
| 7 | 68 | 0 | 1.5 | 0 | 0 |
| 10 | 90 | 3 | 23.5 | 70.5 | 9 |
| 6 | 62 | -1 | -4.5 | 4.5 | 1 |
| 8 | 75 | 1 | 8.5 | 8.5 | 1 |
Jumlah:
\[ \sum (X_i - \bar{X})(Y_i - \bar{Y}) = 33 + 0 + 3.5 + 6.5 + 27 + 64.5 + 0 + 70.5 + 4.5 + 8.5 = 218 \]
\[ \sum (X_i - \bar{X})^2 = 4 + 0 + 1 + 1 + 4 + 9 + 0 + 9 + 1 + 1 = 30 \]
Maka,
\[ b_1 = \frac{218}{30} = 7.27 \]
11.1.5 Intercept \(b_0\):
\[ b_0 = \bar{Y} - b_1 \bar{X} = 66.5 - 7.27 \times 7 = 66.5 - 50.89 = 15.61 \]
11.1.6 Model Regresi Linear
\[ \begin{array}{rcl} \hat{Y} &= b_0 + b_1 \times X \\ &= 15.61 + 7.27 \times X \end{array} \]
11.1.7 Contoh Prediksi
Jika jam operasi alat berat = 8 jam, maka estimasi produksi ore:
\[ \begin{array}{rcl} \hat{Y} & = & 15.61 + 7.27 \times 8 \\ & = & 15.61 + 58.16 \\ & = & 73.77 \text{ ton} \end{array} \]
11.1.8 Visualisasi 2D
11.1.9 Visualisasi 3D
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from sklearn.linear_model import LinearRegression
# Data tambang: Jam operasi dan produksi ore harian
data = {
'Jam_Operasi': [5, 7, 8, 6, 9, 4, 7, 10, 6, 8],
'Produksi_Ore': [50, 65, 70, 60, 80, 45, 68, 90, 62, 75]
}
df = pd.DataFrame(data)
# Model regresi linear
X = df[['Jam_Operasi']]
y = df['Produksi_Ore']
model = LinearRegression()
model.fit(X, y)
intercept = model.intercept_
slope = model.coef_[0]
df['Produksi_pred'] = model.predict(X)
df['epsilon'] = df['Produksi_Ore'] - df['Produksi_pred']
# Permukaan regresi linear 3D (x = Jam operasi, y = Prediksi produksi, z=0)
x_surface = np.linspace(df['Jam_Operasi'].min(), df['Jam_Operasi'].max(), 20)
y_surface = intercept + slope * x_surface
z_surface = np.zeros_like(x_surface)
surface_line = go.Scatter3d(
x=x_surface,
y=y_surface,
z=z_surface,
mode='lines',
name='Garis Regresi (Permukaan)',
line=dict(color='red', width=5)
)
# Scatter titik data aktual di z = residual
scatter_actual = go.Scatter3d(
x=df['Jam_Operasi'],
y=df['Produksi_Ore'],
z=df['epsilon'],
mode='markers',
marker=dict(size=6, color='blue'),
name='Data Aktual (Jam Operasi, Produksi, ε)'
)
# Garis residual vertikal dari permukaan regresi ke titik aktual
residual_lines = []
for i in range(len(df)):
residual_line = go.Scatter3d(
x=[df['Jam_Operasi'][i], df['Jam_Operasi'][i]],
y=[df['Produksi_pred'][i], df['Produksi_Ore'][i]],
z=[0, df['epsilon'][i]],
mode='lines',
line=dict(color='gray', width=2, dash='dot'),
showlegend=(i==0),
name='Error (ε)'
)
residual_lines.append(residual_line)
# Label residual epsilon
epsilon_labels = go.Scatter3d(
x=df['Jam_Operasi'] + 0.1,
y=(df['Produksi_Ore'] + df['Produksi_pred']) / 2,
z=df['epsilon'] / 2,
mode='text',
text=[f'ε{i+1}' for i in range(len(df))],
textposition='middle right',
showlegend=False,
textfont=dict(size=12, color='black')
)
# Formula model regresi
formula_text = f"Ŷ = {intercept:.2f} + {slope:.2f} × Jam_Operasi"
layout = go.Layout(
title="Visualisasi Regresi Linear Sederhana: Produksi Ore vs Jam Operasi",
width=1600,
height=700,
scene=dict(
xaxis=dict(title='Jam Operasi (jam)'),
yaxis=dict(title='Produksi Ore (ton)'),
zaxis=dict(title='Residual ε'),
),
annotations=[
dict(
showarrow=False,
text=f"<b>Model Regresi:</b><br>{formula_text}",
x=0,
y=1,
xref='paper',
yref='paper',
align='left',
font=dict(size=14, color='darkred')
)
]
)
fig = go.Figure(data=[scatter_actual, surface_line] + residual_lines + [epsilon_labels], layout=layout)
fig.show();11.2 Regresi Linear Berganda
Regresi Linear Berganda (RLB) adalah perluasan dari regresi linear sederhana yang digunakan untuk memodelkan hubungan antara satu variabel dependen (\(Y\)) dengan dua atau lebih variabel independen (\(X_1, X_2, \ldots, X_p\)). Model ini digunakan untuk memprediksi, mengestimasi, atau menjelaskan variabel respon berdasarkan beberapa prediktor sekaligus.
Regresi Linear Berganda adalah metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel dependen (\(Y\)) dengan dua atau lebih variabel independen (\(X_1, X_2, \ldots, X_p\)). Model ini memungkinkan analisis pengaruh simultan dari beberapa prediktor terhadap variabel respon (Tranmer & Murphy, 2020).
11.2.1 Bentuk Umum Model
Persamaan umum RLB:
\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \varepsilon \]
Keterangan:
- \(Y\): variabel dependen (respon)
- \(X_1, X_2, \ldots, X_p\): variabel independen (prediktor)
- \(\beta_0\): intercept
- \(\beta_1, \ldots, \beta_p\): koefisien regresi
- \(\varepsilon\): galat atau error acak
11.2.2 Tujuan RLB
- Mengukur pengaruh simultan beberapa variabel bebas terhadap variabel respon.
- Memprediksi nilai \(Y\) berdasarkan nilai-nilai dari \(X_1, X_2, ..., X_p\).
- Menentukan variabel mana yang paling signifikan dalam mempengaruhi \(Y\) (Weisberg, 2011).
11.2.3 Asumsi RLB
- Linearitas: Hubungan antara \(X_i\) dan \(Y\) bersifat linier.
- Independensi: Observasi bersifat independen satu sama lain.
- Homoskedastisitas: Variansi error konstan di seluruh nilai prediktor.
- Normalitas Error: Galat (\(\varepsilon\)) berdistribusi normal.
- Tidak ada multikolinearitas tinggi antar variabel independen (Tranmer & Murphy, 2020).
11.3 Evaluasi Model RLB
Beberapa ukuran evaluasi yang umum digunakan:
- \(R^2\) (Koefisien Determinasi): Menunjukkan proporsi variabilitas \(Y\) yang dijelaskan oleh model.
- Adjusted \(R^2\): Menyesuaikan \(R^2\) berdasarkan jumlah prediktor.
- Uji F: Menguji signifikansi model secara keseluruhan.
- Uji t: Menguji signifikansi masing-masing koefisien \(\beta_i\) (Chen, 2019).
11.3.1 Studi Kasus2
Regresi Linear Berganda (3 Variabel) - Kasus Tambang
Sebuah perusahaan tambang ingin mengetahui pengaruh jumlah jam kerja alat berat (X₁), jumlah operator (X₂), dan jumlah solar yang dikonsumsi (X₃) terhadap produksi ore harian (Y).
11.3.2 Data Kasus 2
Data dari 10 hari terakhir tercatat sebagai berikut:
| Hari | Jam Kerja Alat Berat (\(X_1\)) | Jumlah Operator (\(X_2\)) | Konsumsi Solar (liter) (\(X_3\)) | Produksi Ore (ton) (\(Y\)) |
|---|---|---|---|---|
| 1 | 8 | 5 | 120 | 75 |
| 2 | 7 | 6 | 115 | 72 |
| 3 | 9 | 5 | 130 | 80 |
| 4 | 6 | 4 | 110 | 65 |
| 5 | 10 | 6 | 140 | 85 |
| 6 | 7 | 5 | 118 | 70 |
| 7 | 8 | 6 | 125 | 78 |
| 8 | 5 | 4 | 105 | 60 |
| 9 | 9 | 6 | 135 | 83 |
| 10 | 6 | 5 | 112 | 68 |
11.3.3 Pertanyaan
Hitunglah model regresi linear berganda: \[ Y = b_0 + b_1 X_1 + b_2 X_2 + b_3 X_3 \]
Tentukan nilai dari koefisien regresi \(b_0\), \(b_1\), \(b_2\), dan \(b_3\) dengan cara:
- Menggunakan metode matriks normal equation
- Atau software seperti Python (opsional)
Tafsirkan masing-masing koefisien regresi secara kontekstual.
Prediksikan produksi ore (\(Y\)) jika:
- \(X_1 = 8\) (jam kerja)
- \(X_2 = 5\) (jumlah operator)
- \(X_3 = 125\) (liter solar)
11.3.4 Model Umum
\[ Y = b_0 + b_1 X_1 + b_2 X_2 + b_3 X_3 \]
11.3.5 Langkah-langkah
Matriks Persamaan Normal
Gunakan persamaan:
\[ \mathbf{B} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{Y} \]
Matriks Koefisien
Hasil dari perhitungan:
\[ \begin{aligned} b_0 &= 19.81 \\ b_1 &= 3.18 \\ b_2 &= 1.93 \\ b_3 &= 0.16 \end{aligned} \]
Model Regresi
\[ \hat{Y} = 19.81 + 3.18 X_1 + 1.93 X_2 + 0.16 X_3 \]
11.3.5.1 Interpretasi Koefisien
- \(b_1 = 3.18\): Setiap penambahan 1 jam kerja alat berat (\(X_1\)), produksi ore meningkat sekitar 3.18 ton (dengan asumsi variabel lain konstan).
- \(b_2 = 1.93\): Setiap penambahan 1 operator, produksi ore meningkat 1.93 ton.
- \(b_3 = 0.16\): Setiap penambahan 1 liter solar, produksi ore meningkat 0.16 ton.
Prediksi
Jika diketahui:
- \(X_1 = 8\) (jam kerja)
- \(X_2 = 5\) (jumlah operator)
- \(X_3 = 125\) (liter solar)
Maka:
\[ \begin{aligned} \hat{Y} &= 19.81 + 3.18(8) + 1.93(5) + 0.16(125) \\ &= 19.81 + 25.44 + 9.65 + 20.50 \\ &= 75.46 \text{ ton} \end{aligned} \]