Gabungan
# Ambil nilai total pre-test
df_pre = data_1 %>% select(NAMA, pre)
# Ambil nilai total post-test
df_post = data_2 %>%select(NAMA, post)
# Merge data pre- dan post-test
gab = inner_join(df_pre, df_post, by = "NAMA") %>% mutate (
gain_abs = post - pre,
ngain = (post - pre)/(10-pre),
ngain_kategori = case_when(
ngain > 0.7 ~ "Tinggi",
ngain >= 0.3 ~ "Sedang",
TRUE ~ "Rendah"
)
)
gab
## # A tibble: 14 × 6
## NAMA pre post gain_abs ngain ngain_kategori
## <chr> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Asyifa Putri F 3 4 1 0.143 Rendah
## 2 Dwi Sri Utami 8 10 2 1 Tinggi
## 3 Isnaeni Lailiyah 8 9 1 0.5 Sedang
## 4 Makhrozatul Asroh 8 7 -1 -0.5 Rendah
## 5 Mubarok 7 6 -1 -0.333 Rendah
## 6 Nurmiasih 8 8 0 0 Rendah
## 7 Retno Susati 8 9 1 0.5 Sedang
## 8 Sirun 9 9 0 0 Rendah
## 9 Siti Markhonah 8 9 1 0.5 Sedang
## 10 Sunandi 9 9 0 0 Rendah
## 11 Sunarti 8 7 -1 -0.5 Rendah
## 12 Wisnu 8 9 1 0.5 Sedang
## 13 Yasi Melinda 7 7 0 0 Rendah
## 14 Yono 9 10 1 1 Tinggi
library(dplyr)
library(tidyr)
# Membuat ringkasan statistik dalam bentuk format vertikal (tidy)
ringkasan_total = gab %>%
summarise(
# Statistik Pre-Test
Pre_Mean = mean(pre),
Pre_SD = sd(pre),
Pre_Median = median(pre),
Pre_Min = min(pre),
Pre_Max = max(pre),
# Statistik Post-Test
Post_Mean = mean(post),
Post_SD = sd(post),
Post_Median = median(post),
Post_Min = min(post),
Post_Max = max(post),
# Statistik Selisih (Gain)
Gain_Mean = mean(gain_abs),
Gain_SD = sd(gain_abs)
) %>%
# Mengubah format dari melebar (wide) menjadi memanjang ke bawah (long)
pivot_longer(cols = everything(), names_to = "Parameter", values_to = "Nilai") %>%
separate(Parameter, into = c("Tahap", "Statistik"), sep = "_") %>%
pivot_wider(names_from = Statistik, values_from = Nilai)
ringkasan_total
## # A tibble: 3 × 6
## Tahap Mean SD Median Min Max
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Pre 7.71 1.49 8 3 9
## 2 Post 8.07 1.69 9 4 10
## 3 Gain 0.357 0.929 NA NA NA
Analisis Persoal
# 1. Menghitung persentase jawaban benar tiap soal pada Pre-Test (data_1)
prop_pre = data_1 %>%
select(starts_with("soal_")) %>%
summarise(across(everything(), ~ mean(.x) * 100)) %>%
pivot_longer(everything(), names_to = "soal", values_to = "persen_pre")
# 2. Menghitung persentase jawaban benar tiap soal pada Post-Test (data_2)
prop_post = data_2 %>%
select(starts_with("soal_")) %>%
summarise(across(everything(), ~ mean(.x) * 100)) %>%
pivot_longer(everything(), names_to = "soal", values_to = "persen_post")
# 3. Menggabungkan kedua tabel dan menghitung selisih peningkatannya
analisis_per_soal = inner_join(prop_pre, prop_post, by = "soal") %>%
mutate(
selisih_peningkatan = persen_post - persen_pre
) %>%
arrange(desc(selisih_peningkatan)) # Mengurutkan dari peningkatan tertinggi
# Tampilkan hasil analisis per soal
print("--- ANALISIS PERSENTASE KETEPATAN TIAP SOAL (%) ---")
## [1] "--- ANALISIS PERSENTASE KETEPATAN TIAP SOAL (%) ---"
print(analisis_per_soal)
## # A tibble: 10 × 4
## soal persen_pre persen_post selisih_peningkatan
## <chr> <dbl> <dbl> <dbl>
## 1 soal_4 71.4 92.9 21.4
## 2 soal_2 57.1 71.4 14.3
## 3 soal_8 78.6 92.9 14.3
## 4 soal_6 42.9 50 7.14
## 5 soal_5 92.9 100 7.14
## 6 soal_1 100 100 0
## 7 soal_3 92.9 92.9 0
## 8 soal_7 85.7 85.7 0
## 9 soal_10 64.3 64.3 0
## 10 soal_9 85.7 57.1 -28.6
# Transformasi data ke format long untuk visualisasi
data_soal_long = analisis_per_soal %>%
pivot_longer(cols = c(persen_pre, persen_post),
names_to = "tahap",
values_to = "persentase") %>%
mutate(tahap = factor(tahap, levels = c("persen_pre", "persen_post"),
labels = c("Pre-Test", "Post-Test")))
# Membuat bar chart berdampingan
plot_soal = ggplot(data_soal_long, aes(x = reorder(soal, persentase), y = persentase, fill = tahap)) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.85) +
coord_flip() + # Membalik sumbu agar nama soal terbaca horizontal
theme_minimal() +
labs(title = "Perbandingan Persentase Jawaban Benar per Soal",
subtitle = "Evaluasi Proker KKN Berdasarkan Butir Soal",
x = "Nomor Soal", y = "Persentase Jawaban Benar (%)", fill = "Tahapan") +
scale_fill_brewer(palette = "Set1") +
theme(plot.title = element_text(face = "bold", size = 13),
axis.title = element_text(face = "bold"))
print(plot_soal)

