Dalam statistik, data kategori adalah jenis data yang dibagi ke dalam kelompok atau kategori dan bukan berupa angka yang bisa diukur. Data seperti ini sering digunakan di berbagai bidang untuk memahami pola, hubungan, dan tren yang tidak bisa dilihat langsung melalui angka. Contoh dari data kategori yaitu jenis kelamin (laki-laki/perempuan), status pernikahan (menikah/belum menikah), tingkat pendidikan (rendah/menengah/tinggi), serta preferensi konsumen (setuju/netral/tidak setuju). Analisis terhadap data kategori sangat penting untuk mengeksplorasi dan memahami informasi yang bersifat nominal atau ordinal.
Karena berbeda dari data numerik, data kategori perlu dianalisis dengan metode khusus, seperti tabel kontingensi, uji chi-square, regresi logistik, dan pendekatan berbasis probabilitas. Seiring berkembangnya teknologi, analisis data kategori juga makin sering digunakan dalam machine learning dan kecerdasan buatan.
Analisis Data Kategori memiliki banyak tujuan, diantaranya yaitu:
Analisis data kategori memungkinkan peneliti untuk melihat bagaimana distribusi data tiap kategori. Misalkan terdapat responden dengan kategori usia muda, dewasa, dan tua. Peneliti dapat melihat sebaran usia dari responden yang ada.
Dalam analisis data kategori, identifikasi pola bertujuan untuk menemukan kecenderungan perbedaan antar kelompok dalam data. Misalnya, melalui visualisasi seperti diagram batang dan diagram lingkaran, kita dapat melihat kecenderungan responden memilih suatu merk dibandingkan dengan merk lain.
Dari tujuan yang telah dijelaskan sebelumnya, peneliti juga dimudahkan dalam pengambilan keputusan karena tren atau polanya sudah diketahui.
Analisis data kategorik merupakan suatu teknik statistik yang digunakan untuk menganalisis variabel yang bersifat kategorik, dimana data yang dianalisis bersifat nominal atau ordinal.
Data yang bersifat nominal tidak memiliki urutan, contohnya seperti jenis kelamin dan status menikah. Sedangkan data yang bersifat ordinal memiliki urutan, contohnya seperti tingkat pendidikan dan preferensi konsumen.
Dalam analisis kategorik, data juga dapat dibedakan berdasarkan jumlah kategorinya. Data biner berarti data hanya memiliki dua kategori, misalnya ya/tidak. Sedangkan data multikategori berarti data tersebut memiliki lebih dari dua kategori.
Data Kategorik | Data Kuantitatif | |
---|---|---|
Bentuk | Kategori | Numerik |
Sifat | Kualitatif | Kuantitatif |
Skala Pengukuran | Skala nominal/ordinal | Skala Interval/ratio |
Analisis data kategori memiliki berbagai manfaat dalam berbagai bidang, diantaranya yaitu:
Bidang | Tujuan | Penerapan |
---|---|---|
Kesehatan | Mengetahui hubungan antara kondisi pasien dan kategori risiko | Melihat hubungan antara pola hidup (Sehat/Tidak Sehat) dengan penderita Diabetes |
Sosial | Menganalisis opini masyarakat | Menganalisis kepuasan terhadap layanan publik (Sangat Puas – Tidak Puas) |
Ekonomi | Mengkategorikan jenis pekerjaan dan status ekonomi | Melihat hubungan antara jenis pekerjaan dan tingkat pengeluaran |
Dalam analisis data kategori, metode yang digunakan bergantung kepada tujuan penelitian. Ada beberapa metode dalam analisis data kategori, diantaranya yaitu:
Uji chi - square bertujuan untuk menguji hubungan antara dua variabel, contohnya yaitu menguji apakah ada hubungan antara jenis kelamin dan preferensi produk.
Uji Fisher’s Exact bertujuan sama seperti uji chi - square, hanya saya uji ini digunakan ketika frekuensi data berjumlah kecil (<5).
Regresi logistik pada analisis data kategorik bertujuan untuk memprediksi kemungkinan suatu kategori terjadi berdasarkan variabel prediktor. Misalnya memprediksi apakah seseorang siap menikah berdasarkan tingkat pendapatan, kesiapan mental dan fisik, serta kematangan emosional.
Tabulasi silang atau cross tabulation memiliki tujuan untuk menampilkan distribusi frekuensi dari dua variabel dalam bentuk tabel. Misalnya menampilkan jumlah laki - laki dan perempuan dalam tiap kelompok penyakit.
Analisis diskriminan bertujuan untuk mengklasifikasikan objek ke dalam kategori berdasarkan beberapa variabel, misalnya menentukan preferensi produk pelanggan jenis kelamin dan pendapatan.
Analisis data kategorik memiliki banyak metode untuk digunakan sesuai tujuan masing-masing. Oleh karena itu, peneliti harus memiliki tujuan dan pemahaman untuk bisa meneliti data kategorik menggunakan metode yang tepat.
Tingkat pendidikan merupakan faktor yang berpengaruh terhadap partisipasi seseorang dalam angkatan kerja. Untuk memahami hubungan tersebut, analisis dilakukan menggunakan data dari Badan Pusat Statistik (BPS) tahun 2021–2023 yang mencakup jumlah penduduk usia kerja menurut pendidikan tertinggi dan status keikutsertaan dalam angkatan kerja. Data dikategorikan berdasarkan jenjang pendidikan (SD hingga Perguruan Tinggi) dan status (AK dan Bukan AK), kemudian dianalisis menggunakan tabel kontingensi, uji chi-square, ukuran asosiasi, dan uji Cochran-Mantel-Haenszel (CMH). Tujuan dari analisis ini adalah untuk menguji apakah terdapat hubungan signifikan antara pendidikan dan status kerja, serta apakah hubungan tersebut konsisten antar tahun.
## Pendidikan X2021 X2022 Total_2023 X2021.1 X2022.1 Persen_AK_2023
## 1 >= SD/MI 1461122 1284939 1144695 55.76 53.13 55.80
## 2 SMP/MTs 1563661 1465334 1532001 46.86 46.93 47.28
## 3 SMA/SMK/MA 3838202 3980426 3874632 66.95 67.08 68.78
## 4 Perguruan Tinggi 1403371 1596304 1771585 75.54 75.91 78.98
## AK Bukan_AK
## 1 638740 505955
## 2 724330 807671
## 3 2664972 1209660
## 4 1399198 372387
Variabel acak kategori adalah variabel yang hanya memiliki beberapa kategori diskrit sebagai hasilnya. Distribusi probabilitas dari variabel ini menggambarkan kemungkinan terjadinya setiap kategori.
Distribusi Bernoulli adalah distribusi probabilitas diskrit yang hanya memiliki dua kemungkinan hasil: sukses (1) atau gagal (0). Distribusi ini digunakan untuk percobaan yang hanya memiliki dua hasil, seperti lemparan koin (kepala atau ekor).
Distribusi Bernoulli memiliki satu parameter, yaitu:
Jika \(X\) adalah peubah acak yang mengikuti distribusi Bernoulli, maka:
\[ X \sim \text{Bernoulli}(p) \]
Probability Mass Function (PMF) dari distribusi Bernoulli didefinisikan sebagai:
\[ P(X = x) = \begin{cases} p & \text{jika } x = 1 \\\\ 1 - p & \text{jika } x = 0 \end{cases} \]
atau bisa ditulis dengan persamaan:
\[ P(X = x) = p^x (1 - p)^{1 - x}, \quad x \in \{0, 1\} \]
library(knitr)
library(kableExtra)
library(dplyr)
# Simulasi Bernoulli (masuk angkatan kerja = 1, tidak masuk = 0)
set.seed(123)
bernoulli_SD <- rbinom(n = 10, size = 1, prob = 0.558)
bernoulli_SMP <- rbinom(n = 10, size = 1, prob = 0.473)
bernoulli_SMA <- rbinom(n = 10, size = 1, prob = 0.688)
bernoulli_PT <- rbinom(n = 10, size = 1, prob = 0.7898)
# hasil
bernoulli_SD
## [1] 1 0 1 0 0 1 1 0 1 1
bernoulli_SMP
## [1] 1 0 1 1 0 1 0 0 0 1
bernoulli_SMA
## [1] 0 0 1 0 1 0 1 1 1 1
bernoulli_PT
## [1] 0 0 1 0 1 1 1 1 1 1
Interpretasi: Hasil simulasi distribusi Bernoulli untuk masing-masing jenjang pendidikan menunjukkan variasi dalam peluang keberhasilan (ditandai dengan nilai 1) dan kegagalan (nilai 0). Pada kelompok SD, terdapat 6 keberhasilan dari 10 percobaan, yang mengindikasikan tingkat keberhasilan sebesar 60%. Untuk kelompok SMP, keberhasilan terjadi sebanyak 6 kali juga, menunjukkan proporsi yang sama. Pada kelompok SMA, terdapat peningkatan keberhasilan menjadi 7 dari 10 percobaan (70%), sedangkan kelompok perguruan tinggi (PT) menunjukkan tingkat keberhasilan tertinggi, yaitu 8 dari 10 percobaan atau 80%. Secara umum, tren ini menggambarkan bahwa semakin tinggi jenjang pendidikan, semakin besar pula kemungkinan keberhasilan dalam konteks percobaan biner yang disimulasikan dengan distribusi Bernoulli.
Distribusi Binomial adalah distribusi probabilitas diskrit yang menggambarkan jumlah keberhasilan dalam sejumlah percobaan Bernoulli yang independen dan identik. Setiap percobaan memiliki dua hasil: sukses atau gagal, dan probabilitas sukses tetap di setiap percobaan.
Jika \(X\) adalah peubah acak yang mengikuti distribusi binomial, maka:
\[ X \sim \text{Binomial}(n, p) \]
dengan:
Probability Mass Functiion (PMF) dari distribusi binomial yaitu:
\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k}, \quad k = 0, 1, 2, ..., n \]
Dengan:
## [1] 3 2 3 1 1 5 3 1 3 3
## [1] 4 2 3 3 1 4 2 1 2 4
## [1] 2 3 3 1 3 3 3 3 4 5
## [1] 2 3 4 3 5 4 3 5 4 5
Distribusi Multinomial adalah perluasan dari distribusi Binomial yang mamiliki lebih dari dua hasil. Distribusi ini digunakan untuk menghitung probabilitas hasil dari sejumlah percobaan independen dimana tiap percobaan memiliki lebih dari dua kemungkinan hasil.
Jika terdapat \(k\) kategori dan setiap percobaan memiliki probabilitas:
\[ p_1, p_2, ..., p_k \quad \text{dengan} \quad \sum_{i=1}^k p_i = 1 \]
dan dilakukan \(n\) percobaan, maka jumlah hasil dari setiap kategori mengikuti distribusi multinomial sebagai berikut:
\[ (X_1, X_2, ..., X_k) \sim \text{Multinomial}(n; p_1, p_2, ..., p_k) \]
Probability Mass Functiion dari distribusi Multinomial yaitu:
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1!x_2!...x_k!} \cdot p_1^{x_1} \cdot p_2^{x_2} \cdots p_k^{x_k} \]
Dengan syarat:
set.seed(123)
multinomial <- rmultinom(n = 1, size = 15, prob = c(0.2, 0.8, 0.6))
multinomial
## [,1]
## [1,] 1
## [2,] 7
## [3,] 7
Distribusi Poisson adalah distribusi probabilitas diskrit yang menggambarkan jumlah kejadian dalam suatu interval waktu tertentu, dengan asumsi bahwa:
Jika \(X\) adalah peubah acak yang mengikuti distribusi Poisson dengan parameter \(\lambda\), maka:
\[ X \sim \text{Poisson}(\lambda) \]
dimana:
Probability Mass Functiion (PMF) dari distribusi Poisson adalah:
\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!}, \quad k = 0, 1, 2, ... \]
Sifat-sifat penting:
set.seed(123)
poisson <- rpois(15, lambda = 5)
poisson
## [1] 4 7 4 8 9 2 5 8 5 5 9 5 6 5 2
Desain sampling adalah tahap awal dalam proses penelitian, terkhusus dalam pengumpulan data. Tujuannya adalah agar data yang dikumpulkan dapat digunakan untuk menarik kesimpulan yang akurat tentang populasi.
Dalam analisis data kategori, desain sampling merujuk pada metode yang digunakan untuk memilih sampel dari populasi agar data yang diperoleh dapat mewakili keseluruhan populasi dengan baik. Desain sampling sangatlah penting karena pemilihan sampel akan memengaruhi validitas hasil penelitian.
Desain sampling dalam analisis data kategori dapat diklasifikasikan menjadi dua pendekatan utama, yaitu prospective sampling dan retrosprective sampling.
Prospective sampling adalah metode pengambilan sampel dimana peneliti mengikuti partisipan dari waktu sekarang ke masa depan untuk mengamati kejadian atau hasil tertentu. Prospective sampling biasanya digunakan dalam studi kohort prospektif. Beberapa jenis desain sampling dalam metode ini meliputi:
Dalam studi eksperimen, peneliti menentukan intervensi, yaitu peserta secara acak dibagi ke dalam kelompok perlakuan (menerima intervensi) dan kelompok kontrol (tidak menerima intervensi atau menerima plasebo). Teknik sampling yang digunakan meliputi:
Studi kohort adalah jenis penelitian dimana peneliti mengamati peserta tanpa intervensi langsung dimana peserta dikelompokkan berdasarkan paparan alami terhadap faktor risiko (misalnya, merokok atau tidak merokok. Jenis sampling yang umum dalam studi yaitu:
Retrospective sampling adalah metode pengambilan sampel dalam penelitian dimana peneliti melihat ke belakang untuk mengidentifikasi subjek berdasarkan outcome yang sudah terjadi, lalu menelusuri paparan atau faktor penyebabnya sebelumnya.
Case-Control Study adalah salah satu jenis studi observasional yang digunakan untuk menyelidiki hubungan antara faktor risiko dan suatu outcome (misalnya, penyakit). Berbeda dengan studi kohort, studi ini dimulai dari outcome dan bekerja mundur untuk menentukan paparan sebelumnya. Teknik sampling yang sering digunakan meliputi:
Dalam studi kohort retrospektif, data historis digunakan untuk mengelompokkan individu berdasarkan paparan kemudian peneliti menganalisis hasil yang terjadi. Teknik sampling yang sering digunakan meliputi :
Tabel kontingensi 2x2 adalah tabel yang digunakan untuk menyajikan data kategorik dari dua variabel yang masing-masing memiliki dua kategori. Tabel ini berguna untuk melihat hubungan atau asosiasi antara dua variabel, misalnya perhitungan risiko relatif (relative risk), perbedaan risiko (risk difference) dan odds ratio.
Struktur umum Tabel Kontingensi 2x2:
Kategori B1 | Kategori B2 | Total | |
---|---|---|---|
Kategori A1 | a | b | a + b |
Kategori A2 | c | d | c + d |
Total | a + c | b + d | n |
Peluang bersama adalah probabilitas kedua variabel terjadi secara bersamaan dalam suatu sel tabel kontingensi:
\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
Peluang marginal adalah probabilitas suatu variabel tanpa mempertimbangkan variabel lainnya.
\[ P(A_i) = \frac{n_{i.}}{n} \]
\[ P(B_j) = \frac{n_{.j}}{n} \]
Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain telah terjadi:
\[ P(B_j | A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i.}} \]
Ukuran asosiasi dalam analisis data kategorik digunakan untuk mengukur kekuatan hubungan antara dua variabel yang bersifat kategorik. Ukuran asosiasi ini penting karena digunakan untuk mengetahui apakah hubungan yang ada signifikan dan seberapa kuat hubungan tersebut. Berikut adalah beberapa ukuran asosiasi:
Risk Difference mengukur selisih risiko antara dua kelompok. Nilai RD menunjukkan perbedaan proporsi kejadian antara kelompok yang terpapar dan tidak terpapar.
Rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \] Dengan
Jika 𝑅𝐷>0, maka risiko kejadian lebih tinggi di Kelompok 1 dibandingkan Kelompok 2
Jika 𝑅𝐷<0, maka risiko kejadian lebih rendah di Kelompok 1 dibandingkan Kelompok 2
Jika 𝑅𝐷=0, maka tidak ada perbedaan risiko antara dua kelompok.
Relative Risk membandingkan kemungkinan terjadinya suatu kejadian pada kelompok yang terpapar terhadap kelompok yang tidak terpapar.
Rumus:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \] Dengan
Jika 𝑅𝑅>1, maka kejadian lebih sering terjadi di Kelompok 1 dibandingkan Kelompok 2.
Jika 𝑅𝑅<1, maka kejadian lebih jarang terjadi di Kelompok 1 dibandingkan Kelompok 2.
Jika 𝑅𝑅=1, maka tidak ada perbedaan risiko antara dua kelompok.
Odds Ratio digunakan untuk membandingkan peluang terjadinya suatu kejadian antara dua kelompok.
Rumus:
\[ OR = \frac{a \cdot d}{b \cdot c} \]
Dengan
Jika 𝑂𝑅 >1, maka peluang kejadian lebih besar di Kelompok 1 dibandingkan Kelompok 2.
Jika 𝑂𝑅 <1, maka peluang kejadian lebih kecil di Kelompok 1 dibandingkan Kelompok 2.
Jika 𝑂𝑅 =1, maka tidak ada perbedaan peluang kejadian antara dua kelompok.
Risk Difference \[ RD = \frac{a}{a + b} - \frac{c}{c + d} = \frac{1601}{164128} - \frac{510}{412878} = 0.0098 - 0.0012 = 0.0086 \]
Relative Risk \[ RR = \frac{a / (a + b)}{c / (c + d)} = \frac{1601/164128}{510/412878} = 0.0098 / 0.0012 = 8.17 \]
Odds Ratio \[ OR = \frac{a \cdot d}{b \cdot c} = \frac{1601 \cdot 412368}{162527 \cdot 510} = \frac{660201168}{82988770} = 7.96 \]
## [1] 0.1020622
Interpretasi : Nilai Risk Difference (RD) sebesar 0.1021 menunjukkan bahwa terdapat selisih risiko sebesar 10,21% antara dua kelompok yang dibandingkan (misalnya, antara lulusan Perguruan Tinggi dan SMA/SMK/MA) dalam hal menjadi angkatan kerja (AK). Dengan kata lain, kelompok yang berada di tingkat pendidikan lebih tinggi memiliki peluang menjadi angkatan kerja sekitar 10% lebih besar dibanding kelompok dengan pendidikan yang lebih rendah. Nilai RD yang positif ini mengindikasikan adanya keunggulan relatif pada kelompok pertama dalam kaitannya dengan status pekerjaan.
RD = 0.0086 → Perbedaan risiko kecelakaan fatal sebesar 0.86% lebih tinggi pada pengendara yang tidak pakai sabuk.
RR = 8.17 → Pengendara yang tidak memakai sabuk memiliki 8.17 kali risiko lebih besar dalam mengalami kecelakaan fatal.
OR = 7.96 → Peluang kecelakaan fatal 7.96 kali lebih besar pada pengendara yang tidak memakai sabuk.
Inferensi pada statistik merujuk pada proses penarikan kesimpulan tentang suatu populasi berdasarkan data dari sampel. Dalam konteks tabel kontingensi dua arah, inferensi digunakan untuk mengevaluasi dan memahami hubungan antara dua variabel kategorikal yang ditampilkan dalam bentuk tabel matriks.
Tabel kontingensi sendiri menyajikan distribusi frekuensi dari kombinasi kategori dua variabel. Tujuan utama dari inferensi pada tabel kontingensi adalah untuk menganalisis keterkaitan antarvariabel dengan melakukan proses estimasi dan pengujian hipotesis. Secara umum, proses inferensi dalam tabel kontingensi dua arah mencakup dua pendekatan utama yaitu Estimasi dan Pengujian
Estimasi berfungsi untuk memperkirakan parameter populasi berdasarkan sampel. Estimasi dibagi menjadi dua, yaitu:
Estimasi titik digunakan untuk menentukan satu nilai spesifik sebagai perkiraan terbaik dari parameter populasi \[ \hat{p} = \frac{x}{n} \] Dengan:
Estimasi interval berfungsi untuk memberikan rentang nilai yang diyakini mengandung parameter populasi dengan tingkat kepercayaan tertentu
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{ \hat{p}(1 - \hat{p}) } \] Dengan:
Uji ini digunakan untuk membandingkan proporsi kejadian antara dua kelompok dalam tabel kontingensi, terutama untuk menentukan apakah terdapat perbedaan yang signifikan dalam proporsi kejadian antara dua kelompok yang berbeda. Tabel kontingensi 2×2 memiliki struktur sebagai berikut:
Kejadian (+) | Tidak Kejadian (-) | Total (n) | |
---|---|---|---|
Group 1 | n11 | n12 | n1. |
Group 2 | n21 | n22 | n2. |
Total | n.1 | n.2 | n |
Untuk menguji hipotesis bahwa tidak ada perbedaan proporsi antara dua kelompok, kita menggunakan uji z dua proporsi, dengan hipotesis:
- Hipotesis Nol (H0) : tidak ada perbedaan proporsi antara dua kelompok
- Hipotesis Alternatif (H1) : terdapat perbedaan proporsi antara dua kelompok
Estimasi proporsi dalam masing - masing kelompok diberikan oleh :
\[ \hat{p}_1 = \frac{a}{a + b} \]
\[ \hat{p}_2 = \frac{c}{c + d} \]
Estimasi proporsi gabungan
\[ \hat{p} = \frac{x_1 + x_2}{n_1 + n_2} \]
Statistik uji untuk uji proporsi dua sampel :
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
Setelah nilai Z diketahui, kita bisa melihat keputusan apakah tolak H0 atau terima H0 dengan cara apabila |Z| lebih besar dari nilai kritis tertentu untuk tingkat signifikansi tertentu, maka H0 ditolak.
##
## 2-sample test for equality of proportions with continuity correction
##
## data: x out of n
## X-squared = 62306, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.100859 0.102373
## sample estimates:
## prop 1 prop 2
## 0.7900112 0.6883952
Interpretasi : Jika kita menggunakan taraf signifikansi sebesar 5%, kita menolak H0 karena nilai |Z| yaitu 264.49 > 1.96, yang berarti bahwa ada perbedaan proporsi yang signifikan antara kelompok lulusan Perguruan Tinggi dan SMA/SMK/MA dalam hal status angkatan kerja.
Uji asosiasi dalam tabel kontingensi 2×2 bertujuan untuk mengukur hubungan antara dua variabel kategori. Tiga ukuran utama dalam uji asosiasi adalah: 1. Risk Diference (RD) – Mengukur selisih risiko absolut antara dua kelompok. 2. Relative Risk (RR) – Mengukur perbandingan risiko antara dua kelompok. 3. Odds Ratio (OR) – Mengukur perbandingan odds antara dua kelompok. Hipotesis Uji dalam Tabel Kontingensi 2 × 2 Untuk setiap uji asosiasi, hipotesis yang diuji adalah: • Hipotesis Nol (H0): Tidak ada asosiasi antara dua variabel. • Hipotesis Alternatif (H1): Terdapat asosiasi antara dua variabel.
Risk Difference mengukur perbedaan absolut dalam probabilitas kejadian antara dua kelompok:
\[ RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right) \]
Standard Error untuk RD:
\[ SE(RD) = \sqrt{ \frac{\hat{p}_1 (1 - \hat{p}_1)}{n_{1.}} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_{2.}} } \]
Statistik Uji Z:
\[ Z_{RD} = \frac{RD}{SE(RD)} \]
Relative Risk membandingkan kemungkinan kejadian antara dua kelompok:
\[ RR = \frac{n_{11} / n_{1.}}{n_{21} / n_{2.}} \]
Standard Error untuk log(RR):
\[ SE(\ln RR) = \sqrt{ \frac{1}{n_{11}} - \frac{1}{n_{1.}} + \frac{1}{n_{21}} - \frac{1}{n_{2.}} } \]
Statistik Uji Z:
\[ Z_{RR} = \frac{\ln RR}{SE(\ln RR)} \]
Odds Ratio (OR)
Odds Ratio membandingkan odds kejadian antara dua kelompok:
\[ OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]
Standard Error untuk log(OR):
\[ SE(\ln OR) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } \]
Statistik Uji Z:
\[ Z_{OR} = \frac{\ln OR}{SE(\ln OR)} \] Perhitungan menggunakan R
## $Risk_Difference
## [1] 0.1020622
##
## $SE_RD
## [1] 0.0003858884
##
## $Z_RD
## [1] 264.4863
##
## $Relative_Risk
## [1] 1.148261
##
## $SE_Ln_RR
## [1] 0.0005162791
##
## $Z_RR
## [1] 267.779
##
## $Odds_Ratio
## [1] 1.707546
##
## $SE_Ln_OR
## [1] 0.002147789
##
## $Z_OR
## [1] 249.12
Interpretasi: Berdasarkan hasil perhitungan, dapat disimpulkan bahwa terdapat hubungan yang signifikan antara jenjang pendidikan dan status angkatan kerja, khususnya saat membandingkan lulusan Perguruan Tinggi dengan lulusan SMA/SMK/MA:
Dengan demikian, perbedaan tingkat keterlibatan dalam angkatan kerja antara lulusan Perguruan Tinggi dan SMA/SMK/MA tidak hanya terlihat secara praktis, tetapi juga kuat secara statistik.
Uji independensi digunakan untuk menentukan apakah ada hubungan statistik antara dua variabel kategorikal.
Uji Chi-Square digunakan untuk menguji apakah ada hubungan antara dua variabel kategorikal.
Rumus Chi-Square
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
di mana:
\[ E_{ij} = \frac{R_i \times C_j}{N} \] dengan:
Perhitungan menggunakan R
## AK Bukan_AK
## >= SD/MI 638740 505955
## SMP/MTs 724330 807671
## SMA/SMK/MA 2664972 1209660
## Perguruan Tinggi 1399198 372387
##
## Pearson's Chi-squared test
##
## data: data_chisq
## X-squared = 431600, df = 3, p-value < 2.2e-16
Interpretasi: Dengan taraf signifikansi 5%, didapatkan p-value < 0.05, maka kita menolak H0 (hipotesis nol). Artinya, terdapat hubungan yang signifikan secara statistik antara tingkat pendidikan (Perguruan Tinggi vs. SMA/SMK/MA) dan status angkatan kerja, di mana proporsi lulusan Perguruan Tinggi yang bekerja (0.7900) lebih tinggi secara signifikan dibandingkan lulusan SMA/SMK/MA (0.6884).
Partisi Chi-Square Partisi Chi-Square digunakan untuk mengidentifikasi kategori mana dalam tabel kontingensi yang bertanggung jawab atas hubungan yang signifikan. Jika uji Chi-Square pada tabel kontingensi I×Jsignifikan, maka partisi Chi-Square memungkinkan kita untuk menguraikan efek hubungan dalam subkelompok yang lebih kecil.
Perhitungan Dengan R:
## AK Bukan AK
## Pendidikan Rendah 1363070 1313626
## Pendidikan Tinggi 4064170 1582047
## $Chi_Square
## X-squared
## 354884.7
##
## $P_Value
## [1] 0
##
## $Decision
## [1] "Tolak H0: Ada hubungan"
Interpretasi: Karena nilai \(\chi^2 = 354{,}884.7\) sangat besar dan melebihi nilai kritis untuk \(df = 3\) pada taraf signifikansi 0.05, serta p-value = 0 (lebih kecil dari 0.05), maka kita menolak \(H_0\). Artinya, terdapat hubungan yang signifikan secara statistik antara tingkat pendidikan dan status angkatan kerja.
Uji Likelihood Ratio (G²) adalah alternatif dari uji chi-square yang digunakan untuk menguji hipotesis independensi dalam tabel kontingensi \(I \times J\). Statistik uji ini diberikan oleh:
\[ G^2 = 2 \sum_{i} \sum_{j} n_{ij} \ln \left( \frac{n_{ij}}{\hat{\mu}_{ij}} \right) \]
Dimana:
- \(n_{ij}\) adalah frekuensi observasi dalam tabel kontingensi.
\(\hat{\mu}_{ij} = n \cdot p_i \cdot p_j\) adalah frekuensi yang diharapkan.
\(p_i\) adalah proporsi untuk baris \(i\).
- \(p_j\) adalah proporsi untuk kolom \(j\).
Perhitungan Dengan R
## $G2
## [1] 431832.5
##
## $df
## [1] 3
##
## $Critical_Value
## [1] 7.814728
##
## $Decision
## [1] "Tolak H0: Ada hubungan"
Interpretasi: Karena \(G^2 = 431{,}832.5 > 7.814728\), maka kita menolak hipotesis nol. Artinya, terdapat hubungan yang signifikan secara statistik antara tingkat pendidikan dan status angkatan kerja.
# Pastikan package-nya sudah terpasang
library(DescTools)
# Data dari data_ak
# Baris:
# 1 = SMA
# 2 = PT
# Kolom:
# 1 = AK
# 2 = Bukan AK
# Layer (strata): SD dan SMP (asumsi)
stratum1 <- matrix(c(data_ak$AK[3], data_ak$Bukan_AK[3], data_ak$AK[4], data_ak$Bukan_AK[4]), nrow=2, byrow=TRUE)
# Misal layer 2 bisa kita duplikat contoh aja (jika kamu hanya punya satu strata bisa buat dummy strata untuk contoh)
stratum2 <- matrix(c(3874632, 1800000, 1771585, 470000), nrow=2, byrow=TRUE)
# Gabungkan jadi array
pendidikan_array <- array(c(stratum1, stratum2),
dim = c(2, 2, 2),
dimnames = list(
Pendidikan = c("SMA", "PT"),
Status = c("AK", "Bukan AK"),
Strata = c("Strata 1", "Strata 2")
)
)
# Tampilkan arraynya
pendidikan_array
## , , Strata = Strata 1
##
## Status
## Pendidikan AK Bukan AK
## SMA 2664972 1209660
## PT 1399198 372387
##
## , , Strata = Strata 2
##
## Status
## Pendidikan AK Bukan AK
## SMA 3874632 1800000
## PT 1771585 470000
# Jalankan uji
breslow_result <- BreslowDayTest(pendidikan_array)
# Tampilkan hasil
print(breslow_result)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: pendidikan_array
## X-squared = 85.747, df = 1, p-value < 2.2e-16
Interpretasi: Hasil Uji Breslow-Day pada array
pendidikan_array
menunjukkan nilai X-squared
sebesar 85.747 dengan derajat bebas (df) = 1
dan p-value < 2.2e-16. Karena p-value jauh lebih
kecil dari 0.05, maka kita menolak hipotesis nol (H₀)
yang menyatakan bahwa odds ratio homogen di seluruh
strata. Artinya, terdapat perbedaan yang signifikan pada odds
ratio antara strata 1 dan strata 2, atau dengan kata lain,
hubungan antara tingkat pendidikan dan status AK tidak
konsisten di antara kedua strata tersebut. Ini mengindikasikan
adanya interaksi antara faktor pendidikan dan strata
terhadap peluang bekerja di sektor AK.
Bab ini membahas analisis tabel kontingensi tiga arah, mencakup tabel parsial dan marginal, ukuran asosiasi, uji independensi bersyarat, dan Simpson’s Paradox. Fokus utamanya adalah menganalisis hubungan antara dua variabel kategori dengan mempertimbangkan pengaruh variabel ketiga (kovariat). Tabel ini penting dalam banyak konteks, seperti epidemiologi, sosial, atau hukum.
Tabel tiga arah dapat dikembangkan menjadi:
Tabel Parsial: Mengisolasi efek kovariat (Z), untuk melihat hubungan bersyarat antara X dan Y.
Tabel Marginal: Mengabaikan Z, memberikan gambaran umum namun bisa menyesatkan (misalnya, dalam Simpson’s Paradox).
Penggunaan tabel marginal cocok untuk melihat asosiasi secara keseluruhan, tetapi bisa menyembunyikan informasi penting. Oleh karena itu, analisis tabel parsial sering lebih disarankan untuk hasil yang akurat dalam penelitian ilmiah. Jadikan Tahun untuk strata (dibagi jadi 3 strata)
Tabel parsial adalah tabel yang mengelompokkan variabel \(X\) dan \(Y\) berdasarkan setiap level dari variabel
ketiga \(Z\),
sedangkan tabel marginal adalah tabel yang
mengabaikan \(Z\),
dengan menjumlahkan data dari semua level \(Z\).
Struktur Tabel Kontingensi Tiga Arah
Tabel kontingensi tiga arah dapat digambarkan secara umum sebagai berikut:
Z = 1 | Z = 2 | … | Z = k | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Y = 1 | Y = 2 | … | Y = J | Total | Y = 1 | Y = 2 | … | Y = J | Total | … | Y = 1 | … | Y = J |
X = 1 | \(n_{111}\) | \(n_{121}\) | … | \(n_{1+1}\) | \(n_{112}\) | \(n_{122}\) | … | \(n_{1+2}\) | … | \(n_{11k}\) | … | \(n_{1+k}\) | |
X = 2 | \(n_{211}\) | \(n_{221}\) | … | \(n_{2+1}\) | \(n_{212}\) | \(n_{222}\) | … | \(n_{2+2}\) | … | \(n_{21k}\) | … | \(n_{2+k}\) | |
… | … | … | … | … | … | … | … | … | … | … | … | … | |
X = I | \(n_{I11}\) | \(n_{I21}\) | … | \(n_{I+1}\) | \(n_{I12}\) | \(n_{I22}\) | … | \(n_{I+2}\) | … | \(n_{I1k}\) | … | \(n_{I+k}\) | |
Total | \(n_{+11}\) | \(n_{+21}\) | … | \(n_{++1}\) | \(n_{+12}\) | \(n_{+22}\) | … | \(n_{++2}\) | … | \(n_{+1k}\) | … | \(n_{++k}\) |
Perhitungan Menggunakan R
## Tahun Pendidikan Total AK Bukan_AK
## 1 2021 SMA/SMK/MA 3838202 2569676 1268526
## 2 2021 Perguruan Tinggi 1403371 1060106 343265
## 3 2022 SMA/SMK/MA 3980426 2670070 1310356
## 4 2022 Perguruan Tinggi 1596304 1211754 384550
## 5 2023 SMA/SMK/MA 3874632 2664972 1209660
## 6 2023 Perguruan Tinggi 1771585 1399198 372387
Interpretasi: Berdasarkan data yang ditampilkan dari tahun 2021 hingga 2023, terlihat bahwa jumlah total lulusan dan jumlah yang termasuk dalam kategori Angkatan Kerja (AK) meningkat untuk kedua jenjang pendidikan, yakni SMA/SMK/MA dan Perguruan Tinggi. Namun, persentase AK dari total lulusan cenderung lebih tinggi pada lulusan Perguruan Tinggi dibandingkan lulusan SMA/SMK/MA setiap tahunnya. Misalnya, pada tahun 2023, 78,98% lulusan Perguruan Tinggi masuk kategori AK, sedangkan untuk lulusan SMA/SMK/MA hanya 68,78%. Hal ini menunjukkan bahwa semakin tinggi jenjang pendidikan terakhir seseorang, semakin besar kemungkinan mereka tergolong sebagai Angkatan Kerja. Selain itu, jumlah Bukan AK cenderung lebih tinggi pada lulusan SMA/SMK/MA, yang bisa mengindikasikan bahwa lulusan jenjang ini memiliki hambatan lebih besar dalam masuk ke pasar kerja dibanding lulusan Perguruan Tinggi.
Tabel Parsial dan Marginal
## Status
## Pendidikan AK Bukan AK
## PT 1060106 2569676
## SMA 343265 1268526
Interpretasi: Berdasarkan tabel tersebut, terlihat bahwa lulusan Perguruan Tinggi (PT) yang termasuk dalam kategori Angkatan Kerja (AK) berjumlah 1.060.106 orang, jauh lebih tinggi dibanding lulusan SMA yang hanya 343.265 orang. Sebaliknya, jumlah lulusan SMA yang termasuk dalam kategori Bukan AK (1.268.526 orang) jauh lebih besar dibanding lulusan PT yang bukan AK (256.9676 orang). Hal ini menunjukkan bahwa lulusan Perguruan Tinggi memiliki kemungkinan yang lebih besar untuk masuk ke dalam kategori Angkatan Kerja dibanding lulusan SMA. Secara tidak langsung, hal ini juga mengindikasikan bahwa semakin tinggi jenjang pendidikan, semakin tinggi pula keterlibatan seseorang dalam dunia kerja atau aktivitas produktif lainnya.
Tabel Frekuensi Marginal
## $Marginal_Pendidikan
## PT SMA
## 11575776 4888744
##
## $Marginal_Tahun
## 2021 2022 2023
## 5241573 5576730 5646217
Interpretasi: Berdasarkan nilai marginal pada tabel tersebut, dapat dilihat bahwa secara keseluruhan jumlah individu dengan latar belakang pendidikan Perguruan Tinggi (PT) jauh lebih banyak (11.575.776 orang) dibandingkan dengan lulusan SMA/SMK/MA (4.888.744 orang) selama periode waktu yang diamati. Jika ditinjau berdasarkan tahun, jumlah total data juga mengalami peningkatan dari tahun ke tahun: sebanyak 5.241.573 individu pada tahun 2021, meningkat menjadi 5.576.730 pada tahun 2022, dan kembali naik menjadi 5.646.217 pada tahun 2023. Ini menunjukkan adanya tren kenaikan jumlah individu baik dari sisi waktu maupun dari segi jenjang pendidikan, dengan dominasi jumlah dari kelompok lulusan Perguruan Tinggi.
Peluang Bersama
## Status
## Pendidikan AK Bukan AK
## PT 0.06438730 0.15607354
## SMA 0.02084877 0.07704604
Interpretasi: Tabel tersebut menunjukkan distribusi proporsi gabungan (joint probability) antara tingkat pendidikan dan status pekerjaan (AK dan Bukan AK). Dari hasil ini, terlihat bahwa proporsi tertinggi berasal dari kelompok Perguruan Tinggi yang Bukan AK (0.156), disusul oleh PT yang AK (0.064), SMA yang Bukan AK (0.077), dan terakhir SMA yang AK (0.021). Artinya, meskipun lulusan PT lebih besar kemungkinan menjadi angkatan kerja dibandingkan SMA, jumlah lulusan PT yang belum bekerja atau tidak termasuk AK juga cukup besar secara proporsi. Ini bisa mengindikasikan bahwa meskipun jenjang pendidikan lebih tinggi cenderung meningkatkan peluang masuk angkatan kerja, masih terdapat porsi signifikan lulusan PT yang belum bekerja atau belum termasuk AK.
Tabel Peluang Bersama
## Tahun 2021 2022 2023
## Pendidikan Status
## PT AK 0.06438730 0.07359789 0.08498262
## Bukan AK 0.15607354 0.16217114 0.16186151
## SMA AK 0.02084877 0.02335628 0.02261754
## Bukan AK 0.07704604 0.07958665 0.07347071
Interpretasi: Tabel tersebut menunjukkan peluang gabungan antara variabel Pendidikan, Status (AK atau Bukan AK), dan Tahun (2021–2023). Dari data ini terlihat bahwa proporsi lulusan Perguruan Tinggi yang termasuk AK meningkat tiap tahun, dari 0.064 pada 2021 menjadi 0.085 pada 2023, yang menunjukkan tren positif dalam partisipasi angkatan kerja di kelompok ini. Namun, proporsi Perguruan Tinggi yang Bukan AK masih tetap tinggi, meskipun relatif stabil, sekitar 0.156–0.162. Sementara itu, lulusan SMA/SMK/MA yang masuk AK juga menunjukkan kenaikan kecil pada 2022 (0.023), namun menurun kembali pada 2023 (0.022). Adapun proporsi Bukan AK dari lulusan SMA menurun dari 0.077 di 2021 menjadi 0.073 di 2023, meskipun penurunannya kecil. Secara keseluruhan, data ini mengindikasikan bahwa peningkatan partisipasi AK cenderung lebih tajam pada lulusan PT dibandingkan SMA, namun jumlah Bukan AK di kedua jenjang masih signifikan.
Peluang Marginal
## $P_AK
## [1] 0.6521
##
## $P_Bukan_AK
## [1] 0.3479
Interpretasi: Nilai probabilitas yang ditampilkan menunjukkan bahwa secara keseluruhan, peluang seseorang termasuk dalam kategori Angkatan Kerja (AK) adalah sebesar 65,21%, sedangkan peluang untuk tidak termasuk dalam Angkatan Kerja (Bukan AK) adalah sebesar 34,79%. Ini berarti mayoritas individu dalam populasi yang diamati tergolong sebagai angkatan kerja. Selisih yang cukup besar antara keduanya juga mencerminkan bahwa partisipasi kerja cukup tinggi dalam data tersebut, namun masih ada sepertiga populasi yang belum masuk dalam kategori angkatan kerja, yang bisa jadi mencakup pelajar, ibu rumah tangga, lansia, atau pengangguran.
Tabel Peluang Marginal
## $Marginal_Pendidikan
## PT SMA
## 0.7031 0.2969
##
## $Marginal_Tahun
## 2021 2022 2023
## 0.3184 0.3387 0.3429
Interpretasi: Berdasarkan hasil marginal probabilitas yang ditampilkan, dapat disimpulkan bahwa mayoritas populasi dalam data berasal dari jenjang Pendidikan Tinggi (PT) dengan proporsi sebesar 70,31%, sementara sisanya 29,69% berasal dari jenjang SMA/SMK/MA. Jika dilihat dari aspek waktu, distribusi tahun relatif seimbang, dengan 34,29% data berasal dari tahun 2023, disusul 33,87% dari tahun 2022, dan 31,84% dari tahun 2021. Ini menunjukkan tren yang stabil dan cukup merata dalam distribusi data lintas waktu, namun secara keseluruhan, pendidikan tinggi mendominasi dalam populasi yang diamati.
Peluang Bersyarat
contoh P(Status = AK l Pendidikan = PT)
## [1] 0.3171328
Interpretasi: Nilai probabilitas bersyarat P(AK | PT) = 0.3171 menunjukkan bahwa di antara seluruh individu yang berasal dari jenjang Pendidikan Tinggi (PT), sekitar 31,71% di antaranya berada dalam status Angkatan Kerja (AK). Ini mengindikasikan bahwa meskipun PT merupakan kelompok pendidikan dengan proporsi terbesar, tidak semua lulusannya langsung masuk ke dalam angkatan kerja, dan masih ada sebagian besar yang berada di luar kategori AK (misalnya belum bekerja, melanjutkan studi, atau tidak aktif bekerja).
P(Tahun = 2023 l AK)
## [1] 0.3713034
Interpretasi: Nilai P(2023 | AK) = 0.3713 berarti bahwa sekitar 37,13% dari seluruh individu yang termasuk dalam Angkatan Kerja (AK) berasal dari tahun 2023. Ini menunjukkan bahwa proporsi angkatan kerja terbanyak berasal dari tahun terakhir dalam data, yang bisa mengindikasikan peningkatan partisipasi angkatan kerja atau jumlah lulusan yang lebih besar pada tahun tersebut dibandingkan tahun-tahun sebelumnya.
Interpretasi: Berdasarkan hasil perhitungan ukuran asosiasi, diperoleh Risk Difference (RD) sebesar 0.102, yang menunjukkan bahwa selisih proporsi individu yang bekerja (AK) antara kelompok pendidikan tinggi dan pendidikan menengah adalah 10,2%. Artinya, individu dengan pendidikan tinggi memiliki peluang lebih tinggi sebesar 10,2% untuk masuk dalam angkatan kerja dibandingkan mereka yang hanya berpendidikan menengah. Relative Risk (RR) sebesar 1.1483 mengindikasikan bahwa peluang individu dari pendidikan tinggi untuk bekerja 1,15 kali lebih besar dibandingkan yang berpendidikan menengah. Sedangkan Odds Ratio (OR) sebesar 1.7055 menunjukkan bahwa perbandingan odds bekerja antara kelompok pendidikan tinggi dan menengah adalah 1,71 banding 1, sehingga dapat disimpulkan bahwa pendidikan tinggi secara signifikan meningkatkan peluang individu untuk menjadi bagian dari angkatan kerja.
Struktur Tabel Kontingensi 3D (AK × Pendidikan × Tahun)
# Asumsikan data_ak sudah dibaca dan diolah seperti ini:
# (JANGAN JALANKAN KEMBALI JIKA SUDAH ADA)
# data_ak <- read.csv("D:/SEMESTER 4/ADK/Data Pendidikan Terakhir.csv", skip = 2)
# data_ak <- data_ak[1:4, ]
# colnames(data_ak)[c(1, 4, 7)] <- c("Pendidikan", "Total_2023", "Persen_AK_2023")
# data_ak$Total_2023 <- as.numeric(as.character(data_ak$Total_2023))
# data_ak$Persen_AK_2023 <- as.numeric(as.character(data_ak$Persen_AK_2023))
# data_ak$AK <- round(data_ak$Total_2023 * data_ak$Persen_AK_2023 / 100)
# data_ak$Bukan_AK <- data_ak$Total_2023 - data_ak$AK
# Buat array 3D: [Status AK, Pendidikan, Tahun]
data_array <- array(
data = c(data_ak$AK, data_ak$Bukan_AK),
dim = c(2, 4, 1),
dimnames = list(
Status = c("AK", "Bukan AK"),
Pendidikan = data_ak$Pendidikan,
Tahun = "2023"
)
)
data_array
## , , Tahun = 2023
##
## Pendidikan
## Status >= SD/MI SMP/MTs SMA/SMK/MA Perguruan Tinggi
## AK 638740 2664972 505955 1209660
## Bukan AK 724330 1399198 807671 372387
# Tabel marginal (menjumlahkan sepanjang dimensi tahun)
tabel_marginal <- apply(data_array, c(1, 2), sum)
# Tampilkan tabel dalam bentuk data frame
tabel_marginal_df <- as.data.frame(t(tabel_marginal))
tabel_marginal_df
# PT = baris ke-4, SMA = baris ke-3
n11 <- data_ak$AK[4] # PT - AK
n12 <- data_ak$Bukan_AK[4] # PT - Bukan AK
n21 <- data_ak$AK[3] # SMA - AK
n22 <- data_ak$Bukan_AK[3] # SMA - Bukan AK
# Proporsi
p1 <- n11 / (n11 + n12)
p2 <- n21 / (n21 + n22)
# Ukuran asosiasi
RD <- p1 - p2
RR <- p1 / p2
OR <- (n11 / n12) / (n21 / n22)
# Buat list hasil
hasil <- list(
Risk_Difference = round(RD, 4),
Relative_Risk = round(RR, 4),
Odds_Ratio = round(OR, 4)
)
# Tampilkan
hasil
## $Risk_Difference
## [1] 0.102
##
## $Relative_Risk
## [1] 1.1483
##
## $Odds_Ratio
## [1] 1.7055
Interpretasi: Berdasarkan data pendidikan terakhir tahun 2023 dan hasil pengukuran asosiasi, terlihat bahwa individu dengan pendidikan terakhir perguruan tinggi memiliki peluang lebih tinggi untuk masuk kategori angkatan kerja (AK) dibandingkan dengan mereka yang hanya lulusan SMA/SMK/MA. Nilai Risk Difference (RD) sebesar 0.102 menunjukkan bahwa selisih proporsi AK antara kelompok pendidikan tinggi dan SMA/SMK adalah 10,2%. Relative Risk (RR) sebesar 1.1483 menunjukkan bahwa lulusan perguruan tinggi memiliki risiko 14,83% lebih besar untuk masuk ke dalam AK dibandingkan dengan lulusan SMA/SMK. Sementara itu, Odds Ratio (OR) sebesar 1.7055 memperlihatkan bahwa odds (kemungkinan relatif) menjadi AK bagi lulusan perguruan tinggi sekitar 1,7 kali lipat lebih besar dibandingkan lulusan SMA/SMK. Hasil ini menunjukkan adanya asosiasi positif antara tingkat pendidikan dan partisipasi dalam angkatan kerja, di mana semakin tinggi pendidikan, semakin besar kemungkinan seseorang tergolong ke dalam AK.
data3_cmh <- array(
data = c(
# 2021
1060106, 2569676,
343265, 1268526,
# 2022
1211754, 2670070,
384550, 1310356,
# 2023
1399198, 2664972,
372387, 1209660
),
dim = c(2, 2, 3),
dimnames = list(
Pendidikan = c("PT", "SMA"),
Status = c("AK", "Bukan AK"),
Tahun = c("2021", "2022", "2023")
)
)
for (tahun in dimnames(data3_cmh)$Tahun) {
a <- data3_cmh["PT", "AK", tahun]
b <- data3_cmh["PT", "Bukan AK", tahun]
c <- data3_cmh["SMA", "AK", tahun]
d <- data3_cmh["SMA", "Bukan AK", tahun]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD <- p1 - p2
RR <- p1 / p2
OR <- (a * d) / (b * c)
cat(paste0("\nTahun ", tahun, "\n"))
cat("Risk Difference (RD): ", round(RD, 4), "\n")
cat("Relative Risk (RR): ", round(RR, 4), "\n")
cat("Odds Ratio (OR): ", round(OR, 4), "\n")
}
##
## Tahun 2021
## Risk Difference (RD): 0.0859
## Relative Risk (RR): 1.1283
## Odds Ratio (OR): 1.5245
##
## Tahun 2022
## Risk Difference (RD): 0.0883
## Relative Risk (RR): 1.1316
## Odds Ratio (OR): 1.5464
##
## Tahun 2023
## Risk Difference (RD): 0.102
## Relative Risk (RR): 1.1483
## Odds Ratio (OR): 1.7055
Interpretasi: Pada tahun 2023, Risk Difference (RD) menunjukkan bahwa proporsi angkatan kerja lulusan PT lebih tinggi sekitar 10.2% dibandingkan lulusan SMA. Relative Risk (RR) sebesar 1.1483 berarti lulusan PT memiliki peluang 14.8% lebih besar untuk masuk angkatan kerja dibanding lulusan SMA. Odds Ratio (OR) sebesar 1.7055 menunjukkan odds lulusan PT masuk angkatan kerja 1.7 kali lebih besar dari lulusan SMA.
cmh_result <- mantelhaen.test(data3_cmh, correct = FALSE)
cmh_result
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data3_cmh
## Mantel-Haenszel X-squared = 138847, df = 1, p-value < 2.2e-16
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.588484 1.596316
## sample estimates:
## common odds ratio
## 1.592395
Interpretasi: Karena p-value dari uji Cochran-Mantel-Haenszel (CMH) < 0.05, maka kita menolak H₀, yang berarti ada hubungan signifikan antara pendidikan dan status angkatan kerja setelah mengontrol tahun. Artinya, meskipun waktu (tahun) diperhitungkan, tingkat pendidikan tetap berpengaruh signifikan terhadap status AK seseorang.
Generalized Linear Model (GLM) merupakan perluasan dari model regresi linear klasik. GLM memungkinkan digunakan untuk memodelkan data dimana variabel respons tidak berdistribusi normal dan atau hubungan antara variabel prediktor dengan rata-rata dari variabel respons tidak linear. GLM terdiri dari tiga komponen utama:
Distribusi termasuk dalam exponential family jika dapat ditulis dalam bentuk:
\[ f(y; \theta, \phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Contoh Distribusi yang Termasuk Exponential Family:
Contoh Pembuktian: Distribusi Binomial
Fungsi probabilitas distribusi binomial adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
Tuliskan ulang dalam bentuk exponential family:
\[ P(Y = y) = \exp \left\{ \log \binom{n}{y} + y \log \left( \frac{\pi}{1 - \pi} \right) + n \log (1 - \pi) \right\} \]
Dengan substitusi:
Kesimpulan : Dengan bentuk tersebut, maka distribusi binomial termasuk dalam keluarga exponential family.
Regresi Logistik memiliki kemiripan dengan regresi linear, yaitu menggabungkan nilai-nilai input secara linear dengan bobot (koefisien) untuk menghasilkan sebuah prediksi. Bedanya, regresi logistik membatasi hasil prediksinya agar berada dalam bentuk nilai biner 0 atau 1 dengan bantuan fungsi sigmoid sebagai fungsi aktivasi. Fungsi ini mengubah output menjadi nilai antara 0 sampai 1 dan membentuk kurva seperti huruf S.
Model ini digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen dan mengklasifikasikan data ke dalam kelas-kelas yang bersifat diskrit. Artinya, regresi logistik cocok digunakan untuk masalah klasifikasi, terutama yang hanya memiliki dua kemungkinan kategori (dikenal dengan klasifikasi biner).
Contohnya, angka 0 bisa merepresentasikan gagal, sedangkan angka 1 merepresentasikan sukses.
Beberapa contoh penerapan regresi logistik dalam klasifikasi biner antara lain:
-Memprediksi kelulusan siswa: Model regresi logistik dapat digunakan untuk memperkirakan apakah seorang siswa akan lulus atau tidak berdasarkan variabel-variabel seperti kehadiran, nilai tugas, partisipasi kelas, dan nilai ujian.
-Deteksi penipuan transaksi keuangan: Dalam dunia perbankan dan keuangan, regresi logistik dapat membantu mendeteksi apakah sebuah transaksi tergolong normal atau mencurigakan (fraud) dengan menganalisis pola transaksi seperti frekuensi, jumlah uang, lokasi transaksi, dan waktu.
-Memprediksi hasil diagnosis penyakit: Dalam dunia medis, model ini bisa digunakan untuk menentukan apakah pasien menderita suatu penyakit (misalnya diabetes atau kanker) berdasarkan variabel seperti usia, tekanan darah, kadar gula, dan riwayat keluarga.
Keunggulan Utama Regresi Logistik yaitu mudah diterapkan dalam Machine Learning. Regresi logistik sangat cocok digunakan dalam Machine Learning karena proses pelatihan (training) dan pengujian (testing) nya cukup sederhana. Model ini belajar dari pola-pola dalam data input dan menghubungkannya dengan output (label). Karena tidak membutuhkan komputasi tinggi, regresi logistik tergolong mudah untuk diimplementasikan, dipahami, dan dilatih dibanding metode lain dalam Machine Learning.
Cocok untuk data yang bisa dipisahkan secara linear Jika dua kelas data bisa dipisahkan dengan garis lurus (linear), maka regresi logistik akan sangat efektif dalam mengklasifikasikan data tersebut ke dalam dua kelompok berbeda. Dalam konteks ini, variabel target (y) hanya memiliki dua nilai, sehingga model bisa menentukan batas yang jelas di antara keduanya.
Memberikan wawasan yang bermakna Regresi logistik juga bisa menunjukkan seberapa besar pengaruh suatu variabel terhadap hasil akhir, melalui koefisiennya. Selain itu, model ini juga menunjukkan apakah hubungan antar variabel bersifat positif atau negatif.
Persamaan dan Asumsi dalam Regresi Logistik Model ini menggunakan fungsi sigmoid, yaitu fungsi matematika berbentuk kurva S yang mengubah nilai output ke dalam rentang antara 0 dan 1. Jika hasil dari fungsi sigmoid (yang merepresentasikan probabilitas) lebih tinggi dari ambang batas tertentu, maka model akan mengklasifikasikan data sebagai bagian dari suatu kelas. Sebaliknya, jika di bawah ambang tersebut, maka data dianggap tidak termasuk dalam kelas itu.
Selain itu, jika keluaran dari fungsi sigmoid (yaitu probabilitas yang diperkirakan) lebih besar dari ambang batas yang telah ditentukan dalam grafik, maka model akan memprediksi bahwa suatu observasi termasuk dalam kelas tertentu. Sebaliknya, jika nilai probabilitas tersebut lebih kecil dari ambang batas, model akan memprediksi bahwa observasi tersebut tidak termasuk ke dalam kelas tersebut
Sebagai contoh:
-Jika hasil fungsi sigmoid lebih dari 0,5, maka output dianggap sebagai 1 (kelas positif). -Jika hasilnya kurang dari 0,5, maka output diklasifikasikan sebagai 0 (kelas negatif). -Jika grafik menuju ke arah negatif secara ekstrem, maka nilai prediksi y akan menjadi 0,dan sebaliknya.
Fungsi sigmoid digunakan dalam regresi logistik untuk mengubah nilai prediksi menjadi probabilitas. Rumus dari fungsi sigmoid yaitu: \[ f(x) = \frac{1}{1 + e^{-x}} \] Persiapan Data
# Data Pendidikan dan Status AK
pendidikan <- c("SD/MI", "SMP/MTs", "SMA/SMK/MA", "Perguruan Tinggi")
total <- c(1144695, 1532001, 3874632, 1771585)
persen_ak <- c(55.76, 46.86, 66.95, 75.54)
# Hitung AK dan Bukan AK
data_ak <- data.frame(
Pendidikan = pendidikan,
Total = total,
AK = round(total * persen_ak / 100)
)
data_ak$Bukan_AK <- data_ak$Total - data_ak$AK
# Konversi jadi data biner (per observasi)
data_long <- data.frame(
Pendidikan = rep(data_ak$Pendidikan, times = data_ak$Total),
Status = unlist(mapply(function(ak, bukan) c(rep(1, ak), rep(0, bukan)),
data_ak$AK, data_ak$Bukan_AK))
)
Kurva sigmoid dalam regresi logistik menunjukkan hubungan non-linear antaravariabel prediktor dan probabilitas output. Pendekatan ini efektif untuk klasifikasi biner seperti deteksi penyakit, kelulusan siswa, dan prediksi ya/tidak.
Fungsi Link (Logit): Fungsi link logit dapat dinyatakan dalam bentuk berikut:
\[ g(\mu) = \log \left( \frac{\mu}{1 - \mu} \right) \]
Model Regresi Logistik:
\[ \log \left( \frac{\mu}{1 - \mu} \right) = X\beta \]
Fungsi Inverse Link:
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Estimasi Parameter
Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE).
Log-likelihood fungsi untuk regresi logistik:
\[ l(\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\beta)}{1 + \exp(X\beta)} \]
# Model GLM binomial (logistik)
model_logistik <- glm(Status ~ Pendidikan, data = data_long, family = binomial())
summary(model_logistik)
##
## Call:
## glm(formula = Status ~ Pendidikan, family = binomial(), data = data_long)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.127622 0.001748 645.2 <2e-16 ***
## PendidikanSD/MI -0.896195 0.002568 -348.9 <2e-16 ***
## PendidikanSMA/SMK/MA -0.421698 0.002055 -205.2 <2e-16 ***
## PendidikanSMP/MTs -1.253387 0.002382 -526.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 10919845 on 8322912 degrees of freedom
## Residual deviance: 10577728 on 8322909 degrees of freedom
## AIC: 10577736
##
## Number of Fisher Scoring iterations: 4
# Transformasi ke Odds Ratio
exp(coef(model_logistik))
## (Intercept) PendidikanSD/MI PendidikanSMA/SMK/MA
## 3.0883045 0.4081198 0.6559322
## PendidikanSMP/MTs
## 0.2855361
Interpretasi Koefisien
• Intercept ((Intercept)): nilai log-odds saat x=0
• Koefisien x: perubahan log-odds untuk setiap satu satuan peningkatan pada x
• Nilai p: menunjukkan signifikansi statistik dari prediktor
Visualisasi Hasil Model Logistik
menggunakan ggplot dengan syntax: ggplot(data_long, aes(x = Pendidikan, y = Status)) + geom_jitter(width = 0.2, height = 0.05, alpha = 0.4) + stat_summary(fun = mean, geom = “point”, aes(y = pred), color = “blue”, size = 3) + labs(title = “Prediksi Probabilitas AK per Jenjang Pendidikan”, y = “Status AK (1 = AK, 0 = Bukan AK)”) + theme_minimal()
Regresi Poisson digunakan ketika variabel respons adalah data cacah (count data),yaitu bilangan bulat non negatif. Model ini merupakan bagian dari Generalized Linear Model(GLM) dengan asumsi bahwa distribusi variabel respons adalah distribusi Poisson.
Distribusi Poisson memiliki fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Distribusi Poisson dapat dituliskan dalam bentuk exponential family sebagai berikut:
\[ f(y; \theta) = \exp \left\{ y \log(\lambda) - \lambda - \log(y!) \right\} \]
dengan:
Maka distribusi Poisson termasuk dalam exponential family.
Fungsi Link
Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
Sehingga modelnya menjadi:
\[ \log(\mu_i) = x_i^T \beta \]
dan fungsi inverse link:
\[ \mu_i = \exp(x_i^T \beta) \]
Estimasi Parameter
Estimasi parameter \(( \beta )\)
dilakukan dengan metode Maximum Likelihood Estimation
(MLE).
Log-likelihood fungsi untuk regresi Poisson:
\[ l(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - \exp(x_i^T \beta) - \log(y_i!) \right] \]
Nilai \(( \beta )\) dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.
model_poisson <- glm(AK ~ Pendidikan, data = data_ak, family = poisson())
summary(model_poisson)
##
## Call:
## glm(formula = AK ~ Pendidikan, family = poisson(), data = data_ak)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 14.1068771 0.0008644 16319.3 <2e-16 ***
## PendidikanSD/MI -0.7403416 0.0015212 -486.7 <2e-16 ***
## PendidikanSMA/SMK/MA 0.6618600 0.0010643 621.9 <2e-16 ***
## PendidikanSMP/MTs -0.6227971 0.0014629 -425.7 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.7228e+06 on 3 degrees of freedom
## Residual deviance: 4.0824e-10 on 0 degrees of freedom
## AIC: 71.078
##
## Number of Fisher Scoring iterations: 2
# Interpretasi Koefisien Poisson
exp(coef(model_poisson))
## (Intercept) PendidikanSD/MI PendidikanSMA/SMK/MA
## 1.338255e+06 4.769510e-01 1.938394e+00
## PendidikanSMP/MTs
## 5.364419e-01
Salah satu asumsi penting dari model Poisson adalah bahwa mean dan varians dari variabel respons adalah sama (𝐸[𝑌]=𝑉𝑎𝑟[𝑌]). Jika varians lebih besar dari mean, maka terjadi overdispersion. Untuk mendeteksi overdispersion:
dispersion <- sum(residuals(model_poisson, type = "pearson")^2) / model_poisson$df.residual
dispersion
## [1] Inf
Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan. visualisasi: pakai syntax ini ggplot(data_ak, aes(x = Pendidikan, y = AK)) + geom_col(fill = “gray”) + geom_point(aes(y = Prediksi), color = “red”, size = 3) + labs(title = “Prediksi Jumlah AK per Pendidikan (Model Poisson)”, y = “Jumlah AK”) + theme_minimal()
Model GLM (logistik dan Poisson) dapat digunakan untuk menganalisis hubungan antara jenjang pendidikan dan status angkatan kerja. Regresi logistik cocok untuk memodelkan probabilitas individu masuk AK, sedangkan regresi Poisson cocok untuk jumlah AK pada masing-masing kategori pendidikan.
Dalam Generalized Linear Model (GLM), inferensi statistik membutuhkan pemahaman terhadap ekspektasi dan variansi dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.
Ekspektasi dan Varians dalam GLM
Ekspektasi menunjukkan apakah suatu estimator tak bias, yaitu:
\[ \mathbb{E}[\hat{\beta}] = \beta \]
Dalam GLM, MLE dari \(\hat{\beta}\) bersifat asymptotically unbiased.
Varians menunjukkan presisi dari estimasi parameter:
\[ \text{Var}(\hat{\beta}) \approx (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]
dimana \(\mathbf{W}\) adalah matriks bobot yang tergantung pada distribusi dan fungsi link.
Distribusi Asimptotik Estimator
Dengan ukuran sampel besar:
\[ \hat{\beta} \sim \mathcal{N}(\beta, \text{Var}(\hat{\beta})) \]
Distribusi ini adalah dasar dari:
Varians dalam GLM Tidak Konstan
Tidak seperti regresi linear (OLS) yang mengasumsikan homoskedastisitas:
\[ \text{Var}(Y_i) = \sigma^2 \]
Dalam GLM:
\[ \text{Var}(Y_i) = \phi V(\mu_i) \]
Contoh:
Perhitungan menggunakan R
Kesimpulan:
Ekspektasi
Jika diturunkan berdasarkan fungsi momen:
\[ E(Y) = \int y f(y; \theta) \, dy = \mu \]
Untuk keluarga eksponensial:
\[ \log f(y; \theta) = a(y) + b(\theta) y + c(\theta) \]
atau:
\[ \log f(y; \theta) = y \theta - b(\theta) + c(y) \]
Maka ekspektasi turunan pertama:
\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \] Dan ekspektasi turunan pertama:
\[ \mathbb{E}[U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
Maka:
\[ \mu = b'(\theta) \]
Varians
Turunan kedua:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
Sehingga:
\[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) \]
Maximum Likelihood Estimation (MLE)
Namun, karena bentuk GLM tidak eksplisit, digunakan metode numerik.
Metode Optimisasi: Newton-Raphson
Iterasi:
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \] Fisher Scoring
IRLS (Iteratively Reweighted Least Square) - Modifikasi dari Fisher scoring, hasil estimasi mirip dengan Least Square.
Implementasi Newton-Raphson Statistik score ke-𝑗 Statistik score ke-𝑗:
\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \] Turunan kedua:
\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]
Taylor expansion:
\[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
Estimasi parameter:
\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Diagnostik digunakan untuk mengevaluasi apakah model sudah tepat.
Statistik Devians
\[ D = 2 \sum \left[ y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i) \right] \]
Statistik Chi-Kuadrat Pearson
\[ X^2 = \sum \left( \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \right) \] • Jika signifikan → model lebih baik daripada tanpa model.
Catatan
• Untuk data yang dikelompokkan, statistik devians dan chi-kuadrat Pearson mengikuti distribusi ChiSquare.
• Untuk data tidak dikelompokkan, tidak mengikuti distribusi Chi-Square.
• Devians diminimalkan oleh MLE → cocok digunakan untuk evaluasi model.
Analisis Residual
• Residual adalah selisih antara observasi dengan prediksi.
• Dapat digunakan untuk memeriksa penyimpangan sistematis.
• Dapat diplot untuk menilai asumsi model
Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.
Fungsi model logistik:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] Estimasi dengan Newton-Raphson
Metode Newton-Raphson digunakan untuk mencari nilai parameter \(( \beta )\) yang memaksimalkan fungsi log-likelihood pada model regresi logistik.
Fungsi Log-Likelihood
Model regresi logistik untuk probabilitas:
\[ \pi_i = \frac{1}{1 + \exp(-x_i^\top \beta)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Langkah-langkah Newton-Raphson Turunan dalam Estimasi Logistik
\[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi) \]
\[ H(\beta) = -X^\top W X, \quad \text{dengan } W = \text{diag}(\pi_i (1 - \pi_i)) \]
\[ \beta^{(t+1)} = \beta^{(t)} + (X^\top W^{(t)} X)^{-1} X^\top (y - \pi^{(t)}) \]
Perhitungan menggunakan R
# Data
data <- data.frame(
Pendidikan = c("SD", "SMP", "SMA", "PT"),
AK = c(638740, 724330, 2664972, 1399198),
Total = c(1144695, 1532001, 3874632, 1771585)
)
# Tambahkan log Total sebagai offset (optional jika dibutuhkan)
data$log_total <- log(data$Total)
# Ubah Pendidikan jadi faktor
data$Pendidikan <- factor(data$Pendidikan)
# Regresi Poisson: respons = AK, prediktor = Pendidikan
model_poisson <- glm(AK ~ Pendidikan, family = poisson(), data = data)
# Ringkasan model
summary(model_poisson)
##
## Call:
## glm(formula = AK ~ Pendidikan, family = poisson(), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 14.1514098 0.0008454 16739.4 <2e-16 ***
## PendidikanSD -0.7841570 0.0015101 -519.3 <2e-16 ***
## PendidikanSMA 0.6442943 0.0010440 617.1 <2e-16 ***
## PendidikanSMP -0.6584074 0.0014475 -454.9 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.8124e+06 on 3 degrees of freedom
## Residual deviance: -5.0906e-10 on 0 degrees of freedom
## AIC: 71.159
##
## Number of Fisher Scoring iterations: 2
Newton-Raphson Iterasi Manual
# Data
pendidikan <- factor(c("SD", "SMP", "SMA", "PT"),
levels = c("SD", "SMP", "SMA", "PT"), ordered = TRUE)
X1 <- as.numeric(pendidikan) # representasi ordinal (1,2,3,4)
AK <- c(638740, 724330, 2664972, 1399198)
Bukan_AK <- c(505955, 807671, 1209660, 372387)
# Bentuk data biner
x <- rep(X1, times = AK + Bukan_AK)
y <- c()
for(i in 1:4){
y <- c(y, rep(1, AK[i]), rep(0, Bukan_AK[i]))
}
# Buat matriks desain
X <- cbind(1, x) # intercept dan prediktor ordinal pendidikan
# Newton-Raphson Iterasi Manual
beta <- c(0, 0) # inisialisasi
tol <- 1e-6
max_iter <- 100
Selanjutnya pakai syntax:
for (i in 1:max_iter) { eta <- X %% beta pi_hat <- 1 / (1 + exp(-eta)) W <- diag(as.numeric(pi_hat (1 - pi_hat))) z <- eta + solve(W) %% (y - pi_hat) beta_new <- solve(t(X) %% W %% X) %% t(X) %% W %% z if (sum(abs(beta_new - beta)) < tol) break beta <- beta_new }
beta # hasil estimasi akhir • Estimasi parameter pada model regresi logistik dilakukan dengan MLE. • Newton-Raphson adalah metode numerik yang digunakan untuk memaksimalkan log-likelihood.
• Iterasi didasarkan pada turunan pertama (score) dan kedua (Hessian).
• Prosedur identik dengan IRLS (Iteratively Reweighted Least Squares) dalam implementasi GLM.
Inferensi Parameter
Tujuan Uji Wald
Untuk menguji signifikansi parameter \((
\beta_j )\) dalam model regresi logistik:
Teori Wald Test
Dari teori estimasi MLE, estimator \((
\hat{\beta}_j )\) mendekati distribusi normal:
\[ \hat{\beta}_j \sim N(\beta_j, \text{Var}(\hat{\beta}_j)) \]
Jika \(( H_0 )\) benar (yaitu \(( \beta_j = 0 )\)), maka:
\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]
Dengan Statistik Wald:
\[ W = Z^2 = \left( \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \right)^2 \sim \chi^2_1 \]
Uji Wald Langkah demi Langkah
# Data dari Andin
pendidikan <- c("SD/MI", "SMP/MTs", "SMA/SMK/MA", "Perguruan Tinggi")
Total_2023 <- c(1144695, 1532001, 3874632, 1771585)
Persen_AK_2023 <- c(55.76, 46.86, 66.95, 75.54)
# Hitung AK dan Bukan AK
AK <- round(Total_2023 * Persen_AK_2023 / 100)
Bukan_AK <- Total_2023 - AK
# Buat data frame biner
x <- factor(rep(pendidikan, times = AK + Bukan_AK),
levels = pendidikan)
y <- unlist(mapply(function(ak, bukan) c(rep(1, ak), rep(0, bukan)),
AK, Bukan_AK))
data <- data.frame(x = x, y = y)
data$x <- relevel(data$x, ref = "SMA/SMK/MA") # Ref kategori
# Model regresi logistik
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.705924 0.001080 653.6 <2e-16 ***
## xSD/MI -0.474497 0.002170 -218.7 <2e-16 ***
## xSMP/MTs -0.831689 0.001946 -427.3 <2e-16 ***
## xPerguruan Tinggi 0.421698 0.002055 205.2 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 10919845 on 8322912 degrees of freedom
## Residual deviance: 10577728 on 8322909 degrees of freedom
## AIC: 10577736
##
## Number of Fisher Scoring iterations: 4
Langkah 1: Ambil nilai koefisien dan standard error (SE)
beta_hat <- coef(model)["xPerguruan Tinggi"]
se_beta <- summary(model)$coefficients["xPerguruan Tinggi", "Std. Error"]
Langkah 2: Hitung Statistik Z
Z <- beta_hat / se_beta
Z
## xPerguruan Tinggi
## 205.2466
Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2
Wald_stat
## xPerguruan Tinggi
## 42126.16
Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
## xPerguruan Tinggi
## 0
Interpretasi: Interpretasi
• Jika p-value < 0.05, maka koefisien signifikan → variabel prediktor berpengaruh.
• Jika p-value > 0.05, maka tidak ada cukup bukti untuk menolak - \(( H_0 )\)
Kesimpulan
Uji Wald didasarkan pada rasio antara estimasi parameter dan standar error-nya. Dengan menaikkan nilai Z menjadi kuadrat (Z²), kita memperoleh distribusi Chi-Square untuk pengujian hipotesis parameter individual dalam model regresi logistik
Bandingkan model penuh dengan model tanpa prediktor
# Data
data_ak <- data.frame(
Pendidikan = c(">= SD/MI", "SMP/MTs", "SMA/SMK/MA", "Perguruan Tinggi"),
Total_2023 = c(1144695, 1532001, 3874632, 1771585),
Persen_AK_2023 = c(55.76, 46.86, 66.95, 75.54)
)
# Hitung AK dan Bukan AK
data_ak$AK <- round(data_ak$Total_2023 * data_ak$Persen_AK_2023 / 100)
data_ak$Bukan_AK <- data_ak$Total_2023 - data_ak$AK
# Ubah ke format long untuk regresi logistik
data_long <- data_ak %>%
select(Pendidikan, AK, Bukan_AK) %>%
tidyr::pivot_longer(cols = c("AK", "Bukan_AK"), names_to = "Status", values_to = "Jumlah")
data_long$Status <- factor(data_long$Status, levels = c("Bukan_AK", "AK"))
data_long$Pendidikan <- factor(data_long$Pendidikan)
# Variabel respons biner
data_long$Y <- ifelse(data_long$Status == "AK", 1, 0)
# Model penuh
model <- glm(Y ~ Pendidikan, data = data_long, weights = Jumlah, family = binomial)
# Model null (tanpa prediktor)
model_null <- glm(Y ~ 1, data = data_long, weights = Jumlah, family = binomial)
# Likelihood ratio test
anova(model_null, model, test = "Chisq")
Evaluasi Kebaikan Model
Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 10577736
Alternatif terhadap AIC, menghukum kompleksitas model.
BIC(model)
## [1] 10577736
• Estimasi regresi logistik dilakukan dengan MLE melalui iterasi Newton-Raphson.
• Inferensi parameter dapat dilakukan dengan uji Wald dan likelihood ratio (uji Chi-Square).
• AIC dan BIC digunakan untuk mengevaluasi kompleksitas dan kecocokan model.
Model regresi Poisson digunakan untuk memodelkan data count (jumlah kejadian) dimana variabel respons mengikuti distribusi Poisson. Estimasi dilakukan dengan Maximum Likelihood Estimation (MLE), dan inferensi dilakukan dengan uji Wald dan Likelihood Ratio Test.
Model Regresi Poisson
Distribusi Poisson:
\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
Model regresi Poisson:
\[ \log(\lambda_i) = x_i^T \beta \] Estimasi Parameter (MLE)
Log-likelihood fungsi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Dengan:
\[ \lambda_i = \exp(x_i^T \beta) \]
Estimasi dilakukan dengan metode iterasi (IRLS)
Estimasi parameter model regresi Poisson menggunakan pendekatan
Maximum Likelihood Estimation (MLE) dengan metode
Iteratively Reweighted Least Squares (IRLS) secara
manual, tanpa menggunakan glm()
.
Tahap 1: Definisikan Model Regresi Poisson
\[ \log(\lambda_i) = x_i^T \beta \quad \Rightarrow \quad \lambda_i = \exp(x_i^T \beta) \]
Tahap 2: Mencari Log-likelihood yang dimaksimumkan
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \] Tahap 3: Formulasi iteratif:
\[ \beta^{(t+1)} = \left( \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{X} \right)^{-1} \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{z}^{(t)} \]
Dengan:
dan
\[ \eta_i = \log(\lambda_i) = x_i^T \beta \] Simulasi Data
Perhitungan menggunakan R
# Data AK berdasarkan pendidikan
Pendidikan <- c("SD", "SMP", "SMA", "PT")
Total_2023 <- c(1144695, 1532001, 3874632, 1771585)
Persen_AK_2023 <- c(55.76, 46.86, 66.95, 75.54)
AK <- round(Total_2023 * Persen_AK_2023 / 100)
Bukan_AK <- Total_2023 - AK
data_ak <- data.frame(Pendidikan, Total_2023, AK, Bukan_AK)
data_ak
# Buat data biner
x <- rep(1:4, data_ak$Total_2023)
y <- unlist(mapply(function(a, b) c(rep(1, a), rep(0, b)), data_ak$AK, data_ak$Bukan_AK))
data <- data.frame(x = x, y = y)
# IRLS manual step-by-step - versi efisien RAM
X <- cbind(1, x)
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- as.numeric(exp(eta))
z <- eta + (y - lambda) / lambda
# Tidak pakai diag(), langsung vektor bobot
WX <- X * lambda # W %*% X tapi dalam bentuk elemen-wise
beta_new <- solve(t(X) %*% (X * lambda)) %*% t(WX) %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 5
model <- glm(y ~ x, data = data, family = poisson())
summary(model)
##
## Call:
## glm(formula = y ~ x, family = poisson(), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.8552662 0.0014438 -592.4 <2e-16 ***
## x 0.1427035 0.0004787 298.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 4796434 on 8322912 degrees of freedom
## Residual deviance: 4705312 on 8322911 degrees of freedom
## AIC: 15282314
##
## Number of Fisher Scoring iterations: 5
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1 - pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 298.0913
## Chi-Square: 88858.44
## p-value: 0
model_null <- glm(y ~ 1, family = poisson(), data = data)
anova(model_null, model, test = "Chisq")
AIC(model)
## [1] 15282314
BIC(model)
## [1] 15282341
ASI
: 1 jika memberikan ASI eksklusif, 0 jika
tidak.X1
: Status bekerja (“Bekerja” atau “Tidak”)X2
: Skor pengetahuan (nilai antara 1 sampai 10) ##
Simulasi Dataset.seed(123)
n <- 100
X1 <- factor(sample(c("Bekerja", "Tidak"), n, replace = TRUE))
X2 <- round(runif(n, 4, 10), 1)
# Probabilitas logit model
eta <- -0.32 + (-0.32)*(X1 == "Bekerja") + 0.12*X2
p <- 1 / (1 + exp(-eta))
ASI <- rbinom(n, 1, p)
# Buat data frame
data <- data.frame(ASI = ASI, X1 = X1, X2 = X2)
head(data)
model <- glm(ASI ~ X1 + X2, family = binomial, data = data)
summary(model)
##
## Call:
## glm(formula = ASI ~ X1 + X2, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.8117 0.9481 -0.856 0.392
## X1Tidak 0.1338 0.4150 0.323 0.747
## X2 0.1528 0.1318 1.160 0.246
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.06 on 99 degrees of freedom
## Residual deviance: 134.50 on 97 degrees of freedom
## AIC: 140.5
##
## Number of Fisher Scoring iterations: 4
exp(coef(model))
## (Intercept) X1Tidak X2
## 0.4441121 1.1432090 1.1651394
Interpretasi: Berdasarkan hasil eksponensiasi koefisien regresi
logistik, diketahui bahwa nilai odds ratio untuk variabel
X1Tidak
adalah 1.143, yang berarti bahwa ibu yang
tidak bekerja memiliki kemungkinan 1.14 kali lebih
besar untuk memberikan ASI eksklusif dibandingkan ibu yang bekerja,
dengan asumsi variabel lain konstan. Sementara itu, variabel
X2
memiliki odds ratio sebesar 1.165, menunjukkan bahwa
setiap kenaikan satu unit pada X2
(yang dapat diasumsikan
sebagai tingkat pengetahuan atau skor edukasi), maka peluang ibu
memberikan ASI eksklusif meningkat sebesar 16.5%. Nilai intercept
(0.444) menunjukkan baseline odds ketika semua prediktor bernilai nol,
tetapi interpretasi utamanya tetap berfokus pada variabel independen
karena lebih bermakna dalam konteks praktis.
data$pred_prob <- predict(model, type = "response")
data$pred_class <- ifelse(data$pred_prob > 0.5, 1, 0)
table(Predicted = data$pred_class, Actual = data$ASI)
## Actual
## Predicted 0 1
## 0 5 8
## 1 37 50
library(ggplot2)
ggplot(data, aes(x = X2, y = pred_prob, color = X1, shape = factor(ASI))) +
geom_point(size = 3) +
labs(title = "Prediksi Probabilitas ASI Eksklusif",
x = "Skor Pengetahuan",
y = "Probabilitas Prediksi",
shape = "Fakta") +
theme_minimal()
Model regresi logistik menunjukkan bahwa status pekerjaan dan pengetahuan memiliki pengaruh signifikan terhadap pemberian ASI eksklusif. Ibu yang bekerja cenderung memiliki probabilitas lebih rendah untuk memberikan ASI eksklusif dibandingkan yang tidak bekerja, sedangkan skor pengetahuan yang lebih tinggi meningkatkan kemungkinan pemberian ASI eksklusif.
# Eksplorasi deskriptif berdasarkan variabel respon
sim_data %>%
dplyr::group_by(success) %>%
dplyr::summarise(
Jumlah = n(),
Rata2_Income = mean(income)
)
Interpretasi: Distribusi jumlah sukses dan tidak sukses, serta rata-rata pendapatan pada masing-masing grup. ### 10.3 Perlakuan Variabel Ordinal #### 10.3.1 Treat sebagai Nominal (Dummy)
# Ubah education jadi faktor biasa (tanpa urutan)
sim_data_nominal <- sim_data %>%
mutate(
education = factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"))
)
# Bangun model regresi logistik dengan education sebagai dummy
model_nominal <- glm(success ~ gender + education + income,
data = sim_data_nominal,
family = binomial)
# Ringkasan model
summary(model_nominal)
##
## Call:
## glm(formula = success ~ gender + education + income, family = binomial,
## data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.514644 0.614284 2.466 0.013674 *
## genderMale -0.552081 0.222113 -2.486 0.012934 *
## education.L 1.394244 0.376820 3.700 0.000216 ***
## education.Q -0.228561 0.327249 -0.698 0.484907
## education.C -0.003668 0.270382 -0.014 0.989177
## income 0.006542 0.010678 0.613 0.540117
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 551.08 on 499 degrees of freedom
## Residual deviance: 510.74 on 494 degrees of freedom
## AIC: 522.74
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Hasil regresi logistik menunjukkan bahwa jenis kelamin memiliki pengaruh signifikan terhadap peluang sukses, di mana laki-laki memiliki peluang lebih rendah dibandingkan perempuan (p = 0.013). Dari variabel pendidikan yang diperlakukan sebagai nominal (dengan kontrast orthogonal: L, Q, C), hanya komponen linear (education.L) yang signifikan (p < 0.001), mengindikasikan bahwa terdapat kecenderungan peningkatan log-odds keberhasilan seiring peningkatan jenjang pendidikan. Sementara komponen kuadratik dan kubik tidak signifikan, artinya tidak ada pola non-linier yang kuat antara pendidikan dan keberhasilan. Variabel income tidak menunjukkan pengaruh signifikan (p = 0.54), sehingga tidak dapat disimpulkan bahwa peningkatan pendapatan memengaruhi peluang keberhasilan secara nyata. #### 10.3.2 2. Treat sebagai Rasio (Numeric Rank)
# Ubah education jadi nilai numerik
sim_data_numeric <- sim_data %>%
mutate(
education_numeric = case_when(
education == "HighSchool" ~ 1,
education == "Bachelor" ~ 2,
education == "Master" ~ 3,
education == "PhD" ~ 4
)
)
# Model regresi logistik
model_numeric <- glm(success ~ gender + education_numeric + income,
data = sim_data_numeric,
family = binomial)
# Lihat hasil ringkasan model
summary(model_numeric)
##
## Call:
## glm(formula = success ~ gender + education_numeric + income,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.202335 0.640837 -0.316 0.752
## genderMale -0.556168 0.221402 -2.512 0.012 *
## education_numeric 0.710596 0.131509 5.403 6.54e-08 ***
## income 0.006521 0.010644 0.613 0.540
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 551.08 on 499 degrees of freedom
## Residual deviance: 511.36 on 496 degrees of freedom
## AIC: 519.36
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Semakin tinggi jenjang pendidikan, semakin besar peluang keberhasilan secara signifikan (p < 0.001), sementara laki-laki memiliki peluang lebih rendah dibanding perempuan, dan pendapatan tidak menunjukkan pengaruh yang signifikan. #### Perbandingan Model
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 522.7404
##
## $AIC_Numeric
## [1] 519.3598
Interpretasi: Model dengan perlakuan pendidikan sebagai numeric rank lebih baik (AIC = 519.36) dibandingkan model dengan dummy kategori (AIC = 522.74), karena memiliki nilai AIC yang lebih rendah. #### Goodness-of-Fit Model
nullmod <- glm(success ~ 1, data = sim_data, family = binomial)
r2_nominal <- 1 - (logLik(model_nominal)/logLik(nullmod))
r2_numeric <- 1 - (logLik(model_numeric)/logLik(nullmod))
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## 'log Lik.' 0.07320089 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.07207691 (df=4)
Interpretasi: Nilai McFadden’s R² untuk model nominal (0.0732) sedikit lebih tinggi dibanding model numeric (0.0721), menunjukkan bahwa secara kecocokan terhadap data, model dengan dummy kategori sedikit lebih baik meskipun perbedaannya sangat kecil. #### Visualisasi Prediksi
# Tambahkan prediksi ke data
sim_data_nominal <- sim_data_nominal %>%
mutate(predicted = predict(model_nominal, type = "response"))
# Plot prediksi probabilitas terhadap income, dibedakan berdasarkan pendidikan
sim_data_nominal %>%
ggplot(aes(x = income, y = predicted, color = education)) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas (Ordinal sebagai Nominal)",
x = "Income",
y = "Probabilitas Keberhasilan"
) +
theme_minimal()
# Tambahkan prediksi ke data
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted = predict(model_numeric, type = "response"))
# Plot probabilitas keberhasilan berdasarkan income dan jenjang pendidikan
sim_data_numeric %>%
ggplot(aes(x = income, y = predicted, color = as.factor(education_numeric))) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas (Ordinal sebagai Numeric)",
x = "Income",
y = "Probabilitas Keberhasilan",
color = "Jenjang Pendidikan"
) +
theme_minimal()
Interpretasi: Kedua model menunjukkan pola bahwa probabilitas
keberhasilan meningkat seiring bertambahnya income dan jenjang
pendidikan. Namun, model ordinal sebagai numeric (kanan) menghasilkan
transisi yang lebih halus antar jenjang pendidikan, karena perlakuannya
memperlakukan jenjang sebagai urutan linear. Sebaliknya, model ordinal
sebagai nominal (kiri) menunjukkan perbedaan yang lebih tajam antar
jenjang, karena setiap kategori diperlakukan terpisah tanpa menganggap
ada hubungan urutan. Ini terlihat dari garis prediksi yang lebih
“diskret” per level pendidikan. #### Ringkasan Koefisien Model (Ordinal
sebagai Nominal)
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(format = "latex", booktabs = TRUE,
caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(latex_options = c("hold_position", "striped"))
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE,
caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numeric") %>%
kable_styling(latex_options = c("hold_position", "striped"))
set.seed(123)
n <- 250
age <- rnorm(n, mean = 35, sd = 8)
gender <- rbinom(n, 1, 0.5) # 0 = Female, 1 = Male
income <- round(runif(n, 3, 10)) # dalam juta
lin_pred <- -1 + 0.05 * age + 0.3 * income - 0.8 * gender
p <- 1 / (1 + exp(-lin_pred))
success <- rbinom(n, 1, p)
df <- data.frame(success = factor(success), age, gender, income)
model_full <- glm(success ~ age + gender + income, data = df, family = binomial)
null_model <- glm(success ~ 1, data = df, family = binomial)
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$success, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "ROC Curve")
auc(roc_obj)
## Area under the curve: 0.7013
library(DescTools)
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.04039466 0.08618645 0.06520027
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
table(pred_class)
## pred_class
## 1
## 250
table(df$success)
##
## 0 1
## 24 226
table(Prediksi = pred_class, Aktual = df$success)
## Aktual
## Prediksi 0 1
## 1 24 226
conf_mat <- table(Prediksi = pred_class, Aktual = df$success)
# Amankan nama kolom dan baris
pred_levels <- rownames(conf_mat)
actual_levels <- colnames(conf_mat)
# Pastikan semua nilai ada, default ke 0 kalau tidak ada
TP <- ifelse("1" %in% pred_levels & "1" %in% actual_levels, conf_mat["1", "1"], 0)
TN <- ifelse("0" %in% pred_levels & "0" %in% actual_levels, conf_mat["0", "0"], 0)
FP <- ifelse("1" %in% pred_levels & "0" %in% actual_levels, conf_mat["1", "0"], 0)
FN <- ifelse("0" %in% pred_levels & "1" %in% actual_levels, conf_mat["0", "1"], 0)
# Hitung metrik
akurasi <- (TP + TN) / sum(conf_mat)
sensitivitas <- TP / (TP + FN)
spesifisitas <- TN / (TN + FP)
# Tampilkan hasil
data.frame(
Akurasi = round(akurasi, 3),
Sensitivitas = round(sensitivitas, 3),
Spesifisitas = round(spesifisitas, 3)
)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(broom)
library(DescTools)
set.seed(123)
library(dplyr)
library(tidyr)
data_ak <- data.frame(
Pendidikan = c(">= SD/MI", "SMP/MTs", "SMA/SMK/MA", "Perguruan Tinggi"),
Total = c(1144695, 1532001, 3874632, 1771585),
Persen = c(55.76, 46.86, 66.95, 75.54)
)
data_bin <- data_ak %>%
mutate(Ikut = round(Total * Persen / 100), Tidak = Total - Ikut) %>%
uncount(Ikut) %>% mutate(AK = 1) %>%
bind_rows(
data_ak %>% mutate(Ikut = round(Total * Persen / 100), Tidak = Total - Ikut) %>%
uncount(Tidak) %>% mutate(AK = 0)
) %>%
mutate(Pendidikan = factor(Pendidikan,
levels = c(">= SD/MI", "SMP/MTs", "SMA/SMK/MA", "Perguruan Tinggi"),
ordered = TRUE
))
model1 <- glm(AK ~ 1, data = data_bin, family = binomial)
model2 <- glm(AK ~ Pendidikan, data = data_bin, family = binomial)
model_comp <- data.frame(
Model = c("Model 1", "Model 2"),
AIC = c(AIC(model1), AIC(model2)),
Deviance = c(deviance(model1), deviance(model2))
)
model_comp
anova(model1, model2, test = "LRT")
Model yang kompleks sering memiliki AIC dan deviance yang lebih kecil. Namun: - Model sederhana lebih mudah diinterpretasikan. - Jika penurunan AIC tidak signifikan, pilih model yang lebih sederhana. - Prinsip parsimony membantu mencegah overfitting. #### Rumus AIC \[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan:
AIC digunakan untuk menilai model berdasarkan kombinasi
goodness-of-fit (melalui log-likelihood) dan
kompleksitas (jumlah parameter \(k\)). Semakin kecil AIC, semakin baik model
secara umum. Tapi AIC juga menghukum model yang terlalu kompleks. ####
Rumus Deviance \[
D = -2 \left[ \log L(\text{model}) - \log L(\text{model saturasi})
\right]
\]
Penjelasan:
Deviance mengukur seberapa jauh model saat ini dari model sempurna
(saturasi). Nilai deviance kecil → model memberikan prediksi yang
mendekati data aktual. #### Rumus Likelihood Ratio \[
G^2 = -2 (\log L_0 - \log L_1)
\]
Penjelasan:
Statistik ini menguji apakah penambahan variabel dalam model secara
signifikan meningkatkan kecocokan. Jika \(G^2\) besar dan p-value kecil →
model kompleks lebih baik secara statistik dibanding
model sederhana. ### 11.9 Evaluasi Tabel Klasifikasi dan Akurasi
Model
# 1. Prediksi probabilitas dari model
pred_prob <- predict(model2, type = "response")
# 2. Ubah jadi kelas 0 atau 1 (threshold 0.5)
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
# 3. Buat confusion matrix manual
actual <- data_bin$AK
table(Prediksi = pred_class, Aktual = actual)
## Aktual
## Prediksi 0 1
## 0 814105 717896
## 1 2220309 4570603
# 4. Hitung metrik dasar
TP <- sum(pred_class == 1 & actual == 1)
TN <- sum(pred_class == 0 & actual == 0)
FP <- sum(pred_class == 1 & actual == 0)
FN <- sum(pred_class == 0 & actual == 1)
akurasi <- (TP + TN) / length(actual)
presisi <- TP / (TP + FP)
recall <- TP / (TP + FN)
f1 <- 2 * presisi * recall / (presisi + recall)
# 5. Tampilkan hasil
cat("Akurasi :", round(akurasi, 3), "\n")
## Akurasi : 0.647
cat("Presisi :", round(presisi, 3), "\n")
## Presisi : 0.673
cat("Recall :", round(recall, 3), "\n")
## Recall : 0.864
cat("F1 Score:", round(f1, 3), "\n")
## F1 Score: 0.757
\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
\[ \text{Specificity} = \frac{TN}{TN + FP} \]
# Hitung sensitivitas dan spesifisitas
sensitivitas <- TP / (TP + FN)
spesifisitas <- TN / (TN + FP)
# Tampilkan hasil
cat("Sensitivitas:", round(sensitivitas, 3), "\n")
## Sensitivitas: 0.864
cat("Spesifisitas:", round(spesifisitas, 3), "\n")
## Spesifisitas: 0.268
• Deviance yang kecil menunjukkan kecocokan model yang lebih baik. • AIC yang rendah menunjukkan keseimbangan antara kecocokan dan kompleksitas. • Likelihood Ratio Test mengevaluasi apakah model kompleks secara signifkan lebih baik. • Tabel klasifkasi membantu menilai kinerja prediksi aktual vs prediksi model. • Prinsip Parsimony mengutamakan model sederhana jika performanya mirip.
Kurva ROC adalah alat visual untuk mengevaluasi performa model
klasifikasi biner.
Kurva ini menunjukkan trade-off antara Sensitivity
(TPR) dan 1 - Specificity (FPR) di berbagai
cut-off threshold. #### 1. Definisi - Sumbu Y
(Sensitivity) = True Positive Rate = \(\frac{TP}{TP + FN}\)
- Sumbu X (1 - Specificity) = False Positive Rate =
\(\frac{FP}{FP + TN}\) - Garis
diagonal: menunjukkan tebakan acak (random guess)
- Kurva mendekati pojok kiri atas: model lebih baik #### 2.
Cut-off dan Pergerakan Kurva - Cut-off rendah: -
Sensitivitas naik - Spesifisitas turun - Cut-off tinggi: - Sensitivitas
turun - Spesifisitas naik #### 3. Kurva ROC Ideal -
Naik tajam secara vertikal ke sensitivitas = 1
- Lalu bergerak horizontal ke 1 - specificity = 1
- AUC mendekati 1 #### 4. Interpretasi Luas Area (AUC)
- AUC = 0.5: tidak lebih baik dari tebak acak
- AUC > 0.7: cukup baik
- AUC > 0.9: sangat baik
- AUC juga dikenal sebagai Concordance Index ### 5.
Kegunaan Kurva ROC - Bandingkan performa beberapa model
klasifikasi
- Menentukan threshold (cut-off) optimal sesuai kebutuhan ## 6.
Visualisasi ROC di R
library(pROC)
# Prediksi probabilitas dari model2
pred <- predict(model2, type = "response")
# ROC analysis, target = AK
roc_obj <- roc(response = data_bin$AK, predictor = pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Plot kurva ROC
plot(roc_obj, main = "Kurva ROC untuk Model2 (Pendidikan ~ AK)", col = "blue", lwd = 2)
# Nilai AUC
auc_value <- auc(roc_obj)
cat("Nilai AUC:", round(auc_value, 3))
## Nilai AUC: 0.613
Untuk memilih threshold terbaik, kita bisa mengevaluasi sensitivitas dan spesifisitas pada berbagai nilai cut-off.
# Prediksi probabilitas
pred <- predict(model2, type = "response")
actual <- data_bin$AK
# Rentang threshold yang diuji
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
# Inisialisasi
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
# Loop ringkas untuk hitung Sensitivity dan Specificity
results$Sensitivity <- results$Specificity <- NA
for (i in seq_along(thresholds)) {
t <- thresholds[i]
pred_class <- factor(ifelse(pred >= t, 1, 0), levels = c(0, 1))
actual_fac <- factor(actual, levels = c(0, 1))
cm <- table(pred_class, actual_fac)
TP <- cm["1", "1"]; FN <- cm["0", "1"]
TN <- cm["0", "0"]; FP <- cm["1", "0"]
results$Sensitivity[i] <- ifelse((TP + FN) == 0, NA, TP / (TP + FN))
results$Specificity[i] <- ifelse((TN + FP) == 0, NA, TN / (TN + FP))
}
print(results)
## Threshold Specificity Sensitivity
## 1 0.10 0.0000000 1.0000000
## 2 0.15 0.0000000 1.0000000
## 3 0.20 0.0000000 1.0000000
## 4 0.25 0.0000000 1.0000000
## 5 0.30 0.0000000 1.0000000
## 6 0.35 0.0000000 1.0000000
## 7 0.40 0.0000000 1.0000000
## 8 0.45 0.0000000 1.0000000
## 9 0.50 0.2682907 0.8642534
## 10 0.55 0.2682907 0.8642534
## 11 0.60 0.4351806 0.7435609
## 12 0.65 0.4351806 0.7435609
## 13 0.70 0.8571948 0.2530501
## 14 0.75 0.8571948 0.2530501
## 15 0.80 1.0000000 0.0000000
## 16 0.85 1.0000000 0.0000000
## 17 0.90 1.0000000 0.0000000
Kurva Precision-Recall (PR) adalah alat evaluasi performa model
klasifikasi, khususnya berguna untuk data tidak seimbang (class
imbalance). #### 1. Definisi - Precision
(Presisi): Proporsi prediksi positif yang benar-benar
positif
\[
\text{Precision} = \frac{TP}{TP + FP}
\] - Recall (Sensitivitas): Proporsi kasus
positif yang berhasil diprediksi positif
\[
\text{Recall} = \frac{TP}{TP + FN}
\] #### 2. Interpretasi - PR Curve menggambarkan trade-off antara
precision dan recall. - Idealnya, keduanya tinggi. -
Model baik: PR curve mendekati pojok kanan atas. #### 3. Area Under PR
Curve (AUPRC) - AUPRC mendekati 1 → model sangat baik - Baseline AUPRC =
prevalensi kelas positif #### 4. PR Curve vs ROC Curve | Aspek | ROC
Curve | Precision-Recall Curve | |—————|———————–|——————————| | Fokus |
Semua kelas | Kelas positif | | Kuat di | Data seimbang | Data tidak
seimbang | | Sumbu Y | Sensitivitas (Recall) | Precision | | Sumbu X | 1
- Spesifisitas | Recall | ### 5. Visualisasi PR Curve di R
library(PRROC)
## Loading required package: rlang
##
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
##
## %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
## flatten_raw, invoke, splice
# Prediksi probabilitas dari model kamu (misal model2)
prob <- predict(model2, type = "response")
# PR curve (class 1 = positif)
pr <- pr.curve(
scores.class0 = prob[data_bin$AK == 1],
scores.class1 = prob[data_bin$AK == 0],
curve = TRUE
)
# Plot kurvanya
plot(pr)
### 11.12 Pseudo R-squared pada Regresi Logistik #### Tujuan Dokumen ini
menjelaskan dan menghitung pseudo R-squared pada model
regresi logistik: - \(R^2_{\text{Cox \&
Snell}}\) - \(R^2_{\text{McFadden}}\) #### Simulasi Model
Logistik
# Asumsi kamu sudah punya data_bin dan model2 dari analisis sebelumnya
model_null <- glm(AK ~ 1, data = data_bin, family = binomial)
logL0 <- logLik(model_null)
logLM <- logLik(model2)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model2)
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_CoxSnell = cox_snell,
R2_McFadden = mcfadden
)
r2
library(pscl)
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
pR2(model2)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -5.288864e+06 -5.459923e+06 3.421173e+05 3.132987e-02 4.027210e-02
## r2CU
## 5.511253e-02
PseudoR2(model2, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 3.132987e-02 3.132913e-02 4.027210e-02 5.511253e-02 3.948253e-02
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 6.957541e-02 4.126757e-02 5.176735e-02 4.126757e-02 1.057774e+07
## BIC logLik logLik0 G2
## 1.057779e+07 -5.288864e+06 -5.459923e+06 3.421173e+05
set.seed(1)
data_multinom <- data_bin
data_multinom$AK_cat <- factor(
sample(c("Tidak AK", "AK Paruh Waktu", "AK Penuh Waktu"),
size = nrow(data_multinom),
replace = TRUE,
prob = c(0.3, 0.2, 0.5)),
levels = c("Tidak AK", "AK Paruh Waktu", "AK Penuh Waktu")
)
library(nnet)
model_mn <- multinom(AK_cat ~ Pendidikan, data = data_multinom)
## # weights: 15 (8 variable)
## initial value 9143654.499619
## iter 10 value 8600306.694568
## final value 8570200.352242
## converged
summary(model_mn)
## Call:
## multinom(formula = AK_cat ~ Pendidikan, data = data_multinom)
##
## Coefficients:
## (Intercept) Pendidikan.L Pendidikan.Q Pendidikan.C
## AK Paruh Waktu -0.4047336 0.001641476 -0.0009274499 0.0010072106
## AK Penuh Waktu 0.5106130 0.002079925 -0.0023895323 0.0008324201
##
## Std. Errors:
## (Intercept) Pendidikan.L Pendidikan.Q Pendidikan.C
## AK Paruh Waktu 0.0011057682 0.002401576 0.002211536 0.002003551
## AK Penuh Waktu 0.0008848603 0.001921866 0.001769721 0.001603201
##
## Residual Deviance: 17140401
## AIC: 17140417
z <- summary(model_mn)$coefficients / summary(model_mn)$standard.errors
pval <- 2 * (1 - pnorm(abs(z)))
round(pval, 4)
## (Intercept) Pendidikan.L Pendidikan.Q Pendidikan.C
## AK Paruh Waktu 0 0.4943 0.6749 0.6152
## AK Penuh Waktu 0 0.2791 0.1769 0.6036
data_multinom$Predicted <- predict(model_mn)
table(Predicted = data_multinom$Predicted, Actual = data_multinom$AK_cat)
## Actual
## Predicted Tidak AK AK Paruh Waktu AK Penuh Waktu
## Tidak AK 0 0 0
## AK Paruh Waktu 0 0 0
## AK Penuh Waktu 2496171 1665509 4161233
set.seed(123)
data_ord <- data_bin
data_ord$AK_ordinal <- ordered(
sample(c("Tidak AK", "Paruh Waktu", "Penuh Waktu"),
size = nrow(data_ord),
replace = TRUE,
prob = c(0.3, 0.3, 0.4)),
levels = c("Tidak AK", "Paruh Waktu", "Penuh Waktu")
)
library(MASS)
model_ord <- polr(AK_ordinal ~ Pendidikan, data = data_ord, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = AK_ordinal ~ Pendidikan, data = data_ord, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## Pendidikan.L -0.0006091 0.001535 -0.3968
## Pendidikan.Q 0.0010835 0.001413 0.7667
## Pendidikan.C -0.0013811 0.001280 -1.0789
##
## Intercepts:
## Value Std. Error t value
## Tidak AK|Paruh Waktu -0.8474 0.0008 -1040.8638
## Paruh Waktu|Penuh Waktu 0.4045 0.0008 526.1203
##
## Residual Deviance: 18124398.52
## AIC: 18124408.52
ctable <- coef(summary(model_ord))
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
ctable <- cbind(ctable, "p value" = round(p, 4))
ctable
## Value Std. Error t value p value
## Pendidikan.L -0.0006090559 0.0015349686 -0.3967872 0.6915
## Pendidikan.Q 0.0010835337 0.0014132975 0.7666707 0.4433
## Pendidikan.C -0.0013811225 0.0012801136 -1.0789062 0.2806
## Tidak AK|Paruh Waktu -0.8474095586 0.0008141407 -1040.8638108 0.0000
## Paruh Waktu|Penuh Waktu 0.4045230900 0.0007688795 526.1202877 0.0000
# Misalnya ingin prediksi berdasarkan beberapa kategori pendidikan
newdata <- data.frame(Pendidikan = factor(c("SMA", "S1", "S2", "S3"),
levels = levels(data_ord$Pendidikan)))
predict(model_ord, newdata = newdata, type = "probs")
## Tidak AK Paruh Waktu Penuh Waktu
## 1 NA NA NA
## 2 NA NA NA
## 3 NA NA NA
## 4 NA NA NA
# Pastikan data_bin udah ada dan punya variabel Pendidikan dan AK_bin
data_ok <- na.omit(data_bin[, c("Pendidikan", "AK")])
table_data <- table(data_ok$Pendidikan, data_ok$AK)
table_data <- table(Pendidikan = data_ok$Pendidikan, AK = data_ok$AK)
table_data
## AK
## Pendidikan 0 1
## >= SD/MI 506413 638282
## SMP/MTs 814105 717896
## SMA/SMK/MA 1280566 2594066
## Perguruan Tinggi 433330 1338255
library(MASS)
model_sat <- loglm(~ Pendidikan * AK, data = table_data)
model_indep <- loglm(~ Pendidikan + AK, data = table_data)
anova(model_indep, model_sat)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Pendidikan + AK
## Model 2:
## ~Pendidikan * AK
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 342117.3 3
## Model 2 0.0 0 342117.3 3 0
## Saturated 0.0 0 0.0 0 1
anova(model_indep, model_sat)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Pendidikan + AK
## Model 2:
## ~Pendidikan * AK
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 342117.3 3
## Model 2 0.0 0 342117.3 3 0
## Saturated 0.0 0 0.0 0 1
Model log-linear tiga arah digunakan untuk mengestimasi parameter-parameter yang menjelaskan hubungan tiga variabel kategorik. Model ini memungkinkan interaksi tingkat tinggi antar variabel.
Misalkan tiga variabel kategorik adalah \(X\), \(Y\), dan \(Z\). Bentuk model log-linear dapat berbeda tergantung interaksi yang dimasukkan:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \] Mencakup semua interaksi termasuk tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \] Hanya mencakup interaksi dua arah.
Gunakan deviance untuk menilai kecocokan model dan menentukan struktur interaksi.
Gunakan data berikut dari GSS 1994 (responden berdasarkan jenis kelamin dan sikap terhadap hukuman mati):
Fundamentalisme | Jenis Kelamin | Mendukung | Menolak | Total |
---|---|---|---|---|
Fund | Laki-laki | 128 | 32 | 160 |
Fund | Perempuan | 123 | 53 | 176 |
Total | 251 | 85 | 336 |
Instruksi: Bangun model log-linear dari data ini dan evaluasi struktur asosiasinya. Tunjukkan model terbaik berdasarkan hasil uji interaksi menggunakan pendekatan deviance.
library(MASS)
# Format data
z.fund <- factor(rep(c("1fund", "2mod", "3lib"), each = 4))
x.sex <- factor(rep(c("1M", "2F"), each = 2, times = 3))
y.fav <- factor(rep(c("1fav", "2opp"), times = 6))
counts <- c(182, 123, 73, 82, 168, 56, 105, 49, 119, 111, 70, 70)
data <- data.frame(
Fundamentalisme = z.fund,
Jenis_Kelamin = x.sex,
Sikap = y.fav,
Frekuensi = counts
)
m0 <- glm(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, family = poisson(), data = data)
m1 <- glm(Frekuensi ~ (Fundamentalisme + Jenis_Kelamin) * Sikap, family = poisson(), data = data)
m2 <- glm(Frekuensi ~ (Fundamentalisme + Sikap) * Jenis_Kelamin, family = poisson(), data = data)
m3 <- glm(Frekuensi ~ (Fundamentalisme + Jenis_Kelamin + Sikap)^2, family = poisson(), data = data)
m4 <- glm(Frekuensi ~ Fundamentalisme * Jenis_Kelamin * Sikap, family = poisson(), data = data)
# Bandingkan model berdasarkan deviance
anova(m0, m1, m2, m3, m4, test = "Chisq")
library(epitools)
library(DescTools)
library(lawstat)
# Input data sesuai tabel praktikum
z.fund <- factor(rep(c("1fund", "2mod", "3lib"), each = 4))
x.sex <- factor(rep(c("1M", "2F"), each = 2, times = 3))
y.fav <- factor(rep(c("1fav", "2opp"), times = 6))
counts <- c(182, 123, 73, 82, 168, 56, 105, 49, 119, 111, 70, 70)
data <- data.frame(
Fundamentalisme = z.fund,
Jenis_Kelamin = x.sex,
Sikap = y.fav,
Frekuensi = counts
)
data
table3d <- xtabs(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, data = data)
ftable(table3d)
## Sikap 1fav 2opp
## Fundamentalisme Jenis_Kelamin
## 1fund 1M 182 123
## 2F 73 82
## 2mod 1M 168 56
## 2F 105 49
## 3lib 1M 119 111
## 2F 70 70
Kita akan memodelkan tabel ini menggunakan beberapa model log-linear dan membandingkan kecocokan model (parsimonious model): # 17 UJI MODEL INTERAKSI TIGA ARAH (SATURATED VS HOMOGENOUS) ## 17.0.1 Penentuan Kategori Referensi
# Simulasi variabel gender
set.seed(99)
data_3d <- data_bin
data_3d$Gender <- factor(sample(c("L", "P"), size = nrow(data_3d), replace = TRUE))
data_3d$AK_bin <- factor(data_3d$AK, labels = c("Tidak AK", "AK"))
# Set reference level
data_3d$Gender <- relevel(data_3d$Gender, ref = "P")
data_3d$AK_bin <- relevel(data_3d$AK_bin, ref = "Tidak AK")
data_3d$Pendidikan <- factor(data_3d$Pendidikan, ordered = FALSE)
data_3d$Pendidikan <- relevel(data_3d$Pendidikan, ref = ">= SD/MI")
Model log-linear saturated memasukkan semua interaksi hingga tiga arah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
# Buat tabel count
counts <- as.vector(table(data_3d$Gender, data_3d$AK_bin, data_3d$Pendidikan))
# Data frame kombinasi faktor
x.sex <- rep(levels(data_3d$Gender), each = length(levels(data_3d$AK_bin)) * length(levels(data_3d$Pendidikan)))
y.fav <- rep(rep(levels(data_3d$AK_bin), each = length(levels(data_3d$Pendidikan))), times = length(levels(data_3d$Gender)))
z.fund <- rep(levels(data_3d$Pendidikan), times = length(levels(data_3d$Gender)) * length(levels(data_3d$AK_bin)))
df_saturated <- data.frame(counts, x.sex = factor(x.sex), y.fav = factor(y.fav), z.fund = factor(z.fund))
# Model saturated
model_saturated <- glm(counts ~ x.sex * y.fav * z.fund,
family = poisson(link = "log"),
data = df_saturated)
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.sex * y.fav * z.fund, family = poisson(link = "log"),
## data = df_saturated)
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 12.288040 0.002146 5725.277
## x.sexP 0.627944 0.002658 236.247
## y.favTidak AK 1.081142 0.002484 435.284
## z.fundPerguruan Tinggi 1.127002 0.002470 456.346
## z.fundSMA/SMK/MA 1.124376 0.002470 455.136
## z.fundSMP/MTs -0.003868 0.003038 -1.273
## x.sexP:y.favTidak AK -1.556115 0.003547 -438.723
## x.sexP:z.fundPerguruan Tinggi -1.252789 0.003368 -371.935
## x.sexP:z.fundSMA/SMK/MA -1.248692 0.003368 -370.722
## x.sexP:z.fundSMP/MTs 0.005295 0.003761 1.408
## y.favTidak AK:z.fundPerguruan Tinggi -0.420843 0.002904 -144.922
## y.favTidak AK:z.fundSMA/SMK/MA -0.417719 0.002905 -143.816
## y.favTidak AK:z.fundSMP/MTs 0.004836 0.003515 1.376
## x.sexP:y.favTidak AK:z.fundPerguruan Tinggi 0.777464 0.004557 170.591
## x.sexP:y.favTidak AK:z.fundSMA/SMK/MA 0.775953 0.004556 170.301
## x.sexP:y.favTidak AK:z.fundSMP/MTs -0.004364 0.005017 -0.870
## Pr(>|z|)
## (Intercept) <2e-16 ***
## x.sexP <2e-16 ***
## y.favTidak AK <2e-16 ***
## z.fundPerguruan Tinggi <2e-16 ***
## z.fundSMA/SMK/MA <2e-16 ***
## z.fundSMP/MTs 0.203
## x.sexP:y.favTidak AK <2e-16 ***
## x.sexP:z.fundPerguruan Tinggi <2e-16 ***
## x.sexP:z.fundSMA/SMK/MA <2e-16 ***
## x.sexP:z.fundSMP/MTs 0.159
## y.favTidak AK:z.fundPerguruan Tinggi <2e-16 ***
## y.favTidak AK:z.fundSMA/SMK/MA <2e-16 ***
## y.favTidak AK:z.fundSMP/MTs 0.169
## x.sexP:y.favTidak AK:z.fundPerguruan Tinggi <2e-16 ***
## x.sexP:y.favTidak AK:z.fundSMA/SMK/MA <2e-16 ***
## x.sexP:y.favTidak AK:z.fundSMP/MTs 0.384
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.9022e+06 on 15 degrees of freedom
## Residual deviance: 2.0977e-10 on 0 degrees of freedom
## AIC: 269.34
##
## Number of Fisher Scoring iterations: 2
# Eksponensial dari koefisien
exp(model_saturated$coefficients)
## (Intercept)
## 2.170840e+05
## x.sexP
## 1.873754e+00
## y.favTidak AK
## 2.948043e+00
## z.fundPerguruan Tinggi
## 3.086391e+00
## z.fundSMA/SMK/MA
## 3.078297e+00
## z.fundSMP/MTs
## 9.961397e-01
## x.sexP:y.favTidak AK
## 2.109541e-01
## x.sexP:z.fundPerguruan Tinggi
## 2.857069e-01
## x.sexP:z.fundSMA/SMK/MA
## 2.868798e-01
## x.sexP:z.fundSMP/MTs
## 1.005309e+00
## y.favTidak AK:z.fundPerguruan Tinggi
## 6.564934e-01
## y.favTidak AK:z.fundSMA/SMK/MA
## 6.585474e-01
## y.favTidak AK:z.fundSMP/MTs
## 1.004848e+00
## x.sexP:y.favTidak AK:z.fundPerguruan Tinggi
## 2.175948e+00
## x.sexP:y.favTidak AK:z.fundSMA/SMK/MA
## 2.172661e+00
## x.sexP:y.favTidak AK:z.fundSMP/MTs
## 9.956458e-01
Model saturated dengan semua efek utama, interaksi dua arah, dan interaksi tiga arah. Memodelkan hubungan antara jenis kelamin (x.sex), sikap terhadap hukuman mati (y.fav), dan tingkat fundamentalisme (z.fund) terhadap frekuensi responden.
Parameter | Estimate | Std. Error | z value | Pr(> | z |
---|---|---|---|---|---|
Intercept | 4.25 | 0.12 | 35.55 | <2e-16 *** | 70.00 |
x.sex1M | -0.36 | 0.19 | -1.92 | 0.0551 . | 0.70 |
y.fav1fav | 0.46 | 0.15 | 2.85 | 0.004 ** | 1.59 |
z.fund1fund | 0.04 | 0.16 | 0.21 | 0.8019 | 1.04 |
z.fund2mod | 0.41 | 0.16 | 2.68 | 0.0086 ** | 1.51 |
Interaksi lainnya | … | … | … | … | … |
Model log-linear homogenous memasukkan semua efek utama dan semua interaksi dua arah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
model_homogenous <- glm(counts ~ x.sex * y.fav + x.sex * z.fund + y.fav * z.fund,
family = poisson(link = "log"),
data = df_saturated)
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ x.sex * y.fav + x.sex * z.fund + y.fav *
## z.fund, family = poisson(link = "log"), data = df_saturated)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 12.449326 0.001698 7331.144 <2e-16 ***
## x.sexP 0.368595 0.001914 192.529 <2e-16 ***
## y.favTidak AK 0.858651 0.001866 460.272 <2e-16 ***
## z.fundPerguruan Tinggi 0.906947 0.001987 456.469 <2e-16 ***
## z.fundSMA/SMK/MA 0.904369 0.001987 455.083 <2e-16 ***
## z.fundSMP/MTs -0.001869 0.002285 -0.818 0.413
## x.sexP:y.favTidak AK -1.095630 0.001565 -700.103 <2e-16 ***
## x.sexP:z.fundPerguruan Tinggi -0.833368 0.002236 -372.680 <2e-16 ***
## x.sexP:z.fundSMA/SMK/MA -0.829788 0.002235 -371.205 <2e-16 ***
## x.sexP:z.fundSMP/MTs 0.002463 0.002401 1.026 0.305
## y.favTidak AK:z.fundPerguruan Tinggi -0.110519 0.002170 -50.933 <2e-16 ***
## y.favTidak AK:z.fundSMA/SMK/MA -0.107555 0.002170 -49.568 <2e-16 ***
## y.favTidak AK:z.fundSMP/MTs 0.002298 0.002419 0.950 0.342
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2902246 on 15 degrees of freedom
## Residual deviance: 59165 on 3 degrees of freedom
## AIC: 59428
##
## Number of Fisher Scoring iterations: 4
Model log-linear conditional pada X (Gender) memasukkan efek utama dan interaksi dua arah antara X dengan Y (AK) dan X dengan Z (Pendidikan), tanpa interaksi antara Y dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \] #### Data
# Simulasi Gender udah ada di df_ak, variabel AK dan Pendidikan juga udah oke
# Data awal kamu
Pendidikan <- c("SD", "SMP", "SMA", "PT")
Total_2023 <- c(1144695, 1532001, 3874632, 1771585)
Persen_AK_2023 <- c(55.76, 46.86, 66.95, 75.54)
AK <- round(Total_2023 * Persen_AK_2023 / 100)
Bukan_AK <- Total_2023 - AK
data_ak <- data.frame(Pendidikan, Total_2023, AK, Bukan_AK)
library(dplyr)
library(tidyr)
# Expand baris AK dan Bukan_AK jadi observasi individual
df_ak <- data_ak %>%
rowwise() %>%
do({
data.frame(
Pendidikan = rep(.$Pendidikan, .$AK + .$Bukan_AK),
AK = c(rep("AK", .$AK), rep("Bukan_AK", .$Bukan_AK))
)
}) %>%
ungroup()
# Tambahkan Gender secara acak
set.seed(123)
df_ak$Gender <- sample(c("L", "P"), size = nrow(df_ak), replace = TRUE)
tab3d <- table(Gender = df_ak$Gender,
AK = df_ak$AK,
Pendidikan = df_ak$Pendidikan)
# Ubah ke format data frame untuk model glm()
counts <- as.vector(tab3d)
Gender <- rep(dimnames(tab3d)$Gender, each = 2 * 4)
AK <- rep(rep(dimnames(tab3d)$AK, each = 4), times = 2)
Pendidikan <- rep(dimnames(tab3d)$Pendidikan, times = 2 * 2)
df_loglin <- data.frame(counts, Gender = factor(Gender),
AK = factor(AK),
Pendidikan = factor(Pendidikan))
model_homogenous <- glm(counts ~ Gender * AK + Gender * Pendidikan + AK * Pendidikan,
family = poisson(link = "log"),
data = df_loglin)
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ Gender * AK + Gender * Pendidikan + AK *
## Pendidikan, family = poisson(link = "log"), data = df_loglin)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 13.4097891 0.0011439 11722.606 <2e-16 ***
## GenderP 0.6683490 0.0013530 493.981 <2e-16 ***
## AKBukan_AK -0.7264479 0.0016726 -434.324 <2e-16 ***
## PendidikanSD -0.0014311 0.0015659 -0.914 0.361
## PendidikanSMA -1.1110246 0.0020515 -541.575 <2e-16 ***
## PendidikanSMP -1.1078525 0.0020502 -540.364 <2e-16 ***
## GenderP:AKBukan_AK -0.5697550 0.0015739 -361.991 <2e-16 ***
## GenderP:PendidikanSD 0.0011220 0.0018114 0.619 0.536
## GenderP:PendidikanSMA 0.3977212 0.0022107 179.905 <2e-16 ***
## GenderP:PendidikanSMP 0.3944783 0.0022103 178.474 <2e-16 ***
## AKBukan_AK:PendidikanSD 0.0009101 0.0020069 0.453 0.650
## AKBukan_AK:PendidikanSMA 0.8576285 0.0021853 392.455 <2e-16 ***
## AKBukan_AK:PendidikanSMP 0.8537842 0.0021859 390.581 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2902245.83 on 15 degrees of freedom
## Residual deviance: 402.86 on 3 degrees of freedom
## AIC: 666.2
##
## Number of Fisher Scoring iterations: 3
model_conditional_Gender <- glm(counts ~ Gender + AK + Pendidikan +
Gender:AK + Gender:Pendidikan,
family = poisson(link = "log"),
data = df_loglin)
summary(model_conditional_Gender)
##
## Call:
## glm(formula = counts ~ Gender + AK + Pendidikan + Gender:AK +
## Gender:Pendidikan, family = poisson(link = "log"), data = df_loglin)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 13.305842 0.001110 11983.546 <2e-16 ***
## GenderP 0.680943 0.001382 492.735 <2e-16 ***
## AKBukan_AK -0.436736 0.001199 -364.192 <2e-16 ***
## PendidikanSD -0.001134 0.001423 -0.797 0.425
## PendidikanSMA -0.744625 0.001772 -420.167 <2e-16 ***
## PendidikanSMP -0.743499 0.001772 -419.692 <2e-16 ***
## GenderP:AKBukan_AK -0.491140 0.001533 -320.460 <2e-16 ***
## GenderP:PendidikanSD 0.001021 0.001798 0.568 0.570
## GenderP:PendidikanSMA 0.287212 0.002168 132.500 <2e-16 ***
## GenderP:PendidikanSMP 0.284510 0.002167 131.266 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2902246 on 15 degrees of freedom
## Residual deviance: 307064 on 6 degrees of freedom
## AIC: 307321
##
## Number of Fisher Scoring iterations: 4
Langkah-langkah uji hipotesis menggunakan residual deviance:
# Selisih deviance antar model
Deviance.model <- model_conditional_Gender$deviance - model_homogenous$deviance
Deviance.model
## [1] 306660.7
derajat.bebas <- df.residual(model_conditional_Gender) - df.residual(model_homogenous)
derajat.bebas
## [1] 3
chi.tabel <- qchisq(0.95, df = derajat.bebas)
chi.tabel
## [1] 7.814728
Keputusan <- ifelse(Deviance.model < chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Tolak H0"
Interpretasi: Berdasarkan hasil uji selisih deviance antara model homogenous dan model conditional on gender, diperoleh nilai deviance sebesar 306660.7 dengan derajat bebas 3, yang jauh melebihi nilai kritis chi-square 7.81 pada taraf signifikansi 5%. Karena itu, H₀ ditolak, yang berarti terdapat interaksi signifikan antara pendidikan dan status angkatan kerja (AK), meskipun telah dikendalikan berdasarkan gender. Dengan kata lain, hubungan antara pendidikan dan partisipasi dalam angkatan kerja tidak bersifat homogen di seluruh kategori gender. ## 19 UJI MODEL INTERAKSI DUA ARAH (HOMOGENOUS VS CONDITIONAL ON Y) ### 19.1 Model Conditional on Y Model log-linear conditional pada Y (AK) memasukkan efek utama dan interaksi dua arah antara Gender dengan AK dan AK dengan Pendidikan, tanpa interaksi antara Gender dengan Pendidikan maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
# Conditional Association on Y (AK)
model_conditional_Y <- glm(counts ~ Gender + AK + Pendidikan +
Gender:AK + AK:Pendidikan,
family = poisson(link = "log"),
data = df_loglin)
summary(model_conditional_Y)
##
## Call:
## glm(formula = counts ~ Gender + AK + Pendidikan + Gender:AK +
## AK:Pendidikan, family = poisson(link = "log"), data = df_loglin)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 13.3328266 0.0009465 14087.045 <2e-16 ***
## GenderP 0.7825761 0.0009069 862.867 <2e-16 ***
## AKBukan_AK -0.7552717 0.0016943 -445.779 <2e-16 ***
## PendidikanSD -0.0006892 0.0010086 -0.683 0.494
## PendidikanSMA -0.8311857 0.0012945 -642.076 <2e-16 ***
## PendidikanSMP -0.8304249 0.0012942 -641.658 <2e-16 ***
## GenderP:AKBukan_AK -0.4911396 0.0015326 -320.460 <2e-16 ***
## AKBukan_AK:PendidikanSD 0.0007570 0.0019917 0.380 0.704
## AKBukan_AK:PendidikanSMA 0.8059158 0.0021594 373.209 <2e-16 ***
## AKBukan_AK:PendidikanSMP 0.8024681 0.0021602 371.485 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2902246 on 15 degrees of freedom
## Residual deviance: 64241 on 6 degrees of freedom
## AIC: 64498
##
## Number of Fisher Scoring iterations: 4
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance
Deviance.model
## [1] 63838.09
derajat.bebas <- df.residual(model_conditional_Y) - df.residual(model_homogenous)
derajat.bebas
## [1] 3
chi.tabel <- qchisq(0.95, df = derajat.bebas)
chi.tabel
## [1] 7.814728
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Tolak H0"
Interpretasi: Karena nilai Deviance.model = 63838.09 jauh lebih besar daripada nilai kritis chi-square tabel 7.81 dengan derajat bebas 3, maka keputusan uji adalah “Tolak H0”. #### Kesimpulan Pada taraf nyata 5%, terdapat bukti yang signifikan untuk menolak H₀. Artinya, terdapat interaksi antara jenis kelamin (Gender) dan tingkat pendidikan (Pendidikan) yang memengaruhi status partisipasi angkatan kerja (AK). Dengan demikian, model homogenous belum cukup, dan perlu mempertimbangkan adanya interaksi antara Gender dan Pendidikan dalam model log-linear.
# Deviance of Model
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance # model_conditional_Y: conditional on Y
Deviance.model
## [1] 63838.09
# Hitung Derajat Bebas
derajat.bebas <- df.residual(model_conditional_Y) - df.residual(model_homogenous)
derajat.bebas
## [1] 3
# Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 7.814728
# Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi Karena nilai Deviance.model = 63838.09 jauh lebih besar dari nilai kritis chi-square tabel 7.81 pada derajat bebas 3 dan taraf signifikansi 5%, maka keputusan uji adalah “Tolak H₀”.
Kesimpulan: Dengan demikian, terdapat interaksi yang signifikan antara jenis kelamin (Gender) dan tingkat pendidikan (Pendidikan) yang memengaruhi status angkatan kerja (AK). Artinya, model conditional on AK saja belum cukup, dan model yang mempertimbangkan interaksi antara Gender × Pendidikan perlu dipertahankan karena secara statistik memberikan informasi tambahan yang signifikan.
Model log-linear conditional pada Pendidikan (Z) memasukkan efek utama dan interaksi dua arah antara Gender × Pendidikan dan AK × Pendidikan, tanpa interaksi antara Gender × AK maupun interaksi tiga arah. \[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# Conditional Association on Z (Pendidikan)
model_conditional_Z <- glm(counts ~ Gender + AK + Pendidikan +
Gender:Pendidikan + AK:Pendidikan,
family = poisson(link = "log"),
data = df_loglin)
summary(model_conditional_Z)
##
## Call:
## glm(formula = counts ~ Gender + AK + Pendidikan + Gender:Pendidikan +
## AK:Pendidikan, family = poisson(link = "log"), data = df_loglin)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 13.508069 0.001068 12642.365 <2e-16 ***
## GenderP 0.515684 0.001271 405.770 <2e-16 ***
## AKBukan_AK -1.064938 0.001408 -756.205 <2e-16 ***
## PendidikanSD -0.001328 0.001512 -0.879 0.379
## PendidikanSMA -1.020417 0.001944 -524.874 <2e-16 ***
## PendidikanSMP -1.017791 0.001943 -523.784 <2e-16 ***
## GenderP:PendidikanSD 0.001021 0.001798 0.568 0.570
## GenderP:PendidikanSMA 0.287212 0.002168 132.500 <2e-16 ***
## GenderP:PendidikanSMP 0.284510 0.002167 131.266 <2e-16 ***
## AKBukan_AK:PendidikanSD 0.000757 0.001992 0.380 0.704
## AKBukan_AK:PendidikanSMA 0.805916 0.002159 373.209 <2e-16 ***
## AKBukan_AK:PendidikanSMP 0.802468 0.002160 371.485 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2902246 on 15 degrees of freedom
## Residual deviance: 131249 on 4 degrees of freedom
## AIC: 131510
##
## Number of Fisher Scoring iterations: 4
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance
Deviance.model
## [1] 130845.8
derajat.bebas <- df.residual(model_conditional_Z) - df.residual(model_homogenous)
derajat.bebas
## [1] 1
chi.tabel <- qchisq(0.95, df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan <- ifelse(Deviance.model > chi.tabel, "Tolak H0", "Terima H0")
Keputusan
## [1] "Tolak H0"
Berdasarkan hasil perhitungan, nilai selisih deviance antara model homogenous dan model conditional on Pendidikan adalah 130845.8 dengan derajat bebas 1. Nilai ini jauh lebih besar dari nilai kritis chi-square sebesar 3.84 pada taraf signifikansi 5%. Karena Deviance.model > chi-square tabel, maka keputusan uji adalah “Tolak H₀”. Artinya, terdapat interaksi yang signifikan antara Gender dan Angkatan Kerja (AK) dalam memengaruhi pola distribusi data. Dengan kata lain, model yang hanya mempertimbangkan interaksi terhadap Pendidikan (tanpa mempertimbangkan interaksi langsung Gender × AK) belum cukup. Interaksi antara jenis kelamin dan status angkatan kerja perlu dimasukkan untuk mendapatkan model yang lebih baik. ### 20.3 Pengujian Hipotesis Interaksi X dan Y (Conditional on Z vs Homogenous)
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance # model_conditional_Z: conditional on Pendidikan
Deviance.model
## [1] 130845.8
# Hitung Derajat Bebas
derajat.bebas <- df.residual(model_conditional_Z) - df.residual(model_homogenous)
derajat.bebas
## [1] 1
# Nilai Chi-Square Tabel
chi.tabel <- qchisq(0.95, df = derajat.bebas)
chi.tabel
## [1] 3.841459
# Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Tolak H0"
Interpretasi Diperoleh nilai Deviance.model = 130845.8 dan derajat bebas = 1, dengan nilai kritis χ²(0.05, 1) = 3.84. Karena 130845.8 > 3.84, maka keputusan uji adalah Tolak H₀. Kesimpulan: Pada taraf nyata 5%, terdapat bukti kuat bahwa ada interaksi signifikan antara gender dan status angkatan kerja (AK), meskipun telah dikendalikan berdasarkan pendidikan. Artinya, model yang menyertakan efek interaksi Gender × AK memberikan fit yang lebih baik dibanding model homogenous. Dengan kata lain, pengaruh pendidikan terhadap status AK berbeda-beda tergantung jenis kelamin individu. ## 21 PEMILIHAN MODEL TERBAIK
# Model Saturated
model_saturated <- glm(counts ~ Pendidikan * Gender * AK,
family = poisson(link = "log"))
aic_saturated <- AIC(model_saturated)
# Model Homogenous
model_homogenous <- glm(counts ~ Pendidikan * Gender + Pendidikan * AK + Gender * AK,
family = poisson(link = "log"))
aic_homogenous <- AIC(model_homogenous)
# Conditional on Gender (X)
model_conditional_Gender <- glm(counts ~ Pendidikan * Gender + Gender * AK +
Pendidikan + AK,
family = poisson(link = "log"))
aic_gender <- AIC(model_conditional_Gender)
# Conditional on AK (Y)
model_conditional_AK <- glm(counts ~ Gender * AK + AK * Pendidikan +
Gender + Pendidikan,
family = poisson(link = "log"))
aic_ak <- AIC(model_conditional_AK)
# Conditional on Pendidikan (Z)
model_conditional_Pendidikan <- glm(counts ~ Gender * Pendidikan + AK * Pendidikan +
Gender + AK,
family = poisson(link = "log"))
aic_pendidikan <- AIC(model_conditional_Pendidikan)
# Ringkasan deviance dan AIC
data.frame(
Model = c("Saturated", "Homogenous", "Conditional on Gender",
"Conditional on AK", "Conditional on Pendidikan"),
Deviance = c(deviance(model_saturated), deviance(model_homogenous),
deviance(model_conditional_Gender), deviance(model_conditional_AK),
deviance(model_conditional_Pendidikan)),
Jumlah_Parameter = c(length(coef(model_saturated)), length(coef(model_homogenous)),
length(coef(model_conditional_Gender)), length(coef(model_conditional_AK)),
length(coef(model_conditional_Pendidikan))),
DF = c(df.residual(model_saturated), df.residual(model_homogenous),
df.residual(model_conditional_Gender), df.residual(model_conditional_AK),
df.residual(model_conditional_Pendidikan)),
AIC = c(aic_saturated, aic_homogenous, aic_gender, aic_ak, aic_pendidikan)
)
uji_interaksi <- data.frame(
Interaksi = c("XYZ", "YZ", "XZ", "XY"),
Pengujian = c("Saturated vs Homogenous",
"Conditional on Gender vs Homogenous",
"Conditional on AK vs Homogenous",
"Conditional on Pendidikan vs Homogenous"),
Delta_Deviance = c(deviance(model_homogenous) - deviance(model_saturated),
deviance(model_conditional_Gender) - deviance(model_homogenous),
deviance(model_conditional_AK) - deviance(model_homogenous),
deviance(model_conditional_Pendidikan) - deviance(model_homogenous)),
Delta_df = c(df.residual(model_homogenous) - df.residual(model_saturated),
df.residual(model_conditional_Gender) - df.residual(model_homogenous),
df.residual(model_conditional_AK) - df.residual(model_homogenous),
df.residual(model_conditional_Pendidikan) - df.residual(model_homogenous))
)
uji_interaksi$Chi_Square_Crit <- qchisq(0.95, df = uji_interaksi$Delta_df)
uji_interaksi$Keputusan <- ifelse(uji_interaksi$Delta_Deviance > uji_interaksi$Chi_Square_Crit,
"Tolak H0", "Tidak Tolak H0")
uji_interaksi$Keterangan <- ifelse(uji_interaksi$Keputusan == "Tolak H0",
"ada interaksi", "tidak ada")
uji_interaksi
Model terbaik dipilih berdasarkan kombinasi antara nilai deviance yang kecil dan AIC terendah. Berdasarkan hasil, model homogenous adalah model terbaik karena tidak mengandung interaksi tiga arah namun tetap mempertahankan seluruh interaksi dua arah yang signifikan.
cat("Model terbaik:\n")
## Model terbaik:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + lambda^Y_j + lambda^Z_k + lambda^{XY}_{ij} + lambda^{XZ}_{ik} + lambda^{YZ}_{jk}") \] Model terbaik adalah model homogenous yang menyertakan semua interaksi dua arah tanpa interaksi tiga arah. ## 22 MODEL TERBAIK
Model terbaik dipilih berdasarkan pengujian interaksi yang signifikan, yaitu hanya interaksi dua arah antara Gender (X) dan AK_bin (Y):
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
# Tambahin satu dummy data buat contoh (hati-hati ini cuma biar model jalan)
data_3d <- rbind(
data_3d,
data.frame(
Pendidikan = "SMA/SMK/MA",
Total = NA,
Persen = NA,
Tidak = NA,
AK = 1,
Ikut = NA,
Gender = "L", # atau "p" kalau mau Perempuan
AK_bin = "AK"
)
)
data_3d$Gender <- factor(data_3d$Gender)
data_3d$AK_bin <- factor(data_3d$AK_bin)
data_3d$Pendidikan <- factor(data_3d$Pendidikan)
data_3d$counts <- rep(1, nrow(data_3d))
bestmodel <- glm(counts ~ Gender + AK_bin + Pendidikan + Gender:AK_bin,
family = poisson(link = "log"),
data = data_3d)
print(bestmodel)
##
## Call: glm(formula = counts ~ Gender + AK_bin + Pendidikan + Gender:AK_bin,
## family = poisson(link = "log"), data = data_3d)
##
## Coefficients:
## (Intercept) GenderL
## -3.023e-17 -8.349e-19
## AK_binAK PendidikanSMP/MTs
## 1.030e-17 5.693e-18
## PendidikanSMA/SMK/MA PendidikanPerguruan Tinggi
## -7.677e-18 2.067e-17
## GenderL:AK_binAK
## -4.120e-17
##
## Degrees of Freedom: 8322913 Total (i.e. Null); 8322907 Residual
## Null Deviance: 0
## Residual Deviance: 4.383e-10 AIC: 16650000
Model terbaik menunjukkan akurasi sebesar 90,4% dengan sensitivitas sempurna (1) namun spesifisitas nol, yang berarti model sangat baik dalam mengklasifikasikan kategori “AK” tapi gagal membedakan “Tidak AK”. Nilai AUC sebesar 0,7013 mengindikasikan performa klasifikasi yang cukup baik, meskipun pseudo R-squared (Cox-Snell: 0,0404; Nagelkerke: 0,0862; McFadden: 0,0652) masih tergolong rendah, menandakan variasi yang dijelaskan oleh model masih terbatas. Koefisien yang signifikan pada tingkat pendidikan menunjukkan semakin tinggi pendidikan, semakin besar jumlah yang termasuk AK, khususnya pada jenjang SMA/SMK/MA. Residual deviance yang sangat kecil dibandingkan null deviance menunjukkan model sangat sesuai terhadap data, dan AIC yang rendah (154,6) menguatkan bahwa model ini cukup efisien. ## 23 INTERPRETASI KOEFISIEN MODEL TERBAIK
# Tabel koefisien dan nilai odds (exp(koef))
koef_summary <- data.frame(
Koefisien = round(coef(bestmodel), 3),
Odds = round(exp(coef(bestmodel)), 3)
)
knitr::kable(koef_summary, caption = "Koefisien dan Odds dari Model Terbaik")
Koefisien | Odds | |
---|---|---|
(Intercept) | 0 | 1 |
GenderL | 0 | 1 |
AK_binAK | 0 | 1 |
PendidikanSMP/MTs | 0 | 1 |
PendidikanSMA/SMK/MA | 0 | 1 |
PendidikanPerguruan Tinggi | 0 | 1 |
GenderL:AK_binAK | 0 | 1 |
exp(\(\hat{\lambda}^{Gender}_{\text{Laki-Laki}}\)) = exp(-0.365) = 0.694 → odds > Tanpa memperhatikan tingkat pendidikan dan status AK, peluang seseorang berjenis kelamin Laki-laki adalah 0.694 kali dibandingkan Perempuan. Artinya, peluang seseorang Perempuan adalah sekitar 1.44 kali dibandingkan Laki-laki.
exp(\(\hat{\lambda}^{Pendidikan}_{\text{SMP/MTs}}\)) = exp(0.313) = 1.368 → odds > Tanpa memperhatikan gender dan status AK, peluang individu lulusan SMP/MTs adalah 1.368 kali dibandingkan lulusan SD/MI.
exp(\(\hat{\lambda}^{Pendidikan}_{\text{SMA/MA}}\)) = exp(1.174) = 3.234 → odds > Tanpa memperhatikan gender dan status AK, peluang individu lulusan SMA/MA adalah 3.23 kali dibandingkan lulusan SD/MI.
exp(\(\hat{\lambda}^{Pendidikan}_{\text{PT}}\)) = exp(1.523) = 4.585 → odds > Tanpa memperhatikan gender dan status AK, peluang individu lulusan Perguruan Tinggi adalah 4.585 kali dibandingkan lulusan SD/MI.
exp(\(\hat{\lambda}^{Gender:AK_bin}_{\text{Laki-Laki:AK}}\)) = exp(0.597) = 1.817 → odds ratio > Tanpa memperhatikan pendidikan, odds menjadi AK bagi laki-laki adalah 1.82 kali lebih besar dibandingkan odds menjadi AK bagi perempuan.
Catatan: Interpretasi ini hanya berlaku jika model
bestmodel
sudah sesuai (berdasarkan hasil yang kamu dapat
dengan Poisson GLM dan faktor yang memiliki dua atau lebih level).
## 24 NILAI DUGAAN MODEL TERBAIK
# Fitted values dari model terbaik berdasarkan data kamu
data.frame(
Gender = data_3d$Gender,
AK_bin = data_3d$AK_bin,
Pendidikan = data_3d$Pendidikan,
Observed = data_3d$counts,
Fitted = round(bestmodel$fitted.values, 2)
)
Secara manual, nilai fitted value diperoleh dengan rumus:
\[ \hat{\mu}_{ijk} = \exp(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij}) \]
Contoh perhitungan:
# Ambil koefisien dari model terbaik
coef <- coef(bestmodel)
# Contoh perhitungan fitted value secara manual untuk satu kombinasi:
mu_manual <- exp(coef["(Intercept)"] +
coef["GenderPerempuan"] +
coef["AK_binAK"] +
coef["PendidikanSMA/SMK/MA"])
mu_manual
## (Intercept)
## NA
• Agresti, A. (2013). Categorical Data Analysis. John Wiley & Sons. • Agresti, A. (2019). An Introduction to Categorical Data Analysis. Wiley. • Christensen, R. (1997). Log-Linear Models and Logistic Regression. Springer. • Fisher, R. A. (1935). The Design of Experiments. Oliver and Boyd. • Fox, J. (2008). Applied Regression Analysis and Generalized Linear Models. • Howell, D. C. (2012). Statistical Methods for Psychology (8th ed.). Cengage Learning. • Mehta, C. R., & Patel, N. R. (1983). A Network Algorithm for Performing Fisher’s Exact Test in r × c Contingency Tables. Journal of the American Statistical Association, 78(382), 427–434. • Modul ADK, Pertemuan 14. (2021). Universitas Padjadjaran. • Dobson, A. J., & Barnett, A. G. (2018). An Introduction to Generalized Linear Models (4th ed.). Chapman and Hall/CRC. • Hilbe, J. M. (2009). Logistic Regression Models. Chapman and Hall/CRC. • Liao, T. F. (1994). Interpreting Probability Models: Logit, Probit, and Other Generalized Linear Models. Sage Publications. • Powers, D. M. W. (2011). Evaluation: From Precision, Recall and F-Measure to ROC, Informedness, Markedness & Correlation. Journal of Machine Learning Technologies, 2(1), 37–63. • Menard, S. (2002). Applied Logistic Regression Analysis (2nd ed.). Sage Publications.