Regresi Linear Sederhana

Menyesuaikan model, membaca koefisien, dan memaknai hasilnya.

Daftar isi

Regresi linear sederhana (simple linear regression) memodelkan hubungan satu variabel respons numerik dengan satu prediktor numerik melalui sebuah garis lurus. Topik ini menyesuaikan model tersebut dengan lm() terhadap data jam belajar dan nilai ujian, lalu membedah keluaran summary() secara utuh, mulai dari tabel koefisien, p-value kemiringan, sampai R-squared. Interpretasi setiap angka dan batas penafsirannya dibahas pada bagian akhir bersama grafik sebar yang menampilkan garis modelnya.

Data sintetis jam belajar dan nilai ujian#

Data contoh berupa 30 siswa yang dibangkitkan secara sintetis agar hasilnya dapat direproduksi siapa pun. Jam belajar per minggu ditarik dari distribusi seragam di antara 1 dan 8, sedangkan nilai ujian disusun dari pola dasar 52 ditambah 4,5 kali jam belajar, lalu diberi gangguan acak normal dengan simpangan baku 5. Fungsi set.seed(2026) dipanggil sebelum pembangkitan agar urutan angka acaknya selalu sama pada setiap eksekusi.

r
library(tidyverse)

set.seed(2026)
n <- 30
nama <- c("Ali", "Budi", "Citra", "Dewi", "Eka", "Fajar", "Gita", "Hana", "Indra", "Joko",
          "Kartika", "Laila", "Maya", "Nanda", "Oki", "Putri", "Rahmat", "Sari", "Tono", "Umar",
          "Vina", "Wawan", "Yuni", "Zaki", "Bagas", "Dian", "Farhan", "Gading", "Halim", "Intan")
belajar <- tibble(
  siswa = nama,
  jam = round(runif(n, min = 1, max = 8), 1),
  nilai = round(52 + 4.5 * jam + rnorm(n, mean = 0, sd = 5), 1)
)
belajar
text Keluaran
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# A tibble: 30 × 3
   siswa   jam nilai
   <chr> <dbl> <dbl>
 1 Ali     5.9  85.3
 2 Budi    4.9  77.1
 3 Citra   2    62.1
 4 Dewi    3    61.5
 5 Eka     4.9  77.5
 6 Fajar   1.2  55.8
 7 Gita    4.3  70.5
 8 Hana    7    76.5
 9 Indra   2.8  71.9
10 Joko    5.1  75.2
# ℹ 20 more rows

Keluaran menampilkan sepuluh baris pertama beserta penanda bahwa 20 baris lainnya tidak dicetak. Kolom siswa menyimpan nama fiktif, kolom jam menyimpan jam belajar per minggu dengan satu angka desimal, dan kolom nilai menyimpan nilai ujian skala 0 sampai 100. Gangguan acak yang dibangkitkan membuat nilai siswa dengan jam belajar sama tetap berbeda, sebagaimana data nyata.

Menyesuaikan model dengan lm()#

Model linear sederhana nilai ~ jam disesuaikan dengan satu pemanggilan lm() dan hasilnya disimpan ke objek bernama model. Objek ini menyimpan seluruh informasi model, seperti koefisien, residual, dan data pemanggilannya, sehingga fungsi lain seperti summary() dan predict() dapat membacanya kembali.

r
model <- lm(nilai ~ jam, data = belajar)
model
text Keluaran

Call:
lm(formula = nilai ~ jam, data = belajar)

Coefficients:
(Intercept)          jam  
     53.000        4.508  

Bagian Call mengulang pemanggilannya, sedangkan bagian Coefficients menampilkan dua angka yang mendefinisikan garis modelnya, yaitu intersep 53,000 dan kemiringan 4,508. Pencetakan bawaan objek lm memang sengaja ringkas. Angka-angka ini adalah estimasi titik, dan ketidakpastiannya baru terlihat pada ringkasan lengkap yang dibahas berikutnya.

Membaca keluaran summary()#

Fungsi summary() menerapkan metode ringkasan khusus untuk objek lm dan mengembalikan seluruh bagian yang dibutuhkan untuk menilai model.

r
summary(model)
text Keluaran

Call:
lm(formula = nilai ~ jam, data = belajar)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.0548 -3.4104  0.0129  2.3577  8.4922 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  53.0000     1.8778  28.224  < 2e-16 ***
jam           4.5078     0.4907   9.187 6.05e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.686 on 28 degrees of freedom
Multiple R-squared:  0.7509,	Adjusted R-squared:  0.742 
F-statistic:  84.4 on 1 and 28 DF,  p-value: 6.05e-10