library(ggplot2)
library(tidyr)
library(dplyr)
# A. Transformasi data ke format long khusus untuk skor total pre dan post
data_total_long = gab %>%
select(NAMA, pre, post) %>%
pivot_longer(cols = c(pre, post),
names_to = "tahap",
values_to = "skor") %>%
mutate(tahap = factor(tahap, levels = c("pre", "post"),
labels = c("Pre-Test", "Post-Test")))
# B. Hitung rata-rata untuk label di grafik
data_mean = data_total_long %>%
group_by(tahap) %>%
summarise(rata_rata = mean(skor))
# C. Membuat Bar Plot / Box Plot Perbandingan Rata-rata
plot_rerata = ggplot(data_total_long, aes(x = tahap, y = skor, fill = tahap)) +
geom_boxplot(alpha = 0.6, outlier.color = "red", outlier.shape = 16, width = 0.4) +
geom_jitter(width = 0.1, size = 2, alpha = 0.7) +
# Menambahkan titik rata-rata (mean point) agar jelas perbandingannya
stat_summary(fun = mean, geom = "point", shape = 18, size = 4, color = "blue") +
stat_summary(fun = mean, geom = "text", aes(label = round(..y.., 2)), vjust = -1.5, fontface = "bold") +
theme_minimal() +
labs(title = "Perbandingan Skor Pre-Test dan Post-Test",
subtitle = "Titik berlian biru menunjukkan nilai rata-rata (mean)",
x = "Tahapan", y = "Skor Total", fill = "Tahapan") +
scale_fill_brewer(palette = "Pastel2") +
theme(legend.position = "none",
plot.title = element_text(face = "bold", size = 13),
axis.title = element_text(face = "bold"))
print(plot_rerata)
## Warning: The dot-dot notation (`..y..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(y)` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# 1. Menyiapkan data individu dalam format long
data_individu_long = gab %>%
select(NAMA, pre, post) %>%
pivot_longer(cols = c(pre, post),
names_to = "tahap",
values_to = "skor") %>%
mutate(tahap = factor(tahap, levels = c("pre", "post"),
labels = c("Pre-Test", "Post-Test")))
# 2. Membuat Grafik Garis Individu (Slope Chart / Dumbbell Plot)
plot_individu = ggplot(data_individu_long, aes(x = tahap, y = skor, group = NAMA)) +
# Garis penghubung pergerakan nilai tiap responden
geom_line(aes(color = NAMA), linewidth = 1, alpha = 0.7) +
# Titik nilai untuk pre-test dan post-test
geom_point(aes(color = NAMA), size = 3) +
theme_minimal() +
labs(title = "Perbandingan Skor Pre-Test dan Post-Test Setiap Responden",
subtitle = "Melihat arah progress belajar individual peserta KKN",
x = "Tahapan Ujian", y = "Skor Total", color = "Nama Peserta") +
theme(plot.title = element_text(face = "bold", size = 13),
axis.title = element_text(face = "bold"),
legend.position = "right",
legend.text = element_text(size = 8))
print(plot_individu)

