1 Persiapan Data & Lingkungan Kerja

Analisis data dilakukan menggunakan dataset Data_Simulasi_Tugas_Pertemuan2.xlsx. Seluruh proses mulai dari manipulasi data, estimasi titik, pengujian hipotesis, hingga visualisasi dilakukan langsung menggunakan sintaks R.

excel_file <- "Data_Simulasi_Tugas_Pertemuan2.xlsx"

# Membaca data Bagian A dan Bagian B
df_proporsi <- read_excel(excel_file, sheet = "Data_Proporsi", skip = 4)
df_gof_raw  <- read_excel(excel_file, sheet = "Data_GOF", skip = 5)

# Menyiapkan data Bagian B (4 baris kategori layanan akademik)
df_gof <- df_gof_raw[1:4, 1:3]
colnames(df_gof) <- c("Kategori", "Proporsi_Historis", "Frekuensi_Observasi")
df_gof$Proporsi_Historis   <- as.numeric(df_gof$Proporsi_Historis)
df_gof$Frekuensi_Observasi <- as.numeric(df_gof$Frekuensi_Observasi)

# Struktur data
glimpse(df_proporsi)
#> Rows: 40
#> Columns: 3
#> $ No                 <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
#> $ Peserta            <chr> "Peserta 1", "Peserta 2", "Peserta 3", "Peserta 4",…
#> $ `Status Kelulusan` <chr> "Lulus", "Lulus", "Lulus", "Lulus", "Tidak Lulus", …

2 Bagian A: Pendugaan Parameter & Uji Satu Proporsi

Pada bagian ini dievaluasi proporsi kelulusan peserta Pelatihan Fundamental Statistika terhadap target minimal perusahaan sebesar 80% (\(p_0 = 0{,}80\)).

2.1 Eksplorasi Data & Estimasi Titik (\(\hat{p}\))

# Tabel frekuensi status kelulusan
tab_kelulusan <- table(df_proporsi$`Status Kelulusan`)

n_total <- sum(tab_kelulusan)
n_lulus <- as.numeric(tab_kelulusan["Lulus"])
n_gagal <- as.numeric(tab_kelulusan["Tidak Lulus"])
p_hat   <- n_lulus / n_total

df_tabel_a <- data.frame(
  `Status Kelulusan` = c("Lulus", "Tidak Lulus", "Total"),
  `Frekuensi (n)`   = c(n_lulus, n_gagal, n_total),
  `Proporsi Sampel` = c(round(p_hat, 4), round(n_gagal / n_total, 4), 1.0000),
  `Persentase (%)`  = c(
    sprintf("%.2f%%", p_hat * 100),
    sprintf("%.2f%%", (n_gagal / n_total) * 100),
    "100.00%"
  ),
  check.names = FALSE
)

kable(df_tabel_a, align = c("l", "c", "c", "c"), caption = "Distribusi Frekuensi Kelulusan Peserta") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Distribusi Frekuensi Kelulusan Peserta
Status Kelulusan Frekuensi (n) Proporsi Sampel Persentase (%)
Lulus 29 0.725 72.50%
Tidak Lulus 11 0.275 27.50%
Total 40 1.000 100.00%

Dari sampel \(n = 40\) peserta, diperoleh \(x = 29\) peserta yang dinyatakan lulus, sehingga estimasi proporsi sampel adalah \(\hat{p} = \frac{29}{40} = 0{,}7250\) (72,50%).

2.2 Selang Kepercayaan 95% Proporsi

Selang kepercayaan 95% dihitung menggunakan pendekatan Wald, Wilson Score, dan Clopper-Pearson Exact langsung melalui fungsi R:

alpha <- 0.05
z_crit <- qnorm(1 - alpha / 2)

# 1. Metode Wald
se_wald <- sqrt(p_hat * (1 - p_hat) / n_total)
me_wald <- z_crit * se_wald
ci_wald <- c(p_hat - me_wald, p_hat + me_wald)

# 2. Wilson Score (prop.test)
ci_wilson <- prop.test(x = n_lulus, n = n_total, conf.level = 0.95, correct = FALSE)$conf.int

