# ==============================================================================
# TEMPLATE JAWABAN KUIS
# Komputasi Statistika, Kelas D
# Prodi S1 Statistika FSAD ITS - Semester Genap 2025/2026
# Kamis, 12 Maret 2026
# ==============================================================================
# Nama  : Desy Adverina Faza
# NRP   : 5003251148
# Kelas : D
# ==============================================================================


# ==============================================================================
# Soal 1 [TOTAL 50 poin] - Winsorized Mean
# ==============================================================================

# Data
x <- c(12, 45, 52, 58, 61, 63, 67, 70, 72, 75, 78, 82, 88, 95, 310)
print(x)
##  [1]  12  45  52  58  61  63  67  70  72  75  78  82  88  95 310
urut = function(x){
  n = length(x)
  temp = NULL
  for(i in 1:(n-1)){
    for (j in (i+1):n){
      if(x[j] < x[i]){
        temp = x[i]
        x[i] = x[j]
        x[j] = temp
      }
    }
  }
  return(x)
}
urut(x)
##  [1]  12  45  52  58  61  63  67  70  72  75  78  82  88  95 310
# --- [a] Buatlah fungsi winsorized_mean(x, alpha) ---

winsorized_mean <- function(x, alpha) {
  
  # urutkan data
  x <- urut(x)
  n <- length(x)
  k <- (n * alpha)
  y <- x
  sum <- 0
  
  for(i in 1:n){
    if(i<=k){
      y[i] = x[k+1]
    }else if(i <= (n-k)){
      y[i] = x[i]
    }else{
      y[i] = x[n-k]
    }
    sum = sum + y[i]
  }
  
  
  mean_manual <- sum / n
  
  return(mean_manual)
}
winsorized_mean(x,0)
## [1] 81.86667
winsorized_mean(x,0.2)
## [1] 69.73333
# --- [b] Hitung ordinary mean (alpha=0) dan Winsorized mean 20% (alpha=0.2) ---

# Ordinary mean
winsorized_mean(x,0)
## [1] 81.86667
# Winsorized mean 20%
winsorized_mean(x, 0.2)
## [1] 69.73333
##### Visualisasi Data Soal 1
mean_alphanol<- winsorized_mean(x,0)
mean_alphanolkoma2 <- winsorized_mean(x,0.2)

# Boxplot atau judul visual
boxplot(x, col="thistle", main="Perbandingan Mean dan Winsorized Mean")

# menampilkan garis mean
abline(h = mean_alphanol, col="blue", lwd=2)
abline(h = mean_alphanolkoma2, col="orange", lwd=2)

# penjelasan warna dan garis yag sudah di lakukan 
legend("topright",
       legend = c("Mean Biasa", "Winsorized Mean"),
       col = c("blue", "orange"),
       lwd = 2)

#INTERPRESTASI
# INTERPRETASI OTOMATIS
if(mean_alphanol > mean_alphanolkoma2){
  cat("Nilai mean biasa lebih tinggi dibandingkan Winsorized mean.\n")
  cat("Hal ini menunjukkan adanya outlier besar yang meningkatkan rata-rata.\n")
  cat("Winsorized mean cenderung lebih stabil karena mengurangi pengaruh outlier.\n")
  
} else if(mean_alphanol < mean_alphanolkoma2){
  cat("Nilai mean biasa lebih rendah dibandingkan Winsorized mean.\n")
  cat("Hal ini mengindikasikan adanya outlier kecil yang menurunkan rata-rata.\n")
  cat("Winsorized mean memberikan gambaran yang lebih representatif.\n")
  
} else {
  cat("Nilai mean biasa dan Winsorized mean sama.\n")
  cat("Hal ini menunjukkan tidak adanya pengaruh outlier yang signifikan.\n")
}
## Nilai mean biasa lebih tinggi dibandingkan Winsorized mean.
## Hal ini menunjukkan adanya outlier besar yang meningkatkan rata-rata.
## Winsorized mean cenderung lebih stabil karena mengurangi pengaruh outlier.
# ==============================================================================
# Soal 2 [TOTAL 60 poin] - Weighted Multivariate Descriptive Statistics
# ==============================================================================

# --- Baca data CSV ---
#install corrplot untuk visualisai