Bagian Residuals menampilkan lima angka ringkas sebaran selisih data dengan garis model, yaitu nilai minimum, kuartil pertama, median, kuartil ketiga, dan maksimum. Bagian Coefficients memuat empat kolom untuk setiap koefisien. Kolom Estimate memberi estimasi titiknya, kolom Std. Error memberi ketidakpastian estimasinya, kolom t value adalah perbandingan keduanya, dan kolom Pr(>|t|) menyimpan p-value uji bahwa koefisien populasi bernilai nol. Simbol bintang di kanan baris jam menandai taraf signifikansinya menurut keterangan Signif. codes.

Tiga baris terakhir merangkum kualitas model secara keseluruhan. Residual standard error 4,686 pada 28 derajat bebas menyatakan simpangan tipikal nilai observasi terhadap garisnya. Multiple R-squared 0,7509 menyatakan porsi variasi nilai ujian yang dapat dijelaskan jam belajar, sedangkan adjusted R-squared 0,742 adalah versi yang sudah mengoreksi banyaknya prediktor. F-statistic 84,4 dengan derajat bebas 1 dan 28 menguji model secara keseluruhan, dan p-value 6,05e-10 yang sama dengan p-value kemiringan karena model ini hanya memuat satu prediktor.

Makna koefisien dan R-squared#

Intersep 53,000 berarti nilai ujian yang diprediksi untuk siswa dengan jam belajar nol. Kemiringan 4,5078 berarti setiap tambahan satu jam belajar per minggu dihubungkan dengan kenaikan nilai ujian rata-rata sekitar 4,5 poin. Kedua angka ini adalah estimasi atas pola rata-rata pada data, bukan janji atas setiap siswa, karena gangguan acak membuat siswa dengan jam belajar sama tetap bisa memperoleh nilai berbeda.

p-value kemiringan sebesar 6,05e-10 jauh di bawah ambang lazim 0,05, sehingga hipotesis nol kemiringan nol ditolak dengan kuat. R-squared 0,7509 melengkapi gambaran kualitas model, yaitu sekitar 75 persen variasi nilai ujian pada data ini terjelaskan oleh jam belajar, sedangkan 25 persen sisanya berasal dari faktor lain di luar model.

Grafik sebar dengan garis regresi#

Model paling mudah dinilai ketika garisnya ditempelkan pada data aslinya. Grafik berikut menggambar sebaran titik jam belajar dan nilai ujian, lalu menambahkan garis regresi melalui geom_smooth() dengan argumen method = "lm".

r
p <- ggplot(belajar, aes(x = jam, y = nilai)) +
  geom_point(size = 2, color = "#4472C4") +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "#C0504D") +
  labs(
    x = "Jam belajar per minggu",
    y = "Nilai ujian",
    title = "Regresi linear sederhana nilai ujian terhadap jam belajar"
  ) +
  theme_minimal()
ggplot2::ggsave("garis-regresi.svg", p, width = 5, height = 3.2)
607080246Jam belajar per mingguNilai ujianRegresi linear sederhana nilai ujian terhadap jam belajar
Sebaran nilai ujian terhadap jam belajar beserta garis regresi linear

Argumen formula = y ~ x dinyatakan secara eksplisit untuk menetapkan bentuk garis yang dicari, sehingga pesan pengingat bawaan ggplot2 tidak muncul. Argumen se = FALSE membuang pita ketidakpastiannya karena fokus bagian ini adalah garis modelnya. Titik-titik pada grafik mengikuti garis dengan sebaran yang relatif rapat, konsisten dengan nilai R-squared 0,7509 yang dilaporkan summary(). Pemeriksaan visual seperti ini merupakan langkah pertama dalam pemeriksaan asumsi model linear.

Ringkasan#

  • lm(nilai ~ jam, data = belajar) menyesuaikan garis linear dan menyimpan seluruh informasi modelnya ke dalam satu objek yang dapat dibaca fungsi lain.
  • Tabel Coefficients pada summary() menyajikan estimasi, error standar, nilai t, dan p-value untuk setiap koefisien.
  • Kemiringan 4,5078 berarti setiap tambahan satu jam belajar dihubungkan dengan kenaikan nilai rata-rata sekitar 4,5 poin, dan p-value 6,05e-10 menolak kemiringan nol.
  • Multiple R-squared 0,7509 menyatakan porsi variasi respons yang dijelaskan model, sedangkan residual standard error 4,686 menyatakan simpangan tipikalnya.
  • geom_smooth(method = "lm") menampilkan garis model di atas sebaran titik sehingga kecocokan model dapat dinilai secara visual.

Referensi#