Tabel kontingensi (juga disebut cross-tabulation atau crosstab) adalah tabel yang menyajikan frekuensi bersama dari dua atau lebih variabel kategorik. Tabel ini mengatur data ke dalam baris dan kolom, di mana setiap sel menunjukkan jumlah observasi yang memiliki kombinasi kategori tertentu.
Misalkan kita memiliki dua variabel kategorik: - Variabel \(X\) dengan \(I\) kategori: \(i = 1, 2, ..., I\) - Variabel \(Y\) dengan \(J\) kategori: \(j = 1, 2, ..., J\)
Tabel kontingensi \(I \times J\) dapat ditulis sebagai:
| \(Y_1\) | \(Y_2\) | … | \(Y_J\) | Total | |
|---|---|---|---|---|---|
| \(X_1\) | \(n_{11}\) | \(n_{12}\) | … | \(n_{1J}\) | \(n_{1.}\) |
| \(X_2\) | \(n_{21}\) | \(n_{22}\) | … | \(n_{2J}\) | \(n_{2.}\) |
| … | … | … | … | … | … |
| \(X_I\) | \(n_{I1}\) | \(n_{I2}\) | … | \(n_{IJ}\) | \(n_{I.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | … | \(n_{.J}\) | \(n\) |
Dimana: - \(n_{ij}\) = frekuensi observasi dengan \(X = i\) dan \(Y = j\) - \(n_{i.} = \sum_{j=1}^J n_{ij}\) = total baris ke-\(i\) - \(n_{.j} = \sum_{i=1}^I n_{ij}\) = total kolom ke-\(j\) - \(n = \sum_{i=1}^I \sum_{j=1}^J n_{ij}\) = total keseluruhan
Seorang dosen ingin mengetahui apakah ada hubungan antara metode belajar yang digunakan mahasiswa (Mandiri, Kelompok, atau Tutorial) dengan hasil ujian (Lulus atau Tidak Lulus). Data dari 200 mahasiswa sebagai berikut:
# Membuat tabel kontingensi contoh
tabel_contoh <- matrix(c(30, 20, 10, 40, 30, 70), nrow = 3, ncol = 2, byrow = TRUE)
dimnames(tabel_contoh) <- list(
"Metode Belajar" = c("Mandiri", "Kelompok", "Tutorial"),
"Hasil Ujian" = c("Tidak Lulus", "Lulus")
)
# Tampilkan tabel
kable(tabel_contoh,
caption = "Tabel 1.1: Tabel Kontingensi Metode Belajar vs Hasil Ujian",
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center") %>%
add_header_above(c(" " = 1, "Hasil Ujian" = 2))| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 30 | 20 |
| Kelompok | 10 | 40 |
| Tutorial | 30 | 70 |
Dari tabel di atas: - \(n_{11} =
30\): Mahasiswa dengan metode Mandiri yang Tidak Lulus - \(n_{12} = 20\): Mahasiswa dengan metode
Mandiri yang Lulus - \(n_{21} = 10\):
Mahasiswa dengan metode Kelompok yang Tidak Lulus - \(n_{22} = 40\): Mahasiswa dengan metode
Kelompok yang Lulus - \(n_{31} = 30\):
Mahasiswa dengan metode Tutorial yang Tidak Lulus
- \(n_{32} = 70\): Mahasiswa dengan
metode Tutorial yang Lulus
Total mahasiswa: - Metode Mandiri: \(n_{1.} = 30 + 20 = 50\) - Metode Kelompok: \(n_{2.} = 10 + 40 = 50\) - Metode Tutorial: \(n_{3.} = 30 + 70 = 100\) - Total keseluruhan: \(n = 200\)
Distribusi joint menunjukkan peluang suatu observasi berada pada kategori \(i\) (baris) dan kategori \(j\) (kolom) secara bersamaan.
\[p_{ij} = \frac{n_{ij}}{n}\]
Sifat: \(\sum_{i=1}^I \sum_{j=1}^J p_{ij} = 1\)
# Menghitung distribusi joint
prop_joint <- prop.table(tabel_contoh)
kable(prop_joint,
caption = "Tabel 2.1: Distribusi Joint Metode Belajar vs Hasil Ujian",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 0.15 | 0.10 |
| Kelompok | 0.05 | 0.20 |
| Tutorial | 0.15 | 0.35 |
## Total semua proporsi joint: 1
Interpretasi: - \(p_{11} = 30/200 = 0.15\): Peluang mahasiswa menggunakan metode Mandiri dan Tidak Lulus = 15% - \(p_{12} = 20/200 = 0.10\): Peluang mahasiswa menggunakan metode Mandiri dan Lulus = 10% - \(p_{32} = 70/200 = 0.35\): Peluang mahasiswa menggunakan metode Tutorial dan Lulus = 35%
Distribusi marginal adalah distribusi dari satu variabel saja, dengan mengabaikan variabel lainnya.
\[p_{i.} = \sum_{j=1}^J p_{ij} = \frac{n_{i.}}{n}\]
# Total baris
total_baris <- margin.table(tabel_contoh, 1)
prop_baris <- prop.table(total_baris)
data_baris <- data.frame(
Metode = names(prop_baris),
Frekuensi = as.numeric(total_baris),
Proporsi = as.numeric(prop_baris)
)
kable(data_baris,
caption = "Tabel 2.2: Distribusi Marginal Metode Belajar",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Metode | Frekuensi | Proporsi |
|---|---|---|
| Mandiri | 50 | 0.25 |
| Kelompok | 50 | 0.25 |
| Tutorial | 100 | 0.50 |
Interpretasi: - \(p_{1.} = 50/200 = 0.25\): 25% mahasiswa menggunakan metode Mandiri - \(p_{2.} = 50/200 = 0.25\): 25% mahasiswa menggunakan metode Kelompok - \(p_{3.} = 100/200 = 0.50\): 50% mahasiswa menggunakan metode Tutorial
\[p_{.j} = \sum_{i=1}^I p_{ij} = \frac{n_{.j}}{n}\]
# Total kolom
total_kolom <- margin.table(tabel_contoh, 2)
prop_kolom <- prop.table(total_kolom)
data_kolom <- data.frame(
Hasil = names(prop_kolom),
Frekuensi = as.numeric(total_kolom),
Proporsi = as.numeric(prop_kolom)
)
kable(data_kolom,
caption = "Tabel 2.3: Distribusi Marginal Hasil Ujian",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Hasil | Frekuensi | Proporsi |
|---|---|---|
| Tidak Lulus | 70 | 0.35 |
| Lulus | 130 | 0.65 |
Interpretasi: - \(p_{.1} = 70/200 = 0.35\): 35% mahasiswa Tidak Lulus - \(p_{.2} = 130/200 = 0.65\): 65% mahasiswa Lulus
Distribusi bersyarat adalah distribusi peluang dari satu variabel dengan syarat variabel lain berada pada kategori tertentu.
\[P(Y = j | X = i) = \frac{n_{ij}}{n_{i.}}\]
# Proporsi berdasarkan baris (bersyarat pada metode belajar)
prop_bersyarat_baris <- prop.table(tabel_contoh, margin = 1)
kable(prop_bersyarat_baris,
caption = "Tabel 2.4: Distribusi Bersyarat Hasil Ujian | Metode Belajar",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 0.6 | 0.4 |
| Kelompok | 0.2 | 0.8 |
| Tutorial | 0.3 | 0.7 |
Interpretasi: - Untuk mahasiswa dengan metode Mandiri: - Peluang Tidak Lulus = \(30/50 = 0.60\) (60%) - Peluang Lulus = \(20/50 = 0.40\) (40%) - Untuk mahasiswa dengan metode Kelompok: - Peluang Tidak Lulus = \(10/50 = 0.20\) (20%) - Peluang Lulus = \(40/50 = 0.80\) (80%) - Untuk mahasiswa dengan metode Tutorial: - Peluang Tidak Lulus = \(30/100 = 0.30\) (30%) - Peluang Lulus = \(70/100 = 0.70\) (70%)
\[P(X = i | Y = j) = \frac{n_{ij}}{n_{.j}}\]
# Proporsi berdasarkan kolom (bersyarat pada hasil ujian)
prop_bersyarat_kolom <- prop.table(tabel_contoh, margin = 2)
kable(prop_bersyarat_kolom,
caption = "Tabel 2.5: Distribusi Bersyarat Metode Belajar | Hasil Ujian",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 0.4286 | 0.1538 |
| Kelompok | 0.1429 | 0.3077 |
| Tutorial | 0.4286 | 0.5385 |
Interpretasi: - Dari mahasiswa yang Tidak Lulus: - \(30/70 = 0.429\) (42.9%) menggunakan metode Mandiri - \(10/70 = 0.143\) (14.3%) menggunakan metode Kelompok - \(30/70 = 0.428\) (42.8%) menggunakan metode Tutorial - Dari mahasiswa yang Lulus: - \(20/130 = 0.154\) (15.4%) menggunakan metode Mandiri - \(40/130 = 0.308\) (30.8%) menggunakan metode Kelompok - \(70/130 = 0.538\) (53.8%) menggunakan metode Tutorial
Ukuran asosiasi digunakan untuk mengukur kekuatan hubungan antara dua variabel kategorik.
Odds Ratio digunakan khusus untuk tabel \(2 \times 2\).
Untuk tabel \(2 \times 2\):
| Sukses | Gagal | Total | |
|---|---|---|---|
| Kelompok 1 | \(a\) | \(b\) | \(a+b\) |
| Kelompok 2 | \(c\) | \(d\) | \(c+d\) |
\[OR = \frac{a/b}{c/d} = \frac{a \times d}{b \times c}\]
Untuk menghitung Odds Ratio, kita perlu menyederhanakan tabel menjadi \(2 \times 2\). Misalkan kita ingin membandingkan metode Tutorial vs Non-Tutorial:
# Membuat tabel 2x2
tabel_2x2 <- matrix(c(
70, 30, # Tutorial: Lulus, Tidak Lulus
60, 40 # Non-Tutorial: Lulus, Tidak Lulus (Mandiri+Kelompok)
), nrow = 2, byrow = TRUE)
dimnames(tabel_2x2) <- list(
"Metode" = c("Tutorial", "Non-Tutorial"),
"Hasil" = c("Lulus", "Tidak Lulus")
)
kable(tabel_2x2,
caption = "Tabel 3.1: Tabel 2x2 Tutorial vs Non-Tutorial",
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Lulus | Tidak Lulus | |
|---|---|---|
| Tutorial | 70 | 30 |
| Non-Tutorial | 60 | 40 |
Perhitungan Manual:
\[OR = \frac{a \times d}{b \times c} = \frac{70 \times 40}{30 \times 60} = \frac{2800}{1800} = 1.556\]
a <- tabel_2x2[1,1] # Tutorial-Lulus
b <- tabel_2x2[1,2] # Tutorial-Tidak Lulus
c <- tabel_2x2[2,1] # Non-Tutorial-Lulus
d <- tabel_2x2[2,2] # Non-Tutorial-Tidak Lulus
OR <- (a * d) / (b * c)
cat("Odds Ratio =", round(OR, 4))## Odds Ratio = 1.5556
Interpretasi: Odds lulus dengan metode Tutorial adalah 1.556 kali lebih besar dibandingkan dengan metode Non-Tutorial. Ini menunjukkan adanya asosiasi positif antara metode Tutorial dan kelulusan.
Uji Chi-Square digunakan untuk menguji independensi antara dua variabel kategorik.
\[\chi^2 = \sum_{i=1}^{I} \sum_{j=1}^{J} \frac{(n_{ij} - m_{ij})^2}{m_{ij}}\]
dimana \(m_{ij}\) adalah frekuensi harapan jika tidak ada hubungan:
\[m_{ij} = \frac{n_{i.} \times n_{.j}}{n}\]
Langkah 1: Hitung Frekuensi Harapan (\(m_{ij}\))
# Menghitung frekuensi harapan
total_baris <- margin.table(tabel_contoh, 1)
total_kolom <- margin.table(tabel_contoh, 2)
n_total <- sum(tabel_contoh)
frekuensi_harapan <- matrix(0, nrow = 3, ncol = 2)
for(i in 1:3) {
for(j in 1:2) {
frekuensi_harapan[i,j] <- (total_baris[i] * total_kolom[j]) / n_total
}
}
dimnames(frekuensi_harapan) <- dimnames(tabel_contoh)
kable(frekuensi_harapan,
caption = "Tabel 3.2: Frekuensi Harapan (Jika Independen)",
digits = 2,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 17.5 | 32.5 |
| Kelompok | 17.5 | 32.5 |
| Tutorial | 35.0 | 65.0 |
Perhitungan manual untuk \(m_{11}\): \[m_{11} = \frac{n_{1.} \times n_{.1}}{n} = \frac{50 \times 70}{200} = \frac{3500}{200} = 17.5\]
Langkah 2: Hitung Komponen Chi-Square
\[\frac{(n_{ij} - m_{ij})^2}{m_{ij}}\]
komponen_chi <- (tabel_contoh - frekuensi_harapan)^2 / frekuensi_harapan
kable(komponen_chi,
caption = "Tabel 3.3: Komponen Chi-Square per Sel",
digits = 4,
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Tidak Lulus | Lulus | |
|---|---|---|
| Mandiri | 8.9286 | 4.8077 |
| Kelompok | 3.2143 | 1.7308 |
| Tutorial | 0.7143 | 0.3846 |
Perhitungan manual untuk sel (1,1): \[\frac{(30 - 17.5)^2}{17.5} = \frac{(12.5)^2}{17.5} = \frac{156.25}{17.5} = 8.9286\]
Langkah 3: Hitung Nilai Chi-Square
\[\chi^2 = \sum \text{komponen} = 8.9286 + 0.5952 + 3.5714 + 0.2381 + 0 + 8.5714 = 21.9047\]
## Chi-Square = 19.7802
Langkah 4: Tentukan Derajat Bebas
\[df = (I - 1)(J - 1) = (3 - 1)(2 - 1) = 2 \times 1 = 2\]
Langkah 5: Bandingkan dengan Nilai Kritis
Nilai kritis Chi-Square dengan \(df = 2\) pada \(\alpha = 0.05\) adalah 5.991. Karena \(\chi^2 = 21.905 > 5.991\), kita tolak \(H_0\). Artinya, terdapat hubungan yang signifikan antara metode belajar dan hasil ujian.
V Cramer adalah ukuran asosiasi yang dinormalisasi sehingga nilainya antara 0 dan 1.
\[V = \sqrt{\frac{\chi^2}{n \times \min(I-1, J-1)}}\]
v_cramer <- sqrt(chi2_value / (n_total * min(nrow(tabel_contoh)-1, ncol(tabel_contoh)-1)))
cat("V Cramer =", round(v_cramer, 4))## V Cramer = 0.3145
# Interpretasi
if(v_cramer < 0.1) {
cat("\nInterpretasi: Asosiasi kecil")
} else if(v_cramer < 0.3) {
cat("\nInterpretasi: Asosiasi sedang")
} else {
cat("\nInterpretasi: Asosiasi besar")
}##
## Interpretasi: Asosiasi besar
Perhitungan Manual: \[V = \sqrt{\frac{21.905}{200 \times \min(2,1)}} = \sqrt{\frac{21.905}{200 \times 1}} = \sqrt{0.1095} = 0.331\]
\[C = \sqrt{\frac{\chi^2}{\chi^2 + n}}\]
c_koef <- sqrt(chi2_value / (chi2_value + n_total))
cat("Koefisien Kontingensi C =", round(c_koef, 4))## Koefisien Kontingensi C = 0.3
Perhitungan Manual: \[C = \sqrt{\frac{21.905}{21.905 + 200}} = \sqrt{\frac{21.905}{221.905}} = \sqrt{0.0987} = 0.314\]
Kita akan mensimulasikan data tentang hubungan antara tingkat stres (Rendah, Sedang, Tinggi) dan kualitas tidur (Buruk, Cukup, Baik).
set.seed(123) # untuk reproduktifitas
n <- 300
# Simulasi tingkat stres
stres <- sample(c("Rendah", "Sedang", "Tinggi"),
size = n,
replace = TRUE,
prob = c(0.3, 0.4, 0.3))
# Simulasi kualitas tidur dengan probabilitas tergantung stres
# Semakin tinggi stres, semakin buruk kualitas tidur
kualitas_tidur <- vector(length = n)
for(i in 1:n) {
if(stres[i] == "Rendah") {
kualitas_tidur[i] <- sample(c("Buruk", "Cukup", "Baik"), 1,
prob = c(0.1, 0.3, 0.6))
} else if(stres[i] == "Sedang") {
kualitas_tidur[i] <- sample(c("Buruk", "Cukup", "Baik"), 1,
prob = c(0.3, 0.4, 0.3))
} else { # Tinggi
kualitas_tidur[i] <- sample(c("Buruk", "Cukup", "Baik"), 1,
prob = c(0.6, 0.3, 0.1))
}
}
# Gabungkan menjadi data frame
data_stres <- data.frame(
Stres = factor(stres, levels = c("Rendah", "Sedang", "Tinggi")),
Kualitas_Tidur = factor(kualitas_tidur, levels = c("Buruk", "Cukup", "Baik"))
)
# Tampilkan 10 baris pertama
head(data_stres, 10)## Stres Kualitas_Tidur
## 1 Sedang Buruk
## 2 Rendah Baik
## 3 Tinggi Cukup
## 4 Rendah Cukup
## 5 Rendah Cukup
## 6 Sedang Baik
## 7 Tinggi Buruk
## 8 Rendah Baik
## 9 Tinggi Buruk
## 10 Tinggi Buruk
# Membuat tabel kontingensi
tabel_stres <- table(data_stres$Stres, data_stres$Kualitas_Tidur)
kable(tabel_stres,
caption = "Tabel 4.1: Tabel Kontingensi Tingkat Stres vs Kualitas Tidur",
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center") %>%
add_header_above(c(" " = 1, "Kualitas Tidur" = 3))| Buruk | Cukup | Baik | |
|---|---|---|---|
| Rendah | 4 | 25 | 55 |
| Sedang | 40 | 50 | 31 |
| Tinggi | 59 | 22 | 14 |
# Tabel dengan margin
tabel_stres_margin <- addmargins(tabel_stres)
kable(tabel_stres_margin,
caption = "Tabel 4.2: Tabel Kontingensi dengan Margin",
booktabs = TRUE) %>%
kable_styling(full_width = FALSE, position = "center")| Buruk | Cukup | Baik | Sum | |
|---|---|---|---|---|
| Rendah | 4 | 25 | 55 | 84 |
| Sedang | 40 | 50 | 31 | 121 |
| Tinggi | 59 | 22 | 14 | 95 |
| Sum | 103 | 97 | 100 | 300 |
## Distribusi Joint:
##
## Buruk Cukup Baik
## Rendah 0.0133 0.0833 0.1833
## Sedang 0.1333 0.1667 0.1033
## Tinggi 0.1967 0.0733 0.0467
# Distribusi Marginal Stres
prop_stres <- prop.table(margin.table(tabel_stres, 1))
cat("\nDistribusi Marginal Stres:\n")##
## Distribusi Marginal Stres:
##
## Rendah Sedang Tinggi
## 0.2800 0.4033 0.3167
# Distribusi Marginal Kualitas Tidur
prop_tidur <- prop.table(margin.table(tabel_stres, 2))
cat("\nDistribusi Marginal Kualitas Tidur:\n")##
## Distribusi Marginal Kualitas Tidur:
##
## Buruk Cukup Baik
## 0.3433 0.3233 0.3333
# Distribusi Bersyarat Kualitas Tidur | Stres
prop_conditional <- prop.table(tabel_stres, margin = 1)
cat("\nDistribusi Bersyarat Kualitas Tidur | Stres:\n")##
## Distribusi Bersyarat Kualitas Tidur | Stres:
##
## Buruk Cukup Baik
## Rendah 0.0476 0.2976 0.6548
## Sedang 0.3306 0.4132 0.2562
## Tinggi 0.6211 0.2316 0.1474
Interpretasi Distribusi Bersyarat: - Untuk stres Rendah: - 6.7% tidur buruk, 30% tidur cukup, 63.3% tidur baik - Untuk stres Sedang: - 27.3% tidur buruk, 39% tidur cukup, 33.8% tidur baik - Untuk stres Tinggi: - 57.1% tidur buruk, 31.4% tidur cukup, 11.4% tidur baik
##
## Pearson's Chi-squared test
##
## data: tabel_stres
## X-squared = 86.514, df = 4, p-value < 2.2e-16
# Ekstrak nilai
chi2_stres <- uji_stres$statistic
p_value_stres <- uji_stres$p.value
df_stres <- uji_stres$parameter
n_stres <- sum(tabel_stres)
# Hitung V Cramer
v_stres <- sqrt(chi2_stres / (n_stres * min(nrow(tabel_stres)-1, ncol(tabel_stres)-1)))
# Hitung Koefisien Kontingensi C
c_stres <- sqrt(chi2_stres / (chi2_stres + n_stres))
# Tampilkan ringkasan
cat("\n=== RINGKASAN UKURAN ASOSIASI ===\n")##
## === RINGKASAN UKURAN ASOSIASI ===
## Chi-Square = 86.5142
## Derajat Bebas = 4
## P-value = 7.238796e-18
## V Cramer = 0.3797
## Koefisien C = 0.4731
##
## INTERPRETASI:
if(p_value_stres < 0.05) {
cat("- Pada α = 0.05, terdapat hubungan signifikan antara tingkat stres dan kualitas tidur\n")
} else {
cat("- Pada α = 0.05, tidak terdapat hubungan signifikan antara tingkat stres dan kualitas tidur\n")
}## - Pada α = 0.05, terdapat hubungan signifikan antara tingkat stres dan kualitas tidur
if(v_stres < 0.1) {
cat("- Kekuatan asosiasi: Kecil (V Cramer =", round(v_stres, 3), ")\n")
} else if(v_stres < 0.3) {
cat("- Kekuatan asosiasi: Sedang (V Cramer =", round(v_stres, 3), ")\n")
} else {
cat("- Kekuatan asosiasi: Besar (V Cramer =", round(v_stres, 3), ")\n")
}## - Kekuatan asosiasi: Besar (V Cramer = 0.38 )
# Barplot distribusi bersyarat
prop_df <- as.data.frame(prop_conditional)
colnames(prop_df) <- c("Stres", "Kualitas_Tidur", "Proporsi")
ggplot(prop_df, aes(x = Stres, y = Proporsi, fill = Kualitas_Tidur)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("#FF6B6B", "#4ECDC4", "#45B7D1")) +
labs(title = "Proporsi Kualitas Tidur berdasarkan Tingkat Stres",
x = "Tingkat Stres", y = "Proporsi",
fill = "Kualitas Tidur") +
theme_minimal() +
theme(legend.position = "bottom")| Ukuran | Rumus | Keterangan |
|---|---|---|
| Joint | \(p_{ij} = n_{ij}/n\) | \(\sum\sum p_{ij} = 1\) |
| Marginal Baris | \(p_{i.} = n_{i.}/n\) | Distribusi variabel baris |
| Marginal Kolom | \(p_{.j} = n_{.j}/n\) | Distribusi variabel kolom |
| Odds Ratio | \(OR = (a \times d)/(b \times c)\) | Untuk tabel \(2 \times 2\) |
| Chi-Square | \(\chi^2 = \sum (O-E)^2/E\) | Uji independensi |
| V Cramer | \(V = \sqrt{\chi^2/(n \times \min(I-1,J-1))}\) | Ukuran asosiasi |