library(corrplot)
## corrplot 0.95 loaded
df <- read.csv("C:/Users/Lenovo/Downloads/data_quiz1.csv")
X <- as.matrix(df[, c("x1", "x2", "x3")])
w <- df$w
df
##                kota x1 x2   x3     w
## 1      Kab. Pacitan 86 55 10.2 14.34
## 2     Kab. Ponorogo 78 64 15.8 14.19
## 3   Kab. Trenggalek 83 58 11.5 12.49
## 4  Kab. Tulungagung 75 68 17.3 11.45
## 5       Kab. Blitar 80 60 13.6 17.45
## 6       Kab. Kediri 74 66 16.8 15.24
## 7       Kab. Malang 66 74 23.5 34.73
## 8     Kab. Lumajang 77 62 14.7 17.97
## 9       Kab. Jember 69 72 21.2 33.13
## 10  Kab. Banyuwangi 73 67 19.4 35.93
## 11   Kab. Bondowoso 79 59 12.8 15.55
## 12   Kab. Situbondo 81 57 11.3 16.54
## 13 Kab. Probolinggo 72 65 16.1 17.25
## 14    Kab. Pasuruan 67 73 22.3 14.93
## 15    Kab. Sidoarjo 58 80 28.5  7.24
## 16   Kab. Mojokerto 68 70 19.8  9.85
## 17     Kab. Jombang 71 67 18.4 11.10
## 18     Kab. Nganjuk 76 63 15.2 12.89
## 19      Kab. Madiun 79 61 13.9 11.14
## 20     Kab. Magetan 82 56 10.8  7.06
## 21       Kab. Ngawi 77 62 14.5 13.96
## 22  Kab. Bojonegoro 75 65 16.0 23.13
## 23       Kab. Tuban 74 66 16.5 19.74
## 24    Kab. Lamongan 73 68 18.1 17.53
## 25      Kab. Gresik 61 78 26.3 12.56
## 26   Kab. Bangkalan 70 63 15.3 13.01
## 27     Kab. Sampang 76 58 12.5 12.28
## 28   Kab. Pamekasan 74 64 15.0  7.95
## 29     Kab. Sumenep 82 55 10.0 20.84
## 30      Kota Kediri 63 75 25.8  0.67
## 31      Kota Blitar 65 72 24.2  0.33
## 32      Kota Malang 57 82 30.1  1.11
## 33 Kota Probolinggo 64 74 24.5  0.55
## 34    Kota Pasuruan 62 77 27.0  0.39
## 35   Kota Mojokerto 60 79 28.8  0.20
## 36      Kota Madiun 61 78 27.5  0.36
## 37    Kota Surabaya 54 85 32.5  3.36
## 38        Kota Batu 84 60 11.8  1.94
# --- [a] Buatlah fungsi weighted_corr(X, w) ---

weighted_corr <- function(X, w) {
  n <- nrow(X)
  p <- ncol(X)
  
  W <- diag(w)
  
  nw <- sum(w)
  one <- matrix(1, n, 1)
  x_bar_w <- (1/nw) * t(X) %*% W %*% one
  D <- X - one %*% t(x_bar_w)
  S_w <- (1/nw) * t(D) %*% W %*% D
  s_w <- sqrt(diag(S_w))
  V <- diag(s_w)
  R_w <- solve(V) %*% S_w %*% solve(V)
  
  colnames(R_w) <- colnames(X)
  rownames(R_w) <- colnames(X)
  
  return(list(
    W = W,
    x_bar_w = x_bar_w,
    S_w = S_w,
    s_w = s_w,
    R_w = R_w
  ))
}

analisis_korelasi = function(R) {
  for (i in 1:(ncol(R)-1)) {
    for (j in (i+1):ncol(R)) {
      r = R[i,j]
      
      # Menentukan kekuatan dan arah hubungan
      if (r > 0) {
        arah <- "searah (positif)"
      } else if (r < 0) {
        arah <- "berlawanan (negatif)"
      } else {
        arah <- "tidak ada hubungan"
      }
      
  cat("Hubungan antara", colnames(R)[i], "dan", colnames(R)[j],
          "adalah", arah,"(Nilai r =", round(r,2), ")\n")
    }
    }
  }
# --- [b] Aplikasikan fungsi pada data ---

# Panggil fungsi
hasil <- weighted_corr(X, w)


# Tampilkan vektor mean tertimbang
hasil$x_bar_w
##        [,1]
## x1 73.88530
## x2 65.39059
## x3 17.00938
# Tampilkan matriks varians-kovarians tertimbang
hasil$S_w
##           x1        x2        x3
## x1  38.16362 -37.75105 -27.15386
## x2 -37.75105  41.10767  29.16587
## x3 -27.15386  29.16587  21.14757
# Tampilkan vektor standar deviasi tertimbang
hasil$s_w
##       x1       x2       x3 
## 6.177671 6.411527 4.598649
# Tampilkan matriks korelasi tertimbang
hasil$R_w
##            x1         x2         x3
## x1  1.0000000 -0.9531095 -0.9558207
## x2 -0.9531095  1.0000000  0.9891979
## x3 -0.9558207  0.9891979  1.0000000
# Visualisasi korelasi tertimbang
corrplot(hasil$R_w,
         method = "color",
         type = "upper",
         tl.col = "black",
         tl.srt = 45,
         addCoef.col = "black",
         col = colorRampPalette(c("darkgreen", "white", "purple"))(200),
         title = "Heatmap Korelasi Tertimbang")

#INTERPRETASI
analisis_korelasi(hasil$R_w)
## Hubungan antara x1 dan x2 adalah berlawanan (negatif) (Nilai r = -0.95 )
## Hubungan antara x1 dan x3 adalah berlawanan (negatif) (Nilai r = -0.96 )
## Hubungan antara x2 dan x3 adalah searah (positif) (Nilai r = 0.99 )