# 3. Clopper-Pearson Exact (binom.test)
ci_exact <- binom.test(x = n_lulus, n = n_total, conf.level = 0.95)$conf.int

df_ci <- data.frame(
  Metode = c("Wald (Asimtotik)", "Wilson Score (prop.test)", "Clopper-Pearson (binom.test)"),
  `Batas Bawah` = round(c(ci_wald[1], ci_wilson[1], ci_exact[1]), 4),
  `Batas Atas`  = round(c(ci_wald[2], ci_wilson[2], ci_exact[2]), 4),
  `Selang Persentase` = c(
    sprintf("[%.2f%%, %.2f%%]", ci_wald[1]*100, ci_wald[2]*100),
    sprintf("[%.2f%%, %.2f%%]", ci_wilson[1]*100, ci_wilson[2]*100),
    sprintf("[%.2f%%, %.2f%%]", ci_exact[1]*100, ci_exact[2]*100)
  ),
  `Lebar Selang` = round(c(ci_wald[2]-ci_wald[1], ci_wilson[2]-ci_wilson[1], ci_exact[2]-ci_exact[1]), 4),
  check.names = FALSE
)

kable(df_ci, align = c("l", "c", "c", "c", "c"), caption = "Perbandingan Selang Kepercayaan 95% Proporsi Kelulusan") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Perbandingan Selang Kepercayaan 95% Proporsi Kelulusan
Metode Batas Bawah Batas Atas Selang Persentase Lebar Selang
Wald (Asimtotik) 0.5866 0.8634 [58.66%, 86.34%] 0.2767
Wilson Score (prop.test) 0.5717 0.8389 [57.17%, 83.89%] 0.2673
Clopper-Pearson (binom.test) 0.5611 0.8540 [56.11%, 85.40%] 0.2929

Interpretasi: Dengan tingkat kepercayaan 95%, proporsi sebenarnya peserta yang lulus berada pada rentang 58,66% hingga 86,34% (metode Wald) atau 56,15% hingga 85,40% (metode Eksak). Target perusahaan sebesar 80% masih berada di dalam selang ini.

2.3 Pemeriksaan Syarat Kecukupan Sampel (Rule of 10)

Untuk menentukan apakah uji Z proporsi valid atau harus menggunakan uji eksak binomial, dilakukan pemeriksaan kriteria \(n p_0 \ge 10\) dan \(n(1 - p_0) \ge 10\) dengan target minimal \(p_0 = 0{,}80\):

p0 <- 0.80
np0 <- n_total * p0
nq0 <- n_total * (1 - p0)

df_eval_asumsi <- data.frame(
  Kriteria = c("Harapan Sukses: n * p0", "Harapan Gagal: n * (1 - p0)"),
  Perhitungan = c(paste(n_total, "×", p0, "=", np0), paste(n_total, "×", 1-p0, "=", nq0)),
  Batas = c("≥ 10", "≥ 10"),
  Status = c(ifelse(np0 >= 10, "Terpenuhi", "Tidak Terpenuhi"),
             ifelse(nq0 >= 10, "Terpenuhi", "Tidak Terpenuhi"))
)

kable(df_eval_asumsi, align = c("l", "c", "c", "c"), caption = "Evaluasi Syarat Pendekatan Sebaran Normal") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Evaluasi Syarat Pendekatan Sebaran Normal
Kriteria Perhitungan Batas Status
Harapan Sukses: n * p0 40 × 0.8 = 32 ≥ 10 Terpenuhi
Harapan Gagal: n * (1 - p0) 40 × 0.2 = 8 ≥ 10 Tidak Terpenuhi

Catatan: Karena nilai harapan kegagalan \(n(1 - p_0) = 8 < 10\), maka syarat kecukupan sampel untuk pendekatan sebaran normal tidak terpenuhi. Oleh karena itu, metode pengujian utama yang valid adalah Uji Eksak Binomial (Exact Binomial Test).

2.4 Pengujian Hipotesis Satu Sisi Kiri

