Modul 5: Analisis Asosiasi

Objectives Praktikum

  1. Praktikan mampu memahami prinsip-prinsip dasar analisis statistik asosiasi

  2. Praktikan mampu melakukan uji asosiasi untuk data nominal, data ordinal, data interval rasio pada pemrograman R di RStudio.

Review Teori

Metode Analisis Asosiasi merupakan teknik statistik yang membantu untuk menilai adanya hubungan antara dua atau lebih karakteristik objek atau yang disebut sebagai variabel, dengan menjawab beberapa pertanyaan tentang:

  1. Keberadaan hubungan, yang berkaitan dengan ada atau tidaknya hubungan antara dua variabel yang diuji.

  2. Keeratan hubungan, yang berkaitan dengan derajat hubungan antar variabel (apakah hubungan sangat erat, cukup erat, atau lemah)

  3. Arah hubungan, yang berkaitan dengan arah hubungan yang sama atau berbeda antara satu variabel dengan variabel lainnya yang ditunjukan dengan positif atau negatifnya nilai koefisien

  4. Sifat hubungan, berkaitan dengan pola hubungan yang dapat ditunjukan dengan hubungan matematis antar varaibel. (Kachigan, 1986; Healey, 2010)

Selain itu menurut Kachigan (1986), hubungan yang ada antar dua variabel memiliki dua tipe dasar yaitu hubungan eksperimental dan hubungan korelasional. Hubungan bersifat eksperimen didasarkan pada percobaan serta menunjukan hubungan sebab akibat, sedangkan hubungan bersifat korelasi didasarkan pada lingkungan alamiah serta tidak menunjukan hubungan sebab akibat. Terdapat beberapa metode yang dapat digunakan dalam analisis asosiasi yang bergantung pada skala pengukuran datanya, yaitu (Healey,2012): Metode Analisis Asosiasi Variabel Nominal, Metode Asosiasi Variabel Ordinal, dan Metode Asosiasi Variabel Interval Rasio. Jenis-jenis analisis yang berada dalam lingkup analisis statistik asosiasi dapat terlihat pada tabel berikut ini:

Penerapan Nominal Ordinal Interval/Rasio
Asosiasi Bersifat Korelatif

Ukuran Korelasi Berbasis Chi-Square

Koefisien Phi

Koefisien V Creamer

Koefisien Kontingensi C

Ukuran Korelasi Berbasis Proportional Reduction Error (PRE)

Koefisien Lambda

Ukuran Korelasi Variabel Ordinal Kontinyu

Koefisien Korelasi Tau Kendal

Koefisien Korelasi Rho Spearmen

Ukuran Korelasi Variabel Ordinal Collapsed

Koefisien Gamma

Koefisien d Sommer

Koefisien Tau-b Kendal

Koefisien Korelasi r Pearson (Product Moment)
Asosiasi Bersifat Eksperimental

Analisis Variansi (ANOVA)

Analisis Regresi

Pada praktikum ini akan dilakukan analisis statistik asosiasi dengan melakukan uji asosiasi untuk data nominal yaitu Cramer’s V, untuk data ordinal collapse dengan gamma dan Kendall’s tau-b, dan untuk interval rasio dengan R-Pearson, ANOVA, serta regresi linier 1 variabel.

Selain itu, fokus pendekatan statistik pada praktikum ini adalah statistik klasik (Frequentist). Cari tahu lebih lanjut apa itu frequentist (dan juga bayesian).

Hands-on Praktikum

Pada bagian ini akan dibahas contoh kasus, tujuan dari pengolahan, dan tahapan analisis.

Contoh Kasus:

Pemerintah Kabupaten A merencanakan sebuah program yang akan dilaksanakan di Desa B. Sebelum menerapkan program tersebut pemerintah terlebih dahulu ingin mengetahui karakteristik dari Desa B dilihat dari hubungan antara variabel pekerjaan dan jenis kelamin, variabel pendidikan terakhir dan tingkat pendapatan, kondisi jalan dan kondisi drainase, total pendapatan dan total pengeluaran, total pendapatan dan pekerjaan serta total pengeluaran dan total pendapatan. Untuk mengetahui karakteristik dari masyarakat Desa B tersebut pemerintah melakukan survei terhadap 110 masyarakat Desa B.

Berdasarkan contoh kasus tersebut, maka penyelesaian dapat dilakukan dengan beberapa tahapan yaitu: (1) merumuskan pertanyaan penelitian; (2) memasukkan data pada Stata; (3) mengolah data menggunakan Stata; (4) menganalisis hasil pengolahan data dan melakukan interpretasi.

1. Merumuskan Pertanyaan Penelitian

