1 Pendahuluan

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.

2 Data

2.1 Memuat Pustaka

# Memuat pustaka yang dibutuhkan
library(ggplot2)    # Untuk visualisasi
library(dplyr)      # Untuk manipulasi data
library(knitr)      # Untuk tabel yang rapi
library(kableExtra) # Untuk format tabel tambahan

2.2 Memuat Data IFLS 5

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" ...
# Menampilkan nilai unik variabel bahagia
cat("Kategori variabel 'bahagia':\n")
## Kategori variabel 'bahagia':
table(data_raw$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)
10 Observasi Pertama Data IFLS 5 (Usia 20–40 Tahun)
Usia (tahun) Kebahagiaan (y)
29 1
39 1
29 1
30 1
29 0
39 0
29 1
39 1
29 1
30 1
# Ringkasan deskriptif
cat("Jumlah observasi   :", nrow(data_ifls), "\n")
## Jumlah observasi   : 78863
cat("Usia minimum       :", min(data_ifls$usia), "tahun\n")
## Usia minimum       : 20 tahun
cat("Usia maksimum      :", max(data_ifls$usia), "tahun\n")
## Usia maksimum      : 40 tahun
cat("Usia rata-rata     :", round(mean(data_ifls$usia), 2), "tahun\n")
## Usia rata-rata     : 30.21 tahun
cat("Proporsi bahagia   :", round(mean(data_ifls$y), 4), "\n")
## Proporsi bahagia   : 0.911
cat("Proporsi tidak bahagia:", round(1 - mean(data_ifls$y), 4), "\n")
## 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)
Distribusi Status Kebahagiaan (Usia 20–40 Tahun)
Status Frekuensi Proporsi
Bahagia (y = 1) 71847 0.911
Tidak Bahagia (y = 0) 7016 0.089
Total 78863 1.000

3 Metodologi

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:

  • \(p(x) = P(Y = 1 \mid X = x)\) adalah probabilitas individu bahagia pada usia \(x\),
  • \(\frac{p(x)}{1 - p(x)}\) adalah odds kebahagiaan,
  • \(\beta_0\) adalah intercept (log-odds ketika \(x = 0\)),
  • \(\beta_1\) adalah koefisien regresi yang menunjukkan perubahan log-odds untuk setiap kenaikan satu satuan \(x\).

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.

4 Hasil dan Pembahasan

4.1 Model Regresi Logistik

4.1.1 Estimasi Model

# 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

4.1.2 Koefisien Model

# 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)
Hasil Estimasi Koefisien Model Regresi Logistik
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

4.1.3 Interpretasi

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:

  1. 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.

  2. 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.

4.2 Visualisasi

4.2.1 Plot Pencar dan Kurva Probabilitas

# 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

Plot Pencar Usia vs Kebahagiaan dengan Kurva Probabilitas Logistik

4.2.2 Interpretasi Visual

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.

4.3 Marginal Effect

4.3.1 Konsep Marginal Effect

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) \]

4.3.2 Perhitungan pada Usia Rata-rata

# 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
cat("P(x̄) =", round(P_mean, 4), "\n")
## 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

4.3.3 Interpretasi Marginal Effect

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} \]

4.4 Odds Ratio

4.4.1 Konsep Odds Ratio

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} \]

4.4.2 Perhitungan Odds Ratio

# 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)
Penduga Rasio Odds (Odds Ratio)
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

4.4.3 Interpretasi Odds Ratio

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%.

5 Kesimpulan

Berdasarkan analisis regresi logistik yang telah dilakukan, dapat disimpulkan:

  1. 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).

  2. Koefisien usia \((\hat{\beta}_1 = 0.0032)\) menunjukkan bahwa terdapat hubungan positif antara usia dan log-odds kebahagiaan.

  3. 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.

  4. Odds ratio sebesar \(1.0032\) menunjukkan bahwa setiap kenaikan satu tahun usia meningkatkan odds kebahagiaan sebesar 0.32%.