Formulasi hipotesis: - \(H_0: p \ge 0{,}80\) (Tingkat kelulusan memenuhi target minimal 80%) - \(H_1: p < 0{,}80\) (Tingkat kelulusan aktual berada di bawah target 80%) - Taraf signifikansi: \(\alpha = 0{,}05\).

# 1. Uji Eksak Binomial (Metode Terpilih)
uji_eksak <- binom.test(x = n_lulus, n = n_total, p = p0, alternative = "less")
uji_eksak
#> 
#>  Exact binomial test
#> 
#> data:  n_lulus and n_total
#> number of successes = 29, number of trials = 40, p-value = 0.1608
#> alternative hypothesis: true probability of success is less than 0.8
#> 95 percent confidence interval:
#>  0.0000000 0.8374785
#> sample estimates:
#> probability of success 
#>                  0.725
# 2. Uji Z Proporsi Asimtotik (Sebagai Komparasi)
uji_prop <- prop.test(x = n_lulus, n = n_total, p = p0, alternative = "less", correct = FALSE)
uji_prop
#> 
#>  1-sample proportions test without continuity correction
#> 
#> data:  n_lulus out of n_total, null probability p0
#> X-squared = 1.4063, df = 1, p-value = 0.1178
#> alternative hypothesis: true p is less than 0.8
#> 95 percent confidence interval:
#>  0.000000 0.824034
#> sample estimates:
#>     p 
#> 0.725
stat_z <- (p_hat - p0) / sqrt(p0 * (1 - p0) / n_total)

df_hasil_a <- data.frame(
  `Metode Pengujian` = c("Uji Eksak Binomial (Utama)", "Uji Z Proporsi Asimtotik (Komparasi)"),
  `Statistik Hitung` = c(paste("x =", n_lulus), sprintf("Z = %.4f", stat_z)),
  `P-Value`          = c(round(uji_eksak$p.value, 4), round(uji_prop$p.value, 4)),
  `Alpha`            = c(0.05, 0.05),
  `Keputusan`        = c(
    ifelse(uji_eksak$p.value < 0.05, "Tolak H0", "Gagal Menolak H0"),
    ifelse(uji_prop$p.value < 0.05, "Tolak H0", "Gagal Menolak H0")
  ),
  check.names = FALSE
)

kable(df_hasil_a, align = c("l", "c", "c", "c", "c"), caption = "Ringkasan Hasil Pengujian Hipotesis Bagian A") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Ringkasan Hasil Pengujian Hipotesis Bagian A
Metode Pengujian Statistik Hitung P-Value Alpha Keputusan
Uji Eksak Binomial (Utama) x = 29 0.1608 0.05 Gagal Menolak H0
Uji Z Proporsi Asimtotik (Komparasi) Z = -1.1859 0.1178 0.05 Gagal Menolak H0

2.5 Visualisasi Peluang Binomial di Bawah \(H_0\)

k_vals <- 15:40
df_plot_a <- data.frame(
  k = k_vals,
  Prob = dbinom(k_vals, size = n_total, prob = p0),
  Status = ifelse(k_vals <= n_lulus, "Wilayah Sampel (k ≤ 29)", "Lainnya")
)

ggplot(df_plot_a, aes(x = k, y = Prob, fill = Status)) +
  geom_col(width = 0.65, color = "#333333", linewidth = 0.3) +
  geom_vline(xintercept = 29.5, linetype = "dashed", color = "#c0392b", linewidth = 0.8) +
  annotate(
    "text", x = 29.2, y = max(df_plot_a$Prob) * 0.9,
    label = paste0("x = 29\np-value = ", round(uji_eksak$p.value, 4)),
    hjust = 1, size = 3.5, fontface = "bold", color = "#c0392b"
  ) +
  scale_fill_manual(values = c("Wilayah Sampel (k ≤ 29)" = "#e74c3c", "Lainnya" = "#3498db")) +
  scale_x_continuous(breaks = seq(15, 40, 5)) +
  labs(
    title = "Distribusi Binomial B(n = 40, p = 0.80) di Bawah H0",
    subtitle = "Nilai p-value (0.1608 > 0.05) menunjukkan bahwa sampel k <= 29 masih berada dalam variasi acak wajar",
    x = "Jumlah Peserta Lulus (k)",
    y = "Peluang P(X = k)",
    fill = "Kategori:"
  ) +
  theme_academic()

