library(tidyverse)  
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)     
library(ggpubr)     
library(effsize)
library(corrplot)
## corrplot 0.95 loaded
library(dplyr)
library(ggplot2)
data= read_excel("C:\\Users\\MUTHI'AH IFFA\\Downloads\\Pre- & Post-test Akuatani.xlsx")
str(data)
## tibble [14 × 13] (S3: tbl_df/tbl/data.frame)
##  $ No     : num [1:14] 1 2 3 4 5 6 7 8 9 10 ...
##  $ NAMA   : chr [1:14] "Asyifa Putri F" "Dwi Sri Utami" "Isnaeni Lailiyah" "Makhrozatul Asroh" ...
##  $ soal_1 : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
##  $ soal_2 : num [1:14] 0 1 0 0 0 1 1 1 0 1 ...
##  $ soal_3 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_4 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_5 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_6 : num [1:14] 0 0 0 1 0 0 0 0 1 0 ...
##  $ soal_7 : num [1:14] 1 1 1 1 0 1 1 1 0 1 ...
##  $ soal_8 : num [1:14] 0 1 1 1 1 0 0 1 1 1 ...
##  $ soal_9 : num [1:14] 1 0 1 1 1 1 1 1 1 1 ...
##  $ soal_10: num [1:14] 0 1 1 0 1 1 1 1 1 1 ...
##  $ pre    : num [1:14] 3 8 8 8 7 8 8 9 8 9 ...
data_1= read_excel("C:\\Users\\MUTHI'AH IFFA\\Downloads\\Pre- & Post-test Akuatani.xlsx", sheet = "pre")
View(data_1)
str(data_1)
## tibble [14 × 13] (S3: tbl_df/tbl/data.frame)
##  $ No     : num [1:14] 1 2 3 4 5 6 7 8 9 10 ...
##  $ NAMA   : chr [1:14] "Asyifa Putri F" "Dwi Sri Utami" "Isnaeni Lailiyah" "Makhrozatul Asroh" ...
##  $ soal_1 : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
##  $ soal_2 : num [1:14] 0 1 0 0 0 1 1 1 0 1 ...
##  $ soal_3 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_4 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_5 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_6 : num [1:14] 0 0 0 1 0 0 0 0 1 0 ...
##  $ soal_7 : num [1:14] 1 1 1 1 0 1 1 1 0 1 ...
##  $ soal_8 : num [1:14] 0 1 1 1 1 0 0 1 1 1 ...
##  $ soal_9 : num [1:14] 1 0 1 1 1 1 1 1 1 1 ...
##  $ soal_10: num [1:14] 0 1 1 0 1 1 1 1 1 1 ...
##  $ pre    : num [1:14] 3 8 8 8 7 8 8 9 8 9 ...
data_2= read_excel("C:\\Users\\MUTHI'AH IFFA\\Downloads\\Pre- & Post-test Akuatani.xlsx", sheet = "post")
View(data_2)
str(data_2)
## tibble [14 × 13] (S3: tbl_df/tbl/data.frame)
##  $ No     : num [1:14] 1 2 3 4 5 6 7 8 9 10 ...
##  $ NAMA   : chr [1:14] "Asyifa Putri F" "Dwi Sri Utami" "Isnaeni Lailiyah" "Makhrozatul Asroh" ...
##  $ soal_1 : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
##  $ soal_2 : num [1:14] 1 1 0 0 1 1 1 1 1 1 ...
##  $ soal_3 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_4 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_5 : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
##  $ soal_6 : num [1:14] 0 1 0 1 0 0 0 1 1 0 ...
##  $ soal_7 : num [1:14] 1 1 1 1 0 0 1 1 1 1 ...
##  $ soal_8 : num [1:14] 0 1 1 1 1 1 1 1 1 1 ...
##  $ soal_9 : num [1:14] 0 1 1 0 0 1 1 1 0 1 ...
##  $ soal_10: num [1:14] 0 1 1 0 0 1 1 0 1 1 ...
##  $ post   : num [1:14] 4 10 9 7 6 8 9 9 9 9 ...

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

Uji Normalitas

# H0: Data selisih berdistribusi normal (p-value > 0.05)
# H1: Data selisih tidak berdistribusi normal (p-value <= 0.05)
shapiro = shapiro.test(gab$gain_abs)
shapiro
## 
##  Shapiro-Wilk normality test
## 
## data:  gab$gain_abs
## W = 0.87449, p-value = 0.04854
if(shapiro$p.value > 0.05) {
  cat("KESIMPULAN: Data Normal (Gunakan Paired t-Test)")
  
  # Uji Paired t-Test (One-tailed: alternative = "greater" karena kita menguji peningkatan post > pre)
  hasil_ttest = t.test(gab$post, gab$pre, 
                        paired = TRUE, 
                        alternative = "greater")
  print(hasil_ttest)
  
} else {
  cat("KESIMPULAN: Data Tidak Normal (Gunakan Wilcoxon Signed-Rank Test)")
  
  # Uji Wilcoxon Test (One-tailed)
  hasil_wilcoxon = wilcox.test(gab$post, gab$pre, 
                                paired = TRUE, 
                                alternative = "greater",
                                exact = FALSE)
  print(hasil_wilcoxon)
}
## KESIMPULAN: Data Tidak Normal (Gunakan Wilcoxon Signed-Rank Test)
##  Wilcoxon signed rank test with continuity correction
## 
## data:  gab$post and gab$pre
## V = 40, p-value = 0.09155
## alternative hypothesis: true location shift is greater than 0

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