Analisis ini bertujuan mengkaji faktor-faktor yang berhubungan dengan pengeluaran konsumsi bulanan rumah tangga menggunakan regresi linier berganda metode Ordinary Least Squares (OLS). Variabel yang dianalisis mengikuti instruksi tugas, yaitu:
Model regresi yang digunakan:
\[ Y_i = \beta_0 + \beta_1X_{1i} + \beta_2X_{2i} + \beta_3X_{3i} + \beta_4X_{4i} + \beta_5X_{5i} + \varepsilon_i \]
Catatan tentang data: file Excel yang ikut terlampir
pada percakapan berisi 10 observasi UMR Kota Semarang tahun 2013–2022,
bukan 200 observasi rumah tangga seperti yang diminta dalam soal. Oleh
karena itu, agar dokumen ini dapat dijalankan dari awal sampai akhir,
kode di bawah secara default membangkitkan data simulasi sebanyak 200
rumah tangga dengan set.seed(2026). Data simulasi bukan
data asli dari dosen. Jika dosen menyediakan file data 200 rumah tangga,
ubah pengaturan pada bagian Persiapan Data dan gunakan file tersebut
sebelum mengumpulkan tugas.
# TRUE = gunakan data simulasi 200 rumah tangga agar file langsung dapat dijalankan.
# FALSE = baca data asli dari file Excel yang disediakan dosen.
gunakan_data_simulasi <- TRUE
if (gunakan_data_simulasi) {
# Membuat data simulasi secara reproducible
set.seed(2026)
n <- 200
# X5: dummy wilayah (0 = perdesaan, 1 = perkotaan)
wilayah <- rbinom(n, size = 1, prob = 0.55)
# X3: pendidikan kepala keluarga dalam tahun pendidikan
pendidikan <- sample(
c(6, 9, 12, 15, 16),
size = n,
replace = TRUE,
prob = c(0.12, 0.18, 0.42, 0.18, 0.10)
)
# X4: usia kepala keluarga
usia <- round(rnorm(n, mean = 42, sd = 9))
usia <- pmin(pmax(usia, 25), 65)
# X2: jumlah anggota keluarga
anggota_keluarga <- sample(
1:7, size = n, replace = TRUE,
prob = c(0.05, 0.12, 0.20, 0.25, 0.20, 0.12, 0.06)
)
# X1: pendapatan bulanan rumah tangga dalam juta rupiah
pendapatan <- exp(
rnorm(
n,
mean = log(5.5) + 0.025 * (pendidikan - 12) + 0.12 * wilayah,
sd = 0.25
)
)
# Komponen galat simulasi
galat <- rnorm(n, mean = 0, sd = 0.55)
# Y: konsumsi bulanan rumah tangga dalam juta rupiah
konsumsi <- 0.35 +
0.58 * pendapatan +
0.22 * anggota_keluarga +
0.035 * pendidikan -
0.002 * usia +
0.30 * wilayah +
galat
konsumsi <- pmax(konsumsi, 0.5)
data_rt <- data.frame(
konsumsi = konsumsi,
pendapatan = pendapatan,
anggota_keluarga = anggota_keluarga,
pendidikan = pendidikan,
usia = usia,
wilayah = wilayah
)
} else {
# Letakkan file data asli bernama data_rumah_tangga.xlsx
# di folder yang sama dengan file R Markdown ini.
data_asli <- readxl::read_excel("data_rumah_tangga.xlsx")
# Sesuaikan nama kolom di sebelah kanan (= data_asli[["..."]])
# dengan nama kolom yang benar pada file Excel dosen.
# Format variabel yang dibutuhkan:
# Y, X1, X2, X3, X4, X5.
data_rt <- data.frame(
konsumsi = data_asli[["Y"]],
pendapatan = data_asli[["X1"]],
anggota_keluarga = data_asli[["X2"]],
pendidikan = data_asli[["X3"]],
usia = data_asli[["X4"]],
wilayah = data_asli[["X5"]]
)
}
# Memastikan seluruh variabel berformat numerik
kolom_model <- c(
"konsumsi", "pendapatan", "anggota_keluarga",
"pendidikan", "usia", "wilayah"
)
if (!all(kolom_model %in% names(data_rt))) {
stop("Nama variabel pada data tidak lengkap. Periksa kembali bagian import data.")
}
if (!all(vapply(data_rt[kolom_model], is.numeric, logical(1)))) {
stop("Semua variabel harus numerik. Pastikan X5 sudah dikodekan 0 dan 1.")
}
if (anyNA(data_rt[kolom_model])) {
stop("Data mengandung NA. Periksa dan tangani missing value terlebih dahulu.")
}
if (!all(data_rt$wilayah %in% c(0, 1))) {
stop("Variabel wilayah harus berupa dummy: 0 = perdesaan dan 1 = perkotaan.")
}
if (nrow(data_rt) != 200) {
warning("Jumlah observasi bukan 200. Periksa kembali kesesuaian data dengan instruksi tugas.")
}
# Membuat label wilayah untuk visualisasi
data_rt$wilayah_label <- factor(
data_rt$wilayah,
levels = c(0, 1),
labels = c("Perdesaan", "Perkotaan")
)
cat("Jumlah observasi:", nrow(data_rt), "\n")
#> Jumlah observasi: 200
cat("Jumlah variabel:", length(kolom_model), "\n")
#> Jumlah variabel: 6
cat("Data yang digunakan:",
ifelse(gunakan_data_simulasi, "Simulasi", "Data Excel dosen"), "\n")
#> Data yang digunakan: Simulasi
# Menampilkan 10 baris pertama
knitr::kable(
head(data_rt[, kolom_model], 10),
digits = 3,
caption = "Sepuluh observasi pertama"
)
| konsumsi | pendapatan | anggota_keluarga | pendidikan | usia | wilayah |
|---|---|---|---|---|---|
| 6.333 | 6.350 | 7 | 6 | 38 | 0 |
| 5.249 | 6.439 | 5 | 15 | 46 | 0 |
| 5.815 | 5.770 | 6 | 12 | 40 | 1 |
| 7.221 | 9.537 | 2 | 16 | 25 | 1 |
| 5.025 | 5.438 | 4 | 12 | 39 | 0 |
| 6.278 | 6.335 | 7 | 15 | 58 | 1 |
| 5.974 | 6.414 | 5 | 12 | 38 | 1 |
| 5.724 | 5.173 | 7 | 16 | 37 | 0 |
| 3.631 | 5.414 | 4 | 6 | 41 | 1 |
| 4.576 | 6.440 | 2 | 9 | 57 | 0 |
# Struktur dan ringkasan awal data
str(data_rt[, kolom_model])
#> 'data.frame': 200 obs. of 6 variables:
#> $ konsumsi : num 6.33 5.25 5.82 7.22 5.02 ...
#> $ pendapatan : num 6.35 6.44 5.77 9.54 5.44 ...
#> $ anggota_keluarga: int 7 5 6 2 4 7 5 7 4 2 ...
#> $ pendidikan : num 6 15 12 16 12 15 12 16 6 9 ...
#> $ usia : num 38 46 40 25 39 58 38 37 41 57 ...
#> $ wilayah : int 0 0 1 1 0 1 1 0 1 0 ...
summary(data_rt[, kolom_model])
#> konsumsi pendapatan anggota_keluarga pendidikan
#> Min. :2.647 Min. : 3.013 Min. :1.00 Min. : 6.00
#> 1st Qu.:4.450 1st Qu.: 4.994 1st Qu.:3.00 1st Qu.: 9.00
#> Median :5.141 Median : 5.679 Median :4.00 Median :12.00
#> Mean :5.245 Mean : 6.029 Mean :3.98 Mean :11.77
#> 3rd Qu.:5.820 3rd Qu.: 6.926 3rd Qu.:5.00 3rd Qu.:15.00
#> Max. :9.780 Max. :11.765 Max. :7.00 Max. :16.00
#> usia wilayah
#> Min. :25.00 Min. :0.000
#> 1st Qu.:36.00 1st Qu.:0.000
#> Median :42.00 Median :1.000
#> Mean :42.21 Mean :0.605
#> 3rd Qu.:48.00 3rd Qu.:1.000
#> Max. :61.00 Max. :1.000
Statistik deskriptif digunakan untuk menggambarkan karakteristik setiap variabel melalui jumlah observasi, rata-rata, median, standar deviasi, nilai minimum, dan maksimum.
deskriptif <- data.frame(
Variabel = c(
"Konsumsi rumah tangga (Y)",
"Pendapatan rumah tangga (X1)",
"Jumlah anggota keluarga (X2)",
"Pendidikan kepala keluarga (X3)",
"Usia kepala keluarga (X4)",
"Wilayah (X5: 0 perdesaan, 1 perkotaan)"
),
N = sapply(data_rt[kolom_model], function(x) sum(!is.na(x))),
Rata_rata = sapply(data_rt[kolom_model], mean),
Median = sapply(data_rt[kolom_model], median),
Standar_deviasi = sapply(data_rt[kolom_model], sd),
Minimum = sapply(data_rt[kolom_model], min),
Maksimum = sapply(data_rt[kolom_model], max)
)
knitr::kable(
deskriptif,
digits = 3,
caption = "Statistik deskriptif seluruh variabel"
)
| Variabel | N | Rata_rata | Median | Standar_deviasi | Minimum | Maksimum | |
|---|---|---|---|---|---|---|---|
| konsumsi | Konsumsi rumah tangga (Y) | 200 | 5.245 | 5.141 | 1.193 | 2.647 | 9.780 |
| pendapatan | Pendapatan rumah tangga (X1) | 200 | 6.029 | 5.679 | 1.520 | 3.013 | 11.765 |
| anggota_keluarga | Jumlah anggota keluarga (X2) | 200 | 3.980 | 4.000 | 1.638 | 1.000 | 7.000 |
| pendidikan | Pendidikan kepala keluarga (X3) | 200 | 11.765 | 12.000 | 3.137 | 6.000 | 16.000 |
| usia | Usia kepala keluarga (X4) | 200 | 42.210 | 42.000 | 8.546 | 25.000 | 61.000 |
| wilayah | Wilayah (X5: 0 perdesaan, 1 perkotaan) | 200 | 0.605 | 1.000 | 0.490 | 0.000 | 1.000 |
frekuensi_wilayah <- as.data.frame(
table(data_rt$wilayah_label)
)
names(frekuensi_wilayah) <- c("Wilayah", "Jumlah")
frekuensi_wilayah$Persentase <- round(
frekuensi_wilayah$Jumlah / sum(frekuensi_wilayah$Jumlah) * 100, 2
)
knitr::kable(
frekuensi_wilayah,
caption = "Distribusi rumah tangga berdasarkan wilayah"
)
| Wilayah | Jumlah | Persentase |
|---|---|---|
| Perdesaan | 79 | 39.5 |
| Perkotaan | 121 | 60.5 |
ggplot(data_rt, aes(x = konsumsi)) +
geom_histogram(
bins = 20,
fill = "steelblue",
color = "white"
) +
geom_vline(
xintercept = mean(data_rt$konsumsi),
color = "red",
linetype = "dashed",
size = 1
) +
labs(
title = "Distribusi Pengeluaran Konsumsi Rumah Tangga",
x = "Konsumsi bulanan (juta rupiah)",
y = "Frekuensi"
) +
theme_minimal()
ggplot(data_rt, aes(x = pendapatan, y = konsumsi)) +
geom_point(alpha = 0.65, color = "steelblue") +
geom_smooth(method = "lm", se = TRUE, color = "red") +
labs(
title = "Hubungan Pendapatan dan Konsumsi Rumah Tangga",
x = "Pendapatan bulanan (juta rupiah)",
y = "Konsumsi bulanan (juta rupiah)"
) +
theme_minimal()
ggplot(data_rt, aes(x = wilayah_label, y = konsumsi, fill = wilayah_label)) +
geom_boxplot(alpha = 0.75) +
labs(
title = "Perbandingan Konsumsi Berdasarkan Wilayah Tempat Tinggal",
x = "Wilayah tempat tinggal",
y = "Konsumsi bulanan (juta rupiah)"
) +
theme_minimal() +
theme(legend.position = "none")
Model yang diestimasi adalah:
\[ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \beta_3X_3 + \beta_4X_4 + \beta_5X_5 + \varepsilon \]
# Estimasi parameter menggunakan Ordinary Least Squares (OLS)
model <- lm(
konsumsi ~ pendapatan + anggota_keluarga +
pendidikan + usia + wilayah,
data = data_rt
)
# Ringkasan hasil regresi
summary(model)
#>
#> Call:
#> lm(formula = konsumsi ~ pendapatan + anggota_keluarga + pendidikan +
#> usia + wilayah, data = data_rt)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.65828 -0.31835 -0.01333 0.32610 1.73790
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.0632840 0.3017563 -0.210 0.834107
#> pendapatan 0.6149879 0.0272047 22.606 < 0.0000000000000002 ***
#> anggota_keluarga 0.2189250 0.0242158 9.041 < 0.0000000000000002 ***
#> pendidikan 0.0490530 0.0130155 3.769 0.000218 ***
#> usia 0.0001463 0.0046505 0.031 0.974935
#> wilayah 0.2419429 0.0811456 2.982 0.003235 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.5521 on 194 degrees of freedom
#> Multiple R-squared: 0.7911, Adjusted R-squared: 0.7857
#> F-statistic: 146.9 on 5 and 194 DF, p-value: < 0.00000000000000022
hasil_summary <- summary(model)
matriks_koef <- hasil_summary$coefficients
interval_kepercayaan <- confint(model)
tabel_koefisien <- data.frame(
Parameter = rownames(matriks_koef),
Estimasi = matriks_koef[, 1],
Std_Error = matriks_koef[, 2],
t_hitung = matriks_koef[, 3],
p_value = matriks_koef[, 4],
CI_95_Bawah = interval_kepercayaan[, 1],
CI_95_Atas = interval_kepercayaan[, 2],
row.names = NULL
)
knitr::kable(
tabel_koefisien,
digits = 4,
caption = "Estimasi parameter regresi linier berganda"
)
| Parameter | Estimasi | Std_Error | t_hitung | p_value | CI_95_Bawah | CI_95_Atas |
|---|---|---|---|---|---|---|
| (Intercept) | -0.0633 | 0.3018 | -0.2097 | 0.8341 | -0.6584 | 0.5319 |
| pendapatan | 0.6150 | 0.0272 | 22.6060 | 0.0000 | 0.5613 | 0.6686 |
| anggota_keluarga | 0.2189 | 0.0242 | 9.0406 | 0.0000 | 0.1712 | 0.2667 |
| pendidikan | 0.0491 | 0.0130 | 3.7688 | 0.0002 | 0.0234 | 0.0747 |
| usia | 0.0001 | 0.0047 | 0.0315 | 0.9749 | -0.0090 | 0.0093 |
| wilayah | 0.2419 | 0.0811 | 2.9816 | 0.0032 | 0.0819 | 0.4020 |
b <- coef(model)
cat(
"Persamaan regresi estimasi:\n",
"Y = ", round(b[1], 4),
" + (", round(b[2], 4), ")X1",
" + (", round(b[3], 4), ")X2",
" + (", round(b[4], 4), ")X3",
" + (", round(b[5], 4), ")X4",
" + (", round(b[6], 4), ")X5\n",
sep = ""
)
#> Persamaan regresi estimasi:
#> Y = -0.0633 + (0.615)X1 + (0.2189)X2 + (0.0491)X3 + (0.0001)X4 + (0.2419)X5
Uji asumsi dilakukan terhadap residual dan hubungan antarvariabel penjelas. Taraf signifikansi yang digunakan adalah 5% (\(\alpha = 0,05\)).
Hipotesis:
Keputusan: jika p-value > 0,05, tidak terdapat bukti yang cukup untuk menyatakan residual menyimpang dari distribusi normal.
uji_normalitas <- shapiro.test(residuals(model))
tabel_normalitas <- data.frame(
Metode = "Shapiro-Wilk",
Statistik_W = unname(uji_normalitas$statistic),
p_value = uji_normalitas$p.value,
Keputusan = ifelse(
uji_normalitas$p.value > 0.05,
"Tidak menolak H0: residual konsisten dengan normalitas",
"Menolak H0: terdapat indikasi residual tidak normal"
)
)
knitr::kable(
tabel_normalitas,
digits = 5,
caption = "Hasil uji normalitas residual"
)
| Metode | Statistik_W | p_value | Keputusan |
|---|---|---|---|
| Shapiro-Wilk | 0.99489 | 0.7339 | Tidak menolak H0: residual konsisten dengan normalitas |
Multikolinearitas diperiksa menggunakan Variance Inflation Factor (VIF) dan Tolerance. Pedoman yang digunakan adalah VIF < 10 dan Tolerance > 0,10.
nilai_vif <- car::vif(model)
tabel_vif <- data.frame(
Variabel = names(nilai_vif),
VIF = as.numeric(nilai_vif),
Tolerance = 1 / as.numeric(nilai_vif)
)
tabel_vif$Keputusan <- ifelse(
tabel_vif$VIF < 10 & tabel_vif$Tolerance > 0.10,
"Tidak terindikasi multikolinearitas tinggi",
"Terindikasi multikolinearitas"
)
knitr::kable(
tabel_vif,
digits = 4,
caption = "Hasil uji multikolinearitas"
)
| Variabel | VIF | Tolerance | Keputusan |
|---|---|---|---|
| pendapatan | 1.1168 | 0.8954 | Tidak terindikasi multikolinearitas tinggi |
| anggota_keluarga | 1.0273 | 0.9734 | Tidak terindikasi multikolinearitas tinggi |
| pendidikan | 1.0883 | 0.9188 | Tidak terindikasi multikolinearitas tinggi |
| usia | 1.0315 | 0.9695 | Tidak terindikasi multikolinearitas tinggi |
| wilayah | 1.0326 | 0.9684 | Tidak terindikasi multikolinearitas tinggi |
Hipotesis:
Keputusan: jika p-value > 0,05, tidak terdapat bukti yang cukup untuk menyatakan adanya heteroskedastisitas.
uji_bp <- lmtest::bptest(model)
tabel_bp <- data.frame(
Metode = "Breusch-Pagan",
Statistik_BP = unname(uji_bp$statistic),
df = unname(uji_bp$parameter),
p_value = uji_bp$p.value,
Keputusan = ifelse(
uji_bp$p.value > 0.05,
"Tidak terdapat bukti heteroskedastisitas",
"Terdapat indikasi heteroskedastisitas"
)
)
knitr::kable(
tabel_bp,
digits = 5,
caption = "Hasil uji heteroskedastisitas"
)
| Metode | Statistik_BP | df | p_value | Keputusan | |
|---|---|---|---|---|---|
| BP | Breusch-Pagan | 4.36778 | 5 | 0.49777 | Tidak terdapat bukti heteroskedastisitas |
Data pada tugas ini merupakan data cross-sectional, yaitu 200 rumah tangga yang diamati pada satu periode. Tidak terdapat urutan waktu antarobservasi seperti pada data runtun waktu (time series). Oleh karena itu, uji Durbin-Watson tidak diterapkan karena urutan baris rumah tangga tidak memiliki makna waktu. Asumsi yang lebih relevan adalah independensi antarobservasi, yang perlu dijaga melalui rancangan pengambilan sampel.
Jika dosen memberikan data dengan urutan waktu yang jelas, uji autokorelasi dapat dipertimbangkan sesuai struktur datanya.
Uji t digunakan untuk mengetahui apakah masing-masing variabel independen berhubungan secara signifikan dengan konsumsi rumah tangga setelah variabel independen lainnya dikendalikan.
Hipotesis untuk setiap variabel:
Keputusan: p-value < 0,05 berarti koefisien signifikan secara parsial.
tabel_uji_t <- tabel_koefisien[
tabel_koefisien$Parameter != "(Intercept)",
]
tabel_uji_t$Keputusan <- ifelse(
tabel_uji_t$p_value < 0.05,
"Signifikan (tolak H0)",
"Tidak signifikan (tidak menolak H0)"
)
knitr::kable(
tabel_uji_t[
, c("Parameter", "Estimasi", "t_hitung", "p_value", "Keputusan")
],
digits = 5,
caption = "Hasil uji t parsial"
)
| Parameter | Estimasi | t_hitung | p_value | Keputusan | |
|---|---|---|---|---|---|
| 2 | pendapatan | 0.61499 | 22.60596 | 0.00000 | Signifikan (tolak H0) |
| 3 | anggota_keluarga | 0.21893 | 9.04060 | 0.00000 | Signifikan (tolak H0) |
| 4 | pendidikan | 0.04905 | 3.76880 | 0.00022 | Signifikan (tolak H0) |
| 5 | usia | 0.00015 | 0.03146 | 0.97494 | Tidak signifikan (tidak menolak H0) |
| 6 | wilayah | 0.24194 | 2.98159 | 0.00324 | Signifikan (tolak H0) |
Uji F digunakan untuk mengetahui apakah seluruh variabel independen secara bersama-sama mempunyai hubungan yang signifikan dengan variabel dependen.
Hipotesis:
nilai_f <- summary(model)$fstatistic
f_hitung <- unname(nilai_f["value"])
df_pembilang <- unname(nilai_f["numdf"])
df_penyebut <- unname(nilai_f["dendf"])
p_f <- pf(
f_hitung,
df1 = df_pembilang,
df2 = df_penyebut,
lower.tail = FALSE
)
tabel_uji_f <- data.frame(
F_hitung = f_hitung,
df1 = df_pembilang,
df2 = df_penyebut,
p_value = p_f,
Keputusan = ifelse(
p_f < 0.05,
"Signifikan secara simultan (tolak H0)",
"Tidak signifikan secara simultan (tidak menolak H0)"
)
)
knitr::kable(
tabel_uji_f,
digits = 6,
caption = "Hasil uji F simultan"
)
| F_hitung | df1 | df2 | p_value | Keputusan |
|---|---|---|---|---|
| 146.9485 | 5 | 194 | 0 | Signifikan secara simultan (tolak H0) |
Koefisien determinasi digunakan untuk mengukur proporsi variasi konsumsi rumah tangga yang dapat dijelaskan secara bersama-sama oleh pendapatan, jumlah anggota keluarga, pendidikan, usia, dan wilayah tempat tinggal.
r2 <- summary(model)$r.squared
adjusted_r2 <- summary(model)$adj.r.squared
tabel_determinasi <- data.frame(
Ukuran = c("R-squared", "Adjusted R-squared"),
Nilai = c(r2, adjusted_r2),
Persentase = c(r2 * 100, adjusted_r2 * 100)
)
knitr::kable(
tabel_determinasi,
digits = 4,
caption = "Koefisien determinasi model"
)
| Ukuran | Nilai | Persentase |
|---|---|---|
| R-squared | 0.7911 | 79.1115 |
| Adjusted R-squared | 0.7857 | 78.5732 |
cat(
"Model menjelaskan sekitar ",
round(r2 * 100, 2),
"% variasi konsumsi rumah tangga berdasarkan variabel yang dimasukkan.\n",
"Sisanya sekitar ",
round((1 - r2) * 100, 2),
"% berkaitan dengan faktor lain dan variasi yang tidak dijelaskan model.\n",
sep = ""
)
#> Model menjelaskan sekitar 79.11% variasi konsumsi rumah tangga berdasarkan variabel yang dimasukkan.
#> Sisanya sekitar 20.89% berkaitan dengan faktor lain dan variasi yang tidak dijelaskan model.
Grafik berikut digunakan untuk memeriksa pola residual, normalitas residual secara visual, kesamaan varians, dan pengamatan yang berpotensi berpengaruh.
par(mfrow = c(2, 2))
plot(model, which = 1:4)
par(mfrow = c(1, 1))
Koefisien regresi diinterpretasikan dengan asumsi variabel independen lainnya konstan (ceteris paribus). Karena Y dan X1 dinyatakan dalam juta rupiah, koefisien X1 menunjukkan perubahan konsumsi dalam juta rupiah untuk setiap kenaikan pendapatan sebesar satu juta rupiah.
b <- coef(model)
arah_wilayah <- ifelse(b["wilayah"] >= 0, "lebih tinggi", "lebih rendah")
cat(
"1. Pendapatan rumah tangga (X1): koefisien = ",
round(b["pendapatan"], 4),
". Dengan variabel lain tetap, kenaikan pendapatan Rp1 juta berkaitan dengan perubahan konsumsi sekitar Rp",
round(b["pendapatan"], 4),
" juta per bulan.\n\n",
sep = ""
)
#> 1. Pendapatan rumah tangga (X1): koefisien = 0.615. Dengan variabel lain tetap, kenaikan pendapatan Rp1 juta berkaitan dengan perubahan konsumsi sekitar Rp0.615 juta per bulan.
cat(
"2. Jumlah anggota keluarga (X2): koefisien = ",
round(b["anggota_keluarga"], 4),
". Tambahan satu anggota keluarga berkaitan dengan perubahan konsumsi sekitar ",
round(b["anggota_keluarga"], 4),
" juta rupiah per bulan, dengan variabel lain tetap.\n\n",
sep = ""
)
#> 2. Jumlah anggota keluarga (X2): koefisien = 0.2189. Tambahan satu anggota keluarga berkaitan dengan perubahan konsumsi sekitar 0.2189 juta rupiah per bulan, dengan variabel lain tetap.
cat(
"3. Pendidikan kepala keluarga (X3): koefisien = ",
round(b["pendidikan"], 4),
". Tambahan satu tahun pendidikan berkaitan dengan perubahan konsumsi sekitar ",
round(b["pendidikan"], 4),
" juta rupiah per bulan, dengan variabel lain tetap.\n\n",
sep = ""
)
#> 3. Pendidikan kepala keluarga (X3): koefisien = 0.0491. Tambahan satu tahun pendidikan berkaitan dengan perubahan konsumsi sekitar 0.0491 juta rupiah per bulan, dengan variabel lain tetap.
cat(
"4. Usia kepala keluarga (X4): koefisien = ",
round(b["usia"], 4),
". Tambahan satu tahun usia berkaitan dengan perubahan konsumsi sekitar ",
round(b["usia"], 4),
" juta rupiah per bulan, dengan variabel lain tetap.\n\n",
sep = ""
)
#> 4. Usia kepala keluarga (X4): koefisien = 0.0001. Tambahan satu tahun usia berkaitan dengan perubahan konsumsi sekitar 0.0001 juta rupiah per bulan, dengan variabel lain tetap.
cat(
"5. Wilayah tempat tinggal (X5): koefisien = ",
round(b["wilayah"], 4),
". Rumah tangga perkotaan (X5 = 1) diperkirakan memiliki konsumsi sebesar ",
round(abs(b["wilayah"]), 4),
" juta rupiah ", arah_wilayah,
" dibanding rumah tangga perdesaan (X5 = 0), dengan variabel lain tetap.\n",
sep = ""
)
#> 5. Wilayah tempat tinggal (X5): koefisien = 0.2419. Rumah tangga perkotaan (X5 = 1) diperkirakan memiliki konsumsi sebesar 0.2419 juta rupiah lebih tinggi dibanding rumah tangga perdesaan (X5 = 0), dengan variabel lain tetap.
ringkasan <- data.frame(
Pengujian = c(
"Normalitas residual",
"Multikolinearitas",
"Heteroskedastisitas",
"Uji F simultan",
"Koefisien determinasi"
),
Hasil = c(
ifelse(uji_normalitas$p.value > 0.05,
"Tidak ada indikasi penyimpangan normalitas",
"Ada indikasi residual tidak normal"),
ifelse(all(tabel_vif$VIF < 10 & tabel_vif$Tolerance > 0.10),
"Tidak ada indikasi multikolinearitas tinggi",
"Ada indikasi multikolinearitas"),
ifelse(uji_bp$p.value > 0.05,
"Tidak ada bukti heteroskedastisitas",
"Ada indikasi heteroskedastisitas"),
ifelse(p_f < 0.05,
"Model signifikan secara simultan",
"Model tidak signifikan secara simultan"),
paste0(round(r2 * 100, 2), "% variasi Y dijelaskan model")
)
)
knitr::kable(
ringkasan,
caption = "Ringkasan hasil analisis regresi"
)
| Pengujian | Hasil |
|---|---|
| Normalitas residual | Tidak ada indikasi penyimpangan normalitas |
| Multikolinearitas | Tidak ada indikasi multikolinearitas tinggi |
| Heteroskedastisitas | Tidak ada bukti heteroskedastisitas |
| Uji F simultan | Model signifikan secara simultan |
| Koefisien determinasi | 79.11% variasi Y dijelaskan model |
Hasil regresi perlu dibaca dengan mempertimbangkan arah koefisien dan signifikansinya. Variabel dengan koefisien positif menunjukkan hubungan searah dengan konsumsi, sedangkan koefisien negatif menunjukkan hubungan berlawanan arah, setelah variabel lain dikendalikan. Variabel yang signifikan secara statistik memberikan bukti hubungan parsial pada taraf 5%, sedangkan variabel yang tidak signifikan belum memberikan bukti yang cukup pada taraf tersebut.
Secara ekonomi, pendapatan dapat berkaitan dengan kemampuan rumah tangga membiayai kebutuhan konsumsi. Jumlah anggota keluarga dapat berkaitan dengan besarnya kebutuhan rumah tangga. Pendidikan dan usia dapat menggambarkan karakteristik kepala keluarga, sedangkan variabel dummy wilayah membandingkan konsumsi rumah tangga perkotaan dan perdesaan setelah karakteristik lain dikendalikan.
Batasan interpretasi: data cross-sectional dan regresi observasional menunjukkan hubungan statistik, bukan otomatis membuktikan hubungan sebab-akibat. Apabila data yang digunakan merupakan data simulasi, hasil numerik hanya menggambarkan pola dari simulasi tersebut dan tidak boleh ditafsirkan sebagai gambaran faktual seluruh rumah tangga.
Kesimpulan akhir harus disesuaikan dengan hasil tabel yang dihasilkan ketika R Markdown dijalankan. Dalam menyusun kesimpulan, cantumkan:
R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
Fox, J., & Weisberg, S. (2019). An R companion to applied regression (3rd ed.). Sage Publications.