knitr::opts_chunk$set(echo = TRUE)

#Analisis Korelasi

# Membuat Fungsi Analisis Korelasi (rxy) secara manual
# Memanggil data
library(readxl)
Data_Project_Komstat_kelompok_8 <- read_excel("Data Project Komstat kelompok 8.xlsx")
View(Data_Project_Komstat_kelompok_8)
Variabel_x <- Data_Project_Komstat_kelompok_8$`Angka Harapan Hidup`
Variabel_y <- Data_Project_Komstat_kelompok_8$`Indeks Pembangunan Manusia`
variabel <- data.frame(Variabel_x,Variabel_y)
variabel
##    Variabel_x Variabel_y
## 1       70.06      63.69
## 2       63.05      68.05
## 3       65.28      70.92
## 4       67.58      70.31
## 5       69.16      74.14
## 6       70.76      75.96
## 7       70.37      72.92
## 8       68.73      71.13
## 9       71.78      73.77
## 10      69.64      72.56
## 11      72.03      75.36
## 12      72.07      76.19
## 13      69.39      71.86
## 14      69.21      63.17
## 15      70.02      70.32
## 16      66.44      68.85
## 17      71.82      71.67
## 18      69.21      71.21
## 19      67.55      69.51
## 20      67.53      70.93
## 21      67.43      69.58
## 22      69.16      72.16
## 23      69.91      72.77
## 24      69.90      63.75
## 25      69.43      62.93
## 26      69.77      74.74
## 27      63.87      69.86
## 28      74.25      79.70
## 29      71.29      76.17
## 30      73.58      81.76
## 31      72.79      76.95
## 32      69.84      76.05
## 33      71.71      70.23
# Berikut adalah langkah-langkah membuat fugsi dalam menghitung nilai korelasi

# 1. Inisialisasi jumlah data (n)
banyaknya_data <- function(Variabel_x, Variabel_y){
  n <- length(Variabel_x)  # Menghitung jumlah elemen
  
  # Validasi input
  if (n != length(Variabel_y) || n <= 1) {
    return(NA)  # Kembali NA (not available) jika panjang x dan y tidak sama atau kurang dari 2
  }
  return(n)} # mengembalikan hasil nilai n
  
# Memanggil fungsi dan menyimpan hasil
  total_data <- banyaknya_data(Variabel_x, Variabel_y)
  total_data
## [1] 33
# 2. Membuat fungsi menghitung jumlah nilai setiap variabel
penjumlahan_data <-function(data){# data adalah vektor berisi angka yang akan dihitung jumlahnya
  jumlah <- 0 # Inisialisasi variabel untuk menyimpan jumlah
  n <- length(data) # inisialisasi untuk panjang atau banyaknya data
  for(i in 1:n){ # pengulangan penjumlahan untuk setiap data ke i yang dimulai dari 1 sampai dengan n
    jumlah <- jumlah + data[i]} #inisialisasi variabel jumlah yaitu jumlah ditambah dengan data ke i
  return (jumlah) # mengembalikan jumlah data setiap data ke i
}
jumlahvariabelx <- penjumlahan_data(Variabel_x)
jumlahvariabelx
## [1] 2294.61
jumlahvariabely <- penjumlahan_data(Variabel_y)
jumlahvariabely
## [1] 2369.17
# 3. Membuat fungsi menjumlahkan x ke-i kali y ke-i
jumlahkan_xi_kali_yi <- function(x, y) {
  # Validasi input
  if (length(x) != length(y)) {
    stop("Panjang vektor x dan y harus sama.")  # jika banyak data pada variabel x dan y tidak sama maka eksekusi dihentikan
  }
  
  # Inisialisasi total untuk menyimpan hasil penjumlahan
  total <- 0 # total diinisialisasi dengan nilai 0, sehingga saat penjumlahan dimulai hasilnya akan bertambah dari 0
  
  # Loop untuk menjumlahkan x-ke-i kali y-ke-i
  for (i in 1:length(x)) {#loop for yang digunakan untuk mengulang setiap elemen dari vektor
    total <- total + (x[i] * y[i])  # Mengalikan elemen x-ke-i dengan y-ke-i dan menambahkannya ke total
  }
  
  # Mengembalikan hasil total
  return(total)
}

