Kata Pengantar

Puji syukur kehadirat Tuhan Yang Maha Esa, karena atas rahmat dan karunia-Nya, penulis dapat menyelesaikan ebook yang berjudul “Analisis Data Kategori” ini dengan baik. Ebook ini disusun sebagai panduan komprehensif bagi mahasiswa, peneliti, dan praktisi yang ingin mendalami metode analisis untuk data yang tidak berbentuk angka.

Dalam keseharian, kita sering kali dihadapkan pada data yang berupa pilihan atau label, seperti “ya” atau “tidak” , preferensi produk, atau hasil diagnosis medis. Data seperti ini, yang dikenal sebagai data kategorik, merupakan gambaran nyata dari berbagai fenomena dalam kehidupan , namun analisisnya sering kali dianggap lebih rumit dibandingkan data kuantitatif. Masih banyak yang mengira bahwa statistik hanya berkutat pada angka, padahal informasi krusial di bidang pemasaran, kebijakan publik, hingga ilmu sosial justru tersimpan dalam data kategorik.

Penulis menyadari bahwa ebook ini masih jauh dari sempurna. Oleh karena itu, kritik dan saran yang membangun sangat diharapkan untuk perbaikan di masa mendatang. Semoga ebook ini dapat menjadi sumber belajar yang bermanfaat dan memberikan wawasan praktis dalam menganalisis dunia yang penuh dengan kategori.

Jatinangor, 17 Juni 2025

Firgie Aldiansyah Faturohman

Pendahuluan

Dalam keseharian, kita lebih sering menjumpai pertanyaan-pertanyaan sederhana yang jawabannya bukan berupa angka rumit seperti persamaan statistik atau kalkulus. Sebaliknya, kita lebih banyak berhadapan dengan pilihan atau kategori, seperti:

  1. Apakah pengguna menyukai desain baru aplikasi? (Ya / Tidak)

  2. Jenis transportasi apa yang dipilih untuk bepergian: motor, mobil, atau transportasi umum?

  3. Apakah suatu tim menang, kalah, atau bermain imbang dalam pertandingan?

Data seperti ini—yang hasilnya berupa kelompok atau label—merupakan gambaran nyata dari kehidupan sehari-hari. Sebab, pada dasarnya, banyak keputusan dan pengamatan tidak melulu tentang besaran numerik, melainkan tentang preferensi, klasifikasi, dan penilaian kualitatif.

Sayangnya, masih banyak yang mengira statistik hanya berguna untuk data angka, seperti mengukur jarak, kecepatan, pendapatan, atau tekanan darah. Padahal, sebagian besar penelitian di bidang pemasaran, kebijakan publik, pendidikan, dan bahkan olahraga justru menggunakan data kategorik.

Oleh karena itu, memahami Analisis Data Kategorik (ADK) menjadi sangat penting. ADK membantu kita menganalisis data yang tidak bisa dijelaskan dengan mean atau deviasi standar, tidak bisa diprediksi dengan tren linier, tetapi justru mengandung informasi krusial untuk pengambilan keputusan.

Menurut Alan Agresti (2007), data kategorik sering menjadi fondasi utama dalam penelitian eksperimen maupun observasi, mulai dari jajak pendapat politik, evaluasi program kesehatan, hingga analisis perilaku konsumen.

Sementara itu, Annette Dobson (1983) menambahkan bahwa data kategorik sangat umum digunakan ketika meneliti hubungan antar variabel, terutama jika hasilnya berbentuk “kelompok” atau “kondisi”—seperti berhasil/gagal, setuju/tidak setuju, atau aktif/non-aktif.

Tujuan Analisis Data Kategori

alam praktik nyata, ADK memiliki berbagai fungsi penting di berbagai bidang: 1. Kesehatan dan Kedokteran - Untuk mengevaluasi efektivitas pengobatan melalui data seperti “sembuh” atau “tidak sembuh”. - Untuk menguji hubungan faktor risiko seperti usia, merokok, dan genetika dengan hasil diagnosis penyakit.

  1. Bisnis dan Pemasaran
  • Untuk mengukur tingkat kepuasan pelanggan dari jawaban “puas” atau “tidak puas”.
  • Untuk menganalisis preferensi produk berdasarkan kategori pilihan konsumen.
  1. Ilmu Sosial dan Politik
  • Untuk menganalisis hasil survei yang berkaitan dengan pilihan politik atau opini publik.

  • Untuk menilai pengaruh status sosial, pendidikan, atau pekerjaan terhadap perilaku memilih.

  1. Psikologi dan Pendidikan
  • Untuk menilai hasil kuesioner yang berisi jawaban “setuju” atau “tidak setuju” dalam penelitian sikap dan perilaku.
  • Untuk menganalisis efektivitas program pendidikan dari data “lulus” atau “tidak lulus”.
  1. Kebijakan Publik dan Ekonomi
  • Untuk menganalisis efektivitas program pemerintah seperti bantuan sosial berdasarkan kategori penerima yang “berhasil” atau “tidak berhasil”.
  • Untuk memahami sebaran populasi berdasarkan kategori demografis seperti pekerjaan, pendidikan, atau status pernikahan.

Selain itu analisis data kategori bertujuan untuk menggali informasi dari data non-numerik. Tujuan utamanya meliputi:

Mengidentifikasi Pola dan Tren

Salah satu tujuan utama dalam analisis data kategori adalah mengidentifikasi pola dan tren yang ada dalam kelompok data. Dengan menggunakan metode statistik yang tepat, kita dapat mengungkap pola-pola tersembunyi dalam data yang berkaitan dengan kategori-kategori tertentu. Sebagai contoh, dalam dunia pemasaran, perusahaan dapat menganalisis preferensi konsumen berdasarkan kategori seperti usia, jenis kelamin, atau wilayah geografis. Dari analisis ini, perusahaan dapat mengetahui produk atau layanan yang lebih diminati oleh kelompok tertentu.

Misalnya, dalam penelitian pasar, analisis data kategori bisa mengungkapkan bahwa konsumen muda di perkotaan lebih cenderung memilih produk teknologi canggih, sedangkan konsumen yang lebih tua di daerah pedesaan lebih memilih produk yang sederhana dan praktis. Temuan seperti ini memberikan wawasan penting bagi perusahaan untuk mengembangkan produk yang sesuai dengan kebutuhan konsumen di berbagai segmen pasar.

Menganalisis Hubungan Antarvariabel

Analisis data kategori juga sangat berguna untuk menganalisis hubungan antarvariabel. Dalam banyak situasi, kita ingin mengetahui apakah ada asosiasi atau ketergantungan antara dua atau lebih variabel kategorikal. Misalnya, kita bisa menganalisis hubungan antara gaya hidup seseorang (misalnya, aktif, moderat, atau tidak aktif) dan risiko terkena penyakit tertentu (misalnya, hipertensi atau diabetes).

Metode yang sering digunakan untuk analisis ini adalah uji chi-square untuk tabel kontingensi, yang membantu menentukan apakah distribusi frekuensi antara dua variabel kategori berbeda secara signifikan atau tidak. Selain itu, analisis regresi logistik juga dapat digunakan untuk melihat bagaimana beberapa faktor kategori berkontribusi terhadap probabilitas suatu kejadian, seperti terkena penyakit tertentu.

Membantu dalam Pengambilan Keputusan

Analisis data kategori juga berperan penting dalam pengambilan keputusan yang lebih informasional dan berbasis data. Dengan informasi yang diperoleh dari analisis data kategori, perusahaan atau lembaga dapat membuat keputusan yang lebih tepat dan efisien, terutama dalam merumuskan strategi atau kebijakan yang lebih efektif. Misalnya, sebuah perusahaan yang berfokus pada konsumen dapat menggunakan hasil analisis preferensi konsumen untuk menentukan produk apa yang harus dipasarkan ke kelompok usia atau wilayah tertentu.

Di sektor publik, analisis data kategori bisa digunakan untuk merumuskan kebijakan yang lebih tepat sasaran. Sebagai contoh, pemerintah dapat menggunakan data kategori mengenai tingkat pendidikan, pekerjaan, dan status sosial ekonomi untuk merancang kebijakan yang dapat mengatasi ketimpangan sosial atau meningkatkan akses pendidikan di wilayah yang kurang berkembang.

Mengembangkan Model Prediktif

Salah satu aplikasi penting dari analisis data kategori adalah mengembangkan model prediktif yang dapat meramalkan kejadian atau perilaku tertentu berdasarkan variabel kategori. Salah satu contoh yang paling umum adalah penggunaan regresi logistik untuk memprediksi probabilitas kejadian yang hanya memiliki dua kategori, seperti membeli atau tidak membeli suatu produk.

Definisi dan Ruang Lingkup Analisis Data Kategori

Analisis data kategori adalah cabang dari statistik yang digunakan untuk menganalisis data yang terdiri dari kategori atau label. Dalam konteks ini, kategori merujuk pada berbagai jenis kelompok atau kategori yang tidak memiliki hubungan numerik langsung, melainkan berupa klasifikasi berdasarkan karakteristik tertentu. Data kategori sangat umum ditemukan dalam penelitian sosial, riset pasar, kedokteran, dan banyak bidang lainnya. Analisis ini berbeda dengan analisis data kuantitatif karena data kategori tidak diukur dalam angka, melainkan dikelompokkan ke dalam kategori-kategori tertentu yang seringkali memiliki sifat kualitatif.

Analisis data kategori digunakan untuk memahami hubungan antara kategori-kategori tersebut, menggambarkan pola distribusi kategori, serta untuk mengidentifikasi pengaruh atau perbedaan antar kategori dalam populasi yang sedang diteliti. Secara umum, ruang lingkup analisis data kategori meliputi berbagai metode statistik yang dirancang untuk mengatasi masalah yang muncul ketika data bersifat kategorikal, seperti uji chi-square, analisis regresi logistik, dan model-model klasifikasi lainnya.

Nominal dan Ordinal

  • Nominal: Data nominal adalah tipe data kategori yang tidak memiliki urutan atau peringkat. Setiap kategori hanya berfungsi sebagai label atau nama untuk membedakan satu grup dengan grup lainnya. Contoh data nominal adalah jenis kelamin (laki-laki, perempuan), warna favorit (merah, biru, hijau), atau jenis pekerjaan (dokter, guru, insinyur). Data nominal tidak bisa dibandingkan secara matematis, dan tidak ada arti lebih atau kurang di antara kategori tersebut. Dalam analisis data nominal, fokusnya lebih pada frekuensi atau distribusi dari setiap kategori.

  • Ordinal: Data ordinal adalah tipe data kategori yang memiliki urutan atau peringkat, namun jarak antar kategori tidak diketahui atau tidak dapat dihitung secara pasti. Dengan kata lain, meskipun ada urutan, tidak ada informasi yang cukup untuk mengatakan seberapa besar perbedaan antar kategori tersebut. Contoh data ordinal termasuk tingkat pendidikan (SD, SMP, SMA, Perguruan Tinggi), skala kepuasan pelanggan (sangat tidak puas, tidak puas, netral, puas, sangat puas), atau peringkat dalam kompetisi (juara 1, juara 2, juara 3). Meskipun ada urutan, analisis data ordinal lebih fokus pada perbedaan relatif antara kategori, bukan perhitungan numerik.

Data Biner vs Multikategori

Selain membedakan data berdasarkan sifat urutannya (nominal dan ordinal), data kategori juga dapat dibedakan berdasarkan jumlah kategori yang tersedia. Ada dua jenis utama dalam hal ini: data biner dan data multikategori.

  • Biner: ata biner hanya memiliki dua kategori atau kemungkinan yang saling eksklusif. Ini adalah jenis data kategori yang paling sederhana dan sering kali digunakan dalam analisis yang memerlukan keputusan yang hanya memiliki dua kemungkinan. Contoh klasik dari data biner adalah jawaban ya/tidak, benar/salah, hidup/mati, atau adanya/ketiadaan suatu kondisi. Dalam analisis statistik, data biner sering dianalisis menggunakan teknik seperti regresi logistik atau uji chi-square untuk menentukan apakah ada hubungan signifikan antara dua variabel biner.

  • Multikategori: Data multikategori, seperti namanya, terdiri dari lebih dari dua kategori. Ini bisa mencakup berbagai jenis kategori yang lebih kompleks daripada sekadar dua pilihan. Misalnya, pilihan merek mobil (Toyota, Honda, Ford, BMW), jenis kelamin (laki-laki, perempuan, lainnya), atau kategori pekerjaan (dokter, guru, insinyur, petani, lainnya). Data multikategori sering kali dianalisis menggunakan model statistik yang lebih kompleks seperti analisis regresi multinomial atau model logit multinomial. Teknik-teknik ini memungkinkan analisis lebih mendalam terhadap hubungan antara kategori-kategori tersebut dan faktor-faktor yang mempengaruhinya.

Perbedaan dengan Data Kuantitatif

Berbeda dari data kuantitatif yang bisa diukur secara numerik dan bersifat kontinu, data kategori tidak dapat dijumlahkan atau diurutkan secara matematis tanpa konversi. Oleh karena itu, analisisnya memerlukan pendekatan dan alat khusus.

Data kategorik dan data kuantitatif merupakan dua jenis data utama dalam statistik, dan keduanya memiliki karakteristik serta pendekatan analisis yang sangat berbeda. Memahami perbedaan ini penting agar pemilihan metode analisis sesuai dengan jenis data yang dianalisis.

Sifat Dasar

Data kuantitatif bersifat numerik dan dapat diukur secara objektif. Contohnya meliputi tinggi badan (dalam cm), berat badan (dalam kg), penghasilan (dalam rupiah), atau jumlah anak dalam keluarga. Data ini bisa dijumlahkan, dikurangi, dihitung rata-ratanya, serta dianalisis menggunakan teknik statistik parametrik seperti regresi linear, ANOVA, atau uji-t.

Data kategori, di sisi lain, mewakili kelompok, label, atau klasifikasi, bukan nilai numerik. Contohnya termasuk jenis kelamin (laki-laki/perempuan), warna mobil (merah, biru, hitam), tingkat kepuasan (rendah, sedang, tinggi), atau status pekerjaan (pekerja, pelajar, pensiunan). Data ini tidak memiliki makna numerik intrinsik dan tidak dapat dijumlahkan atau dihitung rata-ratanya secara langsung, kecuali dilakukan pengkodean khusus.

Skala Pengukuran

Data kuantitatif biasanya berada pada skala rasio atau interval, yang memungkinkan perhitungan seperti selisih dan proporsi.

Sebaliknya, data kategori menggunakan skala nominal (tanpa urutan, seperti warna atau jenis kelamin) atau ordinal (dengan urutan tetapi tanpa jarak yang pasti antar kategori, seperti ranking atau tingkat kepuasan).

Metode dalam Analisis Data Kategori

Dalam analisis data kategori, berbagai metode digunakan untuk menggali informasi dari data yang bersifat kategorikal. Pilihan metode ini bergantung pada tujuan analisis serta jenis dan struktur data yang dimiliki. Beberapa metode yang paling sering digunakan dalam analisis data kategori mencakup uji hubungan antar kategori, pengukuran asosiasi antar variabel, serta model prediksi untuk kategori-kategori yang lebih kompleks. Bab ini akan membahas beberapa metode utama yang digunakan dalam analisis data kategori, dengan penjelasan mendalam tentang penggunaannya.

Tabel Kontingensi dan Uji Chi-Square

Salah satu metode dasar yang sering digunakan dalam analisis data kategori adalah Tabel Kontingensi dan uji Chi-Square. Metode ini bertujuan untuk mengidentifikasi apakah ada hubungan atau asosiasi antara dua variabel yang keduanya berbentuk kategori. Tabel kontingensi memberikan cara visual untuk melihat distribusi frekuensi kategori-kategori yang ada, sementara uji Chi-Square digunakan untuk menguji apakah perbedaan yang diamati dalam tabel tersebut signifikan atau hanya terjadi karena kebetulan.

Tabel Kontingensi

Tabel kontingensi adalah suatu tabel yang digunakan untuk menyajikan distribusi frekuensi dua variabel kategorikal secara simultan. Dalam tabel ini, setiap sel menunjukkan jumlah observasi yang masuk ke dalam kombinasi kategori-kategori yang berbeda dari kedua variabel.

Uji Chi-Square

Uji Chi-Square (χ²) digunakan untuk menguji apakah terdapat hubungan yang signifikan antara dua variabel kategorikal yang dimasukkan dalam tabel kontingensi. Uji ini menguji hipotesis nol (H₀) yang menyatakan bahwa tidak ada hubungan atau asosiasi antara kedua variabel (yaitu, distribusi kategori variabel pertama tidak bergantung pada kategori variabel kedua). Jika nilai Chi-Square yang dihitung lebih besar dari nilai kritis berdasarkan derajat kebebasan dan tingkat signifikansi yang ditetapkan, maka kita menolak hipotesis nol dan menyimpulkan bahwa ada hubungan yang signifikan antara kedua variabel.

Contoh Kasus:
Seorang peneliti ingin mengetahui apakah jenis kelamin berhubungan dengan preferensi terhadap aplikasi belajar daring.

Alasan:
Kedua variabel (jenis kelamin dan preferensi) bersifat kategorik dan dapat disusun dalam tabel 2×2.

# Simulasi data
jenis_kelamin <- c(rep("Laki-laki", 50), rep("Perempuan", 50))
preferensi <- c(sample(c("Suka", "Tidak Suka"), 50, replace = TRUE, prob = c(0.6, 0.4)), sample(c("Suka", "Tidak Suka"), 50, replace = TRUE, prob = c(0.4, 0.6)))

data1 <- data.frame(jenis_kelamin, preferensi)

# Tabel kontingensi
tab <- table(data1$jenis_kelamin, data1$preferensi)
tab
##            
##             Suka Tidak Suka
##   Laki-laki   26         24
##   Perempuan   25         25
# Uji Chi-Square
chisq.test(tab)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tab
## X-squared = 0, df = 1, p-value = 1

Regresi Logistik

Regresi logistik adalah metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel dependen yang bersifat biner (dua kategori) dengan satu atau lebih variabel independen. Metode ini sangat berguna untuk memprediksi probabilitas terjadinya suatu kejadian atau kondisi berdasarkan variabel-variabel prediktor, yang bisa berupa kategori ataupun numerik. Model regresi logistik cocok untuk data biner, seperti memprediksi apakah seseorang akan membeli produk (ya/tidak), atau apakah seorang pasien akan mengidap penyakit tertentu (positif/negatif). Hasil dari model regresi logistik adalah nilai probabilitas yang menunjukkan kemungkinan terjadinya kejadian tertentu.

Contoh Kasus: Sebuah toko online ingin memprediksi apakah pelanggan akan melakukan pembelian berdasarkan status langganan newsletter (ya/tidak). Alasan: Target variabel biner, prediktor kategorik → cocok untuk regresi logistik.

membership <- c(1, 1, 0, 0, 1, 0, 1, 0, 1, 0)
purchase <- c(1, 1, 0, 0, 1, 0, 1, 0, 1, 0)
data_logit <- data.frame(membership, purchase)

logit_model <- glm(purchase ~ membership, family = binomial())
summary(logit_model)
## 
## Call:
## glm(formula = purchase ~ membership, family = binomial())
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -24.57   58589.77   0.000        1
## membership     49.13   82858.47   0.001        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 4.2867e-10  on 8  degrees of freedom
## AIC: 4
## 
## Number of Fisher Scoring iterations: 23
# Contoh kasus:
# Seorang pemilik toko online ingin memprediksi kemungkinan pelanggan melakukan pembelian (1 = Ya, 0 = Tidak) berdasarkan status keanggotaan (1 = Member, 0 = Bukan Member).
# Simulasi data
set.seed(123)
newsletter <- sample(c("Ya", "Tidak"), 100, replace = TRUE)
pembelian <- rbinom(100, 1, prob = ifelse(newsletter == "Ya", 0.7, 0.3))

data2 <- data.frame(newsletter = factor(newsletter), pembelian = as.factor(pembelian))

# Regresi logistik
model_logit <- glm(pembelian ~ newsletter, family = binomial())
summary(model_logit)
## 
## Call:
## glm(formula = pembelian ~ newsletter, family = binomial())
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -0.9491     0.3400  -2.792  0.00525 ** 
## newsletterYa   2.0712     0.4586   4.517 6.28e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 137.63  on 99  degrees of freedom
## Residual deviance: 114.47  on 98  degrees of freedom
## AIC: 118.47
## 
## Number of Fisher Scoring iterations: 4

Analisis Correspondence (CA)

Correspondence Analysis (CA) adalah metode eksplorasi data yang digunakan untuk memvisualisasikan hubungan antara kategori-kategori dalam satu dataset, terutama yang berbentuk tabel kontingensi. CA adalah teknik multivariat yang memungkinkan kita untuk mengidentifikasi pola dan asosiasi dalam data kategorikal yang besar dan kompleks dengan cara yang mudah dipahami melalui visualisasi dua dimensi.

Metode ini terutama digunakan untuk menggambarkan dan menguji asosiasi antara baris dan kolom dalam tabel kontingensi. Dengan menggunakan prinsip-prinsip analisis faktor, CA dapat menghasilkan peta visual (biasanya berupa grafik dua dimensi) yang menunjukkan hubungan antar kategori yang ada.

Contoh Kasus: Analisis hubungan antara program studi dan tingkat kepuasan mahasiswa terhadap fasilitas kampus. Alasan: Kedua variabel memiliki lebih dari dua kategori → cocok untuk Correspondence Analysis.

# Library
options(repos = c(CRAN = "https://cran.r-project.org"))
install.packages("ca")
## Installing package into 'C:/Users/Fizky Firdzansyah/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ca' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Fizky Firdzansyah\AppData\Local\Temp\RtmpeuaChC\downloaded_packages
library(ca)
## Warning: package 'ca' was built under R version 4.3.3
# Simulasi data
set.seed(123)
program_studi <- sample(c("Sains", "Sosial", "Teknik"), 150, replace = TRUE)
kepuasan <- sample(c("Rendah", "Sedang", "Tinggi"), 150, replace = TRUE)

tab_ca <- table(program_studi, kepuasan)

# Correspondence Analysis
ca_result <- ca(tab_ca)
summary(ca_result)
## 
## Principal inertias (eigenvalues):
## 
##  dim    value      %   cum%   scree plot               
##  1      0.014438  97.7  97.7  ************************ 
##  2      0.000339   2.3 100.0  *                        
##         -------- -----                                 
##  Total: 0.014778 100.0                                 
## 
## 
## Rows:
##     name   mass  qlt  inr    k=1 cor ctr    k=2 cor ctr  
## 1 | Sans |  280 1000   50 |  -42 685  35 |   29 315 685 |
## 2 | Sosl |  360 1000  367 | -122 983 369 |  -16  17 271 |
## 3 | Tknk |  360 1000  584 |  155 998 596 |   -6   2  44 |
## 
## Columns:
##     name   mass  qlt  inr    k=1 cor ctr    k=2 cor ctr  
## 1 | Rndh |  467 1000  450 |  119 996 459 |    7   4  74 |
## 2 | Sdng |  293 1000   62 |  -49 757  48 |  -28 243 659 |
## 3 | Tngg |  240 1000  488 | -172 987 493 |   19  13 267 |

Decision Tree dan Random Forest

Decision Tree dan Random Forest adalah dua algoritma machine learning yang sering digunakan untuk klasifikasi data kategorikal. Kedua metode ini berguna untuk memprediksi kategori atau kelas berdasarkan variabel independen dan membangun model prediksi yang mudah dipahami.

Decision Tree

Decision Tree adalah model yang membagi data menjadi beberapa cabang berdasarkan keputusan yang dibuat pada fitur-fitur tertentu (variabel independen). Setiap node dalam pohon keputusan mewakili keputusan yang dibuat pada fitur tertentu, sementara setiap cabang mewakili hasil dari keputusan tersebut, dan setiap daun mewakili kategori atau kelas hasil akhir.

