---
title: "Analisis Eksplorasi"
---
```{r}
#| label: setup
#| echo: false
source("_common.R")
```
Bagian ini menyajikan analisis eksploratori: **Three-Way Interaction** CCS × OL × Status Anggota, beserta visualisasi interaksi dan distribusi skor per subgrup anggota.
::: {.callout-warning}
Analisis ini bersifat **EKSPLORATORI** (bukan konfirmatori).
:::
## Persiapan Data Lengkap
```{r}
data_full <- data.frame(
PEB = Fscores_peb[, "PEB"], OL = Fscores_ol[, "OL"], CCS = Fscores_ccs[, "GCCS"],
Gender = factor(data$Gender), Semester = factor(data$Semester),
Area = factor(data$Area), Provinsi = factor(data$Provinsi),
Hunian = factor(data$Hunian), Knowl = factor(data$Knowl),
Bergabung = factor(data$Bergabung),
Anggota = factor(ifelse(data$Anggota == 2, 1, 0), levels = c(0, 1), labels = c("Pengurus", "Anggota Biasa")),
Usia = data$Usia, Saku = data$Saku, Pol1 = data$Pol1, Pol2 = data$Pol2
)
cat("Data lengkap:", nrow(data_full), "baris x", ncol(data_full), "kolom")
```
## Perbandingan Model
```{r}
mod_base <- lm(PEB ~ CCS * OL, data = data_full)
mod_cov <- lm(PEB ~ CCS * OL + Anggota, data = data_full)
cat("ANOVA:\n")
anova(mod_base, mod_cov)
cat("\nWald Test (HC3):\n")
waldtest(mod_base, mod_cov, vcov = vcovHC(mod_cov, type = "HC3"))
```
## Three-Way Interaction: CCS × OL × Anggota
```{r}
mod_3way_anggota <- lm(PEB ~ CCS * OL * Anggota, data = data_full)
summary(mod_3way_anggota)
cat("\nHasil dengan Koreksi HC3:\n")
coeftest(mod_3way_anggota, vcov = vcovHC(mod_3way_anggota, type = "HC3"))
```
### Visualisasi Interaksi 3-Arah
```{r}
#| label: interaction-plot
#| fig-width: 12
#| fig-height: 6.5
#| code-fold: true
#| code-summary: "Kode plot interaksi"
# ---- 1. Grid prediksi: CCS x OL (3 level) x Anggota (2 level) ----
ccs_seq <- seq(min(data_full$CCS, na.rm = TRUE),
max(data_full$CCS, na.rm = TRUE),
length.out = 200
)
ol_mean <- mean(data_full$OL, na.rm = TRUE)
ol_sd <- sd(data_full$OL, na.rm = TRUE)
ol_vals <- c(ol_mean - ol_sd, ol_mean, ol_mean + ol_sd)
ol_labels <- c("\u22121 SD", "Mean", "+1 SD")
pred_grid <- expand.grid(
CCS = ccs_seq,
OL = ol_vals,
Anggota = levels(data_full$Anggota)
)
pred_grid$OL_label <- factor(ol_labels[match(pred_grid$OL, ol_vals)],
levels = ol_labels
)
pred_grid$Anggota <- factor(pred_grid$Anggota, levels = levels(data_full$Anggota))
preds <- predict(mod_3way_anggota, newdata = pred_grid, se.fit = TRUE)
pred_grid$fit <- preds$fit
pred_grid$se <- preds$se.fit
pred_grid$ci_lo <- pred_grid$fit - 1.96 * pred_grid$se
pred_grid$ci_hi <- pred_grid$fit + 1.96 * pred_grid$se
# ---- 2. Annotasi N per panel ----
n_per_panel <- data_full |>
summarise(n = n(), .by = Anggota) |>
mutate(
Anggota = factor(Anggota, levels = levels(data_full$Anggota)),
label = paste0("italic(n) == ", n)
)
# ---- 3. Warna & linetype akademik ----
ol_colors <- c("\u22121 SD" = "#2166AC", "Mean" = "#4DAC26", "+1 SD" = "#D6604D")
ol_linetypes <- c("\u22121 SD" = "solid", "Mean" = "dashed", "+1 SD" = "dotdash")
# ---- 4. Plot ----
p_interact <- ggplot(
pred_grid,
aes(
x = CCS, y = fit,
color = OL_label,
linetype = OL_label,
fill = OL_label
)
) +
# Titik observasi asli (background)
geom_point(
data = data_full, aes(x = CCS, y = PEB),
inherit.aes = FALSE,
color = "grey60", alpha = 0.22, size = 0.9
) +
# 95% CI ribbon
geom_ribbon(aes(ymin = ci_lo, ymax = ci_hi), alpha = 0.14, color = NA) +
# Garis prediksi
geom_line(linewidth = 1.0) +
# Label N pojok kiri-atas tiap panel
geom_label(
data = n_per_panel,
aes(x = -Inf, y = Inf, label = label),
inherit.aes = FALSE, parse = TRUE,
hjust = -0.08, vjust = 1.3, size = 3.0,
color = "grey30", fill = "white",
label.size = 0.25, label.padding = unit(0.18, "lines")
) +
facet_wrap(~Anggota) +
scale_color_manual(values = ol_colors, name = "Keterlibatan Org. Lingkungan (OL)") +
scale_fill_manual(values = ol_colors, name = "Keterlibatan Org. Lingkungan (OL)") +
scale_linetype_manual(values = ol_linetypes, name = "Keterlibatan Org. Lingkungan (OL)") +
labs(
title = "Three-Way Interaction: Skeptisisme Perubahan Iklim \u00d7 Keterlibatan Organisasi \u00d7 Status Keanggotaan",
subtitle = "Perilaku Pro-Lingkungan (PEB) sebagai kriteria; prediktor CCS dan moderator OL & Anggota",
x = "Skeptisisme Perubahan Iklim (CCS)",
y = "Perilaku Pro-Lingkungan (PEB)",
caption = paste0(
"Garis = nilai prediksi model regresi PEB ~ CCS \u00d7 OL \u00d7 Anggota.\n",
"OL dikategorikan pada \u22121 SD, Mean, dan +1 SD; titik abu-abu = data observasi (N = ",
nrow(data_full), ")."
)
) +
theme_bw(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 11.5, hjust = 0.5),
plot.subtitle = element_text(
size = 9.0, hjust = 0.5, color = "grey35",
margin = margin(b = 8)
),
plot.caption = element_text(
size = 7.8, color = "grey50", hjust = 0,
margin = margin(t = 8)
),
axis.title = element_text(face = "bold", size = 9.5),
axis.text = element_text(size = 8.5),
strip.text = element_text(face = "bold", size = 11),
strip.background = element_rect(fill = "grey93", color = "grey70"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "grey92"),
legend.position = "bottom",
legend.title = element_text(face = "bold", size = 9),
legend.text = element_text(size = 9),
legend.key.width = unit(1.8, "cm")
)
print(p_interact)
```
---
## Distribusi Factor Scores per Subgrup Anggota
### Density Plot — Pengurus vs. Anggota Biasa
```{r}
#| label: density-subgroup
#| fig-width: 12
#| fig-height: 5
#| code-fold: true
#| code-summary: "Kode density per subgrup"
d_peng <- data_full[data_full$Anggota == "Pengurus", ]
d_biasa <- data_full[data_full$Anggota == "Anggota Biasa", ]
peb_low_p <- mean(d_peng$PEB, na.rm = TRUE) - 0.5 * sd(d_peng$PEB, na.rm = TRUE)
peb_hi_p <- mean(d_peng$PEB, na.rm = TRUE) + 0.5 * sd(d_peng$PEB, na.rm = TRUE)
ccs_low_p <- mean(d_peng$CCS, na.rm = TRUE) - 0.5 * sd(d_peng$CCS, na.rm = TRUE)
ccs_hi_p <- mean(d_peng$CCS, na.rm = TRUE) + 0.5 * sd(d_peng$CCS, na.rm = TRUE)
ol_low_p <- mean(d_peng$OL, na.rm = TRUE) - 0.5 * sd(d_peng$OL, na.rm = TRUE)
ol_hi_p <- mean(d_peng$OL, na.rm = TRUE) + 0.5 * sd(d_peng$OL, na.rm = TRUE)
peb_low_b <- mean(d_biasa$PEB, na.rm = TRUE) - 0.5 * sd(d_biasa$PEB, na.rm = TRUE)
peb_hi_b <- mean(d_biasa$PEB, na.rm = TRUE) + 0.5 * sd(d_biasa$PEB, na.rm = TRUE)
ccs_low_b <- mean(d_biasa$CCS, na.rm = TRUE) - 0.5 * sd(d_biasa$CCS, na.rm = TRUE)
ccs_hi_b <- mean(d_biasa$CCS, na.rm = TRUE) + 0.5 * sd(d_biasa$CCS, na.rm = TRUE)
ol_low_b <- mean(d_biasa$OL, na.rm = TRUE) - 0.5 * sd(d_biasa$OL, na.rm = TRUE)
ol_hi_b <- mean(d_biasa$OL, na.rm = TRUE) + 0.5 * sd(d_biasa$OL, na.rm = TRUE)
# Fungsi untuk mengategorisasi skor berdasarkan SD
categorize_score <- function(scores, labels = c("Rendah", "Sedang", "Tinggi")) {
mean_score <- mean(scores, na.rm = TRUE)
sd_score <- sd(scores, na.rm = TRUE)
lower_bound <- mean_score - 0.5 * sd_score
upper_bound <- mean_score + 0.5 * sd_score
ifelse(scores < lower_bound, labels[1],
ifelse(scores > upper_bound, labels[3], labels[2])
)
}
peb_n <- table(categorize_score(data_full$PEB))
ccs_n <- table(categorize_score(data_full$CCS))
ol_n <- table(categorize_score(data_full$OL))
par(mfrow = c(1, 3), mar = c(15, 4, 4, 2) + 0.5)
# --- Density 1: PEB per Subgroup ---
plot(density(data_full[data_full$Anggota == "Pengurus", "PEB"], na.rm = TRUE),
main = "Density PEB: Pengurus vs Anggota Biasa", xlab = "Skor",
xlim = c(-4, 3), ylim = c(0, 1.2), lwd = 2, col = "steelblue"
)
lines(density(data_full[data_full$Anggota == "Anggota Biasa", "PEB"], na.rm = TRUE),
col = "darkslategray", lwd = 2, lty = 2
)
abline(v = peb_low_p, col = "steelblue", lty = 3, lwd = 1.5)
abline(v = peb_hi_p, col = "steelblue", lty = 3, lwd = 1.5)
abline(v = peb_low_b, col = "darkslategray", lty = 3, lwd = 1.5)
abline(v = peb_hi_b, col = "darkslategray", lty = 3, lwd = 1.5)
op <- par(family = "mono")
legend("bottom",
inset = c(0, -0.57),
legend = c(
sprintf("%-42s", sprintf("Rendah (n=%3d): x < %5.2f", peb_n["Rendah"], peb_low_p)),
sprintf("%-42s", sprintf("Sedang (n=%3d): %5.2f s.d. %5.2f", peb_n["Sedang"], peb_low_p, peb_hi_p)),
sprintf("%-42s", sprintf("Tinggi (n=%3d): x > %5.2f", peb_n["Tinggi"], peb_hi_p)),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Pengurus", nrow(d_peng))),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Anggota Biasa", nrow(d_biasa))),
sprintf("%-42s", sprintf("Cutoff Pengurus : [%5.2f, %5.2f]", peb_low_p, peb_hi_p)),
sprintf("%-42s", sprintf("Cutoff Anggota Biasa : [%5.2f, %5.2f]", peb_low_b, peb_hi_b))
), fill = c("lightsteelblue", "steelblue", "darkslategray", NA, NA, NA, NA),
border = c("lightsteelblue", "steelblue", "darkslategray", NA, NA, NA, NA),
col = c(NA, NA, NA, "steelblue", "darkslategray", "steelblue", "darkslategray"),
lty = c(NA, NA, NA, 1, 2, 3, 3), lwd = c(NA, NA, NA, 2, 2, 1.5, 1.5),
cex = 0.80, bty = "n", xpd = TRUE
)
par(op)
# --- Density 2: CCS per Subgroup ---
plot(density(data_full[data_full$Anggota == "Pengurus", "CCS"], na.rm = TRUE),
main = "Density CCS: Pengurus vs Anggota Biasa", xlab = "Skor",
xlim = c(-4, 3), ylim = c(0, 1.2), lwd = 2, col = "coral"
)
lines(density(data_full[data_full$Anggota == "Anggota Biasa", "CCS"], na.rm = TRUE),
col = "darkred", lwd = 2, lty = 2
)
abline(v = ccs_low_p, col = "coral", lty = 3, lwd = 1.5)
abline(v = ccs_hi_p, col = "coral", lty = 3, lwd = 1.5)
abline(v = ccs_low_b, col = "darkred", lty = 3, lwd = 1.5)
abline(v = ccs_hi_b, col = "darkred", lty = 3, lwd = 1.5)
op <- par(family = "mono")
legend("bottom",
inset = c(0, -0.57),
legend = c(
sprintf("%-42s", sprintf("Rendah (n=%3d): x < %5.2f", ccs_n["Rendah"], ccs_low_p)),
sprintf("%-42s", sprintf("Sedang (n=%3d): %5.2f s.d. %5.2f", ccs_n["Sedang"], ccs_low_p, ccs_hi_p)),
sprintf("%-42s", sprintf("Tinggi (n=%3d): x > %5.2f", ccs_n["Tinggi"], ccs_hi_p)),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Pengurus", nrow(d_peng))),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Anggota Biasa", nrow(d_biasa))),
sprintf("%-42s", sprintf("Cutoff Pengurus : [%5.2f, %5.2f]", ccs_low_p, ccs_hi_p)),
sprintf("%-42s", sprintf("Cutoff Anggota Biasa : [%5.2f, %5.2f]", ccs_low_b, ccs_hi_b))
), fill = c("lightsalmon", "coral", "darkred", NA, NA, NA, NA),
border = c("lightsalmon", "coral", "darkred", NA, NA, NA, NA),
col = c(NA, NA, NA, "coral", "darkred", "coral", "darkred"),
lty = c(NA, NA, NA, 1, 2, 3, 3), lwd = c(NA, NA, NA, 2, 2, 1.5, 1.5),
cex = 0.80, bty = "n", xpd = TRUE
)
par(op)
# --- Density 3: OL per Subgroup ---
plot(density(data_full[data_full$Anggota == "Pengurus", "OL"], na.rm = TRUE),
main = "Density OL: Pengurus vs Anggota Biasa", xlab = "Skor",
xlim = c(-4, 3), ylim = c(0, 1.2), lwd = 2, col = "lightgreen"
)
lines(density(data_full[data_full$Anggota == "Anggota Biasa", "OL"], na.rm = TRUE),
col = "darkgreen", lwd = 2, lty = 2
)
abline(v = ol_low_p, col = "lightgreen", lty = 3, lwd = 1.5)
abline(v = ol_hi_p, col = "lightgreen", lty = 3, lwd = 1.5)
abline(v = ol_low_b, col = "darkgreen", lty = 3, lwd = 1.5)
abline(v = ol_hi_b, col = "darkgreen", lty = 3, lwd = 1.5)
op <- par(family = "mono")
legend("bottom",
inset = c(0, -0.57),
legend = c(
sprintf("%-42s", sprintf("Rendah (n=%3d): x < %5.2f", ol_n["Rendah"], ol_low_p)),
sprintf("%-42s", sprintf("Sedang (n=%3d): %5.2f s.d. %5.2f", ol_n["Sedang"], ol_low_p, ol_hi_p)),
sprintf("%-42s", sprintf("Tinggi (n=%3d): x > %5.2f", ol_n["Tinggi"], ol_hi_p)),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Pengurus", nrow(d_peng))),
sprintf("%-42s", sprintf("%-13s (n=%3d) [density]", "Anggota Biasa", nrow(d_biasa))),
sprintf("%-42s", sprintf("Cutoff Pengurus : [%5.2f, %5.2f]", ol_low_p, ol_hi_p)),
sprintf("%-42s", sprintf("Cutoff Anggota Biasa : [%5.2f, %5.2f]", ol_low_b, ol_hi_b))
), fill = c("palegreen", "lightgreen", "darkgreen", NA, NA, NA, NA),
border = c("palegreen", "lightgreen", "darkgreen", NA, NA, NA, NA),
col = c(NA, NA, NA, "lightgreen", "darkgreen", "lightgreen", "darkgreen"),
lty = c(NA, NA, NA, 1, 2, 3, 3), lwd = c(NA, NA, NA, 2, 2, 1.5, 1.5),
cex = 0.80, bty = "n", xpd = TRUE
)
par(op)
par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)
```
### Histogram per Subgrup
```{r}
#| label: histogram-subgroup
#| fig-width: 12
#| fig-height: 8
#| code-fold: true
#| code-summary: "Kode histogram per subgrup"
# Hitung n per kategori per subgroup
peb_n_p <- table(categorize_score(d_peng$PEB))
ccs_n_p <- table(categorize_score(d_peng$CCS))
ol_n_p <- table(categorize_score(d_peng$OL))
peb_n_b <- table(categorize_score(d_biasa$PEB))
ccs_n_b <- table(categorize_score(d_biasa$CCS))
ol_n_b <- table(categorize_score(d_biasa$OL))
# Helper fungsi plot histogram subgroup
plot_hist_sub <- function(vec, cutlow, cuthi, n_cat, colors3, judul, xmin, xmax) {
brk <- hist(vec, plot = FALSE, breaks = 20)
cols <- cut(brk$mids, breaks = c(-Inf, cutlow, cuthi, Inf), labels = colors3)
hist(vec,
main = judul, xlab = "Skor",
col = as.character(cols), border = "white", xlim = c(-4, 3), ylim = c(0, 150), breaks = 20
)
op <- par(family = "mono")
legend("bottom",
inset = c(0, -0.42),
legend = c(
sprintf("%-6s (n=%3d) [%6.2f, %5.2f]", "Rendah", n_cat["Rendah"], xmin, cutlow),
sprintf("%-6s (n=%3d) [%6.2f, %5.2f]", "Sedang", n_cat["Sedang"], cutlow, cuthi),
sprintf("%-6s (n=%3d) [%6.2f, %5.2f]", "Tinggi", n_cat["Tinggi"], cuthi, xmax)
), fill = colors3, cex = 0.85, bty = "n", xpd = TRUE
)
par(op)
}
par(mfrow = c(2, 3), mar = c(7, 4, 4, 2) + 0.5)
# --- Baris 1: Pengurus ---
plot_hist_sub(
d_peng$PEB, peb_low_p, peb_hi_p, peb_n_p,
c("lightsteelblue", "steelblue", "darkslategray"),
paste0("Distribusi PEB - Pengurus (n=", nrow(d_peng), ")"),
min(d_peng$PEB, na.rm = TRUE), max(d_peng$PEB, na.rm = TRUE)
)
plot_hist_sub(
d_peng$CCS, ccs_low_p, ccs_hi_p, ccs_n_p,
c("lightsalmon", "coral", "darkred"),
paste0("Distribusi CCS - Pengurus (n=", nrow(d_peng), ")"),
min(d_peng$CCS, na.rm = TRUE), max(d_peng$CCS, na.rm = TRUE)
)
plot_hist_sub(
d_peng$OL, ol_low_p, ol_hi_p, ol_n_p,
c("palegreen", "lightgreen", "darkgreen"),
paste0("Distribusi OL - Pengurus (n=", nrow(d_peng), ")"),
min(d_peng$OL, na.rm = TRUE), max(d_peng$OL, na.rm = TRUE)
)
# --- Baris 2: Anggota Biasa ---
plot_hist_sub(
d_biasa$PEB, peb_low_b, peb_hi_b, peb_n_b,
c("lightsteelblue", "steelblue", "darkslategray"),
paste0("Distribusi PEB - Anggota Biasa (n=", nrow(d_biasa), ")"),
min(d_biasa$PEB, na.rm = TRUE), max(d_biasa$PEB, na.rm = TRUE)
)
plot_hist_sub(
d_biasa$CCS, ccs_low_b, ccs_hi_b, ccs_n_b,
c("lightsalmon", "coral", "darkred"),
paste0("Distribusi CCS - Anggota Biasa (n=", nrow(d_biasa), ")"),
min(d_biasa$CCS, na.rm = TRUE), max(d_biasa$CCS, na.rm = TRUE)
)
plot_hist_sub(
d_biasa$OL, ol_low_b, ol_hi_b, ol_n_b,
c("palegreen", "lightgreen", "darkgreen"),
paste0("Distribusi OL - Anggota Biasa (n=", nrow(d_biasa), ")"),
min(d_biasa$OL, na.rm = TRUE), max(d_biasa$OL, na.rm = TRUE)
)
par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1)
```
### Statistik Deskriptif per Subgrup
```{r}
for (grp in levels(data_full$Anggota)) {
cat(sprintf("\n=== %s (n=%d) ===\n", grp, sum(data_full$Anggota == grp)))
sub <- data_full[data_full$Anggota == grp, c("PEB", "CCS", "OL")]
d <- psych::describe(sub, type = 2)
print(data.frame(
Variabel = rownames(d), Mean = round(d$mean, 3), SD = round(d$sd, 3),
Min = round(d$min, 3), Max = round(d$max, 3), check.names = FALSE
), row.names = FALSE)
}
```
### Analisis Subgrup
```{r}
#| code-fold: true
#| code-summary: "Regresi per subgrup"
cat("Subgroup: Pengurus\n")
summary(lm(PEB ~ CCS * OL, data = data_full[data_full$Anggota == "Pengurus", ]))
cat("\nSubgroup: Anggota Biasa\n")
summary(lm(PEB ~ CCS * OL, data = data_full[data_full$Anggota == "Anggota Biasa", ]))
```