Puji dan syukur saya panjatkan ke hadirat Tuhan Yang Maha Esa, karena atas rahmat dan karunia-Nya, buku Analisis Data Kategorik ini akhirnya dapat terselesaikan dengan baik. Buku ini merupakan salah satu output dari mata kuliah Analisis Data Kategori saya selama kuliah. Penulisan dan penyusunan naskah ini tidak lepas dari dukungan, arahan, serta bantuan banyak pihak yang sangat berarti bagi saya.
Secara khusus, saya mengucapkan terima kasih yang tulus kepada Bapak I Gede Nyoman Mindra Jaya, selaku dosen pengampu mata kuliah, atas bimbingan, motivasi, dan inspirasi yang beliau berikan. Kejelasan konsep, dorongan semangat, dan diskusi–diskusi mendalam tentang data kategorik telah menjadi fondasi utama keberhasilan penulisan ini.
Saya juga berterima kasih kepada rekan–rekan mahasiswa yang selalu suportif, baik secara langsung maupun tidak langsung. Saran konstruktif, kerja sama dalam diskusi kelompok, dan bantuan teknis yang kalian berikan betapapun kecil membantu saya melewati setiap tahap pengerjaan.
Akhirnya, saya berharap buku ini dapat menjadi sumber ilmu dan inspirasi bagi mahasiswa, peneliti, maupun praktisi yang berkecimpung di bidang analisis data kategorik. Segala kekurangan dalam naskah ini sepenuhnya menjadi tanggung jawab saya. Kritik dan masukan membangun akan sangat saya hargai demi penyempurnaan karya ini di masa mendatang.
Jatinangor, 24 Juni 2025 Peter Taniwan
Analisis Data Kategori adalah bagian dari statistika yang digunakan untuk melihat hubungan antara variabel-variabel yang berupa kategori (jenis kelamin, status pernikahan, dll), variabel angka (kayak umur, penghasilan), atau gabungan dari keduanya. Ilmu ini sering dipakai buat menganalisis masalah-masalah di bidang kesehatan (biomedik) dan sosial yang semakin rumit.
Dalam mata kuliah ini, kita belajar model-model statistik yang bisa digunakan saat data kita punya sifat tertentu, misalnya error-nya mengikuti distribusi khusus (disebut distribusi keluarga eksponensial).
Data kategori itu sendiri adalah data yang bentuknya kelompok, bukan angka yang bisa diukur terus-menerus. Contohnya kayak: laki-laki/perempuan, menikah/belum menikah, atau tingkat pendidikan. Karena bentuk datanya beda dari data angka, cara ngolahnya juga beda. Kita pakai metode khusus seperti tabel silang (tabel kontingensi), uji chi-square, dan regresi logistik.
Sekarang, analisis data kategori ini nggak cuma dipakai di riset akademik, tapi juga udah banyak dimanfaatkan di dunia teknologi, misalnya buat analisis data besar (big data) atau kecerdasan buatan (AI), untuk nemuin pola dan tren dalam data.
Analisis data kategori memiliki beberapa tujuan utama yang sangat penting, khususnya dalam bidang biomedik, sosial, dan ilmu terapan lainnya. Berikut adalah tujuan-tujuan tersebut:
Untuk mengetahui apakah ada keterkaitan atau pengaruh antara dua atau lebih variabel yang bersifat kategori, seperti hubungan antara jenis kelamin dan preferensi produk.
Untuk menilai seberapa kuat dan ke arah mana hubungan antara kategori, misalnya melalui odds ratio dalam regresi logistik.
Menguji Hipotesis tentang Independensi
Variabel
Dengan uji statistik seperti uji chi-square, kita dapat menguji apakah
dua variabel kategori saling independen atau tidak.
Memprediksi Kategori Respon Berdasarkan Variabel
Lain
Melalui model seperti regresi logistik, kita bisa memprediksi
kemungkinan suatu individu berada dalam kategori tertentu berdasarkan
karakteristik lainnya.
Menghasilkan Informasi yang Relevan untuk Pengambilan
Keputusan
Hasil dari analisis dapat digunakan sebagai dasar pengambilan keputusan
dalam berbagai bidang, seperti kesehatan, pemasaran, pendidikan, dan
kebijakan publik.
Mengadaptasi Model Analisis yang Sesuai dengan Sifat
Data
Karena data kategori memiliki karakteristik khusus (nominal/ordinal),
analisis ini bertujuan menggunakan metode yang tepat agar hasilnya valid
dan bermakna.
Mendukung Pengembangan Teknologi Analitik
Dalam era big data dan machine learning, analisis data kategori menjadi
dasar penting dalam pemrosesan data non-numerik untuk aplikasi prediktif
dan klasifikasi.
Analisis Data Kategori adalah teknik statistik yang digunakan untuk menganalisis data yang berbentuk kategorik, yaitu data yang disusun dalam bentuk kategori atau kelompok, bukan dalam bentuk angka yang kontinu. Teknik ini sangat berguna dalam berbagai bidang seperti ilmu sosial, kesehatan, pemasaran, dan pendidikan, di mana banyak variabel yang diukur bersifat non-numerik.
Data kategorik memiliki ciri khas yaitu hanya mengelompokkan objek ke dalam beberapa kategori tanpa (atau dengan) mengindikasikan tingkat atau urutan. Karena karakteristiknya berbeda dari data kontinu, maka analisis terhadap data ini membutuhkan pendekatan dan metode statistik tersendiri, seperti tabel kontingensi, uji chi-square, regresi logistik, dan model-model lain dalam keluarga Generalized Linear Model (GLM).
Ruang lingkup dalam analisis data kategori mencakup berbagai jenis data dan pendekatan analisis, antara lain:
Analisis Deskriptif
Menyajikan data dalam bentuk frekuensi dan persentase.
Uji Asosiasi dan Independensi
Menggunakan tabel kontingensi dan uji chi-square untuk melihat hubungan
antar variabel kategorik.
Model Prediktif
Seperti regresi logistik (biner, multinomial, ordinal) untuk memprediksi
probabilitas suatu kejadian berdasarkan variabel-variabel kategorik
maupun kontinu.
Data dalam statistika secara umum dapat dibedakan menjadi dua jenis utama, yaitu data kategorik dan data numerik (kuantitatif). Keduanya memiliki sifat, fungsi, dan metode analisis yang berbeda.
Data kategorik adalah data yang nilainya berupa kategori atau label, bukan angka yang memiliki nilai matematis yang dapat dijumlahkan atau diukur secara kontinu. Data ini digunakan untuk mengelompokkan objek ke dalam beberapa kelas atau kelompok.
Contoh: - Jenis kelamin: laki-laki, perempuan - Status pernikahan: belum menikah, menikah, cerai - Tingkat kepuasan: sangat tidak puas, puas, sangat puas
Ciri-ciri data kategorik: - Tidak dapat diukur dengan satuan numerik yang kontinu - Bisa bersifat nominal (tidak berurutan) atau ordinal (berurutan) - Umumnya dianalisis dengan frekuensi, proporsi, uji chi-square, dan regresi logistik
Catatan: Data kategorik berbeda dari data kuantitatif karena tidak dapat diukur dalam skala numerik kontinu.
Data numerik adalah data yang nilainya berupa angka, dan bisa dihitung atau diukur dengan satuan tertentu. Data ini memungkinkan dilakukan operasi matematika seperti penjumlahan, pengurangan, rata-rata, dsb.
Contoh: - Tinggi badan: 170 cm, 165 cm - Berat badan: 60 kg, 75 kg - Usia: 20 tahun, 25 tahun
Ciri-ciri data numerik: - Dapat diukur secara kontinu atau diskrit - Bisa dianalisis menggunakan metode statistik parametrik seperti uji-t, ANOVA, regresi linier, dan sebagainya
| Aspek | Data Kategorik | Data Numerik |
|---|---|---|
| Nilai | Kategori / label | Angka / numerik |
| Satuan ukur | Tidak ada | Ada (misalnya cm, kg, tahun) |
| Operasi matematis | Tidak bisa (misalnya rata-rata) | Bisa (rata-rata, sd, dll) |
| Contoh | Jenis kelamin, warna, status | Usia, tinggi, penghasilan |
| Metode analisis | Uji chi-square, regresi logistik | Uji-t, ANOVA, regresi linier |
Analisis data kategori merupakan alat penting dalam menggali informasi dari data yang bersifat kualitatif. Jenis analisis ini tidak hanya dipelajari secara teoritis, tetapi juga sangat luas diterapkan dalam dunia nyata, mulai dari riset sosial hingga pengambilan keputusan strategis di industri. Berikut beberapa bidang yang banyak memanfaatkan analisis data kategori:
Analisis data kategori membantu peneliti sosial untuk mengidentifikasi pola dan hubungan antara faktor-faktor demografis, budaya, dan perilaku. Contohnya:
Dalam bidang kesehatan, data kategorik digunakan untuk mengelompokkan pasien, mengevaluasi efektivitas pengobatan, dan memahami faktor risiko penyakit. Misalnya:
Bisnis modern sangat bergantung pada data kategori untuk memahami segmentasi pasar dan mengembangkan strategi yang sesuai. Contoh penerapannya:
Lembaga pendidikan menggunakan data kategorik untuk menilai efektivitas sistem pembelajaran serta memahami kebutuhan mahasiswa. Beberapa penerapan di antaranya:
Pemerintah memanfaatkan data kategori untuk membuat keputusan yang responsif terhadap kebutuhan masyarakat. Misalnya:
Data kategori juga berguna dalam analisis pola kriminalitas dan perumusan strategi keamanan. Contohnya:
Dengan pesatnya perkembangan teknologi, data kategorik semakin banyak digunakan dalam bidang digital. Contoh:
Dalam dunia olahraga, data kategori digunakan untuk mengevaluasi performa atlet dan mengembangkan strategi pelatihan. Misalnya:
Analisis data kategori juga relevan dalam studi lingkungan hidup, seperti:
Analisis data kategori memungkinkan pengambilan keputusan yang lebih tajam dan kontekstual. Dengan memahami penerapannya di berbagai sektor, mahasiswa dapat melihat nilai praktis dari teori yang dipelajari di kelas.
Terdapat beberapa metode yang umumnya digunakan dalam Analisis Data Kategori, tergantung pada tujuan penelitian, antara lain:
Metode ini digunakan untuk menguji ada atau tidaknya hubungan antara dua variabel kategori.
Contoh: Menguji apakah tingkat pendidikan berhubungan dengan status pekerjaan individu.
Kegunaan:
Regresi logistik adalah teknik yang digunakan untuk memprediksi probabilitas terjadinya suatu peristiwa yang dikategorikan berdasarkan variabel kategori lainnya.
Contoh: Memahami kemungkinan seorang pelanggan untuk membeli produk berdasarkan kategori preferensi mereka.
2.2.1 Kegunaan:
Analisis ini digunakan untuk mengidentifikasi dan menggambarkan hubungan antara berbagai kategori dalam satu dataset.
Contoh: Analisis preferensi makanan di berbagai kelompok usia untuk memahami pola konsumsi.
2.3.1 Kegunaan:
Decision Tree dan Random Forest adalah metode pembelajaran mesin yang umum digunakan untuk klasifikasi data berbasis kategori.
Contoh: Mengklasifikasikan pelanggan berdasarkan tingkat loyalitas mereka menggunakan model pohon keputusan.
2.4.1 Kegunaan:
Analisis data kategori merupakan komponen penting dalam statistik yang memiliki banyak aplikasi di berbagai bidang. Dengan penggunaan metode yang tepat, analisis ini dapat membantu dalam mengidentifikasi pola, hubungan, serta tren dalam data kategori. Metode-metode seperti uji chi-square, regresi logistik, dan teknik machine learning seperti Decision Tree dan Random Forest terus berkembang seiring dengan kemajuan teknologi, yang memungkinkan pengambilan keputusan berbasis data yang lebih tepat.
Variabel acak kategori adalah variabel yang hanya dapat memiliki sejumlah kategori diskrit sebagai hasilnya. Distribusi probabilitas untuk variabel ini menggambarkan kemungkinan munculnya setiap kategori dalam eksperimen atau penelitian yang dilakukan.
Distribusi Bernoulli digunakan dalam percobaan yang memiliki dua hasil yang mungkin, yaitu sukses atau gagal. Probabilitas untuk setiap hasil ditentukan dengan nilai \(p\), yang merupakan peluang terjadinya sukses, dan \(1-p\), yang merupakan peluang kegagalan.
Fungsi probabilitas distribusi Bernoulli adalah sebagai berikut: \[ P(X = x) = p^x (1 - p)^{1-x}, \quad x \in \{0, 1\} \]
Simbol: - \(X\): Variabel acak biner (hanya 0 atau 1) - \(p\): Probabilitas sukses (X = 1)
Contoh Aplikasi: - Hasil lemparan koin (Kepala = 1, Ekor = 0) - Keberhasilan atau kegagalan dalam uji klinis untuk suatu obat
Kegunaan:
Perhitungan dengan R:
set.seed(123)
bernoulli_sample <- rbinom(n = 10, size = 1, prob = 0.5) # 10 percobaan Bernoulli
bernoulli_sample
## [1] 0 1 0 1 1 0 1 1 1 0
Distribusi Binomial digunakan untuk menghitung probabilitas jumlah keberhasilan dalam sejumlah percobaan yang independen, di mana setiap percobaan hanya memiliki dua kemungkinan hasil: sukses atau gagal. Distribusi ini berguna ketika kita ingin mengetahui kemungkinan jumlah keberhasilan dalam percobaan berulang.
Fungsi probabilitas untuk distribusi Binomial adalah: \[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \] di mana: - \(X\) adalah jumlah keberhasilan yang diamati. - \(n\) adalah jumlah total percobaan. - \(k\) adalah jumlah keberhasilan yang diinginkan. - \(p\) adalah probabilitas sukses dalam satu percobaan. - \(\binom{n}{k}\) adalah kombinasi dari \(n\) percobaan yang diambil \(k\) keberhasilan.
Keterangan: - \(n\): Jumlah total percobaan yang dilakukan. - \(k\): Jumlah keberhasilan yang diharapkan dari percobaan. - \(p\): Probabilitas keberhasilan dalam satu percobaan (misalnya, probabilitas koin menunjukkan kepala). - \(\binom{n}{k}\): Kombinasi, yaitu jumlah cara untuk memilih \(k\) keberhasilan dari \(n\) percobaan.
Contoh Aplikasi:
Kegunaan:
Perhitungan dengan R:
Untuk menghitung nilai dari distribusi Binomial di R, kita dapat
menggunakan fungsi dbinom(), yang menghitung probabilitas
untuk jumlah keberhasilan tertentu.
# Misal kita ingin menghitung probabilitas mendapatkan 3 kepala dalam 10 kali #lemparan koin
n <- 10 # Jumlah percobaan (lemparan koin)
p <- 0.5 # Probabilitas sukses (kepala)
k <- 3 # Jumlah keberhasilan yang diinginkan
# Menghitung probabilitas
probabilitas <- dbinom(k, size = n, prob = p)
probabilitas
## [1] 0.1171875
Selain itu, kita dapat menggunakan rbinom() untuk
menghasilkan sampel acak berdasarkan distribusi Binomial.
# Men-generate 10 sampel dari distribusi binomial dengan n=10 dan p=0.5
set.seed(123)
samples <- rbinom(10, size = n, prob = p)
samples
## [1] 4 6 5 7 7 2 5 7 5 5
Distribusi Multinomial merupakan perluasan dari distribusi Binomial, digunakan ketika percobaan memiliki lebih dari dua kemungkinan hasil. Jika percobaan dilakukan sebanyak \(n\) kali, dan setiap percobaan dapat menghasilkan salah satu dari \(k\) kategori yang berbeda, distribusi multinomial memberikan probabilitas dari setiap kombinasi jumlah kejadian untuk masing-masing kategori.
Fungsi probabilitas untuk distribusi Multinomial adalah: \[ P(X_1 = x_1, X_2 = x_2, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} p_1^{x_1} p_2^{x_2} \dots p_k^{x_k} \] di mana: - \(n\) adalah jumlah total percobaan. - \(x_i\) adalah jumlah kejadian untuk kategori ke-\(i\). - \(p_i\) adalah probabilitas kemunculan kategori ke-\(i\). - \(k\) adalah jumlah kategori yang mungkin muncul dalam percobaan.
Keterangan: - \(n\): Jumlah total percobaan. - \(x_i\): Jumlah kejadian untuk kategori ke-\(i\). - \(p_i\): Probabilitas kemunculan kategori ke-\(i\). - \(k\): Jumlah kategori yang tersedia dalam percobaan.
Contoh Aplikasi:
Kegunaan:
Perhitungan dengan R:
Untuk menghitung probabilitas berdasarkan distribusi Multinomial,
kita dapat menggunakan fungsi dmultinom(). Fungsi ini
digunakan untuk menghitung probabilitas untuk setiap kombinasi kejadian
dari kategori yang ada.
# Misalkan kita memiliki 10 percobaan dan 3 kategori dengan probabilitas
#masing-masing
n <- 10 # Jumlah percobaan
p <- c(0.3, 0.5, 0.2) # Probabilitas untuk masing-masing kategori
x <- c(3, 5, 2) # Jumlah kejadian untuk masing-masing kategori
#Menghitung probabilitas menggunakan distribusi Multinomial
probabilitas_multinomial <- dmultinom(x, size = n, prob = p)
probabilitas_multinomial
## [1] 0.08505
Selain itu, kita dapat menghasilkan sampel acak menggunakan
distribusi Multinomial dengan rmultinom(). Berikut adalah
cara untuk menghasilkan sampel acak berdasarkan distribusi ini.
# Men-generate 1 sampel acak dari distribusi multinomial dengan n=10 dan #probabilitas yang sudah ditentukan
set.seed(123)
samples_multinomial <- rmultinom(1, size = n, prob = p)
samples_multinomial
## [,1]
## [1,] 2
## [2,] 5
## [3,] 3
Distribusi Poisson digunakan untuk menghitung jumlah kejadian dalam suatu interval waktu atau ruang yang tetap, di mana kejadian tersebut terjadi secara independen dan dengan rata-rata kejadian yang konstan dalam interval tersebut. Distribusi ini banyak digunakan dalam situasi di mana kejadian yang jarang terjadi, tetapi jumlah kejadian dalam periode tertentu dapat dihitung.
Fungsi probabilitas untuk distribusi Poisson adalah: \[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \] di mana: - \(X\) adalah jumlah kejadian yang diamati dalam interval waktu atau ruang tertentu. - \(\lambda\) adalah rata-rata kejadian per unit waktu atau ruang. - \(k\) adalah jumlah kejadian yang terjadi dalam interval tersebut. - \(e\) adalah konstanta Euler (sekitar 2.71828).
Contoh Aplikasi:
Kegunaan:
Perhitungan dengan R:
Untuk menghitung probabilitas berdasarkan distribusi Poisson, kita
dapat menggunakan fungsi dpois(), yang digunakan untuk
menghitung probabilitas bahwa suatu jumlah kejadian terjadi dalam
interval waktu atau ruang tertentu.
# Misalkan rata-rata kejadian adalah 3, dan kita ingin menghitung probabilitas #terjadinya 5 kejadian
lambda <- 3 # Rata-rata kejadian
k <- 5 # Jumlah kejadian yang diinginkan
# Menghitung probabilitas menggunakan distribusi Poisson
probabilitas_poisson <- dpois(k, lambda)
probabilitas_poisson
## [1] 0.1008188
Selain itu, kita dapat menggunakan rpois() untuk
menghasilkan sampel acak berdasarkan distribusi Poisson.
# Men-generate 10 sampel acak dari distribusi Poisson dengan rata-rata kejadian 3
set.seed(123)
samples_poisson <- rpois(10, lambda = 3)
samples_poisson
## [1] 2 4 2 5 6 0 3 5 3 3
Dalam penelitian yang menggunakan data kategori, pemilihan strategi sampling sangat berpengaruh terhadap kualitas hasil yang diperoleh, khususnya dalam hal validitas dan keandalan. Desain sampling sebaiknya disesuaikan dengan jenis data serta sasaran dari studi yang dilakukan. Secara umum, pendekatan pengambilan sampel dibagi menjadi dua kelompok besar: prospektif dan retrospektif, yang masing-masing memiliki ciri khas dan teknik tersendiri.
Metode ini dilakukan dengan mengidentifikasi subjek terlebih dahulu, lalu dilakukan observasi secara berkelanjutan untuk mencatat perkembangan variabel yang diamati. Karena peneliti dapat mengendalikan variabel bebas sejak awal, pendekatan ini cocok untuk eksperimen dan studi sebab-akibat.
Eksperimen melibatkan penempatan subjek secara acak ke dalam kelompok perlakuan dan kelompok kontrol. Teknik sampling yang lazim digunakan antara lain:
Studi kohort dilakukan dengan mengikuti sekelompok orang berdasarkan kriteria tertentu selama kurun waktu tertentu. Beberapa teknik sampling yang digunakan antara lain:
Berbeda dengan pendekatan prospektif, metode ini mengandalkan data historis atau kejadian masa lalu. Cocok untuk studi yang menelusuri hubungan antara paparan dan hasil.
Studi ini melibatkan dua kelompok: satu dengan kondisi tertentu (kasus) dan satu tanpa kondisi (kontrol). Teknik sampling yang digunakan:
Menggunakan data yang sudah ada untuk mengelompokkan individu berdasarkan paparan, lalu ditelusuri hasil yang terjadi. Metode sampling yang umum:
Berikut tabel ringkasan yang membandingkan kelebihan dan keterbatasan masing-masing pendekatan:
| Jenis Studi | Pendekatan | Metode Sampling | Kelebihan | Kekurangan |
|---|---|---|---|---|
| Eksperimen | Prospektif | SRS, Stratified, Cluster | Kontrol variabel tinggi, cocok untuk kausalitas | Biaya mahal, perlu pertimbangan etis dan teknis |
| Studi Kohort | Prospektif | Census, Systematic, Matched | Dapat observasi jangka panjang | Potensi kehilangan subjek, waktu lama |
| Studi Kasus-Kontrol | Retrospektif | Purposive, Snowball, Incidence Density | Cepat, efisien untuk kasus langka | Rentan bias, sulit kontrol variabel luar |
| Kohort Retrospektif | Retrospektif | Convenience, Quota, Case-Based | Hemat waktu dan biaya, manfaatkan data historis | Data tidak selalu lengkap atau berkualitas baik |
Desain sampling yang baik bukan hanya soal efisiensi, tetapi juga memastikan temuan bisa dipertanggungjawabkan dan digeneralisasikan. Memahami kapan dan bagaimana menggunakan tiap metode akan sangat membantu dalam menyusun studi yang solid dan berbobot.
Tabel kontingensi 2x2 adalah format dasar yang umum digunakan untuk mengevaluasi hubungan antara dua variabel yang bersifat kategorik. Contohnya seperti hubungan antara tindakan medis dengan kesembuhan pasien, atau kebiasaan merokok dengan risiko kanker paru-paru.
Struktur umum tabel 2x2:
| Kategori (+) | Kategori (-) | Total | |
|---|---|---|---|
| Grup 1 | n11 | n12 | n1. |
| Grup 2 | n21 | n22 | n2. |
| Total | n.1 | n.2 | n |
Merupakan peluang bahwa dua kejadian terjadi bersamaan, misalnya “merokok” dan “mengalami kanker”:
\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
Menggambarkan kemungkinan dari satu variabel tanpa memperhitungkan variabel lain:
\[ P(A_i) = \frac{n_{i.}}{n} \quad , \quad P(B_j) = \frac{n_{.j}}{n} \]
Mengukur peluang suatu kejadian, dengan syarat kejadian lain telah diketahui:
\[ P(B_j|A_i) = \frac{n_{ij}}{n_{i.}} \]
| Kanker (+) | Kanker (-) | Total | |
|---|---|---|---|
| Perokok | 450 | 200 | 650 |
| Bukan Perokok | 50 | 300 | 350 |
| Total | 500 | 500 | 1000 |
# Matriks data
data <- matrix(c(450, 200, 50, 300), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kanker (+)", "Kanker (-)")
rownames(data) <- c("Perokok", "Non-Perokok")
n <- sum(data)
#Peluang gabungan
P_joint <- data / n
#Peluang marginal
P_marginal_baris <- rowSums(data) / n
P_marginal_kolom <- colSums(data) / n
#Peluang bersyarat
P_conditional <- data / rowSums(data)
#Output
list( Peluang_Bersama = P_joint, Peluang_Marginal_Baris = P_marginal_baris, Peluang_Marginal_Kolom = P_marginal_kolom, Peluang_Bersyarat = P_conditional )
## $Peluang_Bersama
## Kanker (+) Kanker (-)
## Perokok 0.45 0.2
## Non-Perokok 0.05 0.3
##
## $Peluang_Marginal_Baris
## Perokok Non-Perokok
## 0.65 0.35
##
## $Peluang_Marginal_Kolom
## Kanker (+) Kanker (-)
## 0.5 0.5
##
## $Peluang_Bersyarat
## Kanker (+) Kanker (-)
## Perokok 0.6923077 0.3076923
## Non-Perokok 0.1428571 0.8571429
Dalam analisis statistik, tabel kontingensi 2x2 digunakan untuk mengeksplorasi hubungan antara dua variabel kategori. Tabel ini memungkinkan kita untuk mengetahui apakah ada hubungan yang signifikan antara dua variabel tersebut.
Dalam tabel 2x2, kita dapat mengukur asosiasi menggunakan ukuran berikut:
Risk Difference (RD) atau Perbedaan Risiko adalah ukuran absolut yang sering digunakan dalam studi epidemiologi. RD menggambarkan selisih antara probabilitas terjadinya suatu kejadian dalam dua kelompok yang berbeda, misalnya antara kelompok yang terpapar dan yang tidak terpapar.
Perhitungan RD dilakukan dengan cara menghitung risiko kejadian dalam setiap kelompok, kemudian mengurangkan risiko kelompok tidak terpapar dari risiko kelompok yang terpapar.
Secara matematis, perhitungan RD dapat ditulis sebagai:
\[ RD = \left( \frac{n11}{n1.} \right) - \left( \frac{n21}{n2.} \right) \]
Dimana: - \(n11\) adalah jumlah kasus yang terjadi pada kelompok 1 (misalnya yang terpapar), - \(n1.\) adalah total jumlah individu dalam kelompok 1, - \(n21\) adalah jumlah kasus yang terjadi pada kelompok 2 (misalnya yang tidak terpapar), - \(n2.\) adalah total jumlah individu dalam kelompok 2.
Interpretasi: - Jika \(RD > 0\), maka kelompok 1 (terpapar) memiliki risiko lebih tinggi dibandingkan dengan kelompok 2 (tidak terpapar). - Jika \(RD < 0\), maka risiko kejadian lebih rendah di kelompok 1 dibandingkan dengan kelompok 2. - Jika \(RD = 0\), maka tidak ada perbedaan risiko antara kedua kelompok.
Relative Risk (RR) atau Risiko Relatif adalah ukuran yang sering digunakan dalam penelitian epidemiologi untuk membandingkan kemungkinan terjadinya suatu peristiwa atau kejadian antara dua kelompok. Dalam hal ini, RR mengukur perbandingan antara kelompok yang terpapar suatu faktor risiko dengan kelompok yang tidak terpapar.
RR memberikan gambaran mengenai seberapa besar kemungkinan kejadian tersebut terjadi pada kelompok yang terpapar dibandingkan dengan kelompok yang tidak terpapar.
Rumus perhitungan Relative Risk (RR) adalah sebagai berikut:
\[ RR = \frac{\left( \frac{n11}{n1.} \right)}{\left( \frac{n21}{n2.} \right)} \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok yang terpapar, - \(n1.\) adalah total jumlah individu dalam kelompok terpapar, - \(n21\) adalah jumlah kejadian pada kelompok yang tidak terpapar, - \(n2.\) adalah total jumlah individu dalam kelompok yang tidak terpapar.
Interpretasi: - Jika \(RR > 1\), maka kejadian lebih sering terjadi pada kelompok yang terpapar. - Jika \(RR < 1\), maka kejadian lebih jarang terjadi pada kelompok yang terpapar. - Jika \(RR = 1\), maka tidak ada perbedaan risiko antara kedua kelompok.
Contoh Perhitungan menggunakan R
Misalkan kita memiliki data mengenai hubungan antara konsumsi alkohol dan kejadian penyakit jantung. Berikut adalah data yang akan digunakan:
| Penyakit Jantung (+) | Penyakit Jantung (-) | Total | |
|---|---|---|---|
| Konsumsi Alkohol | 120 | 80 | 200 |
| Tidak Konsumsi | 30 | 170 | 200 |
| Total | 150 | 250 | 400 |
Dalam contoh ini: - Kelompok 1 adalah orang yang mengonsumsi alkohol, - Kelompok 2 adalah orang yang tidak mengonsumsi alkohol.
Odds Ratio (OR) atau Rasio Odds adalah ukuran yang digunakan dalam analisis statistik untuk membandingkan peluang (odds) terjadinya suatu kejadian antara dua kelompok, misalnya kelompok yang terpapar dan yang tidak terpapar. OR sering digunakan dalam penelitian jenis studi kasus-kontrol, tetapi juga bisa digunakan dalam studi kohort dan eksperimen.
OR mengukur perbandingan odds antara dua kelompok yang berbeda. Odds mengacu pada rasio antara kejadian dan non-kejadian dalam suatu kelompok. Rasio ini berguna untuk menggambarkan kekuatan hubungan antara dua variabel.
Secara matematis, Odds Ratio (OR) dihitung dengan rumus berikut:
\[ OR = \frac{n11 \times n22}{n12 \times n21} \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok 1 yang terpapar, - \(n12\) adalah jumlah non-kejadian pada kelompok 1 yang terpapar, - \(n21\) adalah jumlah kejadian pada kelompok 2 yang tidak terpapar, - \(n22\) adalah jumlah non-kejadian pada kelompok 2 yang tidak terpapar.
Interpretasi: - Jika \(OR > 1\), maka odds kejadian lebih tinggi di kelompok yang terpapar dibandingkan kelompok yang tidak terpapar. - Jika \(OR < 1\), maka odds kejadian lebih rendah di kelompok yang terpapar dibandingkan kelompok yang tidak terpapar. - Jika \(OR = 1\), maka tidak ada perbedaan odds kejadian antara kedua kelompok.
Contoh Perhitungan menggunakan R
Misalkan kita memiliki data tentang hubungan antara paparan polusi udara dan risiko penyakit pernapasan. Berikut adalah data yang digunakan:
| Penyakit Pernapasan (+) | Penyakit Pernapasan (-) | Total | |
|---|---|---|---|
| Paparan Polusi Tinggi | 100 | 150 | 250 |
| Paparan Polusi Rendah | 50 | 200 | 250 |
| Total | 150 | 350 | 500 |
Dalam contoh ini: - Kelompok 1 adalah individu yang terpapar polusi udara tinggi, - Kelompok 2 adalah individu yang terpapar polusi udara rendah.
Ketiga ukuran asosiasi, yaitu Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR), digunakan untuk mengukur hubungan antara dua variabel kategori. Meskipun ketiganya bertujuan untuk menilai kekuatan asosiasi antara dua kelompok, mereka memiliki perbedaan mendasar dalam cara pengukuran dan interpretasinya. Berikut adalah perbandingan dari ketiga ukuran tersebut:
| Ukuran | Definisi | Desain Sampling yang Cocok | Interpretasi |
|---|---|---|---|
| Risk Difference (RD) | Selisih antara probabilitas kejadian suatu peristiwa dalam dua kelompok | Studi kohort atau eksperimen acak | Menunjukkan perbedaan absolut dalam risiko kejadian antara dua kelompok. |
| Relative Risk (RR) | Perbandingan risiko kejadian antara dua kelompok | Studi kohort atau eksperimen klinis | Mengukur seberapa besar risiko relatif pada kelompok terpapar dibandingkan dengan kelompok yang tidak terpapar. |
| Odds Ratio (OR) | Perbandingan odds (peluang) kejadian antara dua kelompok | Studi kasus-kontrol atau studi observasional | Mengukur hubungan antara faktor risiko dan kejadian, dan sering digunakan dalam studi kasus-kontrol. |
Risk Difference (RD) memberikan gambaran tentang perbedaan absolut dalam risiko antara dua kelompok. Ini lebih mudah dipahami karena menunjukkan seberapa besar tambahan atau pengurangan risiko yang terjadi pada kelompok tertentu.
Relative Risk (RR) lebih cocok untuk studi kohort atau eksperimen klinis, karena mengukur kemungkinan relatif dan sering kali lebih berguna untuk menilai kekuatan hubungan antara faktor risiko dan kejadian.
Odds Ratio (OR) lebih banyak digunakan dalam studi kasus-kontrol karena memungkinkan peneliti untuk memperkirakan risiko relatif meskipun data yang digunakan adalah data dari studi retrospektif.
Dengan pemahaman yang lebih baik tentang perbedaan dan aplikasi ketiga ukuran asosiasi ini, peneliti dapat memilih ukuran yang tepat berdasarkan desain penelitian mereka dan tujuan analisis.
Inferensi dalam statistik adalah proses pengambilan kesimpulan atau generalisasi mengenai populasi berdasarkan data sampel. Pada tabel kontingensi dua arah, inferensi digunakan untuk menganalisis hubungan antara dua variabel kategori yang tersusun dalam sebuah matriks distribusi frekuensi. Tujuan utama dari inferensi ini adalah untuk memahami apakah ada hubungan atau asosiasi yang signifikan antara kedua variabel tersebut.
Inferensi dalam tabel kontingensi dua arah dapat dibagi menjadi dua jenis utama:
Estimasi bertujuan untuk memperkirakan parameter yang ada pada populasi dengan menggunakan data sampel. Dalam konteks tabel kontingensi dua arah, estimasi dibagi menjadi dua jenis utama, yaitu estimasi titik dan estimasi interval.
Estimasi titik memberikan nilai tunggal yang digunakan untuk memperkirakan parameter populasi. Dalam tabel kontingensi dua arah, estimasi titik sering kali berupa proporsi kejadian dalam masing-masing kelompok yang ada.
Secara matematis, estimasi titik proporsi untuk kelompok tertentu dapat dihitung dengan rumus:
\[ \hat{p} = \frac{x}{n} \]
Dimana: - \(\hat{p}\) adalah estimasi titik proporsi, - \(x\) adalah jumlah kejadian dalam kategori yang dimaksud, - \(n\) adalah total jumlah individu dalam sampel.
Estimasi interval memberikan rentang nilai yang mengandung parameter populasi dengan tingkat kepercayaan tertentu. Ini lebih informatif karena memberi gambaran seberapa besar kemungkinan parameter yang kita perkirakan berada dalam rentang tersebut.
Rumus untuk estimasi interval proporsi dengan tingkat kepercayaan \(\alpha\) adalah:
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]
Dimana: - \(Z_{\alpha/2}\) adalah nilai dari distribusi normal standar untuk tingkat kepercayaan yang ditentukan, - \(\hat{p}\) adalah estimasi titik proporsi, - \(n\) adalah ukuran sampel.
Uji hipotesis digunakan untuk menguji klaim atau dugaan tentang parameter populasi berdasarkan data sampel yang kita miliki. Dalam analisis data kategori, salah satu jenis uji hipotesis yang sering digunakan adalah Uji Proporsi, yang menguji apakah proporsi kejadian dalam suatu kelompok berbeda secara signifikan dari proporsi yang diharapkan.
Tujuan utama dari uji hipotesis adalah untuk menentukan apakah data yang kita amati cukup kuat untuk menolak hipotesis nol (H₀), yang biasanya menyatakan bahwa tidak ada perbedaan atau tidak ada hubungan antara variabel yang diuji.
ji proporsi digunakan untuk membandingkan proporsi kejadian antara dua kelompok dalam sebuah tabel kontingensi. Tujuan utamanya adalah mengetahui apakah terdapat perbedaan proporsi yang signifikan antara kedua kelompok yang dibandingkan.
Misalkan tabel kontingens 2 x 2 memiliki struktur sebagai berikut:
library(knitr)
library(kableExtra)
# Buat data frame
tabel <- data.frame(
Grup = c("Grup 1", "Grup 2", "Total"),
`Kejadian (+)` = c("$n_{11}$", "$n_{21}$", "$n_{.1}$"),
`Tidak Kejadian (-)` = c("$n_{12}$", "$n_{22}$", "$n_{.2}$"),
Total = c("$n_{1.}$", "$n_{2.}$", "$n$")
)
# Tampilkan tabel dengan kable
kable(
tabel,
booktabs = TRUE,
escape = FALSE,
align = "lccc",
caption = "Tabel Kontingensi 2x2"
) %>%
kable_styling(latex_options = c("hold_position"))
| Grup | Kejadian…. | Tidak.Kejadian…. | Total |
|---|---|---|---|
| Grup 1 | \(n_{11}\) | \(n_{12}\) | \(n_{1.}\) |
| Grup 2 | \(n_{21}\) | \(n_{22}\) | \(n_{2.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | \(n\) |
Untuk menguji apakah proporsi kedua kelompok sama atau berbeda, uji z dua proporsi dapat digunakan. Uji ini dilakukan dengan menetapkan hipotesis nol bahwa tidak ada perbedaan proporsi antara kedua kelompok:
- 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{n_{11}}{n_{1.}} \], \[ \hat{p}_2 = \frac{n_{21}}{n_{2.}} \]
Estimasi proporsi gabungan
\[ \hat{p} = \frac{n_{11} + n_{21}}{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)}} \]
Statistik uji Z pada uji dua proporsi mengikuti distribusi normal baku \(\mathcal{N}(0, 1)\). Nilai p-value diperoleh dengan membandingkan statistik uji terhadap nilai kritis dari distribusi normal tersebut.
Jika nilai absolut \(|z|\) melebihi nilai kritis untuk tingkat signifikansi tertentu \(\alpha\) (misalnya, 1.96 untuk \(\alpha = 0.05\)), maka hipotesis nol dapat ditolak. Artinya, terdapat perbedaan proporsi yang signifikan antara dua kelompok yang dibandingkan.
Uji dua proporsi ini sangat sesuai digunakan dalam penelitian kohort maupun eksperimen klinis, terutama ketika kita ingin mengetahui apakah perbedaan proporsi antar kelompok signifikan secara statistik.
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
library(knitr)
# Definisikan tabel kontingensi
tabel <- data.frame(
Grup = c("Grup 1", "Grup 2", "Total"),
`Kejadian (+)` = c(40, 55, 95),
`Tidak Kejadian (-)` = c(60, 45, 105),
Total = c(100, 100, 200),
check.names = FALSE
)
# Cetak tabel dengan kable
kable(
tabel,
caption = "Tabel Kontingensi – Contoh Data Lain",
booktabs = TRUE,
align = "lccc"
)
| Grup | Kejadian (+) | Tidak Kejadian (-) | Total |
|---|---|---|---|
| Grup 1 | 40 | 60 | 100 |
| Grup 2 | 55 | 45 | 100 |
| Total | 95 | 105 | 200 |
Langkah 1: Proporsi Sampel
\[ \hat{p}_1 = \frac{40}{100} = 0.40 \]
\[ \hat{p}_2 = \frac{55}{100} = 0.55 \]
Langkah 2: Proporsi Gabungan
\[ \hat{p} = \frac{40 + 55}{100 + 100} = \frac{95}{200} = 0.475 \]
Langkah 3: Statistik Uji Z
\[ Z = \frac{\hat{p}_1 - \hat{p}_2} {\sqrt{\hat{p}\,(1-\hat{p})\left(\frac{1}{100}+\frac{1}{100}\right)}} = \frac{0.40 - 0.55}{\sqrt{0.475\,(1-0.475)\times 0.02}} = \frac{-0.15}{\sqrt{0.0049875}} \approx -2.124 \]
Langkah 4: p-value (dua arah)
\[ \text{p-value} = 2 \times P\bigl(Z < -2.124\bigr) \approx 2 \times 0.0168 = 0.0336 \]
Karena p-value = 0.0336 < 0.05, kita menolak \(H_0\), yang berarti terdapat perbedaan proporsi signifikan antara dua grup.
# Verifikasi dengan R
prop_test <- prop.test(
x = c(40, 55),
n = c(100, 100)
)
prop_test
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(40, 55) out of c(100, 100)
## X-squared = 3.9298, df = 1, p-value = 0.04744
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.296847038 -0.003152962
## sample estimates:
## prop 1 prop 2
## 0.40 0.55
Interpretasi: Jika p-value < 0.05, maka terdapat perbedaan proporsi kejadian antara grup 1 dan grup 2.
Uji asosiasi digunakan untuk menguji hubungan antara dua variabel kategori dalam tabel kontingensi. Salah satu tujuan utama dari uji asosiasi adalah untuk mengevaluasi apakah ada hubungan signifikan antara dua variabel yang ada. Dalam uji asosiasi pada tabel kontingensi dua arah, kita sering menggunakan beberapa ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR).
Setiap ukuran asosiasi ini memiliki kegunaan dan interpretasi yang berbeda, tergantung pada jenis data dan tujuan analisis. Berikut adalah penjelasan dan cara perhitungan masing-masing:
Risk Difference (RD)
Risk Difference (RD) atau Perbedaan Risiko adalah ukuran yang menggambarkan perbedaan antara probabilitas kejadian suatu hasil di dua kelompok yang berbeda, seperti antara kelompok yang terpapar dan yang tidak terpapar. RD dihitung dengan mengurangkan risiko kejadian pada kelompok yang tidak terpapar dari risiko pada kelompok yang terpapar.
Rumus perhitungan Risk Difference (RD) adalah:
\[ RD = \left( \frac{n11}{n1.} \right) - \left( \frac{n21}{n2.} \right) \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok 1 (terpapar), - \(n1.\) adalah total jumlah individu dalam kelompok 1, - \(n21\) adalah jumlah kejadian pada kelompok 2 (tidak terpapar), - \(n2.\) adalah total jumlah individu dalam kelompok 2.
Interpretasi: - Jika RD > 0, maka kelompok pertama (terpapar) memiliki risiko lebih tinggi. - Jika RD < 0, maka kelompok pertama (terpapar) memiliki risiko lebih rendah. - Jika RD = 0, maka tidak ada perbedaan risiko antara dua kelompok.
Relative Risk (RR)
Relative Risk (RR) atau Risiko Relatif digunakan untuk membandingkan risiko kejadian antara dua kelompok. RR menghitung seberapa besar kemungkinan suatu peristiwa terjadi pada kelompok yang terpapar dibandingkan dengan kelompok yang tidak terpapar.
Rumus perhitungan Relative Risk (RR) adalah:
\[ RR = \frac{\frac{n11}{n1.}}{\frac{n21}{n2.}} \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok terpapar, - \(n1.\) adalah total individu dalam kelompok terpapar, - \(n21\) adalah jumlah kejadian pada kelompok tidak terpapar, - \(n2.\) adalah total individu dalam kelompok tidak terpapar.
Interpretasi: - Jika RR > 1, maka kejadian lebih sering terjadi pada kelompok terpapar dibandingkan kelompok tidak terpapar. - Jika RR < 1, maka kejadian lebih jarang terjadi pada kelompok terpapar. - Jika RR = 1, maka tidak ada perbedaan risiko antara kedua kelompok.
Odds Ratio (OR)
Odds Ratio (OR) atau Rasio Odds mengukur perbandingan peluang (odds) terjadinya suatu kejadian antara dua kelompok, biasanya kelompok yang terpapar dan tidak terpapar. OR sering digunakan dalam studi kasus-kontrol, namun juga dapat digunakan dalam studi kohort dan eksperimen.
Rumus perhitungan Odds Ratio (OR) adalah:
\[ OR = \frac{n11 \times n22}{n12 \times n21} \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok terpapar, - \(n12\) adalah jumlah non-kejadian pada kelompok terpapar, - \(n21\) adalah jumlah kejadian pada kelompok tidak terpapar, - \(n22\) adalah jumlah non-kejadian pada kelompok tidak terpapar.
Interpretasi: - Jika OR > 1, maka peluang kejadian lebih besar pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar. - Jika OR < 1, maka peluang kejadian lebih kecil pada kelompok terpapar. - Jika OR = 1, maka tidak ada perbedaan peluang kejadian antara kedua kelompok.
Contoh Perhitungan Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) dalam R
Misalkan kita memiliki data mengenai hubungan antara kebiasaan merokok dan penyakit jantung. Berikut adalah data tabel kontingensi dua arah:
| Penyakit Jantung (+) | Penyakit Jantung (-) | Total | |
|---|---|---|---|
| Perokok | 120 | 80 | 200 |
| Bukan Perokok | 30 | 170 | 200 |
| Total | 150 | 250 | 400 |
Dalam contoh ini: - Kelompok 1 adalah perokok, - Kelompok 2 adalah bukan perokok.
Untuk menghitung Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR), kita dapat menggunakan rumus yang telah dijelaskan di atas.
# Data Observasi
n11 <- 120 # Penyakit Jantung (+) pada perokok
n12 <- 80 # Penyakit Jantung (-) pada perokok
n21 <- 30 # Penyakit Jantung (+) pada bukan perokok
n22 <- 170 # Penyakit Jantung (-) pada bukan perokok
# Menghitung Risk Difference (RD)
RD <- (n11 / (n11 + n12)) - (n21 / (n21 + n22))
# Menghitung Relative Risk (RR)
RR <- (n11 / (n11 + n12)) / (n21 / (n21 + n22))
# Menghitung Odds Ratio (OR)
OR <- (n11 * n22) / (n12 * n21)
# Menampilkan hasil perhitungan
list(RD = RD, RR = RR, OR = OR)
## $RD
## [1] 0.45
##
## $RR
## [1] 4
##
## $OR
## [1] 8.5
Ketiga ukuran asosiasi ini memberikan informasi yang berguna tentang hubungan antar variabel kategori. RD lebih cocok digunakan untuk mengetahui perbedaan risiko absolut, RR memberikan gambaran mengenai risiko relatif, dan OR sering digunakan dalam studi kasus-kontrol untuk melihat hubungan antara faktor risiko dan kejadian. Semua ukuran ini sangat penting dalam penelitian epidemiologi, sosial, dan eksperimen klinis untuk mengukur sejauh mana dua variabel berhubungan.
Uji Independensi digunakan untuk menguji apakah dua variabel kategori dalam tabel kontingensi dua arah saling berhubungan atau independen satu sama lain. Uji ini bertujuan untuk melihat apakah terdapat asosiasi yang signifikan antara kedua variabel yang diuji.
Langkah-langkah dalam melakukan Uji Chi-Square untuk Independensi:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Dimana: - \(O\) adalah frekuensi yang diamati (observed frequency), - \(E\) adalah frekuensi yang diharapkan (expected frequency) berdasarkan hipotesis nol.
Contoh Perhitungan Uji Independensi dalam R
Misalkan kita memiliki data mengenai hubungan antara jenis kelamin dan preferensi produk. Berikut adalah data yang digunakan dalam tabel kontingensi dua arah:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Untuk menghitung frekuensi yang diharapkan (E), kita menggunakan rumus:
\[ E_{ij} = \frac{(Total Baris i) \times (Total Kolom j)}{Total Keseluruhan} \]
Frekuensi yang diharapkan untuk setiap sel:
\[ E = \frac{200 \times 180}{400} = 90 \]
\[ E = \frac{200 \times 220}{400} = 110 \]
\[ E = \frac{200 \times 180}{400} = 90 \]
\[ E = \frac{200 \times 220}{400} = 110 \]
Menghitung Nilai Statistik Chi-Square (χ²)
Sekarang kita akan menghitung nilai statistik uji Chi-Square menggunakan rumus:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Dimana \(O\) adalah frekuensi yang diamati dan \(E\) adalah frekuensi yang diharapkan. Menggunakan nilai-nilai yang telah dihitung di atas, kita dapat menghitung kontribusi masing-masing sel.
Perhitungan Chi-Square secara Manual
Untuk sel (Laki-laki, Produk A): \[ \chi^2 = \frac{(80 - 90)^2}{90} = \frac{(-10)^2}{90} = \frac{100}{90} = 1.11 \]
Untuk sel (Laki-laki, Produk B): \[ \chi^2 = \frac{(120 - 110)^2}{110} = \frac{(10)^2}{110} = \frac{100}{110} = 0.91 \]
Untuk sel (Perempuan, Produk A): \[ \chi^2 = \frac{(100 - 90)^2}{90} = \frac{(10)^2}{90} = \frac{100}{90} = 1.11 \]
Untuk sel (Perempuan, Produk B): \[ \chi^2 = \frac{(100 - 110)^2}{110} = \frac{(-10)^2}{110} = \frac{100}{110} = 0.91 \]
Menjumlahkan Semua Kontribusi Chi-Square
Jumlahkan nilai-nilai Chi-Square untuk semua sel:
\[ \chi^2 = 1.11 + 0.91 + 1.11 + 0.91 = 4.04 \]
Membandingkan dengan Nilai Kritis
Dengan menggunakan derajat kebebasan (df), kita dapat membandingkan nilai statistik Chi-Square yang dihitung dengan nilai kritis dari tabel Chi-Square. Derajat kebebasan untuk uji independensi dihitung dengan rumus:
\[ df = (r - 1) \times (c - 1) \]
Dimana: - \(r\) adalah jumlah baris, - \(c\) adalah jumlah kolom.
Dalam kasus ini, \(r = 2\) dan \(c = 2\), sehingga derajat kebebasan adalah:
\[ df = (2 - 1) \times (2 - 1) = 1 \]
Dengan df = 1 dan tingkat signifikansi \(\alpha = 0.05\), kita dapat membandingkan nilai statistik Chi-Square yang dihitung dengan nilai kritis dari tabel Chi-Square untuk df = 1. Nilai kritis pada \(\alpha = 0.05\) adalah 3.841.
Keputusan - Jika nilai Chi-Square yang dihitung (4.04) > nilai kritis (3.841), kita menolak hipotesis nol. - Jika nilai Chi-Square yang dihitung ≤ nilai kritis, kita gagal menolak hipotesis nol.
Karena 4.04 > 3.841, kita menolak hipotesis nol dan menyimpulkan bahwa jenis kelamin berhubungan dengan preferensi produk.
Untuk menguji apakah jenis kelamin berhubungan dengan preferensi produk, kita akan menggunakan Uji Chi-Square untuk independensi dengan R.
# Data Observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Uji Chi-Square untuk independensi
chi_square_test <- chisq.test(data)
# Menampilkan hasil uji Chi-Square
chi_square_test
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 3.6465, df = 1, p-value = 0.05619
Partisi Chi-Square Partisi Chi-Square adalah proses untuk menganalisis kontribusi dari setiap sel dalam tabel kontingensi terhadap statistik Chi-Square total. Dengan kata lain, kita dapat melihat seberapa besar pengaruh masing-masing sel dalam tabel kontingensi terhadap hasil uji Chi-Square.
Untuk mengidentifikasi kontribusi setiap sel terhadap nilai statistik Chi-Square, kita dapat menghitung chi-square untuk setiap sel dengan rumus:
\[ \chi^2 = \frac{(O - E)^2}{E} \]
Dimana: - \(O\) adalah frekuensi yang diamati (observed frequency), - \(E\) adalah frekuensi yang diharapkan (expected frequency).
Setelah menghitung statistik Chi-Square untuk setiap sel, kita dapat membandingkan kontribusi masing-masing sel terhadap total statistik Chi-Square. Sel dengan nilai kontribusi yang lebih besar menunjukkan bahwa kategori tersebut memiliki pengaruh yang lebih signifikan terhadap hasil uji.
Perhitungan Partisi Chi-Square
Mari kita lanjutkan dengan perhitungan kontribusi Chi-Square untuk setiap sel pada contoh sebelumnya yang melibatkan jenis kelamin dan preferensi produk.
Berikut adalah data yang digunakan dalam tabel kontingensi dua arah:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Frekuensi yang diharapkan \(E\) untuk setiap sel telah dihitung sebelumnya, yaitu:
Dengan menggunakan rumus Chi-Square untuk masing-masing sel:
\[ \chi^2 = \frac{(80 - 90)^2}{90} = \frac{(-10)^2}{90} = \frac{100}{90} = 1.11 \]
\[ \chi^2 = \frac{(120 - 110)^2}{110} = \frac{(10)^2}{110} = \frac{100}{110} = 0.91 \]
\[ \chi^2 = \frac{(100 - 90)^2}{90} = \frac{(10)^2}{90} = \frac{100}{90} = 1.11 \]
\[ \chi^2 = \frac{(100 - 110)^2}{110} = \frac{(-10)^2}{110} = \frac{100}{110} = 0.91 \]
Menjumlahkan Partisi Chi-Square
Sekarang, kita akan menghitung jumlah total kontribusi Chi-Square dari semua sel:
\[ \chi^2_{total} = 1.11 + 0.91 + 1.11 + 0.91 = 4.04 \]
Interpretasi Partisi Chi-Square
Dengan menghitung kontribusi Chi-Square untuk setiap sel, kita dapat melihat bahwa sel dengan kontribusi lebih besar akan memiliki pengaruh lebih besar terhadap hasil uji Chi-Square total. Dalam contoh ini, sel \((Laki-laki, Produk A)\) dan \((Perempuan, Produk A)\) memiliki kontribusi yang lebih besar dibandingkan dengan sel \((Laki-laki, Produk B)\) dan \((Perempuan, Produk B)\)
Mari kita hitung frekuensi yang diharapkan (E) untuk setiap sel menggunakan R.
# Data observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung frekuensi yang diharapkan (E)
expected <- prop.table(data, 2) * colSums(data)
expected
## Produk A Produk B
## Laki-laki 80.0000 98.18182
## Perempuan 122.2222 100.00000
# Menghitung kontribusi Chi-Square untuk setiap sel
contribution <- (data - expected)^2 / expected
contribution
## Produk A Produk B
## Laki-laki 0.000000 4.848485
## Perempuan 4.040404 0.000000
# Menjumlahkan kontribusi Chi-Square untuk setiap sel
chi_square_total <- sum(contribution)
chi_square_total
## [1] 8.888889
Interpretasi Partisi Chi-Square
Kontribusi setiap sel dapat menunjukkan seberapa besar pengaruh sel tersebut terhadap hasil uji Chi-Square total. Jika suatu sel memiliki kontribusi yang lebih besar, itu menunjukkan bahwa kategori tersebut lebih signifikan dalam uji Chi-Square.
Uji Likelihood Ratio (G²)
Uji Likelihood Ratio (G²) adalah alternatif dari Uji Chi-Square yang digunakan untuk menguji independensi antara dua variabel kategori dalam tabel kontingensi. Uji ini didasarkan pada perbandingan antara likelihood dari data yang diamati dan likelihood dari data yang diharapkan (jika hipotesis nol berlaku). Uji Likelihood Ratio sering digunakan dalam analisis data kategori karena memiliki beberapa keuntungan, terutama ketika ukuran sampel kecil atau ketika ada nilai-nilai yang sangat kecil dalam tabel.
Langkah-langkah dalam Uji Likelihood Ratio (G²):
\[ G^2 = 2 \sum O_{ij} \ln \left( \frac{O_{ij}}{E_{ij}} \right) \]
Dimana: - \(O_{ij}\) adalah frekuensi yang diamati, - \(E_{ij}\) adalah frekuensi yang diharapkan.
Contoh Perhitungan Uji Likelihood Ratio (G²) dalam R
Misalkan kita memiliki data yang sama dengan contoh sebelumnya mengenai jenis kelamin dan preferensi produk:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Untuk menghitung G², kita perlu menghitung likelihood yang diamati dan likelihood yang diharapkan, dan kemudian menghitung statistik G².
# Data Observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung frekuensi yang diharapkan (E)
expected <- prop.table(data, 2) * colSums(data)
# Menghitung statistik Likelihood Ratio (G²)
g2_statistic <- 2 * sum(data * log(data / expected), na.rm = TRUE)
g2_statistic
## [1] 8.026828
Interpretasi Uji Likelihood Ratio (G²)
Jika nilai G² > nilai kritis (berdasarkan distribusi Chi-Square dengan derajat kebebasan yang sesuai), kita menolak hipotesis nol dan menyimpulkan bahwa ada asosiasi signifikan antara variabel yang diuji.
Jika nilai G² ≤ nilai kritis, kita gagal menolak hipotesis nol dan menyimpulkan bahwa variabel tersebut independen.
Uji Exact Fisher
Uji Exact Fisher adalah metode statistik yang digunakan untuk menguji hubungan antara dua variabel kategori dalam tabel kontingensi 2x2, terutama ketika ukuran sampel kecil atau ketika frekuensi pada beberapa sel sangat kecil (misalnya, kurang dari 5). Uji ini digunakan untuk memeriksa apakah dua variabel kategori independen satu sama lain, dengan asumsi bahwa distribusi data mengikuti distribusi hipergeometrik.
Uji Fisher sangat berguna karena memberikan hasil yang tepat (exact) dan tidak bergantung pada ukuran sampel atau distribusi data. Uji ini sangat sering digunakan untuk data yang tidak memenuhi asumsi uji Chi-Square, khususnya pada tabel yang memiliki nilai-nilai kecil.
Langkah-langkah Uji Exact Fisher:
Menentukan Hipotesis:
Menghitung Nilai P: Uji Fisher menghitung nilai p yang tepat berdasarkan distribusi hipergeometrik, dan mengukur sejauh mana data yang diamati berbeda dari distribusi yang diharapkan berdasarkan hipotesis nol.
Keputusan:
Contoh Perhitungan Uji Exact Fisher dalam R
Misalkan kita memiliki data mengenai hubungan antara jenis kelamin dan preferensi produk (Produk A dan Produk B), dengan data sebagai berikut:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 2 | 8 | 10 |
| Perempuan | 1 | 9 | 10 |
| Total | 3 | 17 | 20 |
Untuk menguji apakah ada asosiasi antara jenis kelamin dan preferensi produk, kita dapat menggunakan Uji Exact Fisher dengan data di atas.
# Data Observasi
data <- matrix(c(2, 8, 1, 9), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Uji Exact Fisher
fisher_test <- fisher.test(data)
# Menampilkan hasil uji Fisher
fisher_test
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 1
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.09511362 147.08910544
## sample estimates:
## odds ratio
## 2.162188
Interpretasi Uji Exact Fisher
Jika nilai p < 0.05, kita menolak hipotesis nol dan menyimpulkan bahwa ada asosiasi signifikan antara jenis kelamin dan preferensi produk.
Jika nilai p ≥ 0.05, kita gagal menolak hipotesis nol, yang berarti tidak ada bukti yang cukup untuk menyatakan bahwa jenis kelamin dan preferensi produk berhubungan.
Analisis Residual digunakan untuk memeriksa apakah ada pola yang tidak terduga dalam data tabel kontingensi. Residual mengukur perbedaan antara frekuensi yang diamati (O) dan frekuensi yang diharapkan (E) dalam tabel. Dengan menganalisis residual, kita dapat mengidentifikasi sel-sel dalam tabel yang memberikan kontribusi signifikan terhadap statistik uji (seperti Chi-Square) dan melihat apakah ada pola ketergantungan yang tidak terlihat sebelumnya.
Residual standar mengukur perbedaan relatif antara frekuensi yang diamati dan frekuensi yang diharapkan, dan dihitung dengan rumus:
\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Dimana: - \(R_{ij}\) adalah residual standar untuk sel \((i, j)\), - \(O_{ij}\) adalah frekuensi yang diamati pada sel \((i, j)\), - \(E_{ij}\) adalah frekuensi yang diharapkan pada sel \((i, j)\).
Jika nilai residual standar lebih besar dari 2 atau lebih kecil dari -2, itu menunjukkan bahwa sel tersebut memberikan kontribusi signifikan terhadap statistik uji dan terdapat perbedaan yang signifikan antara frekuensi yang diamati dan yang diharapkan.
6.3.2 Menghitung Residual Standar dalam R
Misalkan kita menggunakan data yang sama untuk contoh yang telah dibahas sebelumnya mengenai jenis kelamin dan preferensi produk:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Kita akan menghitung residual standar untuk setiap sel dalam tabel kontingensi ini.
# Data Observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung frekuensi yang diharapkan (E)
expected <- prop.table(data, 2) * colSums(data)
# Menghitung residual standar
residuals <- (data - expected) / sqrt(expected)
# Menampilkan residual standar
residuals
## Produk A Produk B
## Laki-laki 0.000000 2.201928
## Perempuan -2.010076 0.000000
Interpretasi Residual Standar
Residual standar digunakan untuk mengevaluasi kontribusi setiap sel dalam tabel kontingensi terhadap statistik uji. Ini memberikan informasi yang lebih kuat tentang seberapa besar perbedaan antara frekuensi yang diamati dan frekuensi yang diharapkan dalam satuan deviasi standar.
Interpretasi residual standar: - Residual standar lebih besar dari 2 atau lebih kecil dari -2: Menunjukkan bahwa sel tersebut memberikan kontribusi yang signifikan terhadap statistik uji Chi-Square, yang berarti ada perbedaan signifikan antara frekuensi yang diamati dan yang diharapkan. Ini mengindikasikan adanya asosiasi atau ketergantungan yang kuat antara variabel dalam sel tersebut. - Residual standar mendekati 0: Menunjukkan bahwa frekuensi yang diamati dan yang diharapkan cukup serupa, dan sel tersebut tidak memberikan kontribusi signifikan terhadap statistik uji.
Contoh: - Residual standar > 2: Menandakan bahwa sel tersebut lebih sering muncul daripada yang diharapkan. - Residual standar < -2: Menandakan bahwa sel tersebut lebih jarang muncul daripada yang diharapkan.
Residual Biasa dan Residual Standar adalah dua jenis residual yang digunakan untuk mengukur perbedaan antara frekuensi yang diamati dan frekuensi yang diharapkan dalam tabel kontingensi. Kedua jenis residual ini memberikan informasi yang berbeda, dan keduanya berguna dalam analisis tabel kontingensi.
Residual Biasa
Residual biasa mengukur selisih antara frekuensi yang diamati dan yang diharapkan:
\[ R_{ij} = O_{ij} - E_{ij} \]
Dimana: - \(O_{ij}\) adalah frekuensi yang diamati pada sel \((i, j)\), - \(E_{ij}\) adalah frekuensi yang diharapkan pada sel \((i, j)\).
Residual biasa memberikan selisih absolut antara yang diamati dan yang diharapkan.
Residual Standar
Residual standar memberikan perbandingan antara residual biasa dan penyimpangan yang diharapkan dalam satuan deviasi standar:
\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Dimana: - \(R_{ij}\) adalah residual standar untuk sel \((i, j)\), - \(O_{ij}\) adalah frekuensi yang diamati, - \(E_{ij}\) adalah frekuensi yang diharapkan.
Residual standar memungkinkan kita untuk membandingkan kontribusi antar sel meskipun ukuran sel berbeda. Ini memberikan ukuran yang lebih standarisasi daripada residual biasa.
Perbandingan:
Perhitungan Residual Biasa dan Standar dalam R
Misalkan kita memiliki data yang sama mengenai hubungan antara jenis kelamin dan preferensi produk:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Frekuensi yang diharapkan untuk setiap sel telah dihitung sebelumnya.
# Menghitung residual biasa (O - E)
residual_biasa <- data - expected
# Menghitung residual standar (O - E) / sqrt(E)
residual_standar <- (data - expected) / sqrt(expected)
# Menampilkan hasil residual
residual_biasa
## Produk A Produk B
## Laki-laki 0.00000 21.81818
## Perempuan -22.22222 0.00000
residual_standar
## Produk A Produk B
## Laki-laki 0.000000 2.201928
## Perempuan -2.010076 0.000000
Tabel Kontingensi Tiga Arah adalah jenis tabel yang digunakan untuk menganalisis hubungan antara tiga variabel kategori. Tabel ini memperluas konsep tabel kontingensi dua arah yang digunakan untuk menguji hubungan antara dua variabel kategori, tetapi dalam hal ini, kita menganalisis hubungan antara tiga variabel kategori. Tabel kontingensi tiga arah memungkinkan kita untuk mengamati hubungan antara variabel-variabel tersebut secara bersamaan.
Pada tabel kontingensi tiga arah, kita dapat menghitung tabel parsial dan tabel marginal untuk masing-masing kombinasi dari ketiga variabel tersebut.
Tabel marginal adalah tabel yang menunjukkan distribusi frekuensi total untuk satu variabel tanpa mempertimbangkan kategori variabel lainnya. Tabel ini memberikan informasi tentang frekuensi total untuk setiap kategori dalam satu variabel.
Contoh: Misalkan kita memiliki tabel kontingensi tiga arah yang melibatkan tiga variabel: Jenis Kelamin, Preferensi Produk, dan Usia. Tabel marginal untuk variabel Jenis Kelamin akan menunjukkan distribusi frekuensi total untuk Laki-laki dan Perempuan tanpa mempertimbangkan kategori Preferensi Produk dan Usia.
Tabel marginal dihitung dengan menjumlahkan seluruh baris atau kolom sesuai dengan kategori yang ada.
Tabel parsial adalah tabel yang menunjukkan distribusi frekuensi untuk satu variabel dengan mengontrol variabel lainnya. Tabel parsial ini digunakan untuk menganalisis hubungan antara dua variabel sambil mengontrol satu variabel lainnya.
Contoh: Jika kita ingin melihat hubungan antara Jenis Kelamin dan Preferensi Produk, tetapi mengontrol Usia, kita dapat menghitung tabel parsial untuk kategori Usia tertentu (misalnya Usia < 30 atau Usia ≥ 30).
Misalkan kita memiliki data berikut mengenai Jenis Kelamin, Preferensi Produk, dan Usia dalam tabel kontingensi tiga arah:
| Jenis Kelamin | Produk A | Produk B | Usia < 30 | Usia ≥ 30 | Total |
|---|---|---|---|---|---|
| Laki-laki | 50 | 30 | 40 | 40 | 80 |
| Perempuan | 70 | 50 | 60 | 60 | 120 |
| Total | 120 | 80 | 100 | 100 | 200 |
Untuk menghitung tabel marginal dan tabel parsial, kita akan menjumlahkan baris atau kolom sesuai kebutuhan.
# Data observasi
data <- array(c(50, 30, 70, 50, 40, 40, 60, 60), dim = c(2, 2, 2))
dimnames(data) <- list("Jenis Kelamin" = c("Laki-laki", "Perempuan"),
"Produk" = c("Produk A", "Produk B"),
"Usia" = c("Usia < 30", "Usia ≥ 30"))
# Tabel marginal (jumlah seluruh kategori untuk setiap variabel)
marginal_jenis_kelamin <- margin.table(data, 1) # Marginal berdasarkan jenis kelamin
marginal_produk <- margin.table(data, 2) # Marginal berdasarkan produk
marginal_usia <- margin.table(data, 3) # Marginal berdasarkan usia
# Tabel parsial (menghitung distribusi frekuensi untuk kategori tertentu)
parsial_usia30 <- data[,,1] # Tabel parsial untuk Usia < 30
parsial_usia30
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 50 70
## Perempuan 30 50
parsial_usia30plus <- data[,,2] # Tabel parsial untuk Usia ≥ 30
parsial_usia30plus
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 40 60
## Perempuan 40 60
# Menampilkan hasil
list(
"Tabel Marginal Jenis Kelamin" = marginal_jenis_kelamin,
"Tabel Marginal Produk" = marginal_produk,
"Tabel Marginal Usia" = marginal_usia,
"Tabel Parsial Usia < 30" = parsial_usia30,
"Tabel Parsial Usia ≥ 30" = parsial_usia30plus
)
## $`Tabel Marginal Jenis Kelamin`
## Jenis Kelamin
## Laki-laki Perempuan
## 220 180
##
## $`Tabel Marginal Produk`
## Produk
## Produk A Produk B
## 160 240
##
## $`Tabel Marginal Usia`
## Usia
## Usia < 30 Usia ≥ 30
## 200 200
##
## $`Tabel Parsial Usia < 30`
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 50 70
## Perempuan 30 50
##
## $`Tabel Parsial Usia ≥ 30`
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 40 60
## Perempuan 40 60
Tabel Marginal memberikan informasi tentang distribusi frekuensi untuk satu variabel tanpa mempertimbangkan kategori variabel lainnya. Ini berguna untuk melihat proporsi total untuk masing-masing kategori.
Tabel Parsial memungkinkan kita untuk menganalisis hubungan antara dua variabel sambil mengontrol variabel lainnya. Ini membantu untuk memahami pengaruh satu variabel terhadap hubungan dua variabel lainnya.
Distribusi peluang adalah cara untuk menghitung kemungkinan terjadinya suatu kejadian dalam eksperimen acak. Dalam analisis tabel kontingensi tiga arah, distribusi peluang digunakan untuk memahami hubungan antara berbagai kategori variabel. Dua konsep penting dalam distribusi peluang adalah Peluang Bersama (Joint Probability) dan Peluang Marginal (Marginal Probability).
Peluang Bersama (Joint Probability)
Peluang Bersama (Joint Probability) mengukur kemungkinan dua variabel kategori terjadi bersamaan. Dalam tabel kontingensi tiga arah, peluang bersama dihitung dengan menghitung frekuensi kejadian yang bersamaan dari dua atau lebih variabel kategori.
Secara matematis, Peluang Bersama (Joint Probability) untuk dua variabel, katakanlah Variabel A dan Variabel B, dapat dihitung dengan rumus:
\[ P(A, B) = \frac{n_{A, B}}{N} \]
Dimana: - \(n_{A, B}\) adalah jumlah kejadian yang terjadi bersamaan untuk kategori A dan B, - \(N\) adalah total jumlah kejadian dalam populasi.
Contoh:
Misalnya, kita ingin menghitung peluang bersama antara Jenis Kelamin (Laki-laki, Perempuan) dan Preferensi Produk (Produk A, Produk B).
Peluang Marginal (Marginal Probability)
Peluang Marginal (Marginal Probability) mengukur kemungkinan terjadinya satu variabel kategori tanpa mempertimbangkan variabel lainnya. Ini dihitung dengan menjumlahkan Peluang Bersama untuk kategori tertentu dalam satu variabel.
Secara matematis, Peluang Marginal untuk variabel A dapat dihitung dengan rumus:
\[ P(A) = \frac{n_{A, *}}{N} \]
Dimana: - \(n_{A, *}\) adalah jumlah kejadian untuk kategori A tanpa memperhatikan kategori variabel lainnya, - \(N\) adalah total jumlah kejadian dalam populasi.
Contoh:
Misalnya, kita ingin menghitung peluang marginal untuk Jenis Kelamin (Laki-laki, Perempuan), tanpa mempertimbangkan Preferensi Produk atau Usia.
Menghitung Peluang Bersama dan Marginal dalam R
Misalkan kita memiliki data berikut mengenai Jenis Kelamin, Preferensi Produk, dan Usia dalam tabel kontingensi tiga arah:
| Jenis Kelamin | Produk A | Produk B | Usia < 30 | Usia ≥ 30 | Total |
|---|---|---|---|---|---|
| Laki-laki | 50 | 30 | 40 | 40 | 80 |
| Perempuan | 70 | 50 | 60 | 60 | 120 |
| Total | 120 | 80 | 100 | 100 | 200 |
Untuk menghitung Peluang Bersama dan Peluang Marginal, kita dapat menggunakan fungsi distribusi peluang di R.
# Data observasi
data <- array(c(50, 30, 70, 50, 40, 40, 60, 60), dim = c(2, 2, 2))
dimnames(data) <- list("Jenis Kelamin" = c("Laki-laki", "Perempuan"),
"Produk" = c("Produk A", "Produk B"),
"Usia" = c("Usia < 30", "Usia ≥ 30"))
# Menghitung peluang bersama (joint probability)
joint_probability <- data / sum(data)
# Menghitung peluang marginal (marginal probability) untuk masing-masing variabel
marginal_jenis_kelamin <- margin.table(data, 1) / sum(data)
marginal_produk <- margin.table(data, 2) / sum(data)
marginal_usia <- margin.table(data, 3) / sum(data)
# Menampilkan hasil peluang bersama dan marginal
list(
"Peluang Bersama" = joint_probability,
"Peluang Marginal Jenis Kelamin" = marginal_jenis_kelamin,
"Peluang Marginal Produk" = marginal_produk,
"Peluang Marginal Usia" = marginal_usia
)
## $`Peluang Bersama`
## , , Usia = Usia < 30
##
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 0.125 0.175
## Perempuan 0.075 0.125
##
## , , Usia = Usia ≥ 30
##
## Produk
## Jenis Kelamin Produk A Produk B
## Laki-laki 0.1 0.15
## Perempuan 0.1 0.15
##
##
## $`Peluang Marginal Jenis Kelamin`
## Jenis Kelamin
## Laki-laki Perempuan
## 0.55 0.45
##
## $`Peluang Marginal Produk`
## Produk
## Produk A Produk B
## 0.4 0.6
##
## $`Peluang Marginal Usia`
## Usia
## Usia < 30 Usia ≥ 30
## 0.5 0.5
Peluang Bersyarat (Conditional Probability)
Peluang Bersyarat (Conditional Probability) adalah probabilitas terjadinya suatu kejadian A dengan syarat bahwa kejadian B telah terjadi. Peluang bersyarat digunakan untuk mengukur seberapa besar kemungkinan terjadinya suatu peristiwa, mengingat peristiwa lain sudah terjadi.
Secara matematis, peluang bersyarat untuk kejadian A yang terjadi dengan syarat kejadian B adalah:
\[ P(A | B) = \frac{P(A \cap B)}{P(B)} \]
Dimana: - \(P(A | B)\) adalah peluang terjadinya A dengan syarat B, - \(P(A \cap B)\) adalah peluang terjadinya A dan B (peluang bersama), - \(P(B)\) adalah peluang terjadinya B.
Peluang bersyarat memungkinkan kita untuk memperkirakan kemungkinan suatu kejadian setelah mempertimbangkan kejadian lain yang sudah terjadi. Ini sangat berguna dalam analisis hubungan antar variabel kategori dalam tabel kontingensi.
Menghitung Peluang Bersyarat dalam Tabel Kontingensi
Misalkan kita memiliki data mengenai Jenis Kelamin dan Preferensi Produk, dan kita ingin menghitung peluang bersyarat untuk memilih Produk A, mengingat bahwa seseorang adalah Laki-laki. Ini dapat dihitung dengan rumus peluang bersyarat:
\[ P(Produk A | Laki-laki) = \frac{P(Laki-laki \cap Produk A)}{P(Laki-laki)} \]
Dimana: - \(P(Laki-laki \cap Produk A)\) adalah peluang bersama memilih Produk A dan Laki-laki, - \(P(Laki-laki)\) adalah peluang terjadinya Laki-laki (marginal).
Contoh data yang diberikan:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Perhitungan Peluang Bersyarat dalam R
Untuk menghitung peluang bersyarat P(Produk A | Laki-laki) dalam contoh di atas, kita dapat menggunakan data yang ada dan rumus di atas.
# Data Observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung peluang bersama P(Laki-laki dan Produk A)
P_Laki_Laki_Produk_A <- data[1,1] / sum(data)
# Menghitung peluang marginal P(Laki-laki)
P_Laki_Laki <- sum(data[1,]) / sum(data)
# Menghitung peluang bersyarat P(Produk A | Laki-laki)
P_Produk_A_given_Laki_Laki <- P_Laki_Laki_Produk_A / P_Laki_Laki
# Menampilkan hasil
P_Produk_A_given_Laki_Laki
## [1] 0.4
Tabel Peluang Bersyarat digunakan untuk menggambarkan hubungan antara dua variabel kategori, dengan mempertimbangkan satu variabel yang mengontrol variabel lainnya. Tabel ini memberikan distribusi peluang terjadinya suatu kejadian pada satu variabel, mengingat bahwa kejadian pada variabel lain telah diketahui.
Tabel peluang bersyarat memungkinkan kita untuk menganalisis kemungkinan suatu kejadian terjadi dengan kondisi tertentu. Dalam tabel kontingensi tiga arah, kita dapat menghitung peluang bersyarat untuk setiap kombinasi kategori, yang memberikan wawasan lebih lanjut tentang hubungan antar variabel.
Membuat Tabel Peluang Bersyarat
Untuk membuat tabel peluang bersyarat, kita harus terlebih dahulu menghitung frekuensi yang diamati dan frekuensi yang diharapkan untuk setiap kombinasi kategori dalam tabel kontingensi. Kemudian, kita dapat menghitung peluang bersyarat untuk setiap kombinasi kategori.
Langkah-langkah:
\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]
Dimana: - \(P(A|B)\) adalah peluang terjadinya kejadian A dengan syarat bahwa kejadian B telah terjadi, - \(P(A \cap B)\) adalah peluang bersama untuk A dan B, - \(P(B)\) adalah peluang untuk kejadian B.
Contoh Perhitungan Tabel Peluang Bersyarat
Misalkan kita memiliki data mengenai Jenis Kelamin, Preferensi Produk, dan Usia, seperti pada tabel berikut:
| Jenis Kelamin | Produk A | Produk B | Usia < 30 | Usia ≥ 30 | Total |
|---|---|---|---|---|---|
| Laki-laki | 50 | 30 | 40 | 40 | 80 |
| Perempuan | 70 | 50 | 60 | 60 | 120 |
| Total | 120 | 80 | 100 | 100 | 200 |
Untuk menghitung Peluang Bersyarat, misalnya kita ingin mengetahui peluang memilih Produk A dengan syarat Usia < 30.
Menghitung Peluang Bersyarat:
\[ P(Produk A | Usia < 30) = \frac{P(Produk A \cap Usia < 30)}{P(Usia < 30)} \]
Dengan data di atas, kita dapat menghitung Peluang Bersyarat menggunakan rumus tersebut.
Risk Difference (RD)
Risk Difference (RD) atau Perbedaan Risiko adalah ukuran yang digunakan untuk mengukur perbedaan risiko absolut antara dua kelompok dalam hal kejadian suatu peristiwa. Dalam konteks tabel kontingensi tiga arah, RD digunakan untuk mengetahui apakah ada perbedaan risiko yang signifikan antara dua kelompok berdasarkan kategori variabel.
Rumus Perhitungan RD:
\[ RD = \left( \frac{n11}{n1.} \right) - \left( \frac{n21}{n2.} \right) \]
Dimana: - \(n11\) adalah jumlah kejadian dalam kelompok 1 (misalnya, kelompok yang terpapar), - \(n1.\) adalah total jumlah individu dalam kelompok 1, - \(n21\) adalah jumlah kejadian dalam kelompok 2 (misalnya, kelompok yang tidak terpapar), - \(n2.\) adalah total jumlah individu dalam kelompok 2.
Interpretasi:
Contoh Perhitungan RD:
Misalkan kita memiliki data tentang jenis kelamin dan preferensi produk, dengan data sebagai berikut:
| Jenis Kelamin | Produk A | Produk B | Total |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Dengan menggunakan rumus di atas, kita dapat menghitung Risk Difference (RD) untuk mengetahui perbedaan risiko memilih Produk A antara Laki-laki dan Perempuan.
# Data observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung Risk Difference (RD)
RD <- (data[1, 1] / sum(data[1,])) - (data[2, 1] / sum(data[2,]))
# Menampilkan hasil RD
RD
## [1] -0.1
7.4.2 Relative Risk (RR)
Relative Risk (RR) atau Risiko Relatif adalah ukuran yang digunakan untuk membandingkan risiko kejadian antara dua kelompok. RR mengukur seberapa besar kemungkinan suatu peristiwa terjadi pada kelompok yang terpapar dibandingkan dengan kelompok yang tidak terpapar.
RR sering digunakan dalam penelitian epidemiologi untuk mengevaluasi hubungan antara faktor risiko dan kejadian penyakit. Jika RR > 1, ini menunjukkan bahwa kelompok terpapar lebih berisiko dibandingkan dengan kelompok tidak terpapar. Sebaliknya, jika RR < 1, berarti kelompok terpapar memiliki risiko lebih rendah dibandingkan dengan kelompok yang tidak terpapar. Jika RR = 1, ini menunjukkan bahwa kedua kelompok memiliki risiko yang sama.
Rumus Perhitungan RR:
\[ RR = \frac{\frac{n11}{n1.}}{\frac{n21}{n2.}} \]
Dimana: - \(n11\) adalah jumlah kejadian dalam kelompok terpapar (misalnya Produk A di Laki-laki), - \(n1.\) adalah total jumlah individu dalam kelompok terpapar, - \(n21\) adalah jumlah kejadian dalam kelompok tidak terpapar (misalnya Produk A di Perempuan), - \(n2.\) adalah total jumlah individu dalam kelompok tidak terpapar.
Interpretasi:
Contoh Perhitungan RR:
Misalkan kita memiliki data yang sama dengan contoh sebelumnya mengenai jenis kelamin dan preferensi produk, seperti berikut:
| Jenis Kelamin | Produk A | Produk B | Total |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Untuk menghitung Relative Risk (RR), kita dapat menggunakan rumus di atas untuk menghitung rasio risiko memilih Produk A antara Laki-laki dan Perempuan.
# Data observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung Relative Risk (RR)
RR <- (data[1, 1] / sum(data[1,])) / (data[2, 1] / sum(data[2,]))
# Menampilkan hasil RR
RR
## [1] 0.8
7.4.3 Odds Ratio (OR)
Odds Ratio (OR) atau Rasio Odds adalah ukuran yang digunakan untuk membandingkan peluang terjadinya suatu kejadian antara dua kelompok. OR sering digunakan dalam studi kasus-kontrol, namun juga dapat digunakan dalam studi kohort dan eksperimen untuk mengukur perbandingan peluang antara dua kelompok dalam hal kejadian tertentu.
OR mengukur perbandingan antara peluang kejadian (odds) dalam kelompok yang terpapar dengan kelompok yang tidak terpapar. Ini memberikan gambaran tentang seberapa besar peluang kejadian terjadi pada satu kelompok dibandingkan dengan kelompok lainnya.
Rumus Perhitungan OR:
\[ OR = \frac{n11 \times n22}{n12 \times n21} \]
Dimana: - \(n11\) adalah jumlah kejadian pada kelompok terpapar, - \(n12\) adalah jumlah non-kejadian pada kelompok terpapar, - \(n21\) adalah jumlah kejadian pada kelompok tidak terpapar, - \(n22\) adalah jumlah non-kejadian pada kelompok tidak terpapar.
Interpretasi:
Contoh Perhitungan OR:
Misalkan kita memiliki data yang sama dengan contoh sebelumnya mengenai jenis kelamin dan preferensi produk, seperti berikut:
| Jenis Kelamin | Produk A | Produk B | Total |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Untuk menghitung Odds Ratio (OR), kita dapat menggunakan rumus di atas untuk membandingkan peluang memilih Produk A antara Laki-laki dan Perempuan.
# Data observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung Odds Ratio (OR)
OR <- (data[1, 1] * data[2, 2]) / (data[1, 2] * data[2, 1])
# Menampilkan hasil OR
OR
## [1] 0.6666667
Conditional Independence (Kemandirian Bersyarat) adalah konsep yang digunakan untuk menganalisis hubungan antara dua variabel kategori dalam tabel kontingensi, dengan mengontrol variabel lain. Dalam istilah yang lebih sederhana, dua variabel dikatakan independen satu sama lain jika hubungan antara keduanya hilang atau menjadi tidak signifikan setelah mempertimbangkan atau mengontrol variabel ketiga.
Definisi:
Dua variabel \(A\) dan \(B\) dikatakan independen secara bersyarat terhadap variabel ketiga \(C\) jika kondisi berikut berlaku:
\[ P(A, B | C) = P(A | C) \times P(B | C) \]
Artinya, setelah mengontrol variabel \(C\), informasi tentang \(A\) tidak mempengaruhi informasi tentang \(B\), dan sebaliknya.
Untuk menguji conditional independence antara dua variabel \(A\) dan \(B\) setelah mengontrol variabel \(C\), kita dapat menggunakan uji Chi-Square atau Uji Fisher yang memeriksa apakah distribusi antara dua variabel berubah secara signifikan setelah mempertimbangkan variabel ketiga.
Sebagai contoh, kita bisa menghitung Peluang Bersyarat untuk dua variabel setelah mengontrol satu variabel lainnya. Jika P(A | B, C) = P(A | C) dan P(B | C) = P(B | A, C), maka kita dapat menyimpulkan bahwa \(A\) dan \(B\) adalah independen secara bersyarat terhadap \(C\).
Misalkan kita memiliki data berikut tentang Jenis Kelamin, Preferensi Produk, dan Usia, dengan data yang digunakan dalam tabel kontingensi tiga arah:
| Jenis Kelamin | Produk A | Produk B | Usia < 30 | Usia ≥ 30 | Total |
|---|---|---|---|---|---|
| Laki-laki | 50 | 30 | 40 | 40 | 80 |
| Perempuan | 70 | 50 | 60 | 60 | 120 |
| Total | 120 | 80 | 100 | 100 | 200 |
Kita ingin menguji kemandirian bersyarat antara Jenis Kelamin dan Preferensi Produk, dengan mengontrol Usia. Artinya, kita ingin mengetahui apakah hubungan antara Jenis Kelamin dan Preferensi Produk berubah setelah kita mempertimbangkan Usia.
Untuk menghitung conditional independence dalam R, kita dapat menggunakan uji Chi-Square atau menghitung distribusi peluang bersyarat antara dua variabel dengan mengontrol variabel ketiga.
# Data observasi
data <- array(c(50, 30, 70, 50, 40, 40, 60, 60), dim = c(2, 2, 2))
dimnames(data) <- list("Jenis Kelamin" = c("Laki-laki", "Perempuan"),
"Produk" = c("Produk A", "Produk B"),
"Usia" = c("Usia < 30", "Usia ≥ 30"))
# Menghitung peluang bersama (joint probability) untuk Produk A dan Usia < 30
P_ProdukA_Usia30 <- sum(data[,,1]) / sum(data)
# Menghitung peluang bersyarat P(Produk A | Usia < 30) setelah mengontrol Jenis Kelamin
P_ProdukA_given_Usia30 <- sum(data[1,,1]) / sum(data[,,1])
# Menampilkan hasil
P_ProdukA_given_Usia30
## [1] 0.6
Jika nilai P(Produk A | Usia < 30, Jenis Kelamin) tidak berbeda secara signifikan dengan P(Produk A | Usia < 30), maka kita dapat menyimpulkan bahwa Jenis Kelamin dan Preferensi Produk adalah independen bersyarat setelah mengontrol Usia.
Dalam analisis tabel kontingensi, kita sering kali tertarik untuk memahami distribusi satu variabel marginal tanpa mempertimbangkan variabel lainnya. Tabel marginal untuk variabel X dan Y memberikan gambaran tentang distribusi frekuensi total untuk masing-masing kategori variabel, yang dihitung dengan menjumlahkan seluruh baris atau kolom dari tabel kontingensi.
Marginal X
Tabel marginal X menunjukkan distribusi frekuensi untuk variabel X tanpa mempertimbangkan variabel lainnya. Tabel ini memberikan informasi tentang total frekuensi untuk masing-masing kategori dalam variabel X.
Secara matematis, P(X) dapat dihitung dengan rumus:
\[ P(X) = \frac{n_{X}}{N} \]
Dimana: - \(n_{X}\) adalah jumlah kejadian untuk kategori tertentu pada variabel X, - \(N\) adalah total jumlah kejadian dalam seluruh populasi.
Marginal Y
Tabel marginal Y menunjukkan distribusi frekuensi untuk variabel Y tanpa mempertimbangkan variabel lainnya. Tabel ini memberikan informasi tentang total frekuensi untuk masing-masing kategori dalam variabel Y.
Secara matematis, P(Y) dapat dihitung dengan rumus:
\[ P(Y) = \frac{n_{Y}}{N} \]
Dimana: - \(n_{Y}\) adalah jumlah kejadian untuk kategori tertentu pada variabel Y, - \(N\) adalah total jumlah kejadian dalam seluruh populasi.
Menghitung Marginal X dan Y dalam Tabel Kontingensi
Misalkan kita memiliki data berikut mengenai Jenis Kelamin dan Preferensi Produk dalam tabel kontingensi dua arah:
| Jenis Kelamin | Produk A | Produk B | Total |
|---|---|---|---|
| Laki-laki | 80 | 120 | 200 |
| Perempuan | 100 | 100 | 200 |
| Total | 180 | 220 | 400 |
Untuk menghitung marginal X (Jenis Kelamin) dan marginal Y (Preferensi Produk), kita akan menjumlahkan kolom dan baris sesuai kebutuhan.
# Data Observasi
data <- matrix(c(80, 120, 100, 100), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Laki-laki", "Perempuan")
# Menghitung tabel marginal untuk X (Jenis Kelamin)
marginal_X <- margin.table(data, 1) / sum(data)
# Menghitung tabel marginal untuk Y (Preferensi Produk)
marginal_Y <- margin.table(data, 2) / sum(data)
# Menampilkan hasil
list(
"Marginal X (Jenis Kelamin)" = marginal_X,
"Marginal Y (Preferensi Produk)" = marginal_Y
)
## $`Marginal X (Jenis Kelamin)`
## Laki-laki Perempuan
## 0.5 0.5
##
## $`Marginal Y (Preferensi Produk)`
## Produk A Produk B
## 0.45 0.55
Interpretasi Tabel Marginal X dan Y
Tabel Marginal X (Jenis Kelamin) memberikan informasi tentang distribusi frekuensi Laki-laki dan Perempuan dalam data, tanpa memperhatikan Preferensi Produk. Ini menunjukkan proporsi total untuk masing-masing kategori jenis kelamin.
Tabel Marginal Y (Preferensi Produk) memberikan informasi tentang distribusi frekuensi Produk A dan Produk B, tanpa memperhatikan Jenis Kelamin. Ini menunjukkan proporsi total untuk masing-masing kategori produk.
Kesimpulan
Tabel Marginal sangat berguna untuk mendapatkan gambaran umum tentang distribusi kategori dalam satu variabel tanpa mempertimbangkan variabel lainnya.
Tabel Marginal X menunjukkan distribusi frekuensi untuk Jenis Kelamin, sedangkan Tabel Marginal Y menunjukkan distribusi frekuensi untuk Preferensi Produk.
Dengan menggunakan tabel marginal, kita bisa memeriksa distribusi keseluruhan dari setiap variabel dalam data dan memahami proporsi total yang ada.
Inferensi Tabel Kontingensi Tiga Arah digunakan untuk menguji hubungan antara tiga variabel kategori dalam tabel kontingensi. Ketika kita bekerja dengan tabel tiga arah, kita berusaha untuk menentukan apakah ada hubungan yang signifikan antara tiga variabel atau apakah ada interaksi antara dua variabel setelah mengontrol variabel ketiga.
Dalam tabel kontingensi tiga arah, kita sering melakukan inferensi untuk melihat apakah hubungan antar dua variabel tetap ada setelah mengendalikan variabel ketiga. Inferensi ini juga membantu untuk menentukan apakah hubungan yang diamati disebabkan oleh interaksi antar variabel atau apakah hubungan tersebut tetap ada meskipun kita mengontrol variabel ketiga.
Untuk tabel kontingensi tiga arah, kita dapat menggunakan Uji Chi-Square untuk menguji apakah ada hubungan yang signifikan antara tiga variabel. Uji ini melibatkan perhitungan statistik uji berdasarkan frekuensi yang diamati dan frekuensi yang diharapkan.
Langkah-langkah Uji Chi-Square untuk Tabel Kontingensi Tiga Arah:
Menentukan Hipotesis:
Menghitung Statistik Uji Chi-Square: Statistik uji Chi-Square untuk tabel kontingensi tiga arah dihitung dengan rumus yang sama seperti pada tabel dua arah, tetapi dengan memperhitungkan tiga variabel dalam perhitungan.
Menentukan Nilai P dan Keputusan:
Misalkan kita memiliki data mengenai Jenis Kelamin, Preferensi Produk, dan Usia, seperti yang kita gunakan dalam contoh sebelumnya. Kita ingin menguji apakah ada hubungan antara ketiga variabel ini.
| Jenis Kelamin | Produk A | Produk B | Usia < 30 | Usia ≥ 30 | Total |
|---|---|---|---|---|---|
| Laki-laki | 50 | 30 | 40 | 40 | 80 |
| Perempuan | 70 | 50 | 60 | 60 | 120 |
| Total | 120 | 80 | 100 | 100 | 200 |
Untuk menguji hubungan antara Jenis Kelamin, Preferensi Produk, dan Usia, kita dapat menggunakan Uji Chi-Square untuk tabel kontingensi tiga arah.
Generalized Linear Model (GLM) adalah jenis model statistik yang memperluas Regresi Linear untuk menangani data non-normal atau data yang tidak dapat dijelaskan dengan asumsi distribusi normal. GLM memungkinkan kita untuk menganalisis data dengan berbagai distribusi, yang mencakup binomial, Poisson, Gamma, dan normal, di antara yang lainnya.
Model ini memiliki tiga komponen utama: 1. Distribusi probabilitas dari variabel dependen (Y). 2. Linear predictor yang menghubungkan variabel independen (X) dengan distribusi. 3. Link function yang menghubungkan parameter distribusi dengan prediktor linear.
Dalam GLM, kita sering berhadapan dengan Exponential Family sebagai jenis distribusi yang digunakan untuk berbagai jenis model. Exponential Family mencakup banyak distribusi probabilitas yang umum digunakan dalam GLM.
Definisi Exponential Family
Distribusi dalam Exponential Family adalah kelas distribusi probabilitas yang memiliki bentuk umum berikut:
\[ f(y | \theta) = \exp\left( \frac{y \cdot \eta - b(\eta)}{\phi} + c(y, \phi) \right) \]
Dimana: - \(y\) adalah variabel acak (data), - \(\eta\) adalah linear predictor, - \(\phi\) adalah parameter skala, - \(b(\eta)\) adalah fungsi yang terkait dengan parameter distribusi, - \(c(y, \phi)\) adalah fungsi normalisasi untuk memastikan bahwa distribusi adalah probabilitas yang valid.
Jenis-jenis Distribusi dalam Exponential Family
Distribusi dalam Exponential Family mencakup berbagai distribusi probabilitas yang umum digunakan dalam analisis statistik, seperti:
Distribusi Binomial
Distribusi Binomial digunakan untuk model regresi logistik, di mana variabel dependen adalah biner (misalnya ya/tidak). Dalam GLM, link function untuk distribusi binomial biasanya adalah logit.
\[ f(y | \theta) = \binom{n}{y} p^y (1-p)^{n-y} \]
Dengan \(p = \frac{1}{1 + \exp(-\eta)}\), di mana \(\eta\) adalah prediktor linear dan fungsi link logit digunakan.
Distribusi Poisson
Distribusi Poisson digunakan untuk model data hitungan, seperti jumlah kejadian dalam interval waktu atau ruang tertentu. Fungsi link untuk distribusi Poisson biasanya adalah log.
\[ f(y | \theta) = \frac{\lambda^y \exp(-\lambda)}{y!} \]
Dengan \(\lambda = \exp(\eta)\), di mana \(\eta\) adalah prediktor linear dan fungsi link log digunakan.
Distribusi Normal
Distribusi Normal digunakan untuk model regresi linier klasik. Dalam hal ini, link function biasanya adalah identitas:
\[ f(y | \theta) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left( - \frac{(y - \mu)^2}{2\sigma^2} \right) \]
Dimana \(\mu = \eta\), di mana \(\eta\) adalah prediktor linear dan fungsi link identitas digunakan.
Menggunakan GLM dengan Exponential Family di R
Misalkan kita ingin membangun Generalized Linear
Model menggunakan distribusi Poisson untuk
model data hitungan. Kita bisa menggunakan fungsi glm() di
R dengan family = poisson() untuk menentukan distribusi
yang sesuai.
Contoh penggunaan GLM dengan distribusi Poisson:
# Contoh data: jumlah kejadian (count data) dalam waktu tertentu
set.seed(123)
data <- data.frame(
x = rnorm(100), # Variabel independen
y = rpois(100, lambda = exp(0.5 + 0.3 * rnorm(100))) # Variabel dependen, count data (Poisson)
)
# Fit model GLM dengan distribusi Poisson
model <- glm(y ~ x, family = poisson(link = "log"), data = data)
# Menampilkan hasil model
summary(model)
##
## Call:
## glm(formula = y ~ x, family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.55149 0.07615 7.242 4.41e-13 ***
## x -0.04760 0.08383 -0.568 0.57
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 131.13 on 99 degrees of freedom
## Residual deviance: 130.81 on 98 degrees of freedom
## AIC: 341.32
##
## Number of Fisher Scoring iterations: 5
Regresi Logistik adalah salah satu jenis model Generalized Linear Model (GLM) yang digunakan untuk memodelkan hubungan antara satu variabel dependen biner (misalnya, ya/tidak, 1/0) dengan satu atau lebih variabel independen. Regresi logistik mengasumsikan bahwa hubungan antara variabel dependen dan independen diwakili oleh fungsi logit, yang merupakan log odds.
Model regresi logistik sangat berguna ketika variabel dependen kita adalah biner (dua kategori), seperti dalam analisis klasifikasi, diagnosis medis, analisis risiko, dan berbagai aplikasi lainnya.
Fungsi Link Logit
Pada regresi logistik, fungsi link yang digunakan adalah logit. Fungsi logit menghubungkan odds dari probabilitas kejadian (yaitu, kemungkinan hasil positif) dengan prediktor linear yang mencakup variabel independen.
Fungsi logit dapat didefinisikan sebagai berikut:
\[ \text{logit}(P) = \ln \left( \frac{P}{1 - P} \right) = \eta \]
Dimana: - \(P\) adalah probabilitas terjadinya peristiwa positif (misalnya, hasil = 1), - \(\eta\) adalah prediktor linear yang menghubungkan variabel independen dengan log odds.
Model regresi logistik kemudian dapat dituliskan sebagai berikut:
\[ \ln \left( \frac{P}{1 - P} \right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k \]
Dimana: - \(P\) adalah probabilitas kejadian (hasil positif), - \(\beta_0\) adalah intersep, - \(\beta_1, \beta_2, \dots, \beta_k\) adalah koefisien untuk variabel independen \(X_1, X_2, \dots, X_k\).
Estimasi Koefisien dengan Maximum Likelihood
Pada regresi logistik, estimasi koefisien dilakukan dengan menggunakan metode Maximum Likelihood Estimation (MLE). Metode ini mencari koefisien yang memaksimalkan kemungkinan (likelihood) data yang diamati, yaitu nilai koefisien yang membuat probabilitas data yang diamati sebesar mungkin.
Contoh Model Regresi Logistik dalam R
Misalkan kita memiliki dataset yang mencakup informasi tentang umur, jenis kelamin, dan status merokok, serta variabel dependen yang menunjukkan apakah seseorang mengalami penyakit jantung (0 = Tidak, 1 = Ya). Berikut adalah langkah-langkah untuk membangun model regresi logistik menggunakan R.
Contoh Data:
| Umur | Jenis Kelamin | Status Merokok | Penyakit Jantung |
|---|---|---|---|
| 45 | Laki-laki | Ya | 1 |
| 60 | Perempuan | Tidak | 0 |
| 50 | Laki-laki | Ya | 1 |
| 30 | Perempuan | Tidak | 0 |
| 55 | Laki-laki | Ya | 1 |
Langkah-langkah di R:
# Contoh data
data <- data.frame(
umur = c(45, 60, 50, 30, 55),
jenis_kelamin = c("Laki-laki", "Perempuan", "Laki-laki", "Perempuan", "Laki-laki"),
status_merokok = c("Ya", "Tidak", "Ya", "Tidak", "Ya"),
penyakit_jantung = c(1, 0, 1, 0, 1)
)
# Mengonversi variabel kategori menjadi faktor
data$jenis_kelamin <- factor(data$jenis_kelamin, levels = c("Laki-laki", "Perempuan"))
data$status_merokok <- factor(data$status_merokok, levels = c("Ya", "Tidak"))
# Membuat model regresi logistik
model_logistik <- glm(penyakit_jantung ~ umur + jenis_kelamin + status_merokok,
data = data,
family = binomial(link = "logit"))
# Menampilkan hasil model
summary(model_logistik)
##
## Call:
## glm(formula = penyakit_jantung ~ umur + jenis_kelamin + status_merokok,
## family = binomial(link = "logit"), data = data)
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.457e+01 3.026e+05 0 1
## umur 4.010e-15 5.859e+03 0 1
## jenis_kelaminPerempuan -4.913e+01 1.231e+05 0 1
## status_merokokTidak NA NA NA NA
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 6.7301e+00 on 4 degrees of freedom
## Residual deviance: 2.1434e-10 on 2 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 23
Model Regresi Poisson adalah jenis Generalized Linear Model (GLM) yang digunakan untuk memodelkan data hitungan (count data), seperti jumlah kejadian per unit waktu atau ruang, di mana variabel dependen berupa data diskrit yang positif (0, 1, 2, …). Model ini digunakan untuk situasi di mana kita ingin menghubungkan variabel independen dengan jumlah kejadian (misalnya jumlah kecelakaan, jumlah penyakit, atau jumlah pembelian produk) dalam waktu atau ruang tertentu.
Distribusi Poisson digunakan dalam model ini untuk menangani data hitungan yang mengikuti distribusi Poisson, yang memiliki parameter \(\lambda\) (rata-rata jumlah kejadian) yang sama dengan variansnya.
Fungsi Link Log
Pada regresi Poisson, fungsi link yang digunakan adalah log link, yang menghubungkan rata-rata kejadian (rate) dengan prediktor linear. Dengan kata lain, model regresi Poisson mengasumsikan bahwa log dari rata-rata kejadian adalah fungsi linear dari variabel independen.
Model regresi Poisson dapat dituliskan sebagai berikut:
\[ \log(\lambda) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k \]
Dimana: - \(\lambda\) adalah rata-rata kejadian dalam unit waktu atau ruang, - \(\beta_0, \beta_1, \dots, \beta_k\) adalah koefisien yang akan diestimasi untuk variabel independen \(X_1, X_2, \dots, X_k\), - Fungsi link adalah log, sehingga \(\log(\lambda)\) adalah fungsi linear dari \(X_1, X_2, \dots, X_k\).
Menggunakan Model Regresi Poisson di R
Misalkan kita memiliki data yang mencatat jumlah kecelakaan mobil yang terjadi dalam satu bulan untuk berbagai kota, dengan variabel independen seperti jumlah kendaraan dan ukuran populasi kota.
Berikut adalah contoh model regresi Poisson yang dibangun menggunakan data kecelakaan mobil.
Contoh Data:
| Jumlah Kendaraan | Ukuran Populasi | Jumlah Kecelakaan |
|---|---|---|
| 2000 | 50000 | 5 |
| 3000 | 60000 | 6 |
| 4000 | 80000 | 8 |
| 5000 | 100000 | 10 |
Langkah-langkah di R:
# Contoh data
data <- data.frame(
jumlah_kendaraan = c(2000, 3000, 4000, 5000),
ukuran_populasi = c(50000, 60000, 80000, 100000),
jumlah_kecelakaan = c(5, 6, 8, 10)
)
# Membuat model regresi Poisson
model_poisson <- glm(jumlah_kecelakaan ~ jumlah_kendaraan + ukuran_populasi,
data = data,
family = poisson(link = "log"))
# Menampilkan hasil model
summary(model_poisson)
##
## Call:
## glm(formula = jumlah_kecelakaan ~ jumlah_kendaraan + ukuran_populasi,
## family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.048e+00 1.078e+00 0.972 0.331
## jumlah_kendaraan 1.397e-04 1.297e-03 0.108 0.914
## ukuran_populasi 5.646e-06 7.379e-05 0.077 0.939
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.0201741 on 3 degrees of freedom
## Residual deviance: 0.0054154 on 1 degrees of freedom
## AIC: 21.239
##
## Number of Fisher Scoring iterations: 3
Inferensi Generalized Linear Model (GLM) digunakan untuk menguji hubungan statistik antara variabel dependen dan satu atau lebih variabel independen menggunakan model GLM. Inferensi ini melibatkan penggunaan statistik uji dan interval kepercayaan untuk mengukur seberapa kuat hubungan tersebut dan untuk menarik kesimpulan dari data.
Generalized Linear Models memperluas regresi linear untuk menangani berbagai jenis data dan distribusi, termasuk distribusi binomial, Poisson, dan Gamma.
9.1 Langkah-langkah Inferensi dalam GLM
Inferensi dalam Regresi Logistik
Regresi Logistik adalah salah satu jenis GLM yang sering digunakan untuk memodelkan data biner (0/1). Dalam inferensi regresi logistik, kita menguji apakah koefisien dari variabel independen signifikan dalam memprediksi hasil biner.
Langkah-langkah Inferensi Regresi Logistik:
9.3 Inferensi dalam Regresi Poisson
Regresi Poisson digunakan untuk memodelkan data hitungan atau jumlah kejadian, seperti jumlah kecelakaan atau jumlah penyakit. Inferensi dalam regresi Poisson juga dilakukan dengan uji signifikansi koefisien dan menguji kecocokan model.
Langkah-langkah Inferensi Regresi Poisson:
9.4 Contoh Inferensi GLM di R
Misalkan kita ingin membangun model regresi logistik untuk memprediksi penyakit jantung berdasarkan umur, jenis kelamin, dan status merokok. Berikut adalah contoh kode untuk inferensi GLM menggunakan regresi logistik di R.
# Contoh data
data <- data.frame(
penyakit_jantung = c(1, 0, 1, 0, 1),
umur = c(45, 60, 50, 30, 55),
jenis_kelamin = c("Laki-laki", "Perempuan", "Laki-laki", "Perempuan", "Laki-laki"),
status_merokok = c("Ya", "Tidak", "Ya", "Tidak", "Ya")
)
# Mengonversi variabel kategori menjadi faktor
data$jenis_kelamin <- factor(data$jenis_kelamin, levels = c("Laki-laki", "Perempuan"))
data$status_merokok <- factor(data$status_merokok, levels = c("Ya", "Tidak"))
# Membuat model regresi logistik
model_logistik <- glm(penyakit_jantung ~ umur + jenis_kelamin + status_merokok,
data = data,
family = binomial(link = "logit"))
# Menampilkan hasil model
summary(model_logistik)
##
## Call:
## glm(formula = penyakit_jantung ~ umur + jenis_kelamin + status_merokok,
## family = binomial(link = "logit"), data = data)
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.457e+01 3.026e+05 0 1
## umur 4.010e-15 5.859e+03 0 1
## jenis_kelaminPerempuan -4.913e+01 1.231e+05 0 1
## status_merokokTidak NA NA NA NA
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 6.7301e+00 on 4 degrees of freedom
## Residual deviance: 2.1434e-10 on 2 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 23
Output dari summary(model_logistik) memberikan koefisien
estimasi, nilai p untuk masing-masing koefisien, serta
statistik uji yang digunakan untuk mengevaluasi signifikansi
koefisien.
9.5 Goodness-of-Fit pada GLM
Goodness-of-fit adalah prosedur untuk mengevaluasi seberapa baik model yang telah dibangun menggambarkan data yang diamati. Dalam konteks Generalized Linear Models (GLM), kita menggunakan berbagai metode untuk menilai apakah model kita cocok dengan data. Salah satu pendekatan umum adalah dengan menggunakan Deviance.
Deviance mengukur perbedaan antara log-likelihood model yang diestimasi dengan log-likelihood model nol (model yang tidak ada prediktornya). Deviance dapat digunakan untuk menilai fit model dan digunakan dalam uji likelihood ratio.
Menghitung Deviance pada GLM
Pada GLM, deviance dihitung sebagai:
\[ D = 2 \left[ \text{log-likelihood(model terbaik)} - \text{log-likelihood(model nol)} \right] \]
Dalam regresi logistik dan regresi Poisson, kita sering menggunakan Deviance untuk menguji goodness-of-fit model.
Menghitung Deviance di R
Misalkan kita sudah membuat model GLM menggunakan regresi
logistik atau regresi Poisson di R. Kita dapat
menghitung Deviance model dengan menggunakan fungsi
deviance().
Contoh:
# Model regresi logistik
model_logistik <- glm(penyakit_jantung ~ umur + jenis_kelamin + status_merokok,
data = data,
family = binomial(link = "logit"))
# Menghitung Deviance dari model
deviance_model_logistik <- deviance(model_logistik)
# Menampilkan hasil Deviance
deviance_model_logistik
## [1] 2.143352e-10
Kesimpulan
Generalized Linear Models (GLM) merupakan alat yang sangat fleksibel dalam analisis statistik, yang memungkinkan kita untuk memodelkan hubungan antara variabel dependen dan variabel independen dengan menggunakan berbagai distribusi probabilitas yang sesuai dengan jenis data yang kita miliki. GLM menggabungkan model regresi linear dengan distribusi yang lebih beragam untuk menangani data yang tidak memenuhi asumsi normalitas.
Poin-poin Utama:
Kesimpulan Akhir:
Generalized Linear Models adalah alat yang kuat dan serbaguna yang memungkinkan kita untuk memodelkan data dengan berbagai jenis distribusi. Melalui inferensi statistik seperti uji signifikansi dan goodness-of-fit, kita dapat memahami hubungan antara variabel independen dan dependen serta mengevaluasi seberapa baik model kita menggambarkan data.
GLM sangat berguna untuk menganalisis data yang tidak memenuhi asumsi distribusi normal dan menyediakan cara yang efisien untuk melakukan prediksi dan membuat keputusan berbasis data.
Tujuan dari analisis ini adalah untuk mempelajari hubungan antara karakteristik fisik biji labu (pumpkin seeds) dan klasifikasi jenis biji tersebut berdasarkan variabel-variabel pengukuran yang tersedia dalam dataset. Dalam dunia pertanian dan industri pangan, klasifikasi kualitas atau varietas biji labu sangat penting untuk menentukan potensi produksi, kualitas hasil, serta nilai jual.
Analisis statistik, khususnya regresi dan teknik klasifikasi, dapat digunakan untuk memahami faktor-faktor apa saja yang paling memengaruhi jenis atau kelas biji labu. Dengan memahami pola-pola dari data fisik yang dikumpulkan, diharapkan kita mampu mengembangkan model prediksi yang dapat mengklasifikasikan jenis biji labu secara otomatis dan akurat, yang pada akhirnya dapat membantu efisiensi dalam proses seleksi dan pengolahan produk pertanian.
Dataset yang digunakan dalam analisis ini diunduh dari Kaggle dengan judul Pumpkin Seeds Dataset (sumber), yang dikumpulkan oleh Murat Koklu. Dataset ini berisi data pengukuran berbagai karakteristik fisik dari biji labu, yang kemudian diklasifikasikan ke dalam dua kategori: Çerçevelik dan Ürgüp Sivrisi (dua varietas biji labu).
Setiap baris pada dataset merepresentasikan satu sampel biji labu, dengan variabel-variabel pengukuran sebagai berikut:
| Variabel | Deskripsi | Tipe |
|---|---|---|
| Area | Luas area biji labu (dalam pixel) | Numeric |
| Perimeter | Keliling biji labu (dalam pixel) | Numeric |
| Major_Axis_Length | Panjang sumbu utama biji labu (dalam pixel) | Numeric |
| Minor_Axis_Length | Panjang sumbu minor biji labu (dalam pixel) | Numeric |
| Convex_Area | Area cembung (convex area) biji labu (dalam pixel) | Numeric |
| Equiv_Diameter | Diameter ekuivalen (equivalent diameter) biji labu (dalam pixel) | Numeric |
| Eccentricity | Nilai eksentrisitas (rasio antara sumbu utama dan sumbu minor) | Numeric |
| Solidity | Rasio antara area biji labu dan area cembung | Numeric |
| Extent | Rasio area biji terhadap bounding box | Numeric |
| Roundness | Tingkat kebulatan biji labu | Numeric |
| Aspect_Ration | Rasio antara panjang dan lebar biji labu | Numeric |
| Compactness | Tingkat kekompakan bentuk biji labu | Numeric |
| Class | Kategori/label jenis biji labu (Çerçevelik atau Ürgüp Sivrisi) | Categorical |
# Input Data
library(readr)
# Ganti path di bawah dengan lokasi file Anda
file_path <- file.choose() # atau tulis langsung: "Data ADK Studi Kasus 1 - Pumpkin Seeds Dataset.csv"
# Baca file dengan delimiter TAB dan encoding Latin1
pumpkin_data <- read_delim(file_path,
delim = ";",
locale = locale(encoding = "latin1"))
## Rows: 2500 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (6): Eccentricity, Solidity, Extent, Roundness, Compactness, Class
## dbl (2): Area, Convex_Area
## num (5): Perimeter, Major_Axis_Length, Minor_Axis_Length, Equiv_Diameter, As...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Lihat struktur dan ringkasan
str(pumpkin_data)
## spc_tbl_ [2,500 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Area : num [1:2500] 56276 76631 71623 66458 66107 ...
## $ Perimeter : num [1:2500] 888242 1068146 1082987 992051 998146 ...
## $ Major_Axis_Length: num [1:2500] 3261485 4171932 4358328 3815638 3838883 ...
## $ Minor_Axis_Length: num [1:2500] 2202388 2342289 2110457 2225322 2204545 ...
## $ Convex_Area : num [1:2500] 56831 77280 72663 67118 67117 ...
## $ Equiv_Diameter : num [1:2500] 2676805 3123614 3019822 2908899 2901207 ...
## $ Eccentricity : chr [1:2500] "0,7376" "0,8275" "0,8749" "0,8123" ...
## $ Solidity : chr [1:2500] "0,9902" "0,9916" "0,9857" "0,9902" ...
## $ Extent : chr [1:2500] "0,7453" "0,7151" "0,74" "0,7396" ...
## $ Roundness : chr [1:2500] "0,8963" "0,844" "0,7674" "0,8486" ...
## $ Aspect_Ration : num [1:2500] 14809 17811 20651 17146 17413 ...
## $ Compactness : chr [1:2500] "0,8207" "0,7487" "0,6929" "0,7624" ...
## $ Class : chr [1:2500] "Çerçevelik" "Çerçevelik" "Çerçevelik" "Çerçevelik" ...
## - attr(*, "spec")=
## .. cols(
## .. Area = col_double(),
## .. Perimeter = col_number(),
## .. Major_Axis_Length = col_number(),
## .. Minor_Axis_Length = col_number(),
## .. Convex_Area = col_double(),
## .. Equiv_Diameter = col_number(),
## .. Eccentricity = col_character(),
## .. Solidity = col_character(),
## .. Extent = col_character(),
## .. Roundness = col_character(),
## .. Aspect_Ration = col_number(),
## .. Compactness = col_character(),
## .. Class = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
head(pumpkin_data)
Misal, ingin memodelkan probabilitas Class =
“Çerçevelik” (1) vs “Ürgüp Sivrisi”
(0):
pumpkin_data$Class_bin <- ifelse(pumpkin_data$Class == "Çerçevelik", 1, 0)
pumpkin_data$Eccentricity <- as.numeric(gsub(",", ".", pumpkin_data$Eccentricity))
pumpkin_data$Solidity <- as.numeric(gsub(",", ".", pumpkin_data$Solidity))
pumpkin_data$Extent <- as.numeric(gsub(",", ".", pumpkin_data$Extent))
pumpkin_data$Roundness <- as.numeric(gsub(",", ".", pumpkin_data$Roundness))
pumpkin_data$Compactness <- as.numeric(gsub(",", ".", pumpkin_data$Compactness))
model_logit <- glm(Class_bin ~ Area + Perimeter + Major_Axis_Length +
Minor_Axis_Length + Eccentricity + Solidity +
Extent + Roundness + Aspect_Ration + Compactness,
data = pumpkin_data, family = binomial)
summary(model_logit)
##
## Call:
## glm(formula = Class_bin ~ Area + Perimeter + Major_Axis_Length +
## Minor_Axis_Length + Eccentricity + Solidity + Extent + Roundness +
## Aspect_Ration + Compactness, family = binomial, data = pumpkin_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.077e+01 3.031e+01 1.015 0.3100
## Area -1.299e-05 5.638e-06 -2.304 0.0212 *
## Perimeter -9.960e-08 2.067e-07 -0.482 0.6299
## Major_Axis_Length 6.304e-08 5.176e-08 1.218 0.2232
## Minor_Axis_Length 1.812e-07 9.990e-08 1.813 0.0698 .
## Eccentricity 7.357e+01 1.475e+01 4.988 6.09e-07 ***
## Solidity -1.812e+02 2.529e+01 -7.166 7.70e-13 ***
## Extent -9.836e-01 1.280e+00 -0.769 0.4421
## Roundness 6.324e+00 4.391e+00 1.440 0.1498
## Aspect_Ration -3.629e-06 1.234e-05 -0.294 0.7687
## Compactness 1.154e+02 1.436e+01 8.034 9.43e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 3461.7 on 2499 degrees of freedom
## Residual deviance: 1547.7 on 2489 degrees of freedom
## AIC: 1569.7
##
## Number of Fisher Scoring iterations: 7
Penjelasan dan Intepretasi
Goodness of Fit Model
Kesimpulan
Model logistik menunjukkan bahwa variabel Area, Eccentricity, Solidity, dan Compactness berpengaruh signifikan terhadap klasifikasi jenis biji labu. Odds ratio dari koefisien signifikan dapat diinterpretasikan untuk memahami kekuatan dan arah pengaruh prediktor. Model ini layak digunakan untuk prediksi jenis biji labu berdasarkan morfometri, namun evaluasi lebih lanjut tetap diperlukan.
Bandingkan model penuh dengan model null:
model_null <- glm(Class_bin ~ 1, data = pumpkin_data, family = binomial)
anova(model_null, model_logit, test = "Chisq")
Intepretasi
Kesimpulan
Uji likelihood ratio test (G²) memberikan bukti statistik yang sangat kuat bahwa model regresi logistik dengan variabel-variabel prediktor yang dipilih secara signifikan lebih baik dibandingkan model tanpa prediktor, sehingga layak digunakan untuk prediksi klasifikasi biji labu.
library(broom)
tidy(model_logit)
Berdasarkan hasil statistik Wald, dapat disimpulkan beberapa hal berikut:
Secara keseluruhan, model ini mengidentifikasi beberapa variabel morfometri penting yang signifikan dalam membedakan jenis biji labu, dengan Area, Eccentricity, Solidity, dan Compactness sebagai prediktor utama dalam klasifikasi.
coefs <- summary(model_logit)$coefficients
OR <- exp(coefs[, "Estimate"])
CI_lower <- exp(coefs[, "Estimate"] - 1.96 * coefs[, "Std. Error"])
CI_upper <- exp(coefs[, "Estimate"] + 1.96 * coefs[, "Std. Error"])
odds_ratio_table <- cbind(OR, CI_lower, CI_upper)
round(odds_ratio_table, 3)
## OR CI_lower CI_upper
## (Intercept) 2.309477e+13 0.000000e+00 1.464551e+39
## Area 1.000000e+00 1.000000e+00 1.000000e+00
## Perimeter 1.000000e+00 1.000000e+00 1.000000e+00
## Major_Axis_Length 1.000000e+00 1.000000e+00 1.000000e+00
## Minor_Axis_Length 1.000000e+00 1.000000e+00 1.000000e+00
## Eccentricity 8.936138e+31 2.495654e+19 3.199744e+44
## Solidity 0.000000e+00 0.000000e+00 0.000000e+00
## Extent 3.740000e-01 3.000000e-02 4.593000e+00
## Roundness 5.578420e+02 1.020000e-01 3.048166e+06
## Aspect_Ration 1.000000e+00 1.000000e+00 1.000000e+00
## Compactness 1.265753e+50 7.574051e+37 2.115291e+62
Odds Ratio (OR) dan Confidence Interval (CI) memberikan gambaran kekuatan dan arah pengaruh masing-masing variabel terhadap peluang sebuah biji labu diklasifikasikan sebagai “Çerçevelik”. Berikut interpretasinya:
Dengan demikian, eccentricity, solidity, dan compactness adalah prediktor yang sangat kuat dalam membedakan jenis biji labu pada dataset ini. Nilai odds ratio yang sangat besar/kecil mencerminkan pengaruh yang sangat besar terhadap perubahan peluang klasifikasi.
library(ResourceSelection)
## ResourceSelection 0.3-6 2023-06-27
hoslem.test(pumpkin_data$Class_bin, fitted(model_logit), g=10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: pumpkin_data$Class_bin, fitted(model_logit)
## X-squared = 15.686, df = 8, p-value = 0.0471
Hasil uji Hosmer-Lemeshow goodness of fit menunjukkan nilai statistik chi-squared sebesar 15,686 dengan derajat kebebasan 8 dan nilai p = 0,0471.
Karena nilai p < 0,05, maka dapat disimpulkan bahwa terdapat perbedaan yang signifikan antara prediksi model dengan data aktual. Hal ini menandakan bahwa model regresi logistik yang dibangun kurang baik dalam menyesuaikan data (kurang fit). Dengan kata lain, masih terdapat ketidaksesuaian antara hasil predi
Model logistik yang dibangun pada dataset Pumpkin Seeds menunjukkan bahwa variabel Area, Eccentricity, Solidity, dan Compactness berpengaruh signifikan terhadap peluang sebuah biji labu diklasifikasikan sebagai “Çerçevelik”.
Odds ratio memberikan interpretasi intuitif terkait kekuatan dan arah pengaruh setiap prediktor, di mana nilai odds ratio yang sangat besar atau sangat kecil menandakan pengaruh yang dominan terhadap hasil klasifikasi.
Hasil uji Hosmer-Lemeshow menunjukkan nilai p sebesar 0,0471 (p < 0,05), sehingga terdapat perbedaan signifikan antara prediksi model dengan data aktual. Dengan demikian, model ini dinilai kurang fit terhadap data.
Walaupun demikian, model logistik yang dibangun tetap mampu mengidentifikasi variabel-variabel utama yang penting untuk klasifikasi jenis biji labu. Model ini dapat digunakan sebagai dasar untuk klasifikasi otomatis varietas biji labu berdasarkan karakteristik fisik yang terukur, namun perlu dilakukan evaluasi dan penyempurnaan lebih lanjut agar prediksi yang dihasilkan dapat lebih akurat dan sesuai dengan data observasi.
Kaggle Dataset: https://www.kaggle.com/datasets/muratkokludataset/pumpkin-seeds-dataset
KOKLU, M., SARIGIL, S., & OZBEK, O. (2021). The use of machine learning methods in classification of pumpkin seeds (Cucurbita pepo L.). Genetic Resources and Crop Evolution, 68(7), 2713-2726. Doi: https://doi.org/10.1007/s10722-021-01226-0
Regresi logistik adalah metode analisis statistik yang digunakan untuk memodelkan hubungan antara variabel respons biner—yang hanya memiliki dua kategori dengan satu atau lebih variabel prediktor. Dalam penerapannya, variabel prediktor dapat memiliki berbagai jenis skala pengukuran, yaitu:
Nominal: Variabel yang terdiri dari kategori yang tidak memiliki urutan atau ranking tertentu. Sebagai contoh, jenis kelamin (laki-laki dan perempuan). Dalam regresi logistik, variabel nominal biasanya dikonversi menjadi variabel dummy (misalnya, perempuan = 1, laki-laki = 0).
Ordinal: Variabel yang memiliki urutan atau peringkat antara kategori, meskipun jarak antar kategori tidak selalu sama. Contoh dari variabel ordinal adalah tingkat pendidikan (SMA, Sarjana, Magister, Doktor). Dalam regresi logistik, variabel ordinal bisa diperlakukan baik sebagai nominal (dengan dummy untuk setiap kategori) atau sebagai rasio dengan memberikan nilai tertentu yang mencerminkan urutan atau jarak antar tingkatannya.
Rasio: Variabel numerik kontinu yang memiliki nol absolut dan rasio yang bermakna. Contoh yang umum adalah pendapatan yang dapat langsung dimasukkan dalam model regresi logistik tanpa perlu transformasi khusus.
Bab ini akan mengeksplorasi bagaimana regresi logistik dapat diterapkan dengan berbagai jenis prediktor, baik nominal, ordinal, maupun rasio, melalui simulasi data dan analisis eksplorasi yang melibatkan dataset fiktif.
Kita membuat dataset simulasi baru dengan 500 observasi, relevan untuk mahasiswa. Variabel-variabel yang digunakan adalah:
campus: Nominal (On-Campus, Off-Campus). Tempat tinggal mahasiswa apakah di kampus (On-Campus) atau di luar kampus (Off-Campus)
study_effort: Ordinal (Low, Medium, High)
study_hours: Rasio (jam belajar per minggu, distribusi normal)
pass_exam: Respons biner (0 = tidak lulus, 1 = lulus)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::group_rows() masks kableExtra::group_rows()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(knitr)
library(kableExtra)
set.seed(1234)
n <- 500
campus <- sample(c("On-Campus", "Off-Campus"), n, replace = TRUE)
study_effort <- sample(c("Low", "Medium", "High"), n, replace = TRUE)
study_hours <- rnorm(n, mean = 15, sd = 5)
logit_p <- -3 + 0.8 * (campus == "On-Campus") + 1.2 * as.numeric(factor(study_effort, ordered = TRUE)) + 0.1 * study_hours
p <- 1 / (1 + exp(-logit_p))
pass_exam <- rbinom(n, 1, p)
sim_data <- tibble(pass_exam, campus, study_effort, study_hours)
head(sim_data)
Interpretasi: Dataset berisi 500 observasi mahasiswa dengan kolom pass_exam (biner), campus (On-Campus/Off-Campus), study_effort (Low/Medium/High), dan study_hours (jam belajar per minggu). Probabilitas lulus ujian dihasilkan dari kombinasi linier prediktor dengan koefisien tertentu.
Kita mengeksplorasi distribusi pass_exam dan rata-rata study_hours untuk setiap kelompok pass_exam.
sim_data %>%
dplyr::group_by(pass_exam) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Study_Hours = mean(study_hours)
)
Interpretasi: Tabel menunjukkan jumlah mahasiswa yang lulus (pass_exam = 1) dan tidak lulus (pass_exam = 0), serta rata-rata jam belajar per minggu untuk masing-masing kelompok. Ini memberikan gambaran awal tentang hubungan antara jam belajar dan kelulusan ujian.
Kita akan memodelkan study_effort dengan dua pendekatan: (1) sebagai nominal (dummy variables) dan (2) sebagai numerik (mencerminkan urutan ordinal).
Kita mengubah study_effort menjadi faktor dengan Low sebagai baseline.
sim_data_nominal <- sim_data %>%
mutate(
study_effort = factor(study_effort, levels = c("Low", "Medium", "High"))
)
model_nominal <- glm(pass_exam ~ campus + study_effort + study_hours, data = sim_data_nominal, family = binomial)
summary(model_nominal)
##
## Call:
## glm(formula = pass_exam ~ campus + study_effort + study_hours,
## family = binomial, data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.16323 0.38133 -0.428 0.66861
## campusOn-Campus 0.25366 0.21307 1.190 0.23385
## study_effortMedium 1.43618 0.34161 4.204 2.62e-05 ***
## study_effortHigh -0.92388 0.23204 -3.982 6.85e-05 ***
## study_hours 0.06865 0.02284 3.006 0.00265 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 526.94 on 495 degrees of freedom
## AIC: 536.94
##
## Number of Fisher Scoring iterations: 5
Interpretasi Koefisien:
Intercept (-0.16323)
Log-odds dasar untuk mahasiswa Off-Campus dengan usaha belajar Low dan study_hours = 0.
Tidak signifikan (p = 0.66861 > alpha = 0.05), artinya baseline ini tidak berbeda secara signifikan dari probabilitas 50%.
Odds Ratio = 0.85: Peluang lulus sedikit lebih rendah daripada baseline, namun tidak signifikan.
campusOn-Campus (0.25366):
Mahasiswa yang tinggal di lingkungan kampus memiliki log-odds lulus lebih tinggi sebesar 0.25 dibandingkan yang tinggal di luar kampus (referensi).
Tidak signifikan (p = 0.23385 > alpha = 0.05), artinya tinggal di kampus memiliki peluang lulus yang lebih tinggi tetapi tidak secara signifikan dibandingkan tinggal di luar kampus.
Odds Ratio = 1.29: Peluang lulus tinggal di kampus sedikit lebih besar daripada tinggal di luar kampus, namun tidak signifikan.
study_effort
Medium (1.43618):
Mahasiswa dengan usaha belajar medium memiliki log-odds lulus yang lebih tinggi sebesar 1.44 dibandingkan dengan yang usaha belajarnya rendah.
Signifikan (p = \(2.62 \times 10^{-5}\)< alpha = 0.05), artinya usaha belajar medium meningkatkan peluang lulus dibanding usaha belajar rendah.
Odds Ratio = 4.2: Peluang lulus usaha belajar medium 4.2 kali lebih besar dibanding usaha belajar rendah.
High (-0.92388):
Mahasiswa dengan usaha belajar tinggi memiliki log-odds lulus lebih rendah sebesar -0.92 dibandingkan dengan yang usaha belajarnya rendah.
Signifikan (p = \(6.85 \times 10^{-5}\) < alpha = 0.05), artinya usaha belajar tinggi menurunkan peluang lulus dibanding usaha belajar rendah.
Odds Ratio = 0.4: Peluang lulus usaha belajar tinggi hanya 40% dari peluang lulus usaha belajar rendah.
study_hours (0.06865):
Setiap kenaikan 1 satuan jam belajar per minggu (misal 1 jam), meningkatkan log-odds lulus sebesar 0.07.
Signifikan (p = 0.00265< alpha = 0.05), artinya jam belajar berhubungan positif dengan peluang lulus.
Odds Ratio = 1.07: Setiap kenaikan 1 jam meningkatkan peluang lulus sekitar 7%.
Intepretasi Goodness-of-Fit:
Null deviance (609.16): Deviance model tanpa prediktor.
Residual deviance (526.94): Deviance model dengan prediktor. Penurunan dari null ke residual deviance menunjukkan model memberikan informasi yang baik.
AIC (536.94): Nilai AIC yang lebih kecil menunjukkan model yang lebih baik dalam menyeimbangkan kecocokan dan kompleksitas.
Signifikansi Model
Variabel tingkat usaha belajar (Medium dan Tinggi) dan jam belajar signifikan meningkatkan peluang lulus.
Variabel tempat tinggal tidak signifikan pada taraf 5%.
Usaha belajar Tinggi justru berhubungan dengan penurunan peluang lulus dibandingkan usaha belajar rendah dalam data ini, yang bisa diakibatkan oleh hasil data simulasi.
Kesimpulan Praktis
Usaha Belajar dan Jam Belajar adalah prediktor kuat untuk peluang kelulusan, dengan usaha belajar Medium meningkatkan peluang lulus, sementara High justru menurunkan peluang.
Tempat Tinggal tidak berpengaruh signifikan, meskipun mahasiswa On-Campus sedikit lebih berpeluang lulus.
Model cukup baik dalam memprediksi kelulusan dibandingkan model tanpa prediktor, namun dapat lebih ditingkatkan dengan menambahkan variabel lain seperti faktor sosial atau psikologis.
Kita mengkodekan study_effort sebagai numerik: Low = 1, Medium = 2, High = 3.
sim_data_numeric <- sim_data %>%
mutate(
study_effort_numeric = case_when(
study_effort == "Low" ~ 1,
study_effort == "Medium" ~ 2,
study_effort == "High" ~ 3
)
)
model_numeric <- glm(pass_exam ~ campus + study_effort_numeric + study_hours, data = sim_data_numeric, family = binomial)
summary(model_numeric)
##
## Call:
## glm(formula = pass_exam ~ campus + study_effort_numeric + study_hours,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.01770 0.42739 2.381 0.01726 *
## campusOn-Campus 0.29906 0.20250 1.477 0.13971
## study_effort_numeric -0.56044 0.12524 -4.475 7.64e-06 ***
## study_hours 0.06119 0.02140 2.860 0.00424 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 609.16 on 499 degrees of freedom
## Residual deviance: 577.41 on 496 degrees of freedom
## AIC: 585.41
##
## Number of Fisher Scoring iterations: 4
Intepretasi Koefisien:
Intercept (1.0177)
Ini adalah log-odds dasar untuk mahasiswa Off-Campus dengan study_effort = Low (nilai 1) dan study_hours = 0.
Signifikan (p = 0.01726 < 0.05), artinya baseline ini berbeda signifikan dari probabilitas 50%.
Odds Ratio = 2.77: Peluang lulus lebih besar dibandingkan dengan baseline.
campusOn-Campus (0.2991)
Mahasiswa yang tinggal di kampus (On-Campus) memiliki log-odds lulus lebih tinggi sebesar 0.2991 dibandingkan dengan mahasiswa yang tinggal di luar kampus (Off-Campus).
Tidak signifikan (p = 0.1397 > 0.05), artinya tinggal di kampus memiliki peluang lulus yang lebih tinggi, tetapi tidak signifikan dibandingkan tinggal di luar kampus.
Odds Ratio = 1.35: Peluang lulus mahasiswa On-Campus 1.35 kali lebih besar daripada yang tinggal di luar kampus, namun perbedaannya tidak signifikan.
study_effort_numeric (-0.5604)
Setiap kenaikan satu tingkat study_effort, mengurangi log-odds kelulusan.
SIgnifikan (p = \(7.64 \times 10^{-6}\)< 0.05), artinya usaha belajar yang lebih tinggi menurunkan peluang kelulusan dibandingkan usaha belajar rendah.
Odds Ratio = 0.57: Peluang lulus dengan usaha belajar Medium/High hanya 57% dari peluang lulus dennga usaha belajar low.
study_hours (0.06119)
Setiap tambahan satu jam belajar per minggu meningkatkan log-odds kelulusan sebesar 0.06119.
Signifikan (p = 0.00424 < 0.05), artinya jam belajar berhubungan positif dengan peluang lulus.
Odds Ratio = 1.06: Setiap tambahan 1 jam belajar per minggu meningkatkan peluang lulus sekitar 6%.
Goodness of Fit
Null deviance: 609.16 (model tanpa prediktor).
Residual deviance: 577.41 (model dengan prediktor).
AIC: 585.41, menunjukkan model ini memberikan kecocokan yang baik.
Signifikansi Model
study_effort_numeric dan study_hours sangat signifikan (p < 0.05), dengan study_effort_numeric menurunkan peluang kelulusan sedangkan study_hours meningkatkan peluang kelulusan.
campusOn-Campus tidak signifikan (p = 0.1397), menunjukkan tempat tinggal tidak mempengaruhi peluang kelulusan secara signifikan.
Kesimpulan Praktis
Usaha belajar yang lebih tinggi mengurangi peluang kelulusan, sementara lebih banyak jam belajar meningkatkan peluang lulus.
Tempat tinggal (kampus atau luar kampus) tidak memiliki pengaruh signifikan terhadap kelulusan.
Model memiliki kecocokan yang cukup baik, tetapi masih bisa ditingkatkan dengan variabel tambahan.
Perbandingan Model berdasarkan AIC
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 536.942
##
## $AIC_Numeric
## [1] 585.4116
Interpretasi: Model dengan AIC lebih kecil lebih disukai karena menyeimbangkan kecocokan dan kompleksitas dengan lebih baik.
Goodness-of-Fit Model
Kita menghitung McFadden’s R² untuk mengevaluasi kecocokan model.
nullmod <- glm(pass_exam ~ 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.1349697 (df=5)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.05211861 (df=4)
Interpretasi: McFadden’s R² mengukur seberapa baik model memprediksi dibandingkan model null. Nilai yang lebih besar menunjukkan model yang lebih baik.
Visualisasi Prediksi: Kita memvisualisasikan probabilitas prediksi lulus ujian berdasarkan jam belajar dan usaha belajar.
sim_data_nominal <- sim_data_nominal %>%
mutate(predicted = predict(model_nominal, type = "response"))
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal
sim_data_nominal %>%
ggplot(aes(x = study_hours, y = predicted, color = study_effort)) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas Lulus (Ordinal sebagai Nominal)",
x = "Jam Belajar per Minggu", y = "Prediksi Probabilitas Lulus") +
theme_minimal()
# Plot untuk model numeric
sim_data_numeric %>%
ggplot(aes(x = study_hours, y = predicted, color = as.factor(study_effort_numeric))) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas Lulus (Ordinal sebagai Numerik)",
x = "Jam Belajar per Minggu", y = "Prediksi Probabilitas Lulus") +
theme_minimal()
Interpretasi: Visualisasi menunjukkan hubungan antara jam belajar dan probabilitas lulus, dengan warna berbeda untuk tingkat usaha belajar. Pendekatan nominal dan numerik dibandingkan untuk melihat perbedaan pola prediksi.
Ringkasan Koefisien Model
# 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"))
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numerik") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Interpretasi: Tabel menunjukkan estimasi koefisien, standar error, nilai z, dan p-value. Koefisien positif meningkatkan log-odds kelulusan, sedangkan koefisien negatif menurunkannya.
Kesimpulan
campus: Mahasiswa On-Campus memiliki peluang lulus lebih tinggi dibandingkan Off-Campus, tetapi tidak signifikan.
study_effort:
Sebagai dummy: Medium dan High dibandingkan dengan Low, menunjukkan efek spesifik setiap tingkat usaha belajar.
Sebagai numerik: Setiap kenaikan tingkat usaha belajar justru menurunkan peluang lulus secara linier.
study_hours: Jam belajar yang lebih banyak meningkatkan peluang lulus ujian.
Perbandingan Model: Model dengan AIC lebih kecil lebih disukai.
McFadden’s R² menunjukkan seberapa baik model menjelaskan data dibandingkan model null.
Model Perlakuan Ordinal Sebagai Numeric: Model dengan perlakuan ordinal sebagai numeric memberikan interpretasi yang lebih sederhana, selama asumsi jarak antar tingkat usaha belajar konsisten.
Dalam analisis regresi logistik, pemilihan model yang tepat sangat penting untuk menghasilkan model yang efektif dalam memprediksi probabilitas terjadinya suatu peristiwa (respons biner). Terdapat dua pendekatan utama dalam pengembangan model ini, yaitu Pendekatan Konfirmatori dan Pendekatan Eksploratori, yang masing-masing memiliki tujuan dan cara yang berbeda dalam membangun model.
Pendekatan ini digunakan ketika peneliti sudah memiliki teori atau hipotesis yang jelas mengenai hubungan antara variabel prediktor dan respons. Dalam pendekatan ini, peneliti berfokus untuk menguji teori atau hipotesis yang telah ada.
Ciri-ciri:
Berbasis Teori: Model dikembangkan dengan merujuk pada teori yang sudah ada atau temuan penelitian sebelumnya.
Tujuan Utama: Fokus utama adalah menguji validitas teori atau hipotesis yang diajukan, bukan sekadar mencari model terbaik. Peneliti ingin memastikan bahwa hubungan yang dihipotesiskan memang benar-benar signifikan.
Pengujian Efek: Peneliti mulai dengan model yang komprehensif dan menguji apakah penambahan atau pengurangan suatu variabel (misalnya, variabel interaksi) membawa peningkatan signifikan terhadap model.
Uji Signifikansi: Signifikansi diuji dengan membandingkan model yang mengandung efek tertentu dengan model yang tidak mengandung efek tersebut. Salah satu metode yang sering digunakan adalah Likelihood Ratio Test.
Contoh penggunaan: Misalnya, teori yang ada menyatakan bahwa faktor x1 dan x2 berpengaruh terhadap probabilitas seseorang membeli produk. Berdasarkan teori tersebut, model logistik dibangun dengan memasukkan variabel x1 dan x2, lalu diuji untuk melihat apakah kontribusi x2 memang memberikan pengaruh yang signifikan.
Pendekatan ini digunakan ketika peneliti tidak memiliki teori yang pasti atau bertujuan untuk mengeksplorasi hubungan yang mungkin ada antara variabel-variabel. Pendekatan ini lebih fleksibel dan berfokus pada pencarian pola atau hubungan yang tidak terduga dalam data.
Ciri-ciri:
Pembangunan Bertahap: Model dibangun secara bertahap dengan tujuan untuk menemukan kombinasi prediktor terbaik berdasarkan data yang ada.
Pemilihan Variabel Berdasarkan Statistik: Variabel-variabel dipilih berdasarkan kriteria statistik, seperti AIC, deviance, atau log-likelihood, yang mengukur kesesuaian model dengan data.
Metode Seleksi Variabel
Pemilihan variabel dilakukan melalui berbagai pendekatan, seperti:
Forward Selection: Dimulai dengan model yang kosong, kemudian variabel-variabel dimasukkan satu per satu jika mereka terbukti signifikan.
Backward Elimination: Dimulai dengan model yang sudah penuh, kemudian variabel yang tidak signifikan dikeluarkan.
Stepwise Selection: Gabungan dari kedua metode di atas, di mana variabel dapat dimasukkan atau dikeluarkan secara dinamis berdasarkan signifikansi mereka.
Proses seleksi dilakukan melalui: - Forward Selection: Mulai dari model kosong, satu per satu variabel dimasukkan jika signifikan. - Backward Elimination: Mulai dari model penuh, variabel yang tidak signifikan dikeluarkan. - Stepwise Selection: Gabungan dari keduanya, variabel dapat masuk dan keluar secara dinamis.
Tujuan: Pendekatan ini bertujuan untuk menemukan model yang sederhana namun efektif, yang dikenal dengan istilah parsimonious model. Model ini cukup sederhana tetapi mampu memberikan performa prediksi yang baik, menghindari overfitting atau kompleksitas yang tidak perlu.
Pemilihan Pendekatan
Pemilihan antara pendekatan konfirmatori dan eksploratori sangat bergantung pada tujuan penelitian. Jika tujuan penelitian adalah untuk menguji hipotesis tertentu yang sudah didasarkan pada teori yang jelas, maka pendekatan konfirmatori lebih tepat digunakan. Namun, jika tujuan penelitian adalah untuk menemukan model terbaik yang berdasarkan data, tanpa teori yang jelas, maka pendekatan eksploratori lebih cocok.
Dalam banyak kasus, kedua pendekatan ini digunakan secara bersamaan: teori menjadi dasar untuk membangun model, sementara eksplorasi data digunakan untuk menyempurnakan model tersebut. Dengan demikian, kedua pendekatan ini saling melengkapi dan memungkinkan peneliti untuk mendapatkan hasil yang lebih komprehensif.
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(DescTools)
##
## Attaching package: 'DescTools'
## The following objects are masked from 'package:caret':
##
## MAE, RMSE
set.seed(79)
n <- 200
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -0.5 + 1.2 * x1 - 0.8 * x2 + 0.5 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
df <- data.frame(y = as.factor(y), x1, x2, x3)
head(df)
Model Full
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.5008 0.2402 -2.085 0.0371 *
## x1 0.8868 0.1760 5.039 4.67e-07 ***
## x2 -0.5481 0.3293 -1.664 0.0960 .
## x3 0.3852 0.1783 2.160 0.0307 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 260.19 on 199 degrees of freedom
## Residual deviance: 220.58 on 196 degrees of freedom
## AIC: 228.58
##
## Number of Fisher Scoring iterations: 4
null_model <- glm(y ~ 1, data = df, family = binomial)
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
AIC(model_full, step_forward, step_backward, step_both)
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$y, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "Kurva ROC", col = "blue")
auc(roc_obj)
## Area under the curve: 0.7648
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.1796728 0.2468937 0.1522336
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), df$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 115 36
## 1 14 35
##
## Accuracy : 0.75
## 95% CI : (0.684, 0.8084)
## No Information Rate : 0.645
## P-Value [Acc > NIR] : 0.000956
##
## Kappa : 0.4132
##
## Mcnemar's Test P-Value : 0.002979
##
## Sensitivity : 0.4930
## Specificity : 0.8915
## Pos Pred Value : 0.7143
## Neg Pred Value : 0.7616
## Prevalence : 0.3550
## Detection Rate : 0.1750
## Detection Prevalence : 0.2450
## Balanced Accuracy : 0.6922
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.4929577 0.8914729
Kesimpulan: Model terbaik berdasarkan AIC tidak ada karena keempat model menunjukkan nilai AIC = 228.5844 karena keempat parameter (intercept, x1, x2, dan x3 signifikan). ROC menunjukkan AUC sebesar 0.77 yang cukup baik. Pseudo-R² dan hasil klasifikasi juga menunjukkan model cukup akurat.
Tujuan Memberikan cara membandingkan model regresi logistik menggunakan ukuran:
Deviance
AIC (Akaike Information Criterion)
Likelihood-Ratio
serta menjelaskan prinsip Parsimony dalam pemilihan model.
library(MASS)
library(broom)
library(DescTools)
set.seed(79)
Simulasi Data
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -1 + 1.2 * x1 - 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
Pembuatan Model
model1 <- glm(y ~ x1, data = data, family = binomial)
model2 <- glm(y ~ x1 + x2, data = data, family = binomial)
model3 <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
anova(model1, model2, test = "LRT")
anova(model2, model3, test = "LRT")
Model yang lebih kompleks sering kali memiliki nilai AIC dan deviance yang lebih rendah karena model tersebut lebih mampu menangkap variasi dalam data. Namun, ada beberapa pertimbangan penting yang perlu diperhatikan:
Kemudahan Interpretasi: Model yang lebih sederhana cenderung lebih mudah dipahami dan lebih mudah untuk diinterpretasikan, terutama ketika digunakan untuk membuat keputusan praktis.
AIC Tidak Signifikan: Jika penurunan AIC dari model yang lebih kompleks ke model yang lebih sederhana tidak signifikan, maka sebaiknya pilih model yang lebih sederhana.
Parsimony: Prinsip parsimony mengutamakan kesederhanaan dalam model. Model yang lebih sederhana, meskipun mungkin sedikit lebih buruk dalam hal goodness-of-fit, dapat menghindari overfitting, di mana model terlalu sesuai dengan data pelatihan dan kurang dapat menggeneralisasi data baru.
Rumus AIC
\[ \mathrm{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan: AIC adalah ukuran untuk menilai kualitas model berdasarkan dua aspek: goodness-of-fit (melalui log-likelihood atau seberapa baik model memprediksi data) dan kompleksitas model (melalui jumlah parameter 𝑘k). AIC memberikan penalti pada model yang terlalu kompleks, meskipun model tersebut memiliki likelihood yang tinggi. Model dengan AIC yang lebih kecil dianggap lebih baik karena lebih sederhana namun tetap memadai dalam memodelkan data.
Rumus Deviance
\[ D = -2[\log L(\text{model}) - \log L(\text{model saturasi})] \]
Penjelasan: Deviance mengukur sejauh mana model saat ini menyimpang dari model saturasi (model yang sempurna, yang dapat menjelaskan semua variasi dalam data). Deviance yang kecil menunjukkan bahwa model yang digunakan sudah cukup baik dalam memprediksi data yang diamati, mendekati hasil yang diperoleh dari model saturasi. Ini berarti model sudah cocok dengan data yang ada dan memberikan prediksi yang sesuai.
Rumus Likelihood-Ratio
\[ G^2 = -2(\log L_0 - \log L_1) \]
Penjelasan: Statistik Likelihood Ratio (LRT) digunakan untuk menguji apakah penambahan variabel dalam model secara signifikan meningkatkan kecocokan model. Jika nilai G² besar dan p-value kecil (misalnya, kurang dari 0.05), ini menunjukkan bahwa model yang lebih kompleks memberikan kecocokan yang lebih baik dibandingkan dengan model yang lebih sederhana secara statistik, dengan perbedaan yang signifikan. Dengan kata lain, penambahan parameter pada model lebih kompleks memberikan informasi yang berguna untuk menjelaskan data, sehingga model yang lebih kompleks lebih baik dalam hal fit terhadap data.
pred_prob <- predict(model3, type = "response")
pred_class <- factor(ifelse(pred_prob >= 0.5, 1, 0))
conf_matrix <- confusionMatrix(pred_class, data$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 176 45
## 1 25 54
##
## Accuracy : 0.7667
## 95% CI : (0.7146, 0.8134)
## No Information Rate : 0.67
## P-Value [Acc > NIR] : 0.0001614
##
## Kappa : 0.4438
##
## Mcnemar's Test P-Value : 0.0231510
##
## Sensitivity : 0.5455
## Specificity : 0.8756
## Pos Pred Value : 0.6835
## Neg Pred Value : 0.7964
## Prevalence : 0.3300
## Detection Rate : 0.1800
## Detection Prevalence : 0.2633
## Balanced Accuracy : 0.7105
##
## 'Positive' Class : 1
##
\[ \text{Sensitivity} = \frac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FN}} \]
\[ \text{Specificity} = \frac{\mathrm{TN}}{\mathrm{TN} + \mathrm{FP}} \]
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.5454545 0.8756219
Kesimpulan
Deviance yang kecil menunjukkan bahwa model lebih baik dalam mencocokkan data, karena perbedaan antara prediksi model dan data yang diamati lebih kecil.
AIC yang rendah menunjukkan keseimbangan antara kecocokan model dan jumlah parameter yang digunakan. Model dengan AIC lebih rendah dianggap lebih efisien, karena penalti diberikan untuk kompleksitas model yang lebih tinggi.
Likelihood Ratio Test digunakan untuk mengevaluasi apakah model yang lebih kompleks memberikan peningkatan kecocokan yang signifikan dibandingkan dengan model yang lebih sederhana. Jika G² besar dan p-value kecil, maka model kompleks dianggap lebih baik secara statistik.
Tabel klasifikasi membantu menilai seberapa baik model dalam memprediksi hasil aktual dibandingkan dengan hasil yang diprediksi, sehingga mengukur akurasi model secara langsung.
Prinsip Parsimony mengutamakan penggunaan model yang lebih sederhana asalkan kinerjanya mirip dengan model yang lebih kompleks, untuk menghindari overfitting dan memastikan model tetap dapat digeneralisasi dengan baik.
Kurva ROC adalah alat visual yang digunakan untuk mengevaluasi performa model klasifikasi biner. Kurva ini menunjukkan trade-off antara True Positive Rate (Sensitivity) dan False Positive Rate (1 - Specificity) pada berbagai threshold klasifikasi.
Saat cut-off menurun, model mengklasifikasikan lebih banyak pengamatan sebagai positif:
Sensitivitas naik
Spesifisitas turun
Saat cut-off naik, model menjadi lebih konservatif:
Sensitivitas turun
Spesifisitas naik
Kurva ideal memiliki bentuk:
Naik tajam secara vertikal hingga mencapai sensitivitas = 1
Lalu bergerak secara horizontal menuju 1 - specificity = 1
Area under the curve (AUC) mendekati 1
Kurva ROC dapat dibuat menggunakan package pROC:
set.seed(79)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <- -1 + 1.5 * x1 - 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
pred <- predict(model, type = "response")
roc_obj <- roc(data$y, pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.8061
Dalam memilih threshold terbaik, kita bisa mengevaluasi sensitivitas dan spesifisitas pada berbagai cut-off.
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TP <- cm["1", "1"]
FN <- cm["0", "1"]
TP / (TP + FN)
})
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TN <- cm["0", "0"]
FP <- cm["1", "0"]
TN / (TN + FP)
})
print(results)
## Threshold Sensitivity Specificity
## 1 0.10 0.91666667 0.3428571
## 2 0.15 0.90000000 0.4357143
## 3 0.20 0.88333333 0.5357143
## 4 0.25 0.78333333 0.6357143
## 5 0.30 0.75000000 0.6785714
## 6 0.35 0.66666667 0.7642857
## 7 0.40 0.60000000 0.8571429
## 8 0.45 0.58333333 0.8928571
## 9 0.50 0.51666667 0.9285714
## 10 0.55 0.40000000 0.9428571
## 11 0.60 0.36666667 0.9642857
## 12 0.65 0.26666667 0.9785714
## 13 0.70 0.23333333 0.9857143
## 14 0.75 0.16666667 0.9928571
## 15 0.80 0.08333333 0.9928571
## 16 0.85 0.03333333 0.9928571
## 17 0.90 0.01666667 0.9928571
Cut-off optimal bisa dipilih berdasarkan:
Maksimum dari Sensitivity + Specificit atau
mempertimbangkan trade-off sesuai tujuan aplikasi (misalnya: jika False Negative harus dihindari, maka prioritaskan sensitivitas tinggi)
Penjelasan Precision-Recall Curve
Kurva Precision-Recall (PR) adalah alat evaluasi performa model klasifikasi, khususnya sangat berguna saat bekerja dengan data yang tidak seimbang (class imbalance).
\[ \text{Precision} = \frac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FP}} \]
\[ \text{Recall} = \frac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FN}} \]
| Aspek | ROC Curve | Precision-Recall Curve |
|---|---|---|
| Fokus | Semua kelas | Kelas positif saja |
| Kuat di | Data seimbang | Data tidak seimbang |
| Sumbu Y | Sensitivitas (Recall) | Precision |
| Sumbu X | 1 - Spesifisitas | Recall |
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
set.seed(79)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <- -1 + 1.5 * x1 - 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = y, x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
prob <- predict(model, type = "response")
pr <- pr.curve(scores.class0 = prob[data$y == 1],
scores.class1 = prob[data$y == 0],
curve = TRUE)
plot(pr)
Tujuan
Dokumen ini menjelaskan dan menghitung pseudo R-squared dalam regresi
logistik:
- \(R_{\text{Cox and Snell}}^2\)
- \(R_{\text{McFadden}}^2\)
Simulasi Data
set.seed(79)
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -1 + 1.2 * x1 - 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
Model Logistik dan Null Model
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
model_null <- glm(y ~ 1, data = data, family = binomial)
Likelihood dan Rumus \[ R_{\text{Cox and Snell}}^2 = 1 - \left(\frac{L_0}{L_M}\right)^{2/n} \]
\[ R_{\text{McFadden}}^2 = 1 - \frac{\log L_M}{\log L_0} \]
Dengan:
- \(L_0\): likelihood model null (tanpa
prediktor)
- \(L_M\): likelihood model penuh
Perhitungan Manual R-squared
logL0 <- logLik(model_null)
logLM <- logLik(model)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model)
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_Cox_Snell = cox_snell,
R2_McFadden = mcfadden
)
r2
Perhitungan Otomatis dengan Package Tambahan
Menggunakan pscl
if (!require(pscl)) install.packages("pscl"); library(pscl)
## Loading required package: 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(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -138.4993722 -190.2535907 103.5084370 0.2720276 0.2917996 0.4060065
Menggunakan rcompanion
if (!require(rcompanion)) install.packages("rcompanion"); library(rcompanion)
## Loading required package: rcompanion
nagelkerke(model)
## $Models
##
## Model: "glm, y ~ x1 + x2 + x3, binomial, data"
## Null: "glm, y ~ 1, binomial, data"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.272028
## Cox and Snell (ML) 0.291800
## Nagelkerke (Cragg and Uhler) 0.406006
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## -3 -51.754 103.51 2.7352e-22
##
## $Number.of.observations
##
## Model: 300
## Null: 300
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
Menggunakan DescTools
if (!require(DescTools)) install.packages("DescTools"); library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.2720276 0.2510030 0.2917996 0.4060065 0.2565211
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.4587679 0.3290930 0.4634930 0.3221756 284.9987444
## BIC logLik logLik0 G2
## 299.8138743 -138.4993722 -190.2535907 103.5084370
Interpretasi
Nilai \(R^2\) mendekati 1 berarti model memiliki kekuatan prediktif yang baik.
McFadden \(R^2 > 0.2\) sering dianggap sebagai model dengan kecocokan yang baik.
Cox & Snell \(R^2\) lebih konservatif dan tidak pernah mencapai 1 penuh.
Gunakan beberapa pendekatan ini sebagai pelengkap untuk menilai performa model logistik secara lebih menyeluruh.
Distribusi multinomial adalah pengembangan dari distribusi binomial untuk memodelkan kejadian pada lebih dari dua kategori. Jika \(X_1, X_2, \dots, X_k\) menyatakan jumlah kejadian yang terjadi pada masing-masing kategori dari \(k\) kategori, maka probabilitas terjadinya kombinasi tersebut dihitung dengan rumus sebagai berikut:
\[ P(X_1 = x_1, X_2 = x_2, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} \cdot p_1^{x_1} p_2^{x_2} \dots p_k^{x_k} \]
Dengan syarat:
\(\sum_{i=1}^k x_i = n\), yang berarti jumlah total kejadian di semua kategori harus sama dengan jumlah percobaan \(n\).
\(\sum_{i=1}^k p_i = 1\), yang berarti jumlah probabilitas dari semua kategori harus sama dengan 1.
Sebuah survei dilakukan terhadap 15 orang yang diminta untuk memilih warna mobil favorit mereka dari tiga pilihan: Merah (M), Biru (B), dan Hitam (H).
Hasil survei: - Merah: 6 orang - Biru: 5 orang - Hitam: 4 orang
Probabilitas teoretik untuk setiap warna: - \(p_M = 0.4\) (Probabilitas memilih Merah) - \(p_B = 0.33\) (Probabilitas memilih Biru) - \(p_H = 0.27\) (Probabilitas memilih Hitam)
Pertanyaannya: Berapa peluang bahwa dalam 15 orang akan ada 6 yang memilih Merah, 5 memilih Biru, dan 4 memilih Hitam?
Distribusi peluang multinomial dihitung dengan rumus berikut:
\[ P(X_1 = x_1, X_2 = x_2, X_3 = x_3) = \frac{n!}{x_1! x_2! x_3!} \cdot p_1^{x_1} \cdot p_2^{x_2} \cdot p_3^{x_3} \]
Dengan: - \(n = 15\) (jumlah total responden) - \(x_1 = 6, x_2 = 5, x_3 = 4\) (jumlah responden yang memilih Merah, Biru, dan Hitam) - \(p_1 = 0.4, p_2 = 0.33, p_3 = 0.27\) (probabilitas masing-masing warna)
# Menentukan parameter distribusi multinomial
n <- 15
x <- c(6, 5, 4)
p <- c(0.4, 0.33, 0.27)
# Menghitung komponen-koefisien
faktorial_total <- factorial(n)
faktorial_x <- prod(factorial(x))
koefisien <- faktorial_total / faktorial_x
# Menghitung peluang
peluang <- koefisien * prod(p^x)
peluang
## [1] 0.05372289
Ini berarti bahwa probabilitas bahwa 6 orang memilih Merah, 5 orang memilih Biru, dan 4 orang memilih Hitam dalam survei ini adalah 0.0537 atau sekitar 5.37%.
Model ini digunakan untuk memodelkan hubungan antara satu variabel respon kategorik (> 2 kategori) dan satu atau lebih variabel prediktor. Misalkan \(Y\) adalah variabel respon yang memiliki \(k\) kategori, dan kita pilih kategori \(k\) sebagai kategori acuan (baseline), maka model logit untuk kategori \(j\) (\(j = 1, 2, ..., k-1\)) adalah:
\[ \text{log} \left( \frac{P(Y = j)}{P(Y = k)} \right) = \beta_{0j} + \beta_{1j} X_1 + \cdots + \beta_{pj} X_p \]
Dimana: - \(P(Y = j)\) adalah probabilitas respon berada di kategori \(j\), - \(P(Y = k)\) adalah probabilitas respon berada di kategori acuan (baseline), - \(X_1, X_2, ..., X_p\) adalah variabel prediktor, - \(\beta_{0j}, \beta_{1j}, ..., \beta_{pj}\) adalah koefisien model untuk kategori \(j\).
Model ini menghasilkan \(k - 1\) fungsi logit, yaitu perbandingan antara setiap kategori selain kategori baseline terhadap kategori baseline.
Model Baseline-category logit digunakan untuk memodelkan hubungan antara satu variabel respon kategorik dengan lebih dari dua kategori dan satu atau lebih variabel prediktor. Model ini membandingkan kategori lainnya dengan kategori acuan (baseline) dalam bentuk logit.
Persamaan Model Logit
Misalkan \(Y\) adalah variabel respon dengan \(k\) kategori. Jika kita memilih kategori \(k\) sebagai kategori acuan, maka model logit untuk kategori \(j\) (dengan \(j = 1, 2, ..., k-1\)) adalah:
\[ \text{log} \left( \frac{P(Y = j)}{P(Y = k)} \right) = \beta_{0j} + \beta_{1j}X_1 + \cdots + \beta_{pj}X_p \]
Dimana: - \(P(Y = j)\) adalah probabilitas respon berada di kategori \(j\), - \(P(Y = k)\) adalah probabilitas respon berada di kategori acuan (baseline), - \(X_1, X_2, ..., X_p\) adalah variabel prediktor, - \(\beta_{0j}, \beta_{1j}, ..., \beta_{pj}\) adalah koefisien model untuk kategori \(j\).
Contoh Kasus: 3 Kategori Respon
Misalkan respon \(Y\) memiliki tiga kategori, yaitu \(Y \in \{1, 2, 3\}\), dan kita memilih kategori ke-3 sebagai baseline. Maka model logit-nya adalah sebagai berikut:
\[ \text{log} \left( \frac{P(Y = 1)}{P(Y = 3)} \right) = \beta_1 + \beta_1X \] \[ \text{log} \left( \frac{P(Y = 2)}{P(Y = 3)} \right) = \beta_2 + \beta_2X \]
Terdapat dua model logit, yaitu satu untuk perbandingan kategori 1 dengan kategori 3, dan satu lagi untuk perbandingan kategori 2 dengan kategori 3.
Relasi Antar Kategori
Jika kita ingin menghitung logit antara kategori 1 dan 2, maka relasi antar kategori dapat dihitung dengan:
\[ \text{log} \left( \frac{P(Y = 1)}{P(Y = 2)} \right) = \text{log} \left( \frac{P(Y = 1)/P(Y = 3)}{P(Y = 2)/P(Y = 3)} \right) \] \[ = \left( \beta_1 + \beta_1X \right) - \left( \beta_2 + \beta_2X \right) = (\beta_1 - \beta_2) + (\beta_1 - \beta_2)X \]
Jadi, logit antara kategori selain baseline dapat dihitung sebagai selisih dua logit terhadap baseline.
Implementasi di R
Untuk mengimplementasikan model baseline-category
logit di R, kita dapat menggunakan fungsi
multinom() dari package nnet. Berikut adalah
langkah-langkah implementasinya:
# Memasang package nnet jika belum terpasang
# install.packages("nnet")
# Memuat package nnet
library(nnet)
# Contoh data respon dan prediktor
data <- data.frame(
response = factor(c(1, 2, 3, 2, 1, 1, 3, 2, 3, 1)),
predictor = c(3.1, 2.5, 1.2, 4.3, 2.8, 3.5, 1.6, 2.0, 3.0, 4.1)
)
# Menggunakan multinom untuk model logit
model <- multinom(response ~ predictor, data = data)
## # weights: 9 (4 variable)
## initial value 10.986123
## iter 10 value 8.558681
## iter 20 value 8.541366
## final value 8.541328
## converged
# Menampilkan hasil model
summary(model)
## Call:
## multinom(formula = response ~ predictor, data = data)
##
## Coefficients:
## (Intercept) predictor
## 2 1.964609 -0.7127645
## 3 5.873792 -2.3367473
##
## Std. Errors:
## (Intercept) predictor
## 2 3.311268 1.023439
## 3 3.838275 1.437008
##
## Residual Deviance: 17.08266
## AIC: 25.08266
# Jika ingin menetapkan kategori baseline, gunakan relevel
data$response <- relevel(data$response, ref = "3")
model_relevel <- multinom(response ~ predictor, data = data)
## # weights: 9 (4 variable)
## initial value 10.986123
## iter 10 value 8.549806
## final value 8.541328
## converged
summary(model_relevel)
## Call:
## multinom(formula = response ~ predictor, data = data)
##
## Coefficients:
## (Intercept) predictor
## 1 -5.873725 2.336709
## 2 -3.908934 1.623889
##
## Std. Errors:
## (Intercept) predictor
## 1 3.838246 1.436987
## 2 3.229471 1.297405
##
## Residual Deviance: 17.08266
## AIC: 25.08266
Estimasi parameter dalam model logit dapat dilakukan menggunakan metode maximum likelihood estimation (MLE). Dalam pendekatan ini, kita mencari parameter yang memaksimalkan likelihood fungsi, yaitu nilai parameter yang membuat data yang diamati paling mungkin terjadi.
Fungsi Log-Likelihood
Fungsi log-likelihood untuk model logit dengan data respon kategorik \(Y\) dan prediktor \(X\) dapat dituliskan sebagai berikut:
\[ \ell(\theta) = \sum_{i=1}^{n} \sum_{j=1}^{k-1} y_{ij} \log(\hat{p}_{ij}) \]
Dimana: - \(\ell(\theta)\) adalah log-likelihood, - \(n\) adalah jumlah observasi, - \(k\) adalah jumlah kategori respon, - \(y_{ij}\) adalah indikator variabel yang bernilai 1 jika observasi \(i\) berada di kategori \(j\), dan 0 jika tidak, - \(\hat{p}_{ij}\) adalah estimasi probabilitas bahwa observasi \(i\) berada di kategori \(j\) yang dihitung berdasarkan model logit.
Dengan kata lain, \(\hat{p}_{ij} = P(Y = j | X_i)\) adalah probabilitas kategori \(j\) diberikan prediktor \(X_i\).
Algoritma Newton-Raphson
Proses estimasi dilakukan dengan memaksimalkan fungsi log-likelihood tersebut. Salah satu algoritma yang digunakan untuk memaksimalkan fungsi ini adalah Newton-Raphson, yang iteratif. Algoritma ini mengupdate parameter pada setiap iterasi berdasarkan informasi dari gradien dan matriks Hessian (turunan kedua dari log-likelihood).
Langkah-langkah dalam algoritma Newton-Raphson adalah: 1. Menghitung gradien dari log-likelihood, yaitu turunan pertama. 2. Menghitung matriks Hessian, yaitu turunan kedua dari log-likelihood. 3. Mengupdate parameter berdasarkan rumus iteratif: \[ \theta^{(t+1)} = \theta^{(t)} - [H(\theta^{(t)})]^{-1} \nabla \ell(\theta^{(t)}) \] dimana: - \(\theta^{(t)}\) adalah parameter pada iterasi \(t\), - \(\nabla \ell(\theta^{(t)})\) adalah gradien pada iterasi \(t\), - \(H(\theta^{(t)})\) adalah matriks Hessian pada iterasi \(t\).
Implementasi di R
Di R, kita bisa menggunakan fungsi dari package seperti
nnet untuk melakukan estimasi parameter dengan metode
maximum likelihood. Berikut adalah contoh implementasi untuk model logit
menggunakan metode multinom:
# Contoh data respon dan prediktor
data <- data.frame(
response = factor(c(1, 2, 3, 2, 1, 1, 3, 2, 3, 1)),
predictor = c(3.1, 2.5, 1.2, 4.3, 2.8, 3.5, 1.6, 2.0, 3.0, 4.1)
)
# Menggunakan multinom untuk model logit
model <- multinom(response ~ predictor, data = data)
## # weights: 9 (4 variable)
## initial value 10.986123
## iter 10 value 8.558681
## iter 20 value 8.541366
## final value 8.541328
## converged
# Menampilkan hasil model
summary(model)
## Call:
## multinom(formula = response ~ predictor, data = data)
##
## Coefficients:
## (Intercept) predictor
## 2 1.964609 -0.7127645
## 3 5.873792 -2.3367473
##
## Std. Errors:
## (Intercept) predictor
## 2 3.311268 1.023439
## 3 3.838275 1.437008
##
## Residual Deviance: 17.08266
## AIC: 25.08266
Fungsi multinom() secara internal menggunakan
maximum likelihood estimation dengan algoritma optimasi
untuk menghitung estimasi parameter, termasuk algoritma iteratif seperti
Newton-Raphson untuk konvergensi.
Sebuah universitas ingin mengetahui faktor-faktor apa saja yang mempengaruhi preferensi mahasiswa dalam memilih sumber informasi utama untuk belajar: Buku Cetak, E-Book, atau Video Pembelajaran.
Universitas tersebut melakukan survei terhadap 120 mahasiswa dan mengumpulkan data berikut: - Source: Sumber informasi yang dipilih (Buku Cetak, E-Book, Video) - Semester: Semester mahasiswa saat ini (2, 4, 6, 8) - Major: Jurusan mahasiswa (Matematika, Biologi, Fisika) - GPA: Indeks Prestasi Kumulatif mahasiswa
Tujuan Penelitian
Mengetahui bagaimana semester, jurusan, dan IPK memengaruhi pilihan sumber informasi utama mahasiswa.
Rancangan Model
Dalam kasus ini, variabel respon (Y) adalah Source yang memiliki 3 kategori. Prediktornya adalah Semester, Major, dan GPA.
Model baseline-category logit yang dapat digunakan adalah:
\[ \text{log} \left( \frac{P(\text{Source} = j)}{P(\text{Source} = \text{Video})} \right) = \beta_{0j} + \beta_{1j} \cdot \text{Semester} + \beta_{2j} \cdot \text{Major} + \beta_{3j} \cdot \text{GPA} \] untuk \(j =\) Buku Cetak, E-Book.
# Simulasi data preferensi sumber informasi mahasiswa
set.seed(79)
n <- 120
Source <- factor(sample(c("Buku Cetak", "E-Book", "Video"), n, replace = TRUE))
Semester <- sample(c(2, 4, 6, 8), n, replace = TRUE)
Major <- factor(sample(c("Matematika", "Biologi", "Fisika"), n, replace = TRUE))
GPA <- round(runif(n, 2.0, 4.0), 2)
# Simulasi Device berdasarkan probabilitas berbeda per Major
Device <- sapply(Major, function(major) {
if (major == "Matematika") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.5, 0.3, 0.2))
} else if (major == "Biologi") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.4, 0.4, 0.2))
} else {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.3, 0.5, 0.2))
}
})
# Membuat data frame
df <- data.frame(
Source = Source,
Semester = Semester,
Major = Major,
GPA = GPA,
Device = factor(Device)
)
# Menetapkan baseline untuk Device ke "Laptop"
df$Device <- relevel(df$Device, ref = "Laptop")
# Tampilkan 6 baris pertama data
head(df)
# Fitting model multinomial menggunakan data yang telah dibuat (Source, Semester, Major, GPA)
model_mnlogit <- multinom(Source ~ Semester + Major + GPA, data = df)
## # weights: 18 (10 variable)
## initial value 131.833475
## iter 10 value 124.453406
## final value 124.432155
## converged
summary(model_mnlogit)
## Call:
## multinom(formula = Source ~ Semester + Major + GPA, data = df)
##
## Coefficients:
## (Intercept) Semester MajorFisika MajorMatematika GPA
## E-Book 2.687061 -0.05418029 0.53607893 0.0200091 -0.8962757
## Video -1.043062 0.02426798 -0.03774748 0.3602442 0.1075578
##
## Std. Errors:
## (Intercept) Semester MajorFisika MajorMatematika GPA
## E-Book 1.305792 0.1000313 0.5304304 0.5343902 0.3811393
## Video 1.465655 0.1069623 0.6175711 0.5476567 0.4126296
##
## Residual Deviance: 248.8643
## AIC: 268.8643
# Menghitung nilai z (koefisien / standar error)
z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
# Menghitung nilai p menggunakan distribusi normal
pval <- 2 * (1 - pnorm(abs(z)))
# Menampilkan nilai p yang telah dibulatkan ke 4 angka desimal
round(pval, 4)
## (Intercept) Semester MajorFisika MajorMatematika GPA
## E-Book 0.0396 0.5881 0.3122 0.9701 0.0187
## Video 0.4767 0.8205 0.9513 0.5107 0.7944
Intepretasi
E-Book lebih banyak dipilih oleh mahasiswa yang berada di semester yang lebih tinggi dan yang memiliki GPA yang lebih tinggi, terutama di jurusan Matematika.
Video juga lebih banyak dipilih oleh mahasiswa dengan GPA yang lebih tinggi dan mahasiswa di semester yang lebih tinggi. Mahasiswa Fisika dan Matematika memiliki peluang lebih besar untuk memilih Video dibandingkan Buku Cetak.
# Prediksi menggunakan model multinomial
df$Predicted <- predict(model_mnlogit)
# Membuat tabel perbandingan antara prediksi dan nilai aktual
table(Predicted = df$Predicted, Actual = df$Device)
## Actual
## Predicted Laptop Desktop Tablet
## Buku Cetak 25 32 14
## E-Book 16 22 11
## Video 0 0 0
Model lebih banyak memprediksi kategori Buku Cetak dan E-Book dengan distribusi yang cukup merata antara Laptop dan Desktop, namun Tablet kurang sering dipilih di kedua kategori tersebut.
Tidak ada prediksi untuk kategori Video, yang mungkin menunjukkan bahwa model perlu perbaikan atau lebih banyak data untuk menangani kategori ini dengan lebih baik.
# Memastikan package ggplot2 terIntepretasiasang dan dimuat
library(ggplot2)
# Menggunakan model_mnlogit untuk membuat prediksi
df$Predicted <- predict(model_mnlogit)
# Visualisasi prediksi dengan ggplot2
ggplot(df, aes(x = Semester, y = GPA, color = Predicted)) +
geom_point(size = 3) +
labs(title = "Multinomial Logistic Regression Predictions",
x = "Semester", y = "GPA") +
theme_minimal() +
scale_color_manual(values = c("E-Book" = "blue", "Video" = "green", "Buku Cetak" = "red"))
GPA lebih tinggi cenderung diprediksi memilih E-Book (ditunjukkan dengan warna biru) dibandingkan Buku Cetak (ditunjukkan dengan warna merah), terutama pada mahasiswa yang berada di semester yang lebih tinggi.
Semua prediksi pada semester 2, 4, 6, dan 8 menunjukkan bahwa mahasiswa dengan GPA tinggi lebih cenderung memilih E-Book, sementara yang memiliki GPA lebih rendah cenderung memilih Buku Cetak.
Semua prediksi menunjukkan pola yang lebih kuat di semester lebih tinggi, menunjukkan bahwa preferensi untuk E-Book lebih dominan di kalangan mahasiswa yang lebih senior (semester lebih tinggi).
Model regresi logistik multinomial memberikan wawasan yang lebih mendalam tentang faktor-faktor yang memengaruhi pilihan perangkat kerja di perusahaan. Selain itu, model ini juga dapat digunakan untuk prediksi perangkat yang mungkin dipilih oleh karyawan baru berdasarkan atribut mereka. Dengan demikian, perusahaan dapat lebih tepat dalam memberikan perangkat kerja yang sesuai dengan karakteristik dan kebutuhan karyawan, yang dapat meningkatkan produktivitas dan kenyamanan kerja.
Regresi logistik ordinal digunakan ketika variabel respon \(Y\) bersifat ordinal, yaitu memiliki urutan atau tingkatan, seperti tingkat kepuasan yang bisa memiliki kategori: Rendah, Sedang, dan Tinggi.
Regresi logistik ordinal berbeda dengan: - Regresi logistik biner: Digunakan ketika respon hanya memiliki dua kategori (misalnya, Ya atau Tidak). - Regresi logistik multinomial: Digunakan ketika respon memiliki lebih dari dua kategori, tetapi kategori tersebut tidak memiliki urutan (misalnya, pilihan jenis perangkat: Laptop, Desktop, Tablet).
Pada regresi logistik ordinal, model yang digunakan sering kali adalah Cumulative Logit Model, yang mengasumsikan proportional odds. Proportional odds berarti bahwa koefisien regresi yang digunakan adalah sama untuk semua kategori kumulatif (misalnya, membandingkan kategori Rendah vs. Sedang atau Tinggi, Sedang vs. Tinggi, dan seterusnya).
Model yang digunakan untuk Cumulative Logit adalah:
\[ \text{log} \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta X \]
Dimana: - \(P(Y \leq j)\) adalah probabilitas bahwa nilai respon \(Y\) berada pada kategori \(j\) atau kategori yang lebih rendah. - \(P(Y > j)\) adalah probabilitas bahwa nilai respon \(Y\) berada pada kategori \(j\) atau kategori yang lebih tinggi. - \(\alpha_j\) adalah intercept khusus untuk kategori ke-\(j\). - \(\beta\) adalah koefisien regresi, yang sama untuk semua kategori kumulatif.
Koefisien \(\beta\) dalam Cumulative Logit Model menjelaskan efek dari variabel prediktor terhadap kemungkinan berada pada kategori yang lebih rendah atau sama.
Interpretasi Koefisien:
Contoh Intepretasi
Misalkan kita memiliki model untuk tingkat kepuasan yang memiliki tiga kategori: Rendah, Sedang, dan Tinggi. Model regresi logistik ordinal menghasilkan koefisien sebagai berikut:
\[ \text{log} \left( \frac{P(Y \leq \text{Sedang})}{P(Y > \text{Sedang})} \right) = -0.5 + 0.1 \cdot \text{Age} - 0.3 \cdot \text{GPA} \]
Dari model ini: - Intercept = -0.5: Ini adalah intercept untuk kategori Sedang. - Koefisien untuk Age = 0.1: Ini menunjukkan bahwa setiap peningkatan satu tahun usia meningkatkan log-odds untuk berada di kategori Rendah atau Sedang dibandingkan Tinggi sebesar 0.1. - Koefisien untuk GPA = -0.3: Ini menunjukkan bahwa setiap peningkatan satu poin GPA mengurangi log-odds untuk berada di kategori Rendah atau Sedang dan lebih cenderung berada di kategori Tinggi.
Kesimpulan:
Misal kita memiliki data fktif tingkat kepuasan pelanggan (1: Tidak Puas, 2: Cukup, 3: Puas) terhadap fasilitas toko:
# Menggunakan set.seed(79) sesuai permintaan
set.seed(79)
# Membuat data fiktif dengan variabel prediktor fasilitas toko (1-10)
n <- 200
fasilitas_toko <- round(runif(n, 1, 10)) # Fasilitas toko antara 1 hingga 10
# Menentukan tingkat kepuasan pelanggan berdasarkan fasilitas toko
satisfaction <- cut(5 + 0.5 * fasilitas_toko + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
# Membuat data frame
df <- data.frame(satisfaction, fasilitas_toko)
# Pastikan satisfaction adalah faktor ordinal dengan urutan yang benar
df$satisfaction <- factor(df$satisfaction, ordered = TRUE, levels = c("Tidak Puas", "Cukup", "Puas"))
# Cek distribusi kategori kepuasan
table(df$satisfaction)
##
## Tidak Puas Cukup Puas
## 21 59 120
# Menampilkan 6 baris pertama data
head(df)
library(MASS)
model_ord <- polr(satisfaction ~ fasilitas_toko, data = df, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = satisfaction ~ fasilitas_toko, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## fasilitas_toko 0.8611 0.1042 8.261
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 0.9083 0.3823 2.3758
## Cukup|Puas 3.8180 0.5058 7.5491
##
## Residual Deviance: 230.9521
## AIC: 236.9521
Koefisien
Intercept
Statistik Lainnya:
t value untuk fasilitas_toko = 8.261: Ini menunjukkan bahwa koefisien fasilitas_toko signifikan secara statistik, karena nilai t yang lebih besar dari 2 umumnya menunjukkan hasil yang signifikan.
Residual Deviance = 230.9521 dan AIC = 236.9521: Nilai AIC yang lebih rendah menunjukkan model yang lebih baik, namun perbandingan dengan model lain diperlukan untuk penilaian lebih lanjut.
Kesimpulan
Setiap peningkatan satu unit dalam penilaian fasilitas toko meningkatkan log-odds untuk berada di kategori kepuasan yang lebih tinggi (misalnya, dari Tidak Puas ke Cukup, atau dari Cukup ke Puas) sebesar 0.8611. Nilai t value = 8.261 menunjukkan bahwa koefisien fasilitas toko sangat signifikan secara statistik, menunjukkan pengaruh yang kuat.
Untuk kategori Tidak Puas vs Cukup, log-oddsnya adalah 0.9083, yang menunjukkan perbedaan log-odds bahwa seorang pelanggan akan berada di kategori Tidak Puas atau Cukup dibandingkan Puas. t value = 2.3758 menunjukkan bahwa perbedaan ini signifikan secara statistik.
Untuk kategori Cukup vs Puas, log-oddsnya adalah 3.8180, menunjukkan log-odds yang lebih besar bahwa pelanggan akan memilih Cukup atau Puas dibandingkan Tidak Puas. Nilai t value = 7.5491 menunjukkan bahwa perbedaan ini sangat signifikan secara statistik.
Secara keseluruhan, fasilitas toko memiliki pengaruh signifikan terhadap kepuasan pelanggan. Semakin tinggi fasilitas toko, semakin besar kemungkinan pelanggan berada di kategori kepuasan yang lebih tinggi.
ctable <- coef(summary(model_ord))
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## fasilitas_toko 0.8611146 0.1042378 8.261060 0.0000
## Tidak Puas|Cukup 0.9083215 0.3823163 2.375838 0.0175
## Cukup|Puas 3.8179791 0.5057544 7.549077 0.0000
Berdasarkan p-value yang diberikan, berikut adalah interpretasi:
Fasilitas Toko (p-value = 0.0000): P-value yang sangat kecil (0.0000) menunjukkan bahwa fasilitas toko memiliki pengaruh yang sangat signifikan terhadap tingkat kepuasan pelanggan. Artinya, fasilitas toko secara statistik berhubungan dengan peralihan kepuasan pelanggan antara kategori Tidak Puas, Cukup, dan Puas.
Tidak Puas|Cukup (p-value = 0.0175): P-value sebesar 0.0175 menunjukkan bahwa perbandingan antara kategori Tidak Puas dan Cukup juga signifikan secara statistik. Dengan kata lain, faktor fasilitas toko mempengaruhi kemungkinan pelanggan berada di kategori Tidak Puas atau Cukup dibandingkan dengan Puas.
Cukup|Puas (p-value = 0.0000): P-value yang sangat kecil (0.0000) untuk perbandingan antara kategori Cukup dan Puas menunjukkan bahwa perbedaan antara kategori Cukup dan Puas sangat signifikan secara statistik, yang berarti fasilitas toko juga berperan besar dalam mempengaruhi kepuasan pelanggan yang lebih tinggi.
Secara keseluruhan, semua p-value menunjukkan bahwa fasilitas toko adalah prediktor yang signifikan untuk tingkat kepuasan pelanggan, baik untuk peralihan antara kategori rendah (Tidak Puas) ke menengah (Cukup), maupun dari menengah (Cukup) ke tinggi (Puas).
newdata <- data.frame(fasilitas_toko = 5:9)
predict(model_ord, newdata = newdata, type = "probs")
## Tidak Puas Cukup Puas
## 1 0.032381470 0.34807907 0.6195395
## 2 0.013948093 0.19213350 0.7939184
## 3 0.005943589 0.09292824 0.9011282
## 4 0.002520950 0.04180114 0.9556779
## 5 0.001067135 0.01815936 0.9807735
Ketika fasilitas toko memiliki skor 5, ada sekitar 61.95% peluang pelanggan akan merasa Puas, 34.81% peluang merasa Cukup, dan 3.24% merasa Tidak Puas.
Dengan fasilitas toko di skor 6, ada 79.39% peluang pelanggan merasa Puas, 19.21% merasa Cukup, dan hanya 1.39% merasa Tidak Puas.
Pada fasilitas toko skor 7, probabilitas pelanggan yang merasa Puas meningkat menjadi 90.11%, sementara yang merasa Cukup adalah 9.29% dan yang merasa Tidak Puas hanya 0.59%.
Dengan fasilitas toko skor 8, pelanggan hampir pasti merasa Puas dengan probabilitas 95.57%, dan sangat sedikit yang merasa Cukup (4.18%) atau Tidak Puas (0.25%).
Dengan fasilitas toko skor 9, probabilitas bahwa pelanggan merasa Puas hampir 98.08%, sementara hanya 1.82% yang merasa Cukup dan 0.11% yang merasa Tidak Puas
Kesimpulan
Seiring dengan peningkatan skor fasilitas toko, probabilitas untuk pelanggan merasa Puas meningkat secara signifikan, sementara probabilitas untuk merasa Tidak Puas atau Cukup menurun.
Ini menunjukkan bahwa fasilitas toko memiliki pengaruh besar terhadap tingkat kepuasan pelanggan, dengan pelanggan semakin puas saat fasilitas toko meningkat.
Goodness-of-fit dalam konteks regresi logistik ordinal digunakan untuk mengevaluasi sejauh mana model yang dibangun sesuai dengan data yang diamati. Ini memberikan indikasi apakah model mampu menjelaskan variabilitas dalam data dengan baik.
Terdapat beberapa metode seperti Deviance dan Residual Deviance, AIC, dan Pseudo-R2.
Asumsi proportional odds menganggap bahwa koefisien regresi \(\beta\) yang sama berlaku untuk semua kategori kumulatif. Artinya, rasio odds untuk perbandingan kategori yang lebih rendah dibandingkan dengan kategori yang lebih tinggi adalah konsisten di seluruh kategori.
Sebagai contoh, dalam model kepuasan, kita mengasumsikan bahwa: - Rasio odds untuk Rendah vs. Sedang atau Tinggi adalah sama dengan Sedang vs. Tinggi. - Hal ini mengimplikasikan bahwa pengaruh variabel prediktor (seperti usia, pendapatan, dll) terhadap peralihan antara kategori tidak berubah antara kategori Rendah, Sedang, dan Tinggi.
Selain cumulative logit, model ordinal lainnya:
Adjacent-category logit
Continuation-ratio (sequential) logit
Kedua odel tersebut dapat digunakan saat asumsi proportional odds tidak terpenuhi.
Regresi ordinal sangat berguna untuk menganalisis variabel respon yang memiliki urutan atau berurutan.
Model cumulative logit menginterpretasikan dampak variabel prediktor dalam bentuk log-odds kumulatif, yang menjelaskan pengaruh prediktor terhadap peluang masuk ke kategori yang lebih rendah atau lebih tinggi.
Implementasi di R dapat dilakukan menggunakan
fungsi polr() dari package
MASS, yang menyediakan cara praktis untuk membangun
model logistik ordinal.
Untuk validasi lebih lanjut, dapat dilakukan uji Deviance atau Likelihood Ratio Test untuk mengevaluasi kecocokan model atau membandingkan model dengan penambahan prediktor.
Model regresi logistik ordinal yang sering digunakan adalah Cumulative Logit Model, yang mengandalkan asumsi Proportional Odds. Asumsi ini juga dikenal sebagai asumsi paralelisme (parallel lines assumption).
Asumsi paralelisme menyatakan bahwa koefisien regresi (\(\beta\)) adalah sama untuk setiap kategori kumulatif dari variabel respon. Artinya, meskipun nilai intercept (\(\alpha\)) dapat berbeda antara kategori, koefisien \(\beta\) tetap konstan di semua transisi antar kategori.
Bentuk umum modelnya adalah:
\[ \text{log} \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta X \]
untuk \(j = 1, 2, ..., k - 1\), di mana hanya intercept (\(\alpha\)) yang berbeda antar kategori, sedangkan koefisien (\(\beta\)) tetap sama untuk semua kategori.
Visualisasi Asumsi Paralelisme
Jika asumsi paralelisme dipenuhi, kurva logit kumulatif untuk setiap kategori terhadap prediktor akan memiliki kemiringan yang sama (paralel), hanya posisi intercept-nya yang berbeda.
Konsekuensi Jika Asumsi Tidak Terpenuhi
Jika asumsi ini tidak dipenuhi, maka: - Efek prediktor bisa berbeda untuk setiap batas kategori. - Model cumulative logit menjadi tidak valid. - Sebagai alternatif, model lain yang bisa digunakan adalah: - Generalized Ordinal Logistic Regression - Partial Proportional Odds Model
Pengujian Asumsi Paralelism
Untuk memeriksa apakah asumsi ini valid, dapat dilakukan uji sebagai berikut:
Brant Test (menggunakan package
brant di R).
Jika p-value < 0.05, maka asumsi paralelisme tidak terpenuhi.
Kesimpulan
Asumsi paralelisme sangat penting untuk memastikan validitas model cumulative logit.
Dengan asumsi ini, interpretasi menjadi lebih sederhana karena efek prediktor dianggap konstan.
Jika asumsi ini tidak terpenuhi, model ordinal alternatif harus digunakan.
Analisis data kategorikal sangat penting dalam statistika terapan karena banyak fenomena nyata menghasilkan data dalam bentuk kategori, seperti jenis kelamin, Kepuasan pekerjaan, tingkat pendidikan, preferensi konsumen, atau diagnosis medis. Data kategori ini umumnya dianalisis dengan tabel kontingensi, model log-linier, serta model regresi logistik, di mana tiap pendekatan memiliki keunggulan dan keterbatasan tergantung pada tujuan dan struktur data yang dianalisis.
Tabel kontingensi menjadi langkah awal untuk mengeksplorasi hubungan antara dua atau lebih variabel kategorikal. Sebagai contoh, misal dalam studi efek latihan terhadap hipertensi, tabel kontingensi bisa memperlihatkan distribusi pasien dengan dan tanpa hipertensi berdasarkan kelompok latihan yang diikuti. Tabel ini juga membantu menghitung ukuran asosiasi, seperti odds ratio, risk ratio, serta statistik chi-square untuk menguji hubungan antara variabel.
Untuk membangun model yang dapat mengontrol efek dari banyak variabel beserta interaksinya, model log-linier sangat berguna. Model log-linier merupakan varian dari Generalized Linear Model (GLM) yang diaplikasikan pada frekuensi sel tabel kontingensi dan mengasumsikan distribusi Poisson. Berbeda dari regresi logistik, model ini memperlakukan semua variabel secara simetris tanpa membedakan mana yang dependen atau independen. Model log-linier cocok digunakan saat tujuan analisis adalah memahami pola asosiasi atau independensi antar variabel, bukan untuk prediksi.
Struktur model log-linier ditentukan oleh efek utama dan interaksi antar variabel. Sebagai contoh, dalam analisis tiga variabel (misal: jenis kelamin, Kepuasan merokok, dan penyakit jantung), model log-linier dapat mengevaluasi apakah interaksi dua variabel sudah cukup ataukah perlu menambahkan interaksi tiga variabel untuk menjelaskan data. Pemilihan model dilakukan dengan uji rasio kemungkinan untuk membandingkan model sederhana dan kompleks.
Di sisi lain, regresi logistik digunakan bila ada satu variabel kategorikal yang berperan sebagai dependen (contoh: hasil lulus/tidak) dan satu atau lebih variabel prediktor (kategorikal/numerik). Model ini memodelkan logit dari probabilitas kejadian dan sangat bermanfaat baik dalam studi observasional maupun eksperimental. Regresi logistik dapat dikembangkan untuk kategori lebih dari dua kelas, seperti regresi logistik multinomial atau ordinal.
Secara ringkas, tabel kontingensi bersifat deskriptif, model log-linier mengeksplorasi hubungan simetris antar variabel, dan regresi logistik digunakan untuk prediksi outcome kategorikal. Pemilihan Tipe_Pembayaran didasarkan pada fokus analisis: deskripsi, eksplorasi struktur, atau prediksi hasil dengan variabel penjelas. Kombinasi ketiganya sering diterapkan dalam praktik untuk pemahaman data kategorikal yang lebih dalam.
Dalam analisis data kategorikal, Tipe_Pembayaran yang umum digunakan antara lain:
Walaupun ketiganya bisa diterapkan untuk data kategorikal, pendekatan serta cara interpretasinya berbeda-beda.
Tabel Kontingensi
Tabel kontingensi memberikan jumlah frekuensi dari kombinasi kategori antar variabel.
Contoh tabel 2x2:
table_data <- matrix(c(14, 11, 6, 9), nrow = 2,
dimnames = list(Tipe_Pembayaran = c("Tunai", "Kartu Kredit"),
Kepuasan = c("Puas", "Tidak Puas")))
table_data
## Kepuasan
## Tipe_Pembayaran Puas Tidak Puas
## Tunai 14 6
## Kartu Kredit 11 9
Tabel kontingensi bersifat deskriptif dan tidak melibatkan pemodelan probabilitas
Model Loglinear
Model loglinear memodelkan logaritma dari ekspektasi frekuensi sel dalam tabel kontingensi.
\[ \log(\mu_{ij}) = \mu + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Cocok untuk menyelidiki asosiasi dan independensi antar variabel.
Tidak membedakan antara variabel respon dan penjelas.
Umumnya digunakan pada tabel multi-dimensi (2 arah, 3 arah, dst).
library(MASS)
loglm(~ Tipe_Pembayaran + Kepuasan, data = table_data)
## Call:
## loglm(formula = ~Tipe_Pembayaran + Kepuasan, data = table_data)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.9649344 1 0.3259468
## Pearson 0.9600000 1 0.3271869
Model Regresi Logistik
Model regresi logistik biner:
\[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_1 x \]
Contoh:
data_glm <- data.frame(
Puas = c(1, 0, 1, 0),
Tipe_Pembayaran_Pembayaran = factor(c("Kredit", "Kredit", "Tunai", "Tunai")),
Frek = c(14, 11, 6, 9)
)
model_logit <- glm(Puas ~ Tipe_Pembayaran_Pembayaran, weights = Frek, family = binomial, data = data_glm)
summary(model_logit)
##
## Call:
## glm(formula = Puas ~ Tipe_Pembayaran_Pembayaran, family = binomial,
## data = data_glm, weights = Frek)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.2412 0.4029 0.599 0.549
## Tipe_Pembayaran_PembayaranTunai -0.6466 0.6634 -0.975 0.330
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 55.452 on 3 degrees of freedom
## Residual deviance: 54.487 on 2 degrees of freedom
## AIC: 58.487
##
## Number of Fisher Scoring iterations: 4
Perbandingan Ketiga Pendekatan
| Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
|---|---|---|---|
| Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
| Variabel dependen | Tidak ada | Tidak ada (intersit) | Ada (eksplisit) |
| Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial ( probabilitas) |
| Bentuk Model | Tidak ada | GLM: log(μ) ~ efek | GLM: logit(p) ~ prediktor |
| Cocok untuk | Eksplorasi awal | Tabel > 2 variabel | Studi prediktif |
Tabel kontingensi menyajikan frekuensi dari kombinasi kategori antar dua atau lebih variabel. Misal:
# Contoh tabel 2x2
matrix(c(14, 11, 6, 9), nrow = 2,
dimnames = list(Tipe_Pembayaran = c("Tunai", "Kartu Kredit"),
Kepuasan = c("Puas", "Tidak Puas")))
## Kepuasan
## Tipe_Pembayaran Puas Tidak Puas
## Tunai 14 6
## Kartu Kredit 11 9
Model log-linier untuk tabel I x J dapat dituliskan: \[ \log(\mu_{ij}) = \mu + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Model saturated atau model penuh menyertakan seluruh efek utama dan interaksi:
• Cocok sempurna terhadap data
• Tidak mengasumsikan independensi antar variabel
Contoh formulasi untuk tabel 2x2:
# Data
library(MASS)
data <- matrix(c(14, 11, 6, 9), nrow = 2,
dimnames = list(Tipe_Pembayaran = c("Tunai", "Kartu Kredit"),
Kepuasan = c("Puas", "Tidak Puas")))
ftable(data)
## Kepuasan Puas Tidak Puas
## Tipe_Pembayaran
## Tunai 14 6
## Kartu Kredit 11 9
Model saturated dapat dipasang dengan loglm dari package
{MASS}:
model_saturated <- loglm(~ Tipe_Pembayaran * Kepuasan, data = data)
summary(model_saturated)
## Formula:
## ~Tipe_Pembayaran * Kepuasan
## attr(,"variables")
## list(Tipe_Pembayaran, Kepuasan)
## attr(,"factors")
## Tipe_Pembayaran Kepuasan Tipe_Pembayaran:Kepuasan
## Tipe_Pembayaran 1 0 1
## Kepuasan 0 1 1
## attr(,"term.labels")
## [1] "Tipe_Pembayaran" "Kepuasan"
## [3] "Tipe_Pembayaran:Kepuasan"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model independen mengasumsikan bahwa tidak ada interaksi antara variabel:
\[ \log(\mu_{ij}) = \mu + \lambda^T_i + \lambda^B_j \] Model ini menguji hipotesis bahwa variabel X dan Y saling independen.
model_indep <- loglm(~ Tipe_Pembayaran + Kepuasan, data = data)
summary(model_indep)
## Formula:
## ~Tipe_Pembayaran + Kepuasan
## attr(,"variables")
## list(Tipe_Pembayaran, Kepuasan)
## attr(,"factors")
## Tipe_Pembayaran Kepuasan
## Tipe_Pembayaran 1 0
## Kepuasan 0 1
## attr(,"term.labels")
## [1] "Tipe_Pembayaran" "Kepuasan"
## attr(,"order")
## [1] 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.9649344 1 0.3259468
## Pearson 0.9600000 1 0.3271869
Odds ratio untuk tabel 2x2:
\[ OR = \frac{n_{11}n_{22}}{n_{12}n_{21}} \]
Interpretasi nilai OR:
Dalam model saturated:
# Estimasi odds ratio dan log-odds
logOR <- log((data[1,1] * data[2,2]) / (data[1,2] * data[2,1]))
logOR
## [1] 0.6466272
Perbandingan antar model dilakukan dengan menggunakan statistik deviance (G²) atau likelihood ratio test.
anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Tipe_Pembayaran + Kepuasan
## Model 2:
## ~Tipe_Pembayaran * Kepuasan
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 0.9649344 1
## Model 2 0.0000000 0 0.9649344 1 0.32595
## Saturated 0.0000000 0 0.0000000 0 1.00000
Model log-linear digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorikal yang disajikan dalam tabel kontingensi. Model ini mengasumsikan bahwa logaritma ekspektasi frekuensi sel (\(\mu_{ij}\)) adalah_
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Diberikan data:
| Puas | Tidak Puas | Total | |
|---|---|---|---|
| Juara Lomba (Ya) | 21 | 15 | 36 |
| Tidak | 12 | 38 | 50 |
| Total | 33 | 53 | 86 |
Model log-linear pada tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
dengan constraint sum-to-zero:
\[ \sum_i \lambda^A_i = 0,\quad \sum_j \lambda^B_j = 0,\quad \sum_{i,j} \lambda^{AB}_{ij} = 0 \]
Misalkan:
Observasi:
\[ \begin{aligned} \log(\mu_{11}) &= \lambda + \lambda^A_1 + \lambda^B_1 + \lambda^{AB}_{11} \\ \log(\mu_{12}) &= \lambda + \lambda^A_1 + \lambda^B_2 + \lambda^{AB}_{12} \\ \log(\mu_{21}) &= \lambda + \lambda^A_2 + \lambda^B_1 + \lambda^{AB}_{21} \\ \log(\mu_{22}) &= \lambda + \lambda^A_2 + \lambda^B_2 + \lambda^{AB}_{22} \end{aligned} \]
Dengan constraint sum-to-zero:
\[ \lambda^A_1 + \lambda^A_2 = 0,\quad \\ \lambda^B_1 + \lambda^B_2 = 0,\quad \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} = 0 \]
Langkah-langkah:
1. Hitung rata-rata log frekuensi sel:
\[ \lambda = \frac{1}{4} \sum_{i=1}^{2} \sum_{j=1}^{2} \log(n_{ij}) \\ = \frac{1}{4} (\log(25) + \log(15) + \log(12) + \log(38)) \\ = \frac{1}{4} (3.2189 + 2.7081 + 2.4849 + 3.6376) \\ = 3.0124 \]
2. Efek utama A (Juara Lomba):
\[ \lambda^A_1 = \frac{1}{2} \left[ (\log(25) + \log(15)) - (\log(12) + \log(38)) \right] \\ = \frac{1}{2} \left[ (3.2189 + 2.7081) - (2.4849 + 3.6376) \right] \\ = \frac{1}{2} (5.9270 - 6.1225) = \frac{1}{2} (-0.1955) = -0.0977 \]
\[ \lambda^A_2 = -\lambda^A_1 = 0.0977 \]
3. Efek utama B (Kepuasan):
\[ \lambda^B_1 = \frac{1}{2} \left[ (\log(25) + \log(12)) - (\log(15) + \log(38)) \right] \\ = \frac{1}{2} \left[ (3.2189 + 2.4849) - (2.7081 + 3.6376) \right] \\ = \frac{1}{2} (5.7038 - 6.3457) = \frac{1}{2} (-0.6419) = -0.3209 \]
\[ \lambda^B_2 = -\lambda^B_1 = 0.3209 \]
4. Efek interaksi:
\[ \lambda^{AB}_{11} = \frac{1}{4} \left[ \log(25) - \log(15) - \log(12) + \log(38) \right] \\ = \frac{1}{4} [3.2189 - 2.7081 - 2.4849 + 3.6376] \\ = \frac{1}{4} (3.2189 - 2.7081 - 2.4849 + 3.6376) \\ = \frac{1}{4} (1.6635) \\ = 0.4159 \]
\[ \lambda^{AB}_{12} = -\lambda^{AB}_{11} = -0.4159 \] \[ \lambda^{AB}_{21} = -0.4159 \] \[ \lambda^{AB}_{22} = +0.4159 \]
Ringkasan parameter:
\[ \mathrm{OR} = \frac{n_{11} n_{22}}{n_{12} n_{21}} = \frac{25 \times 38}{15 \times 12} = \frac{950}{180} = 5.28 \]
Log odds ratio:
\[ \log(\mathrm{OR}) = \log(5.28) = 1.664 \]
Standard error (SE):
\[ SE = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} }\] \[ = \sqrt{ \frac{1}{25} + \frac{1}{15} + \frac{1}{12} + \frac{1}{38} } = \sqrt{0.04 + 0.0667 + 0.0833 + 0.0263} = \sqrt{0.2163} = 0.4648 \]
95% Confidence Interval untuk log(OR):
\[ \log(\mathrm{OR}) \pm 1.96 \times SE = \\ 1.664 \pm 1.96 \times 0.4648 = (1.664 - 0.910,\ 1.664 + 0.910) = (0.754,\ 2.574) \]
Back-transform untuk memperoleh CI untuk OR:
\[ \text{Batas bawah} = \exp(0.754) = 2.13 \\ \text{Batas atas} = \exp(2.574) = 13.12 \]
Jadi, OR = 1.66 (95% CI: 2.13 – 13.12)
# Data 2x2
tabel <- matrix(c(25, 15, 12, 38), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Puas", "Tidak Puas")
rownames(tabel) <- c("Ya", "Tidak")
tabel
## Puas Tidak Puas
## Ya 25 15
## Tidak 12 38
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Juara_Lomba", "Kepuasan", "Freq")
data
# Model tanpa interaksi
fit_no_inter <- glm(Freq ~ Juara_Lomba + Kepuasan, family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Juara_Lomba + Kepuasan, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.8000 0.2023 13.842 <2e-16 ***
## Juara_LombaTidak 0.2231 0.2121 1.052 0.2928
## KepuasanTidak Puas 0.3594 0.2142 1.678 0.0934 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 17.847 on 3 degrees of freedom
## Residual deviance: 13.874 on 1 degrees of freedom
## AIC: 39.311
##
## Number of Fisher Scoring iterations: 4
# Model dengan interaksi
fit_inter <- glm(Freq ~ Juara_Lomba * Kepuasan, family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Juara_Lomba * Kepuasan, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.2189 0.2000 16.094 < 2e-16 ***
## Juara_LombaTidak -0.7340 0.3512 -2.090 0.036622 *
## KepuasanTidak Puas -0.5108 0.3266 -1.564 0.117799
## Juara_LombaTidak:KepuasanTidak Puas 1.6635 0.4651 3.577 0.000348 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.7847e+01 on 3 degrees of freedom
## Residual deviance: 7.1054e-15 on 0 degrees of freedom
## AIC: 27.437
##
## Number of Fisher Scoring iterations: 3
Parameter utama (intercept) menunjukkan rata-rata log frekuensi sel.
Efek “Juara_Lomba” dan “Kepuasan” menunjukkan perbedaan log frekuensi antar kategori.
Nilai log(5.28) = 1.66 sama dengan efek interaksi output R
Suatu survei dilakukan untuk mengetahui hubungan antara Status Pernikahan (Menikah/Belum Menikah) dan Kategori Pengeluaran (Rendah/Sedang/Tinggi):
| Pengeluaran Rendah | Pengeluaran Sedang | Pengeluaran Tinggi | |
|---|---|---|---|
| Menikah | 18 | 30 | 27 |
| Belum Menikah | 14 | 16 | 23 |
Data merupakan data simulasi
Bentuk umum model log-linear untuk tabel 2x3 (dengan sum-to-zero constraint):
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
dengan:
Constraint: \[ \sum_i \lambda^A_i = 0,\quad \sum_j \lambda^B_j = 0,\quad \sum_i \lambda^{AB}_{ij} = 0,\quad \sum_j \lambda^{AB}_{ij} = 0 \]
Secara eksplisit:
\[
\log(\mu_{ij}) =
\lambda +
\begin{cases}
\lambda^A_1 & \text{(Laki-laki)} \\
\lambda^A_2 & \text{(Perempuan)}
\end{cases}
+
\begin{cases}
\lambda^B_1 & \text{(Rendah)} \\
\lambda^B_2 & \text{(Standar)} \\
\lambda^B_3 & \text{(Tinggi)}
\end{cases}
+
\lambda^{AB}_{ij} \text{ (interaksi jika ada)}
\]
# Membuat data frame dari tabel
tabel2x3 <- matrix(c(18, 30, 27, 14, 16, 23), nrow = 2, byrow = TRUE)
colnames(tabel2x3) <- c("Pengeluaran Rendah", "Pengeluaran Sedang", "Pengeluaran Tinggi")
rownames(tabel2x3) <- c("Menikah", "Belum Menikah")
tabel2x3
## Pengeluaran Rendah Pengeluaran Sedang Pengeluaran Tinggi
## Menikah 18 30 27
## Belum Menikah 14 16 23
# Ubah menjadi data.frame untuk glm
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("Status_Pernikahan", "Kategori_Pengeluaran", "Freq")
data2x3
# Model log-linear tanpa interaksi (asumsi independen)
fit_no_inter <- glm(Freq ~ Status_Pernikahan + Kategori_Pengeluaran, family = poisson(), data = data2x3)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Status_Pernikahan + Kategori_Pengeluaran,
## family = poisson(), data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.9312 0.1918 15.286 <2e-16 ***
## Status_PernikahanBelum Menikah -0.3472 0.1794 -1.935 0.0530 .
## Kategori_PengeluaranPengeluaran Sedang 0.3629 0.2302 1.577 0.1149
## Kategori_PengeluaranPengeluaran Tinggi 0.4463 0.2264 1.971 0.0487 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 9.5203 on 5 degrees of freedom
## Residual deviance: 1.3508 on 2 degrees of freedom
## AIC: 38.563
##
## Number of Fisher Scoring iterations: 4
# Model log-linear dengan interaksi (untuk cek asosiasi)
fit_inter <- glm(Freq ~ Status_Pernikahan * Kategori_Pengeluaran, family = poisson(), data = data2x3)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Status_Pernikahan * Kategori_Pengeluaran,
## family = poisson(), data = data2x3)
##
## Coefficients:
## Estimate
## (Intercept) 2.89037
## Status_PernikahanBelum Menikah -0.25131
## Kategori_PengeluaranPengeluaran Sedang 0.51083
## Kategori_PengeluaranPengeluaran Tinggi 0.40547
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang -0.37729
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Tinggi 0.09097
## Std. Error
## (Intercept) 0.23570
## Status_PernikahanBelum Menikah 0.35635
## Kategori_PengeluaranPengeluaran Sedang 0.29814
## Kategori_PengeluaranPengeluaran Tinggi 0.30429
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang 0.47204
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Tinggi 0.45552
## z value
## (Intercept) 12.263
## Status_PernikahanBelum Menikah -0.705
## Kategori_PengeluaranPengeluaran Sedang 1.713
## Kategori_PengeluaranPengeluaran Tinggi 1.332
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang -0.799
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Tinggi 0.200
## Pr(>|z|)
## (Intercept) <2e-16
## Status_PernikahanBelum Menikah 0.4807
## Kategori_PengeluaranPengeluaran Sedang 0.0866
## Kategori_PengeluaranPengeluaran Tinggi 0.1827
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang 0.4241
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Tinggi 0.8417
##
## (Intercept) ***
## Status_PernikahanBelum Menikah
## Kategori_PengeluaranPengeluaran Sedang .
## Kategori_PengeluaranPengeluaran Tinggi
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang
## Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Tinggi
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 9.5203e+00 on 5 degrees of freedom
## Residual deviance: 5.3291e-15 on 0 degrees of freedom
## AIC: 41.212
##
## Number of Fisher Scoring iterations: 3
Model tanpa interaksi:
Jika residual deviance tidak signifikan, maka Status Pernikahan dan Kategori Pengeluaran dianggap independen.
Intercept: log-frekuensi pada kategori referensi (Menikah, Pengeluaran Rendah).
Koefisien Status_PernikahanBelum Menikah: perbedaan log-frekuensi antara Belum Menikah dan Menikah (pada Pengeluaran Rendah).
Koefisien Kategori_PengeluaranPengeluaran Sedang/Tinggi: perbedaan log-frekuensi kategori Pengeluaran Sedang/Tinggi terhadap Rendah (pada Menikah). - Dari output, hanya kategori Pengeluaran Tinggi yang signifikan pada level 5% (\(p = 0.0487\)), artinya pada kelompok Menikah, frekuensi dengan Pengeluaran Tinggi secara signifikan lebih besar dibandingkan Pengeluaran Rendah.
Koefisien Status_PernikahanBelum Menikah hampir signifikan (\(p = 0.0530\)), menunjukkan kecenderungan bahwa Belum Menikah memiliki frekuensi lebih kecil daripada Menikah (pada Pengeluaran Rendah), namun bukti statistiknya masih lemah.
Model dengan interaksi:
Jika koefisien interaksi tidak signifikan, tidak ada asosiasi yang kuat antara Status Pernikahan dan Kategori Pengeluaran. - Intercept: log-frekuensi referensi (Menikah, Pengeluaran Rendah).
Koefisien Status_PernikahanBelum Menikah: perbedaan log-frekuensi Belum Menikah vs Menikah (pada Pengeluaran Rendah).
Koefisien Kategori_PengeluaranPengeluaran Sedang/Tinggi: perbedaan log-frekuensi kategori Pengeluaran terhadap Rendah (pada Menikah).
Koefisien interaksi (misal, Status_PernikahanBelum Menikah:Kategori_PengeluaranPengeluaran Sedang): perbedaan tambahan log-frekuensi antara kategori tersebut dibandingkan referensi.
Dari output, tidak ada koefisien interaksi yang signifikan (\(p > 0.05\)), sehingga tidak ada bukti kuat hubungan/asosiasi antara Status Pernikahan dan Kategori Pengeluaran. Distribusi pengeluaran cenderung mirip antara kelompok Menikah dan Belum Menikah.
Salah satu tujuan utama dari model log-linear adalah mengestimasi parameter yang menggambarkan hubungan antar variabel kategorikal. Pada bagian ini, dibahas model log-linear untuk tabel kontingensi tiga arah, yang melibatkan tiga variabel kategorik sehingga jenis interaksi yang dapat dimasukkan dalam model lebih beragam. Dalam situasi ini, interaksi tertinggi yang bisa dimodelkan adalah interaksi tiga arah, yaitu efek yang muncul ketika ketiga variabel saling berinteraksi secara bersamaan.
Model log-linear yang melibatkan tiga variabel kategorik (misal: X, Y, dan Z) dapat dibangun dalam berbagai bentuk model, tergantung pada tingkat interaksi yang ingin dimasukkan. Berikut adalah beberapa alternatif model log-linear yang umum digunakan.
1. Model Saturated
\[ \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} \]
Model ini memuat semua kemungkinan interaksi, termasuk interaksi tiga arah (X, Y, dan Z).
2. Model Homogen
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Model ini hanya mengakomodasi interaksi dua arah antar variabel tanpa memasukkan interaksi tiga arah.
3. Model Conditional
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
Memuat interaksi X dengan Y dan X dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
Memuat interaksi Y dengan X dan Y dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Memuat interaksi Z dengan X dan Z dengan Y.
4. Model Joint Independence
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
5. Model Tanpa Interaksi
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k \] Model ini hanya memasukkan efek utama tanpa interaksi antar variabel.
Dalam analisis model log-linear tiga arah, pengujian interaksi dilakukan untuk mengetahui ada atau tidaknya interaksi antar variabel. Pengujian ini dilakukan secara bertahap, dimulai dari tingkat interaksi tertinggi ke yang lebih rendah. Untuk model log-linear dengan tiga peubah (X, Y, dan Z), tahapan pengujian meliputi:
1) Pengujian Interaksi Tiga Arah (XYZ):
2) Pengujian Interaksi Dua Arah (XY, XZ, YZ):
Bandingkan model homogenous dengan model conditional.
Bandingkan model conditional dengan model joint independence.
Bandingkan model joint independence dengan model tanpa interaksi.
Setiap tahapan pengujian dilakukan untuk menilai kecocokan model dan menentukan struktur interaksi mana yang paling sesuai dengan data yang diamati.
Sebuah survei dilakukan untuk mengetahui hubungan antara Kategori Perokok (Ringan/Sedang/Berat), Jenis Kelamin (Laki-laki/Perempuan), dan Sikap terhadap Iklan Rokok (Mendukung/Menolak). Berikut data hasil survei:
\[ \begin{array}{|c|c|c|c|c|} \hline \textbf{Kategori Perokok} & \textbf{Jenis Kelamin} & \textbf{Mendukung} & \textbf{Menolak} & \textbf{Total} \\ \hline Ringan & Laki-laki & 58 & 22 & 80 \\ Ringan & Perempuan & 45 & 32 & 77 \\ Ringan & Total & 103 & 54 & 157 \\ \hline Sedang & Laki-laki & 41 & 29 & 70 \\ Sedang & Perempuan & 30 & 27 & 57 \\ Sedang & Total & 71 & 56 & 127 \\ \hline Berat & Laki-laki & 38 & 20 & 58 \\ Berat & Perempuan & 25 & 34 & 59 \\ Berat & Total & 63 & 54 & 117 \\ \hline \end{array} \]
Keterangan
Kategori Perokok: Ringan, Sedang, Berat
Jenis Kelamin: Laki-laki, Perempuan
Sikap: Mendukung (Favor), Menolak (Oppose) iklan rokok
library("epitools")
library("DescTools")
library("lawstat")
Input Data
# Input data sesuai tabel praktikum
Kategori_Perokok <- factor(rep(c("Ringan", "Sedang", "Berat"), each = 4))
Jenis_Kelamin <- factor(rep(c("Laki-laki", "Perempuan"), each = 2, times = 3))
Sikap <- factor(rep(c("Mendukung", "Menolak"), times = 6))
Freq <- c(58, 22, 45, 32, 41, 29, 30, 27, 38, 20, 25, 34)
data <- data.frame(
Kategori_Perokok = Kategori_Perokok,
Jenis_Kelamin = Jenis_Kelamin,
Sikap = Sikap,
Freq = Freq
)
data
Membentuk Tabel Kontigensi 3 Arah
table3d <- xtabs(Freq ~ Kategori_Perokok + Jenis_Kelamin + Sikap, data = data)
ftable(table3d)
## Sikap Mendukung Menolak
## Kategori_Perokok Jenis_Kelamin
## Berat Laki-laki 38 20
## Perempuan 25 34
## Ringan Laki-laki 58 22
## Perempuan 45 32
## Sedang Laki-laki 41 29
## Perempuan 30 27
Analisis Log-Linear: Kita akan memodelkan tabel ini menggunakan beberapa model log-linear dan membandingkan kecocokan model (parsimonious model)
x.sex<- relevel(Jenis_Kelamin, ref = "Perempuan")
y.sikap <- relevel(Sikap, ref = "Menolak")
z.rokok <- relevel(Kategori_Perokok, ref = "Berat")
Model Saturated 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} \]
# Model saturated
library(knitr)
model_saturated <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*y.sikap + x.sex*z.rokok + y.sikap*z.rokok +
x.sex*y.sikap*z.rokok,
family = poisson(link = "log"))
summary(model_saturated)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * y.sikap +
## x.sex * z.rokok + y.sikap * z.rokok + x.sex * y.sikap * z.rokok,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.52636 0.17150 20.562
## x.sexLaki-laki -0.53063 0.28180 -1.883
## y.sikapMendukung -0.30748 0.26346 -1.167
## z.rokokRingan -0.06062 0.24630 -0.246
## z.rokokSedang -0.23052 0.25778 -0.894
## x.sexLaki-laki:y.sikapMendukung 0.94934 0.38174 2.487
## x.sexLaki-laki:z.rokokRingan 0.15593 0.39512 0.395
## x.sexLaki-laki:z.rokokSedang 0.60209 0.38850 1.550
## y.sikapMendukung:z.rokokRingan 0.64841 0.35055 1.850
## y.sikapMendukung:z.rokokSedang 0.41285 0.37387 1.104
## x.sexLaki-laki:y.sikapMendukung:z.rokokRingan -0.32086 0.51176 -0.627
## x.sexLaki-laki:y.sikapMendukung:z.rokokSedang -0.70842 0.52438 -1.351
## Pr(>|z|)
## (Intercept) <2e-16 ***
## x.sexLaki-laki 0.0597 .
## y.sikapMendukung 0.2432
## z.rokokRingan 0.8056
## z.rokokSedang 0.3712
## x.sexLaki-laki:y.sikapMendukung 0.0129 *
## x.sexLaki-laki:z.rokokRingan 0.6931
## x.sexLaki-laki:z.rokokSedang 0.1212
## y.sikapMendukung:z.rokokRingan 0.0644 .
## y.sikapMendukung:z.rokokSedang 0.2695
## x.sexLaki-laki:y.sikapMendukung:z.rokokRingan 0.5307
## x.sexLaki-laki:y.sikapMendukung:z.rokokSedang 0.1767
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3.6047e+01 on 11 degrees of freedom
## Residual deviance: 6.6613e-16 on 0 degrees of freedom
## AIC: 87.7
##
## Number of Fisher Scoring iterations: 3
exp_coef <- exp(coef(model_saturated))
exp_coef
## (Intercept)
## 34.0000000
## x.sexLaki-laki
## 0.5882353
## y.sikapMendukung
## 0.7352941
## z.rokokRingan
## 0.9411765
## z.rokokSedang
## 0.7941176
## x.sexLaki-laki:y.sikapMendukung
## 2.5840000
## x.sexLaki-laki:z.rokokRingan
## 1.1687500
## x.sexLaki-laki:z.rokokSedang
## 1.8259259
## y.sikapMendukung:z.rokokRingan
## 1.9125000
## y.sikapMendukung:z.rokokSedang
## 1.5111111
## x.sexLaki-laki:y.sikapMendukung:z.rokokRingan
## 0.7255215
## x.sexLaki-laki:y.sikapMendukung:z.rokokSedang
## 0.4924202
Model yang digunakan adalah model log-linear saturated yang memasukkan semua efek utama, interaksi dua arah, serta interaksi tiga arah. Model ini memodelkan hubungan antara Kategori Perokok (z.rokok), Jenis Kelamin (x.sex), dan Sikap (y.sikap) terhadap frekuensi responden.
library(knitr)
signif_stars <- function(pval) {
if (pval < 0.001) return("***")
else if (pval < 0.01) return("**")
else if (pval < 0.05) return("*")
else if (pval < 0.1) return(".")
else return("")
}
coef_saturated <- round(summary(model_saturated)$coefficients, 3)
colnames(coef_saturated) <- c("Est", "SE", "z", "p")
Signif <- sapply(coef_saturated[, "p"], signif_stars)
coef_table <- cbind(coef_saturated, Sig = Signif)
kable(coef_table, format = "pipe", caption = "Tabel Koefisien Model Saturated")
| Est | SE | z | p | Sig | |
|---|---|---|---|---|---|
| (Intercept) | 3.526 | 0.171 | 20.562 | 0 | *** |
| x.sexLaki-laki | -0.531 | 0.282 | -1.883 | 0.06 | . |
| y.sikapMendukung | -0.307 | 0.263 | -1.167 | 0.243 | |
| z.rokokRingan | -0.061 | 0.246 | -0.246 | 0.806 | |
| z.rokokSedang | -0.231 | 0.258 | -0.894 | 0.371 | |
| x.sexLaki-laki:y.sikapMendukung | 0.949 | 0.382 | 2.487 | 0.013 | * |
| x.sexLaki-laki:z.rokokRingan | 0.156 | 0.395 | 0.395 | 0.693 | |
| x.sexLaki-laki:z.rokokSedang | 0.602 | 0.388 | 1.55 | 0.121 | |
| y.sikapMendukung:z.rokokRingan | 0.648 | 0.351 | 1.85 | 0.064 | . |
| y.sikapMendukung:z.rokokSedang | 0.413 | 0.374 | 1.104 | 0.269 | |
| x.sexLaki-laki:y.sikapMendukung:z.rokokRingan | -0.321 | 0.512 | -0.627 | 0.531 | |
| x.sexLaki-laki:y.sikapMendukung:z.rokokSedang | -0.708 | 0.524 | -1.351 | 0.177 |
Interpretasi model saturated log-linear (dengan semua efek utama, dua arah, dan tiga arah):
Efek utama yang paling signifikan adalah kategori referensi (misal, Perempuan, Menolak, Berat) memiliki ekspektasi dasar. Tidak ditemukan bukti kuat adanya interaksi tiga arah yang signifikan.
Terdapat bukti kuat interaksi dua arah yang signifikan antara beberapa variabel, misalnya antara Jenis Kelamin dan Sikap.
Model yang lebih sederhana (tanpa interaksi tiga arah) dapat dipertimbangkan untuk mendapatkan model yang lebih parsimonious.
Catatan interpretasi:
Nilai exp(coef) menyatakan rasio ekspektasi (expected count ratio) dibandingkan baseline.
Efek positif akan menaikkan expected count; efek negatif akan menurunkan expected count.
Koefisien dianggap signifikan jika p-value < 0.05.
Model log-linear homogenous memasukkan semua efek utama dan semua interaksi dua arah, tanpa interaksi tiga arah. Secara matematis, model ini dapat dituliskan sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# Homogenous Model
model_homogenous <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*y.sikap + x.sex*z.rokok + y.sikap*z.rokok,
family = poisson(link = "log"))
summary(model_homogenous)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * y.sikap +
## x.sex * z.rokok + y.sikap * z.rokok, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.451124 0.163522 21.105 < 2e-16 ***
## x.sexLaki-laki -0.339202 0.217955 -1.556 0.11964
## y.sikapMendukung -0.138241 0.212562 -0.650 0.51546
## z.rokokRingan 0.006059 0.218181 0.028 0.97785
## z.rokokSedang -0.058741 0.222756 -0.264 0.79201
## x.sexLaki-laki:y.sikapMendukung 0.596860 0.206918 2.885 0.00392 **
## x.sexLaki-laki:z.rokokRingan -0.014626 0.248097 -0.059 0.95299
## x.sexLaki-laki:z.rokokSedang 0.214990 0.259775 0.828 0.40790
## y.sikapMendukung:z.rokokRingan 0.493759 0.252929 1.952 0.05092 .
## y.sikapMendukung:z.rokokSedang 0.051398 0.260609 0.197 0.84365
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 36.0473 on 11 degrees of freedom
## Residual deviance: 1.8488 on 2 degrees of freedom
## AIC: 85.549
##
## Number of Fisher Scoring iterations: 3
Pengujian ini menggunakan residual deviance dari kedua model (saturated dan homogenous).
H0: Tidak ada interaksi tiga arah (model homogenous sudah cukup)
H1: Ada interaksi tiga arah (model saturated diperlukan)
# Deviance antar model
model_homogenous$deviance
## [1] 1.848806
model_saturated$deviance
## [1] 6.661338e-16
Deviance.model <- model_homogenous$deviance - model_saturated$deviance
Deviance.model
## [1] 1.848806
# Derajat bebas = db model homogenous - db model saturated
derajat.bebas <- (model_homogenous$df.residual - model_saturated$df.residual)
derajat.bebas
## [1] 2
chi.tabel <- qchisq(1 - 0.05, df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Interpretasi Pada taraf nyata 5%, hasil pengujian menunjukkan bahwa H0 diterima. Artinya, belum ada bukti yang cukup kuat untuk menyatakan adanya interaksi tiga arah antara Jenis Kelamin, Kategori Perokok, dan Sikap. Dengan demikian, model tanpa interaksi tiga arah sudah memadai untuk menjelaskan data.
Rangkuman
Pengujian Ada Tidaknya Interaksi Tiga Arah (Saturated Model vs Homogenous Model)
Hipotesis:
Tingkat Signifikansi:
Statistik Uji:
\[ \Delta \text{Deviance} = \text{Deviance model homogenous} - \text{Deviance model saturated} = 1.8488 - 0.0 = 1.8488 \]
\[ df = df\ \text{model homogenous} - df\ \text{model saturated} = 2 - 0 = 2 \]
Daerah Penolakan:
Keputusan:
Interpretasi:
Model log-linear conditional pada X memasukkan efek utama dan interaksi dua arah antara X dengan Y dan X dengan Z, tanpa interaksi antara Y dengan Z maupun interaksi tiga arah
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
# Conditional Association on X
model_conditional_X <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*y.sikap + x.sex*z.rokok,
family = poisson(link = "log"))
summary(model_conditional_X)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * y.sikap +
## x.sex * z.rokok, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.34745 0.15007 22.306 < 2e-16 ***
## x.sexLaki-laki -0.36186 0.22145 -1.634 0.10224
## y.sikapMendukung 0.07257 0.14406 0.504 0.61443
## z.rokokRingan 0.26627 0.17302 1.539 0.12382
## z.rokokSedang -0.03449 0.18572 -0.186 0.85269
## x.sexLaki-laki:y.sikapMendukung 0.58473 0.20527 2.849 0.00439 **
## x.sexLaki-laki:z.rokokRingan 0.05532 0.24429 0.226 0.82086
## x.sexLaki-laki:z.rokokSedang 0.22254 0.25694 0.866 0.38644
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 36.0473 on 11 degrees of freedom
## Residual deviance: 6.7223 on 4 degrees of freedom
## AIC: 86.422
##
## Number of Fisher Scoring iterations: 4
• Hipotesis
\(H_0\): \(\lambda_{jk}^{YZ} = 0\) (Tidak ada interaksi antara Sikap (Y) dan Kategori Perokok (Z))
\(H_1\): \(\lambda_{jk}^{YZ} \neq 0\) (Ada interaksi antara Sikap (Y) dan Kategori Perokok (Z))
• Taraf Signifikansi \[ \alpha = 5\% \]
• Statistik Uji \[ \Delta \text{Deviance} = \text{Deviance model conditional on } X - \text{Deviance model homogenous}\\ \] \[ = 6.7217 - 1.8488 = 4.8735\\ \] \[ db = db_{\text{model conditional on } X} - db_{\text{model homogenous}} \\= 4 - 2 = 2 \]
• Daerah Penolakan \[ \text{Tolak } H_0 \text{ jika } \Delta \text{Deviance} > \chi^2_{0.05, 2} = 5.991 \] • Keputusan
Karena 4.8735 < 5.991, maka terima \(H_0\)
• Kesimpulan Dengan taraf nyata 5%, ditemukan bahwa hasil pengujian adalah terima H0. Hal ini menyatakan adanya tidak ada interaksi antara Sikap dan Kategori Perokok.
# Selisih deviance antar model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 4.873533
Hitung Derajat Bebas
# Chi Square tabel dengan alpha = 0.05
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Dengan taraf nyata 5%, ditemukan bahwa hasil pengujian adalah terima H0. Hal ini menyatakan tidak ada interaksi antara Sikap dan Kategori Perokok.
Model log-linear conditional pada Y memasukkan efek utama dan interaksi dua arah antara X dengan Y dan Y dengan Z, tanpa interaksi antara X dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
# Conditional Association on Y
model_conditional_Y <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*y.sikap + y.sikap*z.rokok,
family = poisson(link = "log"))
summary(model_conditional_Y)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * y.sikap +
## y.sikap * z.rokok, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.422e+00 1.522e-01 22.477 < 2e-16 ***
## x.sexLaki-laki -2.699e-01 1.576e-01 -1.713 0.08677 .
## y.sikapMendukung -1.415e-01 2.117e-01 -0.668 0.50401
## z.rokokRingan 2.799e-16 1.925e-01 0.000 1.00000
## z.rokokSedang 3.637e-02 1.907e-01 0.191 0.84877
## x.sexLaki-laki:y.sikapMendukung 5.847e-01 2.053e-01 2.849 0.00439 **
## y.sikapMendukung:z.rokokRingan 4.916e-01 2.502e-01 1.965 0.04947 *
## y.sikapMendukung:z.rokokSedang 8.318e-02 2.576e-01 0.323 0.74673
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 36.0473 on 11 degrees of freedom
## Residual deviance: 2.9034 on 4 degrees of freedom
## AIC: 82.603
##
## Number of Fisher Scoring iterations: 4
• Hipotesis
\(H_0\): \(\lambda_{ik}^{XZ} = 0\) (Tidak ada interaksi antara jenis Kelamin (X) dan Kategori Perokok (Z))
\(H_1\): \(\lambda_{ik}^{XZ} \ne 0\) (Ada interaksi antara jenis Kelamin (X) dan Kategori Perokok (Z))
• Tingkat Signifikansi
\[ \alpha = 5\% \]
• Statistik Uji
\[ \Delta\text{Deviance} = \text{Deviance model conditional on } Y - \text{Deviance model homogenous} \]
\[ = 2.9034 - 1.8488 = 1.0546 \]
\[ db = \text{df model conditional on } Y - \text{df model homogenous} \\ = 4 - 2 = 2 \] • Daerah Penolakan
Tolak \(H_0\) jika \(\Delta\text{Deviance} > \chi^2_{0.05, 2} = 5.991\)
• Keputusan
\[ \text{Karena } 1.0546 < 5.991, \text{ maka terima } H_0 \] • Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance
Deviance.model
## [1] 1.054623
Hitung Derajat Bebas
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi
Dengan taraf nyata 5%, didapatkan bahwa hasilnya terima H0 yang berarti bahwa tidak ada interaksi antara Jenis kelamin dan Kategori Perokok.
Model log-linear conditional pada Z memasukkan efek utama dan interaksi dua arah antara X dengan Z dan Y dengan Z, tanpa interaksi antara X dengan Y maupun interaksi tiga arah. \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# Conditional Association on Z
model_conditional_Z <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*z.rokok + y.sikap*z.rokok,
family = poisson(link = "log"))
summary(model_conditional_Z)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * z.rokok +
## y.sikap * z.rokok, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.30435 0.16408 20.139 <2e-16 ***
## x.sexLaki-laki -0.01709 0.18491 -0.092 0.9263
## y.sikapMendukung 0.15415 0.18545 0.831 0.4058
## z.rokokRingan -0.02780 0.22816 -0.122 0.9030
## z.rokokSedang -0.08013 0.23334 -0.343 0.7313
## x.sexLaki-laki:z.rokokRingan 0.05532 0.24429 0.226 0.8209
## x.sexLaki-laki:z.rokokSedang 0.22254 0.25694 0.866 0.3864
## y.sikapMendukung:z.rokokRingan 0.49159 0.25024 1.965 0.0495 *
## y.sikapMendukung:z.rokokSedang 0.08318 0.25755 0.323 0.7467
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 36.047 on 11 degrees of freedom
## Residual deviance: 10.265 on 3 degrees of freedom
## AIC: 91.965
##
## Number of Fisher Scoring iterations: 4
• Hipotesis
\(H_0\): \(\lambda_{ij}^{XY} = 0\) (Tidak ada interaksi antara jenis Kelamin (X) dan Sikap (Y))
\(H_1\): \(\lambda_{ij}^{XY} \ne 0\) (Ada interaksi antara jenis Kelamin (X) dan Sikap (Y))
• Tingkat Signifikansi
\[ \alpha = 5\% \]
• Statistik Uji
\[ \Delta\text{Deviance} = \text{Deviance model conditional on } Z - \text{Deviance model homogenous} \]
\[ = 10.265 - 1.8488 = 8.4162 \]
\[ db = \text{df model conditional on } Z - \text{df model homogenous} \\ = 3 - 2 = 1 \] • Daerah Penolakan
Tolak \(H_0\) jika \(\Delta\text{Deviance} > \chi^2_{0.05, 1} = 3.841\)
• Keputusan
\[ \text{Karena } 8.4162 > 3.841, \text{ maka tolak } H_0 \] • Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance
Deviance.model
## [1] 8.415908
Hitung Derajat Bebas
derajat.bebas <- (3 - 2)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi
karena nilai Deviance model > chi tabel, maka dinyatakan tolak H0 yang berarti terdapat interaksi antara Jenis kelamin dan Sikap.
Model log linier dengan berbagai kombinasi parameter:
library(knitr)
library(kableExtra)
model_loglin <- data.frame(
Model = c("Saturated", "Homogenous", "Conditional on X", "Conditional on Y", "Conditional on Z"),
Parameter = c(
"λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ + λⱼₖʸᶻ + λᵢⱼₖˣʸᶻ",
"λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ + λⱼₖʸᶻ",
"λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ",
"λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λⱼₖʸᶻ",
"λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢₖˣᶻ + λⱼₖʸᶻ"
),
Deviance = c("0.000", "1.8488", "6.7223", "2.9034", "10.265"),
Parameters = c(12, 10, 8, 8, 9),
df = c(0, 2, 4, 4, 2),
AIC = c(87.7, 85.549, 86.422, 82.603, 91.965)
)
knitr::kable(model_loglin, align = "l")
| Model | Parameter | Deviance | Parameters | df | AIC |
|---|---|---|---|---|---|
| Saturated | λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ + λⱼₖʸᶻ + λᵢⱼₖˣʸᶻ | 0.000 | 12 | 0 | 87.700 |
| Homogenous | λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ + λⱼₖʸᶻ | 1.8488 | 10 | 2 | 85.549 |
| Conditional on X | λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λᵢₖˣᶻ | 6.7223 | 8 | 4 | 86.422 |
| Conditional on Y | λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢⱼˣʸ + λⱼₖʸᶻ | 2.9034 | 8 | 4 | 82.603 |
| Conditional on Z | λ + λᵢˣ + λⱼʸ + λₖᶻ + λᵢₖˣᶻ + λⱼₖʸᶻ | 10.265 | 9 | 2 | 91.965 |
uji_interaksi <- data.frame(
Interaksi = c("XYZ", "YZ", "XZ", "XY"),
Pengujian = c("Saturated vs Homogenous",
"Conditional on X vs Homogenous",
"Conditional on Y vs Homogenous",
"Conditional on Z vs Homogenous"),
Delta_Deviance = c(1.8488, 4.8735, 1.0546, 8.4162),
df = c(2, 2, 2, 1),
Chi_Square = c(5.991, 5.991, 5.991, 3.841),
Keputusan = c("Terima H₀", "Terima H₀", "Terima H₀", "Tolak H₀"),
Keterangan = c("tidak ada interaksi", "tidak ada interaksi", "tidak ada interaksi", "ada interaksi"),
stringsAsFactors = FALSE
)
knitr::kable(uji_interaksi, booktabs = TRUE, align = "l")
| Interaksi | Pengujian | Delta_Deviance | df | Chi_Square | Keputusan | Keterangan |
|---|---|---|---|---|---|---|
| XYZ | Saturated vs Homogenous | 1.8488 | 2 | 5.991 | Terima H₀ | tidak ada interaksi |
| YZ | Conditional on X vs Homogenous | 4.8735 | 2 | 5.991 | Terima H₀ | tidak ada interaksi |
| XZ | Conditional on Y vs Homogenous | 1.0546 | 2 | 5.991 | Terima H₀ | tidak ada interaksi |
| XY | Conditional on Z vs Homogenous | 8.4162 | 1 | 3.841 | Tolak H₀ | ada interaksi |
Dari hasil di atas diketahui bahwa asosiasi yang nyata hanya terdapat interaksi antara Jenis Kelamin dan Sikap. Sehingga, model terbaik adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{jk}^{XY} \]
# Model Terbaik
bestmodel <- glm(Freq ~ x.sex + y.sikap + z.rokok +
x.sex*y.sikap,
family = poisson(link = "log"))
summary(bestmodel)
##
## Call:
## glm(formula = Freq ~ x.sex + y.sikap + z.rokok + x.sex * y.sikap,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.30081 0.12964 25.462 < 2e-16 ***
## x.sexLaki-laki -0.26992 0.15760 -1.713 0.08677 .
## y.sikapMendukung 0.07257 0.14406 0.504 0.61443
## z.rokokRingan 0.29407 0.12213 2.408 0.01605 *
## z.rokokSedang 0.08201 0.12814 0.640 0.52217
## x.sexLaki-laki:y.sikapMendukung 0.58473 0.20527 2.849 0.00439 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 36.047 on 11 degrees of freedom
## Residual deviance: 7.560 on 6 degrees of freedom
## AIC: 83.26
##
## Number of Fisher Scoring iterations: 4
# Interpretasi koefisien model terbaik
data.frame(
koef = bestmodel$coefficients,
exp_koef = exp(bestmodel$coefficients)
)
\[ \exp(\text{Intercept}) = \exp(3.301) = 27.13 \] Ekspektasi jumlah kasus pada kategori referensi (Perempuan, Menolak, Berat) adalah sekitar 27.13.
\[ \exp(\lambda^{X}_{Laki-laki}) = \exp(-0.270) = 0.76 \] Tanpa memperhatikan kategori perokok dan sikap, peluang laki-laki sekitar 0.76 kali dibandingkan perempuan.
\[ \exp(\lambda^{Y}_{Mendukung}) = \exp(0.073) = 1.08 \] Tanpa memperhatikan jenis kelamin dan kategori perokok, peluang mendukung iklan rokok adalah 1.08 kali dibandingkan menolak.
\[ \exp(\lambda^{Z}_{Ringan}) = \exp(0.294) = 1.34 \] Tanpa memperhatikan jenis kelamin dan sikap, peluang seseorang menjadi perokok ringan adalah 1.34 kali dibandingkan perokok berat.
\[ \exp(\lambda^{Z}_{Sedang}) = \exp(0.082) = 1.09 \] Tanpa memperhatikan jenis kelamin dan sikap, peluang seseorang menjadi perokok sedang adalah 1.09 kali dibandingkan perokok berat.
\[ \exp(\lambda^{XY}_{Laki-laki, Mendukung}) = \exp(0.585) = 1.79 \] Tanpa memperhatikan kategori perokok, odds laki-laki yang mendukung iklan rokok adalah 1.79 kali odds perempuan yang menolak.
# Fitted values dari model terbaik
data.frame(
rokok = z.rokok,
sex = x.sex,
sikap = y.sikap,
counts = Freq,
fitted = bestmodel$fitted.values
)
Secara manual, nilai fitted value diperoleh dengan cara sebagai berikut:
\[ \begin{aligned} \text{Misal:} \\ \lambda_{Laki-Laki}^{x} &= \lambda_{L}^{x} \\ \lambda_{Perempuan}^{x} &= \lambda_{P}^{x} \\ \lambda_{Mendukung}^{y} &= \lambda_{Duk}^{y} \\ \lambda_{Menolak}^{y} &= \lambda_{Tol}^{y} \\ \lambda_{Ringan}^{z} &= \lambda_{R}^{z} \\ \lambda_{Sedang}^{z} &= \lambda_{S}^{z} \\ \lambda_{Berat}^{z} &= \lambda_{B}^{z} \\ \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{111} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Duk}^{y} + \lambda_{R}^{z} + \lambda_{L, Duk}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0.0726 + 0.2941 + 0.5847) \\ &= \exp(3.9823) = 53.64 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{112} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Duk}^{y} + \lambda_{S}^{z} + \lambda_{L, Duk}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0.0726 + 0.082 + 0.5847) \\ &= \exp(3.7692) = 43.39 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{113} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Duk}^{y} + \lambda_{B}^{z} + \lambda_{L, Duk}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0.0726 + 0 + 0.5847) \\ &= \exp(3.6882) = 39.97 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{121} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Tol}^{y} + \lambda_{R}^{z} + \lambda_{L, Tol}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0 + 0.2941 + 0) \\ &= \exp(3.325) = 27.79 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{122} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Tol}^{y} + \lambda_{S}^{z} + \lambda_{L, Tol}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0 + 0.082 + 0) \\ &= \exp(3.1129) = 22.49 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{123} &= \exp(\lambda + \lambda_{L}^{x} + \lambda_{Tol}^{y} + \lambda_{B}^{z} + \lambda_{L, Tol}^{xy}) \\ &= \exp(3.3008 - 0.2699 + 0 + 0 + 0) \\ &= \exp(3.0309) = 20.72 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{211} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Duk}^{y} + \lambda_{R}^{z} + \lambda_{P, Duk}^{xy}) \\ &= \exp(3.3008 + 0 + 0.0726 + 0.2941 + 0) \\ &= \exp(3.6675) = 39.15 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{212} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Duk}^{y} + \lambda_{S}^{z} + \lambda_{P, Duk}^{xy}) \\ &= \exp(3.3008 + 0 + 0.0726 + 0.082 + 0) \\ &= \exp(3.4554) = 31.67 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{213} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Duk}^{y} + \lambda_{B}^{z} + \lambda_{P, Duk}^{xy}) \\ &= \exp(3.3008 + 0 + 0.0726 + 0 + 0) \\ &= \exp(3.3734) = 29.18 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{221} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Tol}^{y} + \lambda_{R}^{z} + \lambda_{P, Tol}^{xy}) \\ &= \exp(3.3008 + 0 + 0 + 0.2941 + 0) \\ &= \exp(3.5949) = 36.41 \end{aligned} \] \[ \begin{aligned} \hat{\mu}_{222} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Tol}^{y} + \lambda_{S}^{z} + \lambda_{P, Tol}^{xy}) \\ &= \exp(3.3008 + 0 + 0 + 0.082 + 0) \\ &= \exp(3.3828) = 29.45 \end{aligned} \] \[ \begin{aligned} \hat{\mu}_{223} &= \exp(\lambda + \lambda_{P}^{x} + \lambda_{Tol}^{y} + \lambda_{B}^{z} + \lambda_{P, Tol}^{xy}) \\ &= \exp(3.3008 + 0 + 0 + 0 + 0) \\ &= \exp(3.3008) = 27.13 \end{aligned} \]
Keterangan:
Nilai \(\hat{\mu}_{ijk}\) akan sama
apapun referensi dari kategori perubahannya yang kita gunakan.
Tujuan analisis data ini adalah untuk mempelajari hubungan antara jenis kelamin dengan mood swing dari masyarakat Bangladesh (siswa, mahasiswa, ibu rumah tangga, karyawan, dan sebagainya).
Data diambil dari Kaggle dengan judul “Depression and Mentahl Health” yang ber ukuran 824 data
# Memuat paket yang diperlukan
library(readr)
# Mengimpor data dari file CSV
data <- read.csv(file.choose())
head(data); str(data)
## 'data.frame': 824 obs. of 1 variable:
## $ Gender.Mood_Swings: chr "Female;Medium" "Male;High" "Female;Medium" "Male;Medium" ...
# Pisahkan kolom 'Gender.Mood_Swings' menjadi dua kolom terpisah
data_split <- tidyr::separate(data, col = Gender.Mood_Swings, into = c("Gender", "Mood_Swings"), sep = ";")
head(data_split)
str(data_split)
## 'data.frame': 824 obs. of 2 variables:
## $ Gender : chr "Female" "Male" "Female" "Male" ...
## $ Mood_Swings: chr "Medium" "High" "Medium" "Medium" ...
# Buat tabel kontingensi 2 x 3
tabel2x3 <- table(data_split$Gender, data_split$Mood_Swings)
tabel2x3
##
## High Low Medium
## Female 146 144 144
## Male 120 134 136
#Ubah menjadi data.frame untuk glm
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("Gender", "Mood_Swings", "Freq")
data2x3
fit_no_inter <- glm(Freq ~ Gender + Mood_Swings, family = poisson(), data = data2x3)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Gender + Mood_Swings, family = poisson(),
## data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.94237 0.06964 70.969 <2e-16 ***
## GenderMale -0.10690 0.06977 -1.532 0.126
## Mood_SwingsLow 0.04412 0.08577 0.514 0.607
## Mood_SwingsMedium 0.05129 0.08562 0.599 0.549
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3.55338 on 5 degrees of freedom
## Residual deviance: 0.78318 on 2 degrees of freedom
## AIC: 49.339
##
## Number of Fisher Scoring iterations: 3
Interpretasi model tanpa interaksi:
Kesimpulan:
Tidak ada bukti signifikan adanya perbedaan frekuensi pada Gender maupun
kategori Mood_Swings. Model ini mendukung asumsi bahwa Gender
dan Mood_Swings saling independen dalam data ini.
fit_inter <- glm(Freq ~ Gender * Mood_Swings, family = poisson(), data = data2x3)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Gender * Mood_Swings, family = poisson(),
## data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.98361 0.08276 60.217 <2e-16 ***
## GenderMale -0.19611 0.12322 -1.592 0.111
## Mood_SwingsLow -0.01379 0.11745 -0.117 0.907
## Mood_SwingsMedium -0.01379 0.11745 -0.117 0.907
## GenderMale:Mood_SwingsLow 0.12414 0.17202 0.722 0.470
## GenderMale:Mood_SwingsMedium 0.13896 0.17170 0.809 0.418
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3.5534e+00 on 5 degrees of freedom
## Residual deviance: -3.9968e-14 on 0 degrees of freedom
## AIC: 52.556
##
## Number of Fisher Scoring iterations: 2
Interpretasi model dengan interaksi:
Tidak ada koefisien interaksi yang signifikan (\(p > 0.05\)), sehingga tidak ada bukti kuat hubungan atau asosiasi antara Gender dan Mood_Swings dalam data ini. Distribusi Mood Swings cenderung mirip antara kelompok Male dan Female.