Dari contoh kasus tersebut maka didapat beberapa pertanyaan penelitian yaitu: * Bagaimanakah hubungan antara variabel pekerjaan dan jenis kelamin? * Bagaimanakah hubungan antara variabel pendidikan terakhir dan tingkat pendapatan? * Bagaimanakah hubungan antara variabel kondisi jalan dan kondisi drainase? * Bagaimanakah hubungan antara variabel total pendapatan dan total pengeluaran? * Bagaimanakah hubungan antara variabel total pendapatan dan pekerjaan? * Bagaimanakah hubungan antara variabel total pengeluaran dan total pendapatan?

2. Memasukkan Data

Data kali ini menggunakan data jenis .dta (data hasil olahan STATA)

library(haven) # lakukan instalasi terlebih dahulu dengan `install.packages("haven")` bila belum terpasang
data <- read_dta("data/data05.dta")
data
## # A tibble: 110 × 8
##    Jenis_Kelamin Pekerjaan       Pendidikan_Terakhir tkt_pendapatn Kondisi_Jalan
##    <dbl+lbl>     <dbl+lbl>       <dbl+lbl>           <dbl+lbl>     <dbl+lbl>    
##  1 2 [Perempuan]  9 [Pegawai Sw… 5 [Diploma]         3 [tinggi]    2 [Sedang]   
##  2 1 [Laki-laki]  5 [Karyawan/B… 4 [SLTA Sederajat]  3 [tinggi]    3 [Baik]     
##  3 1 [Laki-laki] 11 [Lainnya]    4 [SLTA Sederajat]  3 [tinggi]    2 [Sedang]   
##  4 2 [Perempuan]  2 [IRT]        4 [SLTA Sederajat]  3 [tinggi]    2 [Sedang]   
##  5 2 [Perempuan]  4 [Wiraswasta] 2 [SD Sederajat]    1 [sangat re… 3 [Baik]     
##  6 2 [Perempuan]  2 [IRT]        2 [SD Sederajat]    2 [rendah]    2 [Sedang]   
##  7 2 [Perempuan]  5 [Karyawan/B… 5 [Diploma]         3 [tinggi]    1 [Buruk]    
##  8 1 [Laki-laki] 10 [Tidak Beke… 5 [Diploma]         3 [tinggi]    3 [Baik]     
##  9 2 [Perempuan]  2 [IRT]        6 [Sarjana]         2 [rendah]    1 [Buruk]    
## 10 2 [Perempuan]  2 [IRT]        3 [SLTP Sederajat]  4 [sangat ti… 3 [Baik]     
## # ℹ 100 more rows
## # ℹ 3 more variables: Kondisi_Drainase <dbl+lbl>, Total_Pendapatan <dbl>,
## #   Total_Pengeluaran <dbl>

3. Mengolah data

Analisis data akan dilakukan sesuai dengan jenis variabel yang ada pada pertanyaan penelitian.

A. Nominal (Uji Cramer’s V)

Cramér’s V adalah ukuran kekuatan asosiasi antara dua variabel nominal. Nilainya berkisar antara 0 hingga 1:

  • 0: Tidak ada hubungan.

  • 1: Hubungan sempurna.

Cramér’s V dihitung dengan formula berikut:

