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", …
Pada bagian ini dievaluasi proporsi kelulusan peserta Pelatihan Fundamental Statistika terhadap target minimal perusahaan sebesar 80% (\(p_0 = 0{,}80\)).
# 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)| 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%).
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)| 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.
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)| 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).
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)| 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 |
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()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.
Bagian ini menguji apakah sebaran frekuensi pertanyaan layanan akademik saat ini masih konsisten dengan proporsi historis institusi.
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)| 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%) |
chisq.test()) & Rincian Diagnostik#>
#> 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)| 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.
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()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.