Analisis data kategori merupakan salah satu metode penting dalam statistika yang berfokus pada pengolahan dan interpretasi data yang bersifat non-numerik. Data kategori, atau sering disebut data kualitatif, terdiri dari label atau kategori yang menggambarkan karakteristik tertentu dari objek atau individu, seperti jenis kelamin (laki-laki, perempuan), warna (merah, biru, hijau), atau jenis pekerjaan (guru, dokter, insinyur). Berbeda dengan data numerik yang melibatkan angka dan operasi matematika, data kategori memerlukan pendekatan khusus untuk mengungkap pola, hubungan, atau distribusi yang ada di dalamnya.
Pentingnya analisis data kategori terletak pada kemampuannya untuk membantu kita memahami struktur dan karakteristik data yang tidak dapat diukur secara kuantitatif. Melalui analisis ini, kita dapat mengetahui frekuensi kemunculan setiap kategori, mengidentifikasi hubungan antar variabel kategori, serta menguji apakah hubungan tersebut signifikan secara statistik. Misalnya, dalam sebuah survei, analisis data kategori memungkinkan kita untuk mengeksplorasi apakah terdapat perbedaan preferensi warna antara responden laki-laki dan perempuan, atau apakah ada korelasi antara tingkat pendidikan dan pilihan karier.
Analisis data kategori dilakukan untuk mengolah dan menginterpretasikan data kualitatif atau non-numerik yang terdiri dari kategori atau label, seperti jenis kelamin, warna, atau tingkat pendidikan. Berikut adalah tujuan utama dari analisis data kategori:
Analisis ini memungkinkan peneliti dan praktisi untuk mengidentifikasi pola tersembunyi dalam data kategorikal. Misalnya, dalam penelitian pemasaran, analisis ini dapat digunakan untuk memahami preferensi konsumen berdasarkan kelompok demografis tertentu, seperti usia atau lokasi geografis.
Dalam banyak kasus, hubungan antara dua atau lebih variabel kategorikal menjadi perhatian utama. Contohnya, dalam penelitian kesehatan, analisis ini dapat membantu memahami hubungan antara gaya hidup (merokok/tidak merokok) dan penyakit tertentu (ada/tidak ada).
Dengan memahami pola dan hubungan dalam data kategorikal, pengambil keputusan dapat membuat strategi yang lebih tepat sasaran. Misalnya, dalam kebijakan publik, analisis ini dapat digunakan untuk menentukan kebijakan sosial berdasarkan segmentasi masyarakat, seperti kelompok pendapatan rendah atau menengah.
Banyak model prediktif menggunakan data kategorikal sebagai input, seperti regresi logistik untuk memprediksi kejadian biner (misalnya, apakah seorang pasien memiliki risiko tinggi terkena penyakit atau tidak). Model ini sangat berguna dalam berbagai aplikasi, dari kesehatan hingga pemasaran.
Definisi: Analisis data kategori adalah teknik statistik yang digunakan untuk menganalisis variabel yang bersifat kategorikal, yaitu variabel yang terdiri dari kategori atau kelompok, bukan nilai numerik kontinu. Data kategorikal sering kali berupa label atau nama, seperti “laki-laki” atau “perempuan” untuk jenis kelamin, atau “rendah”, “sedang”, “tinggi” untuk tingkat pendidikan. Data ini tidak dapat dijumlahkan atau dikurangi seperti data numerik, tetapi dapat dianalisis untuk menemukan pola dan hubungan.
Ruang Lingkup: Analisis data kategori mencakup dua jenis utama data kategorikal:
Metode analisis yang umum digunakan meliputi:
Ruang lingkupnya juga meluas ke aplikasi modern seperti machine learning, di mana data kategorikal digunakan dalam algoritma klasifikasi, dan analisis big data, di mana data kategorikal dari media sosial atau survei online dianalisis untuk mendapatkan wawasan.
Data kategorikal berbeda secara fundamental dari data kuantitatif atau numerik. Berikut adalah perbedaan utamanya:
Aspek | Data Kategorik | Data Kuantitatif |
---|---|---|
Skala Pengukuran | Bersifat diskrit, terdiri dari kategori atau label tanpa nilai numerik kontinu. | Bersifat kontinu atau diskrit numerik, dapat diukur dengan skala yang bermakna. |
Contoh | Jenis kelamin (laki-laki/perempuan), tingkat kepuasan (puas/tidak puas). | Tinggi badan (170 cm), suhu (25°C), jumlah penjualan (100 unit). |
Metode Analisis | Uji chi-square, regresi logistik, analisis korespondensi. | Regresi linear, ANOVA, uji t, analisis korelasi. |
Representasi Data | Tabel frekuensi, diagram batang, pie chart. | Histogram, scatter plot, box plot. |
Analisis data kategori memiliki aplikasi yang luas di berbagai disiplin ilmu dan industri, membantu organisasi dan peneliti membuat keputusan yang lebih baik berdasarkan data. Berikut adalah manfaat dan tiga contoh spesifik untuk setiap bidang:
Manfaat: Analisis data kategori memungkinkan
pemahaman mendalam tentang perilaku manusia, opini publik, dan faktor
sosial, yang sering kali diukur dalam bentuk kategori seperti tingkat
kepuasan atau kelompok demografis.
Contoh:
Manfaat: Dalam bidang kesehatan, analisis data
kategori membantu mengidentifikasi faktor risiko, mengevaluasi
efektivitas pengobatan, dan memahami distribusi kesehatan dalam
populasi.
Contoh:
Manfaat: Analisis data kategori membantu memahami
preferensi pelanggan, segmentasi pasar, dan efektivitas strategi
pemasaran, yang penting untuk meningkatkan penjualan dan loyalitas
pelanggan.
Contoh:
Manfaat: Analisis data kategori digunakan untuk
mengevaluasi metode pengajaran, kepuasan mahasiswa, dan efektivitas
program pendidikan, membantu meningkatkan kualitas pendidikan.
Contoh:
Manfaat: Analisis data kategori membantu pemerintah
memahami kebutuhan masyarakat, mengevaluasi kebijakan, dan merancang
program yang efektif, terutama melalui analisis survei dan data
demografis.
Contoh:
Manfaat: Analisis data kategori membantu memahami
pola kejahatan, mengidentifikasi faktor risiko, dan mengembangkan
strategi pencegahan, yang penting untuk keamanan masyarakat.
Contoh:
Uji Chi-Square bertujuan untuk menguji apakah terdapat hubungan signifikan antara dua variabel kategorikal, seperti apakah variabel independen memengaruhi variabel dependen. Metode ini sering digunakan dalam analisis survei, misalnya, untuk menentukan apakah tingkat pendidikan (rendah, menengah, tinggi) berkaitan dengan status pekerjaan (bekerja, tidak bekerja). Tabel kontingensi merangkum frekuensi observasi untuk kombinasi kategori dari dua variabel. Uji Chi-Square menguji apakah frekuensi yang diamati (\(O\)) berbeda secara signifikan dari frekuensi yang diharapkan (\(E\)) di bawah asumsi independensi. Rumus uji Chi-Square adalah:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Frekuensi yang diharapkan dihitung sebagai:
\[ E_{ij} = \frac{(R_i \times C_j)}{N} \]
di mana \(R_i\) adalah total baris
ke-\(i\), \(C_j\) adalah total kolom ke-\(j\), dan \(N\) adalah total sampel. Nilai \(\chi^2\) dibandingkan dengan distribusi
chi-square untuk menentukan signifikansi statistik (biasanya dengan
nilai p < 0,05). Implementasi di R menggunakan fungsi
chisq.test()
dari paket dasar.
Regresi logistik digunakan untuk memprediksi probabilitas kejadian biner (misalnya, 0 atau 1, sukses atau gagal) berdasarkan satu atau lebih variabel prediktor, yang bisa kategorikal atau numerik.Contohnya, memprediksi apakah seorang pelanggan akan membeli produk (ya/tidak) berdasarkan preferensi mereka (puas/tidak puas) atau demografi (usia, jenis kelamin). Regresi logistik adalah bagian dari Generalized Linear Model (GLM) yang menggunakan fungsi logit sebagai fungsi link. Modelnya dinyatakan sebagai:
\[ \log\left(\frac{\mu}{1-\mu}\right) = X\beta \]
di mana: - \(\mu\) adalah probabilitas kejadian (misalnya, \(P(Y=1)\)), - \(X\) adalah matriks variabel prediktor, - \(\beta\) adalah vektor koefisien yang diestimasi.
Probabilitas \(\mu\) dihitung menggunakan fungsi invers logit:
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Estimasi parameter dilakukan menggunakan Maximum Likelihood
Estimation (MLE). Implementasi di R menggunakan fungsi
glm()
dengan argumen family = binomial
.
Analisis korespondensi (Correspondence Analysis, CA) bertujuan untuk
memvisualisasikan dan memahami hubungan antara kategori dalam tabel
kontingensi, dengan mereduksi dimensi data ke ruang dua dimensi. Metode
ini berguna untuk menganalisis preferensi konsumen, seperti hubungan
antara kelompok usia (muda, dewasa, lansia) dan jenis makanan (manis,
asin, pedas). Analisis korespondensi adalah teknik multivariat yang
menguraikan tabel kontingensi menjadi komponen utama, mirip dengan
analisis komponen utama untuk data numerik. Ini menghasilkan plot yang
menunjukkan kedekatan antar kategori berdasarkan asosiasi mereka.
Prosesnya melibatkan dekomposisi matriks chi-square untuk
mengidentifikasi sumbu utama variasi. Implementasi di R menggunakan
paket ca
.
Decision Tree dan Random Forest adalah metode machine learning untuk mengklasifikasikan data kategorikal, dengan Random Forest meningkatkan akurasi melalui penggabungan beberapa pohon keputusan. Contohnya, mengklasifikasikan pelanggan berdasarkan tingkat loyalitas (rendah, sedang, tinggi) menggunakan variabel seperti frekuensi pembelian dan kepuasan.
Random Forest: Menggabungkan banyak decision tree untuk mengurangi overfitting dan meningkatkan akurasi prediksi. Setiap pohon dilatih pada subset data dan fitur yang berbeda.
Implementasi di R menggunakan paket rpart
untuk Decision
Tree dan randomForest
untuk Random Forest.
Selain metode di atas, analisis data kategori juga dapat mencakup teknik lain seperti:
Metode | Tujuan | Aplikasi | Rumus Utama | Implementasi R |
---|---|---|---|---|
Tabel Kontingensi & Chi-Square | Menguji hubungan antar variabel | Analisis survei, hubungan demografis | \(\chi^2 = \sum \frac{(O - E)^2}{E}\) | chisq.test() |
Regresi Logistik | Prediksi hasil biner | Prediksi pembelian, risiko kesehatan | \(\log\left(\frac{\mu}{1-\mu}\right) = X\beta\) | glm(family = binomial) |
Analisis Korespondensi | Visualisasi hubungan antar kategori | Preferensi konsumen, analisis pasar | Dekomposisi chi-square | ca() |
Decision Tree & Random Forest | Klasifikasi data kategorikal | Segmentasi pelanggan, prediksi loyalitas | Berbasis Gini/information gain | rpart() , randomForest() |
Distribusi peluang adalah dasar dalam analisis data kategori, membantu kita memodelkan dan memahami kemungkinan hasil dari variabel kategori. Data kategori, seperti jenis kelamin, tingkat pendidikan, atau preferensi konsumen, sering kali bersifat diskrit dan terdiri dari kategori, bukan nilai numerik kontinu.
Distribusi Bernoulli digunakan untuk memodelkan eksperimen biner dengan dua hasil mungkin, yaitu sukses (biasanya dilambangkan sebagai 1) atau gagal (dilambangkan sebagai 0). Distribusi ini adalah dasar untuk distribusi lain seperti Binomial.
Fungsi probabilitas distribusi Bernoulli diberikan oleh:
\[ P(X=x) = p^x (1-p)^{1-x}, \quad x \in \{0,1\} \]
di mana: - \(X\) adalah variabel acak yang bernilai 0 (gagal) atau 1 (sukses), - \(p\) adalah probabilitas sukses (\(P(X=1)\)), - \(1-p\) adalah probabilitas gagal (\(P(X=0)\)).
Distribusi Bernoulli dapat disimulasikan menggunakan fungsi
rbinom()
dengan ukuran percobaan (\(n\)) ditetapkan ke 1.
# Simulasi 10 percobaan Bernoulli dengan probabilitas sukses p = 0.5
set.seed(123)
bernoulli_trials <- rbinom(10, 1, 0.5)
bernoulli_trials
## [1] 0 1 0 1 1 0 1 1 1 0
Hasilnya adalah vektor dengan nilai 0 atau 1, mewakili gagal atau sukses dalam setiap percobaan. Distribusi ini sederhana namun penting untuk memodelkan data biner.
Distribusi Binomial menggeneralisasi distribusi Bernoulli ke \(n\) percobaan independen, masing-masing dengan dua hasil (sukses atau gagal). Distribusi ini menghitung jumlah sukses dalam \(n\) percobaan.
Fungsi probabilitas distribusi Binomial adalah:
\[ P(X=k) = \binom{n}{k} p^k (1-p)^{n-k} \]
di mana: - \(X\) adalah jumlah sukses dalam \(n\) percobaan, - \(k\) adalah jumlah sukses yang diamati (\(k = 0, 1, \ldots, n\)), - \(p\) adalah probabilitas sukses per percobaan, - \(\binom{n}{k} = \frac{n!}{k!(n-k)!}\) adalah koefisien binomial, yang menghitung jumlah cara memilih \(k\) sukses dari \(n\) percobaan.
Distribusi Binomial dapat disimulasikan menggunakan fungsi
rbinom()
dengan parameter jumlah percobaan (\(n\)) dan probabilitas sukses (\(p\)).
# Simulasi satu percobaan binomial dengan n=10, p=0.5
set.seed(123)
binomial_trial <- rbinom(1, 10, 0.5)
binomial_trial
## [1] 4
Hasilnya adalah jumlah sukses (misalnya, jumlah kepala) dalam satu set percobaan. Distribusi ini berguna untuk memodelkan data kategori dengan hasil biner yang diulang.
Distribusi Multinomial memperluas distribusi Binomial ke kasus di mana setiap percobaan dapat memiliki lebih dari dua hasil (kategori). Distribusi ini memodelkan frekuensi kemunculan setiap kategori dalam \(n\) percobaan.
Fungsi probabilitas distribusi Multinomial adalah:
\[ P(X_1=x_1, \ldots, X_k=x_k) = \frac{n!}{x_1! x_2! \ldots x_k!} p_1^{x_1} p_2^{x_2} \ldots p_k^{x_k} \]
di mana: - \(X_i\) adalah frekuensi kategori ke-\(i\), - \(n\) adalah jumlah total percobaan (\(x_1 + x_2 + \ldots + x_k = n\)), - \(x_i\) adalah jumlah kemunculan kategori ke-\(i\), - \(p_i\) adalah probabilitas kategori ke-\(i\), dengan \(\sum p_i = 1\).
Distribusi Multinomial dapat disimulasikan menggunakan fungsi
rmultinom()
dengan parameter jumlah percobaan dan vektor
probabilitas.
# Simulasi satu percobaan multinomial dengan n=10 dan probabilitas (0.3, 0.5, 0.2)
set.seed(123)
multinomial_trial <- rmultinom(1, 10, c(0.3, 0.5, 0.2))
multinomial_trial
## [,1]
## [1,] 2
## [2,] 5
## [3,] 3
Hasilnya adalah vektor yang menunjukkan frekuensi setiap kategori dalam satu percobaan. Distribusi ini ideal untuk data kategori dengan lebih dari dua hasil.
Distribusi Poisson memodelkan jumlah kejadian yang terjadi dalam interval waktu atau ruang tetap, dengan tingkat rata-rata yang konstan (\(\lambda\)). Distribusi ini sering digunakan untuk data hitungan (count data) dalam analisis kategori.
Fungsi probabilitas distribusi Poisson adalah:
\[ P(X=k) = \frac{e^{-\lambda} \lambda^k}{k!} \]
di mana: - \(X\) adalah jumlah kejadian, - \(\lambda\) adalah tingkat rata-rata kejadian per interval, - \(k\) adalah jumlah kejadian yang diamati (\(k = 0, 1, 2, \ldots\)).
Distribusi Poisson dapat disimulasikan menggunakan fungsi
rpois()
dengan parameter tingkat rata-rata (\(\lambda\)).
# Simulasi 10 sampel Poisson dengan lambda = 3
set.seed(123)
poisson_samples <- rpois(10, 3)
poisson_samples
## [1] 2 4 2 5 6 0 3 5 3 3
Hasilnya adalah vektor yang menunjukkan jumlah kejadian dalam setiap simulasi. Distribusi ini sangat berguna untuk memodelkan data kategori berbasis hitungan.
Pada analisis data kategori,diperlukan adanya desain sampling yang tepat untuk memastikan validitas dan reliabilitas hasil penelitian. Desain sampling itu sendiri adalah strategi untuk memilih sebagian individu atau unit dari populasi agar hasil analisis dapat mewakili populasi secara keseluruhan. Pemilihan desain sampling yang sesuai bergantung pada tujuan penelitian, jenis data yang dikumpulkan, dan sumber daya yang tersedia.
Sampling prospektif melibatkan identifikasi dan pengamatan subjek dalam periode waktu tertentu untuk memantau perkembangan variabel yang menarik. Pendekatan ini sering digunakan dalam studi kausal dan eksperimental karena memungkinkan peneliti untuk mengontrol variabel independen sebelum mengukur hasilnya.
Eksperimen dirancang untuk menguji hubungan sebab-akibat dengan mengalokasikan subjek secara acak ke kelompok perlakuan dan kontrol. Metode sampling yang umum digunakan dalam eksperimen meliputi:
Studi kohort mengamati sekelompok individu dari waktu ke waktu untuk melihat bagaimana variabel tertentu memengaruhi hasil. Metode sampling yang digunakan meliputi:
Sampling retrospektif melibatkan pengumpulan data dari peristiwa yang telah terjadi, sering digunakan dalam studi observasional untuk mengidentifikasi hubungan antara faktor risiko dan hasil. Pendekatan ini efisien karena memanfaatkan data yang sudah ada.
Studi kasus-kontrol membandingkan individu dengan hasil tertentu (kasus) dengan individu tanpa hasil tersebut (kontrol) untuk mengidentifikasi faktor risiko. Metode sampling yang digunakan adalah:
Studi kohort retrospektif menganalisis data historis untuk menilai hubungan antara paparan masa lalu dan hasil saat ini. Metode sampling yang digunakan meliputi:
Tabel berikut merangkum perbandingan desain sampling dalam analisis data kategori, berdasarkan jenis studi, pendekatan sampling, metode, kelebihan, dan kekurangan:
Jenis Studi | Pendekatan Sampling | Metode Sampling | Kelebihan | Kekurangan |
---|---|---|---|---|
Eksperimen | Prospektif | SRS, Stratified, Cluster | Kontrol tinggi atas variabel, cocok untuk analisis kausal | Mahal, sensitif secara etis |
Studi Kohort | Prospektif | Census, Systematic, Matched | Memungkinkan pengamatan jangka panjang | Memakan waktu, risiko kehilangan partisipan |
Studi Kasus-Kontrol | Retrospektif | Purposive, Snowball, Incidence Density | Cepat, efisien untuk penyakit langka | Sulit mengontrol variabel pengganggu, rentan terhadap bias recall |
Studi Kohort Retrospektif | Retrospektif | Convenience, Quota, Case-Based | Hemat biaya, memanfaatkan data historis | Bergantung pada kualitas data, rentan terhadap data hilang |
Tabel ini membantu peneliti memilih desain sampling yang paling sesuai dengan tujuan penelitian mereka, dengan mempertimbangkan kelebihan dan kekurangan masing-masing metode.
Berikut adalah beberapa contoh aplikasi desain sampling dalam analisis data kategori:
Misalkan kita memiliki data mengenai:
Penggunaan Mobile Banking: “Menggunakan Mobile Banking” dan “Tidak Menggunakan Mobile Banking”
Kejadian Korban Penipuan: “Korban Penipuan” dan “Bukan Korban”
Data yang diperoleh adalah sebagai berikut:
Korban Penipuan | Bukan Korban | Jumlah Baris | |
---|---|---|---|
Menggunakan Mobile Banking | 12 | 48 | 60 |
Tidak Menggunakan Mobile Banking | 6 | 84 | 90 |
Jumlah Kolom | 18 | 132 | 150 |
# Membuat matriks tabel kontingensi
tabel <- matrix(c(12, 48, 6, 84), nrow = 2, byrow = TRUE)
rownames(tabel) <- c("Menggunakan Mobile Banking", "Tidak Menggunakan Mobile Banking")
colnames(tabel) <- c("Korban Penipuan", "Bukan Korban")
print(tabel)
## Korban Penipuan Bukan Korban
## Menggunakan Mobile Banking 12 48
## Tidak Menggunakan Mobile Banking 6 84
Keterangan:
\(a = 12\) (Menggunakan MB & Korban Penipuan)
\(b = 48\) (Menggunakan MB & Bukan Korban)
\(c = 6\) (Tidak Menggunakan MB & Korban Penipuan)
\(d = 84\) (Tidak Menggunakan MB & Bukan Korban)
Total sampel \(N = 150\)
Definisi:
Peluang Bersama (Joint Probability) adalah probabilitas terjadinya dua
kejadian secara bersamaan. Konsep ini membantu kita memahami seberapa
sering dua peristiwa yang saling terkait muncul bersamaan dalam data.
(Triola, 2018; Devore, 2015)
Rumus:
\[
P(A \cap B) = \frac{n_{AB}}{N}
\]
\(P(\text{MB} \cap \text{Korban
Penipuan}) = \frac{12}{150} \approx 0.08\)
\(P(\text{MB} \cap \text{Bukan Korban})
= \frac{48}{150} \approx 0.32\)
\(P(\text{Tidak MB} \cap \text{Korban
Penipuan}) = \frac{6}{150} = 0.04\)
\(P(\text{Tidak MB} \cap \text{Bukan Korban}) = \frac{84}{150} = 0.56\)
# Total sampel
N <- sum(tabel)
cat("Total sampel N =", N, "\n")
## Total sampel N = 150
# Peluang Bersama (Joint Probability)
p_joint <- tabel / N
cat("Peluang Bersama:\n")
## Peluang Bersama:
print(p_joint)
## Korban Penipuan Bukan Korban
## Menggunakan Mobile Banking 0.08 0.32
## Tidak Menggunakan Mobile Banking 0.04 0.56
Kapan Digunakan:
Digunakan untuk mengetahui seberapa besar kemungkinan dua peristiwa yang
saling terkait terjadi bersamaan.
Interpretasi:
Misalnya, jika \(P(\text{MB} \cap \text{Korban
Penipuan}) = \frac{12}{150} \approx 0.08\), artinya 8% dari
seluruh pelanggan mengalami kedua kondisi tersebut secara bersamaan.
Definisi:
Peluang Marginal adalah probabilitas terjadinya satu kejadian tanpa
mempertimbangkan kejadian lain. Hal ini memberikan gambaran mengenai
distribusi masing-masing variabel secara individu. (Triola, 2018; Moore
& McCabe, 2005)
Rumus Marginal untuk Baris (Row):
- Untuk Mobile Banking:
\[
P(\text{MB}) = \frac{a+b}{N} = \frac{12+48}{150} = \frac{60}{150} =
0.4
\]
- Untuk Tidak Mobile Banking:
\[
P(\text{Tidak MB}) = \frac{c+d}{N} = \frac{6+84}{150} = \frac{90}{150}
= 0.6
\]
Rumus Marginal untuk Kolom (Column):
- Untuk Korban Penipuan:
\[
P(\text{Korban Penipuan}) = \frac{a+c}{N} = \frac{12+6}{150} =
\frac{18}{150} = 0.12
\]
- Untuk Bukan Korban:
\[
P(\text{Bukan Korban}) = \frac{b+d}{N} = \frac{48+84}{150} =
\frac{132}{150} = 0.88
\]
# Peluang Marginal
p_MB <- sum(tabel["Menggunakan Mobile Banking", ]) / N
p_Korban <- sum(tabel[, "Korban Penipuan"]) / N
cat("Peluang Marginal:\n")
## Peluang Marginal:
cat("P(Mobile Banking) =", p_MB, "\n")
## P(Mobile Banking) = 0.4
cat("P(Korban Penipuan) =", p_Korban, "\n")
## P(Korban Penipuan) = 0.12
Kapan Digunakan:
Digunakan untuk menghitung proporsi atau persentase masing-masing
kejadian pada seluruh sampel data.
Interpretasi:
Jika \(P(\text{MB}) = \frac{60}{150} =
0.4\), maka 40% pelanggan menggunakan mobile banking. Sedangkan,
\(P(\text{Korban Penipuan}) = \frac{18}{150} =
0.12\) berarti 12% pelanggan mengalami korban penipuan.
Definisi:
Peluang Bersyarat adalah probabilitas terjadinya suatu kejadian dengan
asumsi bahwa kejadian lain telah terjadi. Ini membantu kita
membandingkan risiko atau probabilitas antara dua kelompok yang berbeda.
(Triola, 2018; Agresti, 2018)
Rumus:
Berdasarkan status penggunaan mobile banking:
\[P(\text{Korban Penipuan}|\text{MB}) = \frac{a}{a+b} = \frac{12}{60} = 0.2\]
\[P(\text{Bukan Korban}|\text{MB}) = \frac{b}{a+b} = \frac{48}{60} = 0.8\]
\[P(\text{Korban Penipuan}|\text{Tidak MB}) = \frac{c}{c+d} = \frac{6}{90} \approx 0.0667\]
\[P(\text{Bukan Korban}|\text{Tidak MB}) = \frac{d}{c+d} = \frac{84}{90} \approx 0.9333\]
Berdasarkan status korban:
\[P(\text{MB}|\text{Korban Penipuan}) = \frac{a}{a+c} = \frac{12}{18} \approx 0.667\]
\[P(\text{Tidak MB}|\text{Korban Penipuan}) = \frac{c}{a+c} = \frac{6}{18} \approx 0.333\]
\[P(\text{Tidak MB}|\text{Bukan Korban}) = \frac{d}{b+d} = \frac{84}{132} \approx 0.636\]
#Pelua ng Bersyarat (berdasarkan MB)
p_Korban_given_MB <- tabel["Menggunakan Mobile Banking", "Korban Penipuan"] / sum(tabel["Menggunakan Mobile Banking", ])
p_Bukan_given_MB <- tabel["Menggunakan Mobile Banking", "Bukan Korban"] / sum(tabel["Menggunakan Mobile Banking", ])
cat("Peluang Bersyarat (berdasarkan MB):\n")
## Peluang Bersyarat (berdasarkan MB):
cat("P(Korban Penipuan|MB) =", p_Korban_given_MB, "\n")
## P(Korban Penipuan|MB) = 0.2
cat("P(Bukan Korban|MB) =", p_Bukan_given_MB, "\n")
## P(Bukan Korban|MB) = 0.8
# Peluang Bersyarat (berdasarkan Tidak MB)
p_Korban_given_nonMB <- tabel["Tidak Menggunakan Mobile Banking", "Korban Penipuan"] / sum(tabel["Tidak Menggunakan Mobile Banking", ])
p_Bukan_given_nonMB <- tabel["Tidak Menggunakan Mobile Banking", "Bukan Korban"] / sum(tabel["Tidak Menggunakan Mobile Banking", ])
cat("Peluang Bersyarat (berdasarkan Tidak MB):\n")
## Peluang Bersyarat (berdasarkan Tidak MB):
cat("P(Korban Penipuan|Tidak MB) =", p_Korban_given_nonMB, "\n")
## P(Korban Penipuan|Tidak MB) = 0.06666667
cat("P(Bukan Korban|Tidak MB) =", p_Bukan_given_nonMB, "\n")
## P(Bukan Korban|Tidak MB) = 0.9333333
Kapan Digunakan:
Digunakan untuk membandingkan probabilitas suatu peristiwa pada kelompok
yang berbeda berdasarkan kondisi yang sudah diketahui.
Interpretasi:
Jika \(P(\text{Korban Penipuan}|\text{MB}) =
\frac{12}{60} = 0.2\), artinya 20% pelanggan yang menggunakan
mobile banking mengalami korban penipuan. Sedangkan jika \(P(\text{Korban Penipuan}|\text{Tidak MB}) =
\frac{6}{90} \approx 0.0667\), maka sekitar 6.67% pelanggan
non-pengguna mobile banking mengalami korban penipuan.
Ukuran asosiasi mengukur kekuatan hubungan antara dua variabel.
Definisi:
Risk Difference (RD) adalah selisih risiko terjadinya suatu kejadian
antara dua kelompok. Ini menunjukkan seberapa besar perbedaan risiko
antara kelompok yang berbeda. (Triola, 2018; Devore, 2015)
Rumus:
\[
RD = P(\text{Korban Penipuan}|\text{MB}) - P(\text{Korban
Penipuan}|\text{Tidak MB})
\]
Diketahui:
\(P(\text{Korban Penipuan}|\text{MB}) =
\frac{12}{60} = 0.2\)
\(P(\text{Korban Penipuan}|\text{Tidak MB}) =
\frac{6}{90} \approx 0.0667\)
Maka:
\[
RD = 0.2 - 0.0667 \approx 0.1333
\]
# Risk Difference
RD <- p_Korban_given_MB - p_Korban_given_nonMB
cat("Risk Difference (RD) =", RD, "\n")
## Risk Difference (RD) = 0.1333333
Interpretasi:
Hasil \(RD \approx 0.1333\) menunjukkan
bahwa pengguna mobile banking memiliki risiko mengalami korban penipuan
yang meningkat sekitar 13.33% dibandingkan dengan non-pengguna.
Definisi:
Relative Risk (RR) adalah perbandingan risiko kejadian antara dua
kelompok. Ini memberikan gambaran berapa kali lipat risiko pada satu
kelompok dibandingkan dengan kelompok lainnya. (Agresti, 2018; Moore
& McCabe, 2005)
Rumus:
\[
RR = \frac{P(\text{Korban Penipuan}|\text{MB})}{P(\text{Korban
Penipuan}|\text{Tidak MB})}
\]
\[ RR = \frac{P(\text{Korban Penipuan}|\text{MB})}{P(\text{Korban Penipuan}|\text{Tidak MB})} = \frac{0.2}{0.0667} \approx 3 \]
#Relative Risk
RR <- p_Korban_given_MB / p_Korban_given_nonMB
cat("Relative Risk (RR) =", RR, "\n")
## Relative Risk (RR) = 3
Interpretasi:
Hasil \(RR \approx 3\) berarti risiko
mengalami korban penipuan pada pengguna mobile banking adalah tiga kali
lipat dibandingkan dengan non-pengguna.
Definisi:
Odds Ratio (OR) mengukur perbandingan peluang (odds) terjadinya suatu
kejadian antara dua kelompok. (Triola, 2018; Devore, 2015)
Rumus:
Pertama, hitung odds masing-masing kelompok:
Untuk pengguna Mobile Banking: \[
\text{Odds}_{MB} = \frac{a}{b} = \frac{12}{48} = 0.25
\]
Untuk non-pengguna Mobile Banking: \[
\text{Odds}_{nonMB} = \frac{c}{d} = \frac{6}{84} \approx 0.0714
\]
Kemudian:
\[ OR = \frac{\text{Odds}_{MB}}{\text{Odds}_{nonMB}} = \frac{0.25}{0.0714} \approx 3.5 \]
odds_MB <- tabel["Menggunakan Mobile Banking", "Korban Penipuan"] / tabel["Menggunakan Mobile Banking", "Bukan Korban"]
odds_nonMB <- tabel["Tidak Menggunakan Mobile Banking", "Korban Penipuan"] / tabel["Tidak Menggunakan Mobile Banking", "Bukan Korban"]
OR <- odds_MB / odds_nonMB
cat("Odds Ratio (OR) =", OR, "\n")
## Odds Ratio (OR) = 3.5
Interpretasi:
Jika \(OR \approx 3.5\), artinya
peluang mengalami korban penipuan pada pengguna mobile banking sekitar
3.5 kali lebih tinggi dibandingkan non-pengguna.
Visualisasi data akan membantu kita memahami hasil analisis dengan lebih jelas. Berikut adalah visualisasi menggunakan Mosaic Plot dan Bar Plot.
# Membuat mosaic plot
mosaicplot(tabel, main = "Mosaic Plot: Mobile Banking vs Korban Penipuan", col = c("red", "blue"))
Interpretasi:
Mosaic plot menggambarkan distribusi proporsional antara kategori
penggunaan mobile banking dan status korban. Warna berbeda membantu
mengidentifikasi perbedaan proporsi antar kategori secara visual.
library(ggplot2)
# Mengonversi tabel ke data frame untuk visualisasi
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Mobile_Banking", "status", "Jumlah")
# Membuat bar plot berdampingan dengan skema warna merah dan biru
ggplot(data, aes(x = Mobile_Banking, y = Jumlah, fill = status)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("red", "blue")) +
labs(title = "Bar Plot: Distribusi Korban Penipuan Berdasarkan Penggunaan Mobile Banking",
x = "Penggunaan Mobile Banking",
y = "Jumlah Pelanggan") +
theme_minimal()
Interpretasi:
Bar plot menampilkan jumlah absolut pelanggan pada tiap kombinasi
kategori. Ini memudahkan perbandingan langsung antara jumlah pelanggan
yang mengalami korban penipuan dan yang tidak, berdasarkan status
penggunaan mobile banking.
# Membuat pie chart untuk distribusi status keseluruhan
status_counts <- c(sum(tabel[,"Korban Penipuan"]), sum(tabel[,"Bukan Korban"]))
status_labels <- c("Korban Penipuan", "Bukan Korban")
pie(status_counts, labels = status_labels, main = "Pie Chart: Distribusi Korban Penipuan vs Bukan Korban",
col = c("red", "blue"))
Interpretasi:
Pie chart menyajikan distribusi keseluruhan status dalam bentuk segmen,
menegaskan bahwa mayoritas pelanggan tidak mengalami korban penipuan,
sementara segmen yang lebih kecil mewakili pelanggan yang mengalami
korban penipuan.
Tabel kontingensi dua arah adalah alat statistik yang digunakan untuk memeriksa hubungan antara dua variabel kategorikal. Inferensi tabel kontingensi dua arah merupakan pendekatan untuk menguji apakah terdapat hubungan (asosiasi) antara dua variabel kategorikal. Pada bagian ini, kita akan menguji hipotesis menggunakan:
Estimasi dalam tabel kontingensi dua arah bertujuan untuk menghitung proporsi atau probabilitas dari data sampel, baik secara titik (nilai tunggal) maupun interval (rentang kepercayaan).
Estimasi titik memberikan nilai proporsi berdasarkan data yang diamati, seperti proporsi gabungan, marginal, dan bersyarat. Proporsi ini membantu memahami distribusi data dalam tabel kontingensi.
Rumus:
Untuk tabel kontingensi dengan \(r\) baris dan \(c\) kolom:
Contoh Kasus:
Misalkan sebuah toko mengumpulkan data preferensi merek smartphone
berdasarkan jenis kelamin:
Apple | Samsung | Total | |
---|---|---|---|
Laki-laki | 100 | 80 | 180 |
Perempuan | 70 | 120 | 190 |
Total | 170 | 200 | 370 |
Implementasi dalam R:
# Data tabel kontingensi
product_preference <- matrix(c(100, 80, 70, 120), nrow = 2, byrow = TRUE)
rownames(product_preference) <- c("Laki-laki", "Perempuan")
colnames(product_preference) <- c("Apple", "Samsung")
# Estimasi titik
p_apple_male <- 100 / 180
p_apple_female <- 70 / 190
p_apple_total <- 170 / 370
p_male_apple_joint <- 100 / 370
cat("Proporsi laki-laki yang memilih Apple:", round(p_apple_male, 4), "\n")
## Proporsi laki-laki yang memilih Apple: 0.5556
cat("Proporsi perempuan yang memilih Apple:", round(p_apple_female, 4), "\n")
## Proporsi perempuan yang memilih Apple: 0.3684
cat("Proporsi keseluruhan yang memilih Apple:", round(p_apple_total, 4), "\n")
## Proporsi keseluruhan yang memilih Apple: 0.4595
cat("Proporsi gabungan laki-laki dan Apple:", round(p_male_apple_joint, 4), "\n")
## Proporsi gabungan laki-laki dan Apple: 0.2703
Interpretasi:
Hasil menunjukkan bahwa 55,56% laki-laki memilih Apple dibandingkan
36,84% perempuan, menunjukkan perbedaan preferensi berdasarkan jenis
kelamin. Proporsi keseluruhan yang memilih Apple adalah 45,95%, dan
proporsi gabungan laki-laki yang memilih Apple adalah 27,03% dari total
sampel.
Estimasi interval memberikan rentang nilai di mana proporsi populasi kemungkinan besar berada, dengan tingkat kepercayaan tertentu (biasanya 95%). Ini membantu menilai ketidakpastian dalam estimasi titik.
Rumus:
Untuk proporsi \(\hat{p}\) dengan
ukuran sampel \(n\), interval
kepercayaan 95% adalah: \[
\hat{p} \pm z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}}
\] Di mana \(z_{\alpha/2} =
1.96\) untuk tingkat kepercayaan 95%, dan standar error (SE)
adalah: \[
\text{SE} = \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}}
\]
Contoh Kasus:
Hitung interval kepercayaan 95% untuk proporsi laki-laki yang memilih
Apple:
\(\hat{p} = \frac{100}{180} \approx 0.5556\)
\(n = 180\)
Standar error: \(\text{SE} = \sqrt{\frac{0.5556 \cdot (1 - 0.5556)}{180}} \approx \sqrt{\frac{0.2469}{180}} \approx 0.0370\)
Interval kepercayaan: \(0.5556 \pm 1.96 \cdot 0.0370 \approx 0.5556 \pm 0.0726 \rightarrow (0.4830, 0.6282)\)
Implementasi dalam R:
# Estimasi interval untuk proporsi laki-laki yang memilih Apple
p_hat <- 100 / 180
n <- 180
se <- sqrt(p_hat * (1 - p_hat) / n)
ci_lower <- p_hat - 1.96 * se
ci_upper <- p_hat + 1.96 * se
cat("Interval Kepercayaan 95% untuk proporsi laki-laki yang memilih Apple: (", round(ci_lower, 4), ", ", round(ci_upper, 4), ")\n")
## Interval Kepercayaan 95% untuk proporsi laki-laki yang memilih Apple: ( 0.483 , 0.6281 )
Interpretasi:
Kita dapat yakin dengan tingkat kepercayaan 95% bahwa proporsi laki-laki
di populasi yang memilih Apple berada antara 48,3% dan 62,8%. Rentang
ini menunjukkan ketidakpastian dalam estimasi titik dan membantu menilai
keandalan hasil.
Uji hipotesis digunakan untuk menguji asumsi tentang hubungan antara variabel kategorikal dalam tabel kontingensi, termasuk perbandingan proporsi, independensi, dan kekuatan asosiasi.
Penjelasan:
Uji proporsi membandingkan proporsi dua kelompok untuk menentukan apakah
ada perbedaan signifikan. Ini sering digunakan dalam tabel 2x2 untuk
membandingkan proporsi bersyarat.
Rumus:
Contoh Kasus:
Uji apakah proporsi laki-laki yang memilih Apple sama dengan proporsi perempuan yang memilih Apple:
Implementasi dalam R:
# Uji perbedaan proporsi
p1 <- 100 / 180
p2 <- 70 / 190
n1 <- 180
n2 <- 190
p_pooled <- (100 + 70) / (n1 + n2)
se_diff <- sqrt(p_pooled * (1 - p_pooled) * (1/n1 + 1/n2))
z_score <- (p1 - p2) / se_diff
p_value <- 2 * (1 - pnorm(abs(z_score)))
cat("Z-score:", round(z_score, 3), "\n")
## Z-score: 3.61
cat("P-value:", round(p_value, 4), "\n")
## P-value: 3e-04
Interpretasi:
Nilai p < 0.05 menunjukkan bahwa kita menolak hipotesis nol. Proporsi
laki-laki dan perempuan yang memilih Apple berbeda secara signifikan,
dengan laki-laki cenderung lebih memilih Apple dibandingkan
perempuan.
Uji independensi menguji apakah dua variabel kategorikal saling independen, yaitu apakah distribusi satu variabel tidak dipengaruhi oleh variabel lain. Uji chi-square adalah metode yang umum digunakan untuk menguji independensi.
Rumus:
Contoh Kasus:
Uji apakah jenis kelamin dan preferensi merek smartphone independen:
Implementasi dalam R:
# Uji chi-square untuk independensi
chi_test <- chisq.test(product_preference)
print(chi_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: product_preference
## X-squared = 12.291, df = 1, p-value = 0.0004552
Interpretasi:
Nilai p < 0.05 menunjukkan bahwa kita menolak hipotesis nol. Jenis
kelamin dan preferensi merek smartphone tidak independen, artinya ada
hubungan signifikan antara kedua variabel tersebut.
Penjelasan:
Uji asosiasi mengukur kekuatan hubungan antara dua variabel kategorikal.
Untuk tabel 2x2, koefisien phi sering digunakan, sedangkan untuk tabel
yang lebih besar, Cramer’s V lebih umum.
Rumus:
Contoh Kasus:
Hitung koefisien phi untuk tabel preferensi merek:
Implementasi dalam R:
# Koefisien phi
phi <- sqrt(chi_test$statistic / sum(product_preference))
cat("Koefisien Phi:", round(phi, 4), "\n")
## Koefisien Phi: 0.1823
Interpretasi:
Nilai phi ≈ 0.15 menunjukkan hubungan lemah antara jenis kelamin dan
preferensi merek. Meskipun hubungan ini signifikan secara statistik,
kekuatannya relatif kecil, menunjukkan bahwa faktor lain mungkin juga
memengaruhi preferensi merek.
Penjelasan:
Analisis residual membantu mengidentifikasi sel dalam tabel kontingensi
yang berkontribusi signifikan pada statistik chi-square, menunjukkan di
mana data menyimpang dari yang diharapkan di bawah hipotesis
independensi.
Rumus:
Contoh Kasus:
Hitung residual standar untuk tabel preferensi merek:
Implementasi dalam R:
# Residual standar
std_res <- chi_test$stdres
print(std_res)
## Apple Samsung
## Laki-laki 3.610176 -3.610176
## Perempuan -3.610176 3.610176
Interpretasi:
Tidak ada residual standar yang melebihi ±2, menunjukkan bahwa tidak ada
sel individu yang menyimpang secara ekstrem dari yang diharapkan. Namun,
residual positif pada (Laki-laki, Apple) dan (Perempuan, Samsung)
menunjukkan bahwa laki-laki lebih sering memilih Apple dan perempuan
lebih sering memilih Samsung dibandingkan yang diharapkan di bawah
independensi. Residual negatif pada sel lainnya mendukung pola ini.
Secara keseluruhan, pola ini konsisten dengan hasil uji chi-square yang
menunjukkan adanya hubungan.
Analisis | Metode | Hasil | Interpretasi |
---|---|---|---|
Estimasi Titik | Proporsi bersyarat | Laki-laki (Apple): 55,56%; Perempuan (Apple): 36,84% | Laki-laki lebih cenderung memilih Apple dibandingkan perempuan. |
Estimasi Interval | Interval kepercayaan 95% | Laki-laki (Apple): (48,3%, 62,8%) | Proporsi populasi laki-laki yang memilih Apple kemungkinan berada dalam rentang ini. |
Uji Proporsi | Uji z | Z = 3.614, p = 0.0003 | Proporsi laki-laki dan perempuan yang memilih Apple berbeda signifikan. |
Uji Independensi | Uji chi-square | \(\chi^2 = 8.613\), df = 1, p = 0.0033 | Jenis kelamin dan preferensi merek tidak independen; ada hubungan signifikan. |
Uji Asosiasi | Koefisien phi | \(\phi = 0.1526\) | Hubungan lemah antara jenis kelamin dan preferensi merek. |
Analisis Residual | Residual standar | Tidak ada \(|r_{ij}| > 2\); max = 1.516 | Tidak ada sel yang menyimpang ekstrem, tetapi pola menunjukkan preferensi berbeda. |
Tabel kontingensi tiga arah adalah tabel distribusi frekuensi yang menyajikan data dari tiga variabel kategorikal secara simultan. Dalam tabel ini, setiap dimensi atau “arah” mewakili satu variabel, sehingga tabel tersebut membentuk struktur tiga dimensi. Dengan demikian, tabel kontingensi tiga arah memungkinkan analisis hubungan antara ketiga variabel sekaligus, serta interaksi antar variabel tersebut. Misalnya, tabel ini dapat digunakan untuk mengkaji bagaimana variabel A, B, dan C saling terkait dalam sebuah populasi dengan mengatur data ke dalam kerangka tiga dimensi.
Menurut Agresti (2019), tabel kontingensi multidimensi (termasuk tiga arah) digunakan untuk menyajikan dan menganalisis data kategorikal di mana lebih dari dua variabel perlu diperhitungkan, sehingga memungkinkan para peneliti untuk mengevaluasi hubungan kompleks dan interaksi di antara variabel-variabel tersebut.
Waktu Bermain | Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Total |
---|---|---|---|---|
Ringan | Multiplayer | 50 | 10 | 60 |
Ringan | Single-Player | 45 | 15 | 60 |
Sedang | Multiplayer | 35 | 25 | 60 |
Sedang | Single-Player | 30 | 30 | 60 |
Berat | Multiplayer | 20 | 40 | 60 |
Berat | Single-Player | 15 | 45 | 60 |
Total | 195 | 165 | 360 |
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Total |
---|---|---|---|
Multiplayer | 50 | 10 | 60 |
Single-Player | 45 | 15 | 60 |
Total | 95 | 25 | 120 |
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Total |
---|---|---|---|
Multiplayer | 35 | 25 | 60 |
Single-Player | 30 | 30 | 60 |
Total | 65 | 55 | 120 |
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Total |
---|---|---|---|
Multiplayer | 20 | 40 | 60 |
Single-Player | 15 | 45 | 60 |
Total | 35 | 85 | 120 |
Menurut Agresti (2013), peluang bersama dalam konteks tabel kontingensi (termasuk tabel kontingensi tiga arah) adalah probabilitas terjadinya kombinasi tertentu dari dua atau lebih peristiwa secara simultan. Secara spesifik, pada tabel kontingensi tiga arah, peluang bersama dihitung sebagai perbandingan antara frekuensi (jumlah kasus) dari kombinasi kategori pada ketiga variabel dengan total seluruh pengamatan (N). Dengan kata lain, jika kita memiliki tiga variabel A, B, dan C, maka peluang bersama dari terjadinya peristiwa A, B, dan C secara bersamaan didefinisikan sebagai:
\[ P(A, B, C) = \frac{n(A, B, C)}{N} \]
di mana: - \(P(A, B, C)\) = Joint
Probability dari kombinasi kategori tertentu.
- \(n(A, B, C)\) = jumlah observasi
dalam kombinasi kategori tersebut.
- \(N\) = total jumlah observasi dalam
dataset.
Berdasarkan tabel kontingensi sebelumnya, kita akan menghitung peluang bersama untuk setiap kombinasi Waktu Bermain dan Jenis Permainan. Karena setiap kombinasi memiliki dua kategori tingkat konsentrasi (Tinggi dan Rendah), kita akan menghitung jumlah individu untuk masing-masing kombinasi, kemudian menghitung peluang bersama sebagai perbandingan jumlah tersebut terhadap total populasi.
Kelompok: Waktu Bermain Ringan
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Jumlah Individu | Joint Probability |
---|---|---|---|---|
Multiplayer | 50 | 10 | 60 | \(\frac{60}{360}\) |
Single-Player | 45 | 15 | 60 | \(\frac{60}{360}\) |
Kelompok: Waktu Bermain Sedang
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Jumlah Individu | Joint Probability |
---|---|---|---|---|
Multiplayer | 35 | 25 | 60 | \(\frac{60}{360}\) |
Single-Player | 30 | 30 | 60 | \(\frac{60}{360}\) |
Kelompok: Waktu Bermain Berat
Jenis Permainan | Tingkat Konsentrasi Tinggi | Tingkat Konsentrasi Rendah | Jumlah Individu | Joint Probability |
---|---|---|---|---|
Multiplayer | 20 | 40 | 60 | \(\frac{60}{360}\) |
Single-Player | 15 | 45 | 60 | \(\frac{60}{360}\) |
# Membuat data frame berdasarkan tabel kontingensi untuk masing-masing kombinasi
data_joint <- data.frame(
Waktu_Bermain = rep(c("Ringan", "Ringan", "Sedang", "Sedang", "Berat", "Berat"), each = 1),
Jenis_Permainan = rep(c("Multiplayer", "Single-Player", "Multiplayer", "Single-Player", "Multiplayer", "Single-Player"), each = 1),
Jumlah = c(60, 60, 60, 60, 60, 60)
)
# Total populasi
total_populasi <- sum(data_joint$Jumlah) # 60 * 6 = 360
# Menghitung joint probability
data_joint$Joint_Probability <- data_joint$Jumlah / total_populasi
# Menampilkan hasil
print(data_joint)
## Waktu_Bermain Jenis_Permainan Jumlah Joint_Probability
## 1 Ringan Multiplayer 60 0.1666667
## 2 Ringan Single-Player 60 0.1666667
## 3 Sedang Multiplayer 60 0.1666667
## 4 Sedang Single-Player 60 0.1666667
## 5 Berat Multiplayer 60 0.1666667
## 6 Berat Single-Player 60 0.1666667
Menurut Agresti (2013), peluang marginal pada tabel kontingensi merupakan probabilitas terjadinya suatu kategori dari salah satu variabel tanpa memperhitungkan kategori variabel lain. Artinya, untuk suatu variabel A, peluang marginal P(A) dihitung dengan menjumlahkan frekuensi (jumlah pengamatan) dari semua kombinasi kategori pada variabel lain (misalnya, B dan C) yang berpasangan dengan kategori A, kemudian dibagi dengan total jumlah pengamatan (N). Dalam konteks ini, kita akan menghitung peluang marginal untuk variabel Waktu Bermain, Jenis Permainan, dan Tingkat Konsentrasi dengan menjumlahkan semua peluang bersama terkait.
Peluang Marginal dihitung menggunakan rumus berikut:
\[ P(A) = \sum_{B, C} P(A, B, C) \]
\[ P(B) = \sum_{A, C} P(A, B, C) \]
\[ P(C) = \sum_{A, B} P(A, B, C) \]
# Load library yang diperlukan
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
# Membuat data joint probability berdasarkan tabel kontingensi
# Tiga variabel: Waktu_Bermain (Ringan, Sedang, Berat), Jenis_Permainan (Multiplayer, Single-Player),
# dan Tingkat_Konsentrasi (Tinggi, Rendah).
# Data diambil dari Tabel Kontingensi Awal:
# Untuk setiap kombinasi (Waktu_Bermain, Jenis_Permainan):
# - Ringan, Multiplayer: Tinggi = 50, Rendah = 10
# - Ringan, Single-Player: Tinggi = 45, Rendah = 15
# - Sedang, Multiplayer: Tinggi = 35, Rendah = 25
# - Sedang, Single-Player: Tinggi = 30, Rendah = 30
# - Berat, Multiplayer: Tinggi = 20, Rendah = 40
# - Berat, Single-Player: Tinggi = 15, Rendah = 45
data_joint <- data.frame(
Waktu_Bermain = rep(c("Ringan", "Sedang", "Berat"), each = 4),
Jenis_Permainan = rep(rep(c("Multiplayer", "Single-Player"), each = 2), 3),
Tingkat_Konsentrasi = rep(c("Tinggi", "Rendah"), 6),
Jumlah = c(50, 10, 45, 15, 35, 25, 30, 30, 20, 40, 15, 45)
)
# Total populasi
total_populasi <- sum(data_joint$Jumlah) # 50+10+45+15+35+25+30+30+20+40+15+45 = 360
# Menghitung joint probability
data_joint <- data_joint %>%
mutate(Joint_Probability = Jumlah / total_populasi)
# Menghitung marginal probability untuk masing-masing variabel
# Marginal probability untuk Waktu Bermain
marginal_waktu <- data_joint %>%
group_by(Waktu_Bermain) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
# Marginal probability untuk Jenis Permainan
marginal_jenis <- data_joint %>%
group_by(Jenis_Permainan) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
# Marginal probability untuk Tingkat Konsentrasi
marginal_konsentrasi <- data_joint %>%
group_by(Tingkat_Konsentrasi) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
# Menampilkan hasil
cat("Marginal Probability untuk Waktu Bermain:\n")
## Marginal Probability untuk Waktu Bermain:
print(marginal_waktu)
## # A tibble: 3 × 2
## Waktu_Bermain Marginal_Probability
## <chr> <dbl>
## 1 Berat 0.333
## 2 Ringan 0.333
## 3 Sedang 0.333
cat("\nMarginal Probability untuk Jenis Permainan:\n")
##
## Marginal Probability untuk Jenis Permainan:
print(marginal_jenis)
## # A tibble: 2 × 2
## Jenis_Permainan Marginal_Probability
## <chr> <dbl>
## 1 Multiplayer 0.5
## 2 Single-Player 0.5
cat("\nMarginal Probability untuk Tingkat Konsentrasi:\n")
##
## Marginal Probability untuk Tingkat Konsentrasi:
print(marginal_konsentrasi)
## # A tibble: 2 × 2
## Tingkat_Konsentrasi Marginal_Probability
## <chr> <dbl>
## 1 Rendah 0.458
## 2 Tinggi 0.542
CMenurut Agresti (2013), peluang bersyarat pada tabel kontingensi mengacu pada peluang terjadinya suatu kejadian A dengan asumsi bahwa kejadian B atau C telah terjadi sebelumnya. Dalam analisis ini, kita akan menghitung peluang bersyarat berdasarkan hubungan antara Waktu Bermain, Jenis Permainan, dan Tingkat Konsentrasi.
Secara umum, peluang bersyarat didefinisikan sebagai berikut:
\[ P(A \mid B) = \frac{P(A, B)}{P(B)} \]
\[ P(A \mid C) = \frac{P(A, C)}{P(C)} \]
\[ P(B \mid C) = \frac{P(B, C)}{P(C)} \]
# Load library yang diperlukan
library(dplyr)
# Data joint probability berdasarkan tabel kontingensi awal untuk 3 variabel:
# 1) Waktu_Bermain (Ringan, Sedang, Berat)
# 2) Jenis_Permainan (Multiplayer, Single-Player)
# 3) Tingkat_Konsentrasi (Tinggi, Rendah)
# Nilai 'Jumlah' diambil dari tabel yang telah disusun:
# - Ringan, Multiplayer: Tinggi = 50, Rendah = 10 (Total 60)
# - Ringan, Single-Player: Tinggi = 45, Rendah = 15 (Total 60)
# - Sedang, Multiplayer: Tinggi = 35, Rendah = 25 (Total 60)
# - Sedang, Single-Player: Tinggi = 30, Rendah = 30 (Total 60)
# - Berat, Multiplayer: Tinggi = 20, Rendah = 40 (Total 60)
# - Berat, Single-Player: Tinggi = 15, Rendah = 45 (Total 60)
data_joint <- data.frame(
Waktu_Bermain = rep(c("Ringan", "Sedang", "Berat"), each = 4),
Jenis_Permainan = rep(rep(c("Multiplayer", "Single-Player"), each = 2), 3),
Tingkat_Konsentrasi = rep(c("Tinggi", "Rendah"), 6),
Jumlah = c(50, 10, 45, 15, 35, 25, 30, 30, 20, 40, 15, 45)
)
# Total populasi
total_populasi <- sum(data_joint$Jumlah) # 360
# Menghitung joint probability
data_joint <- data_joint %>%
mutate(Joint_Probability = Jumlah / total_populasi)
# Contoh: Menghitung marginal probability untuk masing-masing variabel
marginal_waktu <- data_joint %>%
group_by(Waktu_Bermain) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
marginal_jenis <- data_joint %>%
group_by(Jenis_Permainan) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
marginal_konsentrasi <- data_joint %>%
group_by(Tingkat_Konsentrasi) %>%
summarise(Marginal_Probability = sum(Joint_Probability))
# ------------------------------------------------------
# Menghitung conditional probability
# ------------------------------------------------------
# 1) P(Waktu Bermain | Jenis Permainan)
cond_prob_jenis_by_waktu <- data_joint %>%
group_by(Jenis_Permainan, Waktu_Bermain) %>%
summarise(Conditional_Probability = sum(Joint_Probability) /
marginal_jenis$Marginal_Probability[marginal_jenis$Jenis_Permainan == first(Jenis_Permainan)])
## `summarise()` has grouped output by 'Jenis_Permainan'. You can override using
## the `.groups` argument.
# 2) P(Tingkat Konsentrasi | Waktu Bermain)
cond_prob_kons_by_waktu <- data_joint %>%
group_by(Waktu_Bermain, Tingkat_Konsentrasi) %>%
summarise(Conditional_Probability = sum(Joint_Probability) /
marginal_waktu$Marginal_Probability[marginal_waktu$Waktu_Bermain == first(Waktu_Bermain)])
## `summarise()` has grouped output by 'Waktu_Bermain'. You can override using the
## `.groups` argument.
# 3) P(Tingkat Konsentrasi | Jenis Permainan)
cond_prob_kons_by_jenis <- data_joint %>%
group_by(Jenis_Permainan, Tingkat_Konsentrasi) %>%
summarise(Conditional_Probability = sum(Joint_Probability) /
marginal_jenis$Marginal_Probability[marginal_jenis$Jenis_Permainan == first(Jenis_Permainan)])
## `summarise()` has grouped output by 'Jenis_Permainan'. You can override using
## the `.groups` argument.
# Menampilkan hasil
cat("Conditional Probability: Jenis Permainan | Waktu Bermain\n")
## Conditional Probability: Jenis Permainan | Waktu Bermain
print(cond_prob_jenis_by_waktu)
## # A tibble: 6 × 3
## # Groups: Jenis_Permainan [2]
## Jenis_Permainan Waktu_Bermain Conditional_Probability
## <chr> <chr> <dbl>
## 1 Multiplayer Berat 0.333
## 2 Multiplayer Ringan 0.333
## 3 Multiplayer Sedang 0.333
## 4 Single-Player Berat 0.333
## 5 Single-Player Ringan 0.333
## 6 Single-Player Sedang 0.333
cat("\nConditional Probability: Tingkat Konsentrasi | Waktu Bermain\n")
##
## Conditional Probability: Tingkat Konsentrasi | Waktu Bermain
print(cond_prob_kons_by_waktu)
## # A tibble: 6 × 3
## # Groups: Waktu_Bermain [3]
## Waktu_Bermain Tingkat_Konsentrasi Conditional_Probability
## <chr> <chr> <dbl>
## 1 Berat Rendah 0.708
## 2 Berat Tinggi 0.292
## 3 Ringan Rendah 0.208
## 4 Ringan Tinggi 0.792
## 5 Sedang Rendah 0.458
## 6 Sedang Tinggi 0.542
cat("\nConditional Probability: Tingkat Konsentrasi | Jenis Permainan\n")
##
## Conditional Probability: Tingkat Konsentrasi | Jenis Permainan
print(cond_prob_kons_by_jenis)
## # A tibble: 4 × 3
## # Groups: Jenis_Permainan [2]
## Jenis_Permainan Tingkat_Konsentrasi Conditional_Probability
## <chr> <chr> <dbl>
## 1 Multiplayer Rendah 0.417
## 2 Multiplayer Tinggi 0.583
## 3 Single-Player Rendah 0.5
## 4 Single-Player Tinggi 0.5
Tabel Peluang Bersyarat Tingkat Konsentrasi berdasarkan Waktu Bermain
Waktu Bermain | Tingkat Konsentrasi | Conditional Probability \(P(\text{Konsentrasi} \mid \text{Waktu})\) |
---|---|---|
Ringan | Tinggi | \(\frac{50+45}{60+60} = \frac{95}{120} \approx 0.792\) |
Ringan | Rendah | \(\frac{10+15}{60+60} = \frac{25}{120} \approx 0.208\) |
Sedang | Tinggi | \(\frac{35+30}{60+60} = \frac{65}{120} \approx 0.542\) |
Sedang | Rendah | \(\frac{25+30}{60+60} = \frac{55}{120} \approx 0.458\) |
Berat | Tinggi | \(\frac{20+15}{60+60} = \frac{35}{120} \approx 0.292\) |
Berat | Rendah | \(\frac{40+45}{60+60} = \frac{85}{120} \approx 0.708\) |
Tabel Peluang Bersyarat Tingkat Konsentrasi berdasarkan Jenis Permainan
Jenis Permainan | Tingkat Konsentrasi | Conditional Probability \(P(\text{Konsentrasi} \mid \text{Jenis})\) |
---|---|---|
Multiplayer | Tinggi | \(\frac{50+35+20}{60+60+60} = \frac{105}{180} \approx 0.583\) |
Multiplayer | Rendah | \(\frac{10+25+40}{60+60+60} = \frac{75}{180} \approx 0.417\) |
Single-Player | Tinggi | \(\frac{45+30+15}{60+60+60} = \frac{90}{180} = 0.50\) |
Single-Player | Rendah | \(\frac{15+30+45}{60+60+60} = \frac{90}{180} = 0.50\) |
Peluang Bersyarat Waktu Bermain berdasarkan Jenis Permainan
Jenis Permainan | Waktu Bermain | Conditional Probability \(P(\text{Waktu} \mid \text{Jenis})\) |
---|---|---|
Multiplayer | Ringan | \(\frac{60}{180} \approx 0.333\) |
Multiplayer | Sedang | \(\frac{60}{180} \approx 0.333\) |
Multiplayer | Berat | \(\frac{60}{180} \approx 0.333\) |
Single-Player | Ringan | \(\frac{60}{180} \approx 0.333\) |
Single-Player | Sedang | \(\frac{60}{180} \approx 0.333\) |
Single-Player | Berat | \(\frac{60}{180} \approx 0.333\) |
Menurut Agresti (2013), Risk Difference adalah ukuran asosiasi yang mengukur perbedaan absolut antara peluang terjadinya suatu kejadian pada dua kelompok. Dalam konteks tabel kontingensi tiga arah, risk difference dapat digunakan untuk membandingkan perbedaan risiko suatu outcome (misalnya, tingkat konsentrasi tinggi) antar subkelompok yang berbeda (misalnya, berdasarkan kategori waktu bermain atau jenis permainan).
Risk Difference dirumuskan sebagai:
\[
RD = P(E \mid X=1) - P(E \mid X=0)
\] di mana:
- \(P(E \mid X=1)\) adalah peluang
kejadian (misalnya, siswa dengan tingkat konsentrasi tinggi) dalam
kelompok eksposur (misalnya, waktu bermain
Ringan).
- \(P(E \mid X=0)\) adalah peluang
kejadian dalam kelompok non-eksposur (misalnya, waktu bermain
Berat).
Jika \(RD > 0\), maka kejadian
lebih sering terjadi pada kelompok eksposur.
Jika \(RD < 0\), maka kejadian lebih
sering terjadi pada kelompok non-eksposur.
Jika \(RD = 0\), maka tidak ada
perbedaan risiko antara kedua kelompok.
Dalam konteks ini, kita ingin membandingkan peluang memiliki tingkat konsentrasi tinggi antara masing-masing kategori Waktu Bermain berdasarkan tabel marginal. Misalnya, kita bandingkan: - Ringan vs Sedang - Ringan vs Berat - Sedang vs Berat
Jika \(P(\text{Tinggi} \mid \text{Ringan})\), \(P(\text{Tinggi} \mid \text{Sedang})\), dan \(P(\text{Tinggi} \mid \text{Berat})\) adalah peluang marginal untuk masing-masing kategori, maka Risk Difference (RD) dihitung sebagai perbedaan antara peluang tersebut. Secara umum, untuk dua kategori A dan B:
\[ RD_{A,B} = P(\text{Tinggi} \mid A) - P(\text{Tinggi} \mid B) \]
# Data jumlah siswa dengan tingkat konsentrasi tinggi berdasarkan kategori Waktu Bermain
data_rd <- data.frame(
Waktu_Bermain = c("Ringan", "Sedang", "Berat"),
Tinggi = c(95, 65, 35), # misalnya: Ringan = 95, Sedang = 65, Berat = 35
Total = c(120, 120, 120)
)
# Menghitung probabilitas tingkat konsentrasi tinggi untuk masing-masing kategori
data_rd <- data_rd %>%
mutate(Prob_Tinggi = Tinggi / Total)
# Menghitung Risk Difference antar kategori
RD_Ringan_Sedang <- data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Ringan"] -
data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Sedang"]
RD_Ringan_Berat <- data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Ringan"] -
data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Berat"]
RD_Sedang_Berat <- data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Sedang"] -
data_rd$Prob_Tinggi[data_rd$Waktu_Bermain == "Berat"]
# Menampilkan hasil
print(data_rd)
## Waktu_Bermain Tinggi Total Prob_Tinggi
## 1 Ringan 95 120 0.7916667
## 2 Sedang 65 120 0.5416667
## 3 Berat 35 120 0.2916667
cat("\nRisk Difference (Ringan vs Sedang):", RD_Ringan_Sedang)
##
## Risk Difference (Ringan vs Sedang): 0.25
cat("\nRisk Difference (Ringan vs Berat):", RD_Ringan_Berat)
##
## Risk Difference (Ringan vs Berat): 0.5
cat("\nRisk Difference (Sedang vs Berat):", RD_Sedang_Berat)
##
## Risk Difference (Sedang vs Berat): 0.25
Berdasarkan perhitungan Risk Difference (RD) yang dilakukan untuk kategori Waktu Bermain dengan tingkat konsentrasi tinggi, diperoleh hasil sebagai berikut:
Interpretasi:
RD (Ringan vs Sedang): Selisih risiko sebesar 0.250 menunjukkan bahwa siswa yang bermain game dengan kategori Ringan memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 25% lebih tinggi dibandingkan dengan siswa yang bermain dalam kategori Sedang.
RD (Ringan vs Berat): Selisih risiko sebesar 0.500 mengindikasikan bahwa siswa yang bermain dengan kategori Ringan memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 50% lebih tinggi dibandingkan dengan siswa yang bermain dengan kategori Berat.
RD (Sedang vs Berat): Selisih risiko sebesar 0.250 menunjukkan bahwa siswa yang bermain dalam kategori Sedang memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 25% lebih tinggi dibandingkan dengan siswa yang bermain dalam kategori Berat.
Secara keseluruhan, nilai Risk Difference yang lebih tinggi antara kategori Ringan dan Berat menegaskan bahwa peningkatan durasi bermain game (dari Ringan ke Berat) berasosiasi dengan penurunan yang signifikan dalam probabilitas siswa memiliki tingkat konsentrasi tinggi. Hal ini mengindikasikan bahwa durasi bermain yang tinggi (kategori Berat) memiliki efek negatif terhadap kemampuan konsentrasi siswa.
Interpretasi ini memberikan dasar untuk rekomendasi pengaturan waktu bermain yang lebih sehat, agar siswa dapat mempertahankan tingkat konsentrasi yang optimal.
Menurut Agresti (2013), Relative Risk (RR) atau Rasio Risiko adalah
ukuran yang membandingkan probabilitas terjadinya suatu kejadian pada
dua kelompok yang berbeda. Secara matematis, jika P(E∣X=1) adalah
probabilitas terjadinya kejadian E pada kelompok yang terpapar (eksposur
positif) dan P(E∣X=0) adalah probabilitas kejadian E pada kelompok yang
tidak terpapar (eksposur negatif), maka Relative Risk dirumuskan
sebagai:
\[
RR = \frac{P(E \mid X=1)}{P(E \mid X=0)}
\] di mana:
- \(P(E \mid X=1)\) adalah probabilitas
siswa mencapai tingkat konsentrasi tinggi pada kategori
Ringan.
- \(P(E \mid X=0)\) adalah probabilitas
siswa mencapai tingkat konsentrasi tinggi pada kategori
Berat. —
library(dplyr)
# Data jumlah siswa dengan tingkat konsentrasi tinggi berdasarkan kategori Waktu Bermain
data_rr_marginal <- data.frame(
Waktu_Bermain = c("Ringan", "Sedang", "Berat"),
Tinggi = c(95, 65, 35),
Total = c(120, 120, 120)
)
# Menghitung probabilitas memiliki tingkat konsentrasi tinggi untuk masing-masing kategori
data_rr_marginal <- data_rr_marginal %>%
mutate(Prob_Tinggi = Tinggi / Total)
# Menghitung Relative Risk antar kategori:
RR_Ringan_Sedang <- data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Ringan"] /
data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Sedang"]
RR_Ringan_Berat <- data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Ringan"] /
data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Berat"]
RR_Sedang_Berat <- data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Sedang"] /
data_rr_marginal$Prob_Tinggi[data_rr_marginal$Waktu_Bermain == "Berat"]
# Menampilkan hasil
print(data_rr_marginal)
## Waktu_Bermain Tinggi Total Prob_Tinggi
## 1 Ringan 95 120 0.7916667
## 2 Sedang 65 120 0.5416667
## 3 Berat 35 120 0.2916667
cat("\nRelative Risk (Ringan vs Sedang):", RR_Ringan_Sedang)
##
## Relative Risk (Ringan vs Sedang): 1.461538
cat("\nRelative Risk (Ringan vs Berat):", RR_Ringan_Berat)
##
## Relative Risk (Ringan vs Berat): 2.714286
cat("\nRelative Risk (Sedang vs Berat):", RR_Sedang_Berat)
##
## Relative Risk (Sedang vs Berat): 1.857143
Berdasarkan perhitungan Relative Risk (RR) menggunakan tabel marginal untuk kategori Waktu Bermain, diperoleh hasil sebagai berikut:
Ringan vs Sedang:
RR ≈ 1.46
Artinya, siswa yang bermain dengan durasi Ringan
memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 1.46
kali lebih tinggi dibandingkan dengan siswa yang bermain dengan durasi
Sedang.
Ringan vs Berat:
RR ≈ 2.71
Artinya, siswa yang bermain dengan durasi Ringan
memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 2.71
kali lebih tinggi dibandingkan dengan siswa yang bermain dengan durasi
Berat.
Sedang vs Berat:
RR ≈ 1.86
Artinya, siswa yang bermain dengan durasi Sedang
memiliki probabilitas mencapai tingkat konsentrasi tinggi sekitar 1.86
kali lebih tinggi dibandingkan dengan siswa yang bermain dengan durasi
Berat.
Interpretasi ini mengindikasikan bahwa:
Semakin pendek durasi bermain (kategori Ringan), semakin tinggi probabilitas siswa mencapai tingkat konsentrasi yang optimal.
Sebaliknya, durasi bermain yang lebih panjang (kategori Berat) berasosiasi dengan penurunan probabilitas mencapai tingkat konsentrasi tinggi.
Temuan ini mendukung hipotesis bahwa durasi bermain yang berlebihan memiliki dampak negatif terhadap konsentrasi siswa, sehingga pengaturan waktu bermain yang lebih sehat sangat penting untuk mendukung kinerja akademik yang optimal.
Menurut Agresti (2013), Odds Ratio (OR) adalah ukuran asosiasi yang digunakan untuk mengukur perbandingan peluang (odds) terjadinya suatu kejadian antara dua kelompok. Dalam konteks ini, OR dapat dihitung untuk membandingkan odds siswa mencapai Tingkat Konsentrasi Tinggi antara dua kategori Jenis Permainan (Multiplayer vs Single-Player) dalam strata tertentu dari Waktu Bermain.
Rumus untuk menghitung OR adalah sebagai berikut:
\[ OR = \frac{\frac{P(Y \mid X_1, Z)}{1 - P(Y \mid X_1, Z)}}{\frac{P(Y \mid X_2, Z)}{1 - P(Y \mid X_2, Z)}} \]
di mana: - \(P(Y \mid X_1, Z)\) adalah probabilitas mencapai Tingkat Konsentrasi Tinggi pada kondisi \(X_1\) (misalnya, kategori Multiplayer) dan \(Z\) (misalnya, Waktu Bermain tertentu). - \(P(Y \mid X_2, Z)\) adalah probabilitas mencapai Tingkat Konsentrasi Tinggi pada kondisi \(X_2\) (misalnya, kategori Single-Player) dan \(Z\).
Jika \(OR > 1\), maka peluang mencapai Tingkat Konsentrasi Tinggi lebih besar pada kelompok \(X_1\) dibandingkan \(X_2\); jika \(OR < 1\), sebaliknya; dan \(OR = 1\) menunjukkan tidak ada perbedaan.
Misalkan kita memiliki data sebagai berikut: - Waktu Bermain:
Ringan - Multiplayer: Tinggi = 50, Rendah =
10
- Single-Player: Tinggi = 45, Rendah = 15 -
Waktu Bermain: Berat - Multiplayer:
Tinggi = 20, Rendah = 40
- Single-Player: Tinggi = 15, Rendah = 45
# Membuat data frame untuk perhitungan Odds Ratio
data_or <- data.frame(
Waktu_Bermain = rep(c("Ringan", "Ringan", "Berat", "Berat"), each = 1),
Jenis_Permainan = c("Multiplayer", "Single-Player", "Multiplayer", "Single-Player"),
Tinggi = c(50, 45, 20, 15),
Rendah = c(10, 15, 40, 45)
)
# Perhitungan Odds Ratio untuk Waktu Bermain Ringan
a_ringan <- data_or$Tinggi[data_or$Waktu_Bermain == "Ringan" & data_or$Jenis_Permainan == "Multiplayer"]
b_ringan <- data_or$Rendah[data_or$Waktu_Bermain == "Ringan" & data_or$Jenis_Permainan == "Multiplayer"]
c_ringan <- data_or$Tinggi[data_or$Waktu_Bermain == "Ringan" & data_or$Jenis_Permainan == "Single-Player"]
d_ringan <- data_or$Rendah[data_or$Waktu_Bermain == "Ringan" & data_or$Jenis_Permainan == "Single-Player"]
OR_ringan <- (a_ringan / b_ringan) / (c_ringan / d_ringan)
# Perhitungan Odds Ratio untuk Waktu Bermain Berat
a_berat <- data_or$Tinggi[data_or$Waktu_Bermain == "Berat" & data_or$Jenis_Permainan == "Multiplayer"]
b_berat <- data_or$Rendah[data_or$Waktu_Bermain == "Berat" & data_or$Jenis_Permainan == "Multiplayer"]
c_berat <- data_or$Tinggi[data_or$Waktu_Bermain == "Berat" & data_or$Jenis_Permainan == "Single-Player"]
d_berat <- data_or$Rendah[data_or$Waktu_Bermain == "Berat" & data_or$Jenis_Permainan == "Single-Player"]
OR_berat <- (a_berat / b_berat) / (c_berat / d_berat)
# Menampilkan hasil
cat("Odds Ratio untuk Waktu Bermain Ringan:", OR_ringan, "\n")
## Odds Ratio untuk Waktu Bermain Ringan: 1.666667
cat("Odds Ratio untuk Waktu Bermain Berat:", OR_berat, "\n")
## Odds Ratio untuk Waktu Bermain Berat: 1.5
Berdasarkan perhitungan Odds Ratio (OR) untuk masing-masing strata Waktu Bermain, diperoleh hasil sebagai berikut:
Waktu Bermain Ringan:
Interpretasi:
Pada kategori Waktu Bermain Ringan, siswa yang bermain
game dengan jenis Multiplayer memiliki peluang untuk
mencapai Tingkat Konsentrasi Tinggi sekitar 1.67 kali
lebih tinggi dibandingkan dengan siswa yang bermain dengan jenis
Single-Player.
Waktu Bermain Berat:
Interpretasi:
Pada kategori Waktu Bermain Berat, siswa yang bermain
game dengan jenis Multiplayer memiliki peluang untuk
mencapai Tingkat Konsentrasi Tinggi sekitar 1.52 kali
lebih tinggi dibandingkan dengan siswa yang bermain dengan jenis
Single-Player.
Kesimpulan Umum:
Nilai Odds Ratio yang lebih besar dari 1 pada kedua strata
mengindikasikan bahwa, terlepas dari kategori Waktu
Bermain (Ringan atau Berat), siswa yang bermain game dengan
jenis Multiplayer cenderung memiliki peluang lebih
tinggi untuk mencapai Tingkat Konsentrasi Tinggi
dibandingkan dengan siswa yang bermain game dengan jenis
Single-Player. Perbedaan odds ini memberikan dasar
untuk meneliti lebih lanjut apakah jenis permainan merupakan faktor
penting yang mempengaruhi konsentrasi siswa.
Menurut Agresti (2013), uji Cochran-Mantel-Haenszel (CMH) merupakan prosedur statistik yang digunakan untuk menguji independensi antara dua variabel kategorikal dengan mengontrol efek dari variabel ketiga (confounder) melalui stratifikasi. Dalam konteks tabel kontingensi tiga arah, uji CMH menggabungkan informasi dari masing-masing strata untuk menghasilkan estimasi odds ratio bersama (common odds ratio) dan statistik uji yang mengukur apakah asosiasi antara dua variabel utama (misalnya, variabel dependen dan salah satu variabel independen) konsisten di seluruh strata. Secara formal, uji CMH digunakan untuk menguji hipotesis nol bahwa odds ratio di setiap strata sama dengan 1, yang berarti tidak ada asosiasi antara variabel yang diuji setelah mengontrol variabel confounder.
Kita menetapkan α = 0.05 sebagai tingkat signifikansi.
Statistik uji CMH dirumuskan sebagai:
\[ X_{CMH}^2 = \frac{\left( \sum_k (A_k - E_k) \right)^2}{\sum_k V_k} \]
di mana:
\(A_k\) = jumlah kasus dalam sel pertama dari tabel ke-\(k\) (misalnya, jumlah siswa dengan kombinasi Multiplayer dan Tingkat Konsentrasi Tinggi).
\(E_k\) = jumlah ekspektasi dalam sel pertama dari tabel ke-\(k\).
\(V_k\) = varians ekspektasi dalam sel pertama dari tabel ke-\(k\).
\(k\) = indeks strata, yaitu \(k=1\) untuk Ringan dan \(k=2\) untuk Berat.
Statistik ini mengikuti distribusi Chi-Square (\(\chi^2\)) dengan 1 derajat kebebasan (df = 1).
Dalam contoh ini, data disusun dalam format array 2×2×2 dengan:
Dimensi 1: Tingkat Konsentrasi (Tinggi, Rendah)
Dimensi 2: Jenis Permainan (Multiplayer, Single-Player)
Dimensi 3: Waktu Bermain (Ringan, Berat)
Data yang digunakan adalah:
- Kelompok Waktu Bermain Ringan:
- Kelompok Waktu Bermain Berat:
# Load library yang diperlukan
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
##
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
##
## summarise
# Membuat data dalam format array 2×2×2
data_cmh <- array(c(50, 10, 45, 15, # Data untuk Waktu Bermain Ringan
20, 40, 15, 45), # Data untuk Waktu Bermain Berat
dim = c(2, 2, 2),
dimnames = list("Tingkat Konsentrasi" = c("Tinggi", "Rendah"),
"Jenis Permainan" = c("Multiplayer", "Single-Player"),
"Waktu Bermain" = c("Ringan", "Berat")))
# Menampilkan tabel kontingensi dalam bentuk array
data_cmh
## , , Waktu Bermain = Ringan
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 50 45
## Rendah 10 15
##
## , , Waktu Bermain = Berat
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 20 15
## Rendah 40 45
# Melakukan pengujian CMH
cmh_test <- mantelhaen.test(data_cmh)
# Menampilkan hasil pengujian
cmh_test
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data_cmh
## Mantel-Haenszel X-squared = 1.8017, df = 1, p-value = 0.1795
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.8678177 2.8455145
## sample estimates:
## common odds ratio
## 1.571429
# Mengambil statistik uji dan p-value
cmh_stat <- cmh_test$statistic
cmh_pval <- cmh_test$p.value
cat("Statistik Uji CMH:", cmh_stat, "\n")
## Statistik Uji CMH: 1.801682
cat("P-Value:", cmh_pval, "\n")
## P-Value: 0.1795093
# Interpretasi hasil pengujian
cat("\nInterpretasi Hasil:\n")
##
## Interpretasi Hasil:
if (cmh_pval < 0.05) {
cat("Dengan derajat bebas = 1 dan tingkat signifikansi = 0.05, didapat p-value =", cmh_pval,
"\nH₀ ditolak. Artinya, terdapat hubungan signifikan antara Jenis Permainan dan Tingkat Konsentrasi setelah mengontrol Waktu Bermain.\n")
} else {
cat("Dengan derajat bebas = 1 dan tingkat signifikansi = 0.05, didapat p-value =", cmh_pval,
"\nH₀ gagal ditolak. Artinya, tidak terdapat hubungan signifikan antara Jenis Permainan dan Tingkat Konsentrasi setelah mengontrol Waktu Bermain.\n")
}
## Dengan derajat bebas = 1 dan tingkat signifikansi = 0.05, didapat p-value = 0.1795093
## H₀ gagal ditolak. Artinya, tidak terdapat hubungan signifikan antara Jenis Permainan dan Tingkat Konsentrasi setelah mengontrol Waktu Bermain.
Berdasarkan hasil pengujian menggunakan metode Cochran-Mantel-Haenszel, diperoleh:
Interpretasi:
Kesimpulannya, data mendukung hipotesis nol, sehingga dapat disimpulkan bahwa variabel Jenis Permainan dan Tingkat Konsentrasi bersifat independen ketika faktor Waktu Bermain dikendalikan.
---
Menurut Agresti (2013), Odds Ratio Bersama dengan Metode Mantel-Haenszel adalah suatu estimasi gabungan dari odds ratio yang dihitung secara terpisah dalam masing-masing strata, yang kemudian digabungkan untuk memberikan ukuran asosiasi antara dua variabel kategorikal setelah mengontrol variabel stratifikasi (confounder). Dalam konteks tabel kontingensi tiga arah, jika kita memiliki tiga variabel, misalnya A, B, dan C, di mana C merupakan variabel stratifikasi, maka Odds Ratio Bersama (Common Odds Ratio) dihitung dengan menggabungkan odds ratio dari masing-masing strata k menggunakan rumus:
\[ \hat{\theta}_{MH} = \frac{\sum_{k=1}^{K} \left( \frac{n_{11k} \, n_{22k}}{n_{..k}} \right)}{\sum_{k=1}^{K} \left( \frac{n_{12k} \, n_{21k}}{n_{..k}} \right)} \]
di mana:
\(n_{11k}, n_{12k}, n_{21k}, n_{22k}\) adalah jumlah kejadian pada sel-sel tabel untuk strata ke-\(k\).
\(n_{..k}\) adalah jumlah total pada strata ke-\(k\).
Standard error untuk log Odds Ratio Bersama dihitung dengan rumus:
\[ \sigma^2\bigl[\log(\hat{\theta}_{MH})\bigr] = \sum_{k=1}^{K} \left( \frac{(n_{11k} + n_{12k})(n_{11k} + n_{22k})}{n_{..k}^2} \right) - \sum_{k=1}^{K} \left( \frac{(n_{12k} + n_{21k})(n_{12k} + n_{22k})}{n_{..k}^2} \right) \]
Interval kepercayaan untuk log Odds Ratio Bersama dihitung dengan:
\[ \log(\hat{\theta}_{MH}) \pm Z_{\alpha/2} \, \hat{\sigma}\bigl[\log(\hat{\theta}_{MH})\bigr] \]
di mana: - \(Z_{\alpha/2}\) adalah nilai kritis dari distribusi normal (misalnya, \(Z_{0.025} = 1.96\) untuk interval kepercayaan 95%). - \(\hat{\sigma}\bigl[\log(\hat{\theta}_{MH})\bigr]\) adalah standard error dari log odds ratio bersama.
Dalam contoh ini, data diorganisasikan sebagai berikut:
Strata “Ringan” (Waktu Bermain Ringan):
Multiplayer: Tingkat Konsentrasi Tinggi = 50,
Rendah = 10
Single-Player: Tingkat Konsentrasi Tinggi = 45,
Rendah = 15
Total \(n_{..1} = 120\)
Strata “Berat” (Waktu Bermain Berat):
# Memuat library yang diperlukan
library(vcdExtra)
# Membuat data dalam format array 2×2×2:
# Dimensi 1: Tingkat Konsentrasi (Tinggi, Rendah)
# Dimensi 2: Jenis Permainan (Multiplayer, Single-Player)
# Dimensi 3: Waktu Bermain (Ringan, Berat)
data_cmh <- array(c(50, 10, 45, 15, # Data untuk Waktu Bermain Ringan
20, 40, 15, 45), # Data untuk Waktu Bermain Berat
dim = c(2, 2, 2),
dimnames = list("Tingkat Konsentrasi" = c("Tinggi", "Rendah"),
"Jenis Permainan" = c("Multiplayer", "Single-Player"),
"Waktu Bermain" = c("Ringan", "Berat")))
# Menampilkan tabel kontingensi
print(data_cmh)
## , , Waktu Bermain = Ringan
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 50 45
## Rendah 10 15
##
## , , Waktu Bermain = Berat
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 20 15
## Rendah 40 45
# Menghitung Odds Ratio Bersama menggunakan Mantel-Haenszel
cmh_test <- mantelhaen.test(data_cmh)
mh_or <- cmh_test$estimate
log_mh_or <- log(mh_or)
# Perhitungan manual standard error log OR berdasarkan rumus (untuk tiap strata):
# Strata Ringan:
# n11 = 50, n12 = 45, n21 = 10, n22 = 15, n_total = 120
term1_ringan <- ( (50 + 45) * (50 + 15) ) / (120^2)
term2_ringan <- ( (45 + 10) * (45 + 15) ) / (120^2)
diff_ringan <- term1_ringan - term2_ringan
# Strata Berat:
# n11 = 20, n12 = 15, n21 = 40, n22 = 45, n_total = 120
term1_berat <- ( (20 + 15) * (20 + 45) ) / (120^2)
term2_berat <- ( (15 + 40) * (15 + 45) ) / (120^2)
diff_berat <- term1_berat - term2_berat
# Varians log odds ratio MH
var_log_or <- diff_ringan + diff_berat
se_log_or <- sqrt(var_log_or)
# Interval kepercayaan 95% untuk log OR
z_value <- qnorm(0.975)
lower_log_or <- log_mh_or - z_value * se_log_or
upper_log_or <- log_mh_or + z_value * se_log_or
# Interval kepercayaan untuk Odds Ratio
lower_or <- exp(lower_log_or)
upper_or <- exp(upper_log_or)
cat("Odds Ratio Bersama (MH OR):", mh_or, "\n")
## Odds Ratio Bersama (MH OR): 1.571429
cat("Log Odds Ratio Bersama:", log_mh_or, "\n")
## Log Odds Ratio Bersama: 0.4519851
cat("Standar Error Log Odds Ratio Bersama:", se_log_or, "\n")
## Standar Error Log Odds Ratio Bersama: 0.3584302
cat("Interval Kepercayaan 95% untuk log OR: [", lower_log_or, ",", upper_log_or, "]\n")
## Interval Kepercayaan 95% untuk log OR: [ -0.2505252 , 1.154495 ]
cat("Interval Kepercayaan 95% untuk OR: [", lower_or, ",", upper_or, "]\n")
## Interval Kepercayaan 95% untuk OR: [ 0.7783919 , 3.172422 ]
Berdasarkan hasil perhitungan menggunakan metode Mantel-Haenszel, diperoleh hasil sebagai berikut:
Odds Ratio Bersama (MH OR): 1.571429
Artinya, secara gabungan, odds (perbandingan peluang) siswa mencapai
tingkat konsentrasi tinggi pada satu kelompok (misalnya, jenis permainan
tertentu) adalah sekitar 1.57 kali dibandingkan dengan kelompok lainnya,
setelah mengontrol variabel Waktu Bermain.
Log Odds Ratio Bersama: 0.4519851
Nilai log OR ini merupakan transformasi logaritmik dari Odds Ratio
Bersama.
Standar Error Log Odds Ratio Bersama:
0.3584302
Standar error ini mengukur variabilitas dari estimasi log OR.
Interval Kepercayaan 95% untuk log OR: [
-0.2505252 , 1.154495 ]
Jika kita mengesponensiasikan interval ini, kita mendapatkan:
Interval Kepercayaan 95% untuk Odds Ratio: [ 0.7783919 , 3.172422 ]
Interpretasi:
Meskipun point estimate Odds Ratio Bersama adalah 1.57, yang menunjukkan kecenderungan bahwa odds siswa mencapai tingkat konsentrasi tinggi pada kelompok tertentu adalah 1.57 kali lebih tinggi, interval kepercayaan untuk OR mencakup nilai 1 (interval: 0.78 hingga 3.17).
Hal ini berarti bahwa secara statistik, pada tingkat signifikansi 5%, tidak ada bukti yang cukup untuk menyatakan bahwa perbedaan odds antara kelompok tersebut signifikan.
Dengan kata lain, meskipun ada kecenderungan perbedaan (point estimate > 1), variasi dalam data cukup besar sehingga kita tidak dapat menyimpulkan perbedaan yang signifikan secara statistik antara kelompok yang dibandingkan.
Kesimpulannya, hasil ini menunjukkan bahwa setelah mengontrol variabel Waktu Bermain, perbedaan dalam odds mencapai tingkat konsentrasi tinggi antara kelompok yang dibandingkan (misalnya, antara jenis permainan yang berbeda) tidak signifikan secara statistik pada tingkat kepercayaan 95%.
Metode Breslow-Day digunakan untuk menguji apakah Odds Ratio yang dihitung pada berbagai strata (misalnya, berdasarkan Waktu Bermain) adalah homogen atau tidak. Pengujian ini menguji apakah hubungan antara dua variabel (misalnya, Jenis Permainan dan Tingkat Konsentrasi) bersifat konsisten di seluruh strata. Jika odds ratio di setiap strata sama, maka hubungan tersebut dianggap homogen.
Hipotesis Nol (H₀): Odds Ratio pada setiap strata adalah homogen, yaitu:
\[ H_0 : \theta_{xy(1)} = \theta_{xy(2)} = \dots = \theta_{xy(K)} \]
Dimana:
Hipotesis Alternatif (H₁): Setidaknya ada satu strata yang memiliki Odds Ratio berbeda, yang menunjukkan bahwa Odds Ratio tidak homogen.
\[ H_1 : \text{Paling sedikit satu pernyataan } \theta_{xy(k)} = \theta_{xy(k+1)} \text{ tidak terpenuhi.} \]
Statistik uji Breslow-Day (BD) digunakan untuk menguji homogenitas Odds Ratio di seluruh strata. Rumus statistik uji Breslow-Day adalah:
\[ BD = \sum_{k=1}^{K} \frac{(n_{ijk} - \hat{\mu}_{ijk})^2}{\hat{\mu}_{ijk}} \]
di mana: - \(n_{ijk}\) adalah jumlah kejadian pada setiap sel pada strata ke-\(k\). - \(\hat{\mu}_{ijk}\) adalah nilai ekspektasi untuk sel pada strata ke-\(k\). - \(K\) adalah jumlah strata.
Statistik uji BD mengikuti distribusi Chi-Square dengan derajat kebebasan \(df = K - 1\).
# Memuat library yang diperlukan
library(vcdExtra)
# Membuat data dalam format array 2×2×2 untuk konteks awal:
# Dimensi 1: Tingkat Konsentrasi (Tinggi, Rendah)
# Dimensi 2: Jenis Permainan (Multiplayer, Single-Player)
# Dimensi 3: Waktu Bermain (Ringan, Berat)
data_cmh <- array(c(50, 10, 45, 15, # Data untuk Waktu Bermain Ringan
20, 40, 15, 45), # Data untuk Waktu Bermain Berat
dim = c(2, 2, 2),
dimnames = list("Tingkat Konsentrasi" = c("Tinggi", "Rendah"),
"Jenis Permainan" = c("Multiplayer", "Single-Player"),
"Waktu Bermain" = c("Ringan", "Berat")))
# Menampilkan tabel kontingensi
print(data_cmh)
## , , Waktu Bermain = Ringan
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 50 45
## Rendah 10 15
##
## , , Waktu Bermain = Berat
##
## Jenis Permainan
## Tingkat Konsentrasi Multiplayer Single-Player
## Tinggi 20 15
## Rendah 40 45
# Menghitung nilai ekspektasi dan statistik Breslow-Day secara manual
# Kita menghitung expected values untuk setiap strata secara terpisah
# Inisialisasi array untuk menyimpan nilai ekspektasi
expected_values <- array(NA, dim = dim(data_cmh),
dimnames = dimnames(data_cmh))
# Loop untuk tiap strata (Waktu Bermain)
for (k in 1:dim(data_cmh)[3]) {
# Tabel 2x2 untuk strata k
tab <- data_cmh[,,k]
# Total pada strata k
total_k <- sum(tab)
# Total baris dan kolom
row_tot <- rowSums(tab)
col_tot <- colSums(tab)
# Nilai ekspektasi untuk tiap sel: (total baris * total kolom) / total pada strata k
expected_values[,,k] <- outer(row_tot, col_tot, FUN = function(r, c) r * c / total_k)
}
# Menghitung statistik Breslow-Day
BD_stat <- sum((data_cmh - expected_values)^2 / expected_values)
cat("Statistik uji Breslow-Day (BD):", BD_stat, "\n")
## Statistik uji Breslow-Day (BD): 2.271561
# Derajat kebebasan: df = K - 1, di sini K = jumlah strata (Waktu Bermain)
df <- dim(data_cmh)[3] - 1
cat("Derajat kebebasan (df):", df, "\n")
## Derajat kebebasan (df): 1
# Menghitung p-value berdasarkan distribusi Chi-Square
p_value_breslow <- 1 - pchisq(BD_stat, df)
cat("P-value dari uji homogenitas Breslow-Day:", p_value_breslow, "\n")
## P-value dari uji homogenitas Breslow-Day: 0.1317671
# Keputusan berdasarkan p-value
if (p_value_breslow < 0.05) {
cat("Karena p-value <", p_value_breslow, " < 0.05, H₀ DITOLAK.\n")
cat("Artinya, terdapat perbedaan Odds Ratio antara strata (Waktu Bermain) sehingga Odds Ratio tidak homogen.\n")
} else {
cat("Karena p-value >=", p_value_breslow, "≥ 0.05, H₀ GAGAL DITOLAK.\n")
cat("Artinya, Odds Ratio di seluruh strata homogen, tidak ada perbedaan signifikan.\n")
}
## Karena p-value >= 0.1317671 ≥ 0.05, H₀ GAGAL DITOLAK.
## Artinya, Odds Ratio di seluruh strata homogen, tidak ada perbedaan signifikan.
Berdasarkan perhitungan uji homogenitas menggunakan metode Breslow-Day pada data:
Perhitungan menunjukkan:
Interpretasi:
Karena nilai p-value sebesar 0.1318 (p-value ≥ 0.05) lebih besar dari tingkat signifikansi α = 0.05, maka:
Dengan demikian, dapat disimpulkan bahwa Odds Ratio antara Jenis Permainan dan Tingkat Konsentrasi adalah homogen di seluruh kategori Waktu Bermain. Ini menunjukkan bahwa pengaruh jenis permainan terhadap tingkat konsentrasi tidak berubah signifikan antara siswa yang bermain game dengan durasi yang berbeda (Ringan vs. Berat).
Kesimpulannya, berdasarkan hasil uji homogenitas Breslow-Day, hubungan antara Jenis Permainan dan Tingkat Konsentrasi bersifat konsisten di semua strata Waktu Bermain.
Model Linear Umum (GLM) adalah kelas model statistik yang memperluas regresi linear tradisional untuk menangani berbagai jenis variabel respons, termasuk yang tidak berdistribusi normal. GLM sangat berguna untuk memodelkan data kategorikal, data hitungan, dan jenis data lain yang tidak memenuhi asumsi regresi kuadrat terkecil biasa.
GLM terdiri dari tiga komponen utama:
GLM menyediakan kerangka kerja terpadu untuk menganalisis berbagai
jenis data dan telah menjadi landasan analisis statistik modern. Dalam
praktiknya, GLM mudah diimplementasikan menggunakan perangkat lunak
statistik seperti R dengan fungsi seperti glm()
.
Keluarga eksponensial adalah kelas distribusi probabilitas yang memiliki bentuk umum, menjadikannya sangat cocok untuk pemodelan statistik, terutama dalam kerangka GLM.
Sebuah distribusi probabilitas termasuk dalam keluarga eksponensial jika fungsi densitas probabilitas (atau fungsi massa probabilitas) dapat dinyatakan sebagai:
\[ f(y; \theta, \phi) = \exp\left\{\frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi)\right\} \]
di mana: - \(\theta\) adalah parameter alami, - \(\phi\) adalah parameter dispersi, - \(b(\theta)\) adalah fungsi yang berkaitan dengan rata-rata dan varians distribusi, - \(a(\phi)\) adalah fungsi dari parameter dispersi, - \(c(y, \phi)\) adalah fungsi yang bergantung pada \(y\) dan \(\phi\).
Banyak distribusi umum termasuk dalam keluarga eksponensial, seperti:
Sebagai contoh, distribusi binomial dapat ditulis dalam bentuk keluarga eksponensial. Untuk variabel acak binomial \(Y \sim \text{Binomial}(n, \pi)\), fungsi massa probabilitasnya adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
Ini dapat ditulis ulang sebagai:
\[ P(Y = y) = \exp\left\{ y \log\left(\frac{\pi}{1 - \pi}\right) + n \log(1 - \pi) + \log\binom{n}{y} \right\} \]
Di sini, \(\theta = \log\left(\frac{\pi}{1 - \pi}\right)\), \(b(\theta) = -n \log(1 - \pi)\), \(a(\phi) = 1\), dan \(c(y, \phi) = \log\binom{n}{y}\).
Demikian pula, distribusi Poisson dengan rata-rata \(\lambda\) dapat dinyatakan sebagai:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Yang menjadi:
\[ P(Y = y) = \exp\left\{ y \log \lambda - \lambda - \log y! \right\} \]
Dengan \(\theta = \log \lambda\), \(b(\theta) = e^{\theta}\), \(a(\phi) = 1\), dan \(c(y, \phi) = -\log y!\).
Keluarga eksponensial sangat penting untuk GLM karena memungkinkan pendekatan yang konsisten untuk estimasi dan inferensi di berbagai jenis variabel respons.
Regresi logistik adalah jenis GLM yang digunakan untuk memodelkan variabel respons biner. Ini banyak diterapkan di bidang seperti kedokteran, ilmu sosial, dan pembelajaran mesin untuk memprediksi probabilitas terjadinya suatu peristiwa berdasarkan satu atau lebih variabel prediktor.
Di R, regresi logistik diimplementasikan menggunakan fungsi
glm()
dengan family = binomial
.
Dalam regresi logistik, variabel respons \(Y\) bersifat biner, mengambil nilai 0 atau 1, di mana 1 biasanya mewakili terjadinya peristiwa yang diminati. Probabilitas bahwa \(Y = 1\) diberikan prediktor \(X\) dinotasikan sebagai \(\pi(X) = P(Y = 1 | X)\).
Model regresi logistik menggunakan fungsi link logit, yaitu logaritma natural dari odds:
\[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = X\beta \]
di mana \(X\) adalah matriks prediktor, dan \(\beta\) adalah vektor koefisien.
Invers dari fungsi logit adalah fungsi logistik, yang memberikan probabilitas:
\[ \pi(X) = \frac{\exp(X\beta)}{1 + \exp(X\beta)} = \frac{1}{1 + \exp(-X\beta)} \]
Kurva berbentuk S ini memastikan bahwa probabilitas yang diprediksi selalu berada antara 0 dan 1.
Parameter \(\beta\) diestimasi menggunakan Maximum Likelihood Estimation (Maximum Likelihood Estimation - MLE). Fungsi kemungkinan untuk sampel dari \(n\) pengamatan independen adalah:
\[ L(\beta) = \prod_{i=1}^n \pi(x_i)^{y_i} (1 - \pi(x_i))^{1 - y_i} \]
Mengambil logaritma memberikan Log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log \pi(x_i) + (1 - y_i) \log (1 - \pi(x_i)) \right] \]
MLE \(\hat{\beta}\) ditemukan dengan memaksimalkan \(\ell(\beta)\), biasanya menggunakan metode optimasi numerik seperti algoritma Newton-Raphson.
Koefisien \(\beta\) dalam regresi logistik mewakili perubahan dalam log-odds variabel respons untuk peningkatan satu unit dalam prediktor, dengan prediktor lain tetap konstan. Secara khusus, untuk prediktor \(x_j\), rasio odds adalah \(\exp(\beta_j)\), yang menunjukkan bagaimana odds peristiwa berubah dengan peningkatan satu unit dalam \(x_j\).
Mari kita pertimbangkan contoh di mana kita memodelkan probabilitas lulus ujian berdasarkan jumlah jam belajar.
Pertama, kita simulasikan beberapa data:
set.seed(123)
n <- 100
hours <- runif(n, 0, 10)
X <- cbind(1, hours)
beta <- c(-2, 0.5)
logit_pi <- X %*% beta
pi <- 1 / (1 + exp(-logit_pi))
y <- rbinom(n, 1, pi)
data <- data.frame(y = y, hours = hours)
Sekarang, kita sesuaikan model regresi logistik menggunakan
glm()
:
model <- glm(y ~ hours, family = binomial, data = data)
summary(model)
##
## Call:
## glm(formula = y ~ hours, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.0006 0.5346 -3.742 0.000182 ***
## hours 0.5867 0.1194 4.915 8.86e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 130.684 on 99 degrees of freedom
## Residual deviance: 91.716 on 98 degrees of freedom
## AIC: 95.716
##
## Number of Fisher Scoring iterations: 5
Output akan memberikan koefisien yang diestimasi, kesalahan standar, nilai-z, dan nilai-p.
Untuk memprediksi probabilitas:
newdata <- data.frame(hours = seq(0, 10, by = 0.1))
predicted_pi <- predict(model, newdata, type = "response")
plot(newdata$hours, predicted_pi, type = "l", xlab = "Jam Belajar", ylab = "Probabilitas Lulus")
Ini akan menunjukkan kurva berbentuk S dari probabilitas yang diprediksi.
Regresi Poisson adalah jenis GLM yang digunakan untuk memodelkan data hitungan, di mana variabel respons mewakili jumlah kali suatu peristiwa terjadi dalam interval tetap. Ini umum digunakan di bidang seperti epidemiologi, asuransi, dan ekologi.
Di R, regresi Poisson diimplementasikan menggunakan fungsi
glm()
dengan family = poisson
.
Dalam regresi Poisson, variabel respons \(Y\) mengikuti distribusi Poisson dengan rata-rata \(\lambda\), di mana \(\lambda\) dimodelkan sebagai fungsi dari prediktor.
Fungsi massa probabilitas dari distribusi Poisson adalah:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!}, \quad y = 0, 1, 2, \ldots \]
Fungsi link kanonik untuk distribusi Poisson adalah logaritma natural:
\[ \log(\lambda) = X\beta \]
Jadi, jumlah yang diharapkan adalah:
\[ \lambda = \exp(X\beta) \]
Mirip dengan regresi logistik, parameter \(\beta\) diestimasi menggunakan MLE. Log-likelihood untuk sampel dari \(n\) pengamatan independen adalah:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log \lambda_i - \lambda_i - \log(y_i!) \right] \]
di mana \(\lambda_i = \exp(x_i^T \beta)\).
Metode numerik seperti Newton-Raphson digunakan untuk menemukan MLE.
Dalam regresi Poisson, koefisien \(\beta\) mewakili perubahan dalam log dari jumlah yang diharapkan untuk peningkatan satu unit dalam prediktor. Secara khusus, \(\exp(\beta_j)\) memberikan perubahan multiplikatif dalam jumlah yang diharapkan untuk peningkatan satu unit dalam \(x_j\), dengan prediktor lain tetap konstan.
Mari kita modelkan jumlah penghargaan yang diterima oleh siswa berdasarkan skor matematika mereka.
Pertama, simulasikan beberapa data:
set.seed(123)
n <- 100
math_score <- rnorm(n, 50, 10)
X <- cbind(1, math_score)
beta <- c(0.5, 0.02)
lambda <- exp(X %*% beta)
y <- rpois(n, lambda)
data <- data.frame(y = y, math_score = math_score)
Sesuaikan model regresi Poisson:
model <- glm(y ~ math_score, family = poisson, data = data)
summary(model)
##
## Call:
## glm(formula = y ~ math_score, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.287280 0.276942 1.037 0.3
## math_score 0.023498 0.005164 4.551 5.35e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 123.85 on 99 degrees of freedom
## Residual deviance: 103.18 on 98 degrees of freedom
## AIC: 430.08
##
## Number of Fisher Scoring iterations: 4
Ringkasan akan memberikan koefisien yang diestimasi, kesalahan standar, nilai-z, dan nilai-p.
Untuk memvisualisasikan hubungan:
newdata <- data.frame(math_score = seq(30, 70, by = 1))
predicted_lambda <- predict(model, newdata, type = "response")
plot(newdata$math_score, predicted_lambda, type = "l", xlab = "Skor Matematika", ylab = "Jumlah Penghargaan yang Diharapkan")
Ini akan menunjukkan bagaimana jumlah penghargaan yang diharapkan meningkat dengan skor matematika.
Model Linear Umum (GLM) adalah kerangka statistik yang fleksibel untuk memodelkan data dengan distribusi dari keluarga eksponensial, seperti binomial, Poisson, dan normal. Inferensi dalam GLM melibatkan estimasi parameter, pengujian hipotesis, dan evaluasi kecocokan model. Berikut adalah penjelasan rinci dengan sintaks LaTeX yang telah diperbaiki agar dapat dirender dengan benar dalam R Markdown.
Dalam GLM, variabel respons \(Y\) mengikuti distribusi dari keluarga eksponensial. Ini memungkinkan kita untuk menurunkan ekspektasi dan varians secara sistematis berdasarkan sifat distribusi tersebut.
Fungsi densitas probabilitas (atau fungsi massa probabilitas) untuk distribusi keluarga eksponensial dapat ditulis sebagai:
\[ f(y; \theta, \phi) = \exp\left\{\frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi)\right\} \]
Di mana:
Ekspektasi dari \(Y\), yaitu \(\mu = E(Y)\), diperoleh dari turunan pertama fungsi \(b(\theta)\):
\[ \mu = E(Y) = b'(\theta) \]
Varians dari \(Y\) diturunkan dari turunan kedua fungsi \(b(\theta)\):
\[ \text{Var}(Y) = a(\phi) \cdot b''(\theta) \]
Di mana \(b''(\theta)\) adalah turunan kedua dari \(b(\theta)\) terhadap \(\theta\). Varians sering kali bergantung pada rata-rata \(\mu\) melalui hubungan ini.
Untuk \(Y \sim \text{Binomial}(n, \pi)\):
Maka:
Untuk \(Y \sim \text{Poisson}(\lambda)\):
Maka:
Dengan demikian, ekspektasi dan varians dalam GLM dapat dihitung berdasarkan parameter alami dan fungsi \(b(\theta)\) yang spesifik untuk setiap distribusi.
Parameter dalam GLM, khususnya koefisien \(\beta\), diestimasi menggunakan Maximum Likelihood Estimation (MLE), yang kemudian dioptimalkan dengan metode numerik seperti Newton-Raphson atau Iteratively Reweighted Least Squares (IRLS).
Fungsi densitas untuk \(n\) pengamatan independen adalah:
\[ L(\beta) = \prod_{i=1}^n f(y_i; \theta_i, \phi) \]
Log-likelihood menjadi:
\[ \ell(\beta) = \sum_{i=1}^n \log f(y_i; \theta_i, \phi) \]
Di mana \(\theta_i\) bergantung pada \(\beta\) melalui fungsi tautan \(g(\mu_i) = X_i \beta\). MLE \(\hat{\beta}\) diperoleh dengan memaksimalkan \(\ell(\beta)\).
Metode ini memperbarui estimasi parameter secara iteratif:
\[ \beta^{(t+1)} = \beta^{(t)} - \left[ \frac{\partial^2 \ell}{\partial \beta \partial \beta^T} \right]^{-1} \frac{\partial \ell}{\partial \beta} \]
Di mana:
IRLS mengubah masalah MLE menjadi regresi tertimbang berulang:
Proses ini diulang hingga konvergensi.
Diagnostik model bertujuan untuk mengevaluasi kecocokan model dan mendeteksi masalah seperti overdispersi atau outlier.
Deviansi mengukur perbedaan antara model yang dipasang dan model jenuh:
\[ D = 2 \left[ \ell(\hat{\beta}_{\text{saturated}}) - \ell(\hat{\beta}) \right] \]
Contoh:
Deviansi kecil menunjukkan kecocokan baik, dan dapat digunakan untuk pengujian chi-square pada sampel besar.
Residual membantu mendeteksi pengamatan yang tidak sesuai:
Plot residual dapat mengungkap pola yang menunjukkan pelanggaran asumsi.
Overdispersi terjadi jika varians data lebih besar dari yang diharapkan (misalnya, \(\text{Var}(Y) > \lambda\) pada Poisson). Dapat dideteksi jika rasio deviansi terhadap derajat bebas jauh lebih besar dari 1. Model alternatif seperti binomial negatif dapat digunakan.
Regresi logistik memodelkan data biner dengan distribusi binomial.
Fungsi tautan logit:
\[ \log\left(\frac{\pi}{1 - \pi}\right) = X\beta \]
Log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log \pi_i + (1 - y_i) \log (1 - \pi_i) \right] \]
dengan \(\pi_i = \frac{\exp(X_i \beta)}{1 + \exp(X_i \beta)}\). Estimasi \(\hat{\beta}\) diperoleh via MLE.
Metode inferensi:
smoking_data <- data.frame(
Smoking = c(rep(1, 688 + 650), rep(0, 21 + 59)),
LungCancer = c(rep(1, 688), rep(0, 650), rep(1, 21), rep(0, 59))
)
model_logistic <- glm(LungCancer ~ Smoking, data = smoking_data, family = binomial)
summary(model_logistic)
##
## Call:
## glm(formula = LungCancer ~ Smoking, family = binomial, data = smoking_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.0330 0.2541 -4.065 4.80e-05 ***
## Smoking 1.0898 0.2599 4.193 2.75e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1965.8 on 1417 degrees of freedom
## Residual deviance: 1945.9 on 1416 degrees of freedom
## AIC: 1949.9
##
## Number of Fisher Scoring iterations: 4
Regresi Poisson memodelkan data hitungan dengan distribusi Poisson.
Fungsi tautan log:
\[ \log(\lambda) = X\beta \]
Log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log \lambda_i - \lambda_i - \log(y_i!) \right] \]
dengan \(\lambda_i = \exp(X_i \beta)\). Estimasi \(\hat{\beta}\) diperoleh via MLE.
Metode inferensi serupa dengan regresi logistik:
data(warpbreaks)
model_poisson <- glm(breaks ~ wool + tension, data = warpbreaks, family = poisson)
summary(model_poisson)
##
## Call:
## glm(formula = breaks ~ wool + tension, family = poisson, data = warpbreaks)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.69196 0.04541 81.302 < 2e-16 ***
## woolB -0.20599 0.05157 -3.994 6.49e-05 ***
## tensionM -0.32132 0.06027 -5.332 9.73e-08 ***
## tensionH -0.51849 0.06396 -8.107 5.21e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 297.37 on 53 degrees of freedom
## Residual deviance: 210.39 on 50 degrees of freedom
## AIC: 493.06
##
## Number of Fisher Scoring iterations: 4
Regresi Logistik adalah teknik pemodelan statistik untuk memprediksi probabilitas terjadinya suatu kejadian biner (misal: “ya/tidak”, “sukses/gagal”) berdasarkan satu atau lebih variabel prediktor. Model ini menghubungkan log-odds (logaritma peluang) dari probabilitas kejadian dengan kombinasi linier predictor:
\[ \log\left(\frac{P(Y=1)}{1 - P(Y=1)}\right) = \beta_0 + \sum_i \beta_i X_i \]
di mana \(X_i\) dapat berupa variabel nominal, ordinal, atau rasio, dan \(\beta_i\) adalah koefisien yang diestimasi. Model ini sangat berguna dalam kasus klasifikasi biner dan sering digunakan dalam bidang kesehatan, pemasaran, dan ilmu sosial.
Definisi: Variabel kategori tanpa urutan (misal: warna—merah, hijau, biru; jenis kelamin—laki/perempuan).
Penanganan dalam model:
\[ D_j = \begin{cases} 1, & \text{jika kategori } = j, \\ 0, & \text{lainnya}, \end{cases} \]
dan satu kategori dijadikan “referensi” (baseline) agar model teridentifikasi.
Definisi: Variabel kategori dengan urutan alami (misal: skala kepuasan—rendah, sedang, tinggi).
Pendekatan:
Definisi: Variabel numerik kontinu dengan nol absolut dan jarak antar nilai bermakna (misal: pendapatan dalam rupiah, usia dalam tahun, berat badan dalam kilogram).
Penanganan:
Akan disimulasikan data untuk 1000 pasien dengan variabel berikut:
Model sebenarnya mencakup efek non-linier untuk tingkat keparahan untuk mengilustrasikan perbedaan antara kedua pendekatan.
set.seed(53)
n <- 1000
# Simulasi prediktor
treatment_type <- factor(sample(c("obat", "terapi", "operasi"), n, replace = TRUE, prob = c(0.4, 0.4, 0.2)))
severity_level <- factor(sample(c("ringan", "sedang", "berat"), n, replace = TRUE),
levels = c("ringan", "sedang", "berat"), ordered = TRUE)
treatment_days <- pmax(rnorm(n, mean = 14, sd = 5), 1) # Truncate di 1 hari
# Menentukan efek sebenarnya
treatment_effect <- ifelse(treatment_type == "terapi", 0.4, ifelse(treatment_type == "operasi", 0.6, 0))
severity_effect <- ifelse(severity_level == "sedang", 0.5, ifelse(severity_level == "berat", 0.3, 0))
# Simulasi respons biner
log_odds <- -1.5 + treatment_effect + severity_effect + 0.08 * treatment_days
prob <- 1 / (1 + exp(-log_odds))
recovered <- rbinom(n, 1, prob)
# Membuat dataframe
data <- data.frame(recovered, treatment_type, severity_level, treatment_days)
# Jenis perawatan (nominal)
print("Distribusi Jenis Perawatan:")
## [1] "Distribusi Jenis Perawatan:"
table(data$treatment_type)
##
## obat operasi terapi
## 422 193 385
# Tingkat keparahan (ordinal)
print("Distribusi Tingkat Keparahan:")
## [1] "Distribusi Tingkat Keparahan:"
table(data$severity_level)
##
## ringan sedang berat
## 308 329 363
# Durasi perawatan (rasio)
print("Ringkasan Durasi Perawatan (hari):")
## [1] "Ringkasan Durasi Perawatan (hari):"
summary(data$treatment_days)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 10.53 13.76 13.94 17.43 31.41
# Kesembuhan (respons)
print("Distribusi Sembuh/Tidak Sembuh:")
## [1] "Distribusi Sembuh/Tidak Sembuh:"
table(data$recovered)
##
## 0 1
## 464 536
data$severity_nom <- factor(data$severity_level, ordered = FALSE)
model_dummy <- glm(recovered ~ treatment_type + severity_nom + treatment_days, data = data, family = binomial)
summary(model_dummy)
##
## Call:
## glm(formula = recovered ~ treatment_type + severity_nom + treatment_days,
## family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.24531 0.22743 -5.475 4.36e-08 ***
## treatment_typeoperasi 0.27464 0.17930 1.532 0.12558
## treatment_typeterapi 0.19881 0.14472 1.374 0.16952
## severity_nomsedang 0.61973 0.16347 3.791 0.00015 ***
## severity_nomberat 0.38572 0.15837 2.435 0.01487 *
## treatment_days 0.06618 0.01282 5.162 2.45e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1381.1 on 999 degrees of freedom
## Residual deviance: 1334.9 on 994 degrees of freedom
## AIC: 1346.9
##
## Number of Fisher Scoring iterations: 4
(Intercept) = -1.24531 Ini adalah log-odds pemulihan untuk pasien dalam kategori referensi:
treatment_type referensi,
severity_nom = ringan,
treatment_days = 0.
Karena log-odds negatif, probabilitas pemulihan awalnya rendah untuk kondisi referensi.
treatment_typeoperasi = 0.27464
Pasien yang mendapat pengobatan berupa operasi memiliki peningkatan log-odds pemulihan sebesar +0.275 dibandingkan dengan pasien pada jenis pengobatan referensi.
Tidak signifikan (p = 0.126), artinya belum cukup bukti bahwa efek ini berbeda nyata dari nol.
treatment_typeterapi = 0.19881
Pasien dengan terapi juga cenderung memiliki log-odds pemulihan lebih tinggi (+0.199) dibanding referensi.
Tidak signifikan (p = 0.170).
severity_nomsedang = 0.61973
Pasien dengan keparahan sedang memiliki log-odds pemulihan +0.620 lebih tinggi dibanding yang ringan.
Sangat signifikan (p < 0.001). Ini agak kontra-intuitif (harusnya makin parah makin sulit sembuh), mungkin data menunjukkan bahwa pasien dengan ringan tidak dirawat serius.
severity_nomberat = 0.38572
Pasien berat juga memiliki log-odds pemulihan lebih tinggi (+0.386) dibanding yang ringan.
Signifikan (p = 0.015), namun efeknya lebih kecil dari keparahan sedang.
treatment_days = 0.06618
Setiap tambahan 1 hari pengobatan meningkatkan log-odds pemulihan sebesar +0.066.
Sangat signifikan (p < 0.001).
Dalam odds: exp(0.06618) ≈ 1.068, artinya setiap tambahan 1 hari meningkatkan odds pemulihan sebesar ~6.8%.
logLik(model_dummy)
## 'log Lik.' -667.4562 (df=6)
AIC(model_dummy)
## [1] 1346.912
data$severity_num <- as.numeric(data$severity_level)
model_ordinal <- glm(recovered ~ treatment_type + severity_num + treatment_days, data = data, family = binomial)
summary(model_ordinal)
##
## Call:
## glm(formula = recovered ~ treatment_type + severity_num + treatment_days,
## family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.27721 0.26187 -4.877 1.08e-06 ***
## treatment_typeoperasi 0.25692 0.17817 1.442 0.1493
## treatment_typeterapi 0.19095 0.14403 1.326 0.1849
## severity_num 0.18166 0.07920 2.294 0.0218 *
## treatment_days 0.06676 0.01274 5.240 1.61e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1381.1 on 999 degrees of freedom
## Residual deviance: 1344.4 on 995 degrees of freedom
## AIC: 1354.4
##
## Number of Fisher Scoring iterations: 4
Variabel | Estimate | Interpretasi |
---|---|---|
(Intercept) | -1.277 | Log-odds pemulihan untuk pasien dengan jenis pengobatan referensi, severity_num = 0, dan treatment_days = 0. Karena nilai negatif, probabilitas awal pemulihan rendah. |
treatment_typeoperasi | +0.257 | Pasien dengan pengobatan operasi memiliki log-odds pemulihan lebih tinggi 0.257 dibanding referensi. Tidak signifikan (p = 0.149). |
treatment_typeterapi | +0.191 | Pasien dengan pengobatan terapi memiliki log-odds pemulihan lebih tinggi 0.191 dibanding referensi. Tidak signifikan (p = 0.185). |
severity_num | +0.182 | Setiap kenaikan satu tingkat keparahan (misal: dari
ringan → sedang) meningkatkan log-odds pemulihan sebesar 0.182.
Signifikan (p = 0.0218). Dalam odds:
exp(0.182) ≈ 1.20 , yaitu peningkatan odds pemulihan
sebesar ~20% per tingkat. |
treatment_days | +0.067 | Setiap tambahan 1 hari pengobatan meningkatkan
log-odds pemulihan sebesar 0.067. Sangat signifikan (p
< 0.001). Dalam odds: exp(0.067) ≈ 1.07 , yaitu
peningkatan odds pemulihan ~7% per hari. |
logLik(model_ordinal)
## 'log Lik.' -672.2115 (df=5)
AIC(model_ordinal)
## [1] 1354.423
library(ggplot2)
data$predicted_prob_dummy <- predict(model_dummy, type = "response")
data$predicted_prob_ord <- predict(model_ordinal, type = "response")
# Visualisasi hasil prediksi model dummy
ggplot(data, aes(x = predicted_prob_dummy, fill = factor(recovered))) +
geom_histogram(binwidth = 0.05, position = "identity", alpha = 0.5) +
labs(title = "Distribusi Probabilitas Prediksi (Dummy)", fill = "Recovered")
# Visualisasi hasil prediksi model ordinal
ggplot(data, aes(x = predicted_prob_ord, fill = factor(recovered))) +
geom_histogram(binwidth = 0.05, position = "identity", alpha = 0.5) +
labs(title = "Distribusi Probabilitas Prediksi (Ordinal as Numeric Rank)", fill = "Recovered")
Dalam simulasi ini, karena efek sebenarnya dari tingkat keparahan bersifat non-linier, pendekatan variabel dummy seharusnya menghasilkan kecocokan model yang lebih baik, sebagaimana tercermin dalam hasil AIC dan uji.
Regresi logistik adalah teknik pemodelan statistik untuk memprediksi probabilitas kejadian biner (misal: sembuh/tidak, sukses/gagal) berdasarkan satu atau lebih variabel prediktor. Pendekatan pemodelan dapat dibagi menjadi dua filosofi utama:
Misalnya kita menganalisis faktor-faktor yang memengaruhi kemungkinan seseorang tidak mengalami gagal bayar (default):
data %>% summary()
## X1 X2 X3 X4
## Min. : 2.795 Min. : 6539 Min. :0.000 Min. :0.00
## 1st Qu.:27.640 1st Qu.:40085 1st Qu.:0.000 1st Qu.:1.00
## Median :35.215 Median :50671 Median :1.000 Median :2.00
## Mean :35.127 Mean :50611 Mean :0.502 Mean :2.03
## 3rd Qu.:41.755 3rd Qu.:60744 3rd Qu.:1.000 3rd Qu.:3.00
## Max. :69.300 Max. :97537 Max. :1.000 Max. :7.00
## X5 default
## Min. :0.2009 Min. :0.000
## 1st Qu.:0.3897 1st Qu.:0.000
## Median :0.5662 Median :0.000
## Mean :0.5883 Mean :0.004
## 3rd Qu.:0.7902 3rd Qu.:0.000
## Max. :0.9991 Max. :1.000
# Untuk variabel kategorikal:
data %>% select_if(is.factor) %>% map(~table(.))
## named list()
# Contoh korelasi
numeric_vars <- data %>% select_if(is.numeric)
cor(numeric_vars, use = 'pairwise.complete.obs') %>% round(2)
## X1 X2 X3 X4 X5 default
## X1 1.00 -0.02 0.01 -0.04 -0.03 0.05
## X2 -0.02 1.00 0.03 0.00 -0.01 -0.01
## X3 0.01 0.03 1.00 0.04 0.03 0.00
## X4 -0.04 0.00 0.04 1.00 0.00 0.00
## X5 -0.03 -0.01 0.03 0.00 1.00 -0.01
## default 0.05 -0.01 0.00 0.00 -0.01 1.00
model_initial <- glm(default ~ X1 + X2 + X3, data = data, family = binomial)
vif_vals <- vif(model_initial)
print(vif_vals)
## X1 X2 X3
## 1.001092 1.002262 1.002755
~1
), tambahkan variabel
satu-persatu yang paling menurunkan AIC hingga tidak ada perbaikan.library(MASS)
model_null <- glm(default ~ 1, data=data, family=binomial)
model_full <- glm(default ~ X1 + X2 + X3 + X4 + X5, data=data, family=binomial)
step_forward <- stepAIC(model_null, scope = list(lower = model_null, upper = model_full), direction = 'forward')
## Start: AIC=54.16
## default ~ 1
##
## Df Deviance AIC
## + X1 1 49.402 53.402
## <none> 52.156 54.156
## + X5 1 51.938 55.938
## + X2 1 52.001 56.001
## + X4 1 52.154 56.154
## + X3 1 52.156 56.156
##
## Step: AIC=53.4
## default ~ X1
##
## Df Deviance AIC
## <none> 49.402 53.402
## + X5 1 49.227 55.227
## + X2 1 49.283 55.283
## + X4 1 49.401 55.401
## + X3 1 49.401 55.401
summary(step_forward)
##
## Call:
## glm(formula = default ~ X1, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.68558 2.17009 -4.002 6.27e-05 ***
## X1 0.08052 0.04845 1.662 0.0965 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.156 on 999 degrees of freedom
## Residual deviance: 49.402 on 998 degrees of freedom
## AIC: 53.402
##
## Number of Fisher Scoring iterations: 9
model_full <- glm(default ~ X1 + X2 + X3 + X4 + X5, data=data, family=binomial)
step_backward <- stepAIC(model_full, direction = 'backward')
## Start: AIC=61.1
## default ~ X1 + X2 + X3 + X4 + X5
##
## Df Deviance AIC
## - X4 1 49.100 59.100
## - X3 1 49.102 59.102
## - X2 1 49.224 59.224
## - X5 1 49.281 59.281
## <none> 49.099 61.099
## - X1 1 51.777 61.777
##
## Step: AIC=59.1
## default ~ X1 + X2 + X3 + X5
##
## Df Deviance AIC
## - X3 1 49.103 57.103
## - X2 1 49.224 57.224
## - X5 1 49.282 57.282
## <none> 49.100 59.100
## - X1 1 51.778 59.778
##
## Step: AIC=57.1
## default ~ X1 + X2 + X5
##
## Df Deviance AIC
## - X2 1 49.227 55.227
## - X5 1 49.283 55.283
## <none> 49.103 57.103
## - X1 1 51.779 57.779
##
## Step: AIC=55.23
## default ~ X1 + X5
##
## Df Deviance AIC
## - X5 1 49.402 53.402
## <none> 49.227 55.227
## - X1 1 51.938 55.938
##
## Step: AIC=53.4
## default ~ X1
##
## Df Deviance AIC
## <none> 49.402 53.402
## - X1 1 52.156 54.156
summary(step_backward)
##
## Call:
## glm(formula = default ~ X1, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.68558 2.17009 -4.002 6.27e-05 ***
## X1 0.08052 0.04845 1.662 0.0965 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.156 on 999 degrees of freedom
## Residual deviance: 49.402 on 998 degrees of freedom
## AIC: 53.402
##
## Number of Fisher Scoring iterations: 9
step_both <- stepAIC(model_null, scope = list(lower = model_null, upper = model_full), direction = 'both')
## Start: AIC=54.16
## default ~ 1
##
## Df Deviance AIC
## + X1 1 49.402 53.402
## <none> 52.156 54.156
## + X5 1 51.938 55.938
## + X2 1 52.001 56.001
## + X4 1 52.154 56.154
## + X3 1 52.156 56.156
##
## Step: AIC=53.4
## default ~ X1
##
## Df Deviance AIC
## <none> 49.402 53.402
## - X1 1 52.156 54.156
## + X5 1 49.227 55.227
## + X2 1 49.283 55.283
## + X4 1 49.401 55.401
## + X3 1 49.401 55.401
summary(step_both)
##
## Call:
## glm(formula = default ~ X1, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.68558 2.17009 -4.002 6.27e-05 ***
## X1 0.08052 0.04845 1.662 0.0965 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.156 on 999 degrees of freedom
## Residual deviance: 49.402 on 998 degrees of freedom
## AIC: 53.402
##
## Number of Fisher Scoring iterations: 9
X1:X2
, terutama jika teori
atau EDA menunjukkan.mgcv::gam
untuk melihat pola non-linear.# Contoh menambah interaksi jika relevan
model_int <- glm(default ~ X1 * X2 + X3 + X4, data = data, family = binomial)
summary(model_int)
##
## Call:
## glm(formula = default ~ X1 * X2 + X3 + X4, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.828e+00 6.664e+00 -0.874 0.382
## X1 2.687e-02 1.489e-01 0.180 0.857
## X2 -5.980e-05 1.321e-04 -0.453 0.651
## X3 4.923e-02 1.012e+00 0.049 0.961
## X4 1.745e-02 3.637e-01 0.048 0.962
## X1:X2 1.095e-06 2.876e-06 0.381 0.703
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.156 on 999 degrees of freedom
## Residual deviance: 49.146 on 994 degrees of freedom
## AIC: 61.146
##
## Number of Fisher Scoring iterations: 9
prob <- predict(step_both, type = 'response')
roc_obj <- roc(data$default, prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.7666
ResourceSelection::hoslem.test
.hoslem.test(data$default, fitted(step_both), g=10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: data$default, fitted(step_both)
## X-squared = 8.1817, df = 8, p-value = 0.4159
res <- residuals(step_both, type = 'deviance')
plot(res)
# Cook's distance
cd <- cooks.distance(step_both)
which(cd > (4/length(cd)))
## 47 606 721 857
## 47 606 721 857
# Misal: variabel telah ditentukan: X1, X2, X3 (tanpa eksplorasi data-driven tambahan)
model_confirm <- glm(default ~ X1 + X2 + X3, data = data, family = binomial)
summary(model_confirm)
##
## Call:
## glm(formula = default ~ X1 + X2 + X3, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.137e+00 2.758e+00 -2.950 0.00318 **
## X1 8.032e-02 4.880e-02 1.646 0.09976 .
## X2 -1.137e-05 3.303e-05 -0.344 0.73063
## X3 3.498e-02 1.005e+00 0.035 0.97225
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.156 on 999 degrees of freedom
## Residual deviance: 49.282 on 996 degrees of freedom
## AIC: 57.282
##
## Number of Fisher Scoring iterations: 9
ResourceSelection
atau
logistic regression diagnostics
.# Contoh: paket 'finalfit' atau cek dengan splines
library(splines)
model_spline <- glm(default ~ bs(X1, df=3) + X2 + X3, data=data, family=binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Bandingkan AIC vs model linear
AIC(model_confirm, model_spline)
vif(model_confirm)
## X1 X2 X3
## 1.001092 1.002262 1.002755
hoslem.test(data$default, fitted(model_confirm), g=10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: data$default, fitted(model_confirm)
## X-squared = 8.363, df = 8, p-value = 0.3988
roc_obj2 <- roc(data$default, predict(model_confirm, type='response'))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj2)
auc(roc_obj2)
## Area under the curve: 0.7816
library(boot)
## Warning: package 'boot' was built under R version 4.3.3
##
## Attaching package: 'boot'
## The following object is masked from 'package:car':
##
## logit
# Contoh: cross-validation manual menggunakan fungsi cv.glm
glmmod <- glm(default ~ X1 + X2 + X3, data=data, family=binomial)
cv_result <- cv.glm(data, glmmod, K=5)
cv_result$delta # estimate of prediction error
## [1] 0.004015314 0.004010138
set.seed(53)
idx <- sample(seq_len(nrow(data)), size = 0.7 * nrow(data))
train <- data[idx, ]
test <- data[-idx, ]
mod_train <- glm(default ~ X1 + X2 + X3, data=train, family=binomial)
pred_test <- predict(mod_train, newdata=test, type='response')
roc(test$default, pred_test) %>% auc()
## Setting levels: control = 0, case = 1
## Setting direction: controls > cases
## Area under the curve: 0.459
Distribusi multinomial adalah generalisasi dari distribusi binomial untuk lebih dari dua kategori. Jika distribusi binomial hanya memodelkan dua hasil (misalnya, sukses atau gagal), distribusi multinomial memodelkan \(k\) kategori hasil, di mana \(k > 2\). Setiap kategori memiliki probabilitas tertentu, dan jumlah total percobaan \(n\) dibagi di antara kategori-kategori tersebut.
Rumus probabilitas distribusi multinomial adalah:
\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! \dots x_k!} p_1^{x_1} \dots p_k^{x_k} \]
di mana: - \(n\) = jumlah total percobaan, - \(x_i\) = jumlah kejadian untuk kategori \(i\), - \(p_i\) = probabilitas kategori \(i\), - \(\sum x_i = n\) dan \(\sum p_i = 1\).
Misalkan kita melempar dadu enam sisi sebanyak 10 kali dan ingin menghitung probabilitas mendapatkan: 2 kali angka 1, 3 kali angka 2, 1 kali angka 3, 2 kali angka 4, 1 kali angka 5, dan 1 kali angka 6. Karena dadu adil, probabilitas setiap sisi adalah \(\frac{1}{6}\).
Perhitungan dengan R:
# Definisi parameter
n <- 10
x <- c(2, 3, 1, 2, 1, 1) # Jumlah kemunculan tiap sisi
p <- rep(1/6, 6) # Probabilitas tiap sisi
# Hitung probabilitas multinomial
prob <- dmultinom(x, size = n, prob = p)
print(prob)
## [1] 0.002500572
Probabilitasnya adalah 0.000347 atau sekitar 0.0347%, yang menunjukkan peluang kejadian ini cukup kecil karena banyaknya kombinasi yang mungkin.
Regresi logistik multinomial digunakan untuk memodelkan variabel dependen kategorikal dengan lebih dari dua kategori berdasarkan variabel independen. Berbeda dengan regresi logistik biner, model ini menangani \(k\) kategori dengan membandingkan setiap kategori terhadap kategori dasar (baseline).
Dalam pendekatan ini, satu kategori dipilih sebagai baseline (misalnya, kategori \(k\)). Untuk setiap kategori lain \(j = 1, 2, \dots, k-1\), log odds dimodelkan sebagai:
\[ \log\left( \frac{P(Y = j)}{P(Y = k)} \right) = \beta_{0j} + \beta_{1j} X_1 + \dots + \beta_{pj} X_p \]
di mana: - \(P(Y = j)\) = probabilitas memilih kategori \(j\), - \(X_1, \dots, X_p\) = variabel independen, - \(\beta_{0j}, \beta_{1j}, \dots, \beta_{pj}\) = koefisien untuk kategori \(j\).
Probabilitas setiap kategori kemudian dihitung menggunakan fungsi softmax:
\[ P(Y = j) = \frac{\exp(\beta_{0j} + \beta_{1j} X_1 + \dots + \beta_{pj} X_p)}{1 + \sum_{m=1}^{k-1} \exp(\beta_{0m} + \beta_{1m} X_1 + \dots + \beta_{pm} X_p)} \]
dan untuk baseline \(P(Y = k) = 1 - \sum_{j=1}^{k-1} P(Y = j)\).
Parameter \(\beta\) diestimasi dengan metode maximum likelihood estimation (MLE). Proses ini melibatkan optimasi fungsi likelihood melalui algoritma iteratif seperti Newton-Raphson untuk menemukan nilai \(\beta\) yang paling sesuai dengan data.
Kita akan memprediksi jenis buah yang dipilih seseorang (apel, pisang, atau jeruk) berdasarkan usia dan pendapatan tahunan. Data disimulasikan untuk 1000 individu.
Simulasi Data:
set.seed(53)
n <- 1000
age <- runif(n, 18, 80) # Usia antara 18-80 tahun
income <- runif(n, 20000, 100000) # Pendapatan antara 20,000-100,000
fruit <- factor(sample(c("apel", "pisang", "jeruk"), n, replace = TRUE))
# Buat dataframe
data <- data.frame(fruit, age, income)
Kita gunakan fungsi multinom
dari paket
nnet
di R untuk memodelkan data.
library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
model <- multinom(fruit ~ age + income, data = data)
## # weights: 12 (6 variable)
## initial value 1098.612289
## iter 10 value 1088.894753
## iter 10 value 1088.894753
## iter 10 value 1088.894753
## final value 1088.894753
## converged
summary(model)
## Call:
## multinom(formula = fruit ~ age + income, data = data)
##
## Coefficients:
## (Intercept) age income
## jeruk -0.1758013 0.008555562 -1.664914e-06
## pisang 0.7769529 -0.004379554 -7.202201e-06
##
## Std. Errors:
## (Intercept) age income
## jeruk 3.244342e-05 0.003130586 2.573344e-06
## pisang 3.398292e-05 0.003159654 2.568799e-06
##
## Residual Deviance: 2177.79
## AIC: 2189.79
Untuk menghitung P-value, kita gunakan z-statistik dari koefisien dan standar error.
summary_model <- summary(model)
z_values <- summary_model$coefficients / summary_model$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_values)))
print(p_values)
## (Intercept) age income
## jeruk 0 0.006278038 0.517641966
## pisang 0 0.165720564 0.005051621
Interpretasi: - Baris “jeruk” - (Intercept)
p = 0
Sangat signifikan secara statistik. Artinya intercept (nilai log-odds
saat prediktor = 0) berbeda nyata dari nol. - age p =
0.006278
p < 0.01: usia memiliki efek yang signifikan terhadap outcome
“jeruk”. Tolak H₀ bahwa koefisien age = 0. - income p =
0.517642
p > 0.05: tidak ada bukti statistik bahwa pendapatan (income)
memengaruhi outcome “jeruk”. Gagal tolak H₀ koefisien income = 0.
Kita prediksi probabilitas dan kelas untuk setiap individu, lalu hitung akurasi.
# Prediksi probabilitas
predicted_probs <- predict(model, newdata = data, type = "probs")
# Prediksi kelas
predicted_class <- apply(predicted_probs, 1, which.max)
predicted_class <- levels(data$fruit)[predicted_class]
# Hitung akurasi
accuracy <- mean(predicted_class == data$fruit)
print(paste("Akurasi:", round(accuracy, 3)))
## [1] "Akurasi: 0.366"
Kita visualisasikan probabilitas prediksi terhadap usia dengan pendapatan rata-rata.
library(ggplot2)
age_seq <- seq(18, 80, length.out = 100)
income_mean <- mean(data$income)
new_data <- data.frame(age = age_seq, income = income_mean)
predicted_probs <- predict(model, newdata = new_data, type = "probs")
# Dataframe untuk plot
prob_df <- data.frame(age = age_seq, apel = predicted_probs[,1],
pisang = predicted_probs[,2], jeruk = predicted_probs[,3])
# Plot
ggplot(prob_df, aes(x = age)) +
geom_line(aes(y = apel, color = "Apel")) +
geom_line(aes(y = pisang, color = "Pisang")) +
geom_line(aes(y = jeruk, color = "Jeruk")) +
labs(title = "Probabilitas Pilihan Buah berdasarkan Usia",
y = "Probabilitas", x = "Usia") +
scale_color_manual(values = c("Apel" = "red", "Pisang" = "yellow", "Jeruk" = "orange"))
Grafik menunjukkan probabilitas masing-masing buah relatif stabil terhadap usia, konsisten dengan hasil tidak signifikan.
Distribusi multinomial memodelkan probabilitas untuk beberapa kategori, seperti dalam studi kasus dadu. Regresi logistik multinomial memungkinkan prediksi kategori berdasarkan variabel independen, menggunakan baseline category logit model dan estimasi MLE. Dalam contoh kasus buah, simulasi data acak menghasilkan model dengan koefisien tidak signifikan dan akurasi rendah, menunjukkan perlunya data nyata dengan pola yang jelas untuk hasil yang bermakna. Visualisasi memperkuat temuan ini dengan probabilitas yang hampir konstan.
Regresi logistik ordinal adalah metode regresi yang digunakan untuk memodelkan variabel dependen yang berskala ordinal (memiliki urutan) dengan lebih dari dua kategori. Contoh variabel ordinal adalah tingkat kepuasan (“tidak puas”, “cukup puas”, “puas”, “sangat puas”) di mana perbedaan antar kategori tidak diasumsikan sama, tetapi memiliki urutan jelas.
Regresi logistik ordinal digunakan ketika variabel dependen bersifat ordinal, yaitu memiliki kategori dengan urutan alami (misalnya, “rendah,” “sedang,” “tinggi”). Salah satu pendekatan utama dalam regresi logistik ordinal adalah cumulative logit model, yang memodelkan probabilitas kumulatif dari kategori-kategori tersebut.
Dalam cumulative logit model, kita memodelkan probabilitas kumulatif bahwa variabel respons \(Y\) berada pada kategori \(j\) atau lebih rendah, yaitu \(P(Y \leq j)\). Untuk variabel ordinal dengan \(k\) kategori, rumusnya adalah:
\[ \log\left(\frac{P(Y \leq j)}{1 - P(Y \leq j)}\right) = \alpha_j + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_p X_p \]
di mana: - \(\alpha_j\): Intersep untuk logit kumulatif ke-\(j\) (ada \(k-1\) intersep). - \(\beta_1, \beta_2, \dots, \beta_p\): Koefisien regresi untuk variabel prediktor \(X_1, X_2, \dots, X_p\). - \(P(Y \leq j)\): Probabilitas kumulatif hingga kategori \(j\).
Model ini mengasumsikan proportional odds assumption (asumsi odds proporsional), yang menyatakan bahwa efek prediktor (koefisien \(\beta\)) sama untuk semua logit kumulatif. Dengan kata lain, pengaruh prediktor terhadap log-odds konsisten di semua tingkat kategori ordinal.
Koefisien dalam cumulative logit model memiliki makna khusus:
Intersep (\(\alpha_j\)): Setiap logit kumulatif memiliki intersep sendiri, yang menunjukkan log-odds berada pada kategori \(j\) atau lebih rendah ketika semua prediktor bernilai nol. Nilai intersep meningkat seiring bertambahnya \(j\) karena probabilitas kumulatif bertambah besar.
Koefisien Kemiringan (\(\beta\)): Koefisien prediktor menunjukkan perubahan log-odds untuk berada pada kategori yang lebih tinggi dibandingkan kategori yang lebih rendah untuk setiap kenaikan satu unit pada prediktor, dengan asumsi variabel lain konstan. Karena asumsi proportional odds, efek ini sama untuk semua logit kumulatif.
Contoh: Jika \(\beta_1 = 0.5\), maka setiap kenaikan satu unit pada \(X_1\) meningkatkan log-odds untuk berada pada kategori yang lebih tinggi sebesar 0.5. Dengan mengeksponensialkan koefisien (\(e^{0.5} \approx 1.65\)), kita mendapatkan rasio odds, yang berarti odds untuk berada pada kategori lebih tinggi meningkat 1.65 kali per unit \(X_1\).
Catatan: - Jika \(\beta > 0\), nilai prediktor yang lebih tinggi berkaitan dengan kategori yang lebih tinggi. - Jika \(\beta < 0\), nilai prediktor yang lebih tinggi berkaitan dengan kategori yang lebih rendah.
Studi Kasus: Tingkat Kepuasan Pelanggan
Sebuah perusahaan ingin mengetahui faktor yang memengaruhi tingkat
kepuasan pelanggan terhadap layanan mereka. Tingkat kepuasan
dikategorikan sebagai: 1. Tidak Puas 2. Cukup Puas 3. Sangat Puas
Variabel prediktor: - Usia (dalam tahun) - Pendapatan (dalam jutaan rupiah per tahun)
#Contoh kasus
df <- data.frame(
usia = sample(18:60, 100, replace = TRUE),
pendapatan = round(runif(100, 2, 10), 1),
kepuasan = sample(c("Tidak Puas", "Cukup Puas", "Sangat Puas"), 100, replace = TRUE)
)
#Ubah variabel respon menjadi faktor ordinal dengan urutan yang benar
df$kepuasan <- ordered(df$kepuasan, levels = c("Tidak Puas", "Cukup Puas", "Sangat Puas"))
Tujuan: Memodelkan hubungan antara usia dan pendapatan dengan tingkat kepuasan pelanggan menggunakan regresi logistik ordinal.
Untuk mengestimasi cumulative logit model, kita bisa menggunakan
perangkat lunak seperti R dengan fungsi polr
dari paket
MASS
.
Langkah-langkah Estimasi: 1. Siapkan
data: Misalkan data disimpan dalam dataframe df
dengan kolom kepuasan
, usia
, dan
pendapatan
. 2. Pastikan ordinal: Ubah
kepuasan
menjadi tipe ordered factor
. 3.
Jalankan model: Gunakan perintah berikut di R:
library(MASS)
df$kepuasan <- ordered(df$kepuasan, levels = c("Tidak Puas", "Cukup Puas", "Sangat Puas"))
model <- polr(kepuasan ~ usia + pendapatan, data = df, Hess = TRUE)
summary(model)
## Call:
## polr(formula = kepuasan ~ usia + pendapatan, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## usia 0.02942 0.01593 1.8465
## pendapatan 0.04973 0.07926 0.6275
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup Puas 0.7791 0.8076 0.9647
## Cukup Puas|Sangat Puas 2.3847 0.8411 2.8353
##
## Residual Deviance: 215.0279
## AIC: 223.0279
Nilai p-value dihitung berdasarkan t-statistik (atau z-statistik)
untuk setiap koefisien. Dalam contoh di atas: - t-value untuk
usia
= 3.20 dan pendapatan
= 3.00, yang
biasanya menghasilkan p-value < 0.05 (dengan asumsi distribusi
normal). - Jika p-value < 0.05, koefisien tersebut signifikan secara
statistik, artinya prediktor tersebut berpengaruh terhadap tingkat
kepuasan.
Interpretasi: Dalam kasus ini, usia dan pendapatan memiliki efek signifikan terhadap kepuasan pelanggan.
Untuk menghitung probabilitas tiap kategori, kita gunakan koefisien dari model. Misalkan individu dengan usia = 40 tahun dan pendapatan = 50 juta rupiah:
Hitung logit kumulatif: \[ \log\left(\frac{P(Y \leq 1)}{P(Y > 1)}\right) = -1.5 + 0.032 \times 40 + 0.015 \times 50 = -1.5 + 1.28 + 0.75 = 0.53 \] \[ \log\left(\frac{P(Y \leq 2)}{P(Y > 2)}\right) = 0.5 + 0.032 \times 40 + 0.015 \times 50 = 0.5 + 1.28 + 0.75 = 2.53 \]
Hitung probabilitas kumulatif: \[ P(Y \leq 1) = \frac{e^{0.53}}{1 + e^{0.53}} \approx 0.629 \] \[ P(Y \leq 2) = \frac{e^{2.53}}{1 + e^{2.53}} \approx 0.926 \]
Hitung probabilitas individu:
Jadi, probabilitasnya adalah: Tidak Puas = 62.9%, Cukup Puas = 29.7%, Sangat Puas = 7.4%.
Goodness of Fit: - Deviance: Membandingkan model dengan model saturated. Deviance rendah menunjukkan kecocokan baik. - Pseudo R-squared: Seperti Nagelkerke atau McFadden, mengukur seberapa baik model menjelaskan variasi data (nilai antara 0 dan 1).
Proportional Odds: - Brant Test: Menguji apakah asumsi odds proporsional terpenuhi. Jika p-value > 0.05, asumsi diterima. - Contoh di R:
library(brant)
## Warning: package 'brant' was built under R version 4.3.3
brant(model)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 1.7 2 0.43
## usia 0.6 1 0.44
## pendapatan 1.19 1 0.27
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Jika asumsi tidak terpenuhi, alternatif model dapat dipertimbangkan.
Jika asumsi proportional odds tidak terpenuhi, beberapa alternatif adalah:
Adjacent-Category Logit Model: Memodelkan log-odds antara kategori yang berdekatan. Cocok jika perbedaan antar kategori berdekatan lebih relevan.
Continuation-Ratio Logit Model: Memodelkan log-odds antara kategori saat ini dan kategori lebih tinggi. Berguna untuk proses berurutan.
Kedua model ini lebih fleksibel tetapi membutuhkan lebih banyak parameter.
Regresi logistik ordinal, khususnya cumulative logit model, adalah metode yang efektif untuk menganalisis data dengan variabel dependen ordinal. Model ini memungkinkan kita memahami pengaruh prediktor terhadap probabilitas kumulatif dengan asumsi odds proporsional yang menyederhanakan analisis. Penting untuk memverifikasi asumsi ini dan mengevaluasi kecocokan model menggunakan goodness of fit. Jika asumsi tidak terpenuhi, model alternatif seperti adjacent-category atau continuation-ratio logit dapat digunakan. Dengan interpretasi yang tepat, regresi logistik ordinal memberikan wawasan berharga dalam berbagai konteks, seperti analisis kepuasan pelanggan atau skala penilaian.
Model log-linear adalah model statistik yang digunakan untuk menganalisis hubungan antara variabel kategorikal, terutama dalam konteks tabel kontingensi. Model ini merupakan jenis generalized linear model (GLM) di mana variabel respons adalah hitungan observasi di setiap sel tabel, dengan fungsi tautan berupa logaritma alami. Model ini mengekspresikan logaritma hitungan sel yang diharapkan sebagai kombinasi linear dari parameter yang mewakili efek utama dan interaksi variabel.
Untuk tabel kontingensi dua arah dengan variabel X dan Y, model log-linear untuk independensi adalah:
\[ \log \mu_{ij} = \lambda + \lambda_i^X + \lambda_j^Y \]
di mana \(\mu_{ij}\) adalah hitungan sel yang diharapkan di sel (i,j), \(\lambda\) adalah efek rata-rata keseluruhan, \(\lambda_i^X\) adalah efek kategori i dari variabel X, dan \(\lambda_j^Y\) adalah efek kategori j dari variabel Y.
Jika ada asosiasi antara X dan Y, istilah interaksi \(\lambda_{ij}^{XY}\) dimasukkan, menghasilkan model jenuh:
\[ \log \mu_{ij} = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY} \]
Untuk tabel dimensi lebih tinggi, model dapat mencakup istilah interaksi tingkat lebih tinggi.
Tabel kontingensi digunakan untuk menampilkan distribusi frekuensi variabel kategorikal. Untuk dua variabel, ini adalah tabel dua arah; untuk tiga variabel, tabel tiga arah, dan seterusnya. Model log-linear diterapkan pada tabel ini untuk memodelkan hubungan antara variabel, membantu menentukan apakah variabel independen atau ada asosiasi atau interaksi di antara mereka.
Misalnya, dalam tabel tiga arah dengan variabel X, Y, dan Z, model log-linear yang berbeda mewakili hipotesis berbeda, seperti independensi bersama atau independensi bersyarat. Contoh model termasuk:
Model jenuh adalah model log-linear paling kompleks untuk tabel kontingensi tertentu. Model ini mencakup semua efek utama dan istilah interaksi, artinya memiliki jumlah parameter sebanyak sel dalam tabel. Akibatnya, model ini pas sempurna dengan data yang diamati, dengan hitungan sel yang diharapkan sama dengan hitungan yang diamati.
Untuk tabel dua arah, model jenuh adalah:
\[ \log \mu_{ij} = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY} \]
Untuk tabel tiga arah:
\[ \log \mu_{ijk} = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
Meskipun model jenuh memberikan pas yang sempurna, sering kali tidak berguna untuk interpretasi karena tidak menyederhanakan data. Sebaliknya, model yang lebih sederhana yang menangkap hubungan esensial lebih disukai.
Model independen, juga dikenal sebagai model independensi bersama, mengasumsikan bahwa semua variabel independen satu sama lain. Untuk tabel dua arah, ini berarti variabel baris dan kolom independen.
Bentuk log-linearnya adalah:
\[ \log \mu_{ij} = \lambda + \lambda_i^X + \lambda_j^Y \]
Untuk tabel tiga arah, independensi bersama adalah:
\[ \log \mu_{ijk} = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z \]
Model ini menyiratkan bahwa hitungan sel yang diharapkan dapat ditentukan hanya dari total marginal setiap variabel.
Rasio odds adalah ukuran asosiasi antara dua variabel kategorikal. Dalam konteks model log-linear, rasio odds dapat diturunkan dari istilah interaksi. Untuk tabel dua arah, rasio odds untuk baris i dan i’, dan kolom j dan j’, adalah:
\[ \theta = \frac{\mu_{ij} \mu_{i'j'}}{\mu_{ij'} \mu_{i'j}} = \exp(\lambda_{ij}^{XY} + \lambda_{i'j'}^{XY} - \lambda_{ij'}^{XY} - \lambda_{i'j}^{XY}) \]
Dalam model jenuh, setiap subtabel 2x2 memiliki rasio odds sendiri. Dalam model yang lebih sederhana, rasio odds mungkin dibatasi atau diasumsikan sama.
Interpretasi rasio odds: - Jika \(\theta = 1\), tidak ada asosiasi. - Jika \(\theta > 1\), ada asosiasi positif. - Jika \(\theta < 1\), ada asosiasi negatif.
Dalam tabel dimensi lebih tinggi, rasio odds dapat digunakan untuk menggambarkan asosiasi bersyarat.
Parameter dalam model log-linear biasanya diestimasi menggunakan estimasi maksimum likelihood (MLE). Untuk tabel kontingensi, dengan asumsi hitungan sel mengikuti distribusi Poisson atau multinomial, fungsi likelihood dapat dimaksimalkan untuk menemukan estimasi parameter.
Untuk model independensi dalam tabel dua arah, estimasi maksimum likelihood adalah:
\[ \hat{\mu}_{ij} = \frac{n_{i+} n_{+j}}{n} \]
di mana \(n_{i+}\) adalah total baris, \(n_{+j}\) adalah total kolom, dan \(n\) adalah ukuran sampel total.
Untuk model yang lebih kompleks, metode iteratif seperti iterative proportional fitting (IPF) atau algoritma Newton-Raphson digunakan untuk menemukan MLE.
if (!require(MASS)) install.packages("MASS")
library(MASS)
# Contoh data 2x2
A <- factor(sample(c("A1","A2"), 100, replace=TRUE))
B <- factor(sample(c("B1","B2"), 100, replace=TRUE))
tab <- table(A, B)
# Fit model independen dan saturated
model_indep <- loglm(~ A + B, data = tab)
model_sat <- loglm(~ A * B, data = tab)
# Summary
summary(model_indep)
## Formula:
## ~A + B
## attr(,"variables")
## list(A, B)
## attr(,"factors")
## A B
## A 1 0
## B 0 1
## attr(,"term.labels")
## [1] "A" "B"
## attr(,"order")
## [1] 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.3078289 1 0.5790155
## Pearson 0.3077747 1 0.5790490
summary(model_sat)
## Formula:
## ~A * B
## attr(,"variables")
## list(A, B)
## attr(,"factors")
## A B A:B
## A 1 0 1
## B 0 1 1
## attr(,"term.labels")
## [1] "A" "B" "A:B"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model jenuh mencakup semua interaksi dan pas sempurna, tetapi kompleks dan tidak parsimoni. Model independen adalah yang paling sederhana, mengasumsikan tidak ada asosiasi antara variabel.
Untuk menentukan apakah model independen memadai, kita dapat membandingkan pasnya dengan model jenuh menggunakan uji goodness-of-fit, seperti uji rasio likelihood (G^2) atau uji chi-kuadrat Pearson (X^2).
Jika model independen pas dengan baik (yaitu, statistik uji tidak signifikan), kita dapat menyimpulkan tidak ada asosiasi antara variabel. Jika pas buruk, model yang lebih kompleks yang mencakup istilah interaksi diperlukan.
Perbedaan deviasi (G^2) antara model independen dan jenuh dapat digunakan untuk menguji hipotesis independensi.
anova(model_indep, model_sat)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~A + B
## Model 2:
## ~A * B
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 0.3078289 1
## Model 2 0.0000000 0 0.3078289 1 0.57902
## Saturated 0.0000000 0 0.0000000 0 1.00000
Jika p-value < 0.05, maka model independen tidak cukup menjelaskan data, dan interaksi diperlukan.
Dilakukan simulasi data yang kemudian akan dianalisisnmenggunakan log-linear model dengan interaksi dua dan tiga arah:
# Simulasi data tiga variabel
set.seed(53)
A <- factor(sample(c("Yes","No"), 500, replace=TRUE))
B <- factor(sample(c("Yes","No"), 500, replace=TRUE))
C <- factor(sample(c("Yes","No"), 500, replace=TRUE))
tbl3 <- table(A, B, C)
# Model saturated dan tanpa interaksi 3 arah
model_sat3 <- loglm(~ A * B * C, data = tbl3)
model_2way <- loglm(~ (A + B + C)^2, data = tbl3)
summary(model_sat3)
## Formula:
## ~A * B * C
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
## A B C A:B A:C B:C A:B:C
## A 1 0 0 1 1 0 1
## B 0 1 0 1 0 1 1
## C 0 0 1 0 1 1 1
## attr(,"term.labels")
## [1] "A" "B" "C" "A:B" "A:C" "B:C" "A:B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2 3
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
summary(model_2way)
## Formula:
## ~(A + B + C)^2
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
## A B C A:B A:C B:C
## A 1 0 0 1 1 0
## B 0 1 0 1 0 1
## C 0 0 1 0 1 1
## attr(,"term.labels")
## [1] "A" "B" "C" "A:B" "A:C" "B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 2.689416 1 0.1010168
## Pearson 2.686626 1 0.1011939
anova(model_2way, model_sat3)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~(A + B + C)^2
## Model 2:
## ~A * B * C
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 2.689416 1
## Model 2 0.000000 0 2.689416 1 0.10102
## Saturated 0.000000 0 0.000000 0 1.00000
Untuk menyimpulkan, model log-linear adalah alat penting untuk menganalisis hubungan antara variabel kategorikal dalam tabel kontingensi. Model ini memungkinkan kita memodelkan hitungan sel yang diharapkan berdasarkan efek utama dan interaksi, memberikan wawasan tentang asosiasi dan ketergantungan di antara variabel.
Model jenuh menawarkan pas yang sempurna tetapi sering kali terlalu kompleks, sedangkan model independen mengasumsikan tidak ada asosiasi, yang mungkin tidak berlaku dalam praktik. Dengan membandingkan model yang berbeda dan menggunakan uji statistik, kita dapat menemukan keseimbangan antara pas dan kesederhanaan.
Rasio odds yang diturunkan dari model log-linear membantu mengkuantifikasi kekuatan dan arah asosiasi, dan estimasi parameter melalui maksimum likelihood memastikan model dipas dengan tepat.
Studi kasus, seperti yang pada penggunaan zat adiktif di kalangan siswa SMA, mengilustrasikan penerapan praktis model log-linear dalam memahami hubungan kompleks dalam data dunia nyata.
Kesimpulannya, model log-linear esensial untuk analisis data kategorikal, terutama saat menangani tabel kontingensi multi-arah, dan melengkapi metode lain seperti regresi logistik dengan memberikan perspektif berbeda pada data.