2.6 Kesimpulan Bagian A

Pada taraf signifikansi \(\alpha = 0{,}05\), hasil Uji Eksak Binomial menghasilkan \(p\text{-value} = 0{,}1608 > 0{,}05\), sehingga diputuskan Gagal Menolak \(H_0\).

Secara praktis, tidak terdapat bukti statistik yang cukup untuk menyatakan bahwa tingkat kelulusan pelatihan berada di bawah target 80%. Meskipun pada sampel yang diamati persentase kelulusan adalah 72,50%, selisih tersebut belum signifikan secara statistik dan masih berada dalam rentang variasi sampling normal.


3 Bagian B: Uji Kebaikan Suai Chi-Square (Goodness-of-Fit)

Bagian ini menguji apakah sebaran frekuensi pertanyaan layanan akademik saat ini masih konsisten dengan proporsi historis institusi.

3.1 Formulasi Hipotesis & Data Observasi

  • \(H_0: p_1 = 0{,}40, \quad p_2 = 0{,}30, \quad p_3 = 0{,}20, \quad p_4 = 0{,}10\)
    (Distribusi jenis pertanyaan terbaru masih sesuai dengan proporsi historis).
  • \(H_1: \text{Minimal ada satu } i \text{ di mana } p_i \ne p_{i0}\)
    (Distribusi jenis pertanyaan terbaru sudah tidak sesuai lagi dengan proporsi historis).
  • Taraf signifikansi: \(\alpha = 0{,}05\).
O_vec  <- df_gof$Frekuensi_Observasi
names(O_vec) <- df_gof$Kategori
p_hist <- df_gof$Proporsi_Historis
N_total_b <- sum(O_vec)

df_tabel_b <- data.frame(
  Kategori = names(O_vec),
  `Proporsi Historis` = sprintf("%.2f (%.0f%%)", p_hist, p_hist * 100),
  `Frekuensi Observasi (O)` = O_vec,
  `Proporsi Sampel` = sprintf("%.4f (%.2f%%)", O_vec / N_total_b, (O_vec / N_total_b) * 100),
  check.names = FALSE
)

kable(df_tabel_b, align = c("l", "c", "c", "c"), caption = "Frekuensi Observasi dan Proporsi Historis Layanan Akademik") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Frekuensi Observasi dan Proporsi Historis Layanan Akademik
Kategori Proporsi Historis Frekuensi Observasi (O) Proporsi Sampel
Akademik Akademik 0.40 (40%) 70 0.4667 (46.67%)
Administrasi Administrasi 0.30 (30%) 40 0.2667 (26.67%)
Teknis Sistem Teknis Sistem 0.20 (20%) 25 0.1667 (16.67%)
Lainnya Lainnya 0.10 (10%) 15 0.1000 (10.00%)

3.2 Eksekusi Uji Chi-Square (chisq.test()) & Rincian Diagnostik

hasil_chisq <- chisq.test(x = O_vec, p = p_hist)
hasil_chisq
#> 
#>  Chi-squared test for given probabilities
#> 
#> data:  O_vec
#> X-squared = 3.0556, df = 3, p-value = 0.3831
# Ekstraksi komponen uji
df_b       <- as.numeric(hasil_chisq$parameter)
chi_hitung <- as.numeric(hasil_chisq$statistic)
pval_b     <- as.numeric(hasil_chisq$p.value)
chi_kritis <- qchisq(1 - alpha, df = df_b)

# Tabel diagnostik komponen Chi-Square
E_vec       <- hasil_chisq$expected
selisih     <- O_vec - E_vec
kontribusi  <- (selisih)^2 / E_vec
std_res     <- hasil_chisq$stdres