# Nilai perindividu
plot_bar_individu = ggplot(data_individu_long, aes(x = reorder(NAMA, skor), y = skor, fill = tahap)) +
geom_bar(stat = "identity", position = "dodge") +
coord_flip() + # Memutar agar nama responden terbaca jelas di sebelah kiri
theme_minimal() +
labs(title = "Grafik Batang Perbandingan Pre-Test vs Post-Test per Individu",
x = "Nama Responden", y = "Skor", fill = "Tahapan") +
scale_fill_brewer(palette = "Set2") +
theme(plot.title = element_text(face = "bold", size = 12),
axis.title = element_text(face = "bold"))
print(plot_bar_individu)

library(dplyr)
library(tidyr)
# 1. SUMMARY STATISTIK DESKRIPTIF (Mean, SD, Median, Min, Max)
summary_stat = gab %>%
summarise(
Pre_Mean = mean(pre),
Pre_SD = sd(pre),
Pre_Median = median(pre),
Pre_Min = min(pre),
Pre_Max = max(pre),
Post_Mean = mean(post),
Post_SD = sd(post),
Post_Median= median(post),
Post_Min = min(post),
Post_Max = max(post)
) %>%
pivot_longer(cols = everything(), names_to = "Parameter", values_to = "Nilai") %>%
separate(Parameter, into = c("Tahap", "Statistik"), sep = "_") %>%
pivot_wider(names_from = Statistik, values_from = Nilai)
print("--- 1. SUMMARY STATISTIK DESKRIPTIF ---")
## [1] "--- 1. SUMMARY STATISTIK DESKRIPTIF ---"
print(summary_stat)
## # A tibble: 2 × 6
## Tahap Mean SD Median Min Max
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Pre 7.71 1.49 8 3 9
## 2 Post 8.07 1.69 9 4 10
# 2. PAIRED SAMPLES CORRELATION (Korelasi Berpasangan)
korelasi_paired = cor.test(gab$pre, gab$post, method = "pearson")
print("--- 2. PAIRED SAMPLES CORRELATION ---")
## [1] "--- 2. PAIRED SAMPLES CORRELATION ---"
print(korelasi_paired)
##
## Pearson's product-moment correlation
##
## data: gab$pre and gab$post
## t = 5.2744, df = 12, p-value = 0.0001964
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.5485353 0.9466179
## sample estimates:
## cor
## 0.8358482
# 3. PAIRED SAMPLE T-TEST LENGKAP (Two-tailed / Dua Arah)
# Menggunakan paired = TRUE dan alternative = "two.sided" untuk melihat Sig. (2-tailed)
hasil_ttest_lengkap = t.test(gab$post, gab$pre, paired = TRUE, alternative = "two.sided")
print("--- 3. HASIL PAIRED SAMPLE T-TEST ---")
## [1] "--- 3. HASIL PAIRED SAMPLE T-TEST ---"
print(hasil_ttest_lengkap)
##
## Paired t-test
##
## data: gab$post and gab$pre
## t = 1.4388, df = 13, p-value = 0.1739
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## -0.1791203 0.8934060
## sample estimates:
## mean difference
## 0.3571429