hasilxiyi <- jumlahkan_xi_kali_yi(Variabel_x, Variabel_y)
hasilxiyi
## [1] 164925.7
# 4. Membuat fungsi menghitung kuadrat
# Fungsi menghitung setiap nilai pada variabel dikuadratkan lalu dijumlahkan
kuadrat <- function(data){ #data adalah vektor berisi angka yang akan dihitung nilai kuadratnya
  n <- length(data) #inisialisasi untuk panjang atau banyaknya data
  hasil_kuadrat <- numeric(n) #inisialisasi vektor berukuran n untuk menampung hasil perhitungan kuadrat
  for (i in 1:n){ #pengulangan penjumlahan kuadrat untuk setiap data ke i sampai dengan n
    hasil_kuadrat[i] <- data[i]*data[i] #hasil kuadrat data ke i adalah perkalian data ke i dengan data ke i
  }
  return(hasil_kuadrat) #mengembalikan jumlah kuadrat data setiap data ke i
}

Variabel_xkuadrat <- kuadrat(Variabel_x)
Variabel_xkuadrat 
##  [1] 4908.404 3975.302 4261.478 4567.056 4783.106 5006.978 4951.937 4723.813
##  [9] 5152.368 4849.730 5188.321 5194.085 4814.972 4790.024 4902.800 4414.274
## [17] 5158.112 4790.024 4563.002 4560.301 4546.805 4783.106 4887.408 4886.010
## [25] 4820.525 4867.853 4079.377 5513.062 5082.264 5414.016 5298.384 4877.626
## [33] 5142.324
Variabel_ykuadrat <- kuadrat(Variabel_y)
Variabel_ykuadrat
##  [1] 4056.416 4630.802 5029.646 4943.496 5496.740 5769.922 5317.326 5059.477
##  [9] 5442.013 5264.954 5679.130 5804.916 5163.860 3990.449 4944.902 4740.322
## [17] 5136.589 5070.864 4831.640 5031.065 4841.376 5207.066 5295.473 4064.062
## [25] 3960.185 5586.068 4880.420 6352.090 5801.869 6684.698 5921.303 5783.602
## [33] 4932.253
dataframeVariabel_xkuadrat <- data.frame(Variabel_xkuadrat,Variabel_ykuadrat)
dataframeVariabel_xkuadrat
##    Variabel_xkuadrat Variabel_ykuadrat
## 1           4908.404          4056.416
## 2           3975.302          4630.802
## 3           4261.478          5029.646
## 4           4567.056          4943.496
## 5           4783.106          5496.740
## 6           5006.978          5769.922
## 7           4951.937          5317.326
## 8           4723.813          5059.477
## 9           5152.368          5442.013
## 10          4849.730          5264.954
## 11          5188.321          5679.130
## 12          5194.085          5804.916
## 13          4814.972          5163.860
## 14          4790.024          3990.449
## 15          4902.800          4944.902
## 16          4414.274          4740.322
## 17          5158.112          5136.589
## 18          4790.024          5070.864
## 19          4563.002          4831.640
## 20          4560.301          5031.065
## 21          4546.805          4841.376
## 22          4783.106          5207.066
## 23          4887.408          5295.473
## 24          4886.010          4064.062
## 25          4820.525          3960.185
## 26          4867.853          5586.068
## 27          4079.377          4880.420
## 28          5513.062          6352.090
## 29          5082.264          5801.869
## 30          5414.016          6684.698
## 31          5298.384          5921.303
## 32          4877.626          5783.602
## 33          5142.324          4932.253
# 5. Menghitung jumlah nilai variabel yang telah dikuadratkan
jumlah_Variabel_xikuadrat <- penjumlahan_data(Variabel_xkuadrat)
jumlah_Variabel_xikuadrat
## [1] 159754.8
jumlah_Variabel_yikuadrat <- penjumlahan_data(Variabel_ykuadrat)
jumlah_Variabel_yikuadrat
## [1] 170715
# 6. Membuat fungsi menjumlahkan total nilai variabel lalu dikuadratkan
sumx_kuadrat <- kuadrat(jumlahvariabelx)
sumx_kuadrat
## [1] 5265235
sumy_kuadrat <- kuadrat(jumlahvariabely)
sumy_kuadrat
## [1] 5612966
# 7. Membuat data frame semua nilai
dataframeperhitungan <- data.frame(Variabel_x, Variabel_y, total_data,jumlahvariabelx, jumlahvariabely,hasilxiyi, 
                                   Variabel_xkuadrat, Variabel_ykuadrat,jumlah_Variabel_xikuadrat, jumlah_Variabel_yikuadrat,sumx_kuadrat,sumy_kuadrat)
