# Uji Normalitas Kolmogorov-Smirnov
# Data nilai ujian matematika kelas 6 SD (setelah perubahan)

nama  <- c("A","B","C","D","F","G","H","I","J","K","L","M","N","O","P","Q")
nilai <- c(60, 50, 50, 60, 60, 60, 70, 70, 70, 70, 60, 60, 80, 90, 90, 80)
data  <- data.frame(Nama = nama, Nilai = nilai)
print(data)
##    Nama Nilai
## 1     A    60
## 2     B    50
## 3     C    50
## 4     D    60
## 5     F    60
## 6     G    60
## 7     H    70
## 8     I    70
## 9     J    70
## 10    K    70
## 11    L    60
## 12    M    60
## 13    N    80
## 14    O    90
## 15    P    90
## 16    Q    80
n     <- length(nilai)
rata2 <- mean(nilai)
sb    <- sd(nilai)
cat("n =", n, "| rata-rata =", rata2, "| simpangan baku =", round(sb, 3), "\n")
## n = 16 | rata-rata = 67.5 | simpangan baku = 12.383
# Perhitungan manual
x    <- sort(unique(nilai))
f    <- as.vector(table(nilai))
Fn   <- cumsum(f) / n              # Fn(x)
Fn_  <- c(0, head(Fn, -1))         # Fn(x-) (nilai sebelumnya)
Z    <- (x - rata2) / sb
Fx   <- pnorm(Z)                   # F(x) = Phi(Z)
sel1 <- abs(Fn - Fx)
sel2 <- abs(Fn_ - Fx)

tabel <- data.frame(x, f, Fn, Fn_, Z = round(Z, 4), Fx = round(Fx, 4),
                    sel1 = round(sel1, 4), sel2 = round(sel2, 4))
print(tabel)
##    x f    Fn   Fn_       Z     Fx   sel1   sel2
## 1 50 2 0.125 0.000 -1.4133 0.0788 0.0462 0.0788
## 2 60 6 0.500 0.125 -0.6057 0.2724 0.2276 0.1474
## 3 70 4 0.750 0.500  0.2019 0.5800 0.1700 0.0800
## 4 80 2 0.875 0.750  1.0095 0.8436 0.0314 0.0936
## 5 90 2 1.000 0.875  1.8170 0.9654 0.0346 0.0904
D <- max(sel1, sel2)
cat("D hitung =", round(D, 4), "\n")
## D hitung = 0.2276
# Nilai kritis (n = 16, alpha = 5%)
D_tabel <- 0.327
cat("D tabel  =", D_tabel, "\n")
## D tabel  = 0.327
# Uji dengan fungsi bawaan R
hasil <- suppressWarnings(ks.test(nilai, "pnorm", mean = rata2, sd = sb))
print(hasil)
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  nilai
## D = 0.22764, p-value = 0.3783
## alternative hypothesis: two-sided
cat("p-value =", round(hasil$p.value, 4), "\n")
## p-value = 0.3783
# Keputusan
alpha <- 0.05
if (D < D_tabel && hasil$p.value > alpha) {
  cat("D < nilai kritis dan p-value > alpha -> H0 gagal ditolak: data berdistribusi normal\n")
} else {
  cat("D > nilai kritis atau p-value < alpha -> H0 ditolak: data tidak berdistribusi normal\n")
}
## D < nilai kritis dan p-value > alpha -> H0 gagal ditolak: data berdistribusi normal