Analisis ini bertujuan untuk memodelkan hubungan antara usia individu dan status kebahagiaan menggunakan pendekatan regresi logistik. Data yang digunakan mengacu pada konteks Indonesia Family Life Survey 5 (IFLS 5), yaitu survei rumah tangga berskala besar yang dilakukan di Indonesia.
Variabel respon yang digunakan adalah:
\[ y = \begin{cases} 1 & \text{jika individu bahagia} \\ 0 & \text{jika individu tidak bahagia} \end{cases} \]
Variabel penjelas yang digunakan adalah usia individu dalam rentang 20–40 tahun.
Regresi logistik dipilih karena variabel respon bersifat biner (dikotomus), sehingga asumsi normalitas pada regresi linear tidak terpenuhi. Model logistik memetakan kombinasi linear prediktor ke dalam rentang probabilitas \([0, 1]\) melalui fungsi logistik.
Data yang digunakan berasal dari Indonesia Family Life Survey
5 (IFLS 5) yang tersimpan dalam file bahagia.csv.
Data memiliki empat variabel: kepuasan,
bahagia, usia, dan gender.
Variabel bahagia dikodekan ulang menjadi variabel
biner:
\[ y = \begin{cases} 1 & \text{jika } \texttt{bahagia} \in \{\text{Bahagia, Sangat bahagia}\} \\ 0 & \text{jika } \texttt{bahagia} \in \{\text{Tidak bahagia, Sangat tidak bahagia}\} \end{cases} \]
Selanjutnya, data difilter hanya untuk individu berusia 20–40 tahun sesuai ketentuan soal.
# Membaca data dari file CSV
data_raw <- read.csv("bahagia.csv", stringsAsFactors = FALSE)
# Menampilkan struktur data asli
str(data_raw)## 'data.frame': 185331 obs. of 4 variables:
## $ kepuasan: chr "Sangat tidak puas" "Sangat tidak puas" "Sangat tidak puas" "Sangat tidak puas" ...
## $ bahagia : chr "Bahagia" "Bahagia" "Bahagia" "Bahagia" ...
## $ usia : int 59 29 39 16 12 3 1 29 30 6 ...
## $ gender : chr "Laki-laki" "Perempuan" "Perempuan" "Perempuan" ...
## Kategori variabel 'bahagia':
##
## Bahagia Sangat bahagia Sangat tidak bahagia
## 144051 24502 2207
## Tidak bahagia
## 14571
# Mengkodekan variabel bahagia menjadi biner (y)
# 1 = Bahagia atau Sangat bahagia
# 0 = Tidak bahagia atau Sangat tidak bahagia
data_raw$y <- ifelse(data_raw$bahagia %in% c("Bahagia", "Sangat bahagia"), 1, 0)
# Memfilter usia dalam rentang 20-40 tahun
data_ifls <- data_raw %>%
filter(usia >= 20 & usia <= 40) %>%
select(usia, y)
# Menampilkan 10 observasi pertama
kable(head(data_ifls, 10),
caption = "10 Observasi Pertama Data IFLS 5 (Usia 20–40 Tahun)",
col.names = c("Usia (tahun)", "Kebahagiaan (y)")) %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Usia (tahun) | Kebahagiaan (y) |
|---|---|
| 29 | 1 |
| 39 | 1 |
| 29 | 1 |
| 30 | 1 |
| 29 | 0 |
| 39 | 0 |
| 29 | 1 |
| 39 | 1 |
| 29 | 1 |
| 30 | 1 |
## Jumlah observasi : 78863
## Usia minimum : 20 tahun
## Usia maksimum : 40 tahun
## Usia rata-rata : 30.21 tahun
## Proporsi bahagia : 0.911
## Proporsi tidak bahagia: 0.089
# Distribusi kebahagiaan
dist_df <- data.frame(
Status = c("Bahagia (y = 1)", "Tidak Bahagia (y = 0)", "Total"),
Frekuensi = c(sum(data_ifls$y == 1), sum(data_ifls$y == 0), nrow(data_ifls)),
Proporsi = c(round(mean(data_ifls$y), 4),
round(1 - mean(data_ifls$y), 4), 1)
)
kable(dist_df,
caption = "Distribusi Status Kebahagiaan (Usia 20–40 Tahun)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Status | Frekuensi | Proporsi |
|---|---|---|
| Bahagia (y = 1) | 71847 | 0.911 |
| Tidak Bahagia (y = 0) | 7016 | 0.089 |
| Total | 78863 | 1.000 |
Model regresi logistik memodelkan log-odds dari probabilitas kejadian sebagai fungsi linear dari prediktor. Secara matematis, model regresi logistik sederhana dinyatakan sebagai:
\[ \log\left(\frac{p(x)}{1 - p(x)}\right) = \beta_0 + \beta_1 x \]
di mana:
Probabilitas kebahagiaan dapat diperoleh melalui transformasi balik (inverse logit):
\[ p(x) = \frac{e^{\beta_0 + \beta_1 x}}{1 + e^{\beta_0 + \beta_1 x}} \]
Estimasi parameter \(\beta_0\) dan
\(\beta_1\) dilakukan dengan metode
Maximum Likelihood Estimation (MLE) menggunakan fungsi
glm() di R.
# Estimasi model regresi logistik
model <- glm(y ~ usia, family = binomial(link = "logit"), data = data_ifls)
# Menampilkan ringkasan model
summary(model)##
## Call:
## glm(formula = y ~ usia, family = binomial(link = "logit"), data = data_ifls)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.229282 0.066030 33.762 <2e-16 ***
## usia 0.003218 0.002152 1.495 0.135
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 47339 on 78862 degrees of freedom
## Residual deviance: 47337 on 78861 degrees of freedom
## AIC: 47341
##
## Number of Fisher Scoring iterations: 5
# Mengekstrak koefisien
beta_0 <- coef(model)[1] # Intercept
beta_1 <- coef(model)[2] # Koefisien usia
# Menampilkan koefisien dalam tabel
koef_df <- data.frame(
Parameter = c("$\\hat{\\beta}_0$ (Intercept)", "$\\hat{\\beta}_1$ (Usia)"),
Estimasi = round(c(beta_0, beta_1), 4),
Std.Error = round(summary(model)$coefficients[, 2], 4),
z.value = round(summary(model)$coefficients[, 3], 4),
p.value = round(summary(model)$coefficients[, 4], 4)
)
kable(koef_df,
caption = "Hasil Estimasi Koefisien Model Regresi Logistik",
escape = FALSE) %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Parameter | Estimasi | Std.Error | z.value | p.value | |
|---|---|---|---|---|---|
| (Intercept) | \(\hat{\beta}_0\) (Intercept) | 2.2293 | 0.0660 | 33.7616 | 0.0000 |
| usia | \(\hat{\beta}_1\) (Usia) | 0.0032 | 0.0022 | 1.4949 | 0.1349 |
Berdasarkan hasil estimasi, model regresi logistik yang diperoleh adalah:
\[ \log\left(\frac{\hat{p}(x)}{1 - \hat{p}(x)}\right) = 2.2293 + 0.0032 \cdot x \]
di mana \(x\) adalah usia individu (dalam tahun).
Interpretasi koefisien:
Intercept \((\hat{\beta}_0 = 2.2293)\): Nilai ini merepresentasikan log-odds kebahagiaan ketika usia \(x = 0\). Meskipun secara kontekstual usia 0 tahun tidak relevan dalam analisis ini (karena rentang usia adalah 20–40 tahun), intercept diperlukan sebagai komponen struktural model.
Koefisien Usia \((\hat{\beta}_1 = 0.0032)\): Setiap kenaikan satu tahun usia, log-odds kebahagiaan berubah sebesar \(0.0032\) unit, dengan asumsi ceteris paribus. Secara matematis:
\[ \log\left(\frac{p(x+1)}{1-p(x+1)}\right) - \log\left(\frac{p(x)}{1-p(x)}\right) = \hat{\beta}_1 = 0.0032 \]
Karena \(\hat{\beta}_1 > 0\), hal ini mengindikasikan bahwa semakin bertambah usia, log-odds kebahagiaan cenderung meningkat, sehingga probabilitas individu merasa bahagia juga meningkat.
# Membuat data prediksi untuk kurva halus
usia_seq <- seq(min(data_ifls$usia), max(data_ifls$usia), length.out = 300)
pred_df <- data.frame(usia = usia_seq)
pred_df$prob <- predict(model, newdata = pred_df, type = "response")
# Membuat plot
ggplot() +
# Scatter plot data aktual (dengan jitter agar terlihat jelas)
geom_jitter(data = data_ifls,
aes(x = usia, y = y, color = factor(y)),
width = 0.3, height = 0.03,
alpha = 0.5, size = 2.5) +
# Kurva probabilitas logistik
geom_line(data = pred_df,
aes(x = usia, y = prob),
color = "#E74C3C", linewidth = 1.2) +
# Garis referensi p = 0.5
geom_hline(yintercept = 0.5, linetype = "dashed",
color = "gray40", linewidth = 0.5) +
# Pengaturan skala warna
scale_color_manual(
values = c("0" = "#3498DB", "1" = "#2ECC71"),
labels = c("Tidak Bahagia (y=0)", "Bahagia (y=1)"),
name = "Status"
) +
# Label dan judul
labs(
title = "Regresi Logistik: Hubungan Usia dan Kebahagiaan",
subtitle = "Berdasarkan Konteks Data IFLS 5",
x = "Usia (tahun)",
y = expression(paste("Kebahagiaan (", italic(y), ") / Probabilitas ", hat(p)(x)))
) +
# Anotasi kurva
annotate("text", x = max(data_ifls$usia) - 2, y = 0.55,
label = "p = 0.5", color = "gray40", fontface = "italic", size = 3.5) +
# Tema
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray50"),
legend.position = "bottom"
)Plot Pencar Usia vs Kebahagiaan dengan Kurva Probabilitas Logistik
Grafik di atas menampilkan plot pencar (scatter plot) antara variabel usia (\(x\)-axis) dan status kebahagiaan (\(y\)-axis), di mana titik-titik biru merepresentasikan individu yang tidak bahagia (\(y = 0\)) dan titik-titik hijau merepresentasikan individu yang bahagia (\(y = 1\)).
Kurva merah pada grafik merupakan kurva probabilitas logistik yang diestimasi dari model:
\[ \hat{p}(x) = \frac{e^{2.2293 + 0.0032 \cdot x}}{1 + e^{2.2293 + 0.0032 \cdot x}} \]
Kurva ini menunjukkan bagaimana probabilitas kebahagiaan berubah seiring bertambahnya usia. Terlihat bahwa kurva berbentuk S (sigmoid) yang meningkat, mengonfirmasi bahwa individu dengan usia lebih tua dalam rentang 20–40 tahun memiliki probabilitas kebahagiaan yang lebih tinggi.
Garis putus-putus horizontal pada \(p = 0.5\) berfungsi sebagai ambang batas klasifikasi (threshold). Individu dengan \(\hat{p}(x) > 0.5\) cenderung diklasifikasikan sebagai bahagia, dan sebaliknya.
Marginal effect (efek marginal) mengukur laju perubahan probabilitas dugaan terhadap perubahan satu unit variabel penjelas. Pada model logistik, marginal effect bersifat nonlinear dan bergantung pada nilai \(x\). Rumus turunan probabilitas terhadap \(x\) adalah:
\[ \frac{dP(x)}{dx} = \beta_1 \cdot P(x) \cdot \big(1 - P(x)\big) \]
# Langkah 1: Menghitung usia rata-rata
usia_mean <- mean(data_ifls$usia)
cat("Usia rata-rata (x̄):", round(usia_mean, 2), "tahun\n")## Usia rata-rata (x̄): 30.21 tahun
# Langkah 2: Menghitung P(x̄) — probabilitas pada usia rata-rata
linear_pred <- beta_0 + beta_1 * usia_mean
P_mean <- exp(linear_pred) / (1 + exp(linear_pred))
cat("Prediksi linear (β₀ + β₁·x̄):", round(linear_pred, 4), "\n")## Prediksi linear (β₀ + β₁·x̄): 2.3265
## P(x̄) = 0.911
# Langkah 3: Menghitung marginal effect
marginal_effect <- beta_1 * P_mean * (1 - P_mean)
cat("Marginal effect pada x̄:", round(marginal_effect, 4), "\n")## Marginal effect pada x̄: 3e-04
Berdasarkan perhitungan di atas, usia rata-rata sampel adalah \(\bar{x} = 30.21\) tahun. Probabilitas kebahagiaan pada usia rata-rata adalah:
\[ \hat{P}(\bar{x}) = \frac{e^{2.2293 + 0.0032 \times 30.21}}{1 + e^{2.2293 + 0.0032 \times 30.21}} = 0.911 \]
Selanjutnya, marginal effect pada usia rata-rata dihitung sebagai:
\[ \left.\frac{d\hat{P}(x)}{dx}\right|_{x = \bar{x}} = \hat{\beta}_1 \cdot \hat{P}(\bar{x}) \cdot \big(1 - \hat{P}(\bar{x})\big) = 0.0032 \times 0.911 \times 0.089 = 3\times 10^{-4} \]
Interpretasi kontekstual: Pada usia rata-rata \(\bar{x} = 30.21\) tahun, setiap kenaikan satu tahun usia dikaitkan dengan perubahan probabilitas kebahagiaan sebesar \(3\times 10^{-4}\) (atau sekitar \(0.03\) persen poin).
Nilai marginal effect yang positif menunjukkan bahwa pada titik usia rata-rata, kenaikan usia masih meningkatkan peluang individu untuk merasa bahagia.
Perlu diperhatikan bahwa marginal effect pada model logistik bersifat tidak konstan — nilainya bervariasi tergantung pada nilai \(x\). Marginal effect mencapai nilai maksimum ketika \(P(x) = 0.5\), yaitu:
\[ \left.\frac{dP(x)}{dx}\right|_{\text{max}} = \frac{\hat{\beta}_1}{4} = \frac{0.0032}{4} = 8\times 10^{-4} \]
Odds ratio (OR) merupakan ukuran asosiasi yang menunjukkan perubahan odds suatu kejadian akibat perubahan satu unit variabel penjelas. Pada model regresi logistik, odds ratio diperoleh melalui eksponensiasi koefisien:
\[ OR = e^{\hat{\beta}_1} \]
# Menghitung odds ratio
OR <- exp(beta_1)
cat("Odds Ratio (OR) = exp(β₁) = exp(", round(beta_1, 4), ") =", round(OR, 4), "\n")## Odds Ratio (OR) = exp(β₁) = exp( 0.0032 ) = 1.0032
# Interval kepercayaan 95% untuk odds ratio
ci <- confint(model)
OR_lower <- exp(ci[2, 1])
OR_upper <- exp(ci[2, 2])
cat("95% CI untuk OR: [", round(OR_lower, 4), ",", round(OR_upper, 4), "]\n")## 95% CI untuk OR: [ 0.999 , 1.0075 ]
# Menampilkan dalam tabel
or_df <- data.frame(
Ukuran = c("$\\hat{\\beta}_1$", "$OR = e^{\\hat{\\beta}_1}$",
"Batas Bawah 95% CI", "Batas Atas 95% CI"),
Nilai = round(c(beta_1, OR, OR_lower, OR_upper), 4)
)
kable(or_df, caption = "Penduga Rasio Odds (Odds Ratio)",
escape = FALSE) %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Ukuran | Nilai |
|---|---|
| \(\hat{\beta}_1\) | 0.0032 |
| \(OR = e^{\hat{\beta}_1}\) | 1.0032 |
| Batas Bawah 95% CI | 0.9990 |
| Batas Atas 95% CI | 1.0075 |
Berdasarkan hasil estimasi, nilai odds ratio adalah:
\[ OR = e^{\hat{\beta}_1} = e^{0.0032} = 1.0032 \]
Interpretasi: Setiap kenaikan satu tahun usia, odds (peluang relatif) individu untuk merasa bahagia meningkat sebesar faktor 1.0032, atau equivalently meningkat sebesar 0.32%.
Secara matematis, hubungan antara odds pada usia \(x + 1\) dan usia \(x\) adalah:
\[ \frac{\text{Odds}(x+1)}{\text{Odds}(x)} = \frac{p(x+1) / [1 - p(x+1)]}{p(x) / [1 - p(x)]} = e^{\hat{\beta}_1} = 1.0032 \]
Interval kepercayaan 95% untuk odds ratio adalah \([0.999, 1.0075]\). Karena interval kepercayaan mencakup nilai 1, hubungan antara usia dan kebahagiaan tidak signifikan secara statistik pada taraf 5%.
Berdasarkan analisis regresi logistik yang telah dilakukan, dapat disimpulkan:
Model yang diperoleh adalah: \[ \log\left(\frac{\hat{p}(x)}{1 - \hat{p}(x)}\right) = 2.2293 + 0.0032 \cdot x \] di mana \(x\) adalah usia individu (dalam tahun).
Koefisien usia \((\hat{\beta}_1 = 0.0032)\) menunjukkan bahwa terdapat hubungan positif antara usia dan log-odds kebahagiaan.
Marginal effect pada usia rata-rata \((\bar{x} = 30.21)\) adalah \(3\times 10^{-4}\), artinya setiap kenaikan satu tahun usia pada titik tersebut dikaitkan dengan perubahan probabilitas kebahagiaan sebesar \(0.03\) persen poin.
Odds ratio sebesar \(1.0032\) menunjukkan bahwa setiap kenaikan satu tahun usia meningkatkan odds kebahagiaan sebesar 0.32%.