dataframeperhitungan
##    Variabel_x Variabel_y total_data jumlahvariabelx jumlahvariabely hasilxiyi
## 1       70.06      63.69         33         2294.61         2369.17  164925.7
## 2       63.05      68.05         33         2294.61         2369.17  164925.7
## 3       65.28      70.92         33         2294.61         2369.17  164925.7
## 4       67.58      70.31         33         2294.61         2369.17  164925.7
## 5       69.16      74.14         33         2294.61         2369.17  164925.7
## 6       70.76      75.96         33         2294.61         2369.17  164925.7
## 7       70.37      72.92         33         2294.61         2369.17  164925.7
## 8       68.73      71.13         33         2294.61         2369.17  164925.7
## 9       71.78      73.77         33         2294.61         2369.17  164925.7
## 10      69.64      72.56         33         2294.61         2369.17  164925.7
## 11      72.03      75.36         33         2294.61         2369.17  164925.7
## 12      72.07      76.19         33         2294.61         2369.17  164925.7
## 13      69.39      71.86         33         2294.61         2369.17  164925.7
## 14      69.21      63.17         33         2294.61         2369.17  164925.7
## 15      70.02      70.32         33         2294.61         2369.17  164925.7
## 16      66.44      68.85         33         2294.61         2369.17  164925.7
## 17      71.82      71.67         33         2294.61         2369.17  164925.7
## 18      69.21      71.21         33         2294.61         2369.17  164925.7
## 19      67.55      69.51         33         2294.61         2369.17  164925.7
## 20      67.53      70.93         33         2294.61         2369.17  164925.7
## 21      67.43      69.58         33         2294.61         2369.17  164925.7
## 22      69.16      72.16         33         2294.61         2369.17  164925.7
## 23      69.91      72.77         33         2294.61         2369.17  164925.7
## 24      69.90      63.75         33         2294.61         2369.17  164925.7
## 25      69.43      62.93         33         2294.61         2369.17  164925.7
## 26      69.77      74.74         33         2294.61         2369.17  164925.7
## 27      63.87      69.86         33         2294.61         2369.17  164925.7
## 28      74.25      79.70         33         2294.61         2369.17  164925.7
## 29      71.29      76.17         33         2294.61         2369.17  164925.7
## 30      73.58      81.76         33         2294.61         2369.17  164925.7
## 31      72.79      76.95         33         2294.61         2369.17  164925.7
## 32      69.84      76.05         33         2294.61         2369.17  164925.7
## 33      71.71      70.23         33         2294.61         2369.17  164925.7
##    Variabel_xkuadrat Variabel_ykuadrat jumlah_Variabel_xikuadrat
## 1           4908.404          4056.416                  159754.8
## 2           3975.302          4630.802                  159754.8
## 3           4261.478          5029.646                  159754.8
## 4           4567.056          4943.496                  159754.8
## 5           4783.106          5496.740                  159754.8
## 6           5006.978          5769.922                  159754.8
## 7           4951.937          5317.326                  159754.8
## 8           4723.813          5059.477                  159754.8
## 9           5152.368          5442.013                  159754.8
## 10          4849.730          5264.954                  159754.8
## 11          5188.321          5679.130                  159754.8
## 12          5194.085          5804.916                  159754.8
## 13          4814.972          5163.860                  159754.8
## 14          4790.024          3990.449                  159754.8
## 15          4902.800          4944.902                  159754.8
## 16          4414.274          4740.322                  159754.8
## 17          5158.112          5136.589                  159754.8
## 18          4790.024          5070.864                  159754.8
## 19          4563.002          4831.640                  159754.8
## 20          4560.301          5031.065                  159754.8
## 21          4546.805          4841.376                  159754.8
## 22          4783.106          5207.066                  159754.8
## 23          4887.408          5295.473                  159754.8
## 24          4886.010          4064.062                  159754.8
## 25          4820.525          3960.185                  159754.8
## 26          4867.853          5586.068                  159754.8
## 27          4079.377          4880.420                  159754.8
## 28          5513.062          6352.090                  159754.8
## 29          5082.264          5801.869                  159754.8
## 30          5414.016          6684.698                  159754.8
## 31          5298.384          5921.303                  159754.8
## 32          4877.626          5783.602                  159754.8
## 33          5142.324          4932.253                  159754.8
##    jumlah_Variabel_yikuadrat sumx_kuadrat sumy_kuadrat
## 1                     170715      5265235      5612966
## 2                     170715      5265235      5612966
## 3                     170715      5265235      5612966
## 4                     170715      5265235      5612966
## 5                     170715      5265235      5612966
## 6                     170715      5265235      5612966
## 7                     170715      5265235      5612966
## 8                     170715      5265235      5612966
## 9                     170715      5265235      5612966
## 10                    170715      5265235      5612966
## 11                    170715      5265235      5612966
## 12                    170715      5265235      5612966
## 13                    170715      5265235      5612966
## 14                    170715      5265235      5612966
## 15                    170715      5265235      5612966
## 16                    170715      5265235      5612966
## 17                    170715      5265235      5612966
## 18                    170715      5265235      5612966
## 19                    170715      5265235      5612966
## 20                    170715      5265235      5612966
## 21                    170715      5265235      5612966
## 22                    170715      5265235      5612966
## 23                    170715      5265235      5612966
## 24                    170715      5265235      5612966
## 25                    170715      5265235      5612966
## 26                    170715      5265235      5612966
## 27                    170715      5265235      5612966
## 28                    170715      5265235      5612966
## 29                    170715      5265235      5612966
## 30                    170715      5265235      5612966
## 31                    170715      5265235      5612966
## 32                    170715      5265235      5612966
## 33                    170715      5265235      5612966
# 8. Menghitung nilai korelasi menggunakan fungsi yang telah dibuat
rumuskorelasi <- (total_data *hasilxiyi - jumlahvariabelx *jumlahvariabely)/sqrt((total_data * jumlah_Variabel_xikuadrat - sumx_kuadrat)*(total_data *jumlah_Variabel_yikuadrat - sumy_kuadrat))
rumuskorelasi                         
## [1] 0.5308026
# 9.Menghitung kekuatan hubungan koefisien korelasi
kekuatan_korelasi <- function(rumuskorelasi){
  if (rumuskorelasi >= 0.9 && rumuskorelasi <= 1) {
    return("Hubungan sangat kuat positif")
  } else if (rumuskorelasi > 0.7 && rumuskorelasi < 0.9) {
    return("Hubungan kuat positif")
  } else if (rumuskorelasi > 0.5 && rumuskorelasi <= 0.7) {
    return("Hubungan sedang positif")
  } else if (rumuskorelasi > 0.3 && rumuskorelasi <= 0.5) {
    return("Hubungan lemah positif")
  } else if (rumuskorelasi > 0 && rumuskorelasi <= 0.3) {
    return("Tidak ada hubungan positif")
  } else if (rumuskorelasi < 0 && rumuskorelasi >= -0.3) {
    return("Tidak ada hubungan negatif")
  } else if (rumuskorelasi <= -0.3 && rumuskorelasi > -0.5) {
    return("Hubungan lemah negatif")
  } else if (rumuskorelasi <= -0.5 && rumuskorelasi > -0.7) {
    return("Hubungan sedang negatif")
  } else if (rumuskorelasi <= -0.7 && rumuskorelasi > -0.9) {
    return("Hubungan kuat negatif")
  } else if (rumuskorelasi <= -0.9 && rumuskorelasi >= -1) {
    return("Hubungan sangat kuat negatif")
  } else {
    return("Nilai tidak valid")
  }
}
hasil_hubungan_korelasi <- kekuatan_korelasi(rumuskorelasi)
hasil_hubungan_korelasi
## [1] "Hubungan sedang positif"
# Membuat fungsi korelasi menggunakan pipe
# Load library dplyr untuk pipe
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
  # Fungsi korelasi Pearson menggunakan pipe
  rumuskorelasi_dengan_pipe <- function(Variabel_x, Variabel_y) {

  # Buat tibble dan hitung langkah-langkah dengan pipe
  korelasi <- tibble(Variabel_x, Variabel_y) %>%

  # Hitung jumlah data
  summarise( n = n(),
               total_data = banyaknya_data(Variabel_x, Variabel_y),
               jumlahvariabelx = penjumlahan_data(Variabel_x),
               jumlahvariabely = penjumlahan_data(Variabel_y),
               hasilxiyi = jumlahkan_xi_kali_yi(Variabel_x, Variabel_y),
               jumlah_Variabel_xikuadrat = penjumlahan_data(Variabel_xkuadrat),
               jumlah_Variabel_yikuadrat = penjumlahan_data(Variabel_ykuadrat),
               sumx_kuadrat = kuadrat(jumlahvariabelx),
               sumy_kuadrat <- kuadrat(jumlahvariabely)) %>%
    
    # Hitung korelasi menggunakan rumus Pearson
    mutate(korelasi = ((total_data * hasilxiyi) - (jumlahvariabelx * jumlahvariabely)) /
             sqrt((total_data * jumlah_Variabel_xikuadrat - sumx_kuadrat) *
                    (total_data * jumlah_Variabel_yikuadrat - sumy_kuadrat))) %>%
    
    # Ambil hasil korelasi
    pull(korelasi)
  
  return(korelasi)
}