\[Cramer's \ V = \sqrt{\frac{\chi^2 / n}{\text{min}((r-1), (c-1))}} \]

  • \(\chi^2\): Statistik uji chi-square.

  • \(n\): Total sampel.

  • \(r\): Jumlah baris dalam tabel kontingensi.

  • \(c\): Jumlah kolom dalam tabel kontingensi.

Interpretasi melalui degree of freedom

\[ df = \text{min}((r - 1), (c - 1)) \]

Di mana:

  • \(r\): Jumlah baris dalam tabel kontingensi.
  • \(c\): Jumlah kolom dalam tabel kontingensi.
  1. Degree of freedom (df) menunjukkan jumlah kebebasan dalam tabel kontingensi yang memengaruhi hasil analisis.
  2. Nilai \(df\) digunakan untuk menyesuaikan interpretasi kekuatan asosiasi dari Cramér’s V berdasarkan ukuran tabel.

Contoh: Jika tabel kontingensi memiliki 4 baris dan 3 kolom: \[ df = \text{min}((4 - 1), (3 - 1)) = \text{min}(3, 2) = 2 \]

Gunakan fungsi dim() untuk melihat jumlah baris dan kolom pada tabel kontingensi.

# install.packages("DescTools") # Untuk uji Cramér's V
library(DescTools)
# Buat tabel kontingensi
tabel <- table(data$Pekerjaan, data$Jenis_Kelamin)
tabel
##     
##       1  2
##   1   1  0
##   2   0 34
##   3   2  1
##   4   9  5
##   5   8  6
##   6   6  3
##   8   5  6
##   9   5  2
##   10  6  3
##   11  7  1
# Perform Cramér's V test
hasil_cramers_v <- CramerV(tabel)

# Print the result
print(hasil_cramers_v)
## [1] 0.631386
# Degree of Freedom
dimensi <- dim(tabel)
df <- min(dimensi[1] - 1, dimensi[2] - 1)
print(paste("Degree of Freedom (df):", df))
## [1] "Degree of Freedom (df): 1"

Nilai Cramér’s V = 0.631386 untuk df = 1 menunjukkan hubungan kuat.

B. Ordinal Collapse Non Matriks Persegi (Uji Gamma)
# Instalasi jika belum terinstal
# install.packages("vcdExtra")
# Muat paket
library(vcdExtra)
## Loading required package: vcd
## Loading required package: grid
## Loading required package: gnm
# Membuat tabel kontingensi
tabel <- table(data$Pendidikan_Terakhir, data$tkt_pendapatn)
tabel # Lihat tabel kontingensi
##    
##      1  2  3  4
##   1  0  1  2  3
##   2  4  5  5  6
##   3  6  7  1  9
##   4  9  7 14  4
##   5  1  2  4  2
##   6  2  3  5  4
##   7  1  0  0  1
##   8  0  2  0  0
# Hitung Gamma
gamma_result <- GKgamma(tabel)
gamma_result
## gamma        : -0.068 
## std. error   : 0.098 
## CI           : -0.26 0.125

Pada hasil tersebut terlihat bahwa nilai gamma yang didapat adalah -0.068. Karena nilai gamma ≠ 0 maka terdapat hubungan antara Pendidikan terakhir dan tingkat pendapatan serta semua kasus dari dua variabel tersebut diurutkan dalam urutan yang berkebalikan (karena nilai gamma negative).

Untuk melihat kekuatan hubungan dari uji Gamma dapat dilihat pada tabel berikut:

Nilai Gamma Kekuatan
0.0-0.3 Lemah
0.31-0.6 Moderat
>0.6 Kuat
C. Ordinal Collapse Matriks Persegi (Uji Kendall’s tau-b), untuk data rank
# Uji Kendall Tau-b
kendall_result <- cor.test(data$Kondisi_Jalan, data$Kondisi_Drainase, method = "kendall")

# Tampilkan hasil
print(kendall_result)
## 
##  Kendall's rank correlation tau
## 
## data:  data$Kondisi_Jalan and data$Kondisi_Drainase
## z = 0.55372, p-value = 0.5798
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##        tau 
## 0.05089782
  • Nilai Tau-b (0.0509):

    • Nilai tau sangat kecil (0.05), menunjukkan hubungan sangat lemah antara Kondisi_Jalan dan Kondisi_Drainase.

    • Positif: Hubungan yang sangat lemah ini bersifat positif, artinya jika salah satu variabel meningkat, variabel lain sedikit cenderung meningkat.

  • p-value (0.5798):

    • Karena p-value > 0.05, kita gagal menolak hipotesis nol (\(H_0\)).

    • Kesimpulan: Tidak ada cukup bukti untuk menyatakan hubungan yang signifikan antara Kondisi_Jalan dan Kondisi_Drainase.

  • z-value (0.55372):

    • Nilai z yang kecil mendukung kesimpulan bahwa hubungan antara kedua variabel sangat lemah dan tidak signifikan.

Jika ingin melihat Kendall Correlation Plot

# Load required library, install.packages("ggpubr")
library(ggpubr)
## Loading required package: ggplot2
# Scatter plot with Kendall correlation coefficient
ggscatter(data, x = "Kondisi_Jalan", y = "Kondisi_Drainase", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "kendall",
          xlab = "Kondisi_Jalan", ylab = "Kondisi_Drainase",
          title = "Kendall Correlation Plot")

D. Interval Rasio (Pearson Correlation), untuk numerik kontinyu
# Uji Korelasi Pearson dengan p-value
pearson_test <- cor.test(data$Total_Pendapatan, data$Total_Pengeluaran, method = "pearson")

# Tampilkan hasil
print(pearson_test)
## 
##  Pearson's product-moment correlation
## 
## data:  data$Total_Pendapatan and data$Total_Pengeluaran
## t = 2.165, df = 108, p-value = 0.03259
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.01736655 0.37679756
## sample estimates:
##       cor 
## 0.2039448

1. Kekuatan dan Arah Hubungan (r = 0.2039):

  • Nilai korelasi Pearson (\(r = 0.2039\)) menunjukkan hubungan yang positif lemah antara Total_Pendapatan dan Total_Pengeluaran.

    • Artinya, ketika pendapatan meningkat, pengeluaran cenderung sedikit meningkat, tetapi hubungan ini tidak terlalu kuat.

2. Signifikansi Statistik (p-value = 0.03259):

  • Karena $$p < 0.05$$ , hubungan ini signifikan secara statistik pada tingkat kepercayaan 95%.

  • Artinya, ada cukup bukti untuk menyimpulkan bahwa hubungan antara pendapatan dan pengeluaran tidak terjadi secara kebetulan.

3. Confidence Interval (95%):

  • Interval kepercayaan 95% untuk korelasi adalah [0.0174, 0.3768].

    • Nilai ini menunjukkan bahwa korelasi sejati antara kedua variabel kemungkinan berada dalam rentang ini.

    • Karena interval ini tidak mencakup nol, hubungan antara kedua variabel signifikan.

E. ANOVA
# Model ANOVA
anova_model <- aov(Total_Pendapatan ~ Pekerjaan, data = data)

# Lihat hasil ANOVA
summary(anova_model)
##              Df    Sum Sq   Mean Sq F value Pr(>F)
## Pekerjaan     1 1.591e+13 1.591e+13   0.758  0.386
## Residuals   108 2.266e+15 2.098e+13

1. F Value (F-statistic):

  • Nilai F = 0.758:

    • Ini menunjukkan bahwa perbedaan rata-rata Total_Pendapatan antara kelompok dalam variabel Pekerjaan relatif kecil dibandingkan dengan variasi dalam kelompok (Residuals).

2. p-value (Pr(>F)):

  • Nilai p = 0.386:

    • Karena $$p > 0.05$$, kita gagal menolak hipotesis nol (​$$H_0$$).

    • Kesimpulan: Tidak ada bukti yang cukup untuk menyimpulkan bahwa rata-rata Total_Pendapatan berbeda secara signifikan antara kelompok Pekerjaan.

3. Sum of Squares dan Mean Square:

  • Sum Sq (Pekerjaan): Variasi dalam Total_Pendapatan yang dapat dijelaskan oleh Pekerjaan adalah \(1.591 \times 10^{13}\) dingkan dengan Sum Sq (Residuals) sebesar \(2.266 \times 10^{15}\).

    • Ini mengindikasikan bahwa sebagian besar variasi Total_Pendapatan tidak dijelaskan oleh variabel Pekerjaan.
  • Tidak ada hubungan signifikan antara Pekerjaan dan rata-rata Total_Pendapatan.

  • Dengan \(p = 0.386\), perbedaan rata-rata antara kelompok Pekerjaan bisa jadi hanya terjadi secara kebetulan.

F. Analisis Regresi
# Model regresi linier
reg_model <- lm(Total_Pengeluaran ~ Total_Pendapatan, data = data)

# Lihat ringkasan hasil regresi
summary(reg_model)
## 
## Call:
## lm(formula = Total_Pengeluaran ~ Total_Pendapatan, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -4824708 -1329629  -716836   530043 15423572 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      2.080e+06  3.477e+05   5.981 2.92e-08 ***
## Total_Pendapatan 1.248e-01  5.766e-02   2.165   0.0326 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2754000 on 108 degrees of freedom
## Multiple R-squared:  0.04159,    Adjusted R-squared:  0.03272 
## F-statistic: 4.687 on 1 and 108 DF,  p-value: 0.03259

1. Persamaan Regresi:

Persamaan regresi linier dari output ini adalah: \[ \text{Total_Pengeluaran} = 2,080,000 + 0.1248 \cdot \text{Total_Pendapatan} \]

  • Intercept (\(\beta_0 = 2,080,000\)):
    • Ketika Total_Pendapatan = 0, nilai rata-rata Total_Pengeluaran diprediksi sebesar 2,080,000.
    • Intercept ini jarang memiliki arti praktis jika \(\text{Total Pendapatan} = 0\) tidak masuk akal dalam konteks data.
  • Slope (\(\beta_1 = 0.1248\)):
    • Untuk setiap kenaikan 1 unit pada Total_Pendapatan, Total_Pengeluaran diprediksi meningkat sebesar 0.1248 unit (atau sekitar 12.48% dari kenaikan pendapatan).
    • Hubungan ini bersifat positif, tetapi lemah.

2. Signifikansi Statistik (p-value = 0.03259):

  • Karena \(p = 0.03259 < 0.05\), kita menolak hipotesis nol (\(H_0\)) dan menyimpulkan bahwa hubungan antara Total_Pendapatan dan Total_Pengeluaran signifikan secara statistik.
  • Artinya, perubahan dalam Total_Pendapatan memiliki pengaruh terhadap Total_Pengeluaran, meskipun pengaruhnya lemah.

3. Kekuatan Model (R-squared = 0.04159):

  • Nilai R-squared sebesar 4.16% menunjukkan bahwa hanya 4.16% dari variasi dalam Total_Pengeluaran yang dapat dijelaskan oleh model (yaitu, Total_Pendapatan).
  • Adjusted R-squared yang sedikit lebih rendah (3.27%) menunjukkan model tidak terlalu kuat dalam menjelaskan data.

4. Residual Standard Error (2754000):

  • Penyimpangan rata-rata antara nilai prediksi dan nilai aktual Total_Pengeluaran adalah sekitar 2,754,000.
  • Ini menunjukkan bahwa prediksi model tidak sangat presisi.

Jika ingin melakukan prediksi

Notes: Idealnya dalam melakukan prediksi harus melakukan train-test split data. Baca lebih lanjut: https://builtin.com/data-science/train-test-split

# Install paket jika belum
# install.packages("caTools")
library(caTools)

# Set seed untuk hasil yang konsisten, cari lebih lanjut terkait set.seed()
set.seed(123)

# Bagi data (80% train, 20% test)
split <- sample.split(data$Total_Pengeluaran, SplitRatio = 0.8)
train_data <- subset(data, split == TRUE)
test_data <- subset(data, split == FALSE)

# Periksa ukuran dataset
cat("Train data:", nrow(train_data), "baris\n")
## Train data: 92 baris
cat("Test data:", nrow(test_data), "baris\n")
## Test data: 18 baris

Buat model regresi pada data training

# Model regresi pada data train
reg_model <- lm(Total_Pengeluaran ~ Total_Pendapatan, data = train_data)

# Ringkasan hasil regresi
summary(reg_model)
## 
## Call:
## lm(formula = Total_Pengeluaran ~ Total_Pendapatan, data = train_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -4765152 -1424840  -780930   423010 15430494 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      2.178e+06  4.049e+05   5.380 5.86e-07 ***
## Total_Pendapatan 1.196e-01  6.374e-02   1.876   0.0639 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2966000 on 90 degrees of freedom
## Multiple R-squared:  0.03762,    Adjusted R-squared:  0.02693 
## F-statistic: 3.518 on 1 and 90 DF,  p-value: 0.06393

Prediksi dengan data test

# Prediksi Total_Pengeluaran pada data test
test_data$prediksi_pengeluaran <- predict(reg_model, newdata = test_data)

# Lihat hasil prediksi
head(test_data[, c("Total_Pendapatan", "Total_Pengeluaran", "prediksi_pengeluaran")])
## # A tibble: 6 × 3
##   Total_Pendapatan Total_Pengeluaran prediksi_pengeluaran
##              <dbl>             <dbl>                <dbl>
## 1          1000000           1000000             2297779.
## 2          3500000           1500000             2596690.
## 3          3814443           1000000             2634287.
## 4          1300000           4000000             2333648.
## 5           300000           1200000             2214084.
## 6          4500000           1000000             2716255.

Evaluasi Model (MSE dan R-Squared pada data test)

# Hitung Mean Squared Error (MSE)
mse <- mean((test_data$Total_Pengeluaran - test_data$prediksi_pengeluaran)^2)
cat("Mean Squared Error (MSE):", mse, "\n")
## Mean Squared Error (MSE): 1.558971e+12
# Hitung R-squared
rss <- sum((test_data$Total_Pengeluaran - test_data$prediksi_pengeluaran)^2)  # Residual Sum of Squares
tss <- sum((test_data$Total_Pengeluaran - mean(test_data$Total_Pengeluaran))^2)  # Total Sum of Squares
r_squared <- 1 - (rss / tss)
cat("R-squared (Test Data):", r_squared, "\n")
## R-squared (Test Data): -0.0450739

Visualisasi

# Install ggplot2 jika belum
# install.packages("ggplot2")
library(ggplot2)

# Scatter plot dan garis prediksi pada data test
ggplot(test_data, aes(x = Total_Pendapatan)) +
  geom_point(aes(y = Total_Pengeluaran), color = "blue", size = 2) +  # Data asli
  geom_line(aes(y = prediksi_pengeluaran), color = "red", size = 1) + # Garis prediksi
  labs(title = "Scatter Plot dan Prediksi pada Data Test",
       x = "Total Pendapatan", y = "Total Pengeluaran") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.