Keputusan untuk membagi data pada setiap node didasarkan pada kriteria tertentu, seperti pengurangan ketidakpastian (entropy) atau peningkatan homogenitas (Gini impurity). Algoritma yang paling populer untuk membangun pohon keputusan adalah ID3, CART (Classification and Regression Trees), dan C4.5.

Random Forest

Random Forest adalah sebuah ensemble method yang menggunakan banyak pohon keputusan untuk meningkatkan akurasi prediksi. Alih-alih menggunakan satu pohon keputusan, Random Forest membangun banyak pohon keputusan secara acak dan menggabungkan hasil dari setiap pohon untuk memberikan prediksi akhir.

Keuntungan utama dari Random Forest adalah kemampuannya untuk mengurangi overfitting (overfitting adalah kondisi ketika model terlalu kompleks dan terlalu cocok dengan data pelatihan, tetapi gagal memprediksi data baru dengan baik) yang sering terjadi pada pohon keputusan tunggal. Random Forest bekerja dengan memilih subset acak dari data dan subset acak dari fitur untuk membangun setiap pohon keputusan, lalu menggabungkan hasil prediksi dari semua pohon untuk menghasilkan keputusan yang lebih robust.

Contoh Kasus: Memprediksi tingkat loyalitas pengguna berdasarkan jenis perangkat dan frekuensi login kepada aplikasi toko online. Alasan: Target klasifikasi dan prediktor campuran kategori & numerik → cocok untuk decision tree & random forest.

# Library
library(rpart)
install.packages("randomForest")
## Installing package into 'C:/Users/Fizky Firdzansyah/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'randomForest' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Fizky Firdzansyah\AppData\Local\Temp\RtmpeuaChC\downloaded_packages
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
# Simulasi data
set.seed(123)
perangkat <- sample(c("Mobile", "Desktop"), 200, replace = TRUE)
login <- rpois(200, lambda = 5)
loyalitas <- ifelse(perangkat == "Mobile" & login > 4, "Tinggi", "Rendah")

data4 <- data.frame(perangkat = factor(perangkat),
                    login = login,
                    loyalitas = factor(loyalitas))

# Decision Tree
tree_model <- rpart(loyalitas ~ perangkat + login, data = data4, method = "class")
tree_model
## n= 200 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 200 50 Rendah (0.7500000 0.2500000)  
##   2) perangkat=Desktop 97  0 Rendah (1.0000000 0.0000000) *
##   3) perangkat=Mobile 103 50 Rendah (0.5145631 0.4854369)  
##     6) login< 4.5 53  0 Rendah (1.0000000 0.0000000) *
##     7) login>=4.5 50  0 Tinggi (0.0000000 1.0000000) *
# Random Forest
rf_model <- randomForest(loyalitas ~ perangkat + login, data = data4, ntree = 100)
rf_model
## 
## Call:
##  randomForest(formula = loyalitas ~ perangkat + login, data = data4,      ntree = 100) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 1
## 
##         OOB estimate of  error rate: 0%
## Confusion matrix:
##        Rendah Tinggi class.error
## Rendah    150      0           0
## Tinggi      0     50           0

Metode-metode ini memungkinkan kita mengungkap pola, hubungan, dan tren dalam data kategorik secara lebih mendalam.

Distribusi Probabilitas dalam Data Kategori

Variabel acak kategori adalah variabel yang hanya dapat memiliki beberapa kategori diskrit sebagai hasilnya. Distribusi probabilitas dari variabel ini menggambarkan kemungkinan terjadinya setiap kategori.

Distribusi Bernoulli

Distribusi Bernoulli digunakan untuk percobaan biner, yaitu percobaan yang memiliki dua kemungkinan hasil: - Sukses (1) dengan probabilitas p - Gagal (0) dengan probabilitas 1 − p

Fungsi probabilitasnya:

\[ P(X = x) = p^x(1 - p)^{1 - x}, \quad x \in \{0, 1\} \]

Keterangan Notasi: - X: Variabel acak biner (0 atau 1) - p: Probabilitas sukses (X = 1)

Contoh Variabel Acak Bernoulli: - Hasil dari lemparan koin (Kepala = 1, Ekor = 0) - Keberhasilan atau kegagalan dalam suatu percobaan klinis

Perhitungan dengan R

library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following object is masked from 'package:randomForest':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
set.seed(123)
bernoulli <- rbinom(n = 20, size = 1, prob = 0.5) 
bernoulli
##  [1] 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1

Distribusi Binomial

Distribusi Binomial merupakan perluasan dari Distribusi Bernoulli untuk kasus dengan n kali percobaan yang independen, di mana setiap percobaan memiliki dua kemungkinan: sukses atau gagal. Jika probabilitas sukses dalam tiap percobaan adalah p, maka peluang mendapatkan k keberhasilan dari n percobaan dirumuskan sebagai:

\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n-k} \]

Keterangan Notasi: - X: Jumlah keberhasilan - n: Banyaknya percobaan - k: Banyaknya keberhasilan - p: Probabilitas sukses - \(\binom{n}{k}\): Kombinasi atau “n pilih k”

Contoh Kasus:
- Melempar koin 10 kali dan menghitung berapa kali muncul sisi kepala
- Jumlah pasien yang sembuh dari total yang diuji dalam eksperimen klinis

Perhitungan dengan R

set.seed(123) 
binomial <- rbinom(n = 15, size = 5, prob = 0.5) 
binomial
##  [1] 2 3 2 4 4 1 3 4 3 2 4 2 3 3 1

Distribusi Multinomial

Distribusi Multinomial adalah perluasan dari distribusi Binomial untuk situasi di mana setiap percobaan memiliki lebih dari dua kemungkinan hasil. Distribusi ini digunakan saat sebuah percobaan dilakukan sebanyak n kali, dan setiap percobaan menghasilkan satu dari k kategori dengan probabilitas \(p_1, p_2, ..., p_k\).

Rumus probabilitas distribusi Multinomial:

\[ P(X_1 = x_1, ..., 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} \]

Keterangan Notasi:

  • \(X_i\): Frekuensi kemunculan kategori ke-i
  • n: Jumlah total percobaan
  • \(x_i\): Jumlah kejadian kategori ke-i
  • \(p_i\): Probabilitas kategori ke-i

Contoh Kasus:

  • Seorang guru ingin mengetahui preferensi siswa terhadap 4 topik pelajaran (Matematika, IPA, IPS, Bahasa). Setiap siswa hanya boleh memilih satu topik favorit.
  • Sebuah perusahaan melakukan survei kepada 100 pelanggan untuk mengetahui alasan utama mereka membeli produk: Harga, Kualitas, Merek, atau Promosi. Setiap pelanggan hanya memilih satu alasan.
set.seed(123)
multinomial <- rmultinom(n = 1, size = 10, prob = c(0.3, 0.5, 0.2))
multinomial
##      [,1]
## [1,]    2
## [2,]    5
## [3,]    3

Distribusi Poisson

Distribusi Poisson digunakan untuk memodelkan jumlah kejadian dalam rentang waktu atau ruang tertentu, dengan rata-rata kejadian \(\lambda\) per unit. Probabilitasnya dirumuskan sebagai:

\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!} \]

Notasi: - \(X\): Jumlah kejadian dalam interval tertentu
- \(\lambda\): Rata-rata kejadian per interval
- \(k\): Jumlah kejadian yang diobservasi

Contoh Kasus:

Sebuah aplikasi streaming mencatat rata-rata 3 pengguna baru yang mendaftar setiap jam.

Simulasi dengan R:

set.seed(123)
poisson_sample <- rpois(12, lambda = 3)  
poisson_sample
##  [1] 2 4 2 5 6 0 3 5 3 3 6 3

Desain Sampling dalam Analisis Data Kategori

Desain sampling sangat penting dalam analisis data kategori karena memengaruhi validitas dan reliabilitas hasil penelitian. Pemilihan desain bergantung pada tujuan studi dan jenis data yang dikumpulkan.

Secara umum, desain sampling dibagi menjadi dua pendekatan utama:

  1. Prospective Sampling
  • Data dikumpulkan dari subjek berdasarkan eksposur atau perlakuan, lalu diikuti untuk melihat hasilnya.
  • Umumnya digunakan dalam:
  • Eksperimen terkontrol
  • Studi kohort
  1. Retrospective Sampling
  • Data dikumpulkan berdasarkan hasil atau status kejadian, lalu ditelusuri kembali ke eksposur atau faktor risiko.
  • Umumnya digunakan dalam:
  • Studi kasus-kontrol

Setiap pendekatan memiliki metode dan strategi tersendiri yang sesuai dengan jenis studi yang dilakukan (eksperimental atau observasional).

Prospective Sampling

Prospective sampling dilakukan dengan memilih subjek lebih dulu, lalu mengikuti mereka dalam periode waktu tertentu untuk mengamati perkembangan variabel. Umumnya digunakan pada studi kausal atau eksperimen karena memungkinkan kontrol atas variabel sebelum pengukuran.

Eksperimen

Dalam studi eksperimental, subjek dibagi ke dalam kelompok perlakuan dan kontrol. Metode sampling yang umum:

  • Simple Random Sampling (SRS): Semua individu memiliki peluang sama untuk dipilih.
  • Stratified Random Sampling: Populasi dibagi menjadi strata, lalu diambil sampel acak dari tiap strata.
  • Cluster Sampling: Populasi dibagi menjadi kelompok, beberapa cluster dipilih acak untuk dianalisis.

Studi Kohort

Studi kohort bersifat observasional; kelompok individu diikuti dari waktu ke waktu untuk melihat kejadian tertentu. Metode sampling:

  • Census Sampling: Semua anggota populasi diteliti.
  • Systematic Sampling: Pemilihan subjek berdasarkan interval dari daftar populasi.
  • Matched Sampling: Individu dalam kelompok kohort dicocokkan dengan individu sejenis dari kelompok lain berdasarkan variabel tertentu.

Retrospective Sampling

Retrospective sampling menggunakan data dari hasil yang telah terjadi untuk menelusuri kembali faktor risikonya. Cocok untuk studi observasional, terutama saat peristiwa sudah terjadi.

Studi Kasus-Kontrol

Dalam studi ini, kelompok dengan kondisi tertentu (kasus) dibandingkan dengan kelompok tanpa kondisi tersebut (kontrol). Teknik sampling yang digunakan antara lain:

  • Purposive Sampling: Pemilihan berdasarkan karakteristik relevan.
  • Snowball Sampling: Responden membantu merekrut partisipan lain dengan karakteristik serupa.
  • Incidence Density Sampling: Kasus dan kontrol dipilih berdasarkan waktu munculnya kasus.

Studi Kohort Retrospektif

Studi kohort retrospektif menggunakan data masa lalu untuk mengelompokkan individu berdasarkan paparan tertentu, lalu menganalisis kejadian yang sudah terjadi. Umumnya digunakan ketika data historis telah tersedia.

Metode sampling yang biasa digunakan:

  • Convenience Sampling: Pemilihan subjek didasarkan pada data yang tersedia dengan mudah.
  • Quota Sampling: Sampel dibentuk agar mencerminkan proporsi karakteristik tertentu dalam populasi.
  • Case-Based Sampling: Pemilihan berdasarkan karakteristik kasus yang telah tercatat di masa lalu.

Tabel Perbandingan Desain Sampling

Desain sampling memainkan peran penting dalam analisis data kategori. Pemilihan desain sangat bergantung pada pendekatan studi, apakah itu bersifat prospektif atau retrospektif. Berikut adalah ringkasan perbandingan berbagai jenis studi berdasarkan pendekatan, metode sampling, keuntungan, dan kelemahan:

library(knitr)
library(kableExtra)

data <- data.frame(
  "Jenis Studi" = c("Eksperimen", "Studi Kohort", "Studi Kasus-Kontrol", "Studi Kohort Retrospektif"),
  "Pendekatan" = c("Prospektif", "Prospektif", "Retrospektif", "Retrospektif"),
  "Metode Sampling" = c("SRS, Stratified, Cluster", 
                        "Census, Systematic, Matched", 
                        "Purposive, Snowball, Incidence Density", 
                        "Convenience, Quota, Case-Based"),
  "Keuntungan" = c("Kontrol variabel tinggi, memungkinkan analisis hubungan sebab akibat", 
                   "Dapat memantau kejadian dalam jangka waktu panjang", 
                   "Cepat dan efisien, cocok untuk penyakit langka", 
                   "Memanfaatkan data historis, lebih hemat biaya"),
  "Kelemahan" = c("Biaya tinggi, perlu pertimbangan etika dan validitas", 
                  "Waktu panjang, risiko partisipan hilang", 
                  "Sulit mengontrol variabel lain, rawan bias recall", 
                  "Bergantung pada kualitas data lama, kemungkinan data hilang")
)

kable(data, "html") %>%kable_styling(full_width = F)
Jenis.Studi Pendekatan Metode.Sampling Keuntungan Kelemahan
Eksperimen Prospektif SRS, Stratified, Cluster Kontrol variabel tinggi, memungkinkan analisis hubungan sebab akibat Biaya tinggi, perlu pertimbangan etika dan validitas
Studi Kohort Prospektif Census, Systematic, Matched Dapat memantau kejadian dalam jangka waktu panjang Waktu panjang, risiko partisipan hilang
Studi Kasus-Kontrol Retrospektif Purposive, Snowball, Incidence Density Cepat dan efisien, cocok untuk penyakit langka Sulit mengontrol variabel lain, rawan bias recall
Studi Kohort Retrospektif Retrospektif Convenience, Quota, Case-Based Memanfaatkan data historis, lebih hemat biaya Bergantung pada kualitas data lama, kemungkinan data hilang

Tabel Kontingensi 2 × 2

Tabel kontingensi 2×2 adalah bentuk paling sederhana dari tabel yang digunakan untuk mengevaluasi hubungan antara dua variabel kategori. Tabel ini sering digunakan untuk melihat adanya asosiasi, misalnya antara jenis pengobatan dan keberhasilan pemulihan, atau konsumsi kafein dan jumlah gangguan tidur.

Pada bab ini digunakan data sebagai berikut karena Tabel-tabel pada penelitian ini mencatat jumlah siswa dalam berbagai kategori, yang merupakan frekuensi yang dibutuhkan dalam pembuatan tabel kontingensi 2 x 2

Contoh kasus:

Anemia pada remaja putri merupakan masalah kesehatan yang cukup sering terjadi, terutama karena kebutuhan zat besi yang tinggi pada masa pubertas. Salah satu penyebab anemia yang umum adalah menstruasi dengan pola yang tidak normal (misalnya durasi lama atau volume darah banyak), karena kehilangan darah yang lebih besar. Seorang peneliti ingin mengetahui apakah pola menstruasi (normal atau tidak normal) berhubungan dengan kejadian anemia (anemia atau tidak anemia) pada siswi kelas VII di SMPN 6 Kediri.

Sumber: HUBUNGAN POLA MENSTRUASI DENGAN KEJADIAN ANEMIA PADA REMAJA PUTRI KELAS VII SMPN 6 KEDIRI. https://doi.org/10.32831/jik.v3i1.42

Pola Menstruasi Anemia Tidak Anemia Total
Normal 10 28 38
Tidak Normal 19 20 39
Total 29 48 77

ALASAN: Data ini digunakan dalam ADK bab tabel kontingensi karena memuat dua variabel kategorikal, yaitu pola menstruasi (normal/tidak normal) dan kejadian anemia (anemia/tidak anemia), yang disusun dalam bentuk frekuensi sehingga sesuai untuk dianalisis menggunakan tabel kontingensi 2x2.

Distribusi Peluang dalam Tabel Kontingensi 2 × 2

Peluang Bersama

Peluang bersama adalah kemungkinan dua peristiwa (dari dua variabel berbeda) terjadi secara bersamaan, ditunjukkan dalam satu sel tabel kontingensi:

\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]

Peluang Marginal

Peluang marginal menggambarkan probabilitas terjadinya suatu kejadian tanpa memperhitungkan variabel lain.

  • Peluang baris:

\[ P(A_i) = \frac{n_{i.}}{n} \]

  • Peluang kolom:

\[ P(B_j) = \frac{n_{.j}}{n} \]

Peluang Bersyarat

Peluang bersyarat adalah peluang terjadinya suatu peristiwa dengan asumsi bahwa peristiwa lain telah terjadi:

\[ P(B_j|A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i.}} \]

Untuk contoh perhitungan akan digunakan data yang dipaparkan sebelumnya, yaitu anemia (anemia atau tidak anemia) pada siswi kelas VII di SMPN 6 Kediri.

# Data Observasi
# Data Observasi (Pola Menstruasi vs Anemia)
data <- matrix(c(10, 28, 1, 2), nrow = 2, byrow = TRUE)
colnames(data) <- c("Anemia", "Tidak Anemia")
rownames(data) <- c("Normal", "Tidak Normal")
# Total Sampel
n <- sum(data)
# Peluang Bersama
P_joint <- data/n
# Peluang Marginal
P_marginal_rows <- rowSums(data)/n
P_marginal_cols <- colSums(data)/n
# Peluang Bersyarat
P_conditional <- data/rowSums(data)
# Hasil
list(
  Peluang_Bersama = P_joint,
  Peluang_Marginal_Baris = P_marginal_rows,
  Peluang_Marginal_Kolom = P_marginal_cols,
  Peluang_Bersyarat = P_conditional
)
## $Peluang_Bersama
##                  Anemia Tidak Anemia
## Normal       0.24390244   0.68292683
## Tidak Normal 0.02439024   0.04878049
## 
## $Peluang_Marginal_Baris
##       Normal Tidak Normal 
##   0.92682927   0.07317073 
## 
## $Peluang_Marginal_Kolom
##       Anemia Tidak Anemia 
##    0.2682927    0.7317073 
## 
## $Peluang_Bersyarat
##                 Anemia Tidak Anemia
## Normal       0.2631579    0.7368421
## Tidak Normal 0.3333333    0.6666667

Interpretasi

  1. Peluang Bersama menunjukkan probabilitas gabungan dari kejadian tertentu dalam tabel. Misalnya, peluang seseorang memiliki pola menstruasi normal dan mengalami anemia adalah sebesar 24.4%, sedangkan peluang seseorang memiliki pola menstruasi tidak normal dan tidak mengalami anemia adalah 4.9%.

  2. Peluang Marginal menunjukkan probabilitas suatu kejadian tanpa mempertimbangkan variabel lain. Contohnya, sebanyak 92.7% responden memiliki pola menstruasi normal, dan 26.8% dari seluruh responden mengalami anemia.

  3. Peluang Bersyarat menunjukkan bagaimana probabilitas berubah ketika informasi tentang variabel lain diberikan. Sebagai contoh, dari mereka yang memiliki pola menstruasi tidak normal, 33.3% mengalami anemia, sedangkan dari yang memiliki pola menstruasi normal, hanya 26.3% yang mengalami anemia. Ini mengindikasikan bahwa kondisi menstruasi mungkin berkaitan dengan kejadian anemia.

Ukuran Asosiasi dalam Data Kategori 2 x 2

Dalam analisis statistik, asosiasi dalam tabel kontingensi 2 × 2 digunakan untuk menentukan hubungan antara dua variabel kategori.

Dalam tabel 2×2,kita dapat menghitung ukuran asosiasi seperti:

• Risk Difference (RD): Mengukur selisih risiko antara dua kelompok.

• Relative Risk (RR): Mengukur perbandingan risiko antara dua kelompok.

• Odds Ratio (OR): Membandingkan peluang kejadian antara dua kelompok.

• Uji Chi-Square & Fisher’s Exact Test: Untuk menguji apakah hubungan antara dua variabel signifikan secara statistik

Risk Difference

Risk Difference (RD) atau perbedaan risiko adalah selisih proporsi kejadian antara dua kelompok. Rumusnya:

\[ RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right) \]

# Menghitung risiko masing-masing kelompok
 risk_positive <- 10 / (10 + 28)  
 risk_negative <- 19 / (19 + 20)  
# Menghitung Risk Difference
 RD <- risk_positive - risk_negative
 RD
## [1] -0.2240216

Interpretasi Selisih risiko anemia antara siswi dengan pola menstruasi tidak normal dan normal adalah -22.4%. Artinya, siswi dengan pola menstruasi tidak normal memiliki risiko anemia yang 22.4% lebih tinggi dibandingkan yang memiliki pola menstruasi normal. Karena nilainya negatif, ini menunjukkan peningkatan risiko pada kelompok “tidak normal”.

Relative Risk

Relative Risk (RR) atau risiko relatif adalah perbandingan proporsi kejadian antara dua kelompok. Rumusnya:

\[ RR = \frac{ \left( \frac{n_{11}}{n_{1.}} \right) }{ \left( \frac{n_{21}}{n_{2.}} \right) } \]

RR <- risk_positive / risk_negative
RR
## [1] 0.5401662

Interpretasi: Rasio risiko anemia antara kelompok dengan pola menstruasi tidak normal terhadap yang normal adalah 0.540. Ini berarti bahwa risiko anemia pada siswi dengan pola menstruasi normal hanya sekitar 54% dari risiko yang dialami oleh siswi dengan pola menstruasi tidak normal. Dengan kata lain, siswi yang menstruasinya normal memiliki risiko 46% lebih rendah terkena anemia dibandingkan yang tidak normal.

Odds Ratio

Odds Ratio (OR) digunakan untuk membandingkan peluang terjadinya suatu kejadian antara dua kelompok. OR sering digunakan dalam studi observasional, seperti studi kasus-kontrol, untuk mengukur kekuatan asosiasi antar variabel kategorik.

\[ OR = \frac{a \cdot d}{b \cdot c} \]

Dari data:

Pola Menstruasi Anemia (a/c) Tidak Anemia (b/d) Total
Normal 10 (a) 28 (b) 38
Tidak Normal 19 (c) 20 (d) 35
# Nilai tabel kontingensi
a <- 10  # Normal + Anemia
b <- 28  # Normal + Tidak Anemia
c <- 19  # Tidak Normal + Anemia
d <- 20  # Tidak Normal + Tidak Anemia

# Odds Ratio
OR <- (a * d) / (b * c)
OR
## [1] 0.3759398

Interpretasi Nilai OR sebesar 0.3759398 menunjukkan bahwa peluang mengalami anemia pada siswi dengan pola menstruasi normal adalah sekitar 37% dari peluang yang dimiliki oleh siswi dengan pola menstruasi tidak normal.

Inferensi Tabel Kontingensi Dua Arah

Inferensi dalam konteks tabel kontingensi dua arah merupakan proses statistik untuk menarik kesimpulan mengenai hubungan antara dua variabel kategorikal berdasarkan data sampel. Tabel kontingensi sendiri adalah representasi matriks yang menampilkan distribusi frekuensi gabungan dari dua variabel, seperti jenis kelamin dan preferensi makanan, atau status merokok dan kejadian penyakit. Melalui tabel ini, kita dapat mengamati apakah ada pola tertentu atau distribusi yang tidak acak dalam hubungan antara kategori dari kedua variabel tersebut.

Tujuan utama dari analisis inferensial pada tabel kontingensi dua arah adalah untuk menguji apakah terdapat asosiasi atau ketergantungan antara kedua variabel. Salah satu metode yang paling umum digunakan adalah uji chi-square, yang memungkinkan kita untuk menguji hipotesis nol bahwa tidak ada hubungan antara variabel (independen) versus alternatif bahwa ada hubungan (dependen). Selain pengujian hipotesis, inferensi juga mencakup estimasi parameter, seperti proporsi bersyarat, yang dapat memberikan pemahaman lebih lanjut mengenai kekuatan dan arah hubungan antar kategori.

# Data: Pola Menstruasi vs Status Anemia
anemia_data <- matrix(c(10, 28, 19, 20), nrow = 2, byrow = TRUE)
rownames(anemia_data) <- c("Normal", "Tidak Normal")
colnames(anemia_data) <- c("Anemia", "Tidak Anemia")
anemia_data
##              Anemia Tidak Anemia
## Normal           10           28
## Tidak Normal     19           20