# Menghitung nilai korelasi menggunakan fungsi pipe
korelasi_dengan_pipe <- rumuskorelasi_dengan_pipe(Variabel_x, Variabel_y)
korelasi_dengan_pipe
## [1] 0.5308026
# Analisis korelasi
# 1. Menguji hipotesis 
# H0: r = 0 (tidak ada korelasi antara variabel x dan y)
# H1: r ≠ 0 (ada korelasi antara variabel x dan y)

# 2. Statistik uji t (t = (r * sqrt(n - 2)) / sqrt(1 - r^2))
# Statistik uji t digunakan untuk mengetahui apakah korelasi tersebut signifikan atau tidak
t_statistik <- (rumuskorelasi* sqrt(total_data-2))/sqrt(1-kuadrat(rumuskorelasi))
t_statistik
## [1] 3.487197
# 3. Menentukan derajat bebas (degree of freedom)
df <- total_data-2
df
## [1] 31
# 4. Menghitung t-kritis
alpha <- 0.05
t_kritis <- qt(1-alpha/2, df) #menghitung nilai kritis untuk uji dua arah
t_kritis
## [1] 2.039513
# 5. Keputusan kriteria penolakan
# Tolak H0 jika t_statistik > t_kritis

if (abs(t_statistik) > t_kritis) { #nilai absolut dari statistik t. Karena uji dua arah, kita hanya memperhatikan pada magnitudo (besar) dari nilai𝑡tanpa memperhatikan arah (positif atau negatif).
  keputusan <- "Tolak H0, artinya ada korelasi yang signifikan antara variabel x dan y"
} else {
  keputusan <- "Terima H0, artinya tidak ada korelasi yang signifikan antara variabel x dan y"
}
keputusan
## [1] "Tolak H0, artinya ada korelasi yang signifikan antara variabel x dan y"
# Memuat ggplot2
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Membuat scatter plot antara Indeks Pembangunan Manusia dan Angka Harapan Hidup
# Fungsi aes digunakan untuk membuat  hubungan antara variabel dalam data frame dan visualisasi
ggplot(Data_Project_Komstat_kelompok_8 , aes(x = `Angka Harapan Hidup`, y = `Indeks Pembangunan Manusia`)) +
  geom_point(color = "blue", size = 3, alpha = 0.6) +   
  #geom_point(...): Fungsi ini digunakan untuk menambahkan titik-titik ke dalam scatter plot.
  geom_smooth(method = "lm", se = TRUE, color = "red") + #geom_smooth(...): Menambahkan garis regresi linier ke dalam plot
                                                         #se = TRUE akan menunjukkan bahwa area sekitar garis regresi (confidence interval) juga akan ditampilkan
  labs(title = "Scatter Plot: Indeks Pembangunan Manusia vs Angka Harapan Hidup",
       # fungsi labs digunakan untuk memberi label pada plot
       x = "Angka Harapan Hidup",
       y = "Indeks Pembangunan Manusia") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'