df_diagnostik_b <- data.frame(
  Kategori = names(O_vec),
  `Observasi (O)` = O_vec,
  `Harapan (E)`   = round(E_vec, 2),
  `Selisih (O - E)` = round(selisih, 2),
  `Kontribusi (O-E)²/E` = round(kontribusi, 4),
  `Residual Terstandarisasi` = round(std_res, 4),
  `Asumsi E ≥ 5` = ifelse(E_vec >= 5, "Terpenuhi", "Tidak Terpenuhi"),
  check.names = FALSE
)

kable(df_diagnostik_b, align = c("l", "c", "c", "c", "c", "c", "c"), caption = "Rincian Diagnostik Komponen Chi-Square") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Rincian Diagnostik Komponen Chi-Square
Kategori Observasi (O) Harapan (E) Selisih (O - E) Kontribusi (O-E)²/E Residual Terstandarisasi Asumsi E ≥ 5
Akademik Akademik 70 60 10 1.6667 1.6667 Terpenuhi
Administrasi Administrasi 40 45 -5 0.5556 -0.8909 Terpenuhi
Teknis Sistem Teknis Sistem 25 30 -5 0.8333 -1.0206 Terpenuhi
Lainnya Lainnya 15 15 0 0.0000 0.0000 Terpenuhi

Evaluasi Asumsi: Nilai frekuensi harapan terkecil adalah \(E_4 = 15{,}00 \ge 5\). Seluruh nilai harapan memenuhi syarat minimum \(\ge 5\), sehingga asumsi uji kebaikan suai Chi-Square terpenuhi secara valid.

3.3 Visualisasi Distribusi Chi-Square (\(df = 3\))

x_vals <- seq(0, 15, length.out = 400)
df_chisq_plot <- data.frame(
  x = x_vals,
  Density = dchisq(x_vals, df = df_b)
)

ggplot(df_chisq_plot, aes(x = x, y = Density)) +
  geom_line(color = "#2c3e50", linewidth = 0.8) +
  geom_ribbon(
    data = subset(df_chisq_plot, x >= chi_kritis),
    aes(ymax = Density, ymin = 0),
    fill = "#e74c3c", alpha = 0.35
  ) +
  geom_vline(xintercept = chi_kritis, linetype = "dashed", color = "#c0392b", linewidth = 0.8) +
  annotate(
    "text", x = chi_kritis + 0.25, y = 0.12,
    label = paste0("Nilai Kritis (α = 0.05)\nχ² = ", round(chi_kritis, 4)),
    hjust = 0, size = 3.3, fontface = "bold", color = "#c0392b"
  ) +
  geom_vline(xintercept = chi_hitung, color = "#27ae60", linewidth = 1) +
  annotate(
    "text", x = chi_hitung - 0.25, y = 0.18,
    label = paste0("χ² Hitung = ", round(chi_hitung, 4), "\n(Daerah Terima H0)"),
    hjust = 1, size = 3.3, fontface = "bold", color = "#27ae60"
  ) +
  labs(
    title = paste0("Kurva Distribusi Chi-Square (df = ", df_b, ")"),
    subtitle = paste0("Statistik hitung (3.0556) < Nilai kritis (7.8147) | P-value = ", round(pval_b, 4)),
    x = "Statistik Chi-Square (χ²)",
    y = "Kerapatan (Density)"
  ) +
  theme_academic()

3.4 Kesimpulan Bagian B

Berdasarkan Uji Kebaikan Suai Chi-Square pada taraf signifikansi \(\alpha = 0{,}05\), diperoleh \(\chi^2_{\text{hitung}} = 3{,}0556 < \chi^2_{\text{kritis}} = 7{,}8147\) dengan \(p\text{-value} = 0{,}3831 > 0{,}05\). Oleh karena itu, keputusannya adalah Gagal Menolak \(H_0\).

Secara praktis, distribusi pertanyaan layanan akademik saat ini masih konsisten dengan proporsi historis yang ditetapkan. Perbedaan frekuensi yang teramati pada sampel masih berada dalam batas variasi acak wajar.