Estimasi

Dalam konteks tabel kontingensi dua arah, estimasi digunakan untuk memperkirakan parameter populasi berdasarkan data sampel. Terdapat dua jenis estimasi: titik dan interval.

Estimasi Titik

Estimasi titik memberikan satu nilai terbaik untuk parameter populasi, seperti proporsi kejadian atau odds ratio.

Contoh:

\[ \hat{p} = \frac{x}{n} \]

Contoh perhitungan di R untuk proporsi:

# Proporsi anemia pada siswi tidak normal
anemia_tdk_normal <- 19
total_tdk_normal <- 39
proporsi_tdk_normal <- anemia_tdk_normal / total_tdk_normal
proporsi_tdk_normal
## [1] 0.4871795

Estimasi Interval

Estimasi interval memberikan rentang nilai kemungkinan parameter populasi berdasarkan data sampel.

# Interval kepercayaan proporsi anemia (tidak normal)
prop.test(anemia_tdk_normal, total_tdk_normal, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  anemia_tdk_normal out of total_tdk_normal, null probability 0.5
## X-squared = 0, df = 1, p-value = 1
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3271153 0.6497221
## sample estimates:
##         p 
## 0.4871795

Uji Hipotesis

Pengujian hipotesis bertujuan untuk menilai apakah terdapat hubungan antara dua variabel kategorik, dalam hal ini pola menstruasi dan kejadian anemia.

Uji Proporsi

Hipotesis:

\(H_0: p_1 = p_2\) (tidak ada perbedaan proporsi)

\(H_1: p_1 \ne p_2\) (ada perbedaan proporsi)

Digunakan untuk membandingkan proporsi kejadian anemia antara dua kelompok pola menstruasi.

# Proporsi anemia: normal (10/38) vs tidak normal (19/39)
prop.test(c(10, 19), c(38, 39))
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(10, 19) out of c(38, 39)
## X-squared = 3.2153, df = 1, p-value = 0.07295
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.46026337  0.01222018
## sample estimates:
##    prop 1    prop 2 
## 0.2631579 0.4871795

Uji Chi-Square

Digunakan untuk menguji hubungan antara dua variabel kategori melalui tabel kontingensi.

# Tabel kontingensi
data <- matrix(c(10, 28, 19, 20), nrow = 2, byrow = TRUE)
rownames(data) <- c("Normal", "Tidak Normal")
colnames(data) <- c("Anemia", "Tidak Anemia")

# Uji chi-square
chisq.test(data)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  data
## X-squared = 3.2153, df = 1, p-value = 0.07295

Uji Fisher (Uji Independensi)

dengan hipotesis sebagai berikut: \[ H_0 : \text{X dan Y tidak saling bergantung} \\ H_1 : \text{X dan Y saling bergantung} \]

Ketika frekuensi harapan terlalu kecil untuk uji chi-square, digunakan uji Fisher:

# Fisher's Exact Test
fisher.test(data)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  data
## p-value = 0.06002
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.1280741 1.0776396
## sample estimates:
## odds ratio 
##  0.3808925

Analisis Residual dalam Tabel Kontingensi

Analisis residual dilakukan untuk mengevaluasi kontribusi tiap sel terhadap hasil uji chi-square.

Jenis Residual

  1. Residual Pearson: Mengukur seberapa besar deviasi antara nilai observasi dan harapan.

\[ r_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

  1. Residual Terstandarisasi: Pearson residual yang telah disesuaikan dengan standar deviasi.

\[ r_{ij}^{(S)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - \frac{n_{i+}}{n})(1 - \frac{n_{+j}}{n})}} \]

Berikut untuk implementasi dalam R

# Residual Pearson
chisq <- chisq.test(data)
chisq$residuals
##                 Anemia Tidak Anemia
## Normal       -1.139730    0.8858910
## Tidak Normal  1.125023   -0.8744597
# Residual Terstandarisasi
chisq$stdres
##                 Anemia Tidak Anemia
## Normal       -2.028335     2.028335
## Tidak Normal  2.028335    -2.028335

Deteksi Outlier dalam Analisis Data Kategori Menggunakan Residual

Residual dapat digunakan untuk mendeteksi sel yang menyimpang (outlier) dalam tabel kontingensi. Sel dengan residual terstandarisasi (standardized residual) > |2| dapat dianggap sebagai kontributor utama terhadap nilai chi-square yang besar.

# Deteksi outlier berdasarkan residual terstandarisasi
resid_terstandar <- chisq$stdres
resid_terstandar
##                 Anemia Tidak Anemia
## Normal       -2.028335     2.028335
## Tidak Normal  2.028335    -2.028335
# Tandai sel-sel yang signifikan (misalnya > |2|)
which(abs(resid_terstandar) > 2, arr.ind = TRUE)
##              row col
## Normal         1   1
## Tidak Normal   2   1
## Normal         1   2
## Tidak Normal   2   2

Sel yang memiliki residual terstandarisasi lebih dari 2 (positif atau negatif) menunjukkan perbedaan signifikan antara nilai observasi dan nilai harapan berdasarkan asumsi independensi.

Interpretasi Residual

Interpretasi residual penting untuk memahami sel mana yang memberikan kontribusi signifikan terhadap asosiasi antar variabel. Secara umum:

  • Residual positif menunjukkan frekuensi observasi lebih besar dari harapan.
  • Residual negatif menunjukkan frekuensi observasi lebih kecil dari harapan.
  • Residual terstandarisasi > |2| dianggap signifikan secara statistik (outlier).

Tabel Kontingensi Tiga Arah

Bab ini membahas analisis hubungan tiga variabel kategorik menggunakan tabel kontingensi tiga arah. Pendekatan ini digunakan saat hubungan antara dua variabel (misalnya 𝑋 dan 𝑌) mungkin dipengaruhi oleh variabel ketiga (𝑍), yang disebut sebagai variabel kontrol atau kovariat.

Tabel Parsial dan Marginal

Contoh kasus

Minat baca remaja sering kali dipengaruhi oleh latar belakang sosial dan budaya, termasuk profesi orang tua dan jenis kelamin mereka. Seorang peneliti ingin mengetahui apakah terdapat hubungan antara jenis profesi (politik atau seni), jenis kelamin (laki-laki atau perempuan), dan jenis bacaan yang disukai (novel atau fiksi ilmiah) pada siswa-siswi SMP di Kota Medan. Ketiga variabel ini diamati karena diyakini bahwa profesi keluarga dan gender dapat memengaruhi preferensi bacaan siswa. Data dikumpulkan dari 185 siswa, dan peneliti menyusun data tersebut dalam bentuk tabel kontingensi tiga arah.

Sumber: ANALISIS MODEL LOG LINIER TIGA DIMENSI UNTUK DATA KUALITATIF DENGAN METODE FORWARD https://jurnal.uisu.ac.id/index.php/mesuisu/article/view/3137

Profesi Jenis Kelamin Fiksi Ilmiah Novel Total
Politikus Laki-Laki 38 25 63
Politikus Perempuan 20 15 35
Penari Laki-Laki 12 27 39
Penari Perempuan 18 30 48
Total 88 97 185

ALASAN: Mewakili Tiga Variabel Kategorik yang Saling Berinteraksi Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan di antara tiga variabel kategorik. Dalam kasus ini: Profesi (politik vs seni), Jenis bacaan (fiksi ilmiah vs novel), Jenis kelamin (laki-laki vs perempuan)

# Masukkan data ke dalam array 3 dimensi
data_profesi <- array(
  data = c(38, 25, 20, 15, 12, 27, 18, 30),
  dim = c(2, 2, 2),
  dimnames = list(
    Profesi = c("Politikus", "Penari"),
    Jenis_Kelamin = c("Laki-Laki", "Perempuan"),
    Bacaan = c("Fiksi Ilmiah", "Novel")))
# Tabel Frekuensi
ftable(data_profesi)
##                         Bacaan Fiksi Ilmiah Novel
## Profesi   Jenis_Kelamin                          
## Politikus Laki-Laki                      38    12
##           Perempuan                      20    18
## Penari    Laki-Laki                      25    27
##           Perempuan                      15    30
# Ekstrak tabel parsial berdasarkan jenis bacaan
freq_parsial_fiksi <- data_profesi[, , "Fiksi Ilmiah"]
freq_parsial_novel <- data_profesi[, , "Novel"]

# Tampilkan hasil
freq_parsial_fiksi
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus        38        20
##   Penari           25        15
freq_parsial_novel
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus        12        18
##   Penari           27        30

Kesimpulan: Tabel frekuensi parsial memungkinkan analisis hubungan antara dua variabel dengan mempertimbangkan variabel kontrol.

Distribusi Peluang

  1. Peluang Gabungan
# Hitung peluang gabungan
n <- sum(data_profesi)
prob_gabungan <- data_profesi / n
ftable(prob_gabungan)
##                         Bacaan Fiksi Ilmiah      Novel
## Profesi   Jenis_Kelamin                               
## Politikus Laki-Laki              0.20540541 0.06486486
##           Perempuan              0.10810811 0.09729730
## Penari    Laki-Laki              0.13513514 0.14594595
##           Perempuan              0.08108108 0.16216216
  1. Peluang Bersyarat
# Peluang bersyarat berdasarkan Bacaan
prob_bersyarat_bacaan <- prop.table(data_profesi, margin = 3)
ftable(prob_bersyarat_bacaan)
##                         Bacaan Fiksi Ilmiah     Novel
## Profesi   Jenis_Kelamin                              
## Politikus Laki-Laki               0.3877551 0.1379310
##           Perempuan               0.2040816 0.2068966
## Penari    Laki-Laki               0.2551020 0.3103448
##           Perempuan               0.1530612 0.3448276
  1. Peluang Marginal
# Peluang marginal (Profesi dan Jenis Kelamin)
prob_marginal <- apply(prob_gabungan, c(1,2), sum)
prob_marginal
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus 0.2702703 0.2054054
##   Penari    0.2810811 0.2432432

Tabel Peluang Bersyarat

Tabel ini menyajikan nilai peluang dua variabel berdasarkan satu variabel tetap.

Contoh: Tabel \(P(\text{Bacaan} \mid \text{Jenis Kelamin})\)

# Tabel bersyarat: Bacaan | Jenis Kelamin
tabel_bersyarat <- prop.table(data_profesi, margin = 2)
ftable(tabel_bersyarat)
##                         Bacaan Fiksi Ilmiah     Novel
## Profesi   Jenis_Kelamin                              
## Politikus Laki-Laki               0.3725490 0.1176471
##           Perempuan               0.2409639 0.2168675
## Penari    Laki-Laki               0.2450980 0.2647059
##           Perempuan               0.1807229 0.3614458

Kesimpulan • Peluang bersama dihitung dengan membagi frekuensi dengan total populasi. • Peluang marginal diperoleh dengan menjumlahkan probabilitas bersama. • Peluang bersyarat dihitung menggunakan rumus Bayes.

Ukuran Asosiasi

  1. Risk Difference RD menunjukkan selisih risiko antara dua kelompok. \[ RD = P(Y \mid X_1, Z) - P(Y \mid X_2, Z) \]

  2. Relative Risk RR menunjukkan perbandingan risiko antara dua kelompok. \[ RR = \frac{P(Y \mid X_1, Z)}{P(Y \mid X_2, Z)} \]

  3. Odds Ratio OR menunjukkan perbandingan odds (peluang relatif) antara dua kelompok. \[ OR = \frac{ \frac{P(Y \mid X_1, Z)}{1 - P(Y \mid X_1, Z)} }{ \frac{P(Y \mid X_2, Z)}{1 - P(Y \mid X_2, Z)} } \]

Pengaplikasian dalam R:

# Data: Laki-laki
# Politikus: 38 suka fiksi ilmiah, 25 suka novel → total 63
# Penari   : 12 suka fiksi ilmiah, 27 suka novel → total 39

# Probabilitas fiksi ilmiah
p1 <- 38 / (38 + 25)  # politikus
p2 <- 12 / (12 + 27)  # penari

# Risk Difference
RD <- p1 - p2

# Relative Risk
RR <- p1 / p2

# Odds Ratio
odds1 <- p1 / (1 - p1)
odds2 <- p2 / (1 - p2)
OR <- odds1 / odds2

c(RD = RD, RR = RR, OR = OR)
##        RD        RR        OR 
## 0.2954823 1.9603175 3.4200000

Interpretasi

Independensi Bersyarat

Dua variabel dikatakan independen secara kondisional jika hubungan antara keduanya menghilang setelah dikendalikan oleh variabel ketiga.

Rumus:

\[ P(X, Y \mid Z) = P(X \mid Z) \cdot P(Y \mid Z) \]

Artinya, distribusi gabungan \(P(X, Y)\) tidak tergantung satu sama lain setelah kondisi \(Z\) tetap.

Implementasi: Uji Chi-Square per strata (per nilai variabel ketiga)

# Pisahkan tabel menurut kategori Bacaan (Z)
tab_fiksi <- data_profesi[,, "Fiksi Ilmiah"]
tab_novel <- data_profesi[,, "Novel"]

# Uji independensi antara Profesi dan Jenis Kelamin di masing-masing strata
chisq.test(tab_fiksi)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tab_fiksi
## X-squared = 0.0084483, df = 1, p-value = 0.9268
chisq.test(tab_novel)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tab_novel
## X-squared = 0.18498, df = 1, p-value = 0.6671

Interpretasi Hasil

Marginal Y dan X

Marginalisasi adalah proses menjumlahkan dimensi tertentu dari tabel untuk menganalisis hubungan dua variabel dengan mengabaikan variabel ketiga.

# Marginalisasi variabel Bacaan → hasil tabel 2D (Profesi x Jenis Kelamin)
marginal_PJ <- apply(data_profesi, c(1, 2), sum)
marginal_PJ
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus        50        38
##   Penari           52        45

Inferensi pada Tabel Tiga Arah

Inferensi dilakukan untuk mengetahui apakah interaksi antara ketiga variabel signifikan. Salah satu pendekatan utama adalah Model Log-Linier.

Model log-linier menyatakan logaritma dari frekuensi ekspektasi (\(\mu_{ijk}\)) sebagai kombinasi linier dari parameter efek utama dan interaksi.

\[ \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} \] Keterangan:

  • \(\lambda\) : konstanta umum (intersep)
  • \(\lambda^X_i\), \(\lambda^Y_j\), \(\lambda^Z_k\) : efek utama masing-masing variabel
  • \(\lambda^{XY}_{ij}\), \(\lambda^{XZ}_{ik}\), \(\lambda^{YZ}_{jk}\) : interaksi dua arah
  • \(\lambda^{XYZ}_{ijk}\) : interaksi tiga arah (jika signifikan → ketiga variabel saling memengaruhi)
# Model penuh dengan 3-way interaction
loglin(data_profesi, margin = list(1, 2, 3), fit = TRUE)
## 2 iterations: deviation 0
## $lrt
## [1] 19.02378
## 
## $pearson
## [1] 18.85243
## 
## $df
## [1] 4
## 
## $margin
## $margin[[1]]
## [1] "Profesi"
## 
## $margin[[2]]
## [1] "Jenis_Kelamin"
## 
## $margin[[3]]
## [1] "Bacaan"
## 
## 
## $fit
## , , Bacaan = Fiksi Ilmiah
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  25.70191  20.91430
##   Penari     28.33052  23.05327
## 
## , , Bacaan = Novel
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  22.81701  18.56678
##   Penari     25.15056  20.46565
# Model tanpa interaksi tiga arah (hanya 2-way interactions)
loglin(data_profesi, margin = list(c(1,2), c(1,3), c(2,3)), fit = TRUE)
## 4 iterations: deviation 0.01594643
## $lrt
## [1] 0.4746933
## 
## $pearson
## [1] 0.474517
## 
## $df
## [1] 1
## 
## $margin
## $margin[[1]]
## [1] "Profesi"       "Jenis_Kelamin"
## 
## $margin[[2]]
## [1] "Profesi" "Bacaan" 
## 
## $margin[[3]]
## [1] "Jenis_Kelamin" "Bacaan"       
## 
## 
## $fit
## , , Bacaan = Fiksi Ilmiah
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  36.89925  21.10069
##   Penari     26.10075  13.89931
## 
## , , Bacaan = Novel
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  13.10244  16.89762
##   Penari     25.89756  31.10238
# Model tanpa interaksi tiga arah (hanya 2-way interactions)
loglin(data_profesi, margin = list(c(1,2), c(1,3), c(2,3)), fit = TRUE)
## 4 iterations: deviation 0.01594643
## $lrt
## [1] 0.4746933
## 
## $pearson
## [1] 0.474517
## 
## $df
## [1] 1
## 
## $margin
## $margin[[1]]
## [1] "Profesi"       "Jenis_Kelamin"
## 
## $margin[[2]]
## [1] "Profesi" "Bacaan" 
## 
## $margin[[3]]
## [1] "Jenis_Kelamin" "Bacaan"       
## 
## 
## $fit
## , , Bacaan = Fiksi Ilmiah
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  36.89925  21.10069
##   Penari     26.10075  13.89931
## 
## , , Bacaan = Novel
## 
##            Jenis_Kelamin
## Profesi     Laki-Laki Perempuan
##   Politikus  13.10244  16.89762
##   Penari     25.89756  31.10238

Uji Cochran–Mantel–Haenszel (CMH) dan Breslow–Day

Dalam analisis tabel kontingensi 2×2×k, kita sering ingin mengetahui:

  1. Apakah terdapat hubungan antara dua variabel kategorik setelah mengontrol variabel ketiga? → Uji CMH
  2. Apakah odds ratio dari tiap strata bisa dianggap seragam? → Uji Breslow–Day

Uji Cochran–Mantel–Haenszel (CMH)

CMH menguji apakah ada asosiasi keseluruhan antara dua variabel setelah dikendalikan oleh variabel ketiga.

Rumus Statistik CMH:

\[ \chi^2_{CMH} = \frac{ \left( \sum_k (a_k - E_k) \right)^2 }{ \sum_k V_k } \]

  • \(a_k\) = nilai observasi sel eksposur-kasus di strata \(k\)
  • \(E_k\) = ekspektasi berdasarkan independensi
  • \(V_k\) = variansi masing-masing \(a_k\)

Implementasi di R:

# Format data: Bacaan x Profesi x Jenis Kelamin
data_cmh <- array(
  data = c(38,12,25,27,20,18,15,30),
  dim = c(2, 2, 2),
  dimnames = list(
    Bacaan = c("Fiksi", "Novel"),
    Profesi = c("Politikus", "Penari"),
    Jenis_Kelamin = c("Laki-Laki", "Perempuan")
  )
)

# Uji CMH
mantelhaen.test(data_cmh)
## 
##  Mantel-Haenszel chi-squared test with continuity correction
## 
## data:  data_cmh
## Mantel-Haenszel X-squared = 10.051, df = 1, p-value = 0.001522
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.515220 5.140813
## sample estimates:
## common odds ratio 
##          2.790961

Uji Homogenitas Odds Ratio: Breslow–Day Test

Uji Breslow–Day digunakan untuk mengevaluasi apakah odds ratio antar strata (lapisan variabel ketiga) bersifat homogen. Jika hasil uji menunjukkan bahwa OR antar strata berbeda signifikan, maka interpretasi agregat (seperti dari uji CMH) bisa menyesatkan.


Tujuan:

Menilai keseragaman (homogenitas) odds ratio dari tabel kontingensi 2×2×k.


Asumsi:

  • Data terdiri dari \(k\) buah tabel 2×2.
  • Setiap strata memiliki ukuran sampel yang cukup.
  • Odds ratio diasumsikan homogen di seluruh strata dalam hipotesis nol.

Hipotesis

  • \(H_0\): Odds ratio sama di semua strata
  • \(H_1\): Terdapat paling tidak satu strata dengan odds ratio yang berbeda

Rumus Statistik Uji Breslow–Day

Misal terdapat \(k\) strata, dengan odds ratio \(OR_k\) untuk masing-masing strata, dan \(OR_{CMH}\) adalah odds ratio gabungan menurut uji CMH.

Maka statistik uji Breslow–Day didefinisikan sebagai:

\[ X^2_{BD} = \sum_{k=1}^{K} \frac{(OR_k - OR_{CMH})^2}{\text{Var}(OR_k)} \]

Statistik ini mengikuti distribusi chi-square dengan derajat bebas sebesar \(k - 1\).


Interpretasi

  • Jika nilai \(p\) dari uji Breslow–Day < 0.05 → OR antar strata tidak homogen
  • Jika nilai \(p \ge 0.05\)OR dapat dianggap seragam

Implementasi di R (pakai vcdExtra)

# Pastikan library vcdExtra sudah diinstal
# install.packages("vcdExtra")
install.packages("vcdExtra")
## Installing package into 'C:/Users/Fizky Firdzansyah/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'vcdExtra' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Fizky Firdzansyah\AppData\Local\Temp\RtmpeuaChC\downloaded_packages
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
## 
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
## 
##     summarise
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
exists("BreslowDayTest")
## [1] TRUE
# Gunakan data: Bacaan x Profesi x Jenis Kelamin
data_cmh <- array(
  data = c(38,12,25,27,20,18,15,30),
  dim = c(2, 2, 2),
  dimnames = list(
    Bacaan = c("Fiksi", "Novel"),
    Profesi = c("Politikus", "Penari"),
    Jenis_Kelamin = c("Laki-Laki", "Perempuan")
  )
)

# Breslow-Day Test
BreslowDayTest(data_cmh)
## 
##  Breslow-Day test on Homogeneity of Odds Ratios
## 
## data:  data_cmh
## X-squared = 0.47446, df = 1, p-value = 0.4909

Catatan Penting Jika CMH signifikan tetapi Breslow–Day juga signifikan, maka: 1. Ada hubungan antar variabel (CMH) 2. Tapi hubungan tersebut tidak konsisten antar strata (Breslow–Day)

Generalized Linear Model (GLM)

Generalized Linear Model (GLM) merupakan perluasan dari model regresi linear klasik. GLM memungkinkan kita untuk memodelkan data di mana variabel respons tidak berdistribusi normal dan/atau hubun gan antara variabel

Contoh Kasus

Dalam sebuah studi kecil, dilakukan pengamatan terhadap 10 siswa untuk mengetahui apakah mengikuti program test preparation course (program persiapan ujian) berpengaruh terhadap nilai matematika mereka. Setiap siswa dicatat apakah mereka mengikuti kursus (1 = ikut, 0 = tidak ikut) dan nilai matematika yang mereka peroleh.

test preparation course math score
0 72
1 69
0 90
0 47
0 76
0 71
1 88
0 40
1 64
0 38

Alasan: Data ini cocok dianalisis menggunakan Generalized Linear Model (GLM) karena memiliki struktur klasik untuk regresi: variabel prediktor berupa data kategorik biner (test preparation course, 0 = tidak ikut, 1 = ikut) dan variabel respons berupa data kontinu (math score).

# Data
course <- c(0,1,0,0,0,0,1,0,1,0)
score <- c(72,69,90,47,76,71,88,40,64,38)
data <- data.frame(course = course, score = score) ; data

Exponential Family

Generalized Linear Model (GLM) adalah kerangka model statistik yang memperluas model regresi linear klasik. Salah satu syarat utama dalam GLM adalah bahwa variabel respons mengikuti distribusi dari exponential family, yang memiliki bentuk umum sebagai berikut:

\[ f(y; \theta, \phi) = \exp \left\{ \frac{y \theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]

Di mana:

  • \(\theta\) = parameter kanonik
  • \(\phi\) = parameter dispersi
  • \(b(\theta)\) dan \(c(y, \phi)\) adalah fungsi yang tergantung distribusi

Beberapa distribusi yang termasuk exponential family: - Distribusi normal - Distribusi binomial - Distribusi Poisson - Distribusi gamma

Model Regresi Logistik

Regresi logistik digunakan untuk memodelkan variabel respons biner (0 atau 1), seperti sukses/gagal, hadir/tidak hadir, dll.

Fungsi Link

Model regresi logistik menggunakan fungsi link logit:

\[ g(\mu) = \log\left( \frac{\mu}{1 - \mu} \right) \]

Dengan bentuk model linier:

\[ \log \left( \frac{\mu_i}{1 - \mu_i} \right) = \eta_i = \mathbf{x}_i^\top \beta \]

Dan fungsi inverse-nya:

\[ \mu_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} \]

Estimasi Parameter

Estimasi parameter dilakukan dengan Maximum Likelihood Estimation (MLE). Fungsi likelihood untuk \(n\) data adalah:

\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\mu_i) + (1 - y_i)\log(1 - \mu_i) \right] \]

Proses pencarian \(\hat{\beta}\) dilakukan melalui algoritma numerik seperti iterasi Newton-Raphson.


Contoh Implementasi di R

# Data
course <- c(0,1,0,0,0,0,1,0,1,0)
score <- c(72,69,90,47,76,71,88,40,64,38)

data <- data.frame(course, score)

# Binerkan skor matematika: 1 jika skor ≥ 70, 0 jika tidak
data$score <- ifelse(data$score >= 70, 1, 0)

# Model logistik: apakah kursus berpengaruh terhadap kelulusan
logit_model <- glm(course ~ score, data = data, family = binomial(link = "logit"))
summary(logit_model)
## 
## Call:
## glm(formula = course ~ score, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  -0.4055     0.9129  -0.444    0.657
## score        -0.9808     1.4434  -0.680    0.497
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 12.217  on 9  degrees of freedom
## Residual deviance: 11.734  on 8  degrees of freedom
## AIC: 15.734
## 
## Number of Fisher Scoring iterations: 4

Model Regresi Poisson

Model regresi Poisson digunakan saat variabel respons berbentuk count (cacah), yaitu bilangan bulat non-negatif. Distribusi Poisson memiliki fungsi probabilitas sebagai berikut:

\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!}, \quad y = 0, 1, 2, \dots \]

Model ini termasuk dalam keluarga exponential family:

\[ f(y; \theta) = \exp \left\{ y \log(\lambda) - \lambda - \log(y!) \right\} \]

Dengan:

  • \(\theta = \log(\lambda)\)
  • \(b(\theta) = \lambda\)
  • \(\phi = 1\)
  • \(c(y, \phi) = -\log(y!)\)

Fungsi Link

Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:

\[ g(\mu) = \log(\mu) \]

Sehingga model menjadi:

\[ \log(\mu_i) = \eta_i = \mathbf{x}_i^\top \beta \]

dan fungsi inverse-nya:

\[ \mu_i = \exp(\mathbf{x}_i^\top \beta) \]


Estimasi Parameter

Penaksiran parameter \(\beta\) dilakukan dengan Maximum Likelihood Estimation (MLE). Fungsi log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i (\mathbf{x}_i^\top \beta) - \exp(\mathbf{x}_i^\top \beta) - \log(y_i!) \right] \]

Contoh implementasi di R (Estimasi parameter) dengan dua digit NPM akhir

set.seed(78)
n <- 200
x <- rnorm(n)
p <- 1 / (1 + exp(-(-0.5 + 2*x)))
y <- rbinom(n, 1, p)
data <- data.frame(y, x)
data
model <- glm(y ~ x, data = data, family = binomial())
summary(model)
## 
## Call:
## glm(formula = y ~ x, family = binomial(), data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.5662     0.1883  -3.007  0.00264 ** 
## x             1.7977     0.2648   6.788 1.14e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 270.74  on 199  degrees of freedom
## Residual deviance: 186.64  on 198  degrees of freedom
## AIC: 190.64
## 
## Number of Fisher Scoring iterations: 5
exp(coef(model))
## (Intercept)           x 
##   0.5676782   6.0355298
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
## 
##     margin
data$pred <- predict(model, type = "response")
ggplot(data, aes(x = x, y = y)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y = pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Logistik",
x = "X (Prediktor)",
y = "Probabilitas / Respons") +
theme_minimal()

# Klasifikasi dan confusion matrix
data$pred_class <- ifelse(data$pred > 0.5, 1, 0)
table(Predicted = data$pred_class, Actual=data$y)
##          Actual
## Predicted  0  1
##         0 95 26
##         1 23 56

Kesimpulan: • Model regresi logistik mampu memprediksi probabilitas berdasarkan hubungan antara variabel x dan hasil biner y. • Kurva logit menunjukkan bentuk S yang memisahkan dua kelas secara probabilistik. • Koefisien dapat diinterpretasikan dalam bentuk log-odds atau odds ratio. • Evaluasi model menunjukkan performa klasifikasi yang baik jika p-value signifikan dan prediksi sesuai dengan observasi.


Contoh Implementasi di R

# Data pengaruh test preparation course
course <- c(0,1,0,0,0,0,1,0,1,0)
score <- c(72,69,90,47,76,71,88,40,64,38)
data <- data.frame(course, score)

# Model regresi Poisson
poisson_model <- glm(score ~ course, data = data, family = poisson(link = "log"))
summary(poisson_model)
## 
## Call:
## glm(formula = score ~ course, family = poisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.12713    0.04800  85.979   <2e-16 ***
## course       0.17242    0.08264   2.086   0.0369 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 49.028  on 9  degrees of freedom
## Residual deviance: 44.760  on 8  degrees of freedom
## AIC: 108.58
## 
## Number of Fisher Scoring iterations: 4

Contoh kedua dengan menggunakan NPM (Overdisspersion)

# Data simulasi
set.seed(78)
n <- 200
x <- rnorm(n)
p <- 1 / (1 + exp(-(-0.5 + 2*x)))
y <- rbinom(n, 1, p)
data <- data.frame(y, x)
data

Estimasi Regresi Poisson

poisson_model <- glm(y ~ x, data = data, family = poisson)
summary(poisson_model)
## 
## Call:
## glm(formula = y ~ x, family = poisson, data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.1320     0.1352  -8.370  < 2e-16 ***
## x             0.7071     0.1117   6.328 2.48e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 146.22  on 199  degrees of freedom
## Residual deviance: 104.61  on 198  degrees of freedom
## AIC: 272.61
## 
## Number of Fisher Scoring iterations: 5

Plot Hasil Prediksi

plot(data$x, data$y, pch = 16, col = "darkgray", main = "Data dan Hasil Prediksi")
newdata <- data.frame(x = seq(min(x), max(x), length.out = 100))
pred <- predict(poisson_model, newdata = newdata, type = "response")
lines(newdata$x, pred, col = "blue", lwd = 2)

Untuk mendeteksi overdispersion

dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 0.4917689

Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan. Tetapi karena nilai yang didapat < 1 maka overdispersion tidak mungkin terjadi

Diagnostik Model & Overdispersion

Asumsi Poisson

Asumsi Poisson (ekspektasi = variansi):

\[ \mathbb{E}(Y) = \text{Var}(Y) = \mu \]

# Model Poisson
poisson_model <- glm(score ~ course, data = data, family = poisson(link = "log"))

# Hitung nilai dispersi
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 5.475569

Penanganan Overdispersion

Statistik dispersi (cek overdispersion):

\[ \hat{\phi} = \frac{\sum_{i=1}^{n} r_i^2}{n - p} \]

poisson_q_model <- glm(score ~ course, data = data, family = quasipoisson(link = "log"))
summary(poisson_q_model)
## 
## Call:
## glm(formula = score ~ course, family = quasipoisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   4.1271     0.1123  36.743  3.3e-10 ***
## course        0.1724     0.1934   0.892    0.399    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasipoisson family taken to be 5.475572)
## 
##     Null deviance: 49.028  on 9  degrees of freedom
## Residual deviance: 44.760  on 8  degrees of freedom
## AIC: NA
## 
## Number of Fisher Scoring iterations: 4
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
nb_model <- glm.nb(score ~ course, data = data)
summary(nb_model)
## 
## Call:
## glm.nb(formula = score ~ course, data = data, init.theta = 17.8655369, 
##     link = log)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   4.1271     0.1015  40.665   <2e-16 ***
## course        0.1724     0.1830   0.942    0.346    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(17.8655) family taken to be 1)
## 
##     Null deviance: 11.094  on 9  degrees of freedom
## Residual deviance: 10.195  on 8  degrees of freedom
## AIC: 91.255
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  17.9 
##           Std. Err.:  10.3 
## 
##  2 x log-likelihood:  -85.255

Inferensi GLM

Ekspektasi dan Varians dalam GLM

Dalam GLM, ekspektasi dan varians sangat penting untuk membentuk inferensi statistik seperti estimasi parameter, uji hipotesis, dan interval kepercayaan.

Ekspektasi:

Jika distribusi respon termasuk keluarga eksponensial:

\[ f(y; \theta) = \exp\left\{ y\theta - b(\theta) + c(y) \right\} \] Maka: \[ \mathbb{E}(Y) = \mu = b'(\theta) \]

Varians:

Turunan kedua dari log-likelihood: \[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) \]

Contoh:

  • Poisson: \[ V(\mu) = \mu \]
  • Binomial: \[ V(\mu) = \mu(1 - \mu) \]

Penaksiran Parameter dengan MLE

Parameter dalam GLM diestimasi dengan Maximum Likelihood Estimation (MLE). Karena bentuk likelihood sering kompleks, digunakan metode numerik seperti Newton-Raphson atau Fisher Scoring.

Langkah Newton-Raphson: 1. Score Function: \[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} \] 2. Hessian (turunan kedua): \[ H(\beta) = \frac{\partial^2 \ell(\beta)}{\partial \beta^2} \] 3. Iterasi: \[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \] Metode Fisher Scoring menggantikan Hessian dengan informasi Fisher \(I(\beta)\).

Diagnostik Model GLM

Diagnostik digunakan untuk mengevaluasi apakah model sudah tepat. • Uji formal • Grafik antara nilai prediksi vs nilai aktual

Deviance

Statistik Devian: • Mengukur apakah ada model lain yang lebih baik. • Nilai devians besar → model tidak cocok. • Devians adalah: \[ D = 2 \sum_{i=1}^n \left[ y_i \log\left(\frac{y_i}{\hat{\mu}_i}\right) - (y_i - \hat{\mu}_i) \right] \] Deviance mengukur seberapa jauh model dari saturated model:

Chi-Square Pearson

Menguji apakah model lebih baik daripada tidak ada model sama sekali

\[ X^2 = \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \]

Jika terlalu besar, artinya model tidak cocok.

Analisis Residual

• Residual adalah selisih antara observasi dengan prediksi. • Dapat digunakan untuk memeriksa penyimpangan sistematis. • Dapat diplot untuk menilai asumsi model.

Inferensi Regresi Logistik

Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.

Fungsi Logistik

Fungsi logistik (sigmoid) dalam model regresi logistik:

\[ \pi(x) = \frac{e^{\beta_0 + \beta_1 x}}{1 + e^{\beta_0 + \beta_1 x}} \]

Fungsi Log-Likelihood

Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.

Log-likelihood dari model regresi logistik adalah: \[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]

Uji Wald

Uji Wald digunakan untuk menguji apakah \(\beta_j\) berbeda signifikan dari nol: \[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \quad \Rightarrow \quad W = Z^2 \sim \chi^2_1 \] ### Kriteria AIC dan BIC

AIC(logit_model)
## [1] 15.73414
BIC(logit_model)
## [1] 16.33931

Detail Metode Estimasi dan Inferensi Regresi Poisson

Model regresi Poisson digunakan untuk memodelkan data count (jumlah kejadian) di mana variabel respons mengikuti distribusi Poisson. Estimasi dilakukan dengan Maximum Likelihood Estimation (MLE), dan inferensi dilakukan dengan uji Wald dan Likelihood Ratio Test.

Fungsi Distribusi Poisson

Distribusi Poisson untuk variabel acak \(Y_i\):

\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!}, \quad y_i = 0, 1, 2, \dots \] ### Model Regresi Poisson Model regresi Poisson menghubungkan ekspektasi \(\lambda_i\) dengan prediktor melalui fungsi link log: \[ \log(\lambda_i) = \eta_i = \beta_0 + \beta_1 x_i \] Transformasi baliknya: \[ \lambda_i = \exp(\beta_0 + \beta_1 x_i) \]

Fungsi Log-Likelihood

Log-likelihood untuk model regresi Poisson adalah: \[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \] ### Implementasi Model Poisson di R

# Data
course <- c(0,1,0,0,0,0,1,0,1,0)
score <- c(72,69,90,47,76,71,88,40,64,38)
data <- data.frame(course, score)

# Model Poisson
poisson_model <- glm(score ~ course, data = data, family = poisson())
summary(poisson_model)
## 
## Call:
## glm(formula = score ~ course, family = poisson(), data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.12713    0.04800  85.979   <2e-16 ***
## course       0.17242    0.08264   2.086   0.0369 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 49.028  on 9  degrees of freedom
## Residual deviance: 44.760  on 8  degrees of freedom
## AIC: 108.58
## 
## Number of Fisher Scoring iterations: 4

Uji Wald

beta_hat <- coef(poisson_model)["course"]
se_beta <- summary(poisson_model)$coefficients["course", "Std. Error"]
Z <- beta_hat / se_beta
wald_stat <- Z^2
pval <- 1 - pchisq(wald_stat, 1)
c(Wald = wald_stat, p_value = pval)
##    Wald.course p_value.course 
##     4.35307407     0.03694221

Uji Likelihood Ratio (LRT)

poisson_null <- glm(score ~ 1, data = data, family = poisson())
anova(poisson_null, poisson_model, test = "Chisq")

AIC dan BIC

AIC(poisson_model)
## [1] 108.5829
BIC(poisson_model)
## [1] 109.188

Studi Kasus (#1)

Generalized Linear Model (GLM) Kasus ini didasarkan pada tantangan nyata di industri keuangan, di mana sebuah perusahaan (seperti Home Credit) perlu meminimalkan kerugian akibat nasabah yang gagal bayar. Tujuannya adalah membangun model regresi logistik untuk memprediksi probabilitas seorang nasabah akan gagal bayar berdasarkan data historis mereka, seperti jumlah kredit, pendapatan, dan tingkat pendidikan. Kasus ini dipilih karena merupakan contoh klasik dari masalah klasifikasi biner (Gagal Bayar vs. Tidak Gagal Bayar) yang sangat cocok untuk dianalisis menggunakan regresi logistik, sebuah metode utama dalam Generalized Linear Model (GLM).

Sumber: https://www.kaggle.com/c/home-credit-default-risk/overview

Variabel Penelitian

Variabel Respons (Biner):

  1. status_gagal_bayar: Status gagal bayar nasabah (1: Ya, 0: Tidak).

Variabel Prediktor:

  1. pendapatan: Total pendapatan nasabah per tahun (Rasio).

Simulasi R

Dataset fiktif dengan 500 observasi akan dibuat untuk analisis ini. Hubungan antar variabel dibuat secara logis, di mana jumlah kredit yang lebih tinggi dan pendapatan yang lebih rendah diasumsikan meningkatkan risiko gagal bayar.

# Set seed untuk hasil yang konsisten
set.seed(123)

# Jumlah observasi
n <- 500

# Simulasi variabel prediktor
pendapatan <- round(runif(n, 40, 500)) # dalam jutaan

# Membuat model probabilitas (logit) hanya dengan pendapatan
# Asumsi: pendapatan lebih tinggi menurunkan risiko gagal bayar
log_odds <- 1.5 - 0.01 * pendapatan
probabilitas <- 1 / (1 + exp(-log_odds))

# Simulasi variabel respons biner (0 = Lancar, 1 = Gagal Bayar)
status_gagal_bayar <- rbinom(n, 1, probabilitas)

# Gabungkan menjadi sebuah data frame
df_kredit_sederhana <- data.frame(
  status_gagal_bayar = factor(status_gagal_bayar, levels = c(0, 1)),
  pendapatan
)

# Menampilkan 6 baris pertama data
head(df_kredit_sederhana)

Estimasi Model Regresi Logistik (Sederhana)

Fitting model regresi logistik sederhana

model_sederhana <- glm(status_gagal_bayar ~ pendapatan, 
                       data = df_kredit_sederhana, 
                       family = binomial())

Menampilkan ringkasan hasil model

summary(model_sederhana)
## 
## Call:
## glm(formula = status_gagal_bayar ~ pendapatan, family = binomial(), 
##     data = df_kredit_sederhana)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  1.613968   0.247683   6.516 7.21e-11 ***
## pendapatan  -0.009900   0.001034  -9.570  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 626.87  on 499  degrees of freedom
## Residual deviance: 498.96  on 498  degrees of freedom
## AIC: 502.96
## 
## Number of Fisher Scoring iterations: 5

Berdasarkan hasil model regresi logistik tersebut, variabel pendapatan terbukti memiliki pengaruh yang sangat signifikan secara statistik (p < 0.001) terhadap status gagal bayar. Koefisien negatif pada pendapatan (-0.0099) menunjukkan adanya hubungan terbalik, artinya semakin tinggi pendapatan seorang nasabah, semakin rendah kemungkinan ia akan mengalami gagal bayar. Secara spesifik, setiap kenaikan satu unit pada pendapatan akan mengurangi odds (peluang) untuk gagal bayar sekitar 0.99% (didapat dari exp(-0.0099)), dengan asumsi faktor lain konstan.

exp(coef(model_sederhana))
## (Intercept)  pendapatan 
##   5.0227010   0.9901492

Visualisasi Prediksi

library(ggplot2)

# Plot data observasi dan kurva prediksi dari model
ggplot(df_kredit_sederhana, aes(x = pendapatan, y = as.numeric(status_gagal_bayar) - 1)) +
  geom_point(alpha = 0.4, color = "gray50") +
  stat_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color="tomato") +
  labs(
    title = "Simulasi Regresi Logistik dengan Kurva Sigmoid",
    x = "Pendapatan Tahunan (Juta)",
    y = "Probabilitas Gagal Bayar"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Secara visual, kurva yang menurun dari kiri ke kanan ini mengonfirmasi kesimpulan dari model: semakin tinggi pendapatan tahunan seseorang, semakin rendah probabilitasnya untuk mengalami gagal bayar. Misalnya, untuk nasabah dengan pendapatan 100 juta, probabilitas gagal bayar diprediksi sekitar 60-70%, sedangkan untuk nasabah dengan pendapatan 400 juta, probabilitasnya sudah sangat mendekati nol.

Evaluasi Model

prob_prediksi <- predict(model_sederhana, type = "response")

# Ambil kembali data aktual dan pastikan memiliki label yang deskriptif
status_aktual <- factor(df_kredit_sederhana$status_gagal_bayar,
                        levels = c(0, 1),
                        labels = c("Lancar", "Gagal Bayar"))

# Buat kelas prediksi dengan label yang deskriptif, bukan hanya 0 dan 1
kelas_prediksi <- factor(ifelse(prob_prediksi > 0.5, "Gagal Bayar", "Lancar"),
                         levels = c("Lancar", "Gagal Bayar"))

# Membuat tabel confusion matrix dengan nama variabel yang jelas
table(Prediksi = kelas_prediksi, Aktual = status_aktual)
##              Aktual
## Prediksi      Lancar Gagal Bayar
##   Lancar         291          73
##   Gagal Bayar     49          87

True Negative (TN) = 291: Model berhasil memprediksi dengan benar sebanyak 291 nasabah yang statusnya Lancar. True Positive (TP) = 87: Model berhasil memprediksi dengan benar sebanyak 87 nasabah yang statusnya Gagal Bayar. False Positive (FP) = 49: Model membuat kesalahan dengan memprediksi 49 nasabah akan Gagal Bayar, padahal sebenarnya mereka Lancar. False Negative (FN) = 73: Model membuat kesalahan dengan memprediksi 73 nasabah akan Lancar, padahal sebenarnya mereka Gagal Bayar. Ini adalah jenis kesalahan yang paling merugikan bagi pemberi pinjaman.

Regresi Logistik dengan Prediktor Nominal, Ordinal, dan Rasio

Simulasi Data Pada sub-bab ini, kita akan melakukan simulasi data untuk memperlihatkan bagaimana estimator regresi logistik berperilaku ketika variabel prediktor kita terdiri dari jenis kelamin (nominal), tingkat pendidikan (ordinal), dan penghasilan bulanan (rasio). Simulasi bertujuan menciptakan dataset artifisial yang menyerupai kondisi nyata sehingga kita dapat menguji model dengan lebih fleksibel.

Rumus Logit Dasar Secara matematis, fungsi logit didefinisikan sebagai berikut:

\[ \text{logit}(p) = \log\frac{p}{1-p} = \beta_0 + \beta_1\,\text{Gender} + \beta_2\,\text{Education} + \beta_3\,\text{Income} \] Di mana: - \(p\) adalah probabilitas attrition (1 = keluar perusahaan) - \(\beta_0\) adalah intercept - \(\beta_1,\beta_2,\beta_3\) adalah koefisien untuk masing-masing prediktor

Syntax R untuk Simulasi

set.seed(2025)
n <- 200
# Simulasi prediktor
gender<- factor(sample(c("Male","Female"), n, replace = TRUE))
education<- factor(sample(1:5, n, replace = TRUE), ordered = TRUE)
income<- round(rnorm(n, mean=50, sd=10),1)  # ribuan

# Koefisien sesungguhnya
beta0 <- -1.5; beta1 <- 0.8; beta2 <- 0.3; beta3 <- -0.02

# Menghitung linear predictor dan probabilitas
teta <- beta0 + beta1*(gender=="Male") + beta2*as.numeric(education) + beta3*income
np   <- plogis(teta)

# Simulasi outcome
attrition <- rbinom(n, size=1, prob=np)
data_sim  <- data.frame(gender, education, income,attrition=factor
                        (attrition, labels=c("Stay","Leave")))
head(data_sim)

Penjelasan: kode di atas menghasilkan dataset data_sim berukuran 200 observasi, di mana setiap baris mencerminkan seorang karyawan dengan atribut gender, tingkat pendidikan, penghasilan, dan status attrition.

Eksplorasi Data

Pada tahap eksplorasi, kita meninjau distribusi masing-masing variabel dan hubungan awal dengan outcome.

summary(data_sim)
##     gender    education     income      attrition  
##  Female:105   1:39      Min.   :23.80   Stay :150  
##  Male  : 95   2:31      1st Qu.:43.05   Leave: 50  
##               3:46      Median :50.20              
##               4:51      Mean   :49.83              
##               5:33      3rd Qu.:55.30              
##                         Max.   :78.40
library(ggplot2)
ggplot(data_sim, aes(x=income, y=as.numeric(attrition)-1)) +
  geom_jitter(width=0, height=0.02) +
  labs(y="Attrition (0=Stay,1=Leave)", x="Income (ribuan)") +
  ggtitle("Sebaran Income vs Probabilitas Leave")

Penjelasan: fungsi summary() memberikan deskripsi ringkas (mean, median, min, max) untuk setiap variabel. Plot jitters membantu memvisualisasikan pola hubungan antara penghasilan dan kecenderungan attrition.

Perlakuan Variabel Ordinal

Variabel ordinal dapat diperlakukan sebagai nominal (dummy) ataupun sebagai numeric berperingkat. Berikut dua pendekatan tersebut.

Treat sebagai Nominal (Dummy)

Pada pendekatan ini, setiap tingkatan pendidikan diubah menjadi variabel dummy terpisah.

data_sim <- within(data_sim, {
  edu2 <- ifelse(education==2,1,0)
  edu3 <- ifelse(education==3,1,0)
  edu4 <- ifelse(education==4,1,0)
  edu5 <- ifelse(education==5,1,0)
})
model_dummy <- glm(attrition ~ gender + edu2 + edu3 + edu4 + edu5 + income,
                   data=data_sim, family=binomial())
summary(model_dummy)
## 
## Call:
## glm(formula = attrition ~ gender + edu2 + edu3 + edu4 + edu5 + 
##     income, family = binomial(), data = data_sim)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept) -1.49430    1.00597  -1.485  0.13743   
## genderMale   1.00816    0.35296   2.856  0.00429 **
## edu2        -0.60691    0.74738  -0.812  0.41677   
## edu3         0.21479    0.56146   0.383  0.70204   
## edu4         0.79706    0.52374   1.522  0.12804   
## edu5         1.11221    0.56190   1.979  0.04777 * 
## income      -0.01151    0.01835  -0.627  0.53036   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 224.93  on 199  degrees of freedom
## Residual deviance: 205.04  on 193  degrees of freedom
## AIC: 219.04
## 
## Number of Fisher Scoring iterations: 4

Penjelasan: dengan dummy, model tidak memaksakan asumsi linearitas efek pendidikan. Setiap level pendidikan dibandingkan langsung dengan baseline (level 1).

Treat sebagai Rasio (Numeric Rank)

Pada pendekatan ini, kita memanfaatkan urutan ordinal sebagai variabel numerik.

model_numeric <- glm(attrition ~ gender + as.numeric(education) + income,
                     data=data_sim, family=binomial())
summary(model_numeric)
## 
## Call:
## glm(formula = attrition ~ gender + as.numeric(education) + income, 
##     family = binomial(), data = data_sim)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)   
## (Intercept)           -2.10856    1.04651  -2.015  0.04392 * 
## genderMale             1.02422    0.34997   2.927  0.00343 **
## as.numeric(education)  0.35635    0.13284   2.682  0.00731 **
## income                -0.01378    0.01810  -0.761  0.44659   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 224.93  on 199  degrees of freedom
## Residual deviance: 207.06  on 196  degrees of freedom
## AIC: 215.06
## 
## Number of Fisher Scoring iterations: 4

Penjelasan: mengubah education menjadi numeric berperingkat menyiratkan asumsi bahwa setiap kenaikan satu level pendidikan memberikan efek logit yang konstan.

Pemilihan Model dan Perbandingan

Di akhir Bab, kita membandingkan kedua model berdasarkan AIC dan goodness-of-fit.

AIC(model_dummy, model_numeric)

Penjelasan: model dengan AIC lebih rendah lebih baik karena menyajikan keseimbangan terbaik antara kelengkapan dan kompleksitas.

Goodness-Of Fit Model

nullmod <- glm(attrition ~ 1, data = data_sim, family = binomial())
r2_nominal <- 1- (logLik(model_dummy)/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.08845354 (df=7)
## 
## $McFadden_R2_Numeric
## 'log Lik.' 0.07947002 (df=4)

Interpretasi: McFadden’s R² mengukur goodness-of-fit. Semakin besar nilainya, semakin baik model memprediksi dibandingkan model null.

Pemilihan Model Regresi Logistik dan Evaluasi

Pada bab ini, akan dibahas berbagai teknik dalam memilih model regresi logistik, serta cara melakukan evaluasi performa model. Struktur bab ini mengikuti dokumen aslinya: dari pendekatan konfirmatori hingga evaluasi akurasi klasifikasi

Contoh Kasus

Universitas seringkali ingin memprediksi status kelulusan mahasiswanya (tepat waktu atau tidak) berdasarkan berbagai faktor. Prediksi ini penting untuk intervensi dini bagi mahasiswa yang berisiko tidak lulus tepat waktu, serta untuk evaluasi program akademik dan layanan kemahasiswaan. Faktor-faktor yang mungkin berpengaruh bisa berasal dari aspek akademik (nilai IPK, jumlah SKS yang diambil per semester) maupun non-akademik (keaktifan organisasi).

Sumber: PREDIKSI KELULUSAN MAHASISWA UNIVERSITAS DIAN NUSWANTORO PADA TAHUN 2021 DENGAN METODE NAIVE BAYES CLASSIFIER https://repo.dinus.ac.id/handle/123456789/11239

# Membuat variabel prediktor
lulus = c(1, 0, 1, 0, 1, 0, 
            1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 
            1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
            0, 0, 1, 0, 1, 1, 0, 1, 0, 1,
            1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
            0, 0, 1, 0, 1, 1, 0, 1, 0, 1)
ipk = c(3.65, 2.10, 3.20, 2.75, 3.80, 2.50, 
          3.90, 1.80, 3.05, 3.40, 2.25, 2.00, 3.55, 2.60, 3.15, 3.75, 1.90, 
        3.30, 2.40, 2.95,3.50, 2.00, 3.10, 2.85, 3.70, 2.60, 3.85, 1.95, 
        3.00, 3.35,
          2.15, 2.05, 3.60, 2.65, 3.25, 3.80, 1.85, 3.35, 2.45, 3.00,
          3.45, 2.20, 3.15, 2.90, 3.75, 2.55, 3.90, 1.75, 3.05, 3.40,
          2.30, 2.10, 3.50, 2.70, 3.20, 3.70, 1.90, 3.25, 2.50, 2.90)
aktif_org = c(1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0)
sks = c(21, 18, 22, 19, 24, 17, 
          23, 16, 20, 22, 18, 17, 24, 19, 21, 23, 16, 22, 18, 20, 
          22, 19, 21, 20, 23, 18, 24, 17, 20, 22,
          18, 17, 23, 19, 21, 24, 16, 22, 18, 20,
          22, 19, 21, 20, 23, 18, 24, 17, 20, 22,
          18, 17, 23, 19, 21, 24, 16, 22, 18, 20)
df_kelulusan <- data.frame(
  lulus = c(1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1),
  ipk = c(3.65, 2.10, 3.20, 2.75, 3.80, 2.50, 3.90, 1.80, 3.05, 3.40, 2.25, 2.00, 3.55, 2.60, 3.15, 3.75, 1.90, 3.30, 2.40, 2.95, 3.50, 2.00, 3.10, 2.85, 3.70, 2.60, 3.85, 1.95, 3.00, 3.35, 2.15, 2.05, 3.60, 2.65, 3.25, 3.80, 1.85, 3.35, 2.45, 3.00,3.45, 2.20, 3.15, 2.90, 3.75, 2.55, 3.90, 1.75, 3.05, 3.40, 2.30, 2.10, 3.50, 2.70, 3.20, 3.70, 1.90, 3.25, 2.50, 2.90), 
  aktif_org = c(1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0),
  sks = c(21, 18, 22, 19, 24, 17, 
          23, 16, 20, 22, 18, 17, 24, 19, 21, 23, 16, 22, 18, 20, 
          22, 19, 21, 20, 23, 18, 24, 17, 20, 22,
          18, 17, 23, 19, 21, 24, 16, 22, 18, 20,
          22, 19, 21, 20, 23, 18, 24, 17, 20, 22,
          18, 17, 23, 19, 21, 24, 16, 22, 18, 20)
)
# Membuat linear predictor (log-odds) untuk kelulusan
# Koefisien ini hanya contoh untuk menghasilkan data yang masuk akal
# Misal: IPK tinggi & SKS cukup meningkatkan peluang, keaktifan organisasi sedikit meningkatkan
lin_pred <- -3 + (1.8 * ipk) + (0.05 * sks) + (0.4 * aktif_org)

# Mengubah log-odds menjadi probabilitas
p_lulus <- 1/(1 + exp(-lin_pred))

# Membuat variabel respons biner (0 = Tidak Lulus Tepat Waktu, 1 = Lulus Tepat Waktu)
lulus <- rbinom(nrow(df_kelulusan), 1, p_lulus)
df_kelulusan
# Menampilkan 6 baris pertama dari data frame
head(df_kelulusan)

Pendekatan Konfirmatori

Pendekatan konfirmatori digunakan ketika kita memiliki hipotesis atau teori yang jelas mengenai variabel-variabel prediktor yang akan dimasukkan dalam model. Biasanya, peneliti membangun model penuh berdasarkan referensi teori, lalu menguji signifikansi tiap efek melalui Likelihood Ratio Test.

  • Pemilihan model
full_model <- glm(lulus ~ ipk + sks + aktif_org,
                  data = df_kelulusan,
                  family = binomial())
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(full_model)
## 
## Call:
## glm(formula = lulus ~ ipk + sks + aktif_org, family = binomial(), 
##     data = df_kelulusan)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -372.34  356297.97  -0.001    0.999
## ipk            394.07  229654.16   0.002    0.999
## sks            -38.52   38619.29  -0.001    0.999
## aktif_org      -15.08   81560.36   0.000    1.000
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 82.5767  on 59  degrees of freedom
## Residual deviance:  2.7726  on 56  degrees of freedom
## AIC: 10.773
## 
## Number of Fisher Scoring iterations: 25

Pendekatan Eksploratori

Pendekatan eksploratori memungkinkan kita menemukan kombinasi prediktor terbaik ketika belum ada teori yang pasti. Pemilihan variabel biasanya dilakukan berdasarkan kriteria statistik (seperti AIC). Metode yang sering digunakan adalah stepwise selection (forward, backward, atau keduanya).

Jika belum yakin variabel mana yang paling relevan, gunakan stepwise selection berbasis AIC.

library(MASS)

# Model kosong (intercept saja)
null_model <- glm(lulus ~ 1, data = df_kelulusan, family = binomial())

# Model penuh dengan semua prediktor
full_model <- glm(lulus ~ ipk + sks + aktif_org,
                  data = df_kelulusan, family = binomial())
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# 1) Forward Selection
model_forward <- stepAIC(null_model, scope = list(lower = null_model, upper = full_model), direction = "forward", trace = FALSE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# 2) Backward Selection
model_backward <- stepAIC(full_model, direction = "backward", trace = FALSE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# 3) Stepwise Selection Kedua Arah
model_stepwise <- stepAIC(null_model,
                          scope = list(lower = null_model, upper=full_model),
                          direction = "both", trace = FALSE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Ringkasan model terpilih (misal model_stepwise)
summary(model_stepwise)
## 
## Call:
## glm(formula = lulus ~ ipk, family = binomial(), data = df_kelulusan)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  -1122.0   394975.2  -0.003    0.998
## ipk            386.9   136198.3   0.003    0.998
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 82.5767  on 59  degrees of freedom
## Residual deviance:  2.7726  on 58  degrees of freedom
## AIC: 6.7726
## 
## Number of Fisher Scoring iterations: 25

AIC model ini adalah 68.014, yang merupakan ukuran kualitas model yang digunakan oleh stepAIC untuk memilih model terbaik dengan menyeimbangkan kecocokan data dan kompleksitas model.

Evaluasi Model: ROC dan AUC

Setelah memperoleh model terpilih (misal model_stepwise), hitung probabilitas prediksi dan plot kurva ROC.

library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
# Prediksi probabilitas
df_kelulusan$pred_prob <- predict(model_stepwise, type = "response")

# Konversi ke faktor dengan level yang benar JIKA belum
df_kelulusan$lulus <- factor(df_kelulusan$lulus, 
                             levels = c(0, 1), 
                             labels = c("Tidak", "Ya"))
roc_obj <- roc(df_kelulusan$lulus, df_kelulusan$pred_prob, quiet = TRUE) 

ggroc(roc_obj, size = 1) +
  labs(title = "ROC Curve: Prediksi Kelulusan Tepat Waktu",
       x = "False Positive Rate (1 - Spesifisitas)",
       y = "True Positive Rate (Sensitivitas)") +
  theme_minimal()

# Nilai AUC
auc(roc_obj)
## Area under the curve: 0.9994

Catatan: AUC mendekati 1 berarti model memiliki kemampuan diskriminasi baik.

Pseudo R-Squared

Hitung ukuran Pseudo R-squared untuk model terpilih.

library(DescTools)
PseudoR2(model_stepwise, which = "all")
##        McFadden     McFaddenAdj        CoxSnell      Nagelkerke   AldrichNelson 
##       0.9664241       0.9179842       0.7355407       0.9840230       0.5708279 
## VeallZimmermann           Efron McKelveyZavoina            Tjur             AIC 
##       0.9855901       0.9663300       0.9999465       0.9663300       6.7725887 
##             BIC          logLik         logLik0              G2 
##      10.9612779      -1.3862944     -41.2883288      79.8040689

Interpretasi: McFadden R² > 0.2 bisa dianggap kecocokan yang baik pada regresi logistik.

Tabel Klasifikasi (Confusion Matrix)

Buat confusion matrix dengan threshold 0.5. Hitung akurasi, sensitivitas, dan spesifisitas.

library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
## 
## Attaching package: 'lattice'
## The following object is masked from 'package:gnm':
## 
##     barley
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
# Prediksi probabilitas dan kelas dengan threshold 0.5
pred_prob <- predict(model_stepwise, type = "response")
pred_class <- ifelse(pred_prob >= 0.5, "Ya", "Tidak")

# Simpan hasil prediksi kelas ke data frame utama
df_kelulusan$pred_class <- pred_class

# Confusion matrix aman dengan level konsisten
conf_matrix <- confusionMatrix(
  factor(df_kelulusan$pred_class, levels = c("Tidak", "Ya")),
  factor(df_kelulusan$lulus, levels = c("Tidak", "Ya")),
  positive = "Ya")
conf_matrix
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak    27  1
##      Ya        0 32
##                                           
##                Accuracy : 0.9833          
##                  95% CI : (0.9106, 0.9996)
##     No Information Rate : 0.55            
##     P-Value [Acc > NIR] : 1.323e-14       
##                                           
##                   Kappa : 0.9664          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9697          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.9643          
##              Prevalence : 0.5500          
##          Detection Rate : 0.5333          
##    Detection Prevalence : 0.5333          
##       Balanced Accuracy : 0.9848          
##                                           
##        'Positive' Class : Ya              
## 

Perbandingan Model

Bandingkan dua model, misalnya model_forward vs model_stepwise, menggunakan AIC, Likelihood Ratio Test, dan Pseudo R-squared.

# Bandingkan AIC
data.frame(
  Model = c("Forward", "Stepwise"),
  AIC   = c(AIC(model_forward), AIC(model_stepwise))
)
# Contoh Likelihood Ratio Test: bandingkan model tanpa aktif_org vs model dengan aktif_org
model_no_org <- glm(lulus ~ ipk + sks,
                    data = df_kelulusan, family = binomial())
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
model_with_org <- glm(lulus ~ ipk + sks + aktif_org,
                      data = df_kelulusan, family = binomial())
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
aov_lr <- anova(model_no_org, model_with_org, test = "Chisq")
aov_lr
# Pseudo R2
r2_no_org <- PseudoR2(model_no_org, which = "McFadden")
r2_with_org <- PseudoR2(model_with_org, which = "McFadden")

Interpretasi: Model dengan penurunan AIC signifikan atau peningkatan Pseudo R² mendukung penambahan variabel.

Prinsip Parsimony

Jika perbedaan AIC < 2 atau Δ Deviance tidak signifikan (p-value > α), pilih model yang lebih sederhana.

# Contoh: AIC(model_no_org) vs AIC(model_with_org)
data.frame(
  Model = c("Tanpa_Aktif","Dengan_Aktif"),
  AIC   = c(AIC(model_no_org), AIC(model_with_org)))

Catatan: Jika selisih AIC kurang dari 2, kedua model dianggap sebanding. Interpretasi: Karena selisih AIC kurang dari 2 maka kedua model dianggap sebanding

Evaluasi Lengkap dengan caret

Gunakan paket caret untuk mendapatkan confusion matrix lengkap beserta precision, recall, dan F1-score.

cm_obj <- confusionMatrix(
  factor(df_kelulusan$pred_class, levels = c("Tidak","Ya")),
  df_kelulusan$lulus,
  positive = "Ya")
cm_obj
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak    27  1
##      Ya        0 32
##                                           
##                Accuracy : 0.9833          
##                  95% CI : (0.9106, 0.9996)
##     No Information Rate : 0.55            
##     P-Value [Acc > NIR] : 1.323e-14       
##                                           
##                   Kappa : 0.9664          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9697          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.9643          
##              Prevalence : 0.5500          
##          Detection Rate : 0.5333          
##    Detection Prevalence : 0.5333          
##       Balanced Accuracy : 0.9848          
##                                           
##        'Positive' Class : Ya              
## 

Distribusi Multinomial

Distribusi multinomial adalah perluasan dari distribusi binomial ketika sebuah percobaan acak menghasilkan lebih dari dua kemungkinan outcome (kategori) yang saling lepas (mutually exclusive). Jika sebuah percobaan diulang sebanyak \(n\) kali secara independen, dan setiap percobaan dapat menghasilkan salah satu dari \(k\) kategori dengan probabilitas konstan \(p_1, p_2, \ldots, p_k\) (di mana \(\sum_{i=1}^{k} p_i = 1\)), maka distribusi probabilitas dari jumlah kejadian \(x_1, x_2, \ldots, x_k\) untuk masing-masing kategori adalah distribusi multinomial.

Fungsi massa probabilitasnya adalah: \[P(X_1=x_1, X_2=x_2, \ldots, X_k=x_k) = \frac{n!}{x_1!x_2!\ldots x_k!} p_1^{x_1} p_2^{x_2} \ldots p_k^{x_k}\] Dengan \(\sum_{i=1}^{k} x_i = n\) dan \(\sum_{i=1}^{k} p_i = 1\).

Contoh Kasus

Banyak penelitian di bidang transportasi yang bertujuan untuk memahami faktor-faktor yang mempengaruhi pilihan moda transportasi seseorang untuk bepergian ke tempat kerja. Pilihan moda ini bisa beragam, seperti mobil pribadi, sepeda motor, angkutan umum (bus, kereta), bersepeda, atau berjalan kaki. Ini adalah variabel respon kategorik dengan lebih dari dua pilihan yang tidak memiliki urutan intrinsik (nominal).

Misalkan dari survei pendahuluan di sebuah perusahaan kecil dengan 10 karyawan, diketahui probabilitas pemilihan moda transportasi utama untuk ke kantor adalah sebagai berikut: * Mobil Pribadi (\(p_M\)): 0.4 * Motor Pribadi (\(p_R\)): 0.3 * Angkutan Umum (\(p_A\)): 0.3

Sumber: ANALISIS PEMILIHAN MODA DENGAN MODEL MULTINOMIAL LOGIT UNTUK PERJALANAN KERJA DARI KOTA TANGERANG SELATAN-DKI JAKARTA https://e-jurnal.pnl.ac.id/portal/article/view/972

# Data untuk contoh distribusi multinomial
n_karyawan <- 10
jumlah_pilihan <- c(Mobil_Pribadi = 3, Motor_Pribadi = 5, Angkutan_Umum = 2) # x1, x2, x3
prob_pilihan <- c(Mobil_Pribadi = 0.3, Motor_Pribadi = 0.5, Angkutan_Umum = 0.2) # p1, p2, p3

# Hitung koefisien multinomial
koefisien_multinomial <- factorial(n_karyawan) / prod(factorial(jumlah_pilihan))

# Hitung peluang
peluang_kombinasi <- koefisien_multinomial * prod(prob_pilihan^jumlah_pilihan)

print(paste("Koefisien Multinomial:", koefisien_multinomial))
## [1] "Koefisien Multinomial: 2520"
print(paste("Peluang Kombinasi Pilihan:", round(peluang_kombinasi, 5)))
## [1] "Peluang Kombinasi Pilihan: 0.08505"
# Menggunakan fungsi dmultinom()
# Urutan probabilitas di dmultinom harus sesuai dengan urutan x
peluang_dmultinom <- dmultinom(x = jumlah_pilihan, size = n_karyawan, prob = prob_pilihan)
print(paste("Peluang Kombinasi Pilihan (dmultinom):", round(peluang_dmultinom, 5)))
## [1] "Peluang Kombinasi Pilihan (dmultinom): 0.08505"

Probabilitas bahwa 3 orang memilih mobil pribadi, 5 orang memilih motor pribadi, dan 2 orang memilih transportasi umum adalah 0.08505

Regresi Logistik Multinomial

Regresi logistik multinomial digunakan ketika variabel dependen (respon) bersifat kategorik nominal dengan lebih dari dua kategori, dan kita ingin memodelkan bagaimana variabel independen (prediktor) mempengaruhi probabilitas pilihan kategori tersebut. Model ini sering disebut juga sebagai polytomous logistic regression.

Model Logit Kategori Acuan (Baseline-Category Logit Model)

Model yang paling umum digunakan adalah baseline-category logit model. Dalam model ini, satu kategori dari variabel respon dipilih sebagai kategori acuan (baseline atau referensi). Kemudian, model membandingkan log-odds dari setiap kategori lain terhadap kategori acuan tersebut.

Jika variabel respon \(Y\) memiliki \(k\) kategori, dan kategori \(k\) (atau kategori lain yang ditentukan) dipilih sebagai acuan, maka ada \(k-1\) model logit simultan yang diestimasi. Untuk kategori \(j\) (\(j=1, \ldots, k-1\)), modelnya adalah: \[ \log\left(\frac{P(Y=j | \mathbf{X})}{P(Y=k | \mathbf{X})}\right) = \alpha_j + \beta_{j1}X_1 + \beta_{j2}X_2 + \ldots + \beta_{jp}X_p = \mathbf{X}\boldsymbol{\beta}_j \] Di mana:

\(P(Y=j | \mathbf{X})\) adalah probabilitas observasi jatuh pada kategori \(j\) diberikan vektor prediktor \(\mathbf{X}\). \(P(Y=k | \mathbf{X})\) adalah probabilitas observasi jatuh pada kategori acuan \(k\). \(\alpha_j\) adalah intercept untuk logit ke-\(j\). \(\beta_{j1}, \ldots, \beta_{jp}\) adalah koefisien regresi untuk prediktor \(X_1, \ldots, X_p\) pada logit ke-\(j\). Setiap logit (\(j\)) memiliki set koefisien \(\boldsymbol{\beta}_j\) sendiri. Probabilitas untuk setiap kategori \(j\) dapat dihitung sebagai: \[ P(Y=j | \mathbf{X}) = \frac{\exp(\mathbf{X}\boldsymbol{\beta}j)}{1 + \sum{m=1}^{k-1} \exp(\mathbf{X}\boldsymbol{\beta}m)} \quad \text{untuk } j=1, \ldots, k-1 \] Dan untuk kategori acuan \(k\): \[ P(Y=k | \mathbf{X}) = \frac{1}{1 + \sum{m=1}^{k-1} \exp(\mathbf{X}\boldsymbol{\beta}_m)} \] (Catatan: \(\mathbf{X}\boldsymbol{\beta}_k\) secara implisit adalah 0 karena kategori \(k\) adalah acuan, sehingga \(\exp(0)=1\) di penyebut jika kita memasukkannya dalam bentuk umum).

Estimasi Parameter

Parameter model (koefisien \(\alpha_j\) dan \(\beta_{jp}\)) biasanya diestimasi menggunakan metode Maximum Likelihood Estimation (MLE). Fungsi log-likelihood untuk \(N\) observasi independen adalah: \[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{N} \sum_{j=1}^{k} I(y_i=j) \log(P(Y_i=j | \mathbf{X}_i)) \] Di mana \(I(y_i=j)\) adalah fungsi indikator yang bernilai 1 jika observasi ke-\(i\) jatuh pada kategori \(j\), dan 0 sebaliknya. Estimasi dilakukan dengan algoritma iteratif seperti Newton-Raphson

Simulasi Data

Kita akan menggunakan data manual 50 responden yang telah dibuat sebelumnya mengenai pilihan moda transportasi utama mereka untuk perjalanan sehari-hari (komuting). Tujuannya adalah untuk memahami bagaimana usia, pendapatan, jarak, kepemilikan kendaraan, dan persepsi kualitas angkutan umum mempengaruhi pilihan moda transportasi.

Variabel Respon: Moda_Transportasi_Utama (Mobil Pribadi, Motor Pribadi, Angkutan Umum, Sepeda, Jalan Kaki). Variabel Prediktor:

  1. Usia_Penglaju (Numerik)
  2. Pendapatan_Bulanan_Juta (Numerik)
  3. Jarak_Tujuan_Km (Numerik)
  4. Kepemilikan_Kendaraan (Kategorik: Tidak Punya, Motor, Mobil)
  5. Kualitas_Angkutan_Umum (Kategorik: Buruk, Sedang, Baik)
# Data Frame Manual 50 Baris (dari respons sebelumnya)
Moda_Transportasi_Utama_vec <- c(
  "Mobil_Pribadi", "Motor_Pribadi", "Angkutan_Umum", "Motor_Pribadi", "Mobil_Pribadi",
  "Jalan_Kaki", "Sepeda", "Angkutan_Umum", "Motor_Pribadi", "Mobil_Pribadi",
  "Motor_Pribadi", "Angkutan_Umum", "Mobil_Pribadi", "Sepeda", "Jalan_Kaki",
  "Mobil_Pribadi", "Motor_Pribadi", "Angkutan_Umum", "Motor_Pribadi", "Mobil_Pribadi",
  "Angkutan_Umum", "Motor_Pribadi", "Mobil_Pribadi", "Motor_Pribadi", "Angkutan_Umum",
  "Mobil_Pribadi", "Jalan_Kaki", "Sepeda", "Motor_Pribadi", "Mobil_Pribadi",
  "Angkutan_Umum", "Mobil_Pribadi", "Motor_Pribadi", "Sepeda", "Angkutan_Umum",
  "Motor_Pribadi", "Mobil_Pribadi", "Jalan_Kaki", "Angkutan_Umum", "Motor_Pribadi",
  "Mobil_Pribadi", "Angkutan_Umum", "Motor_Pribadi", "Mobil_Pribadi", "Sepeda",
  "Jalan_Kaki", "Motor_Pribadi", "Angkutan_Umum", "Mobil_Pribadi", "Motor_Pribadi"
)
Usia_Penglaju_vec <- c(
  35, 22, 45, 28, 50, 20, 25, 55, 30, 40, 23, 48, 38, 26, 19, 52, 29, 42, 31, 46,
  24, 33, 41, 27, 58, 36, 21, 24, 32, 49, 53, 39, 25, 28, 47, 34, 43, 20, 51, 29,
  44, 56, 30, 37, 22, 18, 26, 40, 45, 23
)
Pendapatan_Bulanan_Juta_vec <- c(
  15.0, 5.5, 12.0, 6.0, 25.0, 3.0, 4.5, 9.0, 7.0, 18.0, 4.0, 10.0, 20.0, 5.0, 2.5,
  22.0, 6.5, 11.0, 7.5, 19.0, 3.5, 8.0, 16.0, 5.8, 8.5, 17.0, 2.8, 4.0, 7.2, 20.0,
  10.5, 21.0, 6.2, 4.8, 13.0, 8.8, 18.5, 3.2, 23.0, 6.8, 14.0, 9.5, 7.8, 16.5, 5.2,
  2.2, 4.2, 11.5, 19.5, 5.0
)
Jarak_Tujuan_Km_vec <- c(
  20, 8, 15, 10, 25, 2, 3, 12, 9, 18, 7, 14, 22, 4, 1, 28, 11, 16, 10, 20,
  13, 6, 19, 8, 10, 23, 1.5, 2.5, 9, 17, 11, 24, 7, 3.5, 14, 12, 19, 2.2, 26, 8.5,
  21, 13, 9.5, 18, 4.5, 1.2, 3.2, 15, 22, 7.5
)
Kepemilikan_Kendaraan_vec <- c(
  "Mobil", "Motor", "Tidak_Punya", "Motor", "Mobil", "Tidak_Punya", "Tidak_Punya", "Tidak_Punya", "Motor", "Mobil",
  "Motor", "Tidak_Punya", "Mobil", "Tidak_Punya", "Tidak_Punya", "Mobil", "Motor", "Tidak_Punya", "Motor", "Mobil",
  "Tidak_Punya", "Motor", "Mobil", "Motor", "Tidak_Punya", "Mobil", "Tidak_Punya", "Tidak_Punya", "Motor", "Mobil",
  "Tidak_Punya", "Mobil", "Motor", "Tidak_Punya", "Tidak_Punya", "Motor", "Mobil", "Tidak_Punya", "Tidak_Punya", "Motor",
  "Mobil", "Tidak_Punya", "Motor", "Mobil", "Tidak_Punya", "Tidak_Punya", "Motor", "Tidak_Punya", "Mobil", "Motor"
)
Kualitas_Angkutan_Umum_vec <- c(
  "Sedang", "Buruk", "Baik", "Sedang", "Buruk", "Baik", "Sedang", "Baik", "Sedang", "Buruk",
  "Buruk", "Baik", "Sedang", "Sedang", "Baik", "Buruk", "Sedang", "Baik", "Buruk", "Sedang",
  "Baik", "Sedang", "Buruk", "Sedang", "Baik", "Sedang", "Baik", "Sedang", "Buruk", "Sedang",
  "Baik", "Buruk", "Sedang", "Baik", "Baik", "Sedang", "Buruk", "Baik", "Baik", "Sedang",
  "Buruk", "Baik", "Sedang", "Sedang", "Baik", "Baik", "Sedang", "Baik", "Buruk", "Sedang"
)

data_moda_transportasi_manual <- data.frame(
  Moda_Transportasi_Utama = factor(Moda_Transportasi_Utama_vec, levels = c("Mobil_Pribadi", "Motor_Pribadi", "Angkutan_Umum", "Sepeda", "Jalan_Kaki")),
  Usia_Penglaju = Usia_Penglaju_vec,
  Pendapatan_Bulanan_Juta = Pendapatan_Bulanan_Juta_vec,
  Jarak_Tujuan_Km = Jarak_Tujuan_Km_vec,
  Kepemilikan_Kendaraan = factor(Kepemilikan_Kendaraan_vec, levels = c("Tidak_Punya", "Motor", "Mobil")),
  Kualitas_Angkutan_Umum = factor(Kualitas_Angkutan_Umum_vec, levels = c("Buruk", "Sedang", "Baik"))
)

# Menetapkan kategori baseline untuk variabel respon
data_moda_transportasi_manual$Moda_Transportasi_Utama <- relevel(data_moda_transportasi_manual$Moda_Transportasi_Utama, ref = "Mobil_Pribadi")

# Menampilkan beberapa baris pertama dari data yang akan digunakan untuk model
head(data_moda_transportasi_manual)
summary(data_moda_transportasi_manual$Moda_Transportasi_Utama)
## Mobil_Pribadi Motor_Pribadi Angkutan_Umum        Sepeda    Jalan_Kaki 
##            14            15            11             5             5
# Membuat data frame baru dengan dummy variables untuk prediktor kategorik
data_moda_numeric <- data_moda_transportasi_manual

# Dummy untuk Kepemilikan_Kendaraan (Tidak_Punya sebagai baseline)
data_moda_numeric$Kep_Motor <- ifelse(data_moda_numeric$Kepemilikan_Kendaraan == "Motor", 1, 0)
data_moda_numeric$Kep_Mobil <- ifelse(data_moda_numeric$Kepemilikan_Kendaraan == "Mobil", 1, 0)

# Dummy untuk Kualitas_Angkutan_Umum (Buruk sebagai baseline)
data_moda_numeric$KU_Sedang <- ifelse(data_moda_numeric$Kualitas_Angkutan_Umum == "Sedang", 1, 0)
data_moda_numeric$KU_Baik <- ifelse(data_moda_numeric$Kualitas_Angkutan_Umum == "Baik", 1, 0)

# Menampilkan data dengan variabel numerik (dummy)
# Kita akan menggunakan variabel faktor asli untuk multinom agar lebih ringkas,
# tapi ini menunjukkan bagaimana data bisa diubah menjadi angka.
# Hapus kolom faktor asli jika hanya ingin menggunakan dummy
head(data_moda_numeric[, c("Moda_Transportasi_Utama", "Usia_Penglaju", "Pendapatan_Bulanan_Juta", "Jarak_Tujuan_Km", "Kep_Motor", "Kep_Mobil", "KU_Sedang", "KU_Baik")])

Estimasi Model Regresi Logistik Multinomial

# install.packages("nnet") # Jalankan jika belum terinstal
library(nnet)

# Model dengan variabel faktor asli (multinom akan membuat dummy secara internal)
# Menggunakan semua prediktor
model_multinom_moda <- multinom(Moda_Transportasi_Utama ~ Usia_Penglaju + Pendapatan_Bulanan_Juta + Jarak_Tujuan_Km + Kepemilikan_Kendaraan + Kualitas_Angkutan_Umum,
                               data = data_moda_transportasi_manual,
                               MaxNWts = 2000) # Tingkatkan MaxNWts jika perlu
## # weights:  45 (32 variable)
## initial  value 80.471896 
## iter  10 value 26.317631
## iter  20 value 2.269393
## iter  30 value 0.077241
## iter  40 value 0.000523
## final  value 0.000058 
## converged
# Ringkasan model
summary_model <- summary(model_multinom_moda)
print(summary_model)
## Call:
## multinom(formula = Moda_Transportasi_Utama ~ Usia_Penglaju + 
##     Pendapatan_Bulanan_Juta + Jarak_Tujuan_Km + Kepemilikan_Kendaraan + 
##     Kualitas_Angkutan_Umum, data = data_moda_transportasi_manual, 
##     MaxNWts = 2000)
## 
## Coefficients:
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi   -11.82503     0.1798537               0.6623812       -1.807081
## Angkutan_Umum  -121.91393     2.4072264             -10.9903106       13.578577
## Sepeda           32.99087     0.1874685               0.8941305       -1.840063
## Jalan_Kaki      127.89417    -3.5812263             -16.1220986        2.698441
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                   75.40476                  -14.88436
## Angkutan_Umum                  -21.31150                 -152.37738
## Sepeda                         -23.79960                 -105.31173
## Jalan_Kaki                      24.77108                   69.66245
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                   -33.551972                   18.20555
## Angkutan_Umum                   -12.775763                   42.83597
## Sepeda                           -4.666851                   30.16421
## Jalan_Kaki                        1.363390                   75.89836
## 
## Std. Errors:
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi   2882.2649      6484.012               20898.942       12987.016
## Angkutan_Umum    453.3774      2137.969                4610.767        5128.314
## Sepeda           542.9437      2448.889                5639.686        8770.390
## Jalan_Kaki       308.0942      2497.730                8488.608        5327.581
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                2882.265455               6.043134e-04
## Angkutan_Umum                   6.544318               2.062167e+02
## Sepeda                       3925.790082               2.759120e-22
## Jalan_Kaki                   4609.080093               1.137738e-36
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                  2882.199103               3.546328e-12
## Angkutan_Umum                     6.544318               5.309948e+02
## Sepeda                         3926.977114               4.348008e+03
## Jalan_Kaki                     4609.114479               4.672678e+03
## 
## Residual Deviance: 0.0001164789 
## AIC: 64.00012

Nilai P-Value dan Interpretasi Koefisien

Koefisien dalam model regresi logistik multinomial diinterpretasikan sebagai perubahan log-odds untuk setiap kategori respon relatif terhadap kategori acuan (di sini “Mobil_Pribadi”), untuk setiap satu unit perubahan pada variabel prediktor.

# Menghitung z-scores dan p-values
koefisien <- summary_model$coefficients
std_errors <- summary_model$standard.errors

z_scores <- koefisien / std_errors
p_values <- 2 * (1 - pnorm(abs(z_scores)))

cat("\nKoefisien Model:\n")
## 
## Koefisien Model:
print(round(koefisien, 3))
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi     -11.825         0.180                   0.662          -1.807
## Angkutan_Umum    -121.914         2.407                 -10.990          13.579
## Sepeda             32.991         0.187                   0.894          -1.840
## Jalan_Kaki        127.894        -3.581                 -16.122           2.698
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                     75.405                    -14.884
## Angkutan_Umum                    -21.311                   -152.377
## Sepeda                           -23.800                   -105.312
## Jalan_Kaki                        24.771                     69.662
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                      -33.552                     18.206
## Angkutan_Umum                      -12.776                     42.836
## Sepeda                              -4.667                     30.164
## Jalan_Kaki                           1.363                     75.898
cat("\nStandard Errors:\n")
## 
## Standard Errors:
print(round(std_errors, 3))
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi    2882.265      6484.012               20898.942       12987.016
## Angkutan_Umum     453.377      2137.969                4610.767        5128.314
## Sepeda            542.944      2448.889                5639.686        8770.390
## Jalan_Kaki        308.094      2497.730                8488.608        5327.581
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                   2882.265                      0.001
## Angkutan_Umum                      6.544                    206.217
## Sepeda                          3925.790                      0.000
## Jalan_Kaki                      4609.080                      0.000
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                     2882.199                      0.000
## Angkutan_Umum                        6.544                    530.995
## Sepeda                            3926.977                   4348.008
## Jalan_Kaki                        4609.114                   4672.678
cat("\nZ-scores:\n")
## 
## Z-scores:
print(round(z_scores, 3))
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi      -0.004         0.000                   0.000           0.000
## Angkutan_Umum      -0.269         0.001                  -0.002           0.003
## Sepeda              0.061         0.000                   0.000           0.000
## Jalan_Kaki          0.415        -0.001                  -0.002           0.001
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                      0.026              -2.463020e+04
## Angkutan_Umum                     -3.256              -7.390000e-01
## Sepeda                            -0.006              -3.816859e+23
## Jalan_Kaki                         0.005               6.122892e+37
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                       -0.012               5.133634e+12
## Angkutan_Umum                       -1.952               8.100000e-02
## Sepeda                              -0.001               7.000000e-03
## Jalan_Kaki                           0.000               1.600000e-02
cat("\nP-values:\n")
## 
## P-values:
print(round(p_values, 4))
##               (Intercept) Usia_Penglaju Pendapatan_Bulanan_Juta Jarak_Tujuan_Km
## Motor_Pribadi      0.9967        1.0000                  1.0000          0.9999
## Angkutan_Umum      0.7880        0.9991                  0.9981          0.9979
## Sepeda             0.9515        0.9999                  0.9999          0.9998
## Jalan_Kaki         0.6781        0.9989                  0.9985          0.9996
##               Kepemilikan_KendaraanMotor Kepemilikan_KendaraanMobil
## Motor_Pribadi                     0.9791                       0.00
## Angkutan_Umum                     0.0011                       0.46
## Sepeda                            0.9952                       0.00
## Jalan_Kaki                        0.9957                       0.00
##               Kualitas_Angkutan_UmumSedang Kualitas_Angkutan_UmumBaik
## Motor_Pribadi                       0.9907                     0.0000
## Angkutan_Umum                       0.0509                     0.9357
## Sepeda                              0.9991                     0.9945
## Jalan_Kaki                          0.9998                     0.9870

Prediksi dan Validasi

# Memprediksi probabilitas untuk setiap kategori moda
probabilitas_prediksi <- predict(model_multinom_moda, type = "probs")
head(round(probabilitas_prediksi, 3))
##   Mobil_Pribadi Motor_Pribadi Angkutan_Umum Sepeda Jalan_Kaki
## 1             1             0             0      0          0
## 2             0             1             0      0          0
## 3             0             0             1      0          0
## 4             0             1             0      0          0
## 5             1             0             0      0          0
## 6             0             0             0      0          1
# Memprediksi kategori moda yang paling mungkin dipilih
moda_prediksi <- predict(model_multinom_moda, type = "class")
head(moda_prediksi)
## [1] Mobil_Pribadi Motor_Pribadi Angkutan_Umum Motor_Pribadi Mobil_Pribadi
## [6] Jalan_Kaki   
## Levels: Mobil_Pribadi Motor_Pribadi Angkutan_Umum Sepeda Jalan_Kaki
# Membuat tabel kontingensi (confusion matrix) untuk validasi sederhana
tabel_validasi <- table(Observasi = data_moda_transportasi_manual$Moda_Transportasi_Utama, Prediksi = moda_prediksi)
cat("\nTabel Validasi (Confusion Matrix):\n")
## 
## Tabel Validasi (Confusion Matrix):
print(tabel_validasi)
##                Prediksi
## Observasi       Mobil_Pribadi Motor_Pribadi Angkutan_Umum Sepeda Jalan_Kaki
##   Mobil_Pribadi            14             0             0      0          0
##   Motor_Pribadi             0            15             0      0          0
##   Angkutan_Umum             0             0            11      0          0
##   Sepeda                    0             0             0      5          0
##   Jalan_Kaki                0             0             0      0          5
# Menghitung akurasi sederhana
akurasi <- sum(diag(tabel_validasi)) / sum(tabel_validasi)
print(paste("Akurasi Model Sederhana:", round(akurasi, 3)))
## [1] "Akurasi Model Sederhana: 1"

Regresi logistik ordinal

Regresi logistik ordinal digunakan ketika variabel respon kita bersifat kategorik dan memiliki tingkatan atau urutan yang jelas (ordinal). Model ini memungkinkan kita untuk memahami bagaimana variabel prediktor (baik numerik maupun kategorik) mempengaruhi probabilitas suatu observasi jatuh ke dalam kategori tertentu pada skala ordinal tersebut.

Model Logit Kumulatif

Model yang paling umum untuk data ordinal adalah Model Logit Kumulatif (Cumulative Logit Model). Ide utamanya adalah memodelkan probabilitas kumulatif dari variabel respon. Jika variabel respon \(Y\) memiliki \(k\) kategori berurutan (\(1, 2, \ldots, k\)), model ini akan menganalisis probabilitas \(Y\) berada pada kategori \(j\) atau lebih rendah, yaitu \(P(Y \le j)\).

Rumus Model

Model logit untuk probabilitas kumulatif ke-\(j\) didefinisikan sebagai: \[ \text{logit}[P(Y \le j)] = \log\left(\frac{P(Y \le j)}{P(Y > j)}\right) = \alpha_j + \boldsymbol{\beta'X} \] Di mana: * \(j\) berjalan dari \(1\) hingga \(k-1\). * \(\alpha_j\) adalah intercept atau titik potong (cut-point) untuk logit ke-\(j\). Nilai \(\alpha_j\) ini akan berbeda untuk setiap tingkatan kategori. * \(\boldsymbol{\beta}\) adalah vektor koefisien regresi untuk prediktor \(\mathbf{X}\).

Asumsi Proportional Odds (Paralelisme)

Fitur utama dari model ini adalah asumsi proportional odds. Asumsi ini menyatakan bahwa efek dari prediktor (\(\boldsymbol{\beta}\)) adalah konstan atau sama di semua \(k-1\) logit kumulatif. Artinya, tidak ada subskrip \(j\) pada \(\boldsymbol{\beta}\). Pengaruh Kesiapan_Dosen terhadap peluang kepuasan “Cukup atau kurang” versus “lebih dari Cukup” diasumsikan sama dengan pengaruhnya terhadap peluang kepuasan “Baik atau kurang” versus “Sangat Baik”.

Studi Kasus: Analisis Kepuasan Mahasiswa

Kita akan menerapkan model ini pada kasus analisis faktor-faktor yang mempengaruhi tingkat kepuasan mahasiswa terhadap kualitas pengajaran dosen.

Variabel Respon: Tingkat_Kepuasan (“Kurang”, “Cukup”, “Baik”, “Sangat Baik”). Variabel Prediktor: Kesiapan_Dosen, SKS_Mata_Kuliah, Status_Mahasiswa.

Data dan Sintaks Persiapan

Berikut adalah sintaks ringkas untuk menghasilkan data simulasi dan mempersiapkannya untuk analisis.

Dalam banyak institusi pendidikan, evaluasi dosen oleh mahasiswa menghasilkan data kepuasan yang bersifat berjenjang atau ordinal (misalnya: “Kurang”, “Cukup”, “Baik”, “Sangat Baik”).

# --- SINTAKS PEMBUATAN DATA ---
set.seed(123)
n_mahasiswa <- 150
Kesiapan_Dosen <- round(rnorm(n_mahasiswa, mean = 7.5, sd = 1.5), 1)
Kesiapan_Dosen[Kesiapan_Dosen > 10] <- 10; Kesiapan_Dosen[Kesiapan_Dosen < 1] <- 1
SKS_Mata_Kuliah <- sample(c(2, 3, 4), n_mahasiswa, replace = TRUE, prob = c(0.4, 0.5, 0.1))
Status_Mahasiswa <- factor(sample(c("Reguler", "Karyawan"), n_mahasiswa, replace = TRUE, prob = c(0.8, 0.2)))

latent_satisfaction <- (1.8 * Kesiapan_Dosen) - (0.4 * SKS_Mata_Kuliah) + (0.9 * (Status_Mahasiswa == "Reguler")) + rnorm(n_mahasiswa, mean = 0, sd = 2.5)

# PENTING: Membuat variabel respon sebagai ORDERED FACTOR
Tingkat_Kepuasan <- cut(latent_satisfaction,
                        breaks = c(-Inf, 8, 11, 14, Inf),
                        labels = c("Kurang", "Cukup", "Baik", "Sangat Baik"),
                        ordered_result = TRUE)

data_kepuasan_mahasiswa <- data.frame(
  Tingkat_Kepuasan, Kesiapan_Dosen, SKS_Mata_Kuliah, Status_Mahasiswa
)

# Menampilkan struktur data
cat("Struktur Data Kepuasan Mahasiswa:\n")
## Struktur Data Kepuasan Mahasiswa:
str(data_kepuasan_mahasiswa)
## 'data.frame':    150 obs. of  4 variables:
##  $ Tingkat_Kepuasan: Ord.factor w/ 4 levels "Kurang"<"Cukup"<..: 2 2 4 3 3 4 2 2 4 4 ...
##  $ Kesiapan_Dosen  : num  6.7 7.2 9.8 7.6 7.7 10 8.2 5.6 6.5 6.8 ...
##  $ SKS_Mata_Kuliah : num  2 3 2 2 2 3 3 3 3 3 ...
##  $ Status_Mahasiswa: Factor w/ 2 levels "Karyawan","Reguler": 2 2 2 2 2 1 1 2 2 2 ...

Estimasi Model Ordinal

# Memuat paket dan menjalankan model
library(MASS)

model_kepuasan <- polr(Tingkat_Kepuasan ~ Kesiapan_Dosen + SKS_Mata_Kuliah + Status_Mahasiswa,
                       data = data_kepuasan_mahasiswa,
                       Hess = TRUE) # Hess=TRUE untuk menghitung standar error

# Menampilkan ringkasan model
summary(model_kepuasan)
## Call:
## polr(formula = Tingkat_Kepuasan ~ Kesiapan_Dosen + SKS_Mata_Kuliah + 
##     Status_Mahasiswa, data = data_kepuasan_mahasiswa, Hess = TRUE)
## 
## Coefficients:
##                           Value Std. Error t value
## Kesiapan_Dosen           1.1001     0.1475   7.459
## SKS_Mata_Kuliah         -0.4187     0.2563  -1.634
## Status_MahasiswaReguler  0.6820     0.3747   1.820
## 
## Intercepts:
##                  Value   Std. Error t value
## Kurang|Cukup      4.1641  1.2052     3.4553
## Cukup|Baik        6.4485  1.2435     5.1858
## Baik|Sangat Baik  8.3155  1.3198     6.3004
## 
## Residual Deviance: 309.349 
## AIC: 321.349

Nilai P-Value

(ctable <- coef(summary(model_kepuasan)))
##                              Value Std. Error   t value
## Kesiapan_Dosen           1.1000805  0.1474873  7.458814
## SKS_Mata_Kuliah         -0.4186988  0.2562735 -1.633797
## Status_MahasiswaReguler  0.6820387  0.3747270  1.820095
## Kurang|Cukup             4.1641262  1.2051553  3.455261
## Cukup|Baik               6.4484537  1.2434750  5.185833
## Baik|Sangat Baik         8.3154704  1.3198390  6.300367

Prediksi Probabilitas

# Contoh data baru untuk prediksi
data_baru <- data.frame(
  Kesiapan_Dosen = c(8.5, 6.0),
  SKS_Mata_Kuliah = c(3, 2),
  Status_Mahasiswa = factor(c("Reguler", "Karyawan"))
)

# Prediksi probabilitas untuk setiap kategori
prediksi_prob <- predict(model_kepuasan, newdata = data_baru, type = "probs")
cat("\nPrediksi Probabilitas:\n")
## 
## Prediksi Probabilitas:
print(round(prediksi_prob, 3))
##   Kurang Cukup  Baik Sangat Baik
## 1  0.010 0.079 0.298       0.613
## 2  0.168 0.497 0.263       0.072

Log Linear Model

Model Log-Linear adalah metode statistik untuk menganalisis tabel kontingensi multi-arah. [cite_start]Berbeda dengan regresi logistik yang memiliki variabel dependen yang jelas, model ini memperlakukan semua variabel secara simetris. [cite_start]Tujuannya adalah untuk memahami struktur asosiasi atau hubungan timbal balik antar variabel-variabel kategorik tersebut, bukan untuk prediksi. [cite_start]Model ini bekerja dengan memodelkan ekspektasi frekuensi sel dalam tabel dan mengasumsikan distribusi Poisson.

Contoh Kasus

Sebagai contoh kasus, mari kita gunakan sebuah skenario uji klinis yang umum. Sebuah perusahaan farmasi mengembangkan obat baru untuk mempercepat pemulihan pasien setelah serangan jantung. Untuk menguji efikasinya, sebuah studi dilakukan dengan dua kelompok pasien: satu kelompok menerima obat baru dan kelompok lainnya menerima plasebo.

  • Variabel 1 (X): Perlakuan (Obat Baru, Plasebo)
  • Variabel 2 (Y): Hasil (Sembuh dalam 30 hari, Tidak Sembuh dalam 30 hari)

Data hasil studi disajikan dalam tabel kontingensi 2x2 berikut, yang berisi angka acak namun relevan untuk kasus ini:

# Membuat tabel kontingensi 2x2 untuk studi kasus
tabel_obat <- matrix(c(75, 25, 40, 60), nrow = 2, byrow = TRUE,
                     dimnames = list(Perlakuan = c("Obat Baru", "Plasebo"),
                                     Hasil = c("Sembuh", "Tidak Sembuh")))

print("Tabel Kontingensi: Efikasi Obat Baru vs Plasebo")
## [1] "Tabel Kontingensi: Efikasi Obat Baru vs Plasebo"
print(tabel_obat)
##            Hasil
## Perlakuan   Sembuh Tidak Sembuh
##   Obat Baru     75           25
##   Plasebo       40           60
data_obat_df <- as.data.frame(as.table(tabel_obat))
colnames(data_obat_df) <- c("Perlakuan", "Hasil", "Frekuensi")

print("Data dalam Format Panjang:")
## [1] "Data dalam Format Panjang:"
print(data_obat_df)
##   Perlakuan        Hasil Frekuensi
## 1 Obat Baru       Sembuh        75
## 2   Plasebo       Sembuh        40
## 3 Obat Baru Tidak Sembuh        25
## 4   Plasebo Tidak Sembuh        60

Model Loglinear

Untuk tabel kontingensi 2x2, model log-linear menyatakan bahwa logaritma dari ekspektasi frekuensi sel (\(\mu_{ij}\)) adalah kombinasi dari beberapa efek.

Model Independen

Model ini mengasumsikan tidak ada hubungan antara Perlakuan dan Hasil. Model ini hanya berisi efek utama. \[ \log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y \] Jika model ini cocok dengan data, maka kita simpulkan kedua variabel bersifat independen.

# Fitting model independen (hanya efek utama)
model_indep <- glm(Frekuensi ~ Perlakuan + Hasil, 
                   data = data_obat_df, 
                   family = poisson)

Model Jenuh (Saturated)

Model ini adalah model yang paling kompleks, mencakup efek utama dan efek interaksi. \[ \log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY} \] Model ini akan selalu cocok sempurna dengan data observasi, dan berfungsi sebagai pembanding. Efek interaksi (\(\lambda_{ij}^{XY}\)) menunjukkan adanya asosiasi.

# Fitting model jenuh (efek utama + interaksi)
model_jenuh <- glm(Frekuensi ~ Perlakuan * Hasil, 
                   data = data_obat_df, 
                   family = poisson)

Odds Ratio dan Asosiasi

Kekuatan asosiasi dalam tabel 2x2 dapat diukur dengan Odds Ratio (OR). \[ \text{OR} = \frac{\text{odds(Sembuh | Obat Baru)}}{\text{odds(Sembuh | Plasebo)}} = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \] Jika OR=1, maka tidak ada asosiasi. Dalam data kita:

# Menghitung Odds Ratio secara manual dari tabel
or_value <- (tabel_obat[1, 1] * tabel_obat[2, 2]) / (tabel_obat[1, 2] * tabel_obat[2, 1])
print(paste("Odds Ratio (OR):", or_value))
## [1] "Odds Ratio (OR): 4.5"

Nilai OR sebesar 4.5 menunjukkan bahwa odds untuk sembuh pada kelompok yang menerima obat baru adalah 4.5 kali lebih tinggi dibandingkan kelompok plasebo. Ini mengindikasikan adanya asosiasi positif yang kuat.

Pemilihan Model Terbaik

Untuk membuktikan secara statistik bahwa asosiasi ini signifikan, kita membandingkan Model Independen dengan Model Jenuh menggunakan Uji Likelihood-Ratio (\(G^2\)).

# Membandingkan kedua model
anova(model_indep, model_jenuh, test = "Chisq")

Interpretasi Hasil Uji - Deviance: Selisih deviance antara Model 1 (independen) dan Model 2 (jenuh) adalah 25.672 - Df: Selisih derajat bebas adalah 1. - Pr(>Chi): Nilai p-value adalah 4.046e-07 (sangat kecil).

Kesimpulan Uji: Karena p-value sangat kecil (< 0.05), kita menolak hipotesis nol bahwa model independen sudah cukup baik. Ini berarti menambahkan parameter interaksi (\(\lambda_{ij}^{XY}\)) ke dalam model memberikan peningkatan fit yang sangat signifikan.

Dengan kata lain, terdapat asosiasi yang signifikan secara statistik antara jenis perlakuan (obat baru vs. plasebo) dan hasil pemulihan pasien. Model terbaik untuk menjelaskan data ini adalah model jenuh (atau model dengan interaksi).

Ringkasan dan Koefisien Model Terbaik

Model terbaik adalah model yang menyertakan interaksi. Mari kita lihat koefisien dari model_jenuh.

summary(model_jenuh)
## 
## Call:
## glm(formula = Frekuensi ~ Perlakuan * Hasil, family = poisson, 
##     data = data_obat_df)
## 
## Coefficients:
##                                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          4.3175     0.1155  37.391  < 2e-16 ***
## PerlakuanPlasebo                    -0.6286     0.1958  -3.211  0.00132 ** 
## HasilTidak Sembuh                   -1.0986     0.2309  -4.757 1.96e-06 ***
## PerlakuanPlasebo:HasilTidak Sembuh   1.5041     0.3082   4.880 1.06e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 3.0190e+01  on 3  degrees of freedom
## Residual deviance: 5.7732e-15  on 0  degrees of freedom
## AIC: 30.687
## 
## Number of Fisher Scoring iterations: 3

Model Log Linear Tiga Arah

Model log-linear dapat diperluas untuk menganalisis tabel kontingensi dengan tiga atau lebih variabel. Analisis tiga arah memungkinkan kita untuk memahami hubungan yang lebih kompleks, seperti bagaimana asosiasi antara dua variabel mungkin dipengaruhi oleh variabel ketiga.

Tujuan utama dalam analisis tiga arah adalah untuk menemukan model yang paling sederhana (parsimonious) yang tetap cocok dengan data, dengan cara menguji signifikansi dari berbagai kemungkinan interaksi.

Model Log-Linear untuk Tabel Tiga Arah

Untuk tiga variabel, sebut saja X, Y, dan Z, terdapat beberapa model log-linear yang tersusun secara hirarkis dari yang paling kompleks hingga yang paling sederhana:

  1. Model Jenuh (Saturated): (XYZ) - Mencakup semua efek utama dan semua interaksi (dua arah dan tiga arah).
  2. Model Asosiasi Homogen (Homogenous Association): (XY, XZ, YZ) - Mencakup semua interaksi dua arah, tetapi tidak ada interaksi tiga arah. Mengasumsikan asosiasi dua arah tidak dipengaruhi oleh variabel ketiga.
  3. Model Independensi Bersyarat (Conditional Independence): Contohnya (XZ, YZ), yang mengasumsikan X dan Y independen pada setiap level Z.
  4. Model Independensi Gabungan (Joint Independence): Contohnya (XY, Z), yang mengasumsikan Z independen dari gabungan X dan Y.
  5. Model Independensi Total (Mutual Independence): (X, Y, Z) - Hanya berisi efek utama dan mengasumsikan ketiga variabel saling independen.

Contoh Kasus

Sebuah perusahaan ingin mengetahui efektivitas dua jenis iklan digital terhadap preferensi platform streaming di antara dua kelompok usia.

  • Z: Jenis_Iklan yang dilihat responden (Video Ad, Static Ad).
  • X: Kelompok_Usia responden (Remaja, Dewasa).
  • Y: Platform_Pilihan responden (Netflix, Disney+).

Sumber: The effects of advertising appeals on consumers’ behavioural intention towards global brands: The mediating role of attitude and the moderating role of uncertainty avoidance [10.1108/JIMA-11-2017-0134 ][https://www.emerald.com/insight/content/doi/10.1108/jima-11-2017-0134/full/html)](https://www.emerald.com/insight/content/doi/10.1108/jima-11-2017-0134/full/html)){.uri}

Pertanyaan Riset: Apakah ada hubungan antara kelompok usia dan platform pilihan? Dan apakah hubungan tersebut berbeda (berinteraksi) tergantung pada jenis iklan yang mereka lihat?

# Membuat data frame untuk studi kasus iklan
data_iklan_df <- data.frame(
  Jenis_Iklan = factor(rep(c("Video Ad", "Static Ad"), each = 4)),
  Kelompok_Usia = factor(rep(c("Remaja", "Dewasa"), each = 2, times = 2)),
  Platform_Pilihan = factor(rep(c("Netflix", "Disney+"), times = 4)),
  Frekuensi = c(60, 90, 100, 40, 80, 50, 95, 45) # Data dummy
)

# Membuat tabel kontingensi 3 arah dari data frame
tabel_iklan_3d <- xtabs(Frekuensi ~ Jenis_Iklan + Kelompok_Usia + Platform_Pilihan, data = data_iklan_df)

# Menampilkan tabel dalam format yang mudah dibaca
cat("Tabel Kontingensi: Preferensi Platform berdasarkan Iklan dan Usia\n")
## Tabel Kontingensi: Preferensi Platform berdasarkan Iklan dan Usia
ftable(tabel_iklan_3d)
##                           Platform_Pilihan Disney+ Netflix
## Jenis_Iklan Kelompok_Usia                                 
## Static Ad   Dewasa                              45      95
##             Remaja                              50      80
## Video Ad    Dewasa                              40     100
##             Remaja                              90      60

Uji Model Interaksi Tiga Arah (Homogen X Saturated)

Setelah menyusun data ke dalam tabel kontingensi tiga arah, langkah analisis pertama dalam pendekatan hirarkis adalah menguji signifikansi dari interaksi tingkat tertinggi, yaitu interaksi tiga arah. Pengujian ini akan menentukan apakah hubungan antara dua variabel dipengaruhi secara signifikan oleh variabel ketiga.

Jika interaksi tiga arah terbukti signifikan, maka analisis berhenti di sini karena model yang paling akurat adalah Model Jenuh, dan interpretasi harus fokus pada bagaimana asosiasi dua arah berubah di setiap level variabel ketiga. Jika tidak signifikan, kita dapat menyederhanakan model dan melanjutkan pengujian interaksi dua arah.

Contoh Kasus

Kita akan melanjutkan studi kasus “Efektivitas Iklan Streaming” dengan data yang telah kita siapkan. * Z: Jenis_Iklan (Video Ad, Static Ad) * X: Kelompok_Usia (Remaja, Dewasa) * Y: Platform_Pilihan (Netflix, Disney+)

Tujuan kita adalah menguji hipotesis: “Apakah ada interaksi tiga arah antara Jenis_Iklan, Kelompok_Usia, dan Platform_Pilihan?”

Sumber: The effects of advertising appeals on consumers’ behavioural intention towards global brands: The mediating role of attitude and the moderating role of uncertainty avoidance [10.1108/JIMA-11-2017-0134 ][https://www.emerald.com/insight/content/doi/10.1108/jima-11-2017-0134/full/html)](https://www.emerald.com/insight/content/doi/10.1108/jima-11-2017-0134/full/html)){.uri}

# Data dari Bab 16
data_iklan_df <- data.frame(
  Jenis_Iklan = factor(rep(c("Video Ad", "Static Ad"), each = 4)),
  Kelompok_Usia = factor(rep(c("Remaja", "Dewasa"), each = 2, times = 2)),
  Platform_Pilihan = factor(rep(c("Netflix", "Disney+"), times = 4)),
  Frekuensi = c(60, 90, 100, 40, 80, 50, 95, 45)
)

# Model 1: Jenuh (Saturated)
# Formula: ~ Jenis_Iklan * Kelompok_Usia * Platform_Pilihan
model_jenuh <- glm(Frekuensi ~ Jenis_Iklan * Kelompok_Usia * Platform_Pilihan, 
                   data = data_iklan_df, family = poisson()) ;model_jenuh
## 
## Call:  glm(formula = Frekuensi ~ Jenis_Iklan * Kelompok_Usia * Platform_Pilihan, 
##     family = poisson(), data = data_iklan_df)
## 
## Coefficients:
##                                                     (Intercept)  
##                                                          3.8067  
##                                             Jenis_IklanVideo Ad  
##                                                         -0.1178  
##                                             Kelompok_UsiaRemaja  
##                                                          0.1054  
##                                         Platform_PilihanNetflix  
##                                                          0.7472  
##                         Jenis_IklanVideo Ad:Kelompok_UsiaRemaja  
##                                                          0.7056  
##                     Jenis_IklanVideo Ad:Platform_PilihanNetflix  
##                                                          0.1691  
##                     Kelompok_UsiaRemaja:Platform_PilihanNetflix  
##                                                         -0.2772  
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja:Platform_PilihanNetflix  
##                                                         -1.0445  
## 
## Degrees of Freedom: 7 Total (i.e. Null);  0 Residual
## Null Deviance:       59.28 
## Residual Deviance: -2.398e-14    AIC: 64.27
summary(model_jenuh)
## 
## Call:
## glm(formula = Frekuensi ~ Jenis_Iklan * Kelompok_Usia * Platform_Pilihan, 
##     family = poisson(), data = data_iklan_df)
## 
## Coefficients:
##                                                                 Estimate
## (Intercept)                                                       3.8067
## Jenis_IklanVideo Ad                                              -0.1178
## Kelompok_UsiaRemaja                                               0.1054
## Platform_PilihanNetflix                                           0.7472
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja                           0.7056
## Jenis_IklanVideo Ad:Platform_PilihanNetflix                       0.1691
## Kelompok_UsiaRemaja:Platform_PilihanNetflix                      -0.2772
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja:Platform_PilihanNetflix  -1.0445
##                                                                 Std. Error
## (Intercept)                                                         0.1491
## Jenis_IklanVideo Ad                                                 0.2173
## Kelompok_UsiaRemaja                                                 0.2055
## Platform_PilihanNetflix                                             0.1810
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja                             0.2799
## Jenis_IklanVideo Ad:Platform_PilihanNetflix                         0.2603
## Kelompok_UsiaRemaja:Platform_PilihanNetflix                         0.2554
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja:Platform_PilihanNetflix     0.3578
##                                                                 z value
## (Intercept)                                                      25.536
## Jenis_IklanVideo Ad                                              -0.542
## Kelompok_UsiaRemaja                                               0.513
## Platform_PilihanNetflix                                           4.129
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja                           2.521
## Jenis_IklanVideo Ad:Platform_PilihanNetflix                       0.650
## Kelompok_UsiaRemaja:Platform_PilihanNetflix                      -1.085
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja:Platform_PilihanNetflix  -2.919
##                                                                 Pr(>|z|)    
## (Intercept)                                                      < 2e-16 ***
## Jenis_IklanVideo Ad                                              0.58781    
## Kelompok_UsiaRemaja                                              0.60812    
## Platform_PilihanNetflix                                         3.64e-05 ***
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja                          0.01170 *  
## Jenis_IklanVideo Ad:Platform_PilihanNetflix                      0.51596    
## Kelompok_UsiaRemaja:Platform_PilihanNetflix                      0.27782    
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja:Platform_PilihanNetflix  0.00351 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance:  5.9280e+01  on 7  degrees of freedom
## Residual deviance: -2.3981e-14  on 0  degrees of freedom
## AIC: 64.267
## 
## Number of Fisher Scoring iterations: 3
# Model 2: Asosiasi Homogen (Homogenous Association)
# Formula: ~ Z*X + Z*Y + X*Y
model_homogen <- glm(Frekuensi ~ Jenis_Iklan*Kelompok_Usia + Jenis_Iklan*Platform_Pilihan + Kelompok_Usia*Platform_Pilihan,
                     data = data_iklan_df, family = poisson())
summary(model_homogen)
## 
## Call:
## glm(formula = Frekuensi ~ Jenis_Iklan * Kelompok_Usia + Jenis_Iklan * 
##     Platform_Pilihan + Kelompok_Usia * Platform_Pilihan, family = poisson(), 
##     data = data_iklan_df)
## 
## Coefficients:
##                                             Estimate Std. Error z value
## (Intercept)                                  3.60444    0.14613  24.666
## Jenis_IklanVideo Ad                          0.27172    0.17254   1.575
## Kelompok_UsiaRemaja                          0.46011    0.16973   2.711
## Platform_PilihanNetflix                      1.03260    0.16165   6.388
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja      0.06753    0.17338   0.389
## Jenis_IklanVideo Ad:Platform_PilihanNetflix -0.38958    0.17722  -2.198
## Kelompok_UsiaRemaja:Platform_PilihanNetflix -0.82381    0.17734  -4.645
##                                             Pr(>|z|)    
## (Intercept)                                  < 2e-16 ***
## Jenis_IklanVideo Ad                          0.11530    
## Kelompok_UsiaRemaja                          0.00671 ** 
## Platform_PilihanNetflix                     1.68e-10 ***
## Jenis_IklanVideo Ad:Kelompok_UsiaRemaja      0.69692    
## Jenis_IklanVideo Ad:Platform_PilihanNetflix  0.02793 *  
## Kelompok_UsiaRemaja:Platform_PilihanNetflix 3.39e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 59.2796  on 7  degrees of freedom
## Residual deviance:  8.5887  on 1  degrees of freedom
## AIC: 70.856
## 
## Number of Fisher Scoring iterations: 4

Pengujian Hipotesis Interaksi Tiga Arah

Pengujian dilakukan dengan membandingkan goodness-of-fit dari kedua model menggunakan Uji Likelihood-Ratio (selisih deviance).

Hipotesis

  • H0: Tidak ada interaksi tiga arah. Efek interaksi \(\lambda_{ijk}^{ZXY}\) adalah nol. Model Asosiasi Homogen sudah cukup untuk menjelaskan data.
  • H1: Terdapat interaksi tiga arah yang signifikan.

Tingkat Signifikansi

Kita menggunakan tingkat signifikansi (\(\alpha\)) sebesar 0.05.

Statistik Uji

Statistik uji \(G^2\) dihitung dari selisih residual deviance kedua model. Derajat bebas (df) adalah selisih jumlah parameter dari kedua model. \[ G^2 = \text{Deviance}(\text{Model Homogen}) - \text{Deviance}(\text{Model Jenuh}) \]

# Menjalankan uji perbandingan model
anova(model_homogen, model_jenuh, test = "Chisq")

Keputusan

Dengan taraf signifikansi sebesar 5% maka tolak H0. Dapat disimpulkan bahwa adanya interaksi tiga arah yang signifikan antara Jenis_Iklan, Kelompok_Usia, dan Platform_Pilihan.

Implikasi dan Interpretasi Interaksi Tiga Arah

# Membuat tabel 3D terlebih dahulu
tabel_iklan_3d <- xtabs(Frekuensi ~ Jenis_Iklan + Kelompok_Usia + Platform_Pilihan, data = data_iklan_df)

# OR untuk Kelompok "Video Ad"
or_video_ad <- (tabel_iklan_3d["Video Ad", "Remaja", "Netflix"] * tabel_iklan_3d["Video Ad", "Dewasa", "Disney+"]) / 
               (tabel_iklan_3d["Video Ad", "Remaja", "Disney+"] * tabel_iklan_3d["Video Ad", "Dewasa", "Netflix"])

# OR untuk Kelompok "Static Ad"
or_static_ad <- (tabel_iklan_3d["Static Ad", "Remaja", "Netflix"] * tabel_iklan_3d["Static Ad", "Dewasa", "Disney+"]) /
                (tabel_iklan_3d["Static Ad", "Remaja", "Disney+"] * tabel_iklan_3d["Static Ad", "Dewasa", "Netflix"])

cat("Odds Ratio (Usia:Platform) untuk penonton Video Ad:", round(or_video_ad, 3), "\n")
## Odds Ratio (Usia:Platform) untuk penonton Video Ad: 0.267
cat("Odds Ratio (Usia:Platform) untuk penonton Static Ad:", round(or_static_ad, 3), "\n")
## Odds Ratio (Usia:Platform) untuk penonton Static Ad: 0.758

Uji Model Interaksi Dua Arah (Jenis Iklan : Platform Pilihan)

Bab ini dan dua bab berikutnya akan mendemonstrasikan proses pengujian hirarkis untuk interaksi dua arah. Proses ini hanya relevan jika kita telah menyimpulkan dari Bab sebelumnya bahwa tidak ada interaksi tiga arah yang signifikan.

Oleh karena itu, kita akan bekerja dengan asumsi hipotetis bahwa model terbaik kita saat ini adalah Model Asosiasi Homogen (XY, XZ, YZ). Tujuan kita sekarang adalah menguji apakah model ini bisa disederhanakan lebih lanjut dengan menghilangkan interaksi dua arah yang tidak signifikan.

Model Conditional

Model yang lebih sederhana yang digunakan adalah Model Independensi Bersyarat pada X, yang mengasumsikan tidak ada interaksi antara Y dan Z. \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \] Model ini menyatakan bahwa Platform_Pilihan dan Jenis_Iklan saling independen pada setiap level Kelompok_Usia.

Hipotesis dan Persiapan Model

Hipotesis

  • H0: Tidak ada interaksi antara Jenis_Iklan dan Platform_Pilihan.
  • H1: Terdapat interaksi yang signifikan antara Jenis_Iklan dan Platform_Pilihan.

Persiapan Model

Kita membandingkan model_homogen dengan model_kondisional_X (model tanpa interaksi Z:Y).

# Data dari bab sebelumnya
data_iklan_df <- data.frame(
  Jenis_Iklan = factor(rep(c("Video Ad", "Static Ad"), each = 4)),
  Kelompok_Usia = factor(rep(c("Remaja", "Dewasa"), each = 2, times = 2)),
  Platform_Pilihan = factor(rep(c("Netflix", "Disney+"), times = 4)),
  Frekuensi = c(60, 90, 100, 40, 80, 50, 95, 45)
)

# Model Kompleks: Asosiasi Homogen
model_homogen <- glm(Frekuensi ~ Jenis_Iklan*Kelompok_Usia + Jenis_Iklan*Platform_Pilihan + Kelompok_Usia*Platform_Pilihan,
                     data = data_iklan_df, family = poisson)

# Model Sederhana: Tanpa interaksi Z:Y (Jenis_Iklan:Platform_Pilihan)
model_kondisional_X <- glm(Frekuensi ~ Jenis_Iklan*Kelompok_Usia + Kelompok_Usia*Platform_Pilihan,
                           data = data_iklan_df, family = poisson)

Uji Likelihood-Ratio dan Interpretasi

Rumus statistik uji yang digunakan adalah selisih deviance: \[ G^2 = \text{Deviance}(\text{Model Sederhana}) - \text{Deviance}(\text{Model Kompleks}) \]

# Menjalankan uji perbandingan model
anova(model_kondisional_X, model_homogen, test = "Chisq")

Interpretasi

Berdasarkan hasil uji anova, diperoleh selisih deviance sebesar 4.8603 dengan 1 derajat bebas, yang menghasilkan p-value 0.02748. Karena nilai p-value ini lebih kecil dari 0.05, maka kita menolak hipotesis nol. Keputusan ini menunjukkan bahwa terdapat interaksi yang signifikan secara statistik antara Jenis_Iklan dan Platform_Pilihan, sehingga interaksi ini tidak dapat dihilangkan dari model.

Uji Interaksi Dua Arah (Kelompok Usia : Jenis Iklan)

Melanjutkan proses penyederhanaan dari Model Asosiasi Homogen, pada bab ini kita akan menguji signifikansi dari interaksi dua arah antara Kelompok_Usia (X) dan Jenis_Iklan (Z).

Model Conditional

Model yang lebih sederhana yang digunakan adalah Model Independensi Bersyarat pada Y, yang mengasumsikan tidak ada interaksi antara X dan Z. \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \] Model ini menyatakan bahwa Kelompok_Usia dan Jenis_Iklan saling independen pada setiap level Platform_Pilihan.

Hipotesis dan Persiapan Model

Hipotesis

  • H0: Tidak ada interaksi antara Kelompok_Usia dan Jenis_Iklan.
  • H1: Terdapat interaksi yang signifikan antara Kelompok_Usia dan Jenis_Iklan.

Persiapan Model

# Model Sederhana: Tanpa interaksi X:Z (Kelompok_Usia:Jenis_Iklan)
model_kondisional_Y <- glm(Frekuensi ~ Kelompok_Usia*Platform_Pilihan + Jenis_Iklan*Platform_Pilihan,
                           data = data_iklan_df, family = poisson)

Uji Likelihood-Ratio dan Interpretasi

# Menjalankan uji perbandingan model
anova(model_kondisional_Y, model_homogen, test = "Chisq")

Interpretasi

Hasil uji anova menunjukkan selisih deviance sebesar 0.15165 dengan 1 derajat bebas, yang menghasilkan p-value 0.697. Karena nilai p-value ini jauh lebih besar dari 0.05, maka kita gagal menolak hipotesis nol. Ini berarti tidak ada interaksi yang signifikan antara Kelompok_Usia dan Jenis_Iklan, sehingga interaksi ini dapat dihilangkan untuk menyederhanakan model.

Uji Interaksi Dua Arah (Kelompok Usia : Platform Pilihan)

Ini adalah langkah pengujian terakhir untuk interaksi dua arah dari Model Asosiasi Homogen. Kita akan menguji signifikansi interaksi antara Kelompok_Usia (X) dan Platform_Pilihan (Y).

Model Conditional

Pada bab ini, kita menguji interaksi Kelompok_Usia:Platform_Pilihan (X:Y). Model yang lebih sederhana yang digunakan adalah Model Independensi Bersyarat pada Z, yang mengasumsikan tidak ada interaksi antara X dan Y. \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \] Model ini menyatakan bahwa Kelompok_Usia dan Platform_Pilihan saling independen pada setiap level Jenis_Iklan.

Hipotesis dan Persiapan Model

Hipotesis

  • H0: Tidak ada interaksi antara Kelompok_Usia dan Platform_Pilihan.
  • H1: Terdapat interaksi yang signifikan antara Kelompok_Usia dan Platform_Pilihan.

Persiapan Model

# Model Sederhana: Tanpa interaksi X:Y (Kelompok_Usia:Platform_Pilihan)
model_kondisional_Z <- glm(Frekuensi ~ Jenis_Iklan*Kelompok_Usia + Jenis_Iklan*Platform_Pilihan, data = data_iklan_df, family = poisson)

Uji Likelihood-Ratio dan Interpretasi

# Menjalankan uji perbandingan model
anova(model_kondisional_Z, model_homogen, test = "Chisq")

Interpretasi

Uji perbandingan model ini menghasilkan selisih deviance sebesar 22.089 dengan 1 derajat bebas dan p-value yang sangat kecil, yaitu 2.603e-06. Karena p-value ini secara signifikan lebih kecil dari 0.05, kita menolak hipotesis nol. Hal ini membuktikan bahwa terdapat interaksi yang sangat signifikan antara Kelompok_Usia dan Platform_Pilihan, dan interaksi ini harus dipertahankan dalam model akhir.

Pemilihan Model Terbaik

Setelah melakukan serangkaian uji hipotesis hirarkis, langkah selanjutnya adalah merangkum hasilnya untuk memilih satu model terbaik. Model terbaik adalah model yang paling sederhana (parsimonious) yang masih mampu menjelaskan data dengan baik, yaitu dengan mempertahankan semua interaksi yang terbukti signifikan secara statistik.

Ringkasan Pengujian Interaksi Dua Arah

Berikut adalah ringkasan dari hasil pengujian hipotesis yang telah kita lakukan pada Bab 17, 18, dan 19.

Interaksi yang Diuji Selisih Deviance (\(G^2\)) df P-value Keputusan
Jenis_Iklan : Platform_Pilihan 4.8603 1 0.02748 Tolak H0
Kelompok_Usia : Jenis_Iklan 0.1517 1 0.69700 Gagal Tolak H0
Kelompok_Usia : Platform_Pilihan 22.0890 1 2.603e-06 Tolak H0

Kesimpulan Pemilihan Model Terbaik

Dari tabel ringkasan di atas, kita dapat menyimpulkan: * Interaksi antara Jenis_Iklan dan Platform_Pilihan adalah signifikan. * Interaksi antara Kelompok_Usia dan Jenis_Iklan adalah tidak signifikan. * Interaksi antara Kelompok_Usia dan Platform_Pilihan adalah signifikan.

Karena interaksi Kelompok_Usia:Jenis_Iklan tidak signifikan, kita dapat menghilangkannya dari model untuk mendapatkan model yang lebih sederhana. Sementara itu, dua interaksi lainnya harus dipertahankan.

Dengan demikian, model terbaik untuk data ini adalah model yang berisi semua efek utama ditambah dengan dua interaksi yang signifikan. Dalam notasi statistik, model ini adalah (XY, YZ), di mana X=Kelompok_Usia, Y=Platform_Pilihan, dan Z=Jenis_Iklan.

Formula Model Terbaik: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \] Formula ini menyatakan bahwa ada hubungan antara Kelompok Usia dan Platform Pilihan, serta hubungan antara Jenis Iklan dan Platform Pilihan. Namun, hubungan antara Kelompok Usia dan Jenis Iklan dianggap independen.

Model Terbaik

Pada bab ini, kita akan secara formal mem-fitting model terbaik yang telah kita identifikasi di Bab sebelumnya dan melihat ringkasan statistiknya.

# Data dari bab sebelumnya
data_iklan_df <- data.frame(
  Jenis_Iklan = factor(rep(c("Video Ad", "Static Ad"), each = 4)),
  Kelompok_Usia = factor(rep(c("Remaja", "Dewasa"), each = 2, times = 2)),
  Platform_Pilihan = factor(rep(c("Netflix", "Disney+"), times = 4)),
  Frekuensi = c(60, 90, 100, 40, 80, 50, 95, 45)
)

# Fitting model terbaik: (XY, YZ)
# Y = Platform, X = Usia, Z = Iklan
model_terbaik <- glm(Frekuensi ~ Kelompok_Usia*Platform_Pilihan + Jenis_Iklan*Platform_Pilihan,
                     data = data_iklan_df, family = poisson)

# Menampilkan ringkasan model terbaik
summary(model_terbaik)
## 
## Call:
## glm(formula = Frekuensi ~ Kelompok_Usia * Platform_Pilihan + 
##     Jenis_Iklan * Platform_Pilihan, family = poisson, data = data_iklan_df)
## 
## Coefficients:
##                                             Estimate Std. Error z value
## (Intercept)                                   3.5804     0.1336  26.801
## Kelompok_UsiaRemaja                           0.4990     0.1375   3.629
## Platform_PilihanNetflix                       1.0432     0.1603   6.507
## Jenis_IklanVideo Ad                           0.3137     0.1350   2.324
## Kelompok_UsiaRemaja:Platform_PilihanNetflix  -0.8303     0.1766  -4.703
## Platform_PilihanNetflix:Jenis_IklanVideo Ad  -0.4033     0.1737  -2.321
##                                             Pr(>|z|)    
## (Intercept)                                  < 2e-16 ***
## Kelompok_UsiaRemaja                         0.000285 ***
## Platform_PilihanNetflix                     7.67e-11 ***
## Jenis_IklanVideo Ad                         0.020136 *  
## Kelompok_UsiaRemaja:Platform_PilihanNetflix 2.57e-06 ***
## Platform_PilihanNetflix:Jenis_IklanVideo Ad 0.020275 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 59.2796  on 7  degrees of freedom
## Residual deviance:  8.7403  on 2  degrees of freedom
## AIC: 69.007
## 
## Number of Fisher Scoring iterations: 4

Berdasarkan hasil uji hirarkis, model terbaik yang terpilih adalah model yang menyertakan interaksi antara Kelompok_Usia dengan Platform_Pilihan serta interaksi antara Jenis_Iklan dengan Platform_Pilihan. Model ini secara statistik menyatakan bahwa ada hubungan signifikan antara demografi usia dan platform yang dipilih, serta antara jenis iklan yang dilihat dan platform yang dipilih. Dengan nilai AIC sebesar 69.007 dan residual deviance yang rendah (8.7403 pada 2 derajat bebas), model ini menunjukkan kecocokan (goodness-of-fit) yang baik terhadap data observasi.

Interpretasi Koefisien Model Terbaik

# Mengambil ringkasan koefisien
coef_summary <- summary(model_terbaik)$coefficients

# Menghitung Odds Ratio (exp(koefisien))
odds_ratios <- exp(coef(model_terbaik))

# Menampilkan hasil dalam tabel
interpretasi_tabel <- data.frame(
  Koefisien = round(coef(model_terbaik), 4),
  Odds_Ratio = round(odds_ratios, 4)
)
print(interpretasi_tabel)
##                                             Koefisien Odds_Ratio
## (Intercept)                                    3.5804    35.8889
## Kelompok_UsiaRemaja                            0.4990     1.6471
## Platform_PilihanNetflix                        1.0432     2.8384
## Jenis_IklanVideo Ad                            0.3137     1.3684
## Kelompok_UsiaRemaja:Platform_PilihanNetflix   -0.8303     0.4359
## Platform_PilihanNetflix:Jenis_IklanVideo Ad   -0.4033     0.6681

Interpretasi koefisien dari model terbaik menyoroti dua interaksi signifikan yang menjadi temuan utama. Pertama, preferensi platform secara signifikan bergantung pada usia, di mana kecenderungan untuk memilih Netflix (dibandingkan Disney+) jauh lebih kuat pada kelompok Dewasa (OR=2.84) dibandingkan pada kelompok Remaja (OR=1.24). Kedua, jenis iklan juga berinteraksi dengan pilihan platform; preferensi terhadap Netflix lebih dominan pada audiens yang melihat Iklan Statis, sementara Iklan Video terbukti lebih efektif dalam meningkatkan daya tarik relatif Disney+.

Nilai Dugaan Model Terbaik

Nilai dugaan atau fitted values (\(\hat{\mu}_{ijk}\)) adalah ekspektasi frekuensi sel yang dihitung berdasarkan parameter dari model terbaik kita. Nilai ini menunjukkan seberapa baik model mereplikasi data observasi.

# Menambahkan nilai observasi dan nilai dugaan ke data frame
hasil_akhir <- data_iklan_df
hasil_akhir$Nilai_Dugaan <- round(fitted(model_terbaik), 2)

print("Perbandingan Frekuensi Observasi dan Nilai Dugaan")
## [1] "Perbandingan Frekuensi Observasi dan Nilai Dugaan"
print(hasil_akhir)
##   Jenis_Iklan Kelompok_Usia Platform_Pilihan Frekuensi Nilai_Dugaan
## 1    Video Ad        Remaja          Netflix        60        66.87
## 2    Video Ad        Remaja          Disney+        90        80.89
## 3    Video Ad        Dewasa          Netflix       100        93.13
## 4    Video Ad        Dewasa          Disney+        40        49.11
## 5   Static Ad        Remaja          Netflix        80        73.13
## 6   Static Ad        Remaja          Disney+        50        59.11
## 7   Static Ad        Dewasa          Netflix        95       101.87
## 8   Static Ad        Dewasa          Disney+        45        35.89

Nilai dugaan atau fitted values adalah frekuensi prediksi untuk setiap sel dalam tabel yang dihasilkan oleh parameter model terbaik. Nilai-nilai ini dihitung dengan menjumlahkan semua efek yang relevan (intercept, efek utama, dan interaksi) untuk setiap kombinasi kategori, lalu hasilnya di-eksponensialkan. Perbandingan antara nilai dugaan dari model ini dengan frekuensi observasi asli menunjukkan selisih yang sangat kecil, yang mengkonfirmasi bahwa model yang dipilih mampu mereplikasi pola data dengan sangat akurat dan memiliki tingkat kecocokan yang tinggi.

Studi Kasus (#2)

Distribusi Multinomial Kasus pilihan program studi (Sains, Sosial, atau Seni) dipilih karena ini adalah contoh nyata dari masalah klasifikasi di mana kategori-kategori tersebut tidak memiliki urutan, sehingga sangat cocok untuk dimodelkan dengan regresi multinomial. Analisis ini terinspirasi dari penelitian nyata yang bertujuan memahami bagaimana latar belakang siswa, seperti nilai akademis dan minat, dapat mempengaruhi jalur pendidikan mereka. Dengan kasus ini, kita dapat melihat secara praktis bagaimana model statistik menguraikan hubungan kompleks dalam pengambilan keputusan.

Sumber: https://auojs.au.edu/index.php/aumitjournal/article/view/4249

Variabel Penelitian

Respons (Multikategori):

  1. jurusan (Pilihan program studi: “Sains”, “Sosial”, “Seni”).

Prediktor:

  1. skor_matematika (Skor tes matematika, numerik).
  2. minat_seni (Minat pada bidang seni, skala 1-10).

Simulasi Data R

Set Data

# Muat library yang dibutuhkan
library(nnet)      # Untuk fungsi multinom()
library(dplyr)     # Untuk manipulasi data
library(knitr)     # Untuk tabel

# --- 1. Simulasi Data Dummy ---
set.seed(42)
n <- 500

# Simulasi variabel prediktor
skor_matematika <- round(rnorm(n, mean = 75, sd = 12))
minat_seni <- round(runif(n, 1, 10))

# Log-odds untuk Sosial vs. Sains (referensi) dan Seni vs. Sains (referensi)
# Asumsi: Skor matematika tinggi -> prob. Sains tinggi. Minat seni tinggi -> prob. Seni tinggi
log_odds_sosial <- 1.5 - 0.05 * skor_matematika + 0.1 * minat_seni
log_odds_seni <- 0.5 - 0.1 * skor_matematika + 0.4 * minat_seni

# Menghitung probabilitas untuk setiap kategori
prob_sains <- 1 / (1 + exp(log_odds_sosial) + exp(log_odds_seni))
prob_sosial <- exp(log_odds_sosial) / (1 + exp(log_odds_sosial) + exp(log_odds_seni))
prob_seni <- exp(log_odds_seni) / (1 + exp(log_odds_sosial) + exp(log_odds_seni))

# Membuat variabel respons multinomial
jurusan_numeric <- sapply(1:n, function(i) {
  sample(c("Sains", "Sosial", "Seni"), size = 1, prob = c(prob_sains[i], prob_sosial[i], prob_seni[i]))
})

# Gabungkan menjadi data frame
df_jurusan <- data.frame(
  jurusan = factor(jurusan_numeric),
  skor_matematika,
  minat_seni
)

# Tampilkan beberapa data awal
kable(head(df_jurusan), caption = "Data Dummy Pilihan Jurusan")
Data Dummy Pilihan Jurusan
jurusan skor_matematika minat_seni
Sains 91 9
Sosial 68 2
Sains 79 8
Sosial 83 6
Sains 80 5
Sains 74 1

Estimasi Model Regresi Logistik Multinomial & Interpretasi Model

# --- 2. Estimasi Model Regresi Logistik Multinomial ---

# Mengatur 'Sains' sebagai kategori referensi (baseline)
df_jurusan$jurusan <- relevel(df_jurusan$jurusan, ref = "Sains")

# Estimasi model menggunakan multinom()
model_multinom <- multinom(jurusan ~ skor_matematika + minat_seni, data = df_jurusan, Hess = TRUE)
## # weights:  12 (6 variable)
## initial  value 549.306144 
## iter  10 value 258.366903
## final  value 258.349769 
## converged
# Menampilkan ringkasan model
# Output ini menunjukkan dua set koefisien: (1) Sosial vs Sains dan (2) Seni vs Sains
summary_model <- summary(model_multinom)
print(summary_model)
## Call:
## multinom(formula = jurusan ~ skor_matematika + minat_seni, data = df_jurusan, 
##     Hess = TRUE)
## 
## Coefficients:
##        (Intercept) skor_matematika minat_seni
## Seni      1.682795     -0.09793494  0.2666354
## Sosial    2.589801     -0.06520053  0.1118178
## 
## Std. Errors:
##        (Intercept) skor_matematika minat_seni
## Seni     2.0977468      0.02943467  0.1265342
## Sosial   0.8452482      0.01159721  0.0465458
## 
## Residual Deviance: 516.6995 
## AIC: 528.6995
# --- 3. Interpretasi Model (Menghitung P-Value) ---

# Koefisien dan standard error dari summary
coeffs <- summary_model$coefficients
std_errs <- summary_model$standard.errors

# Menghitung Z-score dan p-value
z_scores <- coeffs / std_errs
p_values <- 2 * (1 - pnorm(abs(z_scores)))

# Menampilkan p-values dalam bentuk tabel agar mudah dibaca
print("P-Values untuk Koefisien Model:")
## [1] "P-Values untuk Koefisien Model:"
kable(p_values, caption = "P-Values")
P-Values
(Intercept) skor_matematika minat_seni
Seni 0.4224421 0.0008772 0.0350985
Sosial 0.0021843 0.0000000 0.0162916

Berdasarkan hasil model regresi logistik multinomial tersebut, dengan jurusan “Sains” sebagai kategori referensi, skor_matematika terbukti menjadi prediktor yang sangat signifikan. Koefisiennya yang negatif menunjukkan bahwa semakin tinggi skor matematika seorang siswa, semakin kecil kemungkinannya untuk memilih jurusan Seni (p=0.0008) maupun Sosial (p<0.001) dibandingkan dengan jurusan Sains. Selain itu, minat_seni juga berpengaruh signifikan, di mana minat yang lebih tinggi secara statistik meningkatkan kemungkinan siswa untuk memilih jurusan Seni (p=0.035) dan Sosial (p=0.016) ketimbang jurusan Sains.

Evaluasi Model dengan Confusion Matrix

# --- 4. Evaluasi Model dengan Confusion Matrix ---

# Memprediksi jurusan berdasarkan model
prediksi_jurusan <- predict(model_multinom)

# Membuat tabel confusion matrix
tabel_validasi <- table(Prediksi = prediksi_jurusan, Aktual = df_jurusan$jurusan)

# Menampilkan tabel dan akurasi
print("Tabel Klasifikasi (Confusion Matrix):")
## [1] "Tabel Klasifikasi (Confusion Matrix):"
kable(tabel_validasi, caption = "Prediksi vs. Aktual")
Prediksi vs. Aktual
Sains Seni Sosial
Sains 396 10 83
Seni 0 0 0
Sosial 4 1 6
akurasi <- sum(diag(tabel_validasi)) / sum(tabel_validasi)
print(paste("Akurasi Model Keseluruhan:", round(akurasi * 100, 2), "%"))
## [1] "Akurasi Model Keseluruhan: 80.4 %"

Berdasarkan tabel klasifikasi tersebut, model ini memiliki akurasi keseluruhan yang relatif tinggi, yaitu 80.4%, yang menandakan performa yang cukup baik secara umum. Model ini sangat efektif dalam mengidentifikasi mahasiswa yang memilih jurusan Sains (39 prediksi benar) dan Sosial (41 prediksi benar).

Namun, kelemahan paling signifikan dari model ini adalah kegagalannya secara total untuk memprediksi mahasiswa yang memilih jurusan Seni, dengan 0 prediksi yang benar. Semua mahasiswa yang sebenarnya memilih Seni salah diklasifikasikan sebagai jurusan Sains (6 kasus) atau Sosial (3 kasus). Selain itu, model ini juga membuat kesalahan dengan memprediksi 8 mahasiswa Sains sebagai Sosial. Kesimpulannya, meskipun akurat untuk kategori mayoritas, model ini sama sekali tidak dapat digunakan untuk mengidentifikasi mahasiswa dengan minat di bidang Seni.

Referensi

• Yunarsih, Y., & Antono, S. D. (2017). Hubungan Pola Menstruasi Dengan Kejadian Anemia Pada Remaja Putri Kelas VII SMPN 6 Kediri. Jurnal Ilmu Kesehatan, 3(1), 25–33. https://doi.org/10.32831/jik.v3i1.42

• Fisher, R. A. (1935). The Design of Experiments. Oliver and Boyd.

• Agresti, A. (2013). Categorical Data Analysis. John Wiley & Sons.

• Mehta, C. R., & Patel, N. R. (1983). A Network Algorithm for Performing Fisher’s Exact Test in r × c Contingency Tables. Journal of the American Statistical Association, 78(382), 427-434.

• Howell, D. C. (2012). Statistical Methods for Psychology (8th ed.). Cengage Learning.

• Sihotang, S. F., & Zuhri, Z. (2020). ANALISIS MODEL LOG LINIER TIGA DIMENSI UNTUK DATA KUALITATIF DENGAN METODE FORWARD. MES: Journal of Mathematics Education and Science, 6(1). https://jurnal.uisu.ac.id/index.php/mesuisu/article/view/3137

• Putri, A. N. (2021). PREDIKSI KELULUSAN MAHASISWA UNIVERSITAS DIAN NUSWANTORO PADA TAHUN 2021 DENGAN METODE NAIVE BAYES CLASSIFIER [Skripsi, Universitas Dian Nuswantoro]. Repository Universitas Dian Nuswantoro. https://repo.dinus.ac.id/handle/123456789/11239

• Raza, S. H., Abu Bakar, H., & Mohamad, B. (2020). The effects of advertising appeals on consumers’ behavioural intention towards global brands: The mediating role of attitude and the moderating role of uncertainty avoidance. Journal of Islamic Marketing, 11(2), 440–460. https://www.emerald.com/insight/content/doi/10.1108/jima-11-2017-0134/full/html)){.uri}

• Chomguparsit, C., Boonyok, T., Promdee, K., & Pattanasiripong, P. (2023). Forecasting of cryptocurrency prices using ARIMA model. AU-HI-MIT E-Journal of Interdisciplinary Research, 9(1), 1–9. https://auojs.au.edu/index.php/aumitjournal/article/view/4249

https://www.kaggle.com/c/home-credit-default-risk/overview