CHAPTER 1 : TABEL KONTINGENSI 2 ARAH

1.1. TABEL KONTINGENSI

Tabel kontingensi adalah tabel klasifikasi silang dari variabel-variabel yang bersifat kategori. Tabel kontingensi dapat menggambarkan hubungan diantara variabel-variabel kategori tersebut. Jenis tabel kontingensi berdasarkan jumlah variabel kategoriknya ada tiga, yaitu :

  1. Tabel Kontingensi Dua Arah adalah tabel kontingensi yang melibatkan dua variabel kategorik, biasanya dinamakan variabel X dan Y. Tabel ini memiliki dimensi I × J yang mencerminkan hubungan antara dua variabel kategori dengan I kategori dalam variabel pertama dan J kategori dalam variabel kedua. Secara keseluruhan, Tabel Kontingensi 2 × 2 adalah tabel kontingensi yang paling sederhana karena hanya memiliki 2 kategori pada variabel X dan 2 kategori pada variabel Y.

    (Gambar 1. Struktur Tabel Kontingensi 2 × 2)

  2. Tabel Kontingensi Tiga Arah adalah tabel kontingensi yang melibatkan tiga variabel kategorik. Tabel ini memiliki tiga dimensi yaitu I × J × K yang menyatakan I kategori pada variabel pertama, J kategori pada variabel kedua, dan K kategori pada variabel ketiga.

  3. Tabel Kontingensi Multiarah adalah tabel kontingensi yang melibatkan lebih dari tiga variabel kategorik.

Contoh Kasus Tabel Kontingensi Dua Arah

Untuk memahami bagaimana tabel kontingensi disusun, perhatikan contoh kasus berikut :

Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X

Di sebuah rumah sakit penelitian, sekelompok ilmuwan medis melakukan studi klinis untuk membandingkan efektivitas dua jenis obat, Obat A dan Obat B, dalam menyembuhkan pasien yang terinfeksi Penyakit X. Penyakit ini telah menjadi masalah kesehatan di beberapa wilayah, dengan banyak pasien mengalami gejala yang berkepanjangan meskipun sudah mendapatkan pengobatan standar. Oleh karena itu, tim dokter dan peneliti ingin mengetahui apakah Obat A lebih efektif dibandingkan Obat B dalam mempercepat proses penyembuhan.

Penelitian ini dilakukan pada 170 pasien, yang secara acak dibagi ke dalam dua kelompok. Sebanyak 80 pasien menerima Obat A, sementara 90 pasien menerima Obat B. Setelah beberapa minggu menjalani pengobatan, tim peneliti mencatat hasilnya. Dari 80 pasien yang menerima Obat A, 50 pasien sembuh, sedangkan 30 pasien tidak sembuh. Di sisi lain, dari 90 pasien yang menerima Obat B, 40 pasien sembuh, dan 50 pasien tidak sembuh.

Hasil dalam penelitian tersebut dapat dituangkan dalam Tabel Kontingensi 2 × 2 :

# Definisi nilai dalam tabel kontingensi
n11 <- 50  # Baris 1, Kolom 1
n21 <- 40  # Baris 2, Kolom 1
n.1 <- 90  # Total Kolom 1

n12 <- 30  # Baris 1, Kolom 2
n22 <- 50  # Baris 2, Kolom 2
n.2 <- 80  # Total Kolom 2

n1. <- 80  # Total Baris 1
n2. <- 90  # Total Baris 2
n.. <- 170 # Total Keseluruhan

# Membuat tabel kontingensi
tk <- matrix(c(n11, n12, n1.,
              n21, n22, n2.,
              n.1, n.2, n..), 
              nrow = 3, byrow = TRUE)

# Menambahkan nama baris dan kolom
rownames(tk) <- c("Obat A", "Obat B", "Total")
colnames(tk) <- c("Sembuh", "Tidak Sembuh", "Total")

# Menampilkan tabel kontingensi
print(tk)
##        Sembuh Tidak Sembuh Total
## Obat A     50           30    80
## Obat B     40           50    90
## Total      90           80   170
Jenis Obat Sembuh Tidak Sembuh Total
Obat A 50 30 80
Obat B 40 50 90
Total 90 80 170

1.2. PELUANG DALAM TABEL KONTINGENSI

Dari tabel kontingensi, probabilitas atau peluang dapat dihitung untuk memahami pola hubungan antarvariabel. Dalam analisis data kategorikal, terdapat tiga jenis peluang utama yang dapat dihitung dari tabel kontingensi, yaitu :

  • Peluang marjinal : Mengukur probabilitas kejadian tertentu tanpa mempertimbangkan kejadian lainnya.

  • Peluang bersama : Mengukur probabilitas dua kejadian terjadi bersamaan.

  • Peluang bersyarat : Mengukur probabilitas suatu kejadian terjadi dengan asumsi kejadian lain telah terjadi.

Untuk lebih memahami konsep ketiga peluang dalam tabel kontingensi ini, kita akan membahas perhitungan dan penerapannya pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X yang sudah dipaparkan pada bagian Tabel Kontingensi.

1.2.1. Peluang Marjinal

Peluang marjinal adalah probabilitas suatu kejadian tanpa memperhitungkan kejadian lainnya. Rumus dari peluang marjinal adalah\[ P(A) = \frac{\text{Jumlah kejadian A}}{\text{Total kejadian}} \]Berikut adalah perhitungan peluang marjinal pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X

P_S <- n.1/n.. ; P_S # Peluang Sembuh
## [1] 0.5294118

\[ P(Sembuh) = \frac{\text{Jumlah Pasien Sembuh}}{\text{Total Pasien}} = \frac{90}{170} = 0.529 \]

P_TS <- n.2/n.. ; P_TS # Peluang Tidak Sembuh
## [1] 0.4705882

\[ P(Tidak Sembuh) = \frac{\text{Jumlah Pasien Tidak Sembuh}}{\text{Total Pasien}} = \frac{80}{170} = 0.471 \]

P_A <- n1./n.. ; P_A # Peluang Obat A
## [1] 0.4705882

\[ P(Obat A) = \frac{\text{Jumlah Pasien Mengonsumsi Obat A}}{\text{Total Pasien}} = \frac{80}{170} = 0.471 \]

P_B <- n2./n.. ; P_B # Peluang Obat B
## [1] 0.5294118

\[ P(Obat B) = \frac{\text{Jumlah Pasien Mengonsumsi Obat B}}{\text{Total Pasien}} = \frac{90}{170} = 0.529 \]

Berdasarkan perhitungan peluang marjinal, dapat disimpulkan bahwa :

  • Peluang pasien mengonsumsi Obat A adalah 0.471 atau 47.1%, sedangkan peluang pasien mengonsumsi Obat B adalah 0.529 atau 52.9%. Dari distribusi pasien berdasarkan jenis obat yang digunakan, terlihat bahwa jumlah pasien yang menggunakan Obat B sedikit lebih banyak dibandingkan Obat A.

  • Peluang pasien sembuh adalah 0.529 atau sekitar 52.9%, yang menunjukkan bahwa lebih dari setengah pasien yang diuji berhasil sembuh.

  • Peluang pasien tidak sembuh adalah 0.471 atau sekitar 47.1%, yang berarti hampir separuh pasien masih mengalami penyakit meskipun telah menjalani pengobatan.

1.2.2. Peluang Bersama

Peluang bersama adalah probabilitas terjadinya dua kejadian secara bersamaan. Rumus dari peluang bersama adalah\[ P(A \cap B) = \frac{\text{Jumlah kejadian A dan B}}{\text{Total kejadian}} \]

Berikut adalah perhitungan peluang bersama pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X

P_AnS <- n11/n.. ; P_AnS # Peluang Mengonsumsi Obat A dan Sembuh
## [1] 0.2941176

\[ P(Obat A \cap Sembuh) = \frac{\text{Jumlah Pasien Mengonsumsi Obat A dan Sembuh}}{\text{Total kejadian}} = \frac{50}{170} = 0.294 \]

P_AnTS <- n12/n.. ; P_AnTS # Peluang Mengonsumsi Obat A dan Tidak Sembuh
## [1] 0.1764706

\[ P(Obat A \cap Tidak Sembuh) = \frac{\text{Jumlah Pasien Mengonsumsi Obat A dan Tidak Sembuh}}{\text{Total kejadian}} = \frac{30}{170} = 0.176 \]

P_BnS <- n21/n.. ; P_BnS # Peluang Mengonsumsi Obat B dan Sembuh
## [1] 0.2352941

\[ P(Obat B \cap Sembuh) = \frac{\text{Jumlah Pasien Mengonsumsi Obat B dan Sembuh}}{\text{Total kejadian}} = \frac{40}{170} = 0.235 \]

P_BnTS <- n22/n.. ; P_BnTS # Peluang Mengonsumsi Obat B dan Tidak Sembuh
## [1] 0.2941176

\[ P(Obat B \cap Sembuh) = \frac{\text{Jumlah Pasien Mengonsumsi Obat B dan Tidak Sembuh}}{\text{Total kejadian}} = \frac{50}{170} = 0.294 \]

Berdasarkan perhitungan peluang bersama, dapat disimpulkan bahwa :

peluangbersama <- matrix(c(P_AnS, P_AnTS, P_BnS, P_BnTS), nrow = 2, byrow = TRUE)

# Menambahkan nama baris dan kolom
rownames(peluangbersama) <- c("Obat A", "Obat B")
colnames(peluangbersama) <- c("Sembuh", "Tidak Sembuh")

# Menampilkan tabel peluang bersama
print(peluangbersama)
##           Sembuh Tidak Sembuh
## Obat A 0.2941176    0.1764706
## Obat B 0.2352941    0.2941176
  • Peluang pasien mengonsumsi Obat A dan sembuh adalah 0.294 (29.4%).

  • Peluang pasien mengonsumsi Obat A dan tidak sembuh adalah 0.176 (17.6%).

  • Peluang pasien mengonsumsi Obat B dan sembuh adalah 0.235 (23.5%).

  • Peluang pasien mengonsumsi Obat B dan tidak sembuh adalah 0.294 (29.4%).

1.2.3. Peluang Bersyarat

Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan asumsi kejadian lain telah terjadi. Rumus dari peluang bersyarat adalah \[ P(A | B) = \frac{P(A \cap B)}{P(B)} \]

Berikut adalah perhitungan peluang bersama pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X

P_SnA <- P_AnS
P_SlA <- P_SnA/P_A ; P_SlA # Peluang Sembuh Setelah Mengonsumsi  Obat A
## [1] 0.625

\[ P(Sembuh | Obat A) = \frac{P(Sembuh \cap Obat A)}{P(Obat A)} = \frac{0.294}{0.471} = 0.625 \]

P_TSnA <- P_AnTS
P_TSlA <- P_TSnA/P_A ; P_TSlA # Peluang Tidak Sembuh Setelah Mengonsumsi Obat A
## [1] 0.375

\[ P(Tidak Sembuh | Obat A) = \frac{P(Tidak Sembuh \cap Obat A)}{P(Obat A)} = \frac{0.176}{0.471} = 0.375 \]

P_SnB <- P_BnS
P_SlB <- P_SnB/P_B ; P_SlB # Peluang Sembuh Setelah Mengonsumsi Obat B
## [1] 0.4444444

\[ P(Sembuh | Obat B) = \frac{P(Sembuh \cap Obat B)}{P(Obat B)} = \frac{0.235}{0.529} = 0.444 \]

P_TSnB <- P_BnTS
P_TSlB <- P_TSnB/P_B ; P_TSlB # Peluang Tidak Sembuh Setelah Mengonsumsi Obat B
## [1] 0.5555556

\[ P(Tidak Sembuh | Obat B) = \frac{P(Tidak Sembuh \cap Obat B)}{P(Obat B)} = \frac{0.294}{0.529} = 0.556 \]

P_AlS <- P_AnS/P_S ; P_AlS # Peluang Mengonsumsi Obat A Setelah Sembuh
## [1] 0.5555556

\[ P(Obat A | Sembuh) = \frac{P(Obat A \cap Sembuh)}{P(Sembuh)} = \frac{0.294}{0.529} = 0.556 \]

P_BlS <- P_BnS/P_S ; P_BlS # Peluang Mengonsumsi Obat B Setelah Sembuh
## [1] 0.4444444

\[ P(Obat B | Sembuh) = \frac{P(Obat B \cap Sembuh)}{P(Sembuh)} = \frac{0.235}{0.529} = 0.444 \]

P_AlTS <- P_AnTS/P_TS ; P_AlTS # Peluang Mengonsumsi Obat A Setelah Tidak Sembuh
## [1] 0.375

\[ P(Obat A | Tidak Sembuh) = \frac{P(Obat A \cap Tidak Sembuh)}{P(Tidak Sembuh)} = \frac{0.176}{0.471} = 0.375 \]

P_BlTS <- P_BnTS/P_TS ; P_BlTS # Peluang Mengonsumsi Obat B Setelah Tidak Sembuh
## [1] 0.625

\[ P(Obat B | Tidak Sembuh) = \frac{P(Obat B \cap Tidak Sembuh)}{P(Tidak Sembuh)} = \frac{0.294}{0.471} = 0.625 \]

Berdasarkan perhitungan peluang bersyarat, dapat disimpulkan bahwa :

  • Peluang pasien sembuh setelah mengonsumsi Obat A adalah 0.625 (62.5%).
  • Peluang pasien tidak sembuh setelah mengonsumsi Obat A adalah 0.375 (37.5%).
  • Peluang pasien sembuh setelah mengonsumsi Obat B adalah 0.444 (44.4%).
  • Peluang pasien tidak sembuh setelah mengonsumsi Obat B adalah 0.556 (55.6%).
  • Peluang pasien yang sembuh mengonsumsi Obat A adalah 0.556 (55.6%).
  • Peluang pasien yang sembuh mengonsumsi Obat B adalah 0.444 (44.4%).
  • Peluang pasien yang tidak sembuh mengonsumsi Obat A adalah 0.375 (37.5%).
  • Peluang pasien yang tidak sembuh mengonsumsi Obat B adalah 0.625 (62.5%).

CHAPTER 2 : DESAIN SAMPLING

Dalam analisis data kategorik, pemilihan desain sampling sangat penting untuk memastikan validitas dan keakuratan hasil yang diperoleh. Desain sampling yang umum digunakan dalam penelitian dengan data kategorik meliputi eksperimen, studi kohort, dan studi kasus-kontrol. Masing-masing desain sampling tersebut memiliki karakteristik dan tujuan yang berbeda dalam menggali hubungan antara variabel.

2.1. Eksperimen

Eksperimen adalah metode penelitian di mana peneliti secara aktif mengontrol atau memanipulasi satu atau lebih variabel independen untuk mengamati dampaknya terhadap variabel dependen. Desain ini sering digunakan dalam uji klinis dan studi intervensi untuk mengevaluasi efektivitas suatu perlakuan atau pengobatan. Ciri-ciri dari eksperimen yaitu :

  • Peneliti memiliki kontrol penuh terhadap variabel yang diteliti.

  • Partisipan dibagi secara acak ke dalam kelompok perlakuan dan kontrol (Randomized Controlled Trial - RCT).

  • Memungkinkan analisis hubungan sebab-akibat antara variabel.

2.2. Studi Kohort

Studi kohort adalah metode penelitian observasional yang digunakan untuk melacak kelompok individu dalam jangka waktu tertentu guna melihat bagaimana faktor tertentu mempengaruhi outcome atau kejadian penyakit. Studi ini dapat bersifat prospektif atau retrospektif. Ciri-ciri dari studi kohort yaitu :

  • Mengamati kelompok individu dari waktu ke waktu.

  • Cocok untuk meneliti hubungan antara faktor risiko dan outcome.

  • Bisa bersifat prospektif (dimulai dari paparan hingga kejadian) atau retrospektif (dimulai dari kejadian lalu ditelusuri paparan sebelumnya).

(Gambar 2. Perbandingan Eksperimen dan Studi Kohort)

2.3. Studi Kasus-Kontrol

Studi kasus-kontrol adalah metode penelitian observasional yang digunakan untuk menyelidiki hubungan antara faktor risiko dan outcome dengan membandingkan individu yang mengalami suatu kondisi dengan individu yang tidak mengalaminya. Studi ini bekerja mundur dengan menelusuri paparan sebelumnya. Ciri-ciri studi kasus-kontrol yaitu :

  • Dimulai dari outcome dan menelusuri kembali faktor risikonya.
  • Lebih cepat dan lebih murah dibandingkan studi kohort atau eksperimen.
  • Biasanya digunakan untuk penyakit yang jarang terjadi.

(Gambar 3. Perbandingan Studi Kohort dan Studi Kasus-Kontrol)

CHAPTER 3 : UKURAN ASOSIASI TABEL KONTINGENSI 2 × 2

Ukuran asosiasi digunakan dalam analisis data kategorik untuk mengukur hubungan antara dua variabel dalam sebuah studi. Dengan menggunakan ukuran asosiasi, kita dapat memahami seberapa kuat dan arah hubungan antara variabel independen (faktor risiko atau perlakuan) dan variabel dependen (outcome atau kejadian).

3.1. Beda Peluang (Risk Difference, RD)

Beda peluang atau Risk Difference (RD) adalah selisih antara peluang kejadian dalam dua kelompok. Rumus Beda Peluang adalah

\[ RD = P(Outcome|X=1)-P(Outcome|X=0) \]

Adapun interpretasi dari hasil RD adalah sebagai berikut.

  • Jika RD < 0, maka outcome lebih sering terjadi pada kelompok X = 0.

  • Jika RD = 0, maka tidak ada perbedaan antara kelompok X = 0 dan X =

  • Jika RD > 0, maka outcome lebih sering terjadi pada kelompok X = 1.

Dalam Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X, maka yang disebut outcome adalah hasil dari konsumsi obat, yaitu sembuh. Pada perhitungan ini, X = 0 adalah obat B dan X = 1 adalah obat A, tetapi hal ini dapat dibalik disesuaikan dengan keinginan peneliti. Berikut adalah perhitungan ukuran asosiasi menggunakan Beda Peluang (Risk Difference).

RD_S <- P_SlA - P_SlB ; RD_S # Beda Peluang Pasien Sembuh
## [1] 0.1805556

\[ \text{RD Sembuh} = P(Sembuh|Obat A)-P(Sembuh|Obat B) = 0.625 - 0.444 = 0.181 \]

Berdasarkan perhitungan, dapat disimpulkan bahwa pasien yang mengonsumsi obat A memiliki peluang sembuh lebih besar 0.181 dibandingkan pasien yang mengonsumsi obat B.

Namun, kelemahan dari RD adalah interpretasinya tidak selalu mudah dipahami oleh orang awam. RD hanya menunjukkan selisih peluang absolut tanpa memberikan skala perbandingan yang jelas. Contohnya, jika RD = 0.181, kita hanya tahu bahwa Obat A memiliki peluang kesembuhan lebih besar 0.181 dibandingkan Obat B, tetapi tidak tahu seberapa besar risikonya dibandingkan dengan Obat B. Sementara itu, orang awam lebih mudah memahami perbandingan dalam bentuk “X kali lipat” dibandingkan hanya selisih angka. Oleh karena itu, dibutuhkan ukuran asosiasi lain yang berbasis rasio (bukan selisih), seperti ukuran-ukuran asosiasi yang dibahas selanjutnya.

3.2. Resiko Relatif (Relative Risk, RR)

Resiko Relatif (RR) digunakan untuk membandingkan peluang terjadinya suatu kejadian antara kelompok yang terpapar dan tidak terpapar. Rumus dari RR adalah\[ RR = \frac{P(Outcome|X=1)}{P(Outcome|X=0)} \]

Adapun interpretasi dari hasil yang diperoleh adalah sebagai berikut :

  • RR < 1, maka resiko lebih tinggi pada kelompok X = 0.

  • RR = 1, maka tidak ada perbedaan resiko antara kelompok X = 0 dan X = 1.

  • RR > 1, maka resiko lebih tinggi pada kelompok X = 1.

Berikut adalah perhitungan RR pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X. Sama seperti sebelumnya, yang disebut outcome adalah kesembuhan pasien serta dalam perhitungan ini, X = 0 adalah obat B dan X = 1 adalah obat A.

RR_S <- P_SlA / P_SlB ; RR_S # Rasio Relatif Pasien Sembuh
## [1] 1.40625

\[ \text{RR Sembuh} = \frac{P(Sembuh|Obat A)}{P(Sembuh|Obat B)} = \frac{0.625}{0.444} = 1.406 \]

Berdasarkan perhitungan, dapat disimpulkan bahwa pasien yang mengonsumsi obat A beresiko 1.406 kali lipat atau 140.6% kali lipat lebih tinggi untuk sembuh dibandingkan pasien yang mengonsumsi obat B.

3.3. Rasio Odds (Odds Ratio, OR)

Berbeda dengan probabilitas yang mengukur kemungkinan suatu kejadian terjadi dari total kejadian yang mungkin, odds adalah rasio antara probabilitas kejadian terjadi dibandingkan tidak terjadi. Salah satu desain sampling pada data kategorik, Studi Kasus-Kontrol, tidak bisa menghitung probabilitas secara langsung, karena jumlah kasus dan kontrol ditentukan oleh desain studi. Oleh karena itu, digunakanlah Odds Ratio (OR) untuk membandingkan odds antar kelompok. Rumus dari Odds Ratio adalah\[ OR = \frac{\frac{P(Outcome|X=1)}{1-P(Outcome|X=1)}}{\frac{P(Outcome|X=0)}{1-P(Outcome|X=0)}} \]

Berikut adalah perhitungan OR pada Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X.

pembilang <- P_SlA/P_TSlA 
penyebut <- P_SlB/P_TSlB
OR <- pembilang/penyebut ; OR
## [1] 2.083333

\[ OR = \frac{\frac{P(Sembuh|Obat A)}{1-P(Sembuh|Obat A)}}{\frac{P(Sembuh|Obat B)}{1-P(Sembuh|Obat B)}} = \frac{\frac{P(Sembuh|Obat A)}{P(Tidak Sembuh|Obat A)}}{\frac{P(Sembuh|Obat B)}{P(Tidak Sembuh|Obat B)}} = \frac{\frac{0.625}{0.375}}{\frac{0.444}{0.556}} = \frac{1.667}{0.8} = 2.083 \]

Berdasarkan perhitungan, dapat disimpulkan bahwa pasien yang mengonsumsi obat A beresiko 2.083 kali lipat atau 208.3% kali lipat lebih tinggi untuk sembuh dibandingkan pasien yang mengonsumsi obat B.

Hasil dari Resiko Relatif (RR) dan Rasio Odds (OR) menunjukkan interpretasi yang sama, tetapi dengan hasil yang berbeda. Hal ini karena kedua ukuran asosiasi tersebut menggunakan pendekatan yang berbeda dalam menghitung hubungan antara paparan dan outcome serta memiliki perbedaan dalam penggunaannya disesuaikan dengan desain sampling yang digunakan. Berikut adalah penggunaan RR dan OR pada desain sampling :

  • Relative Risk (RR) digunakan dalam studi kohort dan eksperimen karena dapat mengukur resiko absolut dari suatu kejadian dalam populasi yang diteliti.

  • Odds Ratio (OR) digunakan dalam studi kasus-kontrol, di mana jumlah kasus dan kontrol sudah ditentukan dalam desain penelitian, sehingga kita tidak bisa menghitung probabilitas absolut langsung.

CHAPTER 4 : INFERENSI TABEL KONTINGENSI DUA ARAH

4.1. UJI HIPOTESIS

4.1.1. Uji Proporsi

Uji proporsi digunakan untuk menguji apakah proporsi suatu kategori dalam suatu populasi berbeda dengan nilai tertentu atau proporsi dalam dua grup yang berbeda. Uji ini sering digunakan pada data kategorik untuk memverifikasi klaim atau perbedaan antara proporsi dalam kelompok.

Hipotesis

H0 :Tidak ada perbedaan proporsi antara dua kelompok, yaitu p1 = p2

H1 : Terdapat perbedaan proporsi antara dua kelompok, yaitu p1 ≠ p2

Statistik Uji

Estimasi proporsi dalam masing-masing kelompok :

\[ \hat{p}_1=\frac{n_{11}}{n_1}, \quad \hat{p}_2 = \frac{n_{21}}{n_2} \]

Estimasi proporsi gabungan :

\[ \hat{p} = \frac{n_{11} + n_{21}}{n_1 + n_2} \]

Statistik uji untuk uji proporsi dua sampel :

\[ Z=\frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]

Titik Kritis

Uji proporsi dapat dilakukan dengan uji dua sisi atau satu sisi tergantung pada hipotesis yang diajukan. Titik kritis untuk uji dua sisi adalah

\[ Z_{\text{kritis}} = \pm Z_{\alpha/2} \]

Kriteria Uji

Tolak H0 jika Z > Z kritis atau Z < -Z kritis.

Berikut adalah contoh perhitungan uji proporsi :

Misalkan kita ingin menguji apakah terdapat perbedaan proporsi antara pria dan wanita yang merokok. Kita memiliki data survei dalam bentuk tabel kontingensi sebagai berikut :

Merokok Tidak Merokok Total
Pria 60 40 100
Wanita 50 100 150
Total 110 140 250
n11 <- 60
n12 <- 40
n1. <- 100
n21 <- 50
n22 <- 100
n2. <- 150
n.1 <- 110
n.2 <- 140
n.. <- 250

data <- matrix(c(n11, n12, n1.,
              n21, n22, n2.,
              n.1, n.2, n..), 
              nrow = 3, byrow = TRUE)
rownames(data) <- c("Pria", "Wanita", "Total")
colnames(data) <- c("Merokok", "Tidak Merokok", "Total")
data
##        Merokok Tidak Merokok Total
## Pria        60            40   100
## Wanita      50           100   150
## Total      110           140   250

Hipotesis

H0 : Tidak ada perbedaan proporsi antara pria merokok dan wanita merokok (p1 = p2)

H1 : Terdapat perbedaan proporsi antara pria merokok dan wanita merokok (p1 ≠ p2)

Taraf Signifikansi

α = 5%

Statistik Uji

Perhitungan manual

Estimasi proporsi masing-masing kelompok

p1_duga <- n11/n1. ; p1_duga # Proporsi Pria Merokok
## [1] 0.6
p2_duga <- n21/n2. ; p2_duga # Proporsi Wanita Merokok
## [1] 0.3333333

\[ \hat{p}_1=\frac{n_{11}}{n_1}=\frac{60}{100}=0.6, \quad \hat{p}_2 = \frac{n_{21}}{n_2}=\frac{50}{150}=0.33 \] Estimasi proporsi gabungan dua kelompok

p_duga <- (n11 + n21)/(n1. + n2.); p_duga # Proporsi Gabungan Pria Merokok dan Wanita Merokok
## [1] 0.44

\[ \hat{p} = \frac{n_{11} + n_{21}}{n_1 + n_2} = \frac{60+50}{100+150} = \frac{110}{250} = 0.44 \]

Z = (p1_duga - p2_duga)/(sqrt(p_duga)*(1-p_duga)*(1/(n1.+n2.))); Z # Statistik Uji
## [1] 179.471

\[ Z=\frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} = \frac{0.6-0.33}{\sqrt{(0.44)(1-0.44)(\frac{1}{100}+\frac{1}{150})}} \]

Berdasarkan perhitungan manual, diperoleh Z = 179.471

Perhitungan dengan package

prop.test(c(n11, n21), c(n1., n2.), alternative = "two.sided")
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(n11, n21) out of c(n1., n2.)
## X-squared = 16.251, df = 1, p-value = 5.549e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.1362246 0.3971088
## sample estimates:
##    prop 1    prop 2 
## 0.6000000 0.3333333

Berdasarkan perhitungan dengan package, diperoleh pvalue = 5.549 × 10^-5

Titik Kritis

alpha <- 0.05
Z_krit <- qnorm(1-alpha/2); Z_krit
## [1] 1.959964

Diperoleh Z tabel = 1.96

Kriteria Uji

Stat uji Z : Tolak H0 jika Z < -Z tabel atau Z > Z tabel dengan Z tabel

Stat uji pvalue : Tolak H0 jika pvalue < α

Keputusan

Z (179.471) > Z tabel (1.96) dan pvalue (5.549 × 10^-5) < α (0.05) sehingga H0 ditolak

Kesimpulan
Dengan taraf signifikansi 5%, dapat disimpulkan bahwa terdapat perbedaan proporsi antara laki-laki yang merokok dan perempuan yang merokok. Dengan kata lain, laki-laki dan perempuan tidak punya kebiasaan merokok yang sama secara proporsi, dan perbedaan itu bukan karena kebetulan sampel saja, tapi signifikan secara statistik.

4.1.2. Uji Asosiasi

Uji asosiasi pada tabel kontingensi 2×2 merupakan metode statistik yang digunakan untuk mengetahui apakah terdapat hubungan atau keterkaitan antara dua variabel kategorik yang masing-masing terdiri dari dua kategori. Tiga ukuran utama dalam uji asosiasi adalah Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) yang sudah dibahas di bagian sebelumnya.

Menggunakan Kasus : Efektivitas Obat A dan Obat B dalam Menyembuhkan Penyakit X sebelumnya, berikut adalah pengujian hipotesis untuk Uji Asosiasi.

# Definisi nilai dalam tabel kontingensi
n11 <- 50  # Baris 1, Kolom 1
n21 <- 40  # Baris 2, Kolom 1
n.1 <- 90  # Total Kolom 1

n12 <- 30  # Baris 1, Kolom 2
n22 <- 50  # Baris 2, Kolom 2
n.2 <- 80  # Total Kolom 2

n1. <- 80  # Total Baris 1
n2. <- 90  # Total Baris 2
n.. <- 170 # Total Keseluruhan

# Membuat tabel kontingensi
tk <- matrix(c(n11, n12, n1.,
              n21, n22, n2.,
              n.1, n.2, n..), 
              nrow = 3, byrow = TRUE)

# Menambahkan nama baris dan kolom
rownames(tk) <- c("Obat A", "Obat B", "Total")
colnames(tk) <- c("Sembuh", "Tidak Sembuh", "Total")

# Menampilkan tabel kontingensi
print(tk)
##        Sembuh Tidak Sembuh Total
## Obat A     50           30    80
## Obat B     40           50    90
## Total      90           80   170

Hipotesis

H0 : Tidak ada sosisasi antara dua variabel

H1 : Terdapat asosiasi antara dua variabel

Taraf Signifikansi

α = 5%

Statistik Uji

Menggunakan Risk Difference (RD) :

p1 <- n11 / n1.
p2 <- n21 / n2.
rd <- p1 - p2
se_rd <- sqrt((p1 * (1 - p1) / n1.) + (p2 * (1 - p2) / n2.))
z_rd <- rd / se_rd ; z_rd
## [1] 2.397165

Diperoleh statistik uji Z = 2.397

Menggunakan Relative Risk (RR) :

rr <- p1 / p2
se_ln_rr <- sqrt((1 / n11) - (1 / n1.) + (1 / n21) - (1 / n2.))
z_rr <- log(rr) / se_ln_rr ; z_rr
## [1] 2.331131

Diperoleh statistik uji Z = 2.33

Menggunakan Odds Ratio (OR) :

or <- (n11 * n22) / (n12 * n21)
se_ln_or <- sqrt((1 / n11) + (1 / n12) + (1 / n21) + (1 / n22))
z_or <- log(or) / se_ln_or ; z_or
## [1] 2.340601

Diperoleh statistik uji Z = 2.34

Titik Kritis

alpha <- 0.05
Z_krit <- qnorm(1-alpha/2); Z_krit
## [1] 1.959964

Kriteria Uji

Tolak H0 jika Z < -Z tabel atau Z > Z tabel dengan Z tabel

Keputusan

Uji asosiasi menggunakan RD : Z (2.397) > Z tabel (1.96) sehingga H0 ditolak

Uji asosiasi menggunakan RR : Z (2.33) > Z tabel (1.96) sehingga H0 ditolak

Uji asosiasi menggunakan OR : Z (2.34) > Z tabel (1.96) sehingga H0 ditolak

Kesimpulan

Berdasarkan analisis menggunakan tiga ukuran asosiasi, dengan taraf signifikansi 5%, dapat disimpulkan bahwa ada asosiasi yang signifikan —baik untuk Risk Difference (RD), Relative Risk (RR), maupun Odds Ratio (OR) — antara jenis obat (Obat A dan Obat B) dengan tingkat kesembuhan pasien.

4.1.3. Uji Independensi

4.1.3.1. Uji Chi Square

Uji Chi Square digunakan untuk menguji apakah ada hubungan antara dua variabel kategorikal. Rumus Chi Square adalah :

dimana

O adalah nilai observasi dalam tabel kontingensi

E adalah nilai yang diharapkan yang memiliki rumus :

dengan
dengan

Ri : total baris ke-i

Cj : total kolom ke-j

N : total sampel

Berikut adalah contoh perhitungan Uji Chi-Square. Misalkan kita ingin mengetahui apakah jenis minuman energi (A atau B) berasosiasi dengan kejadian insomnia pada sekelompok responden. Sebanyak 100 orang dibagi menjadi dua kelompok berdasarkan minuman yang dikonsumsi, dan hasil observasi sebagai berikut :

# Nilai masing-masing sel
n11 <- 20  # A, Ringan
n12 <- 10  # A, Berat
n13 <- 20  # A, Tidak

n21 <- 10  # B, Ringan
n22 <- 20  # B, Berat
n23 <- 20  # B, Tidak

# Total baris
n1. <- n11 + n12 + n13
n2. <- n21 + n22 + n23

# Total kolom
n.1 <- n11 + n21
n.2 <- n12 + n22
n.3 <- n13 + n23

# Total keseluruhan
n.. <- n1. + n2.

# Buat tabel kontingensi
tk2 <- matrix(c(n11, n12, n13, n1.,
                n21, n22, n23, n2.,
                n.1, n.2, n.3, n..),
              nrow = 3, byrow = TRUE)

# Tambahkan nama baris dan kolom
rownames(tk2) <- c("Minuman A", "Minuman B", "Total")
colnames(tk2) <- c("Insomnia Ringan", "Insomnia Berat", "Tidak Insomnia", "Total")

# Tampilkan tabel
print(tk2)
##           Insomnia Ringan Insomnia Berat Tidak Insomnia Total
## Minuman A              20             10             20    50
## Minuman B              10             20             20    50
## Total                  30             30             40   100

Hipotesis

H0 : Tidak ada hubungan antara dua variabel kategorik (jenis minuman energi dengan kejadian insomnia)

H1 : Terdapat hubungan antara dua variabel kategorik (jenis minuman energi dengan kejadian insomnia)

Taraf Signifikansi

α = 5%

Statistik Uji

Perhitungan Manual

Nilai Harapan (E)

E11 <- (n1. * n.1) / n..
E12 <- (n1. * n.2) / n..
E13 <- (n1. * n.3) / n..
E21 <- (n2. * n.1) / n..
E22 <- (n2. * n.2) / n..
E23 <- (n2. * n.3) / n..

expected <- matrix(c(E11, E12, E13,
                     E21, E22, E23), 
                   nrow = 2, byrow = TRUE)
print(expected)
##      [,1] [,2] [,3]
## [1,]   15   15   20
## [2,]   15   15   20

Nilai Observasi (O)

observed <- matrix(c(n11, n12, n13,
                     n21, n22, n23), 
                   nrow = 2, byrow = TRUE)
print(observed)
##      [,1] [,2] [,3]
## [1,]   20   10   20
## [2,]   10   20   20

Perhitungan x2

chi_manual <- sum((observed - expected)^2 / expected)
print(paste("x^2 =", chi_manual))
## [1] "x^2 = 6.66666666666667"

Diperoleh x2 = 6.667

Perhitungan dengan package

chisq_test <- chisq.test(observed)
print(chisq_test)
## 
##  Pearson's Chi-squared test
## 
## data:  observed
## X-squared = 6.6667, df = 2, p-value = 0.03567

Diperoleh pvalue = 0.03567

Titik Kritis

alpha <- 0.05
b <- 3 # byk kolom
k <- 2 # byk baris
df <- (b-1)*(k-1)

chi_crit <- qchisq(1 - alpha, df)
chi_crit
## [1] 5.991465

Diperoleh x2 kritis = 5.99

Kriteria Uji

Stat uji x2 : Tolak H0 jika x2 > x2 kritis

Stat uji pvalue : Tolak H0 jika pvalue < α

Keputusan

x2 (6.667) > x2 kritis (5.99) dan pvalue (0.03567) < α (0.05) sehingga H0 ditolak

Kesimpulan

Dengan taraf signifikansi 5%, dapat disimpulkan bahwa terdapat hubungan antara jenis minuman energi dengan kejadian insomnia.

4.1.3.2. Partisi Chi Square

Partisi Chi-Square digunakan untuk mengidentifkasi kategori mana dalam tabel kontingensi yang bertanggung jawab atas hubungan yang signifkan. Jika uji Chi-Square pada tabel kontingensi I×J signifkan, maka partisi Chi-Square memungkinkan kita untuk menguraikan efek hubungan dalam subkelompok yang lebih kecil. Adapun Partisi Chi Square sendiri dilakukan dengan memartisi data menjadi beberapa bagian tertentu, lalu melakukan Uji Chi Square terhadap masing-masing partisi data sehingga langkah pengujian hipotesisnya masih sama dengan Uji Chi Square.

Di bagian Uji Chi Square pada 1.5.3.1., diketahui bahwa terdapat hubungan yang signifikan antara Jenis Minuman Energi (A dan B) dengan Kejadian Insomnia (Insomnia RIngan, Insomnia Berat, Tidak Insomnia). Oleh karena itu, selanjutnya dilakukan partisi chi-square untuk mengidentifikasi kategori mana dalam variabel kejadian insomnia yang paling berpengaruh terhadap hubungan signifikan tersebut.

note : Karena langkah Uji Chi Square sudah dibahas sebelumnya, maka pengujian dalam bagian ini tidak akan dirincikan.

Hipotesis

H0 : Tidak ada hubungan antara dua variabel kategorik

H1 : Terdapat hubungan antara dua variabel kategorik

Taraf Signifikansi

α = 5%

Kriteria Uji

Tolak H0 jika pvalue < α

Partisi Insomnia Ringan vs Insomnia Berat

observed1 <- matrix(c(n11, n12,
                      n21, n22),
                    nrow = 2, byrow = TRUE)
rownames(observed1) <- c("Minuman A", "Minuman B")
colnames(observed1) <- c("Ringan", "Berat")

print("Tabel: Insomnia Ringan vs Berat")
## [1] "Tabel: Insomnia Ringan vs Berat"
print(observed1)
##           Ringan Berat
## Minuman A     20    10
## Minuman B     10    20

Uji Chi Square

chisq_test <- chisq.test(observed1)
print(chisq_test)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  observed1
## X-squared = 5.4, df = 1, p-value = 0.02014

Diperoleh p-value (0.02014) < α (0.05) sehingga H0 ditolak

Partisi Insomnia (Berat & Ringan) vs Tidak Insomnia

A_insom <- n11 + n12  # A, Insomnia
A_no    <- n13        # A, Tidak Insomnia
B_insom <- n21 + n22  # B, Insomnia
B_no    <- n23        # B, Tidak Insomnia

# Tabel 2x2: Insomnia vs Tidak
observed2 <- matrix(c(A_insom, A_no,
                      B_insom, B_no),
                    nrow = 2, byrow = TRUE)
rownames(observed2) <- c("Minuman A", "Minuman B")
colnames(observed2) <- c("Insomnia", "Tidak Insomnia")

print("Tabel: Insomnia vs Tidak Insomnia")
## [1] "Tabel: Insomnia vs Tidak Insomnia"
print(observed2)
##           Insomnia Tidak Insomnia
## Minuman A       30             20
## Minuman B       30             20

Uji Chi Square

chisq_test <- chisq.test(observed2)
print(chisq_test)
## 
##  Pearson's Chi-squared test
## 
## data:  observed2
## X-squared = 0, df = 1, p-value = 1

Diperoleh pvalue (1) > α (0.05) sehingga H0 diterima

Kesimpulan

Berdasarkan partisi uji chi-square yang dilakukan, dapat disimpulkan bahwa :

  • Uji Chi Square pada partisi Insomnia Ringan vs Insomnia Berat, menunjukkan H0 ditolak. Artinya, terdapat perbedaan proporsi yang signifikan antara jenis minuman yang dikonsumsi (Minuman A dan Minuman B) terhadap tingkat insomnia ringan dan berat. Dengan kata lain, jenis minuman berhubungan dengan tingkat keparahan insomnia pada responden yang mengalami gejala insomnia.

  • Uji Chi Square pada partisi Insomnia (Ringan & Berat) vs Tidak Insomnia menunjukkan H0 diterima sehingga tidak ada cukup bukti untuk menyatakan bahwa jenis minuman berpengaruh terhadap apakah seseorang mengalami insomnia atau tidak secara umum.

Dengan demikian, jenis minuman cenderung memengaruhi tingkat keparahan insomnia (ringan atau berat), tetapi tidak secara signifikan memengaruhi kemungkinan seseorang mengalami insomnia atau tidak.

4.1.3.3. Uji Likelihood Rasio

Dalam analisis data kategorik, uji likelihood ratio (G-test) merupakan alternatif dari uji chi-square untuk menguji independensi antara dua variabel dalam tabel kontingensi. Uji likelihood rasio sering digunakan sebagai alternatif uji chi square ketika ukuran sampel kecil (Uji Chi Square kurang akurat ketika frekuensi harapan di beberapa sel terlalu kecil misalnya Eij < 5) maupun ketika menggunakan pendekatan statistik berbasis likelihood (misalnya regresi logistik, model log-linear)

Contoh Kasus: Metode Belajar dan Hasil Ujian

Seorang guru ingin mengetahui apakah metode belajar yang digunakan siswa berhubungan dengan hasil ujian mereka. Data di bawah ini diperoleh dari 30 siswa :

# Data observasi
observed <- matrix(c(1, 4,    # Belajar Mandiri
                     7, 3,    # Belajar Kelompok
                     9, 6),   # Mengikuti Kursus
                   nrow = 3, byrow = TRUE)

rownames(observed) <- c("Belajar Mandiri", "Belajar Kelompok", "Kursus")
colnames(observed) <- c("Lulus", "Tidak Lulus")

# Tampilkan tabel
print(observed)
##                  Lulus Tidak Lulus
## Belajar Mandiri      1           4
## Belajar Kelompok     7           3
## Kursus               9           6

Pengecekan Eij

chi_result <- chisq.test(observed, correct = FALSE)
## Warning in chisq.test(observed, correct = FALSE): Chi-squared approximation may
## be incorrect
expected <- chi_result$expected; expected
##                     Lulus Tidak Lulus
## Belajar Mandiri  2.833333    2.166667
## Belajar Kelompok 5.666667    4.333333
## Kursus           8.500000    6.500000

Karena ada nilai frekuensi harapan (Eij) yang kurang dari 5, penggunaan uji chi-square mungkin tidak akurat. Oleh karena itu, uji likelihood ratio (G-test) lebih disarankan dalam kasus ini, karena pendekatannya berbasis log-likelihood dan tidak terlalu sensitif terhadap nilai kecil di sel.

Berikut adalah penyelesaian Kasus Metode Belajar dan Hasil Ujian menggunakan Uji Likelihood Rasio.

Hipotesis

H0 : Tidak ada hubungan antara dua variabel kategorik

H1 : Terdapat hubungan antara dua variabel kategorik

Taraf Signifikansi

α = 5%

Statistik Uji

Perhitungan manual

G_value <- 2 * sum(ifelse(observed == 0, 0, observed * log(observed / expected)))
p_value <- 1 - pchisq(G_value, df)

cat("G^2 =", G_value, "\n")
## G^2 = 3.642246

Diperoleh statistik uji G2 =3.64

Titik Kritis

df <- (nrow(observed) - 1) * (ncol(observed) - 1)
titik_kritis <- qchisq(1 - alpha, df); titik_kritis
## [1] 5.991465

Diperoleh x2 kritis = 5.99

Kriteria Uji

Tolak H0 jika G2 > x2 kritis

Keputusan

G2 (3.64) < x2 kritis (5.99) sehingga H0 diterima

Kesimpulan

Dengan taraf signifikansi 5%, dapat disimpulkan bahwa tidak ada hubungan antara metode belajar dan hasil ujian.

4.1.3.4. Uji Eksak Fisher

Uji Eksak Fisher digunakan untuk menguji apakah terdapat hubungan atau ketergantungan antara dua variabel kategorik dalam sebuah tabel kontingensi, khususnya ketika jumlah sampel kecil atau terdapat frekuensi harapan (Eij) yang rendah (<5). Berbeda dengan uji chi-square yang menggunakan pendekatan aproksimasi distribusi, uji Fisher menghitung probabilitas eksak dari distribusi hipergeometrik berdasarkan data yang diamati.

Kelebihan :

  • Cocok untuk ukuran sampel kecil

  • Tidak memerlukan asumsi normalitas atau chi-square

  • Memberikan hasil yang lebih akurat dibandingkan uji Chi-square pada data dengan frekuensi kecil

Kekurangan :

  • Perhitungan bisa menjadi sangat berat secara komputasi jika ukuran tabel besar

  • Hanya cocok untuk tabel kontingensi kecil (misalnya 2x2 atau 3x3)

Berikut pengujian menggunakan Uji Eksak Fisher pada Kasus Metode Belajar dan Hasil Ujian di 1.5.3.3.

# Data observasi
observed <- matrix(c(1, 4,    # Belajar Mandiri
                     7, 3,    # Belajar Kelompok
                     9, 6),   # Mengikuti Kursus
                   nrow = 3, byrow = TRUE)

rownames(observed) <- c("Belajar Mandiri", "Belajar Kelompok", "Kursus")
colnames(observed) <- c("Lulus", "Tidak Lulus")

# Tampilkan tabel
print(observed)
##                  Lulus Tidak Lulus
## Belajar Mandiri      1           4
## Belajar Kelompok     7           3
## Kursus               9           6

Hipotesis

H0 : Tidak ada hubungan antara dua variabel kategorik

H1 : Terdapat hubungan antara dua variabel kategorik

Taraf Signifikansi

α = 5%

Statistik Uji

fisher <- fisher.test(observed)
fisher
## 
##  Fisher's Exact Test for Count Data
## 
## data:  observed
## p-value = 0.2549
## alternative hypothesis: two.sided

Diperoleh pvalue = 0.2549

Kriteria Uji

Tolak H0 jika pvalue < α

Keputusan

pvalue (0.2549) > α (0.05) sehingga H0 diterima

Kesimpulan

Dengan taraf signifikansi 5%, dapat disimpulkan bahwa tidak ada hubungan antara metode belajar dan hasil ujian.

Rangkuman Uji Hipotesis

Berikut adalah tabel rangkuman uji hipotesis untuk tabel kontingensi dua arah :

4.2. ANALISIS RESIDUAL

Residual dalam tabel kontingensi digunakan untuk mengidentifkasi sel mana yang menyumbang paling banyak terhadap hubungan antara variabel kategori. Residual mengukur selisih antara frekuensi yang diamati dan frekuensi yang diharapkan berdasarkan model independensi. Jika suatu sel memiliki residual yang besar (positif atau negatif), berarti frekuensi observasi dalam sel tersebut sangat berbeda dari yang diharapkan. Sebaliknya, jika residualnya kecil, berarti nilai observasi mendekati nilai ekspektasi, sehingga sel tersebut tidak banyak menyumbang terhadap hubungan antara variabel Agresti, A. (2013).

4.2.1. Pearson Residual

Pearson residual adalah ukuran yang digunakan untuk mengetahui seberapa besar perbedaan antara frekuensi observasi (data yang sebenarnya terjadi) dan frekuensi harapan (yang diperkirakan jika tidak ada hubungan antara variabel). Residual ini membantu mengidentifikasi sel mana dalam tabel yang paling berkontribusi terhadap ketidaksesuaian dengan asumsi independensi.

Pearson residual dihitung dengan rumus :

dimana

Oij : Nilai observasi pada sel baris ke i dan kolom ke j

Eij : Nilai ekspektasi pada sel baris ke i dan kolom ke j

Residual mendekati 0 Tidak ada perbedaan berarti antara data dan harapan.
Residual positif besar Kejadian lebih sering dari yang diharapkan
Residual negatif besar Kejadian lebih jarang dari yang diharapkan

Semakin besar nilai mutlak residual (∣Rij∣|R_{ij}|∣Rij​∣), semakin besar pula kontribusi sel tersebut terhadap hasil uji chi-square, artinya sel tersebut “tidak cocok” dengan asumsi bahwa variabel-variabel saling bebas.

Contoh Kasus : Misalkan sebuah toko ingin mengetahui apakah jenis promosi (Diskon vs Cashback) berhubungan dengan keputusan membeli (Ya vs Tidak). Untuk itu, toko tersebut mengambil sampel dan diperoleh data sebagai berikut.

# Buat tabel kontingensi
tabel <- matrix(c(40, 10,   # Diskon
                  15, 25),  # Cashback
                nrow = 2, byrow = TRUE)

rownames(tabel) <- c("Diskon", "Cashback")
colnames(tabel) <- c("Beli", "Tidak Beli")

# Tampilkan tabel
print("Tabel Kontingensi:")
## [1] "Tabel Kontingensi:"
print(tabel)
##          Beli Tidak Beli
## Diskon     40         10
## Cashback   15         25

Berikut adalah perhitungan pearson residual :

expected <- chisq.test(tabel)$expected

# Hitung Pearson residual
pearson_residual <- (tabel - expected) / sqrt(expected)

print(round(pearson_residual, 2))
##           Beli Tidak Beli
## Diskon    1.71      -2.14
## Cashback -1.91       2.39

Berdasarkan perhitungan pearson residual di atas, dapat disimpulkan bahwa :

Jenis Promosi Diskon

  • Residual Beli = 1.71
    Artinya: Jumlah orang yang membeli sedikit lebih banyak dari yang diperkirakan.
    → Diskon cukup menarik, meskipun tidak terlalu mencolok.

  • Residual Tidak Beli = -2.14
    Artinya: Jumlah orang yang tidak membeli jauh lebih sedikit dari perkiraan.
    → Diskon cukup efektif mencegah orang untuk tidak membeli.

Kesimpulan : Diskon cenderung meningkatkan keputusan membeli, meski efeknya sedang.

Jenis Promosi Cashback

  • Residual Beli = -1.91
    Artinya: Jumlah pembelian lebih rendah dari yang diharapkan.
    → Cashback kurang berhasil menarik pembeli.

  • Residual Tidak Beli = 2.39
    Artinya: Orang yang tidak membeli lebih banyak dari yang diperkirakan.
    → Banyak yang tidak tertarik meskipun ada cashback.

Kesimpulan : Promosi cashback tidak terlalu efektif, bahkan cenderung membuat orang tidak membeli lebih dari yang diduga.

4.2.2. Deteksi Outlier

Outlier dalam analisis data kategori adalah sel dalam tabel kontingensi yang memiliki nilai residual yang sangat besar, baik positif maupun negatif. Outlier ini menunjukkan bahwa ada kategori yang memiliki frekuensi observasi yang jauh lebih tinggi atau lebih rendah dibandingkan dengan nilai ekspektasi berdasarkan asumsi independensi.

Deteksi outlier dapat dilakukan dengan menghitung Pearson Residual dan Standardized Residual (Adjusted Residual).

Mutlak dari Pearson Residual |eij| > 2 menunjukkan sel tersebut dianggap sebagai indikasi adanya outlier. Jika terdapat indikasi, maka selanjutnya perlu menghitung Standardized Residual.

Standardized Residual (Adjusted Residual)

Standardized Residual memiliki rumus :

dimana pi+ dan p+j adalah probabilitas marginal dari baris dan kolom.

Sel yang memiliki nilai |rij| > 3 menunjukkan bahwa sel tersebut adalah outlier yang signifikan.

Berikut adalah pearson korelasi dari Kasus Jenis Promosi dengan Keputusan Membeli yang ada di 4.2.1.

print(round(pearson_residual, 2))
##           Beli Tidak Beli
## Diskon    1.71      -2.14
## Cashback -1.91       2.39

Berdasarkan output di atas, terlihat bahwa :

  • Sel Diskon & Tidak Beli memiliki residual –2.14

  • Sel Cashback & Tidak Beli memiliki residual 2.39

Karena nilai |eij| > 2, maka kedua sel tersebut terindikasi sebagai outlier, artinya jumlah aktual responden berbeda cukup jauh dari yang diharapkan jika kedua variabel independen. Untuk memperkuat analisis, perlu dihitung Standardized Residual (Adjusted Residual) sebagai berikut.

print(tabel)
##          Beli Tidak Beli
## Diskon     40         10
## Cashback   15         25
obs <- tabel

# Total
n_total <- sum(obs)

# Marginal proporsi
p_row <- rowSums(obs) / n_total
p_col <- colSums(obs) / n_total

# Expected values
expected <- outer(rowSums(obs), colSums(obs)) / n_total

# Standardized residual manual
std_resid <- matrix(0, nrow = 2, ncol = 2)
for (i in 1:2) {
  for (j in 1:2) {
    std_resid[i, j] <- (obs[i, j] - expected[i, j]) / 
      sqrt(expected[i, j] * (1 - p_row[i]) * (1 - p_col[j]))
  }
}

print(round(std_resid, 2))
##       [,1]  [,2]
## [1,]  4.11 -4.11
## [2,] -4.11  4.11

Berdasarkan hasil perhitungan standardized residual, ditemukan bahwa seluruh sel dalam tabel kontingensi memiliki nilai residual sebesar ±4.11. Nilai ini jauh melampaui batas umum sebesar 3 yang digunakan untuk mengidentifikasi keberadaan outlier yang signifikan. Artinya, terdapat penyimpangan yang sangat kuat antara frekuensi yang diamati dengan nilai harapan berdasarkan asumsi tidak adanya hubungan antara jenis promosi dan keputusan membeli.

Sel dengan residual positif yang tinggi, seperti pada kombinasi promosi diskon dengan keputusan membeli, menunjukkan bahwa frekuensi aktual pembelian jauh lebih tinggi dibandingkan dengan yang diharapkan. Sebaliknya, residual negatif yang besar, seperti pada promosi diskon dengan keputusan tidak membeli, menunjukkan bahwa jumlah aktual responden yang tidak membeli jauh lebih rendah daripada yang diharapkan. Pola yang sama juga terjadi pada promosi cashback, di mana lebih sedikit orang yang membeli dan lebih banyak yang tidak membeli dibandingkan dengan ekspektasi jika kedua variabel dianggap independen.

Temuan ini mengindikasikan bahwa jenis promosi yang ditawarkan kepada konsumen sangat berpengaruh terhadap keputusan mereka dalam melakukan pembelian. Dengan kata lain, terdapat hubungan yang kuat antara jenis promosi dan perilaku konsumen, yang ditunjukkan secara signifikan oleh penyimpangan residual yang besar di setiap sel.

CHAPTER 5 : TABEL KONTINGENSI TIGA ARAH

Dalam mempelajari pengaruh variabel X terhadap variabel Y, salah satu hal yang perlu diperha$kan yaitu harus “mengendalikan” kovariat yang akan mempengaruhi hubungan tersebut salah satunya dengan cara membuat kovariat (Z) (yang diperkirakan berpengaruh terhadap hubungan tersebut) menjadi konstan, sehingga hubungan X dan Y menjadi lebih jelas.

Tabel kontingensi tiga arah disajikan dengan membuat tabel parsial antarkategori dalam variabel Z dan tabel marginal yang masing-masing berbentuk tabel kontingensi dua arah.

Untuk memahami bagaimana penyajian dan perhitungan tabel kontingensi tiga arah, berikut adalah contoh kasus yang dapat dipelajari.

Kasus : Hubungan Kelelahan Pekerja dengan Keselamatan Kerja

Keselamatan kerja merupakan aspek krusial dalam dunia industri karena kecelakaan kerja tidak hanya berdampak pada kesehatan pekerja, tetapi juga menimbulkan kerugian ekonomi bagi perusahaan. Salah satu faktor yang sering dikaitkan dengan kecelakaan kerja adalah kelelahan, yang dapat muncul akibat beban kerja tinggi, kurang istirahat, atau gangguan tidur. Berbagai penelitian menunjukkan bahwa pekerja yang mengalami kelelahan lebih rentan mengalami kecelakaan, seperti yang ditemukan pada sektor perikanan dan pertambangan di beberapa wilayah di Sulawesi.

Namun, hubungan antara kelelahan dan kecelakaan kerja dapat dipengaruhi oleh faktor lain seperti shift kerja, yang berperan sebagai confounder karena berkaitan dengan kedua variabel tersebut. Jika tidak dikontrol, shift kerja dapat menciptakan bias dalam analisis, sebab kondisi kerja malam dan siang memiliki perbedaan signifikan dalam risiko kecelakaan. Oleh karena itu, penting untuk mempertimbangkan shift kerja sebagai variabel kontrol agar hasil penelitian lebih akurat dan dapat digunakan sebagai dasar untuk merancang kebijakan kerja yang aman dan efektif.

Referensi Hubungan Antarvariabel :

https://journal.universitaspahlawan.ac.id/index.php/jkt/article/view/28867/20019

https://jurnal.ugm.ac.id/bkm/article/view/35750/21536

https://ejournal.unsrat.ac.id/index.php/kesmas/article/view/41637

https://journal.universitaspahlawan.ac.id/index.php/prepotif/article/download/7624/8324

Berdasarkan hal tersebut, sebuah perusahaan manufaktur ingin melakukan penelitian mengenai hubungan kelelahan pekerja (X) dan kecelakaan kerja (Y) dengan shift kerja (Z) sebagai variabel confounder. Berikut adalah data sampel yang telah dikumpulkan.

5.1. TABEL PARSIAL DAN MARJINAL

Cara penyajian tabel kontingensi tiga arah dalam data di atas menjadi tabel parsial dan marjinal adalah sebagai berikut :

5.1.1. Tabel Parsial

Tabel parsial shift kerja pagi

# Tabel Parsial Z = Pagi
n111 <- 18 
n121 <- 72
n211 <- 12
n221 <- 85
n1.1 <- n111+n121
n2.1 <- n211+n221
n.11 <- n111+n211
n.21 <- n121+n221
n..1 <- n111+n121+n211+n221

tp_Z1 <- matrix(c(n111, n121, n1.1,
              n211, n221, n2.1,
              n.11, n.21, n..1), 
              nrow = 3, byrow = TRUE)

rownames(tp_Z1) <- c("Lelah", "Tidak Lelah", "Total")
colnames(tp_Z1) <- c("Ya", "Tidak", "Total")

print(tp_Z1)
##             Ya Tidak Total
## Lelah       18    72    90
## Tidak Lelah 12    85    97
## Total       30   157   187

Tabel parsial shift kerja siang

# Tabel Parsial Z = Siang
n112 <- 22 
n122 <- 75
n212 <- 15
n222 <- 88
n1.2 <- n112 + n122
n2.2 <- n212 + n222
n.12 <- n112 + n212
n.22 <- n122 + n222
n..2 <- n112 + n122 + n212 + n222

tp_Z2 <- matrix(c(n112, n122, n1.2,
                  n212, n222, n2.2,
                  n.12, n.22, n..2), 
                nrow = 3, byrow = TRUE)

rownames(tp_Z2) <- c("Lelah", "Tidak Lelah", "Total")
colnames(tp_Z2) <- c("Ya", "Tidak", "Total")

print(tp_Z2)
##             Ya Tidak Total
## Lelah       22    75    97
## Tidak Lelah 15    88   103
## Total       37   163   200

Tabel parsial shift kerja malam

# Tabel Parsial Z = Malam
n113 <- 30  
n123 <- 65
n213 <- 20
n223 <- 78
n1.3 <- n113 + n123
n2.3 <- n213 + n223
n.13 <- n113 + n213
n.23 <- n123 + n223
n..3 <- n113 + n123 + n213 + n223

tp_Z3 <- matrix(c(n113, n123, n1.3,
                  n213, n223, n2.3,
                  n.13, n.23, n..3), 
                nrow = 3, byrow = TRUE)

rownames(tp_Z3) <- c("Lelah", "Tidak Lelah", "Total")
colnames(tp_Z3) <- c("Ya", "Tidak", "Total")

print(tp_Z3)
##             Ya Tidak Total
## Lelah       30    65    95
## Tidak Lelah 20    78    98
## Total       50   143   193

5.1.2. Tabel Marjinal

# Tabel Marginal
n11 <- n111 + n112 + n113
n12 <- n121 + n122 + n123
n21 <- n211 + n212 + n213
n22 <- n221 + n222 + n223
n1. <- n11+n12
n2. <- n21+n22
n.1 <- n11+n21
n.2 <- n12+n22
n.. <- n11+n12+n21+n22

tm <-  matrix(c(n11, n12, n1.,
              n21, n22, n2.,
              n.1, n.2, n..), 
              nrow = 3, byrow = TRUE)

rownames(tm) <- c("Lelah", "Tidak Lelah", "Total")
colnames(tm) <- c("Ya", "Tidak", "Total")

print(tm)
##              Ya Tidak Total
## Lelah        70   212   282
## Tidak Lelah  47   251   298
## Total       117   463   580

5.2. UKURAN ASOSIASI PARSIAL DAN MARJINAL

5.2.1. Ukuran Asosiasi Parsial

5.2.1.1. Ukuran Asosiasi Parsial Untuk Z = Pagi

Untuk menghitung ukuran asosiasi parsial, perlu untuk menghitung beberapa peluang marginal, peluang bersama, dan peluang bersyarat. Berikut adalah perhitungan peluang untuk tabel parsial Z = Pagi :

Peluang Marginal

P_L1 <- n1.1/n..1 ; P_L1 # Peluang pekerja lelah pada shift pagi
## [1] 0.4812834

Peluang pekerja kelelahan pada shift pagi adalah 0.48

P_TL1 <- n2.1/n..1 ; P_TL1 # Peluang pekerja tidak lelah pada shift pagi
## [1] 0.5187166

Peluang pekerja tidak kelelahan pada shift pagi adalah 0.52

Peluang Bersama

P_LnY1 <- n111/n..1 ; P_LnY1
## [1] 0.09625668

Peluang pekerja kelelahan dan mengalami kecelakaan kerja pada shift pagi adalah 0.096

P_TLnY1 <- n211/n..1 ; P_TLnY1
## [1] 0.06417112

Peluang pekerja tidak kelelahan dan mengalami kecelakaan kerja pada shift pagi adalah 0.064

Peluang Bersyarat

P_YlL1 <- P_LnY1/P_L1 ; P_YlL1
## [1] 0.2

Peluang pekerja kelelahan lalu mengalami kecelakaan kerja pada shift pagi adalah 0.2

P_YlTL1 <- P_TLnY1/P_TL1 ; P_YlTL1
## [1] 0.1237113

Peluang pekerja tidak kelelahan lalu mengalami kecelakaan kerja pada shift pagi adalah 0.12

Perhitungan peluang bersyarat sama dengan yang sudah dilakukan sebelumnya, yaitu dengan membagi peluang bersama dengan peluang marginal kondisi syaratnya. Namun, untuk mempersingkat perhitungan, perhitungan peluang bersyarat P(Tidak|Lelah) dan P(Tidak|Tidak Lelah) akan dilakukan langsung dengan nilai-nilai sel nya.

P_TlL1 <- n121/(n111+n121); P_TlL1
## [1] 0.8

Peluang pekerja kelelahan lalu tidak mengalami kecelakaan kerja pada shift pagi adalah 0.8

P_TlTL1 <- n221/(n211+n221); P_TlTL1
## [1] 0.8762887

Peluang pekerja tidak kelelahan lalu tidak mengalami kecelakaan kerja pada shift pagi adalah 0.8

Berdasarkan peluang-peluang di atas, berikut adalah perhitungan ukuran asosiasi untuk tabel parsial Z = Pagi :

5.2.1.1.1. Beda Peluang
RD1 <- P_YlL1-P_YlTL1 ; RD1
## [1] 0.07628866

Berdasarkan perhitungan, diperoleh beda peluang sebesar 0.07. Artinya, pada shift pagi, pekerja yang kelelahan berpeluang mengalami kecelakaan kerja lebih besar 0.07 dibandingkan pekerja yang tidak kelelahan.

5.2.1.1.2. Resiko Relatif
RR1 <- P_YlL1/P_YlTL1 ; RR1
## [1] 1.616667

Berdasarkan perhitungan, diperoleh resiko relatif sebesar 1.62. Artinya, pada shift pagi, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.62 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.1.1.3. Rasio Odds
pembilang1 <- P_YlL1/P_TlL1
penyebut1 <- P_YlTL1/P_TlTL1
OR1 <- pembilang1/penyebut1; OR1 
## [1] 1.770833

Berdasarkan perhitungan, diperoleh odds ratio sebesar 1.77. Artinya, pada shift pagi, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.77 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.1.2. Ukuran Asosiasi Parsial Untuk Z = Siang

Untuk menghitung ukuran asosiasi parsial, perlu untuk menghitung beberapa peluang marginal, peluang bersama, dan peluang bersyarat. Berikut adalah perhitungan peluang untuk tabel parsial Z = Siang :

Peluang Marginal

P_L2 <- n1.2/n..2 ; P_L2
## [1] 0.485

Peluang pekerja kelelahan pada shift siang adalah 0.485

P_TL2 <- n2.2/n..2 ; P_TL2
## [1] 0.515

Peluang pekerja tidak kelelahan pada shift siang adalah 0.515

Peluang Bersama

P_LnY2 <- n112/n..2 ; P_LnY2
## [1] 0.11

Peluang pekerja kelelahan dan mengalami kecelakaan kerja pada shift siang adalah 0.11

P_TLnY2 <- n212/n..2 ; P_TLnY2
## [1] 0.075

Peluang pekerja tidak kelelahan dan mengalami kecelakaan kerja pada shift siang adalah 0.075

Peluang Bersyarat

P_YlL2 <- P_LnY2/P_L2 ; P_YlL2
## [1] 0.2268041

Peluang pekerja kelelahan lalu mengalami kecelakaan kerja pada shift siang adalah 0.23

P_YlTL2 <- P_TLnY2/P_TL2 ; P_YlTL2
## [1] 0.1456311

Peluang pekerja tidak kelelahan lalu mengalami kecelakaan kerja pada shift siang adalah 0.15

Perhitungan peluang bersyarat sama dengan yang sudah dilakukan sebelumnya, yaitu dengan membagi peluang bersama dengan peluang marginal kondisi syaratnya. Namun, untuk mempersingkat perhitungan, perhitungan peluang bersyarat P(Tidak|Lelah) dan P(Tidak|Tidak Lelah) akan dilakukan langsung dengan nilai-nilai sel nya.

P_TlL2 <- n122/(n112+n122); P_TlL2
## [1] 0.7731959

Peluang pekerja kelelahan lalu tidak mengalami kecelakaan kerja pada shift siang adalah 0.77

P_TlTL2 <- n222/(n212+n222); P_TlTL2
## [1] 0.8543689

Peluang pekerja tidak kelelahan lalu tidak mengalami kecelakaan kerja pada shift siang adalah 0.85

Berdasarkan peluang-peluang di atas, berikut adalah perhitungan ukuran asosiasi untuk tabel parsial Z = Siang :

5.2.1.2.1. Beda Peluang
RD2 <- P_YlL2 - P_YlTL2 ; RD2
## [1] 0.08117306

Berdasarkan perhitungan, diperoleh beda peluang sebesar 0.08. Artinya, pada shift siang, pekerja yang kelelahan berpeluang mengalami kecelakaan kerja lebih besar 0.08 dibandingkan pekerja yang tidak kelelahan.

5.2.1.2.2. Resiko Relatif
RR2 <- P_YlL2/P_YlTL2 ; RR2
## [1] 1.557388

Berdasarkan perhitungan, diperoleh resiko relatif sebesar 1.55. Artinya, pada shift siang, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.55 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.1.2.3. Rasio Odds
pembilang2 <- P_YlL2/P_TlL2
penyebut2 <- P_YlTL2/P_TlTL2
OR2 <- pembilang2/penyebut2; OR2 
## [1] 1.720889

Berdasarkan perhitungan, diperoleh odds ratio sebesar 1.72. Artinya, pada shift siang, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.72 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.1.3. Ukuran Asosiasi Parsial Untuk Z = Malam

Untuk menghitung ukuran asosiasi parsial, perlu untuk menghitung beberapa peluang marginal, peluang bersama, dan peluang bersyarat. Berikut adalah perhitungan peluang untuk tabel parsial Z = Malam :

Peluang Marginal

P_L3 <- n1.3/n..3 ; P_L3 # Peluang pekerja lelah pada shift malam
## [1] 0.492228

Peluang pekerja kelelahan pada shift malam adalah 0.49.

P_TL3 <- n2.3/n..3 ; P_TL3 # Peluang pekerja tidak lelah pada shift malam
## [1] 0.507772

Peluang pekerja tidak kelelahan pada shift malam adalah 0.51

Peluang Bersama

P_LnY3 <- n113/n..3 ; P_LnY3
## [1] 0.1554404

Peluang pekerja kelelahan dan mengalami kecelakaan kerja pada shift malam adalah 0.16

P_TLnY3 <- n213/n..3 ; P_TLnY3
## [1] 0.1036269

Peluang pekerja tidak kelelahan dan mengalami kecelakaan kerja pada shift malam adalah 0.10

Peluang Bersyarat

P_YlL3 <- P_LnY3/P_L3 ; P_YlL3
## [1] 0.3157895

Peluang pekerja kelelahan lalu mengalami kecelakaan kerja pada shift malam adalah 0.32

P_YlTL3 <- P_TLnY3/P_TL3 ; P_YlTL3
## [1] 0.2040816

Peluang pekerja tidak kelelahan lalu mengalami kecelakaan kerja pada shift malam adalah 0.204

Perhitungan peluang bersyarat sama dengan yang sudah dilakukan sebelumnya, yaitu dengan membagi peluang bersama dengan peluang marginal kondisi syaratnya. Namun, untuk mempersingkat perhitungan, perhitungan peluang bersyarat P(Tidak|Lelah) dan P(Tidak|Tidak Lelah) akan dilakukan langsung dengan nilai-nilai sel nya.

P_TlL3 <- n123/(n113+n123); P_TlL3
## [1] 0.6842105

Peluang pekerja kelelahan lalu tidak mengalami kecelakaan kerja pada shift malam adalah 0.68

P_TlTL3 <- n223/(n213+n223); P_TlTL3
## [1] 0.7959184

Peluang pekerja tidak kelelahan lalu tidak mengalami kecelakaan kerja pada shift malam adalah 0.796

Berdasarkan peluang-peluang di atas, berikut adalah perhitungan ukuran asosiasi untuk tabel parsial Z = Malam :

5.2.1.3.1. Beda Peluang
RD3 <- P_YlL3 - P_YlTL3 ; RD3
## [1] 0.1117078

Berdasarkan perhitungan, diperoleh beda peluang sebesar 0.11. Artinya, pada shift malam, pekerja yang kelelahan berpeluang mengalami kecelakaan kerja lebih besar 0.11 dibandingkan pekerja yang tidak kelelahan.

5.2.1.3.2. Resiko Relatif
RR3 <- P_YlL3 / P_YlTL3 ; RR3
## [1] 1.547368

Berdasarkan perhitungan, diperoleh resiko relatif sebesar 1.55. Artinya, pada shift malam, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.55 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.1.3.3. Rasio Odds
pembilang3 <- P_YlL3/P_TlL3
penyebut3 <- P_YlTL3/P_TlTL3
OR3 <- pembilang3 / penyebut3; OR3
## [1] 1.8

Berdasarkan perhitungan, diperoleh odds ratio sebesar 1.8. Artinya, pada shift malam, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.8 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.2. Ukuran Asosiasi Marginal

Untuk menghitung ukuran asosiasi marginak, perlu untuk menghitung beberapa peluang marginal, peluang bersama, dan peluang bersyarat. Berikut adalah perhitungan peluang untuk tabel marginal :

Peluang Marginal

P_L <- n1./n.. ; P_L # Peluang pekerja lelah
## [1] 0.4862069

Peluang pekerja kelelahan adalah 0.49

P_TL <- n2./n.. ; P_TL # Peluang pekerja tidak lelah
## [1] 0.5137931

Peluang pekerja tidak kelelahan adalah 0.51

Peluang Bersama

P_LnY <- n11/n.. ; P_LnY
## [1] 0.1206897

Peluang pekerja kelelahan dan mengalami kecelakaan kerja adalah 0.12

P_TLnY <- n21/n.. ; P_TLnY
## [1] 0.08103448

Peluang pekerja tidak kelelahan dan mengalami kecelakaan kerja adalah 0.08

Peluang Bersyarat

P_YlL <- P_LnY/P_L ; P_YlL
## [1] 0.248227

Peluang pekerja kelelahan lalu mengalami kecelakaan kerja adalah 0.25

P_YlTL <- P_TLnY/P_TL ; P_YlTL
## [1] 0.1577181

Peluang pekerja tidak kelelahan lalu mengalami kecelakaan kerja adalah 0.16

Perhitungan peluang bersyarat sama dengan yang sudah dilakukan sebelumnya, yaitu dengan membagi peluang bersama dengan peluang marginal kondisi syaratnya. Namun, untuk mempersingkat perhitungan, perhitungan peluang bersyarat P(Tidak|Lelah) dan P(Tidak|Tidak Lelah) akan dilakukan langsung dengan nilai-nilai sel nya.

P_TlL <- n12/(n11+n12); P_TlL
## [1] 0.751773

Peluang pekerja kelelahan lalu tidak mengalami kecelakaan kerja adalah 0.75

P_TlTL <- n22/(n21+n22); P_TlTL
## [1] 0.8422819

Peluang pekerja tidak kelelahan lalu mengalami kecelakaan kerja adalah 0.84

5.2.2.1. Beda Peluang

RD <- P_YlL - P_YlTL ; RD
## [1] 0.09050883

Berdasarkan perhitungan, diperoleh beda peluang sebesar 0.09. Artinya, tanpa memperhatikan shift, pekerja yang kelelahan berpeluang mengalami kecelakaan kerja lebih besar 0.09 dibandingkan pekerja yang tidak kelelahan.

5.2.2.2. Resiko Relatif

RR <- P_YlL / P_YlTL ; RR
## [1] 1.573864

Berdasarkan perhitungan, diperoleh resiko relatif sebesar 1.57. Artinya, tanpa memperhatikan shift, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.57 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.2.3. Rasio Odds

pembilang <- P_YlL/P_TlL
penyebut <- P_YlTL/P_TlTL
OR <- pembilang / penyebut; OR
## [1] 1.763348

Berdasarkan perhitungan, diperoleh odds ratio sebesar 1.76. Artinya, tanpa memperhatikan shift, pekerja yang kelelahan beresiko mengalami kecelakaan kerja 1.76 kali lipat lebih besar dibandingkan pekerja yang tidak kelelahan.

5.2.3. Perbandingan Ukuran Asosiasi Parsial dan Marginal

Berikut adalah tabel perbandingan ukuran asosiasi antara tabel parsial dan marginal :

asosiasi <- matrix(c(RD1, RD2, RD3, RD,
                     RR1, RR2, RR3, RR,
                     OR1, OR2, OR3, OR),
                   nrow = 3, byrow = TRUE)

rownames(asosiasi) <- c("Beda Peluang", "Resiko Relatif", "Rasio Odds")
colnames(asosiasi) <- c("Shift Pagi", "Shift Siang", "Shift Malam", "Tanpa Melihat Shift")

print(asosiasi)
##                Shift Pagi Shift Siang Shift Malam Tanpa Melihat Shift
## Beda Peluang   0.07628866  0.08117306   0.1117078          0.09050883
## Resiko Relatif 1.61666667  1.55738832   1.5473684          1.57386449
## Rasio Odds     1.77083333  1.72088889   1.8000000          1.76334805

Hasil ini menunjukkan bahwa kelelahan memiliki dampak signifikan terhadap kecelakaan kerja, baik ketika dianalisis dalam masing-masing shift kerja (asosiasi bersyarat) maupun secara keseluruhan tanpa memperhitungkan shift (asosiasi marginal).

Asosiasi bersyarat menunjukkan bahwa di setiap shift kerja, pekerja yang kelelahan selalu memiliki risiko kecelakaan lebih tinggi dibandingkan pekerja yang tidak kelelahan. Asosiasi marginal mengonfirmasi bahwa hubungan ini tetap ada meskipun perbedaan shift tidak diperhitungkan, yang berarti kelelahan memang memiliki efek langsung terhadap kecelakaan kerja secara keseluruhan.

Meskipun terdapat sedikit variasi dalam nilai ukuran asosiasi antar shift, pola hubungan ini konsisten di semua kondisi, yang menunjukkan bahwa kelelahan merupakan faktor risiko utama yang tidak bergantung pada shift kerja tertentu.

5.3. CONDITIONALLY INDEPENDENT

Conditional independence terjadi jika variabel X (kelelahan) dan Y (kecelakaan kerja) independen dalam setiap tabel parsial berdasarkan shift kerja. Dalam kasus ini, independen berarti bahwa odds ratio untuk hubungan X dan Y pada setiap level Z (shift kerja) sama dengan 1. Conditional independence dapat diketahui salah satunya dengan melakukan pengujian hipotesis. Untuk tabel kontingensi 2×2×k, metode yang digunakan adalah Cochran-Mantel-Haenzel.

Hipotesis

\(\ H_0 : \theta_{xy(k)} = 1 \text{ untuk setiap k-1,2,...,K}\)

\(\ H_1 : \theta_{xy(k)} \neq 1 \text{ untuk setiap k-1,2,...,K}\)

Taraf Signifikansi

\(\alpha = 5\%\)

Statistik Uji

# Membuat array untuk tabel kontingensi
data <- array(c(
  18, 12, 72, 85,  # Pagi
  22, 15, 75, 88,  # Siang
  30, 20, 65, 78   # Malam
), 
dim = c(2, 2, 3), 
dimnames = list(
  Kelelahan = c("Lelah", "Tidak Lelah"),
  Kecelakaan_Kerja = c("Ya", "Tidak"),
  Shift_Kerja = c("Pagi", "Siang", "Malam")
))

# Menampilkan tabel kontingensi
print(data)
## , , Shift_Kerja = Pagi
## 
##              Kecelakaan_Kerja
## Kelelahan     Ya Tidak
##   Lelah       18    72
##   Tidak Lelah 12    85
## 
## , , Shift_Kerja = Siang
## 
##              Kecelakaan_Kerja
## Kelelahan     Ya Tidak
##   Lelah       22    75
##   Tidak Lelah 15    88
## 
## , , Shift_Kerja = Malam
## 
##              Kecelakaan_Kerja
## Kelelahan     Ya Tidak
##   Lelah       30    65
##   Tidak Lelah 20    78
cmh_base <- mantelhaen.test(data, correct = FALSE)
cmh_base
## 
##  Mantel-Haenszel chi-squared test without continuity correction
## 
## data:  data
## Mantel-Haenszel X-squared = 7.2904, df = 1, p-value = 0.006932
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.166580 2.672989
## sample estimates:
## common odds ratio 
##          1.765858

Diperoleh \(\ Pvalue = 0.006932\)

Kriteria Uji

Tolak H0 jika \(\ Pvalue < \alpha\)

Keputusan

H0 ditolak karena \(\ Pvalue (0.006932) < \alpha (0.05)\)

Kesimpulan

Hasil uji Cochran-Mantel-Haenszel menunjukkan bahwa terdapat conditional dependence antara kelelahan pekerja dan kecelakaan kerja pada shift tertentu. Hal ini berarti bahwa hubungan antara kelelahan dan kecelakaan kerja tidak dapat diabaikan dalam setiap shift, dan shift kerja memainkan peran dalam memoderasi hubungan tersebut.

Temuan ini juga konsisten dengan hasil odds ratio sebelumnya

OR Shift Pagi OR Shift Siang OR Shift Malam OR Marginal
1.77 1.72 1.8 1.76

Karena odds ratio di setiap shift tidak sama dengan 1, kelelahan tetap memiliki hubungan dengan kecelakaan kerja dalam setiap shift. Selain itu, odds ratio marginal (1.76) berada di antara odds ratio shift individu, yang menunjukkan bahwa analisis marginal memberikan gambaran rata-rata dari efek kelelahan terhadap kecelakaan, tetapi tidak menangkap variasi antar shift. Dengan demikian, shift kerja tidak dapat diabaikan sebagai faktor dalam analisis hubungan antara kelelahan dan kecelakaan kerja. Analisis bersyarat lebih memberikan wawasan tentang bagaimana resiko kecelakaan kerja bervariasi di berbagai shift, dan hasil ini memperkuat pentingnya mempertimbangkan variabel kontrol dalam analisis data kategori.

5.4. HOMOGENUS ASSOCIATION

Asosiasi dikatakan homogen jika odds ratio antara variabel X (kelelahan) dan Y (kecelakaan kerja) tetap sama di setiap tabel parsial berdasarkan Z (shift kerja). Dengan kata lain, tidak ada interaksi antara shift kerja dengan hubungan kelelahan dan kecelakaan kerja. Jika asosiasi bersifat homogen, maka shift kerja tidak memoderasi hubungan antara X dan Y, sehingga efek kelelahan terhadap kecelakaan kerja konsisten di setiap shift.

Sebaliknya, jika odds ratio berbeda secara signifikan antar shift, maka asosiasi tidak homogen (heterogeneous association), yang berarti shift kerja memiliki peran dalam mempengaruhi hubungan kelelahan dan kecelakaan kerja.

Pengujian homogenitas odds ratio dari tabel kontingensi tiga arah dapat dilakukan dengan Uji Breslow-Day.

Hipotesis

\(\ H_0 : \theta_{xy(k)} = ... = \theta_{xy(k)}\)

\(\ H_1 : \text{paling sedikit satu tanda "=" tidak berlaku}\)

Taraf Signifikansi

\(\alpha = 5\%\)

Statistik Uji

library(DescTools)
breslow_test <- BreslowDayTest(data)
print(breslow_test)
## 
##  Breslow-Day test on Homogeneity of Odds Ratios
## 
## data:  data
## X-squared = 0.0081997, df = 2, p-value = 0.9959

Diperoleh \(\ Pvalue = 0.9959\)

Kriteria Uji

Tolak H0 jika \(\ Pvalue < \alpha\)

Keputusan

H0 diterima karena \(\ Pvalue (0.9959) > \alpha (0.05)\)

Kesimpulan

Berdasarkan pengujian, dengan taraf signifikansi 5%, dapat disimpulkan bahwa asosiasi antara kelelahan dan kecelakaan kerja bersifat homogen di setiap shift kerja. Kesimpulan ini konsisten dengan hasil odds ratio sebelumnya :

OR Shift Pagi OR Shift Siang OR Shift Malam OR Marginal
1.77 1.72 1.8 1.76

Karena nilai odds ratio antar shift tidak berbeda secara signifikan, ini menunjukkan bahwa shift kerja tidak memiliki pengaruh yang besar dalam memoderasi hubungan antara kelelahan dan kecelakaan kerja. Hal ini berarti bahwa kebijakan atau strategi pencegahan kecelakaan yang berfokus pada mengurangi kelelahan pekerja dapat diterapkan secara merata di semua shift kerja, tanpa perlu penyesuaian khusus berdasarkan shift tertentu.

Kesimpulan

Berdasarkan hasil analisis, dapat disimpulkan bahwa kelelahan pekerja berhubungan dengan peningkatan risiko kecelakaan kerja, baik dalam analisis bersyarat berdasarkan shift kerja maupun dalam analisis marginal tanpa mempertimbangkan shift. Hasil ini menunjukkan bahwa kelelahan merupakan faktor penting yang mempengaruhi keselamatan kerja. Berikut adalah perbandingan ukuran asosiasi bersyarat dab marginal :

print(asosiasi)
##                Shift Pagi Shift Siang Shift Malam Tanpa Melihat Shift
## Beda Peluang   0.07628866  0.08117306   0.1117078          0.09050883
## Resiko Relatif 1.61666667  1.55738832   1.5473684          1.57386449
## Rasio Odds     1.77083333  1.72088889   1.8000000          1.76334805

Selain itu, shift kerja merupakan variabel kontrol yang tidak dapat diabaikan sebagai faktor dalam hubungan kelelahan dan kecelakaan kerja (berdasarkan Uji Cochran-Mantel-Haenszel), yang berarti bahwa shift kerja memiliki keterkaitan dengan bagaimana kelelahan mempengaruhi kecelakaan kerja. Meskipun demikian, efek kelelahan terhadap kecelakaan kerja bersifat homogen di semua shift kerja (berdasarkan Uji Breslow-Day), yang menunjukkan bahwa pengaruh kelelahan terhadap kecelakaan kerja relatif sama di setiap shift. Artinya, shift kerja memang relevan sebagai faktor dalam analisis, tetapi tidak mengubah pola hubungan kelelahan terhadap kecelakaan kerja secara signifikan. Hal ini mengindikasikan bahwa intervensi yang berfokus pada kelelahan dapat diterapkan secara seragam di semua shift kerja, tanpa perlu pendekatan khusus berdasarkan shift tertentu.

CHAPTER 6 : GENERALIZED LINEAR MODEL (GLM)

Model Linier Umum (Generalized Linear Model, GLM) adalah kerangka statistik yang memperluas regresi linier untuk menangani variabel respons dengan distribusi non-normal, seperti data biner, cacah, atau proporsi. GLM memungkinkan hubungan antara variabel prediktor dan respons dimodelkan melalui fungsi penghubung, menjadikannya alat yang fleksibel untuk berbagai aplikasi, dari kesehatan hingga pendidikan. Berikut adalah model linear dari GLM :

GLM dibangun dari tiga komponen utama yang menentukan struktur dan fungsinya, yaitu komponen acak, komponen sistematis, dan fungsi penghubung.

  1. Komponen acak mengacu pada distribusi variabel respons, yang diasumsikan berasal dari keluarga eksponensial, seperti binomial untuk data biner atau Poisson untuk data cacah. Ini memungkinkan GLM menangani berbagai jenis data dengan tepat.
  2. Komponen sistematik adalah prediktor linier, yaitu kombinasi linier dari variabel penjelas:

Variabel respons dalam GLM diasumsikan mengikuti distribusi dari keluarga eksponensial, seperti binomial, Poisson, atau normal, dengan densitas probabilitas :

Di mana θ adalah parameter alami, ϕ adalah parameter dispersi, b(θ) menentukan ekspektasi, dan c(y,ϕ) adalah fungsi normalisasi.

6.1. MODEL REGRESI LOGISTIK

Regresi logistik adalah kasus khusus dari GLM yang digunakan untuk memodelkan variabel respons biner (misalnya, 0 atau 1, sukses atau gagal). Dalam regresi logistik :

  • Komponen Acak: Variabel respons \(Y\) mengikuti distribusi binomial, di mana \(Y_i \sim \text{Binomial}(n_i, \pi_i)\), dengan \(\pi_i\) sebagai probabilitas keberhasilan. Untuk kasus sederhana, \(n_i = 1\) (satu observasi per unit).

  • Komponen Sistematik: Kombinasi linier dari prediktor:

\[ \eta_i = \beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} + \cdots + \beta_p X_{ip} \]

  • Fungsi Penghubung: Menggunakan fungsi logit, yang menghubungkan ekspektasi \(\mu_i = E(Y_i) = \pi_i\) dengan prediktor linier:

    \[ \eta_i = g(\pi_i) = \log\left(\frac{\pi_i}{1 - \pi_i}\right) \]Fungsi logit memetakan probabilitas \(\pi_i \in (0, 1)\) ke bilangan real \(\eta_i \in (-\infty, \infty)\).

  • Interpretasi Koefisien : Koefisien \(\beta_j\) menunjukkan perubahan dalam log-odds (log dari rasio peluang) untuk setiap unit kenaikan pada prediktor \(X_j\). Odds didefinisikan sebagai:

\[ \frac{\pi_i}{1 - \pi_i} \]dan

\[ \exp(\beta_j) = \text{odds ratio} \]

Misalnya, jika \(\exp(\beta_1) = 2\), maka kenaikan satu unit pada \(X_1\) menggandakan odds keberhasilan, dengan asumsi variabel lain konstan.

Regresi logistik sangat cocok untuk memprediksi probabilitas kejadian biner, seperti apakah seseorang akan membeli produk atau lulus ujian. Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE). Log-likelihood fungsi untuk regresi logistik adalah

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

Dengan \(\pi_i\) adalah probabilitas dari kejadian \(Y_i = 1\) yang dimodelkan sebagai:

\[ \pi_i = \frac{\exp(x_i^\top \boldsymbol{\beta})}{1 + \exp(x_i^\top \boldsymbol{\beta})} \]

Estimasi dilakukan melalui iterasi Newton-Raphson atau algoritma Fisher Scoring.

Studi Kasus : Prediksi Penyelesaian Kursus Daring

Sebuah platform pembelajaran daring ingin memprediksi apakah peserta akan menyelesaikan kursus (respons biner : 1 = selesai; 0 = tidak selesai) berdasarkan dua prediktor :

  • Jumlah jam belajar per minggu (X1)​ dalam jam.

  • Tingkat interaksi dengan forum diskusi (X2)​ skala 1–5, di mana 1 = sangat rendah, 5 = sangat tinggi.

set.seed(123)

data <- data.frame(
  X1 = round(runif(50, min = 1, max = 15)),   # Jam belajar per minggu (1–15)
  X2 = sample(1:5, 50, replace = TRUE),       # Interaksi forum (1–5)
  Y = sample(0:1, 50, replace = TRUE)         # Respons biner (0 = tidak selesai, 1 = selesai)
)

print(data)
##    X1 X2 Y
## 1   5  4 1
## 2  12  5 1
## 3   7  5 0
## 4  13  3 1
## 5  14  1 1
## 6   2  2 1
## 7   8  5 0
## 8  13  5 1
## 9   9  4 1
## 10  7  5 0
## 11 14  2 1
## 12  7  1 0
## 13 10  1 1
## 14  9  3 0
## 15  2  1 0
## 16 14  5 0
## 17  4  1 0
## 18  2  2 0
## 19  6  4 0
## 20 14  4 0
## 21 13  3 1
## 22 11  1 1
## 23 10  2 1
## 24 15  1 0
## 25 10  2 1
## 26 11  4 0
## 27  9  5 0
## 28  9  5 1
## 29  5  3 0
## 30  3  1 1
## 31 14  4 1
## 32 14  1 1
## 33 11  1 1
## 34 12  3 0
## 35  1  4 0
## 36  8  1 0
## 37 12  3 1
## 38  4  5 1
## 39  5  3 1
## 40  4  2 1
## 41  3  5 0
## 42  7  5 0
## 43  7  3 0
## 44  6  2 0
## 45  3  2 1
## 46  3  2 1
## 47  4  4 0
## 48  8  2 0
## 49  5  2 1
## 50 13  4 1

Estimasi Model Regresi Logistik

Respons biner ( Y ) (selesai atau tidak) diasumsikan mengikuti distribusi binomial dengan fungsi penghubung logit :

\[ \log\left(\frac{\pi_i}{1 - \pi_i}\right) =\beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} \]

dimana \(\pi_i=P(\text{Selesai}=1|X_{i1},X_{i2})\)

model <- glm(Y ~ X1 + X2, family = binomial(link = "logit"), data = data)
summary(model)
## 
## Call:
## glm(formula = Y ~ X1 + X2, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.01525    0.85502  -0.018    0.986
## X1           0.11944    0.07505   1.591    0.112
## X2          -0.29641    0.20689  -1.433    0.152
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 69.235  on 49  degrees of freedom
## Residual deviance: 64.753  on 47  degrees of freedom
## AIC: 70.753
## 
## Number of Fisher Scoring iterations: 4

Berikut adalah tabel jenis interpretasi untuk setiap kolom dari hasil output syntax di atas :

Nama Kolom Penjelasan Interpretasi
Estimate Estimasi nilai koefisien β pada model logit. Menunjukkan pengaruh X terhadap log-odds dari Y.
Std. Error Simpangan baku dari estimasi koefisien. Menunjukkan seberapa besar ketidakpastian dalam estimasi tersebut.
Z value Statistik uji z yang diperoleh dari membagi estimate dengan Std. Error. Dapat digunakan untuk menguji signifikansi koefisien dengan membandingkannya dengan nilai Z tabel.
Pr(>|z|) Menguji signifikansi statistik dari masing-masing variabel prediktor dalam model dengan membandingkannya dengan taraf signifikansi

Berdasarkan tabel di atas, model regresi logistik dari Studi Kasus : Prediksi Penyelesaian Kursus Daring menyimpulkan bahwa :

  • Ketika jam belajar (X1) = 0 dan interaksi forum (X2) = 0, maka log odds untuk menyelesaikan kursus = -0.01525

  • Setiap tambahan 1 jam belajar (X1 meningkat 1 satuan) menyebabkan maka log odds untuk menyelesaikan kursus naik sebesar 0.119 dengan syarat interaksi forum (X2) tetap

  • Setiap kenaikan 1 tingkat interaksi forum (X2 meningkat 1 satuan) menyebabkan maka log odds untuk menyelesaikan kursus turun sebesar 0.296 dengan syarat jam belajar (X1) tetap.

  • X1 (jam belajar) punya hubungan positif dengan peluang menyelesaikan kursus. Artinya, makin banyak belajar, makin besar kemungkinan menyelesaikan kursus. Namun, karena nilai p = 0.112 (> 0.05), pengaruh ini tidak signifikan secara statistik.

  • X2 (interaksi forum) justru menunjukkan hubungan negatif. Artinya, makin sering berinteraksi di forum, kemungkinan menyelesaikan kursus cenderung menurun. Namun, karena nilai p = 0.152 (> 0.05), pengaruh ini tidak signifikan secara statistik.

Karena interpretasi koefisien di atas masih dalam bentk log odds, berikut adalah interpretasi dalam bentuk odds :

exp(coef(model))
## (Intercept)          X1          X2 
##   0.9848670   1.1268698   0.7434833

Berdasarkan nilai odd rasio di atas, dapat disimpulkan bahwa :

  • Ketika jam belajar (X1) = 0 dan interaksi forum (X2) = 0, maka odds untuk menyelesaikan kursus adalah 0.985 atau menurun sebesar 0,015%

  • Setiap tambahan 1 jam belajar per minggu, maka odds untuk menyelesaikan kursus meningkat sebesar 12.7%, dengan asumsi tingkat interaksi forum tetap

  • Setiap kenaikan 1 tingkat interaksi di forum, maka odds untuk menyelesaikan kursus justru turun sebesar 25.7%, dengan asumsi jam belajar tetap.

Visualisasi Data dan Prediksi

# Prediksi probabilitas
data$prob <- predict(model, type = "response")

# Klasifikasi berdasarkan probabilitas
data$pred_class <- ifelse(data$prob > 0.5, 1, 0)

# Visualisasi hasil prediksi vs data asli
library(ggplot2)
ggplot(data, aes(x = X1, y = X2, color = factor(pred_class), shape = factor(Y))) +
  geom_point(size = 3) +
  labs(title = "Prediksi Regresi Logistik: Penyelesaian Kursus",
       x = "Jam Belajar per Minggu (X1)",
       y = "Tingkat Interaksi Forum (X2)",
       color = "Prediksi", shape = "Fakta") +
  theme_minimal()

Evaluasi Model

table(Prediksi = data$pred_class, Sebenarnya = data$Y)
##         Sebenarnya
## Prediksi  0  1
##        0 13 11
##        1 11 15

Berikut adalah penjelasan dari tabel output R yang ditampilkan di atas :

  • True Negatives (TN) = 13 : Ini adalah jumlah kasus di mana model memprediksi 0 (tidak selesai) dan memang benar orang tersebut tidak selesai kursus.

  • False Positives (FP) = 11 : Ini adalah jumlah kasus di mana model memprediksi 1 (selesai), tetapi orang tersebut sebenarnya tidak selesai kursus. Ini adalah kesalahan positif.

  • False Negatives (FN) = 11 : Ini adalah jumlah kasus di mana model memprediksi 0 (tidak selesai), tetapi orang tersebut sebenarnya selesai kursus. Ini adalah kesalahan negatif.

  • True Positives (TP) = 15 : Ini adalah jumlah kasus di mana model memprediksi 1 (selesai) dan orang tersebut memang benar-benar selesai kursus.

TN <- 13
TP <- 15
FN <- 11
FP <- 11
akurasi <- (TP+TN)/(TP+TN+FP+FN)
akurasi
## [1] 0.56

\[\text{% Akurasi Model}=\frac{TP+TN}{TP+TN+FP+FN}× \text{100%} = \text{56%}\]

Model GLM menghasilkan akurasi sebesar 56% dalam memprediksi data. Akurasi sebesar 56% berarti model berhasil memprediksi dengan benar 28 dari 50 peserta, baik yang menyelesaikan maupun yang tidak menyelesaikan kursus. Ini menunjukkan bahwa lebih dari separuh prediksi model sesuai dengan kenyataan. Namun, karena nilainya hanya sedikit di atas tebakan acak (50%), model masih perlu ditingkatkan untuk menjadi lebih andal.

6.2. MODEL REGRESI POISSON

Model regresi Poisson merupakan salah satu bentuk dari Generalized Linear Model (GLM) yang secara khusus digunakan ketika variabel respon yang diamati berupa bilangan cacah, yaitu bilangan bulat non-negatif seperti jumlah kejadian dalam suatu periode, banyaknya pelanggan yang datang ke toko, atau jumlah keluhan pelanggan per hari. Model ini didasarkan pada asumsi bahwa variabel respon Y mengikuti distribusi Poisson dengan parameter \(\lambda\), yang merupakan rata-rata kejadian untuk suatu unit observasi tertentu. Dengan kata lain, setiap nilai \(Y_i\) dianggap berasal dari distribusi Poisson dengan parameter \(\lambda_i\), sehingga dapat dituliskan sebagai \(Y_i \sim \text{Poisson}(\lambda_i)\).

Distribusi Poisson sendiri memiliki fungsi kepadatan peluang (probability density function) yang berbentuk :

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

di mana \(\lambda > 0\) dan \(y\) merupakan bilangan bulat non-negatif. Nilai harapan dan varians dari distribusi ini identik, yaitu \(E(Y) = \lambda\) dan \(\text{Var}(Y) = \lambda\), yang menjadikannya cocok untuk memodelkan data cacah dengan sifat mean = variance.

Sebagai bagian dari GLM, distribusi Poisson dapat dituliskan dalam bentuk keluarga eksponensial (exponential family). Dalam bentuk ini, fungsi densitas Poisson dinyatakan sebagai:

\[ f(y; \theta) = \exp\left[ y\theta - b(\theta) + c(y) \right] \]

di mana parameter kanonik \(\theta\) sama dengan \(\log(\lambda)\), fungsi \(b(\theta) = e^{\theta}\), dan \(c(y) = -\log(y!)\). Bentuk ini menunjukkan bahwa distribusi Poisson memenuhi struktur eksponensial, yang menjadi salah satu syarat utama dalam formulasi GLM.

Untuk menghubungkan parameter rata-rata \(\mu_i = E(Y_i)\) dengan prediktor linier, digunakan fungsi link. Dalam regresi Poisson, fungsi link yang digunakan adalah fungsi logaritma, karena fungsi ini menjamin bahwa nilai \(\mu_i\) tetap positif, sesuai dengan sifat distribusi Poisson. Fungsi link logaritma ini dituliskan sebagai:

\[ g(\mu_i) = \log(\mu_i) = \eta_i \]

dengan \(\eta_i\) adalah kombinasi linier dari variabel prediktor, yaitu:

\[ \eta_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \dots + \beta_p x_{ip} \]

Model regresi Poisson secara eksplisit menyatakan bahwa log dari nilai harapan (rata-rata jumlah kejadian) merupakan fungsi linier dari prediktor. Secara umum, bentuk model ini dapat dituliskan sebagai:

\[ \log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]

atau, dalam bentuk fungsi inversenya,

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

Fungsi eksponensial di sini berfungsi sebagai fungsi inverse link, yang mengubah hasil prediksi linier \(\eta_i\) menjadi nilai rata-rata kejadian \(\lambda_i\) yang positif. Dengan demikian, setiap perubahan satu unit pada prediktor \(x_j\) mengakibatkan perubahan multiplikatif sebesar \(e^{\beta_j}\) pada nilai \(\lambda_i\), bukan perubahan aditif.

Parameter \(\boldsymbol{\beta}\) dalam regresi Poisson diestimasi menggunakan metode Maximum Likelihood Estimation (MLE). Fungsi likelihood-nya diturunkan dari fungsi peluang distribusi Poisson untuk setiap observasi, yaitu:

\[ L(\boldsymbol{\beta}) = \prod_{i=1}^n \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]

Kemudian, log-likelihood-nya menjadi:

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

Karena \(\lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta})\), maka log-likelihood tersebut menjadi fungsi dari parameter \(\boldsymbol{\beta}\). Proses estimasi dilakukan dengan mengoptimalkan log-likelihood ini menggunakan algoritma numerik, seperti Iteratively Reweighted Least Squares (IRLS), yang umum digunakan dalam kerangka GLM. Dengan demikian, regresi Poisson dalam GLM menyediakan pendekatan yang terstruktur dan teoritis kuat untuk memodelkan data cacah, sambil tetap mempertahankan fleksibilitas dalam memasukkan berbagai prediktor linier.

Studi Kasus : Pengaruh Iklan dan Hari terhadap Kunjungan Toko

Sebuah jaringan toko ritel ingin memahami bagaimana strategi pemasangan iklan harian dapat memengaruhi jumlah kunjungan pelanggan ke tokonya. Data dikumpulkan selama 200 hari dari beberapa cabang toko yang menjalankan strategi iklan harian yang bervariasi, serta mencatat hari dalam minggu (Senin hingga Minggu). Karena data yang dikumpulkan berupa hitungan jumlah kunjungan per hari, model regresi Poisson sangat sesuai digunakan dalam konteks ini.

Tujuan dari studi ini adalah membangun model prediksi jumlah kunjungan berdasarkan jumlah iklan yang dipasang dan hari dalam minggu, serta mengevaluasi apakah iklan secara signifikan meningkatkan jumlah kunjungan harian.

set.seed(1234)
n <- 200
data <- data.frame(
  iklan = sample(0:10, n, replace = TRUE),
  hari = sample(1:7, n, replace = TRUE)
)

data$lambda <- exp(1.5 + 0.25 * data$iklan - 0.1 * data$hari)
data$kunjungan <- rpois(n, lambda = data$lambda)
head(data)
##   iklan hari    lambda kunjungan
## 1     9    4 28.502734        32
## 2     5    4 10.485570        11
## 3     4    7  6.049647        10
## 4     8    2 27.112639        24
## 5     4    4  8.166170         9
## 6     5    1 14.154039         8

Estimasi Model Regresi Poisson

model <- glm(kunjungan ~ iklan + hari, family = poisson(link = "log"), data = data)
summary(model)
## 
## Call:
## glm(formula = kunjungan ~ iklan + hari, family = poisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  1.591931   0.066168   24.06   <2e-16 ***
## iklan        0.243391   0.007383   32.97   <2e-16 ***
## hari        -0.110104   0.010407  -10.58   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 1601.78  on 199  degrees of freedom
## Residual deviance:  234.56  on 197  degrees of freedom
## AIC: 1070.3
## 
## Number of Fisher Scoring iterations: 4

Berdasarkan hasil estimasi, kita memperoleh fungsi model sebagai berikut:

\[ \log(\mu_i) = 1.592 + 0.243 \cdot \text{iklan}_i - 0.110 \cdot \text{hari}_i \]

Model di atas menyatakan bahwa

  • Intercept sebesar 1.592 menunjukkan nilai log-rata-rata jumlah kunjungan ketika tidak ada iklan yang dipasang (iklan = 0) dan pada hari ke-0 (hari = 0). Walaupun hari ke-0 tidak ada dalam konteks sebenarnya, nilai ini tetap menjadi dasar matematis dari model.

  • Koefisien iklan sebesar 0.243 menunjukkan bahwa setiap penambahan satu unit jumlah iklan akan menaikkan log rata-rata jumlah kunjungan sebesar 0.243, dengan asumsi hari tetap.

  • Koefisien hari sebesar -0.110 menunjukkan bahwa setiap kenaikan satu hari (misalnya dari Senin ke Selasa, atau dari hari ke-2 ke ke-3) akan menurunkan log rata-rata jumlah kunjungan sebesar 0.110, dengan asumsi jumlah iklan tetap.

  • Semua koefisien dalam model ini signifikan secara statistik (nilai p < 2e-16), sehingga baik jumlah iklan maupun hari secara signifikan memengaruhi jumlah kunjungan harian.

Karena interpretasi koefisien di atas masih dalam bentk log odds, berikut adalah interpretasi dalam bentuk odds :

exp(coef(model))
## (Intercept)       iklan        hari 
##   4.9132295   1.2755669   0.8957409

Berdasarkan nilai odd rasio di atas, dapat disimpulkan bahwa :

  • Ketika jumlah iklan = 0 dan hari = 0, rata-rata jumlah kunjungan yang diharapkan adalah sekitar 4.91 kunjungan per hari

  • Setiap tambahan satu unit iklan meningkatkan rata-rata jumlah kunjungan harian sebesar 27.6%, dengan asumsi nilai hari tetap. Artinya, iklan memiliki pengaruh positif terhadap kunjungan.

  • Setiap kemajuan satu hari dalam minggu akan menurunkan rata-rata jumlah kunjungan sebesar sekitar 10.4%, dengan asumsi jumlah iklan tetap. Hal ini menunjukkan adanya pola penurunan kunjungan seiring bertambahnya hari.

Visualisasi Data dan Prediksi

# Prediksi dari model
data$predicted <- predict(model, type = "response")

# Membuat plot menggunakan ggplot2
library(ggplot2)
ggplot(data, aes(x = iklan, y = kunjungan)) +
  geom_jitter(width = 0.2, alpha = 0.6) +
  geom_point(aes(y = predicted), shape = 18, size = 3, color = "black") +
  facet_wrap(~hari) +
  labs(title = "Prediksi Jumlah Kunjungan berdasarkan Iklan dan Hari",
       x = "Jumlah Iklan",
       y = "Jumlah Kunjungan",
       color = "Hari") +
  theme_minimal()

Grafik di atas adalah grafik perbandingan antara jumlah kunjungan pada data aktual dengan prediksinya. Sumbu xmenyatakan jumlah iklan dan sumbu Y menyatakan jumlah kunjungan.

Evaluasi Model

plot(model$residuals, 
     main = "Residual Plot", 
     ylab = "Residual", 
     xlab = "Index", 
     pch = 19, 
     col = "pink1")
abline(h = 0, col = "black", lty = 2)

Residual plot menunjukkan bahwa nilai residual tersebar secara acak di sekitar garis nol, tanpa membentuk pola tertentu. Hal ini mengindikasikan bahwa model tidak memiliki kesalahan sistematis dalam melakukan prediksi terhadap variabel jumlah kunjungan. Sebagian besar nilai residual berada dalam rentang yang sempit, yaitu antara -1 hingga 1, yang menunjukkan bahwa selisih antara nilai aktual dan nilai prediksi relatif kecil dan terkendali.

Selain itu, tidak terlihat adanya pola penyebaran residual yang semakin melebar atau menyempit seiring dengan bertambahnya indeks observasi. Ini menunjukkan bahwa asumsi homoskedastisitas (varian residual yang konstan) terpenuhi. Tidak tampak pula adanya outlier ekstrem yang menyimpang jauh dari garis nol.

Secara keseluruhan, residual plot ini memberikan indikasi bahwa model yang digunakan sudah cukup baik dalam memodelkan data jumlah kunjungan, karena tidak ditemukan pelanggaran asumsi penting dalam analisis residual.

CHAPTER 7 : INFERENSI DALAM GLM

Dalam Generalized Linear Model (GLM), inferensi statistik membutuhkan pemahaman terhadap ekspektasi dan varians dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.

7.1. Ekspektasi dan Varians dalam GLM

7.1.1. Ekspektasi Estimator

Ekspektasi dari estimator dalam GLM mengacu pada nilai rata-rata dari estimasi parameter model yang diperoleh melalui proses estimasi (seperti metode Maximum Likelihood Estimation atau MLE). Dalam GLM, kita bekerja dengan model linier terhubung melalui fungsi link, yang berarti ekspektasi dari variabel respon (misalnya, \(Y\)) tergantung pada parameter model dan fungsi link yang digunakan.

Misalkan model GLM memiliki bentuk umum sebagai berikut:

\[ g(\mathbb{E}[Y_i]) = X_i \beta \]

di mana:

\(g(\cdot)\) adalah fungsi link

\(\mathbb{E}[Y_i]\) adalah ekspektasi dari \(Y_i\),

\(X_i\) adalah vektor prediktor untuk pengamatan ke-\(i\), dan

\(\beta\) adalah vektor parameter yang harus diestimasi.

Ekspektasi ini menunjukkan hubungan antara variabel respon \(Y\) dengan prediktor melalui fungsi link. Dengan kata lain, ekspektasi dari \(Y_i\) dalam GLM dapat diubah menjadi bentuk linier dalam parameter \(\beta\) setelah diterapkan fungsi link.

7.1.2. Varians Estimator

Varians estimator dalam GLM terkait dengan seberapa banyak estimator parameter model (\(\hat{\beta}\)) dapat bervariasi dari nilai sebenarnya \(\beta\) jika kita melakukan pengambilan sampel berulang kali. Varians dari estimator sangat penting untuk menghitung ketidakpastian estimasi, yang digunakan untuk pengujian hipotesis dan pembentukan interval kepercayaan.

Dalam GLM, varians dari estimator \(\hat{\beta}\) sering dihitung menggunakan informasi Fisher, yang berhubungan dengan fungsi log-likelihood model. Varians dari \(\hat{\beta}\) untuk parameter \(\beta\) pada model GLM dapat dihitung dengan rumus:

\[ \text{Var}(\hat{\beta}) = (X' W X)^{-1} \]

dengan :

\(X\) adalah matriks desain

\(W\) adalah matriks bobot yang dihitung berdasarkan varians dari model distribusi respons.

Informasi Fisher ini digunakan untuk menghitung error standar dari parameter model yang berguna dalam melakukan uji hipotesis.

Tidak seperti model regresi linier klasik yang mengasumsikan homoskedastisitas (varians konstan dari error), GLM secara eksplisit memungkinkan varians yang tidak konstan (heteroskedastisitas). Varians dari variabel respon \(Y_i\) dalam GLM bergantung pada nilai ekspektasinya:

\[ \text{Var}(Y_i) = \phi V(\mu_i) \]

di mana:

- \(\mu_i = \mathbb{E}[Y_i]\) adalah nilai ekspektasi dari \(Y_i\),

- \(V(\mu_i)\) adalah fungsi varians (variance function) yang tergantung pada distribusi eksponensial yang digunakan,

- \(\phi\) adalah parameter dispersi (biasanya \(\phi = 1\) untuk Poisson dan Binomial).

Contohnya :

- Untuk distribusi Poisson, \(V(\mu_i) = \mu_i\). - Untuk distribusi Binomial, \(V(\mu_i) = \mu_i (1 - \mu_i)\).

Artinya, semakin besar (atau kecil) nilai prediksi \(\mu_i\), maka varians dari \(Y_i\) juga berubah secara sistematik. Hal ini memiliki implikasi penting pada cara kita menghitung error standar dan membentuk interval kepercayaan.

Karena varians tidak konstan, pendekatan-pendekatan inferensial dalam GLM (seperti perhitungan matriks informasi dan error standar) harus mempertimbangkan bentuk khusus dari varians ini, agar hasil uji statistik tetap valid.

Informasi Fisher ini digunakan untuk menghitung error standar dari parameter model yang berguna dalam melakukan uji hipotesis.

7.1.3. Fungsi Ekspektasi dan Varians dalam Inferensi GLM

Ekspektasi dan varians dari estimator memiliki beberapa fungsi penting dalam inferensi statistik menggunakan GLM:

  1. Pengujian Hipotesis

    Pengujian hipotesis terkait parameter model, seperti uji Wald atau uji Likelihood Ratio, membutuhkan informasi tentang ekspektasi dan varians dari estimator. Ini memungkinkan kita untuk menguji apakah suatu parameter \(\beta_j\) signifikan atau tidak.

  2. Interval Kepercayaan

    Interval kepercayaan untuk parameter \(\beta_j\) dihitung menggunakan error standar dari estimator, yang diperoleh dari varians. Ini memberikan gambaran tentang ketidakpastian dari estimasi parameter.

    Interval kepercayaan untuk \(\beta_j\) dapat dihitung dengan rumus:

    \[ \hat{\beta}_j \pm Z_{\alpha/2} \cdot \text{SE}(\hat{\beta}_j) \]

    di mana:

    • \(\hat{\beta}_j\) adalah estimator untuk parameter,
    • \(Z_{\alpha/2}\) adalah nilai kritis dari distribusi normal standar, dan
    • \(\text{SE}(\hat{\beta}_j)\) adalah error standar dari \(\hat{\beta}_j\).
  3. Penentuan Model yang Tepat

    Ekspektasi dan varians estimator juga digunakan untuk menilai kelayakan model yang dibangun. Misalnya, jika model menunjukkan varians yang terlalu besar atau tidak sesuai dengan data, ini bisa menandakan bahwa model tidak cukup baik untuk menjelaskan data yang ada.

7.1.4. Turunan Ekspektasi dan Varians dalam GLM

Ekspektasi dan varians dalam Generalized Linear Model (GLM) diturunkan dari sifat distribusi eksponensial. Salah satu pendekatan formal untuk menurunkannya adalah melalui turunan fungsi log-likelihood dari bentuk umum distribusi eksponensial.

Jika diturunkan berdasarkan fungsi momen, ekspektasi didefinisikan sebagai:

\[ \mathbb{E}(Y) = \int y f(y; \theta) \, dy = \mu \]

Untuk keluarga distribusi eksponensial, fungsi densitas atau probabilitas dapat ditulis dalam bentuk kanonik:

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

Sehingga log-likelihood dari satu pengamatan adalah:

\[ \log f(y; \theta) = y \theta - b(\theta) + c(y) \]

Turunan pertama dari log-likelihood terhadap \(\theta\) disebut sebagai fungsi skor, yaitu:

\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \]

Ekspektasi dari fungsi skor adalah nol di titik maksimum log-likelihood. Maka:

\[ \mathbb{E}[U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]

Sehingga kita peroleh hubungan penting:

\[ \mu = b'(\theta) \]

Dengan kata lain, ekspektasi dari \(Y\) adalah turunan pertama dari fungsi partisi \(b(\theta)\).

Untuk varians, kita mengambil turunan kedua dari log-likelihood terhadap \(\theta\):

\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]

Dari sini, varians dari \(Y\) adalah:

\[ \text{Var}(Y) = \phi \cdot b''(\theta) \]

Karena \(\mu = b'(\theta)\) dan kita ingin menuliskan varians sebagai fungsi dari \(\mu\), maka kita definisikan:

\[ V(\mu) = b''(\theta) \]

Sehingga bentuk umum varians dalam GLM menjadi:

\[ \text{Var}(Y) = \phi V(\mu) \]

Dengan \(V(\mu)\) disebut sebagai fungsi varians, yang bergantung pada distribusi yang digunakan :

- Untuk distribusi Poisson: \(V(\mu) = \mu\)

- Untuk distribusi Binomial: \(V(\mu) = \mu(1 - \mu)\)

- Untuk distribusi Gamma: \(V(\mu) = \mu^2\)

- Untuk distribusi Normal: \(V(\mu) = 1\)

Formulasi ini menunjukkan bahwa varians dalam GLM tidak konstan, melainkan bergantung pada nilai ekspektasi \(\mu\). Hal ini menjadi salah satu perbedaan mendasar antara GLM dan regresi linier klasik.

Ekspektasi dan varians ini menjadi dasar bagi pengembangan metode inferensi seperti pengujian Wald, Likelihood Ratio Test, serta pembentukan interval kepercayaan.

7.2. METODE PENAKSIRAN PARAMETER

Penaksiran parameter dalam Generalized Linear Model (GLM) dilakukan menggunakan prinsip Maximum Likelihood Estimation (MLE). Dalam GLM, model diasumsikan mengikuti distribusi dari keluarga eksponensial, sehingga fungsi likelihood dapat diformulasikan secara umum dan diturunkan untuk mendapatkan estimator parameter.

7.2.1. Prinsip Maximum Likelihood

Diberikan data pengamatan \(y_1, y_2, \dots, y_n\) yang diasumsikan saling bebas, dan masing-masing \(y_i\) mengikuti distribusi dari keluarga eksponensial dengan parameter \(\theta_i\), maka fungsi likelihood dari parameter \(\boldsymbol{\beta}\) adalah:

\[ L(\boldsymbol{\beta}) = \prod_{i=1}^n f(y_i; \theta_i(\boldsymbol{\beta}), \phi) \]

Log-likelihood dapat dituliskan sebagai:

\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left\{ y_i \theta_i - b(\theta_i) \right\} \]

Karena \(\theta_i\) bergantung pada \(\boldsymbol{\beta}\) melalui prediktor linier \(\eta_i = \boldsymbol{x}_i^\top \boldsymbol{\beta}\) dan fungsi link \(g(\mu_i) = \eta_i\), maka log-likelihood menjadi fungsi dari \(\boldsymbol{\beta}\).

Tujuan dari penaksiran parameter adalah untuk menemukan nilai \(\hat{\boldsymbol{\beta}}\) yang memaksimalkan log-likelihood tersebut.

7.2.2. Pendekatan Numerik: Newton-Raphson dan Fisher Scoring

Karena bentuk log-likelihood dalam GLM umumnya tidak memiliki solusi tertutup, maka pendekatan numerik digunakan, salah satunya adalah metode Newton-Raphson. Metode ini merupakan teknik iteratif yang memperbarui nilai parameter sebagai berikut:

\[ \boldsymbol{\beta}^{(t+1)} = \boldsymbol{\beta}^{(t)} - \left[ \nabla^2 \ell(\boldsymbol{\beta}^{(t)}) \right]^{-1} \nabla \ell(\boldsymbol{\beta}^{(t)}) \]

di mana:

- \(\nabla \ell(\boldsymbol{\beta})\) adalah gradien (turunan pertama),

- \(\nabla^2 \ell(\boldsymbol{\beta})\) adalah matriks Hesse (turunan kedua).

Namun, karena komputasi turunan kedua bisa kompleks, maka digunakan Fisher Scoring, yaitu versi Newton-Raphson yang menggunakan informasi Fisher (ekspektasi dari matriks Hesse):

\[ \boldsymbol{\beta}^{(t+1)} = \boldsymbol{\beta}^{(t)} + \left[ \mathbb{E} \left( -\nabla^2 \ell(\boldsymbol{\beta}^{(t)}) \right) \right]^{-1} \nabla \ell(\boldsymbol{\beta}^{(t)}) \]

Fisher Scoring merupakan metode dasar dalam algoritma Iteratively Reweighted Least Squares (IRLS) yang digunakan dalam sebagian besar implementasi GLM di perangkat lunak statistik.

7.2.3. Iteratively Reweighted Least Squares (IRLS)

IRLS menyelesaikan penaksiran parameter dengan memperbarui nilai \(\boldsymbol{\beta}\) melalui solusi regresi least squares berbobot di setiap iterasi:

\[ \boldsymbol{\beta}^{(t+1)} = \left( X^\top W^{(t)} X \right)^{-1} X^\top W^{(t)} z^{(t)} \]

di mana: - \(X\) adalah matriks desain, - \(W^{(t)}\) adalah matriks diagonal bobot, - \(z^{(t)}\) adalah vektor respons kerja (working response) yang dihitung dari data dan model saat ini.

IRLS terus diiterasi sampai konvergen, yaitu ketika perubahan nilai parameter sangat kecil.


7.3. DIAGNOSTIK MODEL GLM

Setelah model GLM secara umum diestimasi, diperlukan diagnostik model untuk mengevaluasi kesesuaian model terhadap data, mengidentifikasi pengaruh data, dan memeriksa asumsi dasar. Diagnostik model merupakan langkah penting dalam praktik pemodelan GLM. Tanpa diagnostik, hasil estimasi bisa menyesatkan karena dipengaruhi oleh asumsi yang tidak dipenuhi atau data yang tidak biasa. Secara umum, diagnostik model bertujuan untuk :

  • Memastikan bahwa model sudah cocok (goodness-of-fit)

  • Mendeteksi pencilan (outliers)

  • Menganalisis pengaruh observasi (influential points)

  • Memeriksa asumsi link dan varian.

Fungsi utamanya adalah memastikan validitas inferensi dan prediksi model. Berikut adalah jenis diagnostik dalam model GLM yang umum digunakan.

7.3.1. Residual

Residual mengukur perbedaan antara nilai pengamatan (\(y_i\)) dan nilai prediksi (\(\hat{\mu}_i\)). Dalam GLM, terdapat beberapa jenis residual:

7.3.1.1. Pearson Residual

Pearson residual merupakan bentuk standar dari residual yang memperhitungkan variansi fungsi dari distribusi:

\[ r_i^{(P)} = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]

Interpretasi: Jika model sesuai, residual ini akan berdistribusi mendekati normal standar.

Fungsi: Membantu mengidentifikasi observasi yang tidak cocok terhadap model (pencilan).

7.3.1.2. Deviance Residual

Deviance residual berdasarkan selisih antara log-likelihood dari model dengan model saturated:

\[ r_i^{(D)} = \text{sign}(y_i - \hat{\mu}_i) \cdot \sqrt{2 \left[ \ell(y_i; y_i) - \ell(y_i; \hat{\mu}_i) \right]} \]

Interpretasi: Semakin besar deviance residual, semakin besar kontribusi observasi ke total deviance.

Fungsi: Sering digunakan dalam analisis goodness-of-fit dan deteksi pencilan.

7.3.1.3. Anscombe Residual

Anscombe residual menggunakan transformasi yang bertujuan membuat distribusinya lebih mendekati normal:

\[ r_i^{(A)} = \frac{3}{2} \cdot \frac{y_i^{2/3} - \hat{\mu}_i^{2/3}}{\hat{\mu}_i^{1/6}} \]Fungsi: Memberikan residual yang lebih stabil terutama untuk distribusi skew seperti Poisson dan Binomial.

7.3.2. Leverage

Leverage (\(h_{ii}\)) mengukur seberapa jauh titik observasi \(i\) berada dari pusat ruang prediktor. Dalam GLM, leverage didefinisikan melalui matriks hat sebagai:

\[ h_{ii} = \left[ W^{1/2} X (X^\top W X)^{-1} X^\top W^{1/2} \right]_{ii} \]

Interpretasi: Nilai leverage mendekati 1 menunjukkan observasi sangat ekstrem (dalam ruang prediktor).

Fungsi: Mendeteksi titik data yang secara struktur memiliki pengaruh besar terhadap model.


7.3.3. Cook’s Distance

Cook’s Distance (\(D_i\)) mengukur pengaruh observasi \(i\) terhadap seluruh estimasi parameter. Untuk GLM, formula Cook’s Distance adalah:

\[ D_i = \frac{( \hat{\boldsymbol{\beta}} - \hat{\boldsymbol{\beta}}_{(i)} )^\top X^\top W X ( \hat{\boldsymbol{\beta}} - \hat{\boldsymbol{\beta}}_{(i)} )}{p \cdot \hat{\phi}} \]

Atau, dalam bentuk pendekatan:

\[ D_i \approx \frac{r_i^2}{p} \cdot \frac{h_{ii}}{(1 - h_{ii})^2} \]

dengan :

\(r_i\): residual (Pearson atau deviance),

\(h_{ii}\): leverage observasi ke-\(i\),

\(p\): jumlah parameter.

Interpretasi: Jika \(D_i\) jauh lebih besar dari rata-rata, maka observasi tersebut sangat berpengaruh.Fungsi: Mengidentifikasi pengamatan yang mempengaruhi parameter secara keseluruhan.

7.3.4. Goodness-of-Fit: Deviance dan AIC

7.3.4.1. Deviance

Deviance mengukur seberapa jauh model berada dari model saturated (model paling kompleks yang cocok sempurna dengan data):

\[ \text{Deviance} = 2 \sum_{i=1}^n \left[ \ell(y_i; y_i) - \ell(y_i; \hat{\mu}_i) \right] \]Interpretasi: Nilai deviance yang kecil menunjukkan model cocok dengan data.

Fungsi: Digunakan untuk membandingkan model nested (melalui deviance difference), atau untuk mengecek overdispersion.

7.3.4.2. AIC (Akaike Information Criterion)

AIC memiliki rumus sebagai beriktu

\[ \text{AIC} = -2 \ell(\hat{\boldsymbol{\beta}}) + 2p \]

dengan :

\(p\): jumlah parameter,

\(\ell(\hat{\boldsymbol{\beta}})\): log-likelihood maksimum.

Interpretasi: Semakin kecil AIC, semakin baik model (dengan mempertimbangkan kompleksitas).

Fungsi: Untuk memilih model terbaik di antara beberapa model non-nested.

7.3.5. Overdispersion

Overdispersion terjadi jika variansi data lebih besar dari yang diharapkan berdasarkan asumsi distribusi. Dalam GLM, parameter dispersi \(\phi\) biasanya diasumsikan 1 (misalnya dalam model Poisson atau Binomial), tetapi bisa lebih besar jika terjadi overdispersion.

Pengecekan overdispersion dapat dilakukan dengan rumus :

\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]

Jika \(\hat{\phi} > 1\), maka terjadi overdispersion.

Jika \(\hat{\phi} < 1\), maka terjadi underdispersion.

Fungsi: Menyesuaikan variansi model dan standard error dari parameter. Jika overdispersion terdeteksi, sebaiknya menggunakan quasi-likelihood atau distribusi alternatif seperti Negative Binomial.

7.4. METODE INFERENSI DAN ESTIMASI

7.4.1. Model Regresi Logistik

Model regresi logistik digunakan untuk memodelkan hubungan antara satu atau lebih variabel independen dengan variabel dependen yang bersifat biner (misalnya, 0 atau 1). Model ini sangat sering digunakan dalam analisis data di mana hasil yang ingin diprediksi memiliki dua kategori, seperti keberhasilan atau kegagalan, hidup atau mati, dan seterusnya.

Fungsi logit pada regresi logistik dapat dituliskan sebagai berikut:

\[ \text{logit}(P(Y = 1)) = \ln \left( \frac{P(Y = 1)}{1 - P(Y = 1)} \right) = \beta_0 + \beta_1 X_1 + \dots + \beta_p X_p \]

Di mana:

- \(P(Y = 1)\) adalah probabilitas kejadian dari variabel dependen yang bernilai 1.

- \(\beta_0, \beta_1, \dots, \beta_p\) adalah koefisien model regresi logistik.

- \(X_1, \dots, X_p\) adalah variabel independen.

7.4.1.1. Estimasi Koefisien Model dengan Metode Newton-Raphson

Untuk mengestimasi parameter dalam regresi logistik, salah satu metode yang digunakan adalah Newton-Raphson. Metode ini adalah teknik iteratif yang digunakan untuk mencari akar dari fungsi. Dalam konteks regresi logistik, kita akan mencari nilai parameter yang memaksimalkan fungsi likelihood.

Langkah-langkah estimasi dengan metode Newton-Raphson:

  1. Tentukan fungsi log-likelihood untuk model regresi logistik. Fungsi log-likelihood untuk model ini dapat dituliskan sebagai:

    \[ \mathcal{L}(\beta) = \sum_{i=1}^n \left[ y_i \ln(p_i) + (1 - y_i) \ln(1 - p_i) \right] \]

    Di mana \(y_i\) adalah nilai observasi untuk variabel dependen, dan \(p_i\) adalah probabilitas yang diprediksi untuk setiap observasi, yang dihitung dengan menggunakan fungsi logistik:

\[ p_i = \frac{1}{1 + \exp(-X_i \beta)} \]

  1. Hitung turunan pertama (gradien) dan turunan kedua (matriks Hessian) dari fungsi log-likelihood.

    • Gradien (turunan pertama) adalah vektor yang berisi derivatif dari log-likelihood terhadap parameter \(\beta\).
    • Matriks Hessian adalah matriks yang berisi turunan kedua dari log-likelihood, yang digunakan untuk mengukur kelengkungan fungsi log-likelihood.
  2. Iterasi menggunakan rumus Newton-Raphson:

    \[ \beta^{(k+1)} = \beta^{(k)} - \left[ H(\beta^{(k)}) \right]^{-1} \nabla \mathcal{L}(\beta^{(k)}) \]

    Di mana:

    - \(\beta^{(k)}\) adalah estimasi parameter pada iterasi ke-k.

    - \(H(\beta^{(k)})\) adalah matriks Hessian pada iterasi ke-k.

    - \(\nabla \mathcal{L}(\beta^{(k)})\) adalah gradien pada iterasi ke-k.

    Proses ini dilakukan secara berulang hingga konvergensi tercapai, yaitu ketika perubahan nilai parameter sangat kecil antara iterasi.

Studi Kasus : Pengaruh Pendapatan dan Usia terhadap Keputusan Membeli

Sebuah perusahaan e-commerce ingin memahami faktor-faktor yang memengaruhi keputusan pelanggan untuk membeli produk di situs mereka. Tim analis data perusahaan tersebut mengumpulkan data dari 100 pelanggan secara acak. Untuk setiap pelanggan, dicatat apakah ia membeli (Y=1) produk tertentu atau tidak (Y=0), beserta dua informasi penting :

  • Pendapatan bulanan (dalam satuan juta rupiah) (X1)

  • Usia (dalam satuan tahun) (X2)

# Set seed untuk replikasi
set.seed(123)

# Jumlah observasi
n <- 100

# Variabel prediktor
X1 <- rnorm(n, mean = 0, sd = 1)
X2 <- rnorm(n, mean = 0, sd = 1)

# Desain matriks X (dengan intercept)
X <- cbind(1, X1, X2)

# Parameter "benar"
beta_true <- c(-1, 0.5, 0.3)

# Menghitung probabilitas dengan fungsi logistik
p <- 1 / (1 + exp(-X %*% beta_true))

# Menghasilkan data biner dari distribusi Bernoulli
y <- rbinom(n, size = 1, prob = p)

# Gabungkan menjadi data.frame untuk ditampilkan
data_simul <- data.frame(Y = y, X1 = X1, X2 = X2)
head(data_simul)
##   Y          X1          X2
## 1 1 -0.56047565 -0.71040656
## 2 0 -0.23017749  0.25688371
## 3 1  1.55870831 -0.24669188
## 4 0  0.07050839 -0.34754260
## 5 0  0.12928774 -0.95161857
## 6 0  1.71506499 -0.04502772

Estimasi dengan metode Newton-Raphson

# Membuat fungsi log-likelihood
log_likelihood <- function(beta, X, y) {
  p <- 1 / (1 + exp(-X %*% beta))  # Probabilitas dengan fungsi logistik
  sum(y * log(p) + (1 - y) * log(1 - p))  # Fungsi log-likelihood
}

# Membuat fungsi gradien
gradient <- function(beta, X, y) {
  p <- 1 / (1 + exp(-X %*% beta))
  t(X) %*% (y - p)  # Gradien dari log-likelihood
}

# Membuat fungsi Hessian
hessian <- function(beta, X, y) {
  p <- 1 / (1 + exp(-X %*% beta))
  W <- diag(as.vector(p * (1 - p)))  # Matriks bobot
  -t(X) %*% W %*% X  # Matriks Hessian
}

# Data simulasi
set.seed(123)
n <- 100
X <- cbind(1, rnorm(n), rnorm(n))  # Termasuk intercept
beta_true <- c(-1, 0.5, 0.3)  # Koefisien yang benar
y <- rbinom(n, 1, plogis(X %*% beta_true))  # Variabel dependen biner

# Iterasi Newton-Raphson
beta_start <- rep(0, ncol(X))  # Estimasi awal
tol <- 1e-6  # Toleransi konvergensi
max_iter <- 100  # Batas iterasi
beta <- beta_start
for (i in 1:max_iter) {
  grad <- gradient(beta, X, y)
  hess <- hessian(beta, X, y)
  beta_new <- beta - solve(hess) %*% grad
  if (max(abs(beta_new - beta)) < tol) break
  beta <- beta_new
}

# Estimasi akhir koefisien
beta
##           [,1]
## [1,] -1.777297
## [2,]  1.117173
## [3,]  1.030997

Estimasi menggunakan package model GLM

Hasil estimasi model regresi logistik menunjukkan bahwa koefisien untuk intercept adalah sekitar -1.777, sementara koefisien untuk variabel X1​ (pendapatan) sebesar 1.117 dan untuk X2 (usia) sebesar 1.031. Nilai-nilai ini identik antara hasil estimasi manual menggunakan algoritma Newton-Raphson dan hasil dari fungsi glm() di R, yang mengindikasikan bahwa implementasi manual yang digunakan berhasil mereplikasi proses estimasi yang dilakukan oleh perangkat lunak.

Secara substantif, interpretasi dari koefisien ini adalah sebagai berikut :

  • Ketika X2 (usia) konstan, peningkatan satu satuan pada X1​ (pendapatan) menyebabkan peningkatan log-odds pembelian sebesar 1.117.

  • Ketika X1 (pendapatan) konstan, peningkatan satu unit pada X2 (usia)​ dikaitkan dengan peningkatan log-odds pembelian sebesar 1.031.

  • Kedua koefisien X1 dan X2 positif sehingga baik pendapatan maupun usia memiliki pengaruh positif terhadap peluang seseorang membeli produk.

Selain itu, nilai-nilai p-value yang sangat kecil untuk semua koefisien (< 0.01) menunjukkan bahwa ketiganya signifikan secara statistik, sehingga kita memiliki cukup bukti untuk menyatakan bahwa pendapatan dan usia berpengaruh terhadap keputusan pembelian.

Estimasi menggunakan package model GLM

model <- glm(y ~ X[,2] + X[,3], family = binomial())
summary(model)
## 
## Call:
## glm(formula = y ~ X[, 2] + X[, 3], family = binomial())
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.7773     0.3497  -5.083 3.71e-07 ***
## X[, 2]        1.1172     0.3711   3.010 0.002608 ** 
## X[, 3]        1.0310     0.3106   3.319 0.000902 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 102.791  on 99  degrees of freedom
## Residual deviance:  81.841  on 97  degrees of freedom
## AIC: 87.841
## 
## Number of Fisher Scoring iterations: 5

Perhitungan di atas menunjukan estimasi koefisien yang sama dengan estimasi koefisien menggunakan metode Newton Raphson. Artinya, hasil manual dari Newton Raphson mendekati hasil package dari GLM.

7.4.1.2. Inferensi Parameter : Uji Wald

Uji Wald digunakan untuk menguji signifikansi koefisien regresi. Hipotesis yang diuji adalah :

\[ H_0: \beta_i = 0 \quad \text{vs} \quad H_1: \beta_i \ne 0 \]

Statistik Uji Wald :

\[ W = \frac{\hat{\beta}_i^2}{\text{Var}(\hat{\beta}_i)} \]

Atau:

\[ Z = \frac{\hat{\beta}_i}{\text{SE}(\hat{\beta}_i)} \sim \mathcal{N}(0,1) \]

Berikut adalah proses pengujian hipotesis Uji Wald pada Studi Kasus : Pengaruh Pendapatan dan Usia terhadap Keputusan Membeli.

Hipotesis\[ H_0: \beta_i = 0 \] \[H_1: \beta_i \ne 0\]

Taraf Signifikansi

α = 5%

Statistik Uji

# Uji Wald untuk koefisien regresi
wald_test <- summary(model)$coefficients[, "z value"]
wald_test_pvalue <- 2 * (1 - pnorm(abs(wald_test)))
wald_test_pvalue
##  (Intercept)       X[, 2]       X[, 3] 
## 3.714801e-07 2.608279e-03 9.019993e-04

Diperoleh pvalue untuk X1 = 2.61*10-3 dan pvalue untuk X2 = 9.02&10-4

Kriteria Uji

Tolak H0 jika pvalue < α

Keputusan

pvalue kedua variabel X1 dan X2 < α sehingga H0 ditolak

Kesimpulan

Terdapat cukup bukti untuk menyatakan bahwa koefisien regresi dari kedua variabel X1X dan X2​ berbeda secara signifikan dari nol. Dengan kata lain, baik X1 (pendapatan)​ maupun X2 (usia)​ memiliki pengaruh yang signifikan secara statistik terhadap probabilitas terjadinya pembelian produk (respon bernilai 1) dalam model regresi logistik yang dibangun.

7.4.1.3. Inferensi Parameter : Uji Likelihood Rasio

Uji Likelihood Ratio (LR) adalah metode untuk membandingkan dua model regresi yang bersarang (nested), yaitu sebuah model yang lebih kompleks (model penuh) dan sebuah model yang lebih sederhana (model tereduksi).

Model tereduksi adalah model yang tidak mencakup satu atau lebih variabel yang terdapat pada model penuh. Artinya, model tereduksi merupakan versi yang dibatasi dari model penuh, di mana koefisien tertentu dianggap sama dengan nol. Sebaliknya, model penuh (full model) adalah model yang memuat semua variabel yang dipertimbangkan dalam analisis.

Secara konseptual, kita ingin menguji apakah variabel-variabel tambahan dalam model penuh benar-benar memberikan kontribusi signifikan dalam meningkatkan kemampuan model menjelaskan data. Jika tidak, maka model yang lebih sederhana (tereduksi) sudah cukup memadai.

Hipotesis yang diuji adalah:

\[ H_0: \text{Model tereduksi cukup baik} \quad \text{vs} \quad H_1: \text{Model lengkap lebih baik} \]

Statistik uji:

\[ \Lambda = 2 \left[ \ln L_{\text{full}} - \ln L_{\text{reduced}} \right] \]

Dengan distribusi asimtotik:

\[ \Lambda \sim \chi^2_{df} \]

Berikut adalah contoh pengujian Uji Likelihood Rasio menggunakan Studi Kasus: Pengaruh Pendapatan dan Usia terhadap Keputusan Membeli. Dalam studi kasus ini, kita ingin mengevaluasi apakah variabel Usia (X2) memberikan kontribusi signifikan dalam menjelaskan keputusan membeli (respon biner), setelah mempertimbangkan variabel Pendapatan (X1). Untuk itu, kita akan melakukan uji Likelihood Ratio untuk membandingkan dua model :

  • Model penuh : mencakup kedua variabel prediktor, yaitu pendapatan (X1) dan usia (X2)

    \[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_1 \cdot \text{Pendapatan} + \beta_2 \cdot \text{Usia} \]

  • Model terduksi : hanya mencakup satu variabel prediktor, yaitu pendapatan (X1)

    \[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_1 \cdot \text{Pendapatan} \]

Hipotesis

H0 : Koefisien untuk Usia = 0 (model tereduksi cukup baik)

H1 : Koefisien untuk Usia ≠ 0 (model penuh lebih baik)

Taraf Signifikansi

α = 5%

Statistik Uji

# Model penuh: menggunakan X1 dan X2
full_model <- glm(y ~ X[,2] + X[,3], family = binomial())

# Model tereduksi: hanya menggunakan X1
reduced_model <- glm(y ~ X[,2], family = binomial())

# Hitung nilai log-likelihood secara eksplisit sebagai numerik
ll_full <- as.numeric(logLik(full_model))
ll_reduced <- as.numeric(logLik(reduced_model))

# Statistik uji Likelihood Ratio
lr_stat <- 2 * (ll_full - ll_reduced)

# Derajat kebebasan = jumlah parameter yang dibatasi = 1
p_value_lr <- 1 - pchisq(lr_stat, df = 1)

# Tampilkan p-value
p_value_lr
## [1] 0.0003022855

Diperoleh pvalue = 0.0003

Kriteria Uji

Tolak H0 jika pvalue < α

Keputusan

pvalue (0.0003) < α (0.05) sehingga H0 ditolak

Kesimpulan

Terdapat cukup bukti untuk menyatakan bahwa model penuh (yang mencakup variabel Pendapatan dan Usia) secara signifikan lebih baik dibandingkan model tereduksi (yang hanya mencakup Pendapatan). Dengan kata lain, penambahan variabel Usia memberikan kontribusi signifikan dalam meningkatkan kemampuan model untuk menjelaskan variasi keputusan membeli. Maka, variabel Usia sebaiknya dipertahankan dalam model.

7.4.1.4. Evaluasi Kebaikan Model

Evaluasi kebaikan model regresi logistik bertujuan untuk menilai seberapa baik model yang telah dibangun dalam menjelaskan data. Selain melihat signifikansi masing-masing parameter, kita juga perlu membandingkan model secara keseluruhan menggunakan kriteria informasi. Dua kriteria umum yang sering digunakan adalah Akaike Information Criterion (AIC) dan Bayesian Information Criterion (BIC).

Akaike Information Criterion (AIC)

AIC merupakan kriteria evaluasi yang menghitung keseimbangan antara goodness-of-fit dan kompleksitas model. Semakin banyak parameter yang ditambahkan, kemungkinan model akan lebih cocok terhadap data, namun bisa menimbulkan risiko overfitting. AIC memberikan penalti terhadap kompleksitas model.

Rumus AIC:

\[ \text{AIC} = -2 \log L(\hat{\beta}) + 2k \]

Di mana:

- \(\log L(\hat{\beta})\) adalah log-likelihood model pada estimasi parameter maksimum.

- \(k\) adalah jumlah total parameter dalam model (termasuk intercept).

Model yang memiliki nilai AIC lebih kecil dianggap lebih baik, karena menunjukkan keseimbangan antara ketepatan model dan kesederhanaan struktur model.

Bayesian Information Criterion (BIC)

BIC mirip dengan AIC, namun memberikan penalti yang lebih besar terhadap kompleksitas model, terutama jika ukuran sampel besar. Oleh karena itu, BIC lebih konservatif dalam memilih model dengan parameter tambahan.

Rumus BIC:

\[ \text{BIC} = -2 \log L(\hat{\beta}) + k \log n \]

Di mana \(n\) adalah jumlah observasi dalam data.

Sama seperti AIC, model dengan nilai BIC yang lebih kecil dianggap lebih baik.

Contoh Perhitungan AIC dan BIC di R

Kita akan menghitung nilai AIC dan BIC dari model regresi logistik untuk model penuh (X1 dan X2) dan model tereduksi (X1 saja) pada Studi Kasus : Pengaruh Pendapatan dan Usia terhadap Keputusan Membeli yang telah dibangun sebelumnya :

# Model penuh: menggunakan X1 dan X2
full_model <- glm(y ~ X[,2] + X[,3], family = binomial())

# Model tereduksi: hanya menggunakan X1
reduced_model <- glm(y ~ X[,2], family = binomial())

# Hitung AIC dan BIC untuk kedua model
aic_full <- AIC(full_model)
bic_full <- BIC(full_model)

aic_reduced <- AIC(reduced_model)
bic_reduced <- BIC(reduced_model)

# Tampilkan hasil AIC dan BIC untuk kedua model
cat("AIC untuk model penuh: ", aic_full, "\n")
## AIC untuk model penuh:  87.84067
cat("BIC untuk model penuh: ", bic_full, "\n")
## BIC untuk model penuh:  95.65618
cat("AIC untuk model tereduksi: ", aic_reduced, "\n")
## AIC untuk model tereduksi:  98.89685
cat("BIC untuk model tereduksi: ", bic_reduced, "\n")
## BIC untuk model tereduksi:  104.1072

Kesimpulan

Model penuh yang menggunakan kedua variabel X1​ dan X2​ memiliki AIC sebesar 87.84 dan BIC sebesar 95.66, sementara model tereduksi yang hanya menggunakan X1​ memiliki AIC sebesar 98.90 dan BIC sebesar 104.11. Dari hasil ini, kita dapat menarik beberapa kesimpulan penting.

Pertama, model penuh lebih baik dalam menjelaskan data daripada model tereduksi. Hal ini terlihat dari nilai AIC dan BIC yang lebih rendah pada model penuh, yang menunjukkan bahwa meskipun model penuh lebih kompleks karena memiliki dua variabel prediktor, ia masih lebih efektif dalam mencocokkan data tanpa penalti besar terhadap jumlah parameter. Dalam hal ini, meskipun ada penalti untuk model yang lebih kompleks, penambahan variabel X2​ memberikan kontribusi yang signifikan terhadap penurunan nilai AIC dan BIC.

Sebaliknya, model tereduksi yang hanya menggunakan satu variabel prediktor X1​ memiliki nilai AIC dan BIC yang lebih tinggi, yang menunjukkan bahwa model ini tidak cukup baik dalam menjelaskan data. Meskipun model tereduksi lebih sederhana, kurangnya variabel yang menjelaskan variasi dalam data menyebabkan model ini kurang fit dibandingkan dengan model penuh.

Dengan kata lain, meskipun model tereduksi lebih sederhana dan memiliki lebih sedikit parameter, model penuh memberikan penjelasan yang lebih baik terhadap data yang tersedia, yang tercermin dalam nilai AIC dan BIC yang lebih rendah. Oleh karena itu, model penuh lebih disarankan untuk digunakan karena memberikan keseimbangan yang lebih baik antara kesederhanaan dan ketepatan dalam menjelaskan hubungan antara variabel.

7.4.2. Model Poisson

Model Poisson adalah model regresi untuk data jumlah (count data) yang mengikuti distribusi Poisson. Regresi Poisson digunakan untuk memodelkan variabel dependen berbentuk jumlah kejadian dalam interval waktu atau ruang tertentu. Model ini sangat berguna saat kita ingin mengkaji faktor-faktor yang mempengaruhi jumlah kejadian suatu peristiwa, seperti jumlah kecelakaan di jalan, jumlah penyakit, atau jumlah pembelian barang.

Model regresi Poisson mengasumsikan bahwa jumlah kejadian \(y_i\) untuk setiap unit pengamatan mengikuti distribusi Poisson dengan parameter \(\lambda_i\), yang merupakan rata-rata kejadian per unit waktu atau ruang, yang dihitung berdasarkan model linier.

Secara umum, model Poisson dapat ditulis sebagai:

\[ \log(\lambda_i) = \beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} + \dots + \beta_p X_{ip} \]

Di mana:

- \(\lambda_i\) adalah tingkat kejadian (rate) untuk unit ke-\(i\),

- \(X_{i1}, X_{i2}, \dots, X_{ip}\) adalah variabel independen yang mempengaruhi jumlah kejadian,

- \(\beta_0, \beta_1, \dots, \beta_p\) adalah parameter yang akan diestimasi.

7.4.2.1. Metode Estimasi Iterative Reweighted Least Squares (IRLS)

Metode Iterative Reweighted Least Squares (IRLS) adalah teknik yang digunakan untuk mengestimasi parameter dalam model Generalized Linear Models (GLM), termasuk model Poisson. IRLS bertujuan untuk mencari estimasi parameter yang meminimalkan log-likelihood, dengan memperbarui parameter melalui beberapa iterasi. Proses ini berfokus pada penggunaan bobot yang dihitung berdasarkan prediksi dari model sebelumnya. Tujuan utama dari IRLS adalah untuk mendapatkan estimasi parameter yang optimal meskipun modelnya tidak dapat diselesaikan secara analitik.

Berikut adalah langkah-langkah dalam IRLS :

  1. Inisialisasi Parameter: Tentukan tebakan awal untuk parameter model, seperti \(\beta_0, \beta_1, \dots, \beta_p\).

  2. Hitung Prediksi \(\hat{\lambda}_i\) : Prediksi dihitung dengan \(\hat{\lambda}_i = \exp(\beta_0 + \beta_1 X_{i1} + \dots + \beta_p X_{ip})\), di mana \(X\) adalah variabel independen dan \(\beta\) adalah parameter yang akan diestimasi.

  3. Hitung Bobot : Matriks bobot \(W\) dihitung dengan memasukkan nilai prediksi \(\hat{\lambda}_i\) pada diagonal matriks tersebut.

  4. Perbarui Parameter : Parameter diperbarui dengan rumus pembaruan:

\[ \beta^{(k+1)} = \left(X^T W X\right)^{-1} X^T W \log(y) \]

  1. Periksa Konvergensi: Iterasi terus dilakukan hingga perubahan parameter sangat kecil, menandakan konvergensi tercapai.

Studi Kasus : Analisis Jumlah Kunjungan Pasien

Sebuah rumah sakit ingin menganalisis jumlah kunjungan pasien pada klinik umum berdasarkan beberapa variabel seperti usia pasien dan jarak rumah ke rumah sakit. Mereka ingin membangun model yang dapat memprediksi jumlah kunjungan pasien setiap harinya menggunakan model Poisson karena variabel dependen yang diobservasi (jumlah kunjungan pasien) adalah data hitung (count data). Berikut adalah data sampel yang telah diumpulkan rumah sakit tersebut :

set.seed(42)
n <- 100  # Jumlah sampel
X1 <- rnorm(n, mean = 50, sd = 10)  # Usia pasien
X2 <- rnorm(n, mean = 5, sd = 2)    # Jarak rumah ke rumah sakit (dalam kilometer)
y <- rpois(n, lambda = exp(0.1 + 0.03 * X1 + 0.1 * X2))  # Jumlah kunjungan pasien (count data)

# Membuat data frame
data <- data.frame(y, X1, X2)

# Menampilkan beberapa baris data
head(data)
##    y       X1       X2
## 1  7 63.70958 7.401931
## 2  8 44.35302 7.089502
## 3 11 53.63128 2.993583
## 4  9 56.32863 8.696964
## 5  4 54.04268 3.666453
## 6  7 48.93875 5.211028

Untuk menyelesaikan permasalahan tersebut, rumah sakit menggunakan Iterative Reweighted Least Squares (IRLS) untuk mengestimasi parameter model Poisson yang menggambarkan hubungan antara usia pasien, jarak ke rumah sakit, dan jumlah kunjungan yang terjadi.

Perhitungan Iterative Reweighted Least Squares (IRLS)

# Inisialisasi Parameter
X <- cbind(1, data$X1, data$X2)  # Matriks desain dengan kolom 1 untuk intercept
y <- data$y

beta <- c(0, 0, 0)  # Inisialisasi koefisien
tol <- 1e-6         # Toleransi konvergensi
max_iter <- 100     # Maksimum jumlah iterasi

# Proses Iterasi IRLS
for (i in 1:max_iter) {
  eta <- X %*% beta  # Linear predictor (eta = X * beta)
  lambda <- exp(eta)  # Prediksi untuk jumlah kejadian (lambda = exp(eta))
  
  W <- diag(as.numeric(lambda))  # Matriks bobot (diagonal matrix of lambda)
  
  # Membuat nilai z
  z <- eta + (y - lambda) / lambda
  
  # Pembaruan parameter
  beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
  
  # Memeriksa konvergensi
  if (sum(abs(beta_new - beta)) < tol) {
    cat("Konvergen pada iterasi ke-", i, "\n")
    break
  }
  
  beta <- beta_new  # Perbarui beta untuk iterasi selanjutnya
}
## Konvergen pada iterasi ke- 14
# Menampilkan estimasi parameter akhir
beta
##            [,1]
## [1,] 0.47334973
## [2,] 0.02372232
## [3,] 0.07998797

Hasil estimasi model Poisson menunjukkan bahwa koefisien untuk intercept adalah sekitar 0.473, sementara koefisien untuk variabel usia (X1) sebesar 0.0237 dan untuk variabel jarak ke rumah sakit (X2) sebesar 0.07999.

Secara substantif, interpretasi dari koefisien-koefisien ini dalam bentuk log-odds adalah sebagai berikut:

  1. Intercept (0.473): Ketika kedua variabel (usia dan jarak) sama-sama nol, log-odds jumlah kunjungan pasien adalah 0.473. Artinya, pada kondisi ini, log-odds kunjungan pasien lebih besar dibandingkan dengan kondisi dasar (log-odds = 0), namun angka ini menunjukkan nilai dasar yang relatif kecil. Meskipun demikian, dalam konteks nyata, nilai usia (X1) dan jarak (X2) tidak mungkin bernilai nol. Sebagai contoh, usia pasien tidak mungkin 0 tahun, dan jarak ke rumah sakit pun tidak mungkin 0 kilometer untuk semua pasien. Oleh karena itu, intercept ini lebih berfungsi sebagai titik awal atau baseline untuk model, yang memberikan gambaran mengenai log-odds jumlah kunjungan jika semua variabel prediktor berada pada nilai referensi mereka, meskipun secara praktis nilai-nilai tersebut tidak akan tercapai.

  2. Koefisien Usia (0.0237): Ketika jarak ke rumah sakit (X2) tetap konstan, setiap peningkatan satu unit pada usia pasien (X1) berhubungan dengan peningkatan log-odds jumlah kunjungan pasien sebesar 0.0237. Dengan kata lain, setiap penambahan satu tahun usia pasien meningkatkan log-odds kunjungan pasien ke rumah sakit sebesar 0.0237. Koefisien ini menunjukkan bahwa semakin tua pasien, semakin tinggi log-odds untuk mengalami lebih banyak kunjungan.

  3. Koefisien Jarak (0.07999): Ketika usia pasien (X1) konstan, setiap peningkatan satu kilometer pada jarak rumah ke rumah sakit (X2) berhubungan dengan peningkatan log-odds jumlah kunjungan sebesar 0.07999. Ini berarti, semakin jauh jarak pasien dari rumah sakit, semakin tinggi log-odds untuk terjadi lebih banyak kunjungan.

Perhitungan model GLM dengan package

model_poisson <- glm(y ~ X1 + X2, family = poisson(), data = data)
summary(model_poisson)
## 
## Call:
## glm(formula = y ~ X1 + X2, family = poisson(), data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  0.47335    0.21734   2.178   0.0294 *  
## X1           0.02372    0.00358   6.627 3.42e-11 ***
## X2           0.07999    0.01990   4.020 5.82e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 166.11  on 99  degrees of freedom
## Residual deviance: 103.82  on 97  degrees of freedom
## AIC: 493.76
## 
## Number of Fisher Scoring iterations: 4

Perhitungan di atas menunjukan estimasi koefisien yang sama dengan estimasi koefisien menggunakan metode IRLS. Artinya, hasil manual dari IRLS mendekati hasil package dari GLM.

7.4.2.2. Inferensi : Uji Wald

Uji Wald digunakan untuk menguji signifikansi parameter dalam model GLM. Uji ini membandingkan estimasi parameter terhadap standar error-nya untuk menentukan apakah parameter tersebut signifikan atau tidak.

Uji Wald dilakukan dengan hipotesis :

\[ H_0 : \beta_j = 0 \quad \text{vs} \quad H_1 : \beta_j \neq 0 \]

Statistik uji Wald dihitung dengan:

\[ W_j = \frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)} \]

atau dalam bentuk kuadrat:

\[ W_j^2 = \left( \frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)} \right)^2 \sim \chi^2_1 \]

Dimana:

- \(\hat{\beta}_j\) adalah estimasi parameter ke-\(j\),

- \(\text{SE}(\hat{\beta}_j)\) adalah standar error dari estimasi tersebut.

Jika nilai statistik uji lebih besar dari nilai kritis chi-kuadrat dengan 1 derajat kebebasan pada taraf signifikansi tertentu (misalnya \(\alpha = 0.05\)), maka hipotesis nol ditolak, artinya \(\beta_j\) signifikan secara statistik. Namun, jika pembanding menggunakan pvalue, maka H0 ditolak jika p value kurang dari taraf signifikansi.

Berikut adalah proses pengujian koefisien pada Studi Kasus : Analisis Jumlah Kunjungan Pasien.

Hipotesis\[ H_0: \beta_i = 0 \] \[H_1: \beta_i \ne 0\]

Taraf Signifikansi

α = 5%

Statistik Uji

# Uji Wald untuk koefisien regresi
wald_test <- summary(model_poisson)$coefficients[, "z value"]
wald_test_pvalue <- 2 * (1 - pnorm(abs(wald_test)))
wald_test_pvalue
##  (Intercept)           X1           X2 
## 2.941102e-02 3.422818e-11 5.822999e-05

Diperoleh pvalue untuk X1 = 3.42*10-11 dan pvalue untuk X2 = 5.82*10-5

Kriteria Uji

Tolak H0 jika pvalue < α

Keputusan

pvalue kedua variabel X1 dan X2 < α sehingga H0 ditolak

Kesimpulan

Terdapat cukup bukti untuk menyatakan bahwa koefisien regresi dari kedua variabel X1 dan X2​ berbeda secara signifikan dari nol. Dengan kata lain, baik X1 (usia)​ maupun X2 (jarak)​ memiliki pengaruh yang signifikan secara statistik terhadap jumlah kunjungan pasien dalam model regresi poisson yang dibangun.

7.4.2.3. Inferensi : Uji Likelihood Rasio

Uji Likelihood Ratio (LR) adalah metode untuk membandingkan dua model regresi yang bersarang (nested), yaitu sebuah model yang lebih kompleks (model penuh) dan sebuah model yang lebih sederhana (model tereduksi).

Model tereduksi adalah model yang tidak mencakup satu atau lebih variabel yang terdapat pada model penuh. Artinya, model tereduksi merupakan versi yang dibatasi dari model penuh, di mana koefisien tertentu dianggap sama dengan nol. Sebaliknya, model penuh (full model) adalah model yang memuat semua variabel yang dipertimbangkan dalam analisis.

Secara konseptual, kita ingin menguji apakah variabel-variabel tambahan dalam model penuh benar-benar memberikan kontribusi signifikan dalam meningkatkan kemampuan model menjelaskan data. Jika tidak, maka model yang lebih sederhana (tereduksi) sudah cukup memadai.

Hipotesis yang diuji adalah:

\[ H_0: \text{Model tereduksi cukup baik} \quad \text{vs} \quad H_1: \text{Model lengkap lebih baik} \]

Statistik uji:

\[ \Lambda = 2 \left[ \ln L_{\text{full}} - \ln L_{\text{reduced}} \right] \]

Dengan distribusi asimtotik:

\[ \Lambda \sim \chi^2_{df} \]

Berikut adalah contoh pengujian Uji Likelihood Rasio menggunakan Studi Kasus : Analisis Jumlah Kunjungan Pasien. Dalam studi kasus ini, kita ingin mengevaluasi apakah variabel Usia (X1) memberikan kontribusi signifikan dalam menjelaskan jumlah kunjungan pasien setelah mempertimbangkan variabel jarak ke rumah sakit (X2). Untuk itu, kita akan melakukan uji Likelihood Ratio untuk membandingkan dua model :

  • Model penuh : mencakup kedua variabel prediktor, yaitu usia (X1) dan jarak ke rumah sakit (X2)

    \[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_1 \cdot X_1 + \beta_2 \cdot X_2 \]

  • Model terduksi : hanya mencakup satu variabel prediktor, yaitu jarak ke rumah sakit (X2)

    \[ \log\left( \frac{p}{1 - p} \right) = \beta_0 + \beta_2 \cdot X_2 \]

Hipotesis

H0 : Koefisien untuk Usia = 0 (model tereduksi cukup baik)

H1 : Koefisien untuk Usia ≠ 0 (model penuh lebih baik)

Taraf Signifikansi

α = 5%

Statistik Uji

# Model penuh: menggunakan X1 dan X2
full_model <- glm(y ~ X1 + X2, family = poisson(), data = data)

# Model tereduksi: hanya menggunakan X2
reduced_model <- glm(y ~ X2, family = poisson(), data = data)

# Hitung nilai log-likelihood sebagai numerik
ll_full <- as.numeric(logLik(full_model))
ll_reduced <- as.numeric(logLik(reduced_model))

# Hitung statistik uji Likelihood Ratio
lr_stat <- 2 * (ll_full - ll_reduced)

# Derajat kebebasan = jumlah parameter yang dibatasi = 1
df <- attr(logLik(full_model), "df") - attr(logLik(reduced_model), "df")

# Hitung p-value
p_value_lr <- 1 - pchisq(lr_stat, df = df)

# Tampilkan hasil
cat("Statistik Likelihood Ratio:", lr_stat, "\n")
## Statistik Likelihood Ratio: 45.62981
cat("Derajat kebebasan:", df, "\n")
## Derajat kebebasan: 1
cat("p-value:", p_value_lr, "\n")
## p-value: 1.428513e-11

Diperoleh pvalue = 1.43*10-11

Kriteria Uji

Tolak H0 jika pvalue < α

Keputusan

pvalue (1.43*10-11) < α (0.05) sehingga H0 ditolak

Kesimpulan

Terdapat cukup bukti untuk menyatakan bahwa model penuh (yang mencakup variabel Usia dan Jarak ke Rumah Sakit) secara signifikan lebih baik dibandingkan model tereduksi (yang hanya mencakup Jarak ke Rumah Sakit). Dengan kata lain, penambahan variabel Usia memberikan kontribusi signifikan dalam meningkatkan kemampuan model untuk menjelaskan variasi jumlah kunjungan pasien. Maka, variabel Usia sebaiknya dipertahankan dalam model.

7.4.2.4. Evaluasi Kebaikan Model

Evaluasi kebaikan model poisson bertujuan untuk menilai seberapa baik model yang telah dibangun dalam menjelaskan data. Dua kriteria umum yang sering digunakan adalah Akaike Information Criterion (AIC) dan Bayesian Information Criterion (BIC).

Akaike Information Criterion (AIC)

AIC merupakan kriteria evaluasi yang menghitung keseimbangan antara goodness-of-fit dan kompleksitas model. Semakin banyak parameter yang ditambahkan, kemungkinan model akan lebih cocok terhadap data, namun bisa menimbulkan risiko overfitting. AIC memberikan penalti terhadap kompleksitas model.

Rumus AIC:

\[ \text{AIC} = -2 \log L(\hat{\beta}) + 2k \]

Di mana:

- \(\log L(\hat{\beta})\) adalah log-likelihood model pada estimasi parameter maksimum.

- \(k\) adalah jumlah total parameter dalam model (termasuk intercept).

Model yang memiliki nilai AIC lebih kecil dianggap lebih baik, karena menunjukkan keseimbangan antara ketepatan model dan kesederhanaan struktur model.

Bayesian Information Criterion (BIC)

BIC mirip dengan AIC, namun memberikan penalti yang lebih besar terhadap kompleksitas model, terutama jika ukuran sampel besar. Oleh karena itu, BIC lebih konservatif dalam memilih model dengan parameter tambahan.

Rumus BIC:

\[ \text{BIC} = -2 \log L(\hat{\beta}) + k \log n \]

Di mana \(n\) adalah jumlah observasi dalam data.

Sama seperti AIC, model dengan nilai BIC yang lebih kecil dianggap lebih baik.

Contoh Perhitungan AIC dan BIC di R

Kita akan menghitung nilai AIC dan BIC dari model poisson untuk model penuh (X1 dan X2) dan model tereduksi (X2 saja) pada Studi Kasus : Analisis Jumlah Kunjungan Pasien yang telah dibangun sebelumnya :

# Hitung AIC dan BIC untuk model penuh
aic_full <- AIC(full_model)
bic_full <- BIC(full_model)

# Hitung AIC dan BIC untuk model tereduksi
aic_reduced <- AIC(reduced_model)
bic_reduced <- BIC(reduced_model)

evaluasi <- matrix(c(aic_full, aic_reduced, bic_full, bic_reduced), nrow = 2, byrow=TRUE)
colnames(evaluasi) <- c("Model Penuh", "Model Tereduksi")
rownames(evaluasi) <- c("AIC", "BIC")

print(evaluasi)
##     Model Penuh Model Tereduksi
## AIC    493.7609        537.3907
## BIC    501.5764        542.6010

Berdasarkan hasil perhitungan, nilai AIC untuk model penuh adalah sebesar 493.76, sedangkan untuk model tereduksi sebesar 537.39. Demikian pula, nilai BIC untuk model penuh adalah 501.58, sedangkan model tereduksi memiliki nilai BIC sebesar 542.60.

Karena baik nilai AIC maupun BIC lebih kecil pada model penuh, hal ini menunjukkan bahwa model penuh memberikan keseimbangan yang lebih baik antara tingkat kesesuaian model terhadap data (goodness-of-fit) dan kompleksitas model. Dengan kata lain, penambahan variabel X1 ke dalam model yang semula hanya mencakup X2 secara substansial meningkatkan kualitas model secara statistik.

Oleh karena itu, dari sudut pandang informasi kriteria AIC dan BIC, model penuh lebih disarankan untuk digunakan dalam menggambarkan hubungan antara variabel respon dan kovariat dalam kasus ini.

CHAPTER 8 : REGRESI LOGISTIK DENGAN PREDIKTOR SKALA TERTENTU

Regresi logistik merupakan salah satu metode analisis statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons biner (dua kategori, misalnya: sukses/gagal, ya/tidak, 0/1) dengan satu atau lebih variabel prediktor. Metode ini sangat penting dalam berbagai bidang, seperti ilmu kesehatan, ilmu sosial, pemasaran, dan lainnya, ketika tujuan analisis adalah untuk memprediksi probabilitas suatu kejadian atau klasifikasi terhadap dua kategori.

Berbeda dengan regresi linear yang digunakan ketika variabel respons bersifat kontinu, regresi logistik digunakan ketika variabel respons bersifat dikotomi. Fungsi link yang digunakan dalam regresi logistik adalah logit, yaitu fungsi log dari odds :

\[ \text{logit}(p) = \log\left(\frac{p}{1 - p}\right) \]

dengan \(p\) adalah probabilitas dari kejadian yang dikodekan sebagai 1.

8.1. Skala Pengukuran Prediktor

Dalam regresi logistik, variabel prediktor dapat berasal dari berbagai skala pengukuran, yaitu :

8.1.1. Prediktor Nominal

Variabel nominal adalah variabel kategori yang tidak memiliki urutan logis antar kategorinya. Tujuan dari penggunaannya adalah untuk membedakan kategori, bukan untuk menunjukkan urutan. Contoh: jenis kelamin (laki-laki, perempuan), warna mobil (merah, biru, hitam).

Dalam regresi logistik, variabel nominal harus diubah menjadi variabel dummy. Jika terdapat \(k\) kategori, maka dibentuk \(k-1\) variabel dummy, dan satu kategori dijadikan kategori referensi atau baseline. Kategori referensi ini digunakan sebagai pembanding dalam interpretasi model.

Contoh :

Misalkan kita memiliki variabel Warna Mobil dengan tiga kategori : Merah, Biru, dan Hitam. Jika kita memilih “Merah” sebagai baseline, maka kita buat dua variabel dummy :

  • Biru =1 jika warna mobil biru, 0 lainnya

  • Hitam =1 jika warna mobil hitam, 0 lainnya

“Merah” tidak diwakili secara eksplisit dalam model, karena menjadi baseline sehingga model regresi logistik yang terbentuk adalah

\[ \text{logit}(p) = \beta_0 + \beta_1\text{Biru} + \beta_2 \text{Hitam} \]

dengan interpretasi sebagai berikut :

  • \(\beta_0\) adalah log-odds memiliki asuransi untuk warna mobil merah (baseline).

  • \(\beta_1\) adalah selisih log-odds antara mobil berwarna biru dibandingkan merah.

  • \(\beta_2\) adalah selisih log-odds antara mobil berwarna hitam dibandingkan merah.

Dengan demikian, pemilihan baseline memengaruhi interpretasi model, tetapi tidak memengaruhi prediksi model karena prediksi akhir tetap mempertimbangkan semua kategori secara tidak langsung.

8.1.2. Prediktor Ordinal

Variabel ordinal adalah variabel kategori yang memiliki urutan logis antar kategori, tetapi jarak antar kategori belum tentu sama. Contoh umum :

  • Tingkat pendidikan: SMA < Sarjana < Master < Doktor

  • Kepuasan pelanggan: Tidak Puas < Cukup Puas < Puas < Sangat Puas

Dalam regresi logistik, variabel ordinal dapat dimasukkan ke dalam model dengan dua pendekatan :

Pendekatan 1: Perlakukan sebagai Nominal

Kita mengabaikan urutan antar kategori dan membuat variabel dummy untuk setiap kategori (kecuali referensi).

Kelebihan:

  • Tidak mengasumsikan hubungan linier antara tingkatan.

  • Lebih fleksibel karena masing-masing tingkat boleh berdampak berbeda.

Kekurangan:

  • Menambah jumlah parameter dalam model.

  • Tidak memanfaatkan informasi urutan yang sebenarnya tersedia.

Pendekatan 2: Perlakukan sebagai Skala (Ordinal Numerik)

Kategori diberi skor numerik sesuai urutannya, misalnya:

  • SMA = 1

  • Sarjana = 2

  • Master = 3

  • Doktor = 4

Lalu dimasukkan sebagai prediktor numerik dalam model regresi logistik.

Kelebihan :

  • Sederhana, hanya butuh satu koefisien.

  • Menangkap arah hubungan antara tingkat ordinal dan log-odds respons.

Kekurangan :

  • Mengasumsikan efek linier antara tingkatan yang mungkin tidak sesuai dengan kenyataan.

8.1.3. Prediktor Rasio

Variabel rasio adalah variabel numerik kontinu dengan nol absolut dan rasio antar nilai bermakna. Contoh :

  • Umur (tahun)

  • Pendapatan (juta rupiah/bulan)

  • Berat badan (kg)

Dalam regresi logistik, prediktor rasio langsung dapat digunakan tanpa perlu pengkodean tambahan. Karakteristik prediktor rasio adalah :

  • Skala ini paling informatif karena menyimpan seluruh variasi data.

  • Tidak perlu diubah menjadi dummy.

  • Sering kali perlu standarisasi jika satuan terlalu besar atau berbeda jauh antar variabel.

8.2. Contoh Kasus

Sebuah survei dilakukan terhadap 200 individu untuk mengetahui faktor-faktor yang memengaruhi kemungkinan seseorang memiliki asuransi kesehatan. Variabel-variabel yang dicatat adalah:

  • Asuransi : 1 jika responden memiliki asuransi kesehatan, 0 jika tidak.

  • Pendidikan : Tingkat pendidikan terakhir responden, terdiri dari empat tingkat, yaitu SMA, Sarjana, Master, dan Doktor.

  • Pendapatan : Pendapatan per bulan dalam juta rupiah.

Berikut adalah data sampel yang telah dikumpulkan berdasarkan survei tersebut :

set.seed(123)
n <- 200
Pendidikan <- factor(sample(c("SMA", "Sarjana", "Master", "Doktor"), n, replace = TRUE,
                           prob = c(0.4, 0.35, 0.2, 0.05)),
                     levels = c("SMA", "Sarjana", "Master", "Doktor"))
Pendapatan <- round(rnorm(n, mean = 5 + as.numeric(Pendidikan), sd = 2), 1)
log_odds <- -2 + 0.6 * as.numeric(Pendidikan) + 0.4 * Pendapatan
prob_asuransi <- exp(log_odds) / (1 + exp(log_odds))
Asuransi <- rbinom(n, 1, prob_asuransi)
data <- data.frame(Asuransi, Pendidikan, Pendapatan)
head(data)
##   Asuransi Pendidikan Pendapatan
## 1        1        SMA        4.6
## 2        1     Master        8.5
## 3        1    Sarjana        6.5
## 4        1     Master        7.3
## 5        1     Master        6.1
## 6        0        SMA        5.9

Pertanyaannya adalah : apakah tingkat pendidikan dan pendapatan berpengaruh terhadap kepemilikan asuransi?

8.2.1. Eksplorasi Awal

Sebelum membangun model regresi logistik, penting untuk memahami karakteristik data melalui eksplorasi awal. Tujuan eksplorasi ini adalah :

  1. Mengetahui distribusi status kepemilikan asuransi (variabel respons) serta karakteristik rata-rata pendapatan di tiap kategori.

  2. Mengamati hubungan antara tingkat pendidikan (variabel prediktor ordinal) dan proporsi kepemilikan asuransi, yang akan memberikan gambaran awal mengenai potensi asosiasi atau tren.

Distribusi Jumlah dan Rata-Rata Pendapatan per Kategori Asuransi

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
summary1 <- data %>%
  dplyr::group_by(Asuransi) %>%
  dplyr::summarise(
    Jumlah = dplyr::n(),
    `Rata-rata Pendapatan` = mean(Pendapatan))
summary1
## # A tibble: 2 × 3
##   Asuransi Jumlah `Rata-rata Pendapatan`
##      <int>  <int>                  <dbl>
## 1        0     38                   4.91
## 2        1    162                   7.38

Berdasarkan hasil di atas, eksplorasi awal terhadap data hasil survei menunjukkan bahwa :

  • Dari 200 responden, 162 orang (81%) memiliki asuransi, dan 38 orang (19%) tidak.

  • Rata-rata pendapatan pada kelompok tanpa asuransi adalah sekitar 4.91 juta rupiah per bulan.

  • Rata-rata pendapatan kelompok dengan asuransi adalah 7.38 juta rupiah.

Hal ini mengindikasikan bahwa pendapatan mungkin berperan dalam memengaruhi kepemilikan asuransi. Semakin tinggi pendapatan, kemungkinan seseorang memiliki asuransi tampaknya juga meningkat.

Proporsi Kepemilikan Asuransi per Tingkat Pendidikan

prop_table <- data %>%
  dplyr::group_by(Pendidikan) %>%
  dplyr::summarise(
    `Proporsi Memiliki Asuransi` = mean(Asuransi),
    `Jumlah Responden` = dplyr::n())
prop_table
## # A tibble: 4 × 3
##   Pendidikan `Proporsi Memiliki Asuransi` `Jumlah Responden`
##   <fct>                             <dbl>              <int>
## 1 SMA                               0.623                 77
## 2 Sarjana                           0.908                 76
## 3 Master                            0.946                 37
## 4 Doktor                            1                     10

Berdasarkan hasil di atas, eksplorasi awal terhadap data hasil survei menunjukkan bahwa :

  • Terlihat adanya tren peningkatan proporsi kepemilikan asuransi seiring meningkatnya tingkat pendidikan.
  • Hanya sekitar 62% lulusan SMA memiliki asuransi, sementara semua lulusan Doktor (100%) memiliki asuransi.

Ini memperkuat dugaan bahwa pendidikan merupakan faktor penting yang memengaruhi kemungkinan seseorang memiliki asuransi. Informasi ini juga berguna untuk mempertimbangkan apakah variabel Pendidikan sebaiknya diperlakukan sebagai ordinal (karena menunjukkan tren) atau nominal (jika tren tidak signifikan atau tidak linear).

8.2.2. Perlakuan Variabel Ordinal (Pendidikan)

Variabel ordinal adalah variabel kategori yang memiliki urutan logis antar kategorinya, namun jarak antar kategori tersebut belum tentu sama. Contoh umum dari variabel ordinal adalah tingkat pendidikan, seperti: SMA < Sarjana < Master < Doktor. Dalam analisis regresi logistik, variabel ordinal seperti Pendidikan dapat diperlakukan dengan dua pendekatan :

8.2.2.1. Perlakuan Pendidikan Sebagai Nominal

Dalam pendekatan ini, Pendidikan dianggap sebagai variabel kategori biasa tanpa mempertimbangkan urutannya. Oleh karena itu, kita perlu membuat variabel dummy untuk setiap kategori, dengan salah satu kategori sebagai referensi (baseline). Dalam analisis ini, kategori “SMA” dijadikan sebagai baseline.

# Ubah Pendidikan menjadi faktor dan atur baseline-nya
library(dplyr)
library(forcats)
data_nominal <- data %>%
  mutate(Pendidikan = factor(Pendidikan, levels = c("SMA", "Sarjana", "Master", "Doktor")))

Setelah penentuan baseline, selanjutnya dilakukan pemodelan regresi logistik.

# Model regresi logistik dengan Pendidikan sebagai nominal
model_nominal <- glm(Asuransi ~ Pendidikan + Pendapatan, data = data_nominal, family = binomial)
summary(model_nominal)
## 
## Call:
## glm(formula = Asuransi ~ Pendidikan + Pendapatan, family = binomial, 
##     data = data_nominal)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         -3.4922     0.8592  -4.065 4.81e-05 ***
## PendidikanSarjana    1.4270     0.5012   2.847  0.00441 ** 
## PendidikanMaster     1.3854     0.8189   1.692  0.09068 .  
## PendidikanDoktor    14.8733  1152.5399   0.013  0.98970    
## Pendapatan           0.6984     0.1499   4.660 3.16e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 194.49  on 199  degrees of freedom
## Residual deviance: 131.63  on 195  degrees of freedom
## AIC: 141.63
## 
## Number of Fisher Scoring iterations: 16

Berikut adalah informasi yang diperoleh berdasarkan analisis model regresi logistik dengan memperlakukan variabel Pendidikan sebagai nominal.

Intercept

  • \(\beta_0 = -3.4922\) menyatakan bahwa log odds membeli asuransi untuk individu dengan pendidikan SMA dan pendapatan nol adalah \(-3.4922\).

  • Nilai p-value (\(4.81 \times 10^{-5}) < 0.05\), sehingga intercept ini signifikan secara statistik. Ini berarti nilai intercept berbeda secara nyata dari nol.

Pendidikan Sarjana

  • \(\beta_1 = 1.4270\) menyatakan bahwa individu dengan pendidikan Sarjana memiliki log odds membeli asuransi lebih tinggi sebesar 1.427 dibandingkan individu dengan pendidikan SMA, dengan pendapatan sama.

  • Odds ratio (OR) dihitung dengan: \[ \text{OR} = e^{1.427} \approx 4.17 \]Artinya, individu dengan pendidikan Sarjana memiliki peluang membeli asuransi sekitar 4.17 kali lebih besar daripada individu dengan pendidikan SMA.

  • P-value sebesar 0.00441 \(<\) 0.05 menunjukkan bahwa efek pendidikan Sarjana signifikan secara statistik.

Pendidikan Master

  • \(\beta_2 = 1.3854\) menyatakan bahwa individu dengan pendidikan Master memiliki log odds membeli asuransi lebih tinggi sebesar 1.385 dibandingkan pendidikan SMA.

  • Odds ratio (OR) dihitung dengan: \[ \text{OR} = e^{1.3854} \approx 3.99 \]Artinya, individu dengan pendidikan Master memiliki peluang membeli asuransi sekitar 3.99 kali lebih besar daripada individu dengan pendidikan SMA.

  • P-value sebesar 0.09068 \(>\) 0.05 mengindikasikan efek ini tidak signifikan secara statistik pada tingkat signifikansi 5%. Dengan kata lain, data tidak cukup kuat untuk menyimpulkan bahwa perbedaan ini nyata.

Pendidikan Doktor

  • \(\beta_3 = 14.8733\) menyatakan bahwa individu dengan pendidikan Doktor memiliki log odds membeli asuransi lebih tinggi sebesar 14.8733 dibandingkan individu dengan pendidikan SMA, dengan pendapatan sama.

  • Odds ratio (OR) dihitung dengan: \[ \text{OR} = e^{14.8733} \approx 2.90 \times 10^6 \] Artinya, individu dengan pendidikan Doktor memiliki peluang membeli asuransi sekitar 2.9 juta kali lebih besar daripada individu dengan pendidikan SMA. Namun, angka ini perlu diinterpretasikan dengan sangat hati-hati karena ketidakpastian estimasi yang sangat tinggi.

  • P-value sebesar 0.98970 \(>\) 0.05 menunjukkan bahwa efek pendidikan Doktor tidak signifikan secara statistik. Hal ini berarti data tidak memberikan cukup bukti bahwa perbedaan antara pendidikan Doktor dan SMA nyata dalam hal peluang membeli asuransi.

  • Standar error yang sangat besar (1152.54) menunjukkan ketidakpastian yang ekstrem terhadap estimasi koefisien ini. Hal ini bisa disebabkan oleh jumlah sampel yang sangat kecil atau tidak adanya variasi pada kelompok individu dengan pendidikan Doktor, misalnya jika seluruhnya tidak membeli atau seluruhnya membeli asuransi.

Pendapatan

  • \(\beta_4 = 0.6984\) menyatakan bahwa setiap kenaikan satu satuan pada variabel Pendapatan berasosiasi dengan peningkatan log odds membeli asuransi sebesar 0.6984, dengan kategori pendidikan yang sama.

  • Odds ratio (OR) dihitung dengan: \[ \text{OR} = e^{0.6984} \approx 2.01 \] Artinya, setiap kenaikan satu unit pendapatan meningkatkan peluang membeli asuransi sebesar 2.01 kali, dengan asumsi tingkat pendidikan tetap.

  • P-value sebesar \(3.16 \times 10^{-6} < 0.05\) menunjukkan bahwa efek Pendapatan signifikan secara statistik. Ini berarti bahwa pendapatan memiliki pengaruh yang nyata terhadap keputusan untuk membeli asuransi.

Visualisasi Model dengan Pendidikan sebagai Nominal

library(ggplot2)
data_nominal <- data_nominal %>% mutate(predicted = predict(model_nominal, type = "response"))

data_nominal %>%
  ggplot(aes(x = Pendapatan, y = predicted, color = Pendidikan)) +
  geom_point(alpha = 0.6, size = 2) +
  labs(
    title = "Prediksi Probabilitas Asuransi (Pendidikan sebagai Nominal)",
    x = "Pendapatan",
    y = "Probabilitas Prediksi"
  ) +
  theme_minimal()

Gambar di atas menggambarkan hasil model ketika Pendidikan diperlakukan sebagai variabel nominal, yang berarti setiap tingkat pendidikan dianggap sebagai kategori yang berdiri sendiri tanpa urutan.

Interpretasi:

  • Setiap kategori pendidikan diberi warna berbeda, menunjukkan bahwa model memperlakukan masing-masing tingkat pendidikan secara terpisah.

  • Terlihat adanya perbedaan bentuk kurva antara SMA, Sarjana, Master, dan Doktor. Misalnya, pada pendapatan rendah, kategori SMA menunjukkan probabilitas lebih rendah dibandingkan kategori lainnya.

Model ini lebih fleksibel karena tidak memaksakan hubungan linear antar tingkat pendidikan, tetapi juga lebih kompleks karena menggunakan lebih banyak parameter.

8.2.2.2. Perlakuan Pendidikan Sebagai Ordinal

Dalam pendekatan ini, kita mengasumsikan bahwa pengaruh Pendidikan terhadap peluang memiliki asuransi bersifat monoton (semakin tinggi tingkat pendidikan, semakin tinggi peluang). Kita bisa mengkodekan tingkat pendidikan sebagai angka:

  • SMA = 1

  • Sarjana = 2

  • Master = 3

  • Doktor = 4

# Tambahkan kolom numerik ordinal
pendidikan_ordinal <- c("SMA" = 1, "Sarjana" = 2, "Master" = 3, "Doktor" = 4)
data_ordinal <- data %>%
  mutate(Pendidikan_Ordinal = pendidikan_ordinal[as.character(Pendidikan)])

Setelah mengganti kategori menjadi angka, selanjutnya dilakukan pemodelan regresi logistik.

# Model regresi logistik dengan Pendidikan sebagai ordinal numerik
model_ordinal <- glm(Asuransi ~ Pendidikan_Ordinal + Pendapatan, data = data_ordinal, family = binomial)
summary(model_ordinal)
## 
## Call:
## glm(formula = Asuransi ~ Pendidikan_Ordinal + Pendapatan, family = binomial, 
##     data = data_ordinal)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         -4.4289     0.9320  -4.752 2.02e-06 ***
## Pendidikan_Ordinal   1.0521     0.3803   2.767  0.00567 ** 
## Pendapatan           0.6909     0.1490   4.638 3.52e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 194.49  on 199  degrees of freedom
## Residual deviance: 133.24  on 197  degrees of freedom
## AIC: 139.24
## 
## Number of Fisher Scoring iterations: 6

Berikut adalah informasi yang diperoleh berdasarkan analisis model regresi logistik dengan memperlakukan variabel Pendidikan sebagai ordinal.

Intercept

  • Koefisien sebesar -4.4289 menyatakan log-odds memiliki asuransi saat Pendidikan = 0 dan Pendapatan = 0, tidak memiliki makna langsung karena berada di luar domain data.

Pendidikan

  • Koefisien sebesar 1.0521 berarti setiap kenaikan satu tingkat pendidikan meningkatkan odds memiliki asuransi sebesar \(\exp(1.0521) \approx 2.86\) kali lipat, dengan asumsi pendapatan tetap.

  • P-value = 0.00567 \(<\) 0.05 , artinya tingkat pendidikan berpengaruh terhadap kepemilikan asuransi.

Pendapatan

  • Koefisien sebesar 0.6909 berarti setiap kenaikan 1 juta rupiah dalam pendapatan meningkatkan odds memiliki asuransi sebesar \(\exp(0.6909) \approx 1.997\) kali lipat.

  • P-value = \(3.52 \times 10^{-6} < 0.05\) , artinya pendapatan berpengaruh terhadap kepemilikan asuransi.

Model ini menunjukkan bahwa semakin tinggi tingkat pendidikan seseorang, semakin tinggi kemungkinan memiliki asuransi. Hal yang sama berlaku dengan pendapatan, semakin tinggi pendapatan seseorang, maka semakin tinggi juga kemungkinan memiliki asuransi.

Visualisasi Model dengan Pendidikan sebagai Ordinal

data_ordinal <- data_ordinal %>% mutate(predicted = predict(model_ordinal, type = "response"))

data_ordinal %>%
  ggplot(aes(x = Pendapatan, y = predicted, color = Pendidikan_Ordinal)) +
  geom_point(alpha = 0.6, size=2) +
  labs(title = "Prediksi Probabilitas Asuransi (Pendidikan sebagai Ordinal)",
       x = "Pendapatan", y = "Probabilitas Prediksi",
       color = "Tingkat Pendidikan") +
  theme_minimal()

Gambar di atas menunjukkan hubungan antara Pendapatan dan Probabilitas Prediksi Asuransi, dengan variabel Pendidikan diperlakukan sebagai ordinal. Warna menunjukkan tingkat pendidikan dari 1 hingga 4 (misalnya SMA = 1, Sarjana = 2, dst.), dalam gradasi biru.

Interpretasi :

  • Terlihat bahwa semakin tinggi tingkat pendidikan, probabilitas keikutsertaan asuransi cenderung meningkat untuk setiap tingkat pendapatan.

  • Garis prediksi membentuk kurva yang mulus dan konsisten seiring peningkatan pendidikan.

Hal ini mencerminkan asumsi bahwa pendidikan memiliki efek linear terhadap logit (fungsi log odds) probabilitas.

8.2.2.3. Perbandingan Model

Berikut adalah tabel perbandingan pendekatan Nominal vs Ordinal

Aspek Nominal Ordinal
Jumlah parameter Banyak (1 per kategori - 1) Satu
Mengasumsikan urutan Tidak Ya
Fleksibilitas Tinggi Rendah (hanya efek linier ordinal)
Efisiensi model Kurang (lebih banyak parameter) Lebih efisien
Interpretasi Spesifik per kategori Satu arah dan linier

Untuk pemilihan akhir, evaluasi seperti AIC dan likelihood ratio test dapat digunakan.

Evaluasi dengan AIC

AIC(model_nominal, model_ordinal)
##               df      AIC
## model_nominal  5 141.6345
## model_ordinal  3 139.2358

Model dengan pendidikan sebagai variabel ordinal memiliki AIC sebesar 139.24, sedangkan model dengan pendidikan sebagai nominal memiliki AIC sebesar 141.63. Karena AIC mengukur keseimbangan antara kualitas model dan kompleksitas (jumlah parameter), nilai AIC yang lebih rendah menunjukkan model yang lebih efisien. Dengan demikian, berdasarkan AIC, model ordinal lebih disukai karena menggunakan lebih sedikit parameter (parsimonious) dan memberikan kecocokan data yang relatif setara, bahkan lebih baik dari model nominal.

Evaluasi dengan Likelihood Ratio Test

Hipotesis

H₀ (Hipotesis nol): Model dengan pendidikan sebagai ordinal sudah cukup (model sederhana memadai).

H₁ (Hipotesis alternatif): Model dengan pendidikan sebagai nominal secara signifikan lebih baik (model kompleks diperlukan).

Taraf Signifikansi

\[ \alpha = 5% \]

Statistik Uji

anova(model_nominal, model_ordinal, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: Asuransi ~ Pendidikan + Pendapatan
## Model 2: Asuransi ~ Pendidikan_Ordinal + Pendapatan
##   Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1       195     131.63                     
## 2       197     133.24 -2  -1.6013    0.449

Uji yang digunakan adalah Likelihood Ratio Test (LRT), dengan statistik uji:

\[ G^2 = \text{Deviance}_{\text{model ordinal}} - \text{Deviance}_{\text{model nominal}} = 133.24 - 131.63 = 1.60 \]

Derajat kebebasan (df) = jumlah parameter model kompleks - model sederhana = 5 - 3 = 2.

\[ \text{pvalue =} 0.449 \]

Kriteria Uji

Jika p-value < 0.05, maka tolak H₀ → model kompleks lebih baik.

Jika p-value ≥ 0.05, maka gagal tolak H₀ → model sederhana cukup.

Kesimpulan

Karena p-value lebih besar dari 0.05, maka kita H0 diterima. Artinya, model sederhana (ordinal) sudah cukup memadai untuk menjelaskan data, dan tidak ada kebutuhan untuk menggunakan model yang lebih kompleks (nominal).

CHAPTER 9 : PEMBANGUNAN MODEL REGRESI LOGISTIK

9.1 Pendekatan dalam Membangun Model

9.1.1 Pendekatan Exploratory

Pendekatan exploratory adalah metode pengembangan model yang bersifat induktif, di mana peneliti tidak memiliki dugaan awal yang kuat mengenai hubungan antara variabel bebas dengan variabel respon. Tujuan utamanya adalah menemukan pola dan struktur dari data.

Ciri-ciri :

  • Digunakan ketika belum ada teori kuat atau hipotesis yang jelas.
  • Mengandalkan eksplorasi data dan pemodelan bertahap.
  • Umumnya menggunakan teknik seleksi variabel seperti stepwise, LASSO, atau random forest.

Contoh Penerapan :

Misalnya dalam studi epidemiologi awal tentang faktor risiko diabetes, peneliti belum mengetahui variabel mana yang paling berpengaruh terhadap kejadian diabetes. Dengan pendekatan exploratory, peneliti dapat memasukkan semua variabel yang tersedia (seperti umur, jenis kelamin, kebiasaan makan, aktivitas fisik, tekanan darah, riwayat keluarga, dll) ke dalam model awal, kemudian menggunakan metode seperti stepwise atau LASSO untuk menyaring variabel penting.

9.1.2 Pendekatan Confirmatory

Pendekatan confirmatory adalah metode deduktif di mana peneliti menguji hipotesis yang telah dirumuskan sebelumnya berdasarkan teori, penelitian terdahulu, atau pengalaman profesional.

Ciri-ciri :

  • Teori atau model awal sudah ada.
  • Fokus pada validasi dan pengujian asumsi.
  • Analisis lebih fokus pada interpretasi parameter dan implikasi statistiknya.

Contoh Penerapan :

Dalam studi tentang efek program intervensi gizi terhadap risiko stunting anak, peneliti sudah memiliki teori bahwa variabel status ekonomi, pendidikan ibu, dan intervensi gizi merupakan faktor utama. Dengan pendekatan confirmatory, peneliti hanya memasukkan variabel tersebut ke dalam model dan menguji signifikansinya terhadap status stunting.

9.1.3 Perbandingan dan Kombinasi Pendekatan

Aspek Exploratory Confirmatory
Tujuan Mencari pola Menguji hipotesis
Basis Data-driven Theory-driven
Teknik Stepwise, ML Model teoritis
Kelebihan Adaptif, terbuka Interpretasi kuat, validasi teoritis
Kelemahan Bisa overfit Terbatas pada teori yang ada

Dalam praktiknya, kedua pendekatan ini sering dikombinasikan. Sebagai contoh, peneliti dapat memulai dengan exploratory modeling untuk menjajaki pola dan variabel potensial, lalu menggunakan pendekatan confirmatory untuk menguji model final berdasarkan teori atau pertimbangan kebijakan.

Contoh Penerapan :

Misalkan seorang peneliti ingin membangun model prediksi dropout mahasiswa. Ia memulai dengan pendekatan exploratory karena tidak tahu pasti faktor mana yang paling penting. Ia mengumpulkan data dari banyak variabel seperti IPK, kehadiran, aktivitas organisasi, kondisi ekonomi, dll. Setelah melakukan stepwise untuk memilih variabel yang paling informatif, ia menemukan bahwa IPK dan kehadiran sangat dominan.

Setelah itu, berdasarkan teori pendidikan dan kebijakan internal kampus, peneliti beralih ke pendekatan confirmatory dan membangun model final hanya dengan memasukkan IPK dan kehadiran sebagai prediktor utama untuk memastikan bahwa model tersebut stabil dan bisa dijustifikasi secara teoritis.

9.2 Metode Pemilihan Variabel

Pemilihan variabel adalah proses penting dalam membangun model regresi logistik yang efisien dan interpretatif. Tujuannya adalah untuk menentukan subset variabel bebas (prediktor) yang benar-benar relevan terhadap variabel respon, sehingga model yang dihasilkan :

  • Memiliki akurasi prediksi yang baik.
  • Lebih sederhana dan mudah diinterpretasikan.
  • Menghindari masalah multikolinearitas dan overfitting.

Berikut ini adalah beberapa metode umum yang digunakan dalam pemilihan variabel :

9.2.1 Metode Stepwise Selection

Metode stepwise selection merupakan salah satu teknik pemilihan model regresi yang digunakan untuk menentukan subset variabel independen terbaik berdasarkan kriteria statistik tertentu, seperti AIC (Akaike Information Criterion), BIC (Bayesian Information Criterion), atau nilai p dari uji signifikansi. Ada tiga pendekatan metode stepwise selection :

9.2.1.1. Forward Selection

Forward selection adalah pendekatan stepwise yang dimulai dari model kosong, yaitu model tanpa prediktor. Metode ini cocok digunakan jika kita memiliki jumlah prediktor yang sangat banyak dan ingin menghindari kompleksitas awal yang berlebihan. Prosesnya dilakukan dengan :

  1. Mulai dari model kosong (tidak ada prediktor).

  2. Tambahkan satu per satu variabel yang paling meningkatkan performa model.

  3. Ulangi hingga tidak ada variabel yang menambah kebaikan model secara signifikan.

Berikut adalah contoh penerapan Metode Forward Selection menggunakan dataset mtcars yang tersedia di software R.

data(mtcars)
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
a) Penerapan Manual

Langkah 1 : Model Awal (Tanpa Prediktor)

model_kosong <- glm(mpg ~ 1, data = mtcars)
summary(model_kosong)
## 
## Call:
## glm(formula = mpg ~ 1, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   20.091      1.065   18.86   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 36.3241)
## 
##     Null deviance: 1126  on 31  degrees of freedom
## Residual deviance: 1126  on 31  degrees of freedom
## AIC: 208.76
## 
## Number of Fisher Scoring iterations: 2
AIC(model_kosong)
## [1] 208.7555

Proses dimulai dengan model kosong, yaitu model tanpa prediktor (mpg ~ 1). Model ini memiliki AIC sebesar 208.76

Langkah 2 : Menambahkan Prediktor Pertama

model1 <- glm(mpg ~ wt, data = mtcars)
summary(model1)
## 
## Call:
## glm(formula = mpg ~ wt, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  37.2851     1.8776  19.858  < 2e-16 ***
## wt           -5.3445     0.5591  -9.559 1.29e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 9.277398)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  278.32  on 30  degrees of freedom
## AIC: 166.03
## 
## Number of Fisher Scoring iterations: 2
AIC(model1)
## [1] 166.0294

Dari semua prediktor yang tersedia, variabel wt (berat kendaraan) memberikan penurunan AIC paling besar, dari 208.76 menjadi 166.03. Ini berarti wt adalah variabel paling informatif secara statistik pada tahap awal, sehingga dimasukkan ke dalam model.

Langkah 3 : Menambahkan Prediktor Kedua

model2 <- glm(mpg ~ wt + cyl, data = mtcars)
summary(model2)
## 
## Call:
## glm(formula = mpg ~ wt + cyl, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  39.6863     1.7150  23.141  < 2e-16 ***
## wt           -3.1910     0.7569  -4.216 0.000222 ***
## cyl          -1.5078     0.4147  -3.636 0.001064 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.592137)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  191.17  on 29  degrees of freedom
## AIC: 156.01
## 
## Number of Fisher Scoring iterations: 2
AIC(model2)
## [1] 156.0101

Dengan wt sudah berada dalam model, proses seleksi mencoba menambahkan satu per satu variabel lainnya ke dalam model. Variabel cyl (jumlah silinder) memberikan penurunan AIC terbaik berikutnya, dari 166.03 menjadi 156.01. Oleh karena itu, cyl ditambahkan ke dalam model.

Langkah 4 : Menambahkan Prediktor Ketiga

model3 <- glm(mpg ~ wt + cyl + hp, data = mtcars)
summary(model3)
## 
## Call:
## glm(formula = mpg ~ wt + cyl + hp, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 38.75179    1.78686  21.687  < 2e-16 ***
## wt          -3.16697    0.74058  -4.276 0.000199 ***
## cyl         -0.94162    0.55092  -1.709 0.098480 .  
## hp          -0.01804    0.01188  -1.519 0.140015    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.307876)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  176.62  on 28  degrees of freedom
## AIC: 155.48
## 
## Number of Fisher Scoring iterations: 2
AIC(model3)
## [1] 155.4766

Proses dilanjutkan dengan mencoba menambahkan prediktor ketiga. Variabel hp (horsepower) memberikan penurunan AIC terbaik berikutnya, dari 156.01 menjadi 155.48. Karena masih ada penurunan AIC, hp ditambahkan ke dalam model.

Langkah 5 : Evaluasi Tambahan Prediktor

Setelah wt, cyl, dan hp berada dalam model, tidak ada lagi variabel tambahan yang dapat menurunkan AIC lebih lanjut secara signifikan. Semua kandidat prediktor menghasilkan AIC yang lebih tinggi dari 155.48 sehingga proses forward selection dihentikan di sini.

b) Penerapan dengan Fungsi step

Forward Selection dapat juga dilakukan secara langsung melalui syntax seperti sebagai berikut :

model_penuh <- glm(mpg ~ ., data = mtcars)

model_forward <- step(model_kosong,
                      scope = list(lower = model_kosong, upper = model_penuh),
                      direction = "forward",
                      trace = 1)
## Start:  AIC=208.76
## mpg ~ 1
## 
##        Df Deviance    AIC
## + wt    1   278.32 166.03
## + cyl   1   308.33 169.31
## + disp  1   317.16 170.21
## + hp    1   447.67 181.24
## + drat  1   603.57 190.80
## + vs    1   629.52 192.15
## + am    1   720.90 196.48
## + carb  1   784.27 199.18
## + gear  1   866.30 202.36
## + qsec  1   928.66 204.59
## <none>     1126.05 208.76
## 
## Step:  AIC=166.03
## mpg ~ wt
## 
##        Df Deviance    AIC
## + cyl   1   191.17 156.01
## + hp    1   195.05 156.65
## + qsec  1   195.46 156.72
## + vs    1   224.09 161.09
## + carb  1   233.72 162.44
## + disp  1   246.68 164.17
## <none>      278.32 166.03
## + drat  1   269.24 166.97
## + gear  1   277.19 167.90
## + am    1   278.32 168.03
## 
## Step:  AIC=156.01
## mpg ~ wt + cyl
## 
##        Df Deviance    AIC
## + hp    1   176.62 155.48
## + carb  1   177.40 155.62
## <none>      191.17 156.01
## + qsec  1   180.60 156.19
## + gear  1   188.14 157.50
## + disp  1   188.49 157.56
## + vs    1   190.47 157.89
## + am    1   191.05 157.99
## + drat  1   191.17 158.01
## 
## Step:  AIC=155.48
## mpg ~ wt + cyl + hp
## 
##        Df Deviance    AIC
## <none>      176.62 155.48
## + am    1   170.00 156.25
## + disp  1   170.44 156.34
## + carb  1   174.10 157.02
## + drat  1   174.38 157.07
## + qsec  1   175.22 157.22
## + gear  1   175.76 157.32
## + vs    1   176.56 157.47

9.2.1.2. Backward Elimination

Backward elimination dimulai dari model penuh, yaitu model yang mencakup semua variabel prediktor. Metode ini cocok digunakan ketika jumlah variabel prediktor tidak terlalu banyak dan semua informasi awal dianggap relevan. Proses seleksi dilakukan dengan :

  1. Mulai dari model penuh (semua variabel dimasukkan)

  2. Hapus satu per satu variabel yang kontribusinya paling kecil

  3. Ulangi hingga hanya tersisa variabel yang signifikan

Berikut adalah contoh penerapan Metode Forward Selection menggunakan dataset mtcars yang tersedia di software R.

data(mtcars)
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
a) Penerapan Manual

Langkah 1 : Model Penuh

summary(model_penuh)
## 
## Call:
## glm(formula = mpg ~ ., data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 12.30337   18.71788   0.657   0.5181  
## cyl         -0.11144    1.04502  -0.107   0.9161  
## disp         0.01334    0.01786   0.747   0.4635  
## hp          -0.02148    0.02177  -0.987   0.3350  
## drat         0.78711    1.63537   0.481   0.6353  
## wt          -3.71530    1.89441  -1.961   0.0633 .
## qsec         0.82104    0.73084   1.123   0.2739  
## vs           0.31776    2.10451   0.151   0.8814  
## am           2.52023    2.05665   1.225   0.2340  
## gear         0.65541    1.49326   0.439   0.6652  
## carb        -0.19942    0.82875  -0.241   0.8122  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 7.023544)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  147.49  on 21  degrees of freedom
## AIC: 163.71
## 
## Number of Fisher Scoring iterations: 2
AIC(model_penuh)
## [1] 163.7098

Model awal menyertakan seluruh prediktor dalam dataset mtcars. Nilai AIC awal adalah 163.71

Langkah 2 : Menghapus Prediktor Pertama

model1 <- glm(mpg ~ disp + hp + drat + wt + qsec + vs + am + gear + carb, data = mtcars)
summary(model1)
## 
## Call:
## glm(formula = mpg ~ disp + hp + drat + wt + qsec + vs + am + 
##     gear + carb, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 10.96007   13.53030   0.810   0.4266  
## disp         0.01283    0.01682   0.763   0.4538  
## hp          -0.02191    0.02091  -1.048   0.3062  
## drat         0.83520    1.53625   0.544   0.5921  
## wt          -3.69251    1.83954  -2.007   0.0572 .
## qsec         0.84244    0.68678   1.227   0.2329  
## vs           0.38975    1.94800   0.200   0.8433  
## am           2.57743    1.94035   1.328   0.1977  
## gear         0.71155    1.36562   0.521   0.6075  
## carb        -0.21958    0.78856  -0.278   0.7833  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.707923)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  147.57  on 22  degrees of freedom
## AIC: 161.73
## 
## Number of Fisher Scoring iterations: 2
AIC(model1)
## [1] 161.7271

Variabel cyl dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 163.71 menjadi 161.73

Langkah 3 : Menghapus Prediktor Kedua

model2 <- glm(mpg ~ disp + hp + drat + wt + qsec + am + gear + carb, data = mtcars)
summary(model2)
## 
## Call:
## glm(formula = mpg ~ disp + hp + drat + wt + qsec + am + gear + 
##     carb, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  9.76828   11.89230   0.821   0.4199  
## disp         0.01214    0.01612   0.753   0.4590  
## hp          -0.02095    0.01993  -1.051   0.3040  
## drat         0.87510    1.49113   0.587   0.5630  
## wt          -3.71151    1.79834  -2.064   0.0505 .
## qsec         0.91083    0.58312   1.562   0.1319  
## am           2.52390    1.88128   1.342   0.1928  
## gear         0.75984    1.31577   0.577   0.5692  
## carb        -0.24796    0.75933  -0.327   0.7470  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.427949)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  147.84  on 23  degrees of freedom
## AIC: 159.79
## 
## Number of Fisher Scoring iterations: 2
AIC(model2)
## [1] 159.7853

Variabel vs dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 161.73 menjadi 159.79

Langkah 4 : Menghapus Prediktor Ketiga

model3 <- glm(mpg ~ disp + hp + drat + wt + qsec + am + gear, data = mtcars)
summary(model3)
## 
## Call:
## glm(formula = mpg ~ disp + hp + drat + wt + qsec + am + gear, 
##     data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  9.19763   11.54220   0.797  0.43334   
## disp         0.01552    0.01214   1.278  0.21342   
## hp          -0.02471    0.01596  -1.548  0.13476   
## drat         0.81023    1.45007   0.559  0.58151   
## wt          -4.13065    1.23593  -3.342  0.00272 **
## qsec         1.00979    0.48883   2.066  0.04981 * 
## am           2.58980    1.83528   1.411  0.17104   
## gear         0.60644    1.20596   0.503  0.61964   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.188679)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  148.53  on 24  degrees of freedom
## AIC: 157.93
## 
## Number of Fisher Scoring iterations: 2
AIC(model3)
## [1] 157.9333

Variabel carb dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 159.79 menjadi 157.93

Langkah 5 : Menghapus Prediktor Keempat

model4 <- glm(mpg ~ disp + hp + drat + wt + qsec + am, data = mtcars)
summary(model4)
## 
## Call:
## glm(formula = mpg ~ disp + hp + drat + wt + qsec + am, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 10.71062   10.97539   0.976  0.33848   
## disp         0.01310    0.01098   1.193  0.24405   
## hp          -0.02180    0.01465  -1.488  0.14938   
## drat         1.02065    1.36748   0.746  0.46240   
## wt          -4.04454    1.20558  -3.355  0.00254 **
## qsec         0.99073    0.48002   2.064  0.04955 * 
## am           2.98469    1.63382   1.827  0.07969 . 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.00373)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  150.09  on 25  degrees of freedom
## AIC: 156.27
## 
## Number of Fisher Scoring iterations: 2
AIC(model4)
## [1] 156.2687

Variabel gear dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 157.93 menjadi 156.27

Langkah 6 : Menghapus Prediktor Kelima

model5 <- glm(mpg ~ disp + hp + wt + qsec + am, data = mtcars)
summary(model5)
## 
## Call:
## glm(formula = mpg ~ disp + hp + wt + qsec + am, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 14.36190    9.74079   1.474  0.15238   
## disp         0.01124    0.01060   1.060  0.29897   
## hp          -0.02117    0.01450  -1.460  0.15639   
## wt          -4.08433    1.19410  -3.420  0.00208 **
## qsec         1.00690    0.47543   2.118  0.04391 * 
## am           3.47045    1.48578   2.336  0.02749 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 5.901454)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  153.44  on 26  degrees of freedom
## AIC: 154.97
## 
## Number of Fisher Scoring iterations: 2
AIC(model5)
## [1] 154.974

Variabel drat dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 156.27 menjadi 154.974

Langkah 7 : Menghapus Prediktor Keenam

model6 <- glm(mpg ~ hp + wt + qsec + am, data = mtcars)
summary(model6)
## 
## Call:
## glm(formula = mpg ~ hp + wt + qsec + am, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 17.44019    9.31887   1.871  0.07215 . 
## hp          -0.01765    0.01415  -1.247  0.22309   
## wt          -3.23810    0.88990  -3.639  0.00114 **
## qsec         0.81060    0.43887   1.847  0.07573 . 
## am           2.92550    1.39715   2.094  0.04579 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 5.928387)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  160.07  on 27  degrees of freedom
## AIC: 154.33
## 
## Number of Fisher Scoring iterations: 2
AIC(model6)
## [1] 154.3274

Variabel disp dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 154.974 menjadi 154.327

Langkah 8 : Menghapus Prediktor Ketujuh

model7 <- glm(mpg ~ wt + qsec + am, data = mtcars)
summary(model7)
## 
## Call:
## glm(formula = mpg ~ wt + qsec + am, data = mtcars)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   9.6178     6.9596   1.382 0.177915    
## wt           -3.9165     0.7112  -5.507 6.95e-06 ***
## qsec          1.2259     0.2887   4.247 0.000216 ***
## am            2.9358     1.4109   2.081 0.046716 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 6.045926)
## 
##     Null deviance: 1126.05  on 31  degrees of freedom
## Residual deviance:  169.29  on 28  degrees of freedom
## AIC: 154.12
## 
## Number of Fisher Scoring iterations: 2
AIC(model7)
## [1] 154.1194

Variabel hp dihapus karena dapat menurunkan AIC paling tinggi, yaitu dari 154.327 menjadi 154.119

Langkah 9 : Evaluasi Pengurangan Prediktor

Tidak ada lagi variabel yang dapat dihapus tanpa menaikkan AIC. Dengan demikian, proses backward elimination dihentikan pada model ini.

b) Penerapan dengan Fungsi step

Backward Selection dapat juga dilakukan secara langsung melalui syntax seperti sebagai berikut :

model_backward <- step(model_penuh, direction = "backward", trace = TRUE)
## Start:  AIC=163.71
## mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb
## 
##        Df Deviance    AIC
## - cyl   1   147.57 161.73
## - vs    1   147.66 161.75
## - carb  1   147.90 161.80
## - gear  1   148.85 162.00
## - drat  1   149.12 162.06
## - disp  1   151.41 162.55
## - hp    1   154.33 163.16
## - qsec  1   156.36 163.58
## <none>      147.49 163.71
## - am    1   158.04 163.92
## - wt    1   174.51 167.09
## 
## Step:  AIC=161.73
## mpg ~ disp + hp + drat + wt + qsec + vs + am + gear + carb
## 
##        Df Deviance    AIC
## - vs    1   147.84 159.78
## - carb  1   148.09 159.84
## - gear  1   149.40 160.12
## - drat  1   149.56 160.15
## - disp  1   151.47 160.56
## - hp    1   154.94 161.28
## <none>      147.57 161.73
## - qsec  1   157.67 161.84
## - am    1   159.41 162.20
## - wt    1   174.60 165.11
## 
## Step:  AIC=159.79
## mpg ~ disp + hp + drat + wt + qsec + am + gear + carb
## 
##        Df Deviance    AIC
## - carb  1   148.53 157.93
## - gear  1   149.99 158.25
## - drat  1   150.06 158.26
## - disp  1   151.49 158.56
## - hp    1   154.95 159.29
## <none>      147.84 159.78
## - am    1   159.41 160.20
## - qsec  1   163.53 161.01
## - wt    1   175.22 163.22
## 
## Step:  AIC=157.93
## mpg ~ disp + hp + drat + wt + qsec + am + gear
## 
##        Df Deviance    AIC
## - gear  1   150.09 156.27
## - drat  1   150.46 156.35
## <none>      148.53 157.93
## - disp  1   158.64 158.04
## - am    1   160.85 158.48
## - hp    1   163.35 158.98
## - qsec  1   174.94 161.17
## - wt    1   217.66 168.16
## 
## Step:  AIC=156.27
## mpg ~ disp + hp + drat + wt + qsec + am
## 
##        Df Deviance    AIC
## - drat  1   153.44 154.97
## - disp  1   158.64 156.04
## <none>      150.09 156.27
## - hp    1   163.38 156.98
## - am    1   170.13 158.28
## - qsec  1   175.67 159.30
## - wt    1   217.66 166.16
## 
## Step:  AIC=154.97
## mpg ~ disp + hp + wt + qsec + am
## 
##        Df Deviance    AIC
## - disp  1   160.07 154.33
## <none>      153.44 154.97
## - hp    1   166.01 155.49
## - qsec  1   179.91 158.07
## - am    1   185.63 159.07
## - wt    1   222.48 164.86
## 
## Step:  AIC=154.33
## mpg ~ hp + wt + qsec + am
## 
##        Df Deviance    AIC
## - hp    1   169.29 154.12
## <none>      160.07 154.33
## - qsec  1   180.29 156.13
## - am    1   186.06 157.14
## - wt    1   238.56 165.10
## 
## Step:  AIC=154.12
## mpg ~ wt + qsec + am
## 
##        Df Deviance    AIC
## <none>      169.29 154.12
## - am    1   195.46 156.72
## - qsec  1   278.32 168.03
## - wt    1   352.63 175.60

9.2.1.3. Stepwise (Dua Arah)

Stepwise dua arah adalah kombinasi dari forward selection dan backward elimination. Proses seleksi dilakukan secara dinamis :

  • Menambahkan variabel baru seperti pada forward selection.
  • Setelah penambahan, dilakukan pemeriksaan apakah ada variabel yang sebaiknya dihapus, seperti pada backward elimination.
  • Proses iteratif ini terus berlangsung sampai tidak ada lagi variabel yang perlu ditambah atau dihapus.

Metode ini memberikan fleksibilitas lebih tinggi dan biasanya memberikan hasil seleksi yang lebih optimal dibanding dua pendekatan sebelumnya, terutama saat ada interaksi antar variabel yang kompleks. Berikut adalah penerapan Metode Forward Selection menggunakan dataset mtcars yang tersedia di software R dengan fungsi step.

model_stepwise <- step(model_kosong,
                      scope = list(lower = model_kosong, upper = model_penuh),
                      direction = "both",
                      trace = TRUE)
## Start:  AIC=208.76
## mpg ~ 1
## 
##        Df Deviance    AIC
## + wt    1   278.32 166.03
## + cyl   1   308.33 169.31
## + disp  1   317.16 170.21
## + hp    1   447.67 181.24
## + drat  1   603.57 190.80
## + vs    1   629.52 192.15
## + am    1   720.90 196.48
## + carb  1   784.27 199.18
## + gear  1   866.30 202.36
## + qsec  1   928.66 204.59
## <none>     1126.05 208.76
## 
## Step:  AIC=166.03
## mpg ~ wt
## 
##        Df Deviance    AIC
## + cyl   1   191.17 156.01
## + hp    1   195.05 156.65
## + qsec  1   195.46 156.72
## + vs    1   224.09 161.09
## + carb  1   233.72 162.44
## + disp  1   246.68 164.17
## <none>      278.32 166.03
## + drat  1   269.24 166.97
## + gear  1   277.19 167.90
## + am    1   278.32 168.03
## - wt    1  1126.05 208.76
## 
## Step:  AIC=156.01
## mpg ~ wt + cyl
## 
##        Df Deviance    AIC
## + hp    1   176.62 155.48
## + carb  1   177.40 155.62
## <none>      191.17 156.01
## + qsec  1   180.60 156.19
## + gear  1   188.14 157.50
## + disp  1   188.49 157.56
## + vs    1   190.47 157.89
## + am    1   191.05 157.99
## + drat  1   191.17 158.01
## - cyl   1   278.32 166.03
## - wt    1   308.33 169.31
## 
## Step:  AIC=155.48
## mpg ~ wt + cyl + hp
## 
##        Df Deviance    AIC
## <none>      176.62 155.48
## - hp    1   191.17 156.01
## + am    1   170.00 156.25
## + disp  1   170.44 156.34
## - cyl   1   195.05 156.65
## + carb  1   174.10 157.02
## + drat  1   174.38 157.07
## + qsec  1   175.22 157.22
## + gear  1   175.76 157.32
## + vs    1   176.56 157.47
## - wt    1   291.98 169.56

9.3. Evaluasi Kesesuaian Model Regresi Logistik

Evaluasi kesesuaian model (model fit) dalam regresi logistik bertujuan untuk menilai seberapa baik model yang dibangun dapat menjelaskan data. Pada bab ini akan dibahas tiga pendekatan penting :

  • Uji Likelihood-Ratio
  • Pseudo R-squared
  • Metode Perbandingan Model (AIC, BIC)

9.3.1 Likelihood-Ratio Test

Likelihood-Ratio Test (LRT) digunakan untuk membandingkan dua model yaitu model penuh (dengan semua prediktor) dan model terbatas (biasanya hanya intercept) atau dapat juga digunakan untuk membandingkan model yang lebih kompleks dengan model yang lebih sederhana. LRT menguji apakah model yang lebih kompleks memberikan peningkatan kecocokan signifikan terhadap data dibanding model yang lebih sederhana.

Berikut adalah contoh penggunaan Uji Likelihood Ratio :

Studi Kasus : Pengaruh Pengeluaran dan Usia terhadap Keputusan Membeli Skincare Lokal

Misalkan seorang mahasiswa sedang meneliti faktor-faktor yang memengaruhi keputusan pembelian produk skincare lokal oleh konsumen.

  • y: membeli produk (1 = ya, 0 = tidak)

  • x1: total pengeluaran skincare per bulan (dalam ribuan rupiah)

  • x2: usia responden (dalam tahun)

Ia melakukan survei terhadap 100 orang dan diperoleh data sebagai berikut :

set.seed(88)
datadata <- data.frame(
  y = rbinom(100, 1, 0.5),
  x1 = rnorm(100, mean = 500, sd = 100),  # pengeluaran skincare (ribu)
  x2 = rnorm(100, mean = 25, sd = 5)      # usia
)
head(datadata)
##   y       x1       x2
## 1 0 477.8782 31.11665
## 2 0 527.8880 19.29082
## 3 1 300.2135 25.86844
## 4 0 532.1631 20.21040
## 5 1 394.4526 25.82626
## 6 1 456.9723 25.43430

Mahasiswa tersebut ingin memprediksi kemungkinan seseorang membeli produk berdasarkan pengeluaran. Namun, sebelum menggunakan prediktor tersebut, ia ingin tahu :

“Apakah menambahkan usia responden (x2) membuat model prediksi lebih baik secara signifikan dibanding model yang hanya memakai x1?”

Oleh karena itu, Likelihood-Ratio Test digunakan untuk membandingkan kedua model tersebut.

Hipotesis

\(H_0\) : Model dengan x1 sudah cukup baik

\(H_1\) : Model dengan x1 dan x2 lebih baik

Taraf Signifikansi

\[ \alpha = 5% \]

Statistik Uji

# Model nol: hanya intercept
model_null <- glm(y ~ x1, data = datadata, family = binomial)

# Model penuh: pengeluaran dan usia
model_full <- glm(y ~ x1 + x2, data = datadata, family = binomial)

# LRT
anova(model_null, model_full, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: y ~ x1
## Model 2: y ~ x1 + x2
##   Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1        98     138.18                     
## 2        97     137.31  1  0.86401   0.3526

\[ G^2 = -2 \left( \log L_0 - \log L_1 \right) \]

atau secara ekuivalen menggunakan nilai deviance :

\[ G^2 = \text{Deviance}_{\text{model null}} - \text{Deviance}_{\text{model penuh}} = 0.864 \]

\[ \text{pvalue = } 0.3526 \]

Kriteria Uji

Jika p-value < 0.05, maka tolak H₀ → model kompleks lebih baik.

Jika p-value ≥ 0.05, maka gagal tolak H₀ → model sederhana cukup.

Kesimpulan

Karena nilai pvalue \(> 0.05\), maka gagal menolak \(H_0\). Artinya, penambahan variabel x2 tidak memberikan peningkatan kecocokan model yang signifikan secara statistik.

9.3.2 Pseudo R-Squared

Dalam regresi logistik, konsep varians yang dipakai pada regresi linear tidak dapat digunakan secara langsung. Oleh karena itu, untuk mengukur kekuatan model dalam menjelaskan variabilitas data, digunakan ukuran alternatif yang dikenal dengan Pseudo R-squared. Meskipun nilai Pseudo R-squared tidak setara dengan R² pada regresi linear, nilai ini tetap memberikan gambaran seberapa baik model dalam memprediksi outcome.

9.3.2.1. Jenis-Jenis Pseudo R-Squared

Ada beberapa tipe Pseudo R-squared yang populer digunakan, antara lain:

a. Cox & Snell R²

Cox & Snell R² didefinisikan sebagai berikut:

\[ R^2_{CS} = 1 - \left(\frac{L_0}{L_1}\right)^{\frac{2}{n}} \]

dimana:

  • \(L_0\) = likelihood dari model nol (model dengan intercept saja)
  • \(L_1\) = likelihood dari model dengan prediktor
  • \(n\) = jumlah observasi

Kelemahan dari Cox & Snell R² adalah nilai maksimumnya tidak selalu mencapai 1.

b. Nagelkerke R²

Nagelkerke R² merupakan modifikasi dari Cox & Snell R² agar nilai maksimumnya menjadi 1, dengan rumus:

\[ R^2_N = \frac{R^2_{CS}}{1 - L_0^{2/n}} \]

Dengan demikian, Nagelkerke R² memberikan ukuran kekuatan model yang lebih mudah diinterpretasikan karena skala 0 sampai 1.

c. McFadden R²

McFadden R² didefinisikan sebagai:

\[ R^2_{McF} = 1 - \frac{\log L_1}{\log L_0} \]

Nilai McFadden R² yang mendekati 1 mengindikasikan model yang sangat baik. Secara umum, nilai antara 0.2 sampai 0.4 sudah dianggap menunjukkan kecocokan model yang cukup baik dalam konteks regresi logistik.

9.3.2.2. Interpretasi Pseudo R-Squared

Semakin besar nilai Pseudo R-squared, semakin baik model dalam menjelaskan variabilitas data. Namun, nilai ini tidak dapat dibandingkan secara langsung dengan R² dari regresi linear. Pseudo R-squared lebih berguna untuk membandingkan beberapa model logistik dalam dataset yang sama.

Untuk menghitung nilai Pseudo R-squared, library DescTools menyediakan fungsi PseudoR2() yang menghitung berbagai tipe Pseudo R-squared sekaligus. Berikut adalah perhitungan nilai Pseudo R-squared

library(DescTools)

# Contoh model regresi logistik
modell <- glm(y ~ x1 + x2, data = datadata, family = binomial)

# Hitung Pseudo R-squared
PseudoR2(modell, which = c("CoxSnell", "Nagelkerke", "McFadden"))
##    CoxSnell  Nagelkerke    McFadden 
## 0.012663503 0.016886922 0.009195772

Hasil di atas menunjukkan bahwa :

  • Nilai Cox & Snell sebesar 0.0127 menunjukkan bahwa model hanya mampu menjelaskan sekitar 1,27% variasi dalam variabel dependen. Ini mengindikasikan bahwa model memiliki kemampuan penjelasan yang sangat rendah terhadap perbedaan outcome yang diamati.

  • Nilai Nagelkerke sebesar 0.0169 merupakan versi koreksi dari Cox & Snell agar skala maksimum bisa mencapai 1. Meskipun demikian, nilai ini tetap rendah dan hanya menunjukkan bahwa model mampu menjelaskan sekitar 1,69% variasi. Artinya, performa model dalam memprediksi outcome juga masih sangat terbatas.

  • Nilai McFadden sebesar 0.0092 tergolong sangat rendah. Dalam konteks regresi logistik, McFadden R² yang baik umumnya berada di kisaran 0.2 hingga 0.4. Dengan demikian, nilai yang dihasilkan oleh model ini menunjukkan bahwa model hampir tidak memberikan informasi prediktif tambahan dibandingkan model tanpa prediktor (model null).

9.3.3. Metode Perbandingan Model

9.3.3.1. Akaike Information Criterion (AIC)

AIC merupakan kriteria evaluasi yang menghitung keseimbangan antara goodness-of-fit dan kompleksitas model. Semakin banyak parameter yang ditambahkan, kemungkinan model akan lebih cocok terhadap data, namun bisa menimbulkan risiko overfitting. AIC memberikan penalti terhadap kompleksitas model.

Rumus AIC:

\[ \text{AIC} = -2 \log L(\hat{\beta}) + 2k \]

Di mana:

- \(\log L(\hat{\beta})\) adalah log-likelihood model pada estimasi parameter maksimum.

- \(k\) adalah jumlah total parameter dalam model (termasuk intercept).

Model yang memiliki nilai AIC lebih kecil dianggap lebih baik, karena menunjukkan keseimbangan antara ketepatan model dan kesederhanaan struktur model.

9.3.3.2. Bayesian Information Criterion (BIC)

BIC mirip dengan AIC, namun memberikan penalti yang lebih besar terhadap kompleksitas model, terutama jika ukuran sampel besar. Oleh karena itu, BIC lebih konservatif dalam memilih model dengan parameter tambahan.

Rumus BIC:

\[ \text{BIC} = -2 \log L(\hat{\beta}) + k \log n \]

Di mana \(n\) adalah jumlah observasi dalam data.

Sama seperti AIC, model dengan nilai BIC yang lebih kecil dianggap lebih baik.

9.3.3.3. Perhitungan AIC dan BIC di R

Kita akan menghitung nilai AIC dan BIC dari model regresi logistik untuk model penuh (X1 dan X2) dan model tereduksi (X1 saja) pada Studi Kasus : Pengaruh Pengeluaran dan Usia terhadap Keputusan Membeli Skincare Lokal yang telah dibangun sebelumnya :

# Model nol: hanya intercept
model_null <- glm(y ~ x1, data = datadata, family = binomial)
# Model penuh: pengeluaran dan usia
model_full <- glm(y ~ x1 + x2, data = datadata, family = binomial)

Dalam analisis ini, dua model regresi logistik dibandingkan:

  • Model Null : Menggunakan 1 prediktor (x1 = pengeluaran)

  • Model Full: Menggunakan 2 prediktor (x1 = pengeluaran dan x2 = usia)

AIC(model_null, model_full)
##            df     AIC
## model_null  2 142.179
## model_full  3 143.315

Model null memiliki AIC yang lebih rendah dibandingkan model full (142.179 < 143.315). Ini menunjukkan bahwa penambahan variabel x2 (usia) justru tidak meningkatkan kebaikan model secara efisien. Dengan kata lain, model yang lebih sederhana (hanya dengan x1) sudah cukup baik dan lebih disarankan menurut kriteria AIC.

BIC(model_null, model_full)
##            df      BIC
## model_null  2 147.3893
## model_full  3 151.1305

BIC pun menunjukkan hal serupa: nilai BIC untuk model null lebih rendah dibandingkan model full. Karena BIC memberikan penalti lebih besar terhadap jumlah parameter, ini semakin menguatkan bahwa model null adalah model yang lebih parsimonious dan disarankan.

9.4. Prinsip Parsimony dalam Pemilihan Model

Dalam proses pemilihan model statistik, salah satu prinsip penting yang perlu diperhatikan adalah prinsip parsimony atau kesederhanaan. Prinsip ini menekankan bahwa model yang digunakan sebaiknya tidak lebih kompleks dari yang diperlukan. Artinya, model harus cukup sederhana untuk dipahami dan digunakan, namun tetap mampu menjelaskan hubungan antar variabel dengan baik.

Prinsip parsimony muncul dari pemahaman bahwa menambahkan terlalu banyak variabel ke dalam model justru bisa berdampak negatif. Meskipun secara teknis jumlah variabel yang lebih banyak dapat meningkatkan kemampuan model dalam menyesuaikan data, hal ini juga meningkatkan risiko overfitting—yaitu kondisi ketika model terlalu “menghafal” data latih dan gagal memprediksi data baru secara akurat.

Model yang terlalu kompleks tidak hanya rentan terhadap overfitting, tetapi juga lebih sulit untuk diinterpretasikan. Sebaliknya, model yang lebih sederhana cenderung lebih stabil, lebih mudah dijelaskan kepada pihak non-teknis, dan lebih efisien secara komputasi.

Dalam praktiknya, prinsip parsimony diterapkan melalui berbagai metode, misalnya dengan menggunakan kriteria seleksi model seperti AIC (Akaike Information Criterion) dan BIC (Bayesian Information Criterion). Kedua kriteria ini memberikan penalti terhadap model yang memiliki terlalu banyak parameter, sehingga mendorong pemilihan model yang lebih sederhana namun tetap memberikan kinerja prediksi yang baik.

Selain itu, prinsip ini juga dapat diterapkan dengan mengevaluasi signifikansi statistik dari masing-masing variabel. Variabel yang tidak memberikan kontribusi berarti terhadap model sebaiknya dieliminasi. Teknik seperti stepwise selection, subset selection, atau metode regularisasi seperti LASSO juga sering digunakan untuk mencapai model yang parsimonius.

Secara keseluruhan, prinsip parsimony mengingatkan kita bahwa dalam membangun model statistik, lebih banyak belum tentu lebih baik. Model terbaik bukanlah model yang paling rumit, tetapi yang paling efisien dalam menangkap pola data yang relevan, tanpa menyertakan komponen yang tidak perlu.

CHAPTER 10 : EVALUASI DAN VALIDASI MODEL REGRESI LOGISTIK

Evaluasi dan validasi model regresi logistik merupakan tahap penting dalam memastikan bahwa model yang dibangun tidak hanya cocok terhadap data pelatihan (training) tetapi juga memiliki kemampuan generalisasi yang baik terhadap data baru.

10.1 Evaluasi Klasifikasi Model

10.1.1 Confusion Matrix

Confusion matrix adalah tabel yang digunakan untuk menggambarkan kinerja model klasifikasi terhadap data uji yang telah diketahui label sebenarnya. Dalam kasus klasifikasi biner, confusion matrix terdiri dari empat komponen:

  • True Positive (TP): Jumlah data positif yang diprediksi sebagai positif.
  • False Positive (FP): Jumlah data negatif yang diprediksi sebagai positif.
  • True Negative (TN): Jumlah data negatif yang diprediksi sebagai negatif.
  • False Negative (FN): Jumlah data positif yang diprediksi sebagai negatif.

Contoh struktur confusion matrix:

Prediksi Positif Prediksi Negatif
Aktual Positif TP FN
Aktual Negatif FP TN

Confusion matrix menjadi dasar untuk menghitung berbagai metrik evaluasi model klasifikasi seperti akurasi, sensitivitas, presisi, dan lain-lain.

10.1.2 Akurasi, Error Rate, Sensitivitas, dan Spesifisitas

Setelah memahami struktur confusion matrix, langkah selanjutnya adalah menghitung berbagai metrik evaluasi yang dapat digunakan untuk menilai kinerja model klasifikasi. Metrik-metrik ini dirancang untuk menggambarkan seberapa baik model mampu membedakan antara kelas-kelas dalam data.

Dalam konteks klasifikasi biner seperti regresi logistik, metrik yang umum digunakan antara lain akurasi, error rate, sensitivitas (recall), dan spesifisitas. Masing-masing metrik memiliki peran penting, tergantung pada konteks aplikasi. Misalnya, dalam bidang medis, sensitivitas seringkali lebih penting untuk mengidentifikasi pasien yang benar-benar sakit, sedangkan di bidang keamanan, spesifisitas bisa lebih krusial untuk meminimalkan kesalahan positif palsu.

Berikut adalah definisi dan rumus dari masing-masing metrik tersebut :

  • Akurasi (Accuracy)

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]

Mengukur proporsi prediksi yang benar dari seluruh prediksi yang dibuat oleh model.

  • Error Rate

\[ \text{Error Rate} = 1 - \text{Accuracy} = \frac{FP + FN}{TP + TN + FP + FN} \]

Mengukur proporsi prediksi yang salah dari seluruh prediksi yang dibuat oleh model.

  • Sensitivitas (True Positive Rate)

\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]

Mengukur kemampuan model untuk mendeteksi dengan benar kasus positif.

  • Spesifisitas (True Negative Rate)

\[ \text{Specificity} = \frac{TN}{TN + FP} \]

Mengukur kemampuan model untuk mendeteksi dengan benar kasus negatif.

10.1.3 Precision, Recall, dan F1-Score

  • Precision

\[ \text{Precision} = \frac{TP}{TP + FP} \]

Mengukur proporsi prediksi positif yang benar-benar sesuai dengan kondisi sebenarnya. Artinya, dari semua data yang diprediksi positif, berapa banyak yang benar-benar positif.

  • Recall

\[ \text{Recall} = \frac{TP}{TP + FN} \]

Mengukur kemampuan model untuk menemukan seluruh data positif sebenarnya. Artinya, dari semua data yang memang positif, berapa banyak yang berhasil diprediksi positif oleh model.

  • F1-Score

\[ F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]

Metrik yang menggabungkan precision dan recall secara harmonis menjadi satu angka tunggal. F1-Score berguna untuk menilai performa model secara keseluruhan, terutama jika distribusi kelas tidak seimbang. Nilai F1-Score berkisar antara 0 sampai 1, dengan interpretasi umum sebagai berikut:

  • Nilai mendekati 1 menunjukkan performa model yang sangat baik, artinya model memiliki keseimbangan yang baik antara presisi dan recall.
  • Nilai antara 0.7 sampai 0.9 menunjukkan performa yang baik dan dapat diterima untuk banyak aplikasi.
  • Nilai di bawah 0.7 mengindikasikan model mungkin masih perlu diperbaiki, terutama jika data tidak seimbang.
  • Nilai mendekati 0 menunjukkan model yang sangat buruk dalam mengklasifikasikan kelas positif.

Dengan demikian, semakin tinggi F1-Score, semakin efektif model dalam mengklasifikasikan data, terutama saat kelas positif lebih sedikit atau lebih penting untuk dideteksi dengan akurat.

Contoh Kasus : Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung

Misalkan seorang analis data ingin membangun model regresi logistik untuk memprediksi apakah seorang pasien memiliki penyakit jantung berdasarkan data medis. Dataset yang digunakan memiliki satu variabel prediktor, yaitu kadar kolesterol pasien, dan variabel target adalah status penyakit jantung (1 = memiliki penyakit, 0 = tidak).

# Simulasi data
set.seed(123)
cholesterol <- c(230, 180, 210, 250, 190, 300, 270, 160, 200, 220,
                 240, 195, 175, 260, 280, 180, 225, 185, 290, 170)
heart_disease <- c(0, 0, 1, 1, 1, 1, 1, 0, 1, 1,
                   1, 1, 0, 1, 1, 0, 1, 0, 1, 0)

data <- data.frame(cholesterol, heart_disease = factor(heart_disease))
head(data)
##   cholesterol heart_disease
## 1         230             0
## 2         180             0
## 3         210             1
## 4         250             1
## 5         190             1
## 6         300             1
# Model regresi logistik
model <- glm(heart_disease ~ cholesterol, data = data, family = binomial)

# Prediksi probabilitas
prob_pred <- predict(model, type = "response")

# Konversi ke kelas prediksi dengan threshold 0.5
predicted_class <- factor(ifelse(prob_pred >= 0.5, 1, 0), levels = c(0,1))
actual_class <- data$heart_disease

# Confusion Matrix dan Perhitungan Metrik
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
cm <- confusionMatrix(predicted_class, actual_class, positive = "1")
cm
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0  6  2
##          1  1 11
##                                           
##                Accuracy : 0.85            
##                  95% CI : (0.6211, 0.9679)
##     No Information Rate : 0.65            
##     P-Value [Acc > NIR] : 0.04438         
##                                           
##                   Kappa : 0.6809          
##                                           
##  Mcnemar's Test P-Value : 1.00000         
##                                           
##             Sensitivity : 0.8462          
##             Specificity : 0.8571          
##          Pos Pred Value : 0.9167          
##          Neg Pred Value : 0.7500          
##              Prevalence : 0.6500          
##          Detection Rate : 0.5500          
##    Detection Prevalence : 0.6000          
##       Balanced Accuracy : 0.8516          
##                                           
##        'Positive' Class : 1               
## 

Hasil confusion matrix menunjukkan :

  • Sebanyak 6 orang yang sebenarnya tidak memiliki penyakit jantung (kelas 0) berhasil diprediksi dengan benar oleh model sebagai tidak memiliki penyakit jantung. Ini disebut sebagai True Negative (TN).

  • Sebanyak 11 orang yang sebenarnya memiliki penyakit jantung (kelas

    1. juga berhasil diprediksi dengan benar sebagai positif oleh model. Ini disebut sebagai True Positive (TP).
  • Terdapat 1 orang yang sebenarnya tidak memiliki penyakit jantung namun diprediksi positif (False Positive, FP = 1).

  • Terdapat 2 orang yang sebenarnya memiliki penyakit jantung tetapi diprediksi negatif (False Negative, FN = 2).

Dengan kata lain, model ini melakukan sebagian besar prediksi dengan benar, namun masih terdapat beberapa kesalahan klasifikasi.

# Mengambil nilai TP, FP, TN, FN dari confusion matrix hasil package caret
TP <- cm$table["1", "1"]
FN <- cm$table["0", "1"]
FP <- cm$table["1", "0"]
TN <- cm$table["0", "0"]

Berikut adalah metrik evaluasi yang dihitung dari confusion matrix tersebut.

# Perhitungan metrik evaluasi secara manual
accuracy <- (TP + TN) / (TP + TN + FP + FN)
accuracy
## [1] 0.85

Model mampu memprediksi dengan benar sekitar 85% dari seluruh data.

error_rate <- 1 - accuracy
error_rate
## [1] 0.15

Model melakukan kesalahan prediksi pada sekitar 15% dari seluruh data.

sensitivity <- TP / (TP + FN)
sensitivity
## [1] 0.8461538

Model berhasil mengidentifikasi sekitar 84.62% dari pasien yang memiliki penyakit jantung dengan benar.

specificity <- TN / (TN + FP)
specificity
## [1] 0.8571429

Model berhasil mengenali sekitar 85.71% dari pasien yang tidak memiliki penyakit jantung dengan benar.

precision <- TP / (TP + FP)
precision
## [1] 0.9166667

Dari semua prediksi positif (pasien memiliki penyakit jantung), sekitar 91.67% benar-benar pasien dengan penyakit jantung.

f1_score <- 2 * (precision * sensitivity) / (precision + sensitivity)
f1_score
## [1] 0.88

Keseimbangan antara presisi dan sensitivitas model adalah sekitar 0.88, menunjukkan performa klasifikasi yang baik.

10.2 Analisis Kurva Evaluasi Model

Kurva evaluasi seperti ROC (Receiver Operating Characteristic) dan Precision-Recall (PR) digunakan untuk menilai kinerja model klasifikasi pada berbagai nilai ambang batas (threshold). Penilaian ini penting untuk melihat trade-off antara berbagai metrik seperti sensitivitas, spesifisitas, dan presisi.

10.2.1 Kurva ROC (Receiver Operating Characteristic)

Kurva ROC adalah grafik yang menunjukkan hubungan antara True Positive Rate (TPR) dan False Positive Rate (FPR) pada berbagai threshold.

  • Sumbu Y (TPR / Sensitivitas): \[TPR = \frac{TP}{TP + FN}\]

  • Sumbu X (FPR = 1 - Specificity): \[FPR = \frac{FP}{FP + TN}\]

Interpretasi Kurva ROC

  • Garis diagonal dari kiri bawah ke kanan atas merepresentasikan tebakan acak.
  • Kurva yang melengkung ke pojok kiri atas menandakan model memiliki performa yang baik.
  • Pergerakan kurva bergantung pada threshold:
  • Jika threshold diturunkan → sensitivitas naik, spesifisitas turun.
  • Jika threshold dinaikkan → sensitivitas turun, spesifisitas naik.

Kurva ROC Ideal

Kurva ROC yang ideal memiliki bentuk seperti huruf ‘L’ terbalik yang menempel di sisi kiri dan atas grafik. Ciri-cirinya antara lain:

  • Kurva langsung naik secara vertikal dari titik (0,0) ke (0,1), artinya model berhasil menangkap semua kasus positif (sensitivitas =
    1. tanpa membuat kesalahan pada kasus negatif (FPR = 0).
  • Setelah mencapai sensitivitas 1, kurva bergerak secara horizontal dari (0,1) ke (1,1), menunjukkan bahwa model tetap mempertahankan performa meskipun FPR meningkat.

Semakin dekat kurva ke bentuk ini, semakin baik kemampuan model dalam membedakan antara kelas positif dan negatif. Model ideal akan memiliki AUC = 1.

10.2.2 Area Under the Curve (AUC)

AUC adalah luas di bawah kurva ROC yang menunjukkan kemampuan model membedakan kelas positif dan negatif:

  • AUC = 0.5: Model setara dengan tebakan acak.
  • AUC > 0.7 : Model cukup baik.
  • AUC > 0.9 : Model sangat baik.

AUC juga dikenal sebagai concordance index, yang merepresentasikan probabilitas bahwa model memberikan skor lebih tinggi untuk kasus positif dibandingkan negatif.

Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung

Berikut adalah kurva ROC dari Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung yang ada pada 3.1.

library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
data <- data.frame(cholesterol, heart_disease = factor(heart_disease))
model <- glm(heart_disease ~ cholesterol, data = data, family = binomial)
prob_pred <- predict(model, type = "response")
roc_obj <- roc(data$heart_disease, prob_pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, col = "#1f77b4", lwd = 3, main = "ROC Curve", print.auc = TRUE, legacy.axes = TRUE)

Grafik ROC di atas menunjukkan kurva yang naik tajam ke kiri atas grafik, lalu mendatar hampir sempurna di bagian atas. Ini mengindikasikan bahwa model memiliki kemampuan yang sangat baik dalam membedakan antara individu yang memiliki dan tidak memiliki penyakit jantung.

Garis biru yang membentuk kurva ROC menjauhi garis diagonal abu-abu (yang mewakili tebakan acak), menandakan bahwa model memberikan prediksi yang jauh lebih baik dari acak. Kurva yang tinggi di sisi kiri menunjukkan bahwa model memiliki sensitivitas tinggi, bahkan ketika false positive rate masih rendah.

Nilai AUC = 0.934 yang ditampilkan dalam grafik memperkuat interpretasi ini. Nilai ini menggambarkan bahwa model mampu membedakan kasus positif dan negatif dengan sangat baik. Secara visual, grafik ini mencerminkan model klasifikasi yang sangat andal dalam konteks mendeteksi penyakit jantung berdasarkan variabel kolesterol.

10.2.3 Pemilihan Threshold Optimal

Dalam regresi logistik, prediksi berupa nilai probabilitas antara 0 dan 1. Untuk mengubah probabilitas menjadi label kelas (0 atau 1), dibutuhkan nilai ambang batas atau threshold. Pemilihan threshold sangat memengaruhi hasil klasifikasi karena berpengaruh langsung terhadap jumlah prediksi benar dan salah.

Dasar Pemilihan Threshold

Threshold optimal tidak selalu 0.5. Penyesuaian threshold tergantung pada:

  • Keseimbangan antara sensitivitas dan spesifisitas
  • Tujuan aplikasi : Apakah lebih penting mendeteksi semua kasus positif (menghindari false negative) atau lebih penting menghindari false positive?
  • Keseimbangan kelas: Pada data tidak seimbang, threshold default bisa menyesatkan.
  • Nilai prediksi probabilitas model : Model berbeda bisa memberikan distribusi probabilitas yang berbeda.

Berikut adalah treshold yang diperoleh berdasarkan analisis dari Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung dari 3.1. :

# Perhitungan sensitivitas dan spesifisitas untuk berbagai threshold
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)

results$Sensitivity <- sapply(thresholds, function(t) {
  pred_class <- ifelse(prob_pred >= t, 1, 0)
  cm <- table(Pred = pred_class, Obs = as.numeric(as.character(data$heart_disease)))
  TP <- ifelse("1" %in% rownames(cm) & "1" %in% colnames(cm), cm["1", "1"], 0)
  FN <- ifelse("0" %in% rownames(cm) & "1" %in% colnames(cm), cm["0", "1"], 0)
  if ((TP + FN) == 0) return(NA) else return(TP / (TP + FN))
})

results$Specificity <- sapply(thresholds, function(t) {
  pred_class <- ifelse(prob_pred >= t, 1, 0)
  cm <- table(Pred = pred_class, Obs = as.numeric(as.character(data$heart_disease)))
  TN <- ifelse("0" %in% rownames(cm) & "0" %in% colnames(cm), cm["0", "0"], 0)
  FP <- ifelse("1" %in% rownames(cm) & "0" %in% colnames(cm), cm["1", "0"], 0)
  if ((TN + FP) == 0) return(NA) else return(TN / (TN + FP))
})

# Cetak hasil
print(results)
##    Threshold Sensitivity Specificity
## 1       0.10   1.0000000   0.1428571
## 2       0.15   1.0000000   0.2857143
## 3       0.20   1.0000000   0.4285714
## 4       0.25   1.0000000   0.7142857
## 5       0.30   1.0000000   0.7142857
## 6       0.35   1.0000000   0.8571429
## 7       0.40   0.9230769   0.8571429
## 8       0.45   0.9230769   0.8571429
## 9       0.50   0.8461538   0.8571429
## 10      0.55   0.8461538   0.8571429
## 11      0.60   0.7692308   0.8571429
## 12      0.65   0.7692308   0.8571429
## 13      0.70   0.7692308   0.8571429
## 14      0.75   0.6923077   0.8571429
## 15      0.80   0.6923077   0.8571429
## 16      0.85   0.6923077   0.8571429
## 17      0.90   0.5384615   0.8571429
Strategi Penentuan Threshold

Beberapa pendekatan yang umum digunakan dalam penentuan treshold adalah :

  1. Maksimum dari Sensitivitas + Spesifisitas : Mencari nilai threshold yang memberikan kombinasi terbaik dari kedua metrik.

    results$Sum_Sens_Spec <- with(results, Sensitivity + Specificity)
    best_sens_spec <- results$Threshold[which.max(results$Sum_Sens_Spec)]
    best_sens_spec
    ## [1] 0.35

    Berdasarkan maksimum sesnsivitas + spesifitas, treshold yang terpilih untuk Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung adalah 0.35

  2. Maksimum F1-Score : Berguna saat ingin menyeimbangkan presisi dan recall, terutama pada data tidak seimbang.

    library(caret)
    
    results$Precision <- sapply(thresholds, function(t) {
      pred_class <- factor(ifelse(prob_pred >= t, 1, 0), levels = c(0, 1))
      true_class <- factor(data$heart_disease, levels = c(0, 1))
    
      cm <- confusionMatrix(pred_class, true_class, positive = "1")
      prec <- cm$byClass["Precision"]
      return(prec)
    })
    
    results$F1 <- with(results, {
      recall <- Sensitivity
      prec <- Precision
      f1 <- 2 * (prec * recall) / (prec + recall)
      return(f1)
    })
    
    best_f1 <- results$Threshold[which.max(results$F1)]
    best_f1
    ## [1] 0.35

    Berdasarkan maksimum F1 score, treshold yang terpilih untuk Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung adalah 0.35

  3. Youden’s Index (J)

    Youden’s Index dihitung dengan rumus sebagai berikut :

    \[ J = Sensitivitas + Spesifisitas - 1 \]

    Threshold optimal adalah nilai yang memaksimalkan indeks ini.

    results$Youden <- with(results, Sensitivity + Specificity - 1)
    best_youden <- results$Threshold[which.max(results$Youden)]
    best_youden
    ## [1] 0.35

    Berdasarkan maksimum Youden’s Index, treshold yang terpilih untuk Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung adalah 0.35

  4. Threshold berdasarkan biaya kesalahan

    Dalam beberapa konteks, kesalahan klasifikasi tidak memiliki dampak yang sama. Misalnya, dalam dunia kesehatan, salah mengklasifikasikan pasien yang sebenarnya sakit sebagai tidak sakit (false negative) bisa jauh lebih berbahaya daripada salah mengklasifikasikan pasien sehat sebagai sakit (false positive). Oleh karena itu, threshold bisa ditentukan berdasarkan biaya atau risiko dari masing-masing jenis kesalahan. Contohnya :

    • Dalam diagnosis kanker, kita mungkin lebih memilih model dengan sensitivitas tinggi meskipun spesifisitas menurun, untuk memastikan bahwa semua pasien yang mungkin sakit diperiksa lebih lanjut.
    • Sebaliknya, dalam penilaian kredit, kita mungkin ingin menghindari memberikan pinjaman kepada peminjam yang berisiko gagal bayar (false positive), sehingga spesifisitas bisa diutamakan.

    Dalam beberapa kasus, terutama yang bersifat kritis seperti medis atau keuangan, kesalahan klasifikasi memiliki biaya yang berbeda-beda. Oleh karena itu, threshold dapat dipilih berdasarkan Expected Cost, yaitu rata-rata kerugian dari salah klasifikasi.

    \[ \text{Expected Cost} = (\text{FN} \times \text{Cost}_{FN}) + (\text{FP} \times \text{Cost}_{FP}) \]

    dimana

    • FN (False Negative): Jumlah kasus positif yang salah diklasifikasikan sebagai negatif.
    • FP (False Positive): Jumlah kasus negatif yang salah diklasifikasikan sebagai positif.
    • Cost_FN: Biaya atau kerugian akibat satu kasus False Negative.
    • Cost_FP: Biaya atau kerugian akibat satu kasus False Positive.
    • Expected Cost: Total biaya rata-rata kesalahan untuk sebuah nilai threshold tertentu.

    Threshold optimal adalah yang meminimalkan total biaya kesalahan. Penentuan treshold berdasarkan biaya kesalahan ini diperlukan jika kesalahan klasifikasi membawa konsekuensi biaya yang berbeda.

    Contoh Aplikasi : Dalam Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung, False Negative (pasien sakit tidak terdeteksi) lebih berbahaya daripada False Positive (orang sehat diduga sakit). - Maka ditetapkan :

    - Cost_FN = 1000 ribu (biaya komplikasi karena penyakit tidak terdeteksi)

    - Cost_FP = 100 ribu (biaya cek lanjutan)

    # Paket yang dibutuhkan
    library(dplyr)
    
    # Menentukan threshold dan biaya
    thresholds <- seq(0.1, 0.9, by = 0.05)
    cost_fn <- 1000  # Biaya False Negative
    cost_fp <- 100  # Biaya False Positive
    
    # Buat data frame untuk menyimpan hasil
    expected_cost_df <- data.frame(Threshold = thresholds)
    
    # Hitung Expected Cost di setiap threshold
    expected_cost_df$ExpectedCost <- sapply(thresholds, function(t) {
      pred_class <- ifelse(prob_pred >= t, 1, 0)
    
      # Konversi ke faktor agar level cocok
      pred_class <- factor(pred_class, levels = c(0, 1))
      true_class <- factor(data$heart_disease, levels = c(0, 1))
    
      # Confusion matrix manual
      cm <- table(Pred = pred_class, Obs = true_class)
      FN <- cm["0", "1"]
      FP <- cm["1", "0"]
    
      # Hitung expected cost
      (FN * cost_fn) + (FP * cost_fp)
    })
    
    # Threshold optimal = Expected Cost paling kecil
    best_cost_threshold <- expected_cost_df$Threshold[which.min(expected_cost_df$ExpectedCost)]
    best_cost_value <- min(expected_cost_df$ExpectedCost)
    
    # Cetak hasil
    cat(sprintf("Threshold terbaik berdasarkan Expected Cost: %.2f (Biaya = %.2f)\n",
                best_cost_threshold, best_cost_value))
    ## Threshold terbaik berdasarkan Expected Cost: 0.35 (Biaya = 100.00)

    Berdasarkan Expected Cost, treshold yang terpilih untuk Studi Kasus Pengaruh Kadar Kolestrol Pasien terhadap Penyakit Jantung adalah 0.35 dengan biaya 100 ribu.

10.2.4 Precision-Recall Curve (PR Curve)

Precision-Recall Curve (PR Curve atau PRC) adalah alat evaluasi model klasifikasi khususnya untuk data yang tidak seimbang (imbalanced data). PR Curve menggambarkan trade-off antara Precision dan Recall untuk berbagai nilai threshold klasifikasi.

  • Precision (Presisi) adalah proporsi prediksi positif yang benar-benar positif.

    \[ \text{Precision} = \frac{TP}{TP + FP} \]

  • Recall (Sensitivitas) adalah proporsi kasus positif yang berhasil dideteksi

    \[ \text{Recall} = \frac{TP}{TP + FN} \]

    dimana:

    \(TP\) = True Positive

    \(FP\) = False Positive

    \(FN\) = False Negative

Kelebihan dari PR Curve antara lain :

  • Lebih cocok untuk masalah klasifikasi dengan data yang sangat tidak seimbang.
  • Fokus pada performa kelas positif, yang seringkali merupakan kelas minoritas dan lebih penting secara aplikasi.
Interpretasi
  • PR Curve menunjukkan bagaimana presisi berubah saat recall meningkat.

  • Idealnya, kita ingin nilai presisi dan recall keduanya tinggi, namun biasanya terdapat trade-off antara keduanya.

    Trade-off antara precision dan recall artinya saat kita meningkatkan satu metrik, metrik lainnya cenderung menurun. Contohnya, jika kita menurunkan threshold klasifikasi supaya lebih banyak data diprediksi positif, recall akan meningkat (lebih banyak kasus positif tertangkap), tetapi precision bisa turun (karena lebih banyak prediksi positif yang salah). Sebaliknya, menaikkan threshold biasanya meningkatkan precision tapi menurunkan recall.

  • Model dengan performa baik memiliki PR Curve yang melengkung ke pojok kanan atas (Precision = 1, Recall = 1).

Area Under PR Curve

Area Under the Precision-Recall Curve (AUPRC) adalah ukuran numerik yang merangkum keseluruhan performa model berdasarkan trade-off antara precision dan recall pada semua threshold. Nilai AUPRC berkisar dari 0 sampai 1 :

  • Nilai mendekati 1 menandakan model dengan performa sangat baik, yaitu mampu mencapai precision dan recall yang tinggi secara bersamaan.
  • Nilai yang lebih rendah menunjukkan model kurang efektif dalam menangani kelas positif.

Baseline AUPRC adalah prevalensi kelas positif dalam dataset. Ini berarti :

  • Jika kelas positif hanya 10%, maka baseline AUPRC sekitar 0.1.
  • Model yang hanya menebak secara acak (random guessing) akan memiliki AUPRC mendekati baseline ini.

Oleh karena itu, nilai AUPRC harus dibandingkan dengan baseline untuk menilai apakah model benar-benar memberikan prediksi yang berarti..


Tabel Perbandingan Precision-Recall Curve (PRC) dan ROC Curve (ROC)
Aspek Precision-Recall Curve (PRC) ROC Curve (ROC)
Fokus Memusatkan pada performa kelas positif Performa keseluruhan antara kelas positif dan negatif
Sumbu X Recall (Sensitivitas) False Positive Rate (FPR)
Sumbu Y Precision True Positive Rate (TPR)
Kapan Lebih Direkomendasikan Data sangat tidak seimbang, ketika kelas minoritas penting Data seimbang atau fokus pada performa keseluruhan
Interpretasi Area Average Precision (AP), tinggi = baik Area Under the Curve (AUC), tinggi = baik
Sensitivitas terhadap Imbalance Lebih sensitif terhadap distribusi kelas Kurva bisa memberikan hasil optimistik jika data tidak seimbang
Kelemahan Sulit untuk diinterpretasikan jika recall sangat rendah Bisa menyesatkan jika data sangat tidak seimbang

Contoh Kasus : Identifikasi Pasien Beresiko Mengalami Penyakit Langka

Seorang peneliti sedang mengembangkan model untuk memprediksi penyakit langka di sebuah kota. Tujuan model ini adalah membantu dokter mengidentifikasi pasien yang berisiko tinggi agar dapat diberikan perhatian khusus lebih awal. Berikut adalah data yang diperoleh :

set.seed(42)

# Prediktor klinis: tekanan darah (x1), riwayat merokok (x2), dan indeks massa tubuh (x3)
x1 <- rnorm(300, mean = 120, sd = 15)               # Tekanan darah rata-rata 120
x2 <- rbinom(300, 1, 0.5)                           # 50% pasien perokok
x3 <- rnorm(300, mean = 25, sd = 4)                 # BMI rata-rata 25

# Linear predictor untuk probabilitas penyakit langka (kelas positif) — intercept diperbesar negatif supaya kelas 1 minoritas
lin_pred <- -27.5 + 0.09 * x1 + 1.5 * x2 + 0.5 * x3

# Konversi ke probabilitas menggunakan fungsi logistik
p <- 1 / (1 + exp(-lin_pred))

# Simulasi outcome penyakit langka (1 = positif, 0 = negatif)
y <- rbinom(300, 1, p)

# Membuat data frame pasien
data <- data.frame(y = y, tekanan_darah = x1, merokok = x2, bmi = x3)
head(data)
##   y tekanan_darah merokok      bmi
## 1 0      140.5644       0 19.78472
## 2 0      111.5295       0 23.99634
## 3 0      125.4469       1 25.68403
## 4 0      129.4929       0 23.38613
## 5 0      126.0640       1 25.41864
## 6 0      118.4081       0 23.72448

Sebelum membangun model, mari kita periksa proporsi pasien dengan penyakit langka :

table(data$y)
## 
##   0   1 
## 264  36
prop.table(table(data$y))
## 
##    0    1 
## 0.88 0.12

Terlihat bahwa hanya sekitar 12% pasien yang positif penyakit langka. Ini menunjukkan kondisi class imbalance yang perlu diperhatikan saat evaluasi model.

model <- glm(y ~ tekanan_darah + merokok + bmi, data = data, family = binomial)
summary(model)
## 
## Call:
## glm(formula = y ~ tekanan_darah + merokok + bmi, family = binomial, 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -24.82136    4.02074  -6.173 6.69e-10 ***
## tekanan_darah   0.06882    0.01973   3.489 0.000486 ***
## merokok         2.50047    0.59909   4.174 3.00e-05 ***
## bmi             0.47309    0.08457   5.594 2.21e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 220.15  on 299  degrees of freedom
## Residual deviance: 126.71  on 296  degrees of freedom
## AIC: 134.71
## 
## Number of Fisher Scoring iterations: 7
prob <- predict(model, type = "response")

library(PRROC)
## Loading required package: rlang
pr <- pr.curve(scores.class0 = prob[data$y == 1],
               scores.class1 = prob[data$y == 0],
               curve = TRUE)

plot(pr, main = "Precision-Recall Curve untuk Prediksi Penyakit Langka")

Grafik di atas merupakan kurva Precision-Recall (PR Curve) yang digunakan untuk mengevaluasi kinerja model prediksi penyakit langka yang sedang dikembangkan oleh peneliti. Kurva ini sangat cocok digunakan pada kasus klasifikasi tidak seimbang, seperti penyakit langka, di mana jumlah pasien positif (terdiagnosis penyakit langka) jauh lebih sedikit dibandingkan dengan yang negatif.

Penjelasan Grafik:
  • Sumbu X (Recall) menunjukkan recall atau sensitivitas, yaitu proporsi pasien yang benar-benar berpenyakit langka dan berhasil dikenali oleh model.

  • Sumbu Y (Precision) menunjukkan presisi, yaitu proporsi pasien yang diprediksi berpenyakit langka dan memang benar-benar menderita penyakit tersebut.

  • Warna pada kurva menunjukkan nilai treshold, dari ungu (tinggi) ke merah (rendah).

  • AUC = 0.7226 (Area Under Curve) menunjukkan bahwa model memiliki kinerja cukup baik dalam membedakan pasien berisiko dari yang tidak, walaupun masih ada ruang untuk perbaikan.

Makna Kurva:
  • Di awal kurva (sebelah kiri):
    Presisi (precision) sangat tinggi, hampir 100%. Artinya, model hanya memilih pasien-pasien yang benar-benar sangat jelas berisiko, dan hampir semuanya memang benar-benar sakit. Namun, karena terlalu hati-hati, model hanya menemukan sedikit pasien yang sebenarnya sakit (recall-nya rendah).

  • Semakin ke kanan (recall naik):
    Model mulai menangkap lebih banyak pasien berisiko, jadi makin banyak pasien sakit yang berhasil ditemukan. Namun, model juga mulai salah memilih—ada lebih banyak pasien yang diprediksi “berisiko” padahal sebenarnya sehat. Akibatnya, presisi turun, karena makin banyak “alarm palsu”.

Dalam konteks penyakit langka, menjaga recall yang tinggi biasanya lebih penting, karena kita ingin meminimalkan jumlah pasien berpenyakit yang tidak terdeteksi (false negative). Namun, precision juga penting, karena jika terlalu rendah, dokter akan mendapatkan terlalu banyak alarm palsu, dan ini bisa membebani sistem kesehatan.

Kesimpulan:

Model ini memiliki performa yang cukup baik (AUC PR = 0.7226) dan dapat dijadikan alat bantu dalam mengidentifikasi pasien berisiko penyakit langka. Namun, perlu evaluasi lebih lanjut terhadap titik ambang (threshold) yang optimal agar dapat menyeimbangkan antara recall dan precision sesuai kebutuhan klinis.

CHAPTER 11 : REGRESI LOGISTIK MULTINOMIAL

Regresi logistik multinomial digunakan ketika variabel dependen \(Y\) memiliki \(K\) kategori (dengan \(K > 2\)) yang bersifat nominal, yaitu tidak memiliki urutan alami. Misalnya, jika kita ingin memprediksi pilihan transportasi (bus, kereta, mobil) berdasarkan usia, pendapatan, dan jarak tempuh, regresi logistik multinomial dapat menghitung probabilitas memilih masing-masing kategori.

Berbeda dengan regresi logistik ordinal (untuk variabel dependen dengan urutan, misalnya rendah, sedang, tinggi), regresi logistik multinomial tidak mengasumsikan adanya urutan antar kategori. Model ini menghitung probabilitas setiap kategori relatif terhadap kategori referensi.

11.1. Konsep Distribusi Multinomial

Distribusi multinomial adalah generalisasi dari distribusi binomial ketika tiap percobaan memiliki lebih dari dua hasil. Fungsi probabilitas distribusi multinomial diberikan oleh:

\[ P(X_1 = n_1, X_2 = n_2, \dots, X_K = n_K) = \frac{n!}{n_1! n_2! \dots n_K!} p_1^{n_1} p_2^{n_2} \dots p_K^{n_K} \]

dengan syarat \(\sum_{i=1}^k n_i = n\) dan \(\sum_{i=1}^k p_i = 1\).

di mana:

- \(n\): Jumlah total observasi.

- \(n_j\): Jumlah observasi dalam kategori \(j\).

- \(p_j\): Probabilitas kategori \(j\), dengan \(\sum_{j=1}^K p_j = 1\).

- \(K\): Jumlah kategori.

Misalkan sebuah perusahaan melakukan survei terhadap 100 konsumen untuk mengetahui preferensi terhadap tiga merek minuman: A, B, dan C. Hasilnya adalah 40 orang memilih A, 35 memilih B, dan 25 memilih C. Probabilitas masing-masing kategori diestimasi sebagai:

\[ \hat{p}_A = \frac{40}{100} = 0.4, \quad \hat{p}_B = \frac{35}{100} = 0.35, \quad \hat{p}_C = \frac{25}{100} = 0.25 \]

Probabilitas hasil ini berdasarkan distribusi multinomial adalah:

\[ P(40, 35, 25) = \frac{100!}{40! 35! 25!} (0.4)^{40} (0.35)^{35} (0.25)^{25} \]

Kita dapat menghitung probabilitas multinomial menggunakan fungsi dmultinom di R :

# Probabilitas multinomial
n <- c(40, 35, 25)  # Frekuensi masing-masing kategori
prob <- c(0.4, 0.35, 0.25)  # Probabilitas
dmultinom(n, prob = prob)
## [1] 0.008448151

Jadi, probabilitas 40 orang memilih A, 35 memilih B, dan 25 memilih C adalah 0.00844

Distribusi ini adalah dasar bagi regresi logistik multinomial, karena model ini memodelkan probabilitas hasil pada variabel kategorik dengan lebih dari dua kategori.

11.2. Model Logit

Model logit adalah dasar dari regresi logistik multinomial. Model ini mengubah probabilitas kategori menjadi log-odds untuk memodelkan hubungan linier dengan variabel independen.

Untuk variabel dependen \(Y\) dengan \(K\) kategori, probabilitas setiap kategori \(j = 1, 2, \dots, K-1\) relatif terhadap kategori referensi \(K\) adalah:

\[ P(Y = j | \mathbf{X}) = \frac{\exp(\mathbf{X} \boldsymbol{\beta}_j)}{1 + \sum_{m=1}^{K-1} \exp(\mathbf{X} \boldsymbol{\beta}_m)} \]

Untuk kategori referensi:

\[ P(Y = K | \mathbf{X}) = \frac{1}{1 + \sum_{m=1}^{K-1} \exp(\mathbf{X} \boldsymbol{\beta}_m)} \]

di mana:

- \(\mathbf{X}\): Vektor variabel independen \([X_1, X_2, \dots, X_p]\).

- \(\boldsymbol{\beta}_j\): Vektor koefisien untuk kategori \(j\).

Log-odds didefinisikan sebagai:

\[ \log\left(\frac{P(Y = j | \mathbf{X})}{P(Y = K | \mathbf{X})}\right) = \mathbf{X} \boldsymbol{\beta}_j \]

Koefisien \(\beta_{jk}\) menunjukkan perubahan log-odds memilih kategori \(j\) dibandingkan kategori referensi untuk setiap unit perubahan pada variabel \(X_k\).

11.3. Baseline-Category Logit Model

Salah satu pendekatan utama dalam regresi logistik multinomial adalah baseline-category logit model, di mana satu kategori dipilih sebagai kategori acuan (baseline), dan kategori lainnya dibandingkan terhadap baseline tersebut dalam bentuk log-odds (logit).

Definisi Model

Dalam baseline-category logit model, jika variabel dependen \(Y\) memiliki \(K\) kategori, maka satu kategori (biasanya kategori ke-\(K\)) dipilih sebagai baseline. Model ini memodelkan log-odds untuk setiap kategori non-baseline \(j = 1, 2, \dots, K-1\) relatif terhadap kategori baseline \(K\) sebagai berikut:

\[ \log\left(\frac{P(Y = j | \mathbf{X})}{P(Y = K | \mathbf{X})}\right) = \mathbf{X} \boldsymbol{\beta}_j \]

di mana:

- \(P(Y = j | \mathbf{X})\) adalah probabilitas bahwa observasi berada pada kategori \(j\) dengan vektor variabel independen \(\mathbf{X}\).

- \(P(Y = K | \mathbf{X})\) adalah probabilitas bahwa observasi berada pada kategori baseline.

- \(\mathbf{X} = [1, X_1, X_2, \dots, X_p]\) adalah vektor variabel independen (termasuk intercept).

- \(\boldsymbol{\beta}_j = [\beta_{j0}, \beta_{j1}, \dots, \beta_{jp}]\) adalah vektor koefisien regresi untuk kategori \(j\).

Dengan demikian, terdapat \((K-1)\) fungsi logit yang dimodelkan, satu untuk setiap kategori non-baseline terhadap baseline.

Probabilitas Kategori

Probabilitas untuk setiap kategori \(j\) dihitung menggunakan fungsi softmax, yang memastikan bahwa jumlah probabilitas semua kategori sama dengan 1:

\[ P(Y = j | \mathbf{X}) = \frac{\exp(\mathbf{X} \boldsymbol{\beta}_j)}{\sum_{m=1}^K \exp(\mathbf{X} \boldsymbol{\beta}_m)}, \quad \text{dengan } \boldsymbol{\beta}_K = 0 \text{ untuk kategori baseline.} \]

Untuk kategori baseline \(K\):

\[ P(Y = K | \mathbf{X}) = \frac{1}{1 + \sum_{m=1}^{K-1} \exp(\mathbf{X} \boldsymbol{\beta}_m)}. \]

Fungsi softmax ini mengubah log-odds menjadi probabilitas yang dapat diinterpretasikan.

Model dengan Satu Prediktor

Jika hanya terdapat satu variabel independen \(X\), model logit untuk kategori \(j\) terhadap baseline \(K\) adalah:

\[ \log\left(\frac{P(Y = j | \mathbf{X})}{P(Y = K | \mathbf{X})}\right) = \beta_{j0} + \beta_{j1}X, \quad j = 1, 2, \dots, K-1. \]

  • \(\beta_{j0}\): Intercept untuk kategori \(j\).
  • \(\beta_{j1}\): Koefisien regresi yang menunjukkan perubahan log-odds untuk setiap unit perubahan pada \(X\) ketika membandingkan kategori \(j\) dengan baseline.

Misalkan variabel dependen \(Y\) memiliki tiga kategori: \(\{1, 2, 3\}\), dengan kategori 3 sebagai baseline. Model logitnya adalah:

\[ \log\left(\frac{P(Y = 1 | \mathbf{X})}{P(Y = 3 | \mathbf{X})}\right) = \beta_{10} + \beta_{11}X \]

\[ \log\left(\frac{P(Y = 2 | \mathbf{X})}{P(Y = 3 | \mathbf{X})}\right) = \beta_{20} + \beta_{21}X \]

Jika kita ingin menghitung log-odds antara kategori 1 dan 2 (bukan terhadap baseline), kita dapat menggunakan selisih logit:

\[ \log\left(\frac{P(Y = 1 | \mathbf{X})}{P(Y = 2 | \mathbf{X})}\right) = \log\left(\frac{P(Y = 1 | \mathbf{X}) / P(Y = 3 | \mathbf{X})}{P(Y = 2 | \mathbf{X}) / P(Y = 3 | \mathbf{X})}\right) = (\beta_{10} + \beta_{11}X) - (\beta_{20} + \beta_{21}X) = (\beta_{10} - \beta_{20}) + (\beta_{11} - \beta_{21})X \]

Ini menunjukkan bahwa hubungan antar kategori non-baseline dapat dihitung dari parameter model yang ada.

11.4. Estimasi Parameter

Estimasi parameter dalam regresi logistik multinomial adalah proses kunci untuk menentukan koefisien regresi \(\boldsymbol{\beta}\) yang memodelkan hubungan antara variabel independen dan probabilitas kategori pada variabel dependen dengan lebih dari dua kategori nominal. Proses ini dilakukan dengan metode maximum likelihood estimation (MLE) menggunakan algoritma iteratif, seperti Newton-Raphson, untuk memaksimalkan fungsi log-likelihood berdasarkan data yang diamati.

Estimasi parameter bertujuan menemukan nilai optimal koefisien \(\boldsymbol{\beta}_j\) (untuk setiap kategori \(j = 1, 2, \dots, K-1\) relatif terhadap kategori baseline \(K\)) yang memaksimalkan kecocokan model terhadap data. Probabilitas prediksi untuk kategori \(j\) pada observasi \(i\) diberikan oleh fungsi softmax:

\[ P(Y_i = j | \mathbf{X}_i) = \frac{\exp(\mathbf{X}_i \boldsymbol{\beta}_j)}{\sum_{m=1}^K \exp(\mathbf{X}_i \boldsymbol{\beta}_m)}, \]

dengan \(\boldsymbol{\beta}_K = 0\) untuk kategori baseline. Nilai \(\boldsymbol{\beta}\) diestimasi dengan memaksimalkan fungsi log-likelihood, yang merupakan pendekatan statistik standar untuk model probabilistik.

Fungsi Log-Likelihood

Fungsi log-likelihood mengukur seberapa baik model menjelaskan data yang diamati. Untuk dataset dengan \(n\) observasi dan \(K\) kategori, log-likelihood didefinisikan sebagai:

\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \sum_{j=1}^K y_{ij} \log(\pi_{ij}), \]

di mana:

- \(\pi_{ij} = P(Y_i = j | \mathbf{X}_i)\) adalah probabilitas prediksi bahwa observasi \(i\) termasuk dalam kategori \(j\).

- \(y_{ij} = 1\) jika observasi \(i\) benar-benar termasuk dalam kategori \(j\), dan \(y_{ij} = 0\) jika tidak (indikator dummy).

- \(\sum_{j=1}^K y_{ij} = 1\) untuk setiap \(i\), karena setiap observasi hanya termasuk dalam satu kategori.

Rumus ini mencerminkan kontribusi setiap observasi terhadap log-likelihood, di mana hanya probabilitas kategori yang benar-benar diamati (\(y_{ij} = 1\)) yang memberikan kontribusi logaritmik.

11.5 Studi Kasus

Sebuah perusahaan transportasi di Jakarta, bernama TransJaya, ingin memahami preferensi pelanggan terhadap tiga moda transportasi yang mereka tawarkan: bus, kereta api, dan taksi online. Dengan meningkatnya urbanisasi dan perubahan gaya hidup, perusahaan ini mengumpulkan data dari 300 pelanggan untuk mengidentifikasi faktor-faktor yang memengaruhi pilihan moda transportasi. Seorang analis data di TransJaya, Budi, ingin mengetahui apakah usia, pendapatan, dan jarak tempuh memiliki pengaruh terhadap pilihan moda transportasi. Dengan menggunakan regresi logistik multinomial, Budi dapat memprediksi probabilitas seseorang memilih bus, kereta api, atau taksi online, serta mengidentifikasi variabel yang paling dominan dalam keputusan tersebut.

Berikut adalah deskripsi variabel yang digunakan dalam studi kasus ini:

  • Variabel Dependen (Y):
    • Mode Transportasi: Variabel kategorik nominal dengan tiga kategori:
      • 1 = Bus
      • 2 = Kereta Api
      • 3 = Taksi Online (kategori baseline)
    • Variabel ini tidak memiliki urutan alami, sehingga cocok untuk regresi logistik multinomial.
  • Variabel Independen (X):
    • Usia: Usia pelanggan dalam tahun.
    • Pendapatan: Pendapatan bulanan pelanggan dalam juta rupiah.
    • Jarak Tempuh: Jarak harian tempuh pelanggan dalam kilometer.

Data dikumpulkan melalui survei dan diperoleh data sebagai berikut :

set.seed(18)
n <- 300
jarak <- runif(n, 1, 15)
pendapatan <- sample(c("rendah", "sedang", "tinggi"), n, replace = TRUE)
tinggal <- sample(c("rumah", "kos"), n, replace = TRUE)
transportasi <- sample(c("jalan kaki", "sepeda motor", "angkot"), n, replace = TRUE, prob = c(0.3, 0.5, 0.2))
data <- data.frame(jarak, pendapatan, tinggal, transportasi)
head(data)
##       jarak pendapatan tinggal transportasi
## 1 12.520548     tinggi   rumah   jalan kaki
## 2 10.942794     tinggi     kos       angkot
## 3 14.521687     tinggi     kos   jalan kaki
## 4  2.100551     tinggi   rumah sepeda motor
## 5  1.750919     rendah   rumah       angkot
## 6  9.049695     rendah   rumah   jalan kaki

11.5.1. Estimasi Parameter

Untuk memahami bagaimana jarak tempuh, pendapatan, dan tempat tinggal memengaruhi pilihan moda transportasi pelanggan, digunakan pendekatan regresi logistik multinomial. Dalam model ini, kategori angkot secara dipilih sebagai kategori referensi (baseline), sehingga hasil model merepresentasikan perbandingan peluang memilih jalan kaki dan sepeda motor terhadap angkot.

Dua variabel prediktor, yaitu pendapatan dan tempat tinggal, merupakan variabel kategorik. Untuk mengikutsertakannya dalam model, ditambahkan dummy variabel.

  • Untuk pendapatan, digunakan kategori “rendah” sebagai baseline, sehingga dummy yang muncul adalah:

    • pendapatansedang

    • pendapatantinggi

  • Untuk tinggal, digunakan kategori “kos” sebagai referensi, sehingga dummy yang muncul adalah:

-    `tinggalrumah`

Dengan demikian, model menghitung dua set persamaan logit:

  • Logit(jalan kaki / angkot)

  • Logit(sepeda motor / angkot)

library(nnet)
model  <- multinom(transportasi ~ jarak + pendapatan + tinggal, data = data)
## # weights:  18 (10 variable)
## initial  value 329.583687 
## iter  10 value 303.518826
## final  value 303.309704 
## converged
summary(model)
## Call:
## multinom(formula = transportasi ~ jarak + pendapatan + tinggal, 
##     data = data)
## 
## Coefficients:
##              (Intercept)      jarak pendapatansedang pendapatantinggi
## jalan kaki    0.07862222 0.06978593        0.1529910       -0.3965640
## sepeda motor  0.92203957 0.01999032        0.1833149        0.2254527
##              tinggalrumah
## jalan kaki     -0.1233148
## sepeda motor   -0.4779678
## 
## Std. Errors:
##              (Intercept)      jarak pendapatansedang pendapatantinggi
## jalan kaki     0.4931785 0.04182598        0.4092540        0.4172784
## sepeda motor   0.4513500 0.03861845        0.3923642        0.3783906
##              tinggalrumah
## jalan kaki      0.3483113
## sepeda motor    0.3203501
## 
## Residual Deviance: 606.6194 
## AIC: 626.6194

Berdasarkan perhitungan R, dapat disimpulkan bahwa :

Jalan Kaki vs Angkot

  • Intercept = 0.0786
    Saat semua variabel prediktor bernilai nol, log-odds memilih jalan kaki dibanding angkot adalah 0.0786

  • Jarak = 0.0698
    Setiap tambahan 1 km jarak tempuh harian akan meningkatkan log-odds memilih jalan kaki dibanding angkot sebesar 0.0698, dengan asumsi variabel lain tetap.

  • Pendapatan sedang = 0.1530
    Dibanding pelanggan berpendapatan rendah, pelanggan dengan pendapatan sedang memiliki log-odds 0.1530 lebih tinggi untuk memilih jalan kaki dibanding angkot.

  • Pendapatan tinggi = -0.3966
    Dibanding pelanggan berpendapatan rendah, pelanggan dengan pendapatan tinggi memiliki log-odds 0.3966 lebih rendah untuk memilih jalan kaki dibanding angkot.

  • Tinggal di rumah = -0.1233
    Dibanding pelanggan yang tinggal di kos, pelanggan yang tinggal di rumah memiliki log-odds 0.1233 lebih rendah untuk memilih jalan kaki dibanding angkot.

Sepeda Motor vs Angkot

  • Intercept = 0.9220
    Saat semua variabel prediktor bernilai nol, log-odds memilih sepeda motor dibanding angkot adalah 0.9220

  • Jarak = 0.0200
    Setiap tambahan 1 km jarak tempuh harian akan meningkatkan log-odds memilih sepeda motor dibanding angkot sebesar 0.0200, dengan asumsi variabel lain tetap.

  • Pendapatan sedang = 0.1833
    Dibanding pelanggan berpendapatan rendah, pelanggan dengan pendapatan sedang memiliki log-odds 0.1833 lebih tinggi untuk memilih sepeda motor dibanding angkot.

  • Pendapatan tinggi = 0.2255
    Dibanding pelanggan berpendapatan rendah, pelanggan dengan pendapatan tinggi memiliki log-odds 0.2255 lebih tinggi untuk memilih sepeda motor dibanding angkot.

  • Tinggal di rumah = -0.4780
    Dibanding pelanggan yang tinggal di kos, pelanggan yang tinggal di rumah memiliki log-odds 0.4780 lebih rendah untuk memilih sepeda motor dibanding angkot.

Setelah memperoleh estimasi koefisien, langkah selanjutnya adalah menguji signifikansi statistik dari masing-masing parameter dengan menggunakan nilai p-value. Nilai p-value menunjukkan apakah suatu variabel prediktor memiliki pengaruh yang secara statistik signifikan terhadap pilihan moda transportasi pada taraf signifikansi tertentu (dalam analisis ini digunakan α = 5%).

# Hitung z-statistik
z <- summary(model)$coefficients / summary(model)$standard.errors

# Hitung p-value dua sisi
pval <- 2 * (1 - pnorm(abs(z)))

# Tampilkan p-value hasil pembulatan 4 digit
round(pval, 4)
##              (Intercept)  jarak pendapatansedang pendapatantinggi tinggalrumah
## jalan kaki        0.8733 0.0952           0.7085           0.3419       0.7233
## sepeda motor      0.0411 0.6047           0.6404           0.5513       0.1357

Berdasarkan pvalue di atas, dapat disimpulkan bahwa :

Jalan Kaki vs Angkot

  • Karena p-value untuk intercept adalah 0.8733, maka intercept tidak signifikan, artinya tidak terdapat perbedaan log-odds memilih jalan kaki dibanding angkot saat semua variabel bernilai nol.

  • Karena p-value untuk jarak adalah 0.0952, maka jarak tidak signifikan, artinya perubahan jarak tempuh tidak berpengaruh signifikan terhadap peluang memilih jalan kaki dibanding angkot.

  • Karena p-value untuk pendapatan sedang adalah 0.7085, maka pendapatan sedang tidak signifikan, artinya kategori ini tidak berpengaruh signifikan terhadap peluang memilih jalan kaki dibanding angkot.

  • Karena p-value untuk pendapatan tinggi adalah 0.3419, maka pendapatan tinggi tidak signifikan, artinya kategori ini tidak berpengaruh signifikan terhadap peluang memilih jalan kaki dibanding angkot.

  • Karena p-value untuk tinggal di rumah adalah 0.7233, maka status tinggal tidak signifikan, artinya tidak ada pengaruh signifikan tinggal di rumah dibanding di kos terhadap peluang memilih jalan kaki dibanding angkot.

Sepeda Motor vs Angkot

  • Karena p-value untuk intercept adalah 0.0411, maka intercept signifikan, artinya terdapat perbedaan log-odds memilih sepeda motor dibanding angkot saat semua variabel bernilai nol.

  • Karena p-value untuk jarak adalah 0.6047, maka jarak tidak signifikan, artinya perubahan jarak tempuh tidak berpengaruh signifikan terhadap peluang memilih sepeda motor dibanding angkot.

  • Karena p-value untuk pendapatan sedang adalah 0.6404, maka pendapatan sedang tidak signifikan, artinya kategori ini tidak berpengaruh signifikan terhadap peluang memilih sepeda motor dibanding angkot.

  • Karena p-value untuk pendapatan tinggi adalah 0.5513, maka pendapatan tinggi tidak signifikan, artinya kategori ini tidak berpengaruh signifikan terhadap peluang memilih sepeda motor dibanding angkot.

  • Karena p-value untuk tinggal di rumah adalah 0.1357, maka status tinggal tidak signifikan, artinya tidak ada pengaruh signifikan tinggal di rumah dibanding di kos terhadap peluang memilih sepeda motor dibanding angkot.

11.5.2. Prediksi dan Evaluasi

Setelah dilakukan uji signifikansi terhadap parameter model, diketahui bahwa tidak ada satu pun variabel prediktor (jarak, pendapatan, maupun tempat tinggal) yang berpengaruh signifikan terhadap pilihan moda transportasi, baik untuk kategori jalan kaki maupun sepeda motor jika dibandingkan dengan angkot sebagai kategori referensi.

Hal ini memberikan kesimpulan bahwa model belum memiliki kekuatan prediktif yang kuat, karena variabel-variabel dalam model tidak memiliki hubungan yang cukup kuat secara statistik terhadap kategori respon. Untuk membuktikan hal tersebut, dilakukan prediksi terhadap pilihan moda transportasi menggunakan model yang telah dibangun, dan hasilnya dibandingkan dengan data aktual melalui confusion matrix berikut:

data$Predicted <- predict(model)
table(Predicted = data$Predicted, Actual = data$transportasi)
##               Actual
## Predicted      angkot jalan kaki sepeda motor
##   angkot            0          0            0
##   jalan kaki        7         17           14
##   sepeda motor     51         77          134

Berdasarkan confusion matrix di atas, dapat disimpulkan bahwa :

  • Dari total 58 pelanggan yang sebenarnya memilih angkot, model memprediksi 0 orang sebagai pengguna angkot.

  • Dari total 94 pelanggan yang sebenarnya memilih jalan kaki, model memprediksi 17 orang dengan benar, dan salah mengklasifikasikan 7 orang sebagai jalan kaki padahal sebenarnya pengguna angkot, dan 14 orang sebagai jalan kaki padahal sebenarnya pengguna sepeda motor.

  • Dari total 148 pelanggan yang sebenarnya memilih sepeda motor, model memprediksi 134 orang dengan benar, dan salah mengklasifikasikan 51 orang sebagai sepeda motor padahal sebenarnya pengguna angkot, dan 77 orang sebagai sepeda motor padahal sebenarnya pengguna jalan kaki.

Dapat dilihat bahwa model tidak pernah memprediksi kelas angkot, yang berarti model cenderung bias terhadap dua kategori lainnya, yaitu jalan kaki dan sepeda motor.

Untuk mengevaluasi kinerja model secara keseluruhan, salah satu metrik yang umum digunakan adalah akurasi, yaitu proporsi prediksi yang benar terhadap seluruh data.

# Buat vektor prediksi dan aktual
prediksi <- predict(model, newdata = data)
aktual <- data$transportasi

# Hitung akurasi
akurasi <- mean(prediksi == aktual)
print(akurasi)
## [1] 0.5033333

Model memiliki tingkat akurasi sebesar 50.33%, artinya sekitar separuh dari total 300 pelanggan berhasil diprediksi dengan benar. Meskipun lebih tinggi dari peluang acak (sekitar 33% untuk tiga kelas), nilai ini tidak dapat dianggap cukup baik karena model mengabaikan satu kelas sepenuhnya (angkot), dan performa klasifikasinya berfokus hanya pada sepeda motor.

library(DescTools)
PseudoR2(model, which = "Nagelkerke")
## Warning in PseudoR2(model, which = "Nagelkerke"): Could not find model or data
## element of multinom object for evaluating PseudoR2 null model. Will fit null
## model with new evaluation of 'data'. Ensure object has not changed since
## initial call, or try running multinom with 'model = TRUE'
## Nagelkerke 
## 0.04245685

Berdasarkan perhitungan, diperoleh nilai Nagelkerke R² sebesar 0.0425, atau sekitar 4.25%. Nilai ini menunjukkan bahwa model hanya mampu menjelaskan sekitar 4.25% variasi dalam data respon (pilihan moda transportasi). Dengan kata lain, lebih dari 95% variasi tidak dapat dijelaskan oleh model, yang memperkuat temuan sebelumnya bahwa model tidak memiliki kekuatan prediktif yang cukup baik.

CHAPTER 12 : REGRESI LOGISTIK ORDINAL

Regresi logistik ordinal adalah metode statistik yang digunakan untuk memodelkan hubungan antara variabel independen (prediktor) dan variabel dependen yang bersifat ordinal, yaitu memiliki kategori yang berurutan tetapi jarak antar kategori tidak selalu sama (misalnya, tingkat kepuasan: “sangat tidak puas”, “tidak puas”, “puas”, “sangat puas”). Berbeda dengan regresi logistik biner (dua kategori) atau multinomial (kategori tidak berurutan), regresi logistik ordinal memanfaatkan sifat urutan kategori untuk menghasilkan model yang lebih efisien.

Tujuan utama regresi logistik ordinal adalah memprediksi probabilitas suatu observasi berada pada atau di bawah kategori tertentu, dengan mempertimbangkan urutan kategori tersebut. Model ini sering digunakan dalam bidang seperti ilmu sosial, kesehatan, dan pemasaran.

Perbandingan dengan Regresi Logistik Biner dan Multinomial

Untuk memahami posisi regresi logistik ordinal, berikut adalah tabel perbandingan dengan regresi logistik biner dan multinomial:

Aspek Regresi Logistik Biner Regresi Logistik Multinomial Regresi Logistik Ordinal
Jenis Variabel Dependen Kategori biner (2 level) Kategori nominal (>2 level) Kategori ordinal (>2 level)
Urutan Kategori Tidak ada urutan Tidak ada urutan Ada urutan
Model Dasar Logit Logit multinomial Cumulative logit
Jumlah Parameter Sedikit Lebih banyak (satu set parameter per kategori) Sedang (parameter prediktor sama untuk semua cutoff)
Asumsi Utama Independensi observasi Independensi observasi Proportional odds (efek prediktor sama untuk setiap cutoff)
Contoh Aplikasi Prediksi lulus/gagal Pilihan merek produk Tingkat kepuasan pelanggan

Regresi logistik ordinal lebih hemat parameter dibandingkan regresi multinomial karena memanfaatkan sifat urutan, tetapi memerlukan asumsi tambahan seperti proportional odds.

12.1. Konsep Cumulative Logit Model

Cumulative logit model (juga disebut proportional odds model) adalah pendekatan utama dalam regresi logistik ordinal. Model ini memodelkan probabilitas kumulatif bahwa suatu observasi berada pada atau di bawah kategori tertentu.

Misalkan variabel dependen ordinal \(Y\) memiliki \(J\) kategori berurutan: \(1, 2, \ldots, J\). Probabilitas kumulatif untuk kategori ke-\(j\) didefinisikan sebagai:

\[ P(Y \leq j | \mathbf{x}) = P(Y = 1 | \mathbf{x}) + P(Y = 2 | \mathbf{x}) + \cdots + P(Y = j | \mathbf{x}) \]

Fungsi logit kumulatif didefinisikan sebagai:

\[ \text{logit}(P(Y \leq j | \mathbf{x})) = \log\left(\frac{P(Y \leq j | \mathbf{x})}{1 - P(Y \leq j | \mathbf{x})}\right) = \alpha_j - \mathbf{\beta}^\top \mathbf{x} \]

di mana:

- \(\alpha_j\): Intersep khusus untuk kategori ke-\(j\), dengan \(\alpha_1 < \alpha_2 < \cdots < \alpha_{J-1}\).

- \(\mathbf{\beta}\): Vektor koefisien prediktor, yang sama untuk semua kategori (asumsi proportional odds).

- \(\mathbf{x}\): Vektor variabel independen.

Tanda negatif pada \(\mathbf{\beta}^\top \mathbf{x}\) menunjukkan bahwa ketika nilai prediktor \(\mathbf{x}\) meningkat, probabilitas berada di kategori yang lebih rendah menurun, sehingga probabilitas berada di kategori yang lebih tinggi meningkat.

12.2. Estimasi Parameter

Estimasi parameter dalam regresi logistik ordinal dilakukan menggunakan Maximum Likelihood Estimation (MLE). Tujuannya adalah memaksimalkan fungsi likelihood:

\[ L(\alpha, \beta | \text{data}) = \prod_{i=1}^n \prod_{j=1}^J [P(Y_i = j | \mathbf{x}_i)]^{I(Y_i = j)} \]

Di mana \(I(Y_i = j)\) adalah indikator bahwa observasi ke-\(i\) berada pada kategori \(j\).

Dalam praktik, perangkat lunak seperti R (paket MASS dengan fungsi polr) atau Python (paket statsmodels) digunakan untuk menghitung estimasi parameter. Prosesnya melibatkan optimisasi numerik, seperti algoritma Newton-Raphson.

Interpretasi Parameter

Koefisien \(\beta_k\) dalam model cumulative logit menggambarkan efek perubahan satu unit pada prediktor \(x_k\) terhadap log odds kumulatif, dengan asumsi prediktor lain konstan. Interpretasi utama adalah:

  • Log Odds: Jika \(\beta_k > 0\), peningkatan satu unit pada \(x_k\) meningkatkan log odds bahwa \(Y \leq j\), yang berarti kecenderungan ke kategori yang lebih rendah.
  • Odds Ratio: Dengan meng-eksponensialkan koefisien (\(\exp(\beta_k)\)), kita mendapatkan odds ratio. Misalnya, jika \(\exp(\beta_k) = 2\), peningkatan satu unit pada \(x_k\) menggandakan odds bahwa \(Y \leq j\).
  • Intersep \(\alpha_j\): Menunjukkan log odds kumulatif untuk kategori \(j\) ketika semua prediktor \(\mathbf{x} = 0\).

Contoh: Jika \(\beta_1 = 0.5\) untuk variabel “usia”, maka peningkatan usia satu tahun meningkatkan log odds berada di kategori yang lebih rendah sebesar 0.5, atau odds-nya meningkat sebesar \(\exp(0.5) \approx 1.65\).

12.3. Goodness-of-Fit

Untuk mengevaluasi kecocokan model, beberapa ukuran goodness-of-fit dapat digunakan:

  1. Deviance: Membandingkan model yang dipasang dengan model jenuh (saturated model). Deviance dihitung sebagai:

\[ D = -2 \ln \left( \frac{L_{\text{model}}}{L_{\text{saturated}}} \right) \]

Deviance yang kecil menunjukkan model cocok dengan data.

  1. Pseudo-\(R^2\): Seperti Nagelkerke atau McFadden, memberikan gambaran proporsi variansi yang dijelaskan model.
  2. AIC/BIC: Kriteria informasi Akaike (AIC) atau Bayesian (BIC) digunakan untuk membandingkan model. Nilai yang lebih rendah menunjukkan model yang lebih baik.

12.4. Asumsi Proportional Odds (Paralelisme)

Asumsi proportional odds (atau paralelisme) menyatakan bahwa efek prediktor \(\mathbf{\beta}\) sama untuk setiap cutoff kategori. Secara matematis:

\[ \text{logit}(P(Y \leq j | \mathbf{x})) - \text{logit}(P(Y \leq j-1 | \mathbf{x})) = \alpha_j - \alpha_{j-1} \]

Ini berarti odds ratio konstan untuk semua cutoff. Asumsi ini disebut paralelisme karena garis logit untuk setiap kategori paralel dalam ruang prediktor.

12.4.1. Pengujian Asumsi Proportional Odds

Untuk memverifikasi asumsi Proportional Odds dapat dilakukan dengan melakukan pengujian sebagai berikut :

12.4.1.1. Brant Test

Tujuan : Menguji apakah koefisien prediktor sama untuk semua cutoff kategori.

Hipotesis

\(H_0\): Koefisien prediktor sama untuk semua cutoff (asumsi proportional odds terpenuhi).

\(H_1\): Koefisien prediktor berbeda untuk setidaknya satu cutoff (pelanggaran asumsi).

Statistik Uji

Brant test membandingkan koefisien dari model biner untuk setiap cutoff menggunakan statistik Wald :

\[ \chi^2 = (\hat{\beta}_{k,j} - \hat{\beta}_{k,j'})^\top \hat{\Sigma}^{-1} (\hat{\beta}_{k,j} - \hat{\beta}_{k,j'}) \]

Di mana \(\hat{\beta}_{k,j}\) adalah koefisien prediktor \(k\) pada cutoff \(j\), dan \(\hat{\Sigma}\) adalah matriks kovariansi.

Kriteria Uji:

Tingkat signifikansi: \(\alpha = 0.05\).

  • Jika p-value > 0.05, gagal tolak \(H_0\), asumsi proportional odds terpenuhi.

  • Jika p-value ≤ 0.05, tolak \(H_0\), asumsi dilanggar.

12.4.1.2. Likelihood Ratio Test

Tujuan : Membandingkan model proportional odds dengan model tanpa asumsi paralelisme (misalnya, generalized ordinal model).

Hipotesis

\(H_0\): Model proportional odds cukup menjelaskan data.

\(H_1\): Model tanpa asumsi proportional odds lebih sesuai.

Statistik Uji

Perbedaan deviance antara dua model:

\[ \text{LR} = -2 \left( \ln L_{\text{restricted}} - \ln L_{\text{unrestricted}} \right) \]

Mengikuti distribusi chi-square dengan derajat bebas:

\[ \text{df} = (\text{jumlah parameter unrestricted}) - (\text{jumlah parameter restricted}) \]

Kriteria Uji

Tingkat signifikansi: \(\alpha = 0.05\).

  • Jika p-value > 0.05, gagal tolak \(H_0\).

  • Jika p-value ≤ 0.05, tolak \(H_0\).

12.4.1.3. Visualisasi

Tujuan : Memeriksa konsistensi efek prediktor melalui plot probabilitas kumulatif atau odds ratio.

Jenis Plot:

  1. Probabilitas Kumulatif : Plot \(P(Y \leq j | \mathbf{x})\) terhadap prediktor untuk setiap cutoff \(j\).
    • Memenuhi Asumsi: Garis probabilitas untuk setiap cutoff memiliki pola konsisten, dengan jarak antar garis relatif konstan atau paralel dalam skala logit.

    • Melanggar Asumsi: Garis bersilangan atau memiliki kemiringan sangat berbeda.

  2. Log Odds atau Odds Ratio: Plot log odds atau odds ratio untuk setiap cutoff terhadap prediktor.
    • Memenuhi Asumsi: Garis log odds paralel.

    • Melanggar Asumsi: Garis tidak paralel atau bersilangan.

12.4.2. Alternatif Model Ordinal

ika asumsi proportional odds tidak terpenuhi, model cumulative logit dapat menghasilkan prediksi yang bias. Alternatif seperti generalized ordinal model atau partial proportional odds model harus dipertimbangkan. Berikut adalah beberapa model alternatif dapat digunakan jika asumsi proportional odds tidak terpenuhi:

  1. Generalized Ordinal Model:
    • Memungkinkan koefisien prediktor \(\beta\) bervariasi untuk setiap cutoff kategori.
    • Model ini lebih fleksibel tetapi memerlukan lebih banyak parameter.
    • Contoh implementasi: Fungsi vgam dalam paket VGAM di R.
  2. Partial Proportional Odds Model:
    • Mengizinkan beberapa prediktor memenuhi asumsi proportional odds, sementara yang lain memiliki efek yang berbeda untuk setiap cutoff.
    • Implementasi: Paket ordinal di R dengan fungsi clm.
  3. Continuation Ratio Model:
    • Memodelkan probabilitas bersyarat bahwa \(Y = j\) diberikan \(Y \geq j\).
    • Cocok untuk data ordinal dengan interpretasi berurutan, seperti tahapan perkembangan.
  4. Adjacent Categories Model:
    • Membandingkan kategori yang berdekatan (misalnya, \(P(Y = j)\) vs. \(P(Y = j+1)\)).
    • Kurang umum digunakan dibandingkan cumulative logit.

12.5. Studi Kasus

Sebuah perusahaan ritel ingin memahami faktor-faktor yang memengaruhi tingkat kepuasan pelanggan terhadap layanan toko online mereka. Data dikumpulkan dari 100 pelanggan, dengan tingkat kepuasan diukur dalam skala ordinal : “Sangat Tidak Puas” (1), “Tidak Puas” (2), “Puas” (3), dan “Sangat Puas” (4).

Dua faktor yang dianggap memengaruhi kepuasan adalah usia pelanggan (tahun) dan pendapatan bulanan (dalam ribu rupiah). Berikut adalah penjelasan variabel yang digunakan :

  • Variabel Dependen:
    • kepuasan: Tingkat kepuasan pelanggan (ordinal, 4 level: 1 = Sangat Tidak Puas, 2 = Tidak Puas, 3 = Puas, 4 = Sangat Puas).
  • Variabel Independen:
    • usia: Usia pelanggan (numerik, dalam tahun)
    • pendapatan: Pendapatan bulanan pelanggan (numerik, dalam ribu rupiah)

Data yang telah terkumpul adalah sebagai berikut :

set.seed(99)
n <- 100

# Variabel prediktor
usia <- rnorm(n, mean = 40, sd = 10)
pendapatan <- rnorm(n, mean = 5000, sd = 1000)

# Skor tidak terlalu ekstrem agar tidak perfect separation
skor <- 0.01 * usia + 0.0002 * pendapatan + rnorm(n, sd = 2)

# Potong skor jadi 4 kategori ordinal
kepuasan <- cut(skor,
                breaks = c(-Inf, 5.5, 6.5, 7.5, Inf),
                labels = c("Sangat Tidak Puas", "Tidak Puas", "Puas", "Sangat Puas"),
                ordered_result = TRUE)

# Buat data frame
data <- data.frame(kepuasan, usia, pendapatan)
head(data)
##            kepuasan     usia pendapatan
## 1 Sangat Tidak Puas 42.13963   3474.931
## 2 Sangat Tidak Puas 44.79658   4499.008
## 3 Sangat Tidak Puas 40.87829   3786.819
## 4 Sangat Tidak Puas 44.43859   4369.723
## 5 Sangat Tidak Puas 36.37162   3552.514
## 6 Sangat Tidak Puas 41.22674   4833.092
Estimasi Parameter

Model regresi logistik ordinal dipasang untuk mengestimasi koefisien prediktor. Proses ini menggunakan metode Maximum Likelihood Estimation.

# Fit model cumulative logit
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
model <- polr(kepuasan ~ usia + pendapatan, data = data, Hess = TRUE)
summary(model)
## Call:
## polr(formula = kepuasan ~ usia + pendapatan, data = data, Hess = TRUE)
## 
## Coefficients:
##                Value Std. Error t value
## usia       0.1196595  0.0342781   3.491
## pendapatan 0.0002852  0.0002385   1.196
## 
## Intercepts:
##                              Value    Std. Error t value 
## Sangat Tidak Puas|Tidak Puas   9.4826   0.0206   461.0292
## Tidak Puas|Puas               11.1679   0.8958    12.4666
## Puas|Sangat Puas              30.4548   0.8958    33.9964
## 
## Residual Deviance: 40.54249 
## AIC: 50.54249
# Hitung z-statistik
model_summary <- summary(model)
coefs <- model_summary$coefficients[, "Value"]
std_errors <- model_summary$coefficients[, "Std. Error"]
z <- coefs / std_errors

# Hitung p-value dua sisi
pval <- 2 * (1 - pnorm(abs(z)))

# Tampilkan p-value hasil pembulatan 4 digit
print(round(pval, 4))
##                         usia                   pendapatan 
##                       0.0005                       0.2317 
## Sangat Tidak Puas|Tidak Puas              Tidak Puas|Puas 
##                       0.0000                       0.0000 
##             Puas|Sangat Puas 
##                       0.0000

Berdasarkan hasil perhitungan R di atas, dapat disimpulkan bahwa :

Usia

  • Koefisien usia sebesar 0.1197 menunjukkan bahwa setiap kenaikan 1 tahun usia akan meningkatkan log odds untuk berada pada kategori kepuasan yang lebih tinggi sebesar 0.1197, dengan asumsi variabel lain tetap. Artinya, makin tua seseorang, makin besar kemungkinan mereka merasa lebih puas.

  • P-value untuk usia adalah 0.0005, yang lebih kecil dari 0.05. Ini berarti pengaruh usia terhadap kepuasan signifikan secara statistik. Jadi, usia memang punya peran yang nyata dalam memengaruhi tingkat kepuasan responden.

Pendapatan

  • Koefisien pendapatan sebesar 0.00029 menunjukkan bahwa setiap kenaikan seribu pendapatan akan meningkatkan log odds untuk kategori kepuasan yang lebih tinggi sebesar 0.00029. Artinya, semakin besar pendapatan seseorang, makin besar kemungkinan mereka merasa lebih puas.

  • P-value untuk pendapatan adalah 0.2317, yang lebih besar dari 0.05. Ini berarti tidak ada bukti yang cukup bahwa pendapatan berpengaruh signifikan terhadap tingkat kepuasan dalam model ini. Artinya, pendapatan mungkin tidak terlalu menentukan tingkat kepuasan responden.

Pada regresi ordinal, intercept atau threshold menunjukkan titik-titik log odds yang membagi kategori kepuasan.

Sangat Tidak Puas | Tidak Puas = 9.4826

Nilai ambang batas ini digunakan untuk memisahkan kemungkinan seseorang berada pada kategori “Sangat Tidak Puas” atau kategori yang lebih tinggi, yaitu “Tidak Puas”, “Puas”, atau “Sangat Puas”.

  • Jika skor gabungan (hasil dari kombinasi usia dan pendapatan yang dimasukkan ke dalam model) lebih kecil dari 9.4826, maka besar kemungkinan responden akan masuk ke kategori “Sangat Tidak Puas”.

  • Sebaliknya, jika skor gabungan lebih besar dari 9.4826, maka responden kemungkinan besar tidak akan berada dalam kategori “Sangat Tidak Puas”, melainkan masuk ke kategori yang lebih tinggi: “Tidak Puas” ke atas.

Tidak Puas | Puas = 11.1679

Ambang ini memisahkan responden yang cenderung berada pada kategori “Tidak Puas atau lebih rendah” (yaitu “Sangat Tidak Puas” dan “Tidak Puas”) dari mereka yang cenderung berada pada kategori “Puas atau lebih tinggi”.

  • Jika skor gabungan lebih kecil dari 11.1679, maka responden cenderung masuk ke kategori “Tidak Puas” atau “Sangat Tidak Puas”.

  • Jika skor gabungan lebih besar dari 11.1679, maka kemungkinan responden masuk ke kategori “Puas” atau bahkan “Sangat Puas” akan meningkat.

Puas | Sangat Puas = 30.4548

Ambang ini memisahkan antara kategori “Puas atau kurang” (yaitu “Sangat Tidak Puas”, “Tidak Puas”, dan “Puas”) dengan kategori tertinggi, yaitu “Sangat Puas”.

  • Jika skor gabungan lebih kecil dari 30.4548, maka responden masih berada dalam kategori “Puas” atau lebih rendah.

  • Namun, jika skor gabungan melebihi 30.4548, maka responden cenderung masuk ke kategori “Sangat Puas”.

Tabel berikut menjelaskan ringkasan interpretasi masing-masing threshold (ambang batas) dari model regresi logistik ordinal yang memprediksi tingkat kepuasan berdasarkan usia dan pendapatan.

Rentang Skor Gabungan Kategori Kepuasan Kemungkinan Interpretasi
< 9.4826 Sangat Tidak Puas Responden sangat mungkin berada pada kategori “Sangat Tidak Puas”.
9.4826 – 11.1679 Tidak Puas Responden kemungkinan besar berada pada kategori “Tidak Puas”.
11.1679 – 30.4548 Puas Responden kemungkinan besar berada pada kategori “Puas”.
> 30.4548 Sangat Puas Responden kemungkinan besar berada pada kategori “Sangat Puas”.
Uji Asumsi Proportional Odds

Berikut adalah visualisasi plot probabilitas kumulatif terhadap Usia :

# Prediksi probabilitas
pred_probs <- predict(model, type = "probs")
probs <- as.data.frame(pred_probs)
probs$usia <- data$usia

# Plot probabilitas kumulatif
ggplot(probs, aes(x = usia)) +
  geom_line(aes(y = `Sangat Tidak Puas`, color = "Sangat Tidak Puas")) +
  geom_line(aes(y = `Tidak Puas`, color = "Tidak Puas")) +
  geom_line(aes(y = Puas, color = "Puas")) +
  geom_line(aes(y = `Sangat Puas`, color = "Sangat Puas")) +
  labs(title = "Probabilitas Kumulatif berdasarkan Usia", x = "Usia", y = "Probabilitas") +
  theme_minimal() +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

Berdasarkan grafik probabilitas kumulatif terhadap usia, tampak bahwa garis untuk masing-masing cutoff kategori kepuasan tidak sepenuhnya sejajar. Jarak antar garis berubah-ubah dan kemiringan garis berbeda, terutama antara kategori “Sangat Tidak Puas” dan “Tidak Puas”. Pola ini mengindikasikan bahwa efek usia terhadap log odds untuk berpindah antar kategori kepuasan tidak konsisten. Dengan demikian, visualisasi ini memberi indikasi awal bahwa asumsi proportional odds pada model regresi logistik ordinal kemungkinan tidak sepenuhnya terpenuhi, sehingga perlu dikaji lebih lanjut, salah satunya melalui uji hipotesis.

Untuk memastikan validitas model regresi logistik ordinal yang digunakan, dilakukan uji asumsi proportional odds menggunakan uji Brant. Uji ini bertujuan untuk mengetahui apakah hubungan antara prediktor (usia dan pendapatan) dengan peluang kumulatif dari kategori kepuasan bersifat konsisten di seluruh tingkat kategori.

Hipotesis

\(H_0\): Koefisien prediktor sama untuk semua cutoff (asumsi proportional odds terpenuhi).

\(H_1\): Koefisien prediktor berbeda untuk setidaknya satu cutoff (pelanggaran asumsi).

Kriteria Uji : Terima H0 jika p-value > 0.05

library(brant)
brant(model)
## Warning in matrix(model$zeta, nrow = 1, ncol = J - 1, byrow = T): data length
## [3] is not a sub-multiple or multiple of the number of columns [2]
## -------------------------------------------- 
## Test for X2  df  probability 
## -------------------------------------------- 
## Omnibus      0.8 2   0.67
## usia     0.72    1   0.4
## pendapatan   0.11    1   0.74
## -------------------------------------------- 
## 
## H0: Parallel Regression Assumption holds

Hasil uji Brant menunjukkan bahwa nilai p-value omnibus sebesar 0.67 (> 0.05) yang berarti tidak terdapat pelanggaran asumsi proportional odds secara keseluruhan. Dengan kata lain, model regresi ordinal yang digunakan secara umum memenuhi asumsi penting ini.

Secara spesifik :

  • Untuk variabel usia, nilai p-value sebesar 0.40 menunjukkan bahwa tidak ada pelanggaran asumsi proportional odds pada variabel tersebut.

  • Untuk variabel pendapatan, nilai p-value sebesar 0,74 juga menunjukkan tidak ada pelanggaran asumsi.

Dengan demikian, dapat disimpulkan bahwa model regresi logistik ordinal yang dibangun valid digunakan, karena telah memenuhi asumsi proportional odds.

Goodness of Fit

Kecocokan model dievaluasi untuk memastikan model menjelaskan data dengan baik.

library(DescTools)
PseudoR2(model, which = "Nagelkerke")
## Nagelkerke 
##  0.1131501

Nilai Nagelkerke Pseudo R² sebesar 0,113 menunjukkan bahwa model regresi logistik ordinal mampu menjelaskan sekitar 11,3% variasi dalam tingkat kepuasan pelanggan berdasarkan usia dan pendapatan.

Meskipun nilai ini tidak tinggi, hal tersebut umum dijumpai dalam model regresi untuk data sosial atau perilaku, di mana respons sering kali dipengaruhi oleh banyak faktor lain di luar prediktor yang diamati. Dengan demikian, model ini memberikan informasi yang berguna, tetapi masih terdapat ruang untuk peningkatan akurasi prediksi dengan mempertimbangkan variabel tambahan atau pendekatan model yang lebih kompleks.

CHAPTER 13 : LOG LINEAR MODEL

Analisis data kategorik merupakan pilar penting dalam statistika terapan, mengingat banyak fenomena dunia nyata menghasilkan data dalam bentuk kategori, seperti status kesehatan, preferensi pelanggan, atau klasifikasi demografis seperti jenis kelamin dan tingkat pendidikan. Dalam menganalisis data kategorik, beberapa pendekatan umum digunakan, yaitu tabel kontingensi, model log-linear, dan regresi logistik. Ketiga metode ini memiliki peran berbeda dalam memahami hubungan antar variabel kategorik, dan pemilihan metode tergantung pada tujuan analisis.

Tabel kontingensi adalah alat deskriptif yang menyajikan frekuensi gabungan dari variabel kategorik, memungkinkan peneliti untuk mengidentifikasi pola hubungan awal. Misalnya, dalam studi medis, tabel kontingensi dapat menunjukkan hubungan antara penggunaan obat (misalnya, Timolol vs. Placebo) dan kejadian serangan jantung (Ya vs. Tidak). Namun, tabel kontingensi bersifat statis dan tidak dapat memodelkan interaksi kompleks atau mengendalikan efek variabel lain. Sebaliknya, regresi logistik digunakan ketika ada variabel dependen kategorik yang ingin diprediksi berdasarkan variabel independen, seperti memprediksi peluang penyakit berdasarkan faktor risiko. Pendekatan ini berfokus pada hubungan asimetris, di mana satu variabel dianggap sebagai respons.

Model log-linear, sebagai fokus utama bab ini, menawarkan pendekatan simetris untuk menganalisis data kategorik. Model ini tidak membedakan variabel dependen dan independen, melainkan memodelkan frekuensi sel dalam tabel kontingensi dengan mengasumsikan distribusi Poisson. Dengan demikian, model log-linear sangat cocok untuk mengeksplorasi struktur asosiasi dan interaksi antar variabel, seperti dalam tabel kontingensi tiga arah yang melibatkan jenis kelamin, status merokok, dan penyakit paru. Model ini memungkinkan peneliti untuk menguji apakah hubungan antar variabel dapat dijelaskan oleh efek utama, interaksi dua arah, atau memerlukan interaksi tiga arah. Pendekatan ini sangat berguna dalam analisis eksploratori yang bertujuan memahami hubungan kompleks tanpa asumsi arah kausalitas.

Untuk memperjelas perbedaan ketiga pendekatan ini, berikut adalah tabel perbandingan antara tabel kontingensi, model log-linear, dan regresi logistik untuk memperjelas perbedaan dalam tujuan, sifat, dan aplikasi:

Aspek Tabel Kontingensi Model Log-Linear Regresi Logistik
Tujuan Menyajikan frekuensi dan mengidentifikasi pola hubungan awal. Mengeksplorasi struktur asosiasi dan interaksi antar variabel kategorik. Memprediksi probabilitas variabel dependen berdasarkan variabel independen.
Sifat Deskriptif Eksploratori dan pemodelan Prediktif
Variabel Tidak membedakan dependen/independen Tidak membedakan dependen/independen Memisahkan variabel dependen dan independen
Asumsi Distribusi Tidak ada asumsi distribusi Distribusi Poisson untuk frekuensi sel Distribusi Binomial untuk variabel respons
Kegunaan Utama Visualisasi data, uji independensi (chi-square). Memodelkan interaksi kompleks dalam tabel kontingensi. Memodelkan peluang kejadian berdasarkan prediktor.
Contoh Aplikasi Menampilkan hubungan antara obat dan penyakit. Menganalisis interaksi antara jenis kelamin, merokok, dan penyakit. Memprediksi peluang penyakit berdasarkan usia dan merokok.

13.1. Dasar Teori Model Log-Linear

Model log-linear adalah bagian dari keluarga Generalized Linear Model (GLM) yang dirancang untuk memodelkan frekuensi sel dalam tabel kontingensi. Model ini mengasumsikan bahwa frekuensi sel mengikuti distribusi Poisson, dan logaritma dari frekuensi yang diharapkan dimodelkan sebagai kombinasi linier dari efek utama dan interaksi antar variabel.

Secara matematis, untuk tabel kontingensi dua arah dengan variabel \(A\) (baris) dan \(B\) (kolom), model log-linear dapat ditulis sebagai:

\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]

  • \(\mu_{ij}\): Frekuensi yang diharapkan pada sel \((i,j)\).
  • \(\lambda\): Intersep atau efek keseluruhan.
  • \(\lambda_i^A\): Efek utama dari level \(i\) variabel \(A\).
  • \(\lambda_j^B\): Efek utama dari level \(j\) variabel \(B\).
  • \(\lambda_{ij}^{AB}\): Efek interaksi antara level \(i\) variabel \(A\) dan level \(j\) variabel \(B\).

Model ini menggambarkan hubungan antara dua variabel, dengan \(\lambda_{ij}^{AB}\) menunjukkan apakah ada asosiasi antara \(A\) dan \(B\). Jika \(\lambda_{ij}^{AB} = 0\), maka variabel \(A\) dan \(B\) dianggap independen.

Untuk tabel kontingensi dengan lebih dari dua variabel, model log-linear dapat diperluas untuk mencakup interaksi tingkat tinggi, seperti interaksi tiga arah atau lebih. Contohnya pada tabel kontingensi tiga arah dengan variabel \(A\), \(B\), dan \(C\), model log-linear yang lengkap (termasuk semua efek utama dan interaksi) ditulis sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]

  • \(\mu_{ijk}\): Frekuensi yang diharapkan pada sel \((i,j,k)\).
  • \(\lambda\): Intersep atau efek keseluruhan.
  • \(\lambda_i^A\): Efek utama dari level \(i\) variabel \(A\).
  • \(\lambda_j^B\): Efek utama dari level \(j\) variabel \(B\).
  • \(\lambda_k^C\): Efek utama dari level \(k\) variabel \(C\).
  • \(\lambda_{ij}^{AB}\): Efek interaksi dua arah antara level \(i\) variabel \(A\) dan level \(j\) variabel \(B\).
  • \(\lambda_{ik}^{AC}\): Efek interaksi dua arah antara level \(i\) variabel \(A\) dan level \(k\) variabel \(C\).
  • \(\lambda_{jk}^{BC}\): Efek interaksi dua arah antara level \(j\) variabel \(B\) dan level \(k\) variabel \(C\).
  • \(\lambda_{ijk}^{ABC}\): Efek interaksi tiga arah antara level \(i\) variabel \(A\), level \(j\) variabel \(B\), dan level \(k\) variabel \(C\).

Interaksi tiga arah \(\lambda_{ijk}^{ABC}\) menunjukkan apakah hubungan antara dua variabel (misalnya, \(A\) dan \(B\)) dipengaruhi oleh level variabel ketiga (\(C\)). Jika \(\lambda_{ijk}^{ABC} = 0\), maka model dapat disederhanakan dengan hanya memasukkan interaksi dua arah atau efek utama, tergantung pada kecocokan model.

Tujuan utama model log-linear adalah menemukan model paling sederhana yang cukup menjelaskan struktur data, menggunakan metode seperti likelihood ratio test (LRT) untuk membandingkan model dengan berbagai tingkat interaksi.

13.2. Aplikasi Model Log-Linear

Model log-linear sangat berguna dalam berbagai bidang, seperti sosiologi, epidemiologi, dan pemasaran, untuk menganalisis hubungan antar variabel kategorik. Beberapa aplikasi utama meliputi:

  • Analisis Asosiasi: Mengidentifikasi apakah variabel kategorik saling berhubungan, misalnya hubungan antara jenis kelamin, status merokok, dan penyakit paru.
  • Pemodelan Interaksi: Menentukan apakah interaksi dua arah atau tiga arah diperlukan untuk menjelaskan data.
  • Uji Independensi: Menguji apakah variabel-variabel dalam tabel kontingensi independen atau memiliki asosiasi.

Contoh kasus: Dalam studi kesehatan, peneliti ingin menganalisis hubungan antara jenis kelamin (pria/wanita), status merokok (merokok/tidak merokok), dan kejadian penyakit paru (ya/tidak). Model log-linear dapat digunakan untuk menguji apakah ada interaksi tiga arah antara ketiga variabel ini atau apakah model dengan interaksi dua arah sudah cukup.

13.3. Jenis-Jenis Model Log-Linear

Jenis model log-linear yang sering digunakan dalam analisis data kategorik ada dua, yaitu model saturated dan model independent. Model saturated mencakup semua efek dan interaksi yang mungkin, memberikan kecocokan sempurna dengan data, sedangkan model independent mengasumsikan tidak adanya asosiasi antar variabel, sehingga menjadi model paling sederhana. Kedua model ini penting untuk memahami rentang kemungkinan dalam pemodelan log-linear dan sering digunakan sebagai titik acuan dalam analisis. Berikut adalah penjelasan rinci tentang kedua jenis model ini.

13.3.1. Model Saturated

Model saturated (jenuh) adalah model log-linear yang mencakup semua efek utama dan semua interaksi yang mungkin dalam tabel kontingensi, sehingga model ini secara sempurna menyesuaikan frekuensi yang diamati (\(\mu_{ijk} = n_{ijk}\), di mana \(n_{ijk}\) adalah frekuensi yang diamati). Dengan kata lain, model saturated tidak memiliki degrees of freedom (df = 0) karena jumlah parameter yang digunakan sama dengan jumlah sel dalam tabel kontingensi. Untuk tabel kontingensi tiga arah dengan variabel \(A\), \(B\), dan \(C\), model saturated ditulis sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]

Karakteristik Model Saturated:

  • Kecocokan Sempurna: Karena model ini memasukkan semua efek dan interaksi, frekuensi yang diprediksi akan sama persis dengan frekuensi yang diamati, sehingga deviance (G²) = 0.

  • Jumlah Parameter: Jumlah parameter dalam model saturated sama dengan jumlah sel dalam tabel kontingensi. Misalnya, untuk tabel 2x2x2 (masing-masing variabel memiliki dua level), ada \(2 \times 2 \times 2 = 8\) sel, sehingga model saturated memiliki 8 parameter.

  • Kegunaan: Model saturated jarang digunakan untuk interpretasi karena terlalu kompleks dan tidak memberikan penghematan parameter (parsimony). Namun, model ini berguna sebagai baseline untuk membandingkan model yang lebih sederhana (misalnya, model dengan interaksi dua arah atau independensi) menggunakan uji seperti likelihood ratio test (LRT).

  • Keterbatasan: Karena model saturated menyesuaikan data secara sempurna, ia tidak memberikan wawasan tambahan tentang struktur asosiasi antar variabel dan cenderung overfit.

13.3.2. Model Independent

Model independent (independen) adalah model log-linear yang mengasumsikan bahwa semua variabel dalam tabel kontingensi saling independen, sehingga tidak ada interaksi antar variabel. Dalam model ini, frekuensi yang diharapkan untuk setiap sel dihitung berdasarkan efek utama dari masing-masing variabel saja, tanpa memasukkan efek interaksi. Untuk tabel kontingensi tiga arah dengan variabel \(A\), \(B\), dan \(C\), model independent ditulis sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C \]

  • \(\mu_{ijk}\): Frekuensi yang diharapkan pada sel \((i,j,k)\).
  • \(\lambda\): Intersep atau efek keseluruhan.
  • \(\lambda_i^A\): Efek utama dari level \(i\) variabel \(A\).
  • \(\lambda_j^B\): Efek utama dari level \(j\) variabel \(B\).
  • \(\lambda_k^C\): Efek utama dari level \(k\) variabel \(C\).

Karakteristik Model Independent:

  • Asumsi Independensi: Model ini mengasumsikan bahwa variabel \(A\), \(B\), dan \(C\) tidak memiliki asosiasi, sehingga frekuensi yang diharapkan dihitung sebagai produk dari probabilitas marginal masing-masing variabel.

  • Kesederhanaan: Model independent adalah model paling sederhana dalam log-linear, dengan jumlah parameter yang minimal, hanya mencakup efek utama. Untuk tabel 2x2x2, jumlah parameter adalah \(1 + (2-1) + (2-1) + (2-1) = 4\) (satu intersep dan satu parameter untuk setiap variabel setelah penyesuaian untuk constraint \(\sum \lambda_i^A = \sum \lambda_j^B = \sum \lambda_k^C = 0\)).

  • Kegunaan: Model ini digunakan untuk menguji hipotesis bahwa semua variabel independen. Jika model ini tidak cocok dengan data (ditunjukkan oleh deviance yang besar dan signifikan), maka ada bukti adanya asosiasi antar variabel.

  • Keterbatasan: Model independent sering kali terlalu sederhana untuk menjelaskan data dunia nyata, terutama jika ada interaksi antar variabel. Deviance yang besar menunjukkan bahwa model ini tidak cukup menjelaskan struktur data.

13.4. Estimasi Parameter

Estimasi parameter dalam model log-linear bertujuan untuk menentukan nilai parameter (\(\lambda\), \(\lambda_i^A\), \(\lambda_j^B\), \(\lambda_k^C\), \(\lambda_{ij}^{AB}\), dll.) yang meminimalkan perbedaan antara frekuensi yang diamati (\(n_{ijk}\)) dan frekuensi yang diharapkan (\(\mu_{ijk}\)). Proses ini biasanya dilakukan menggunakan Maximum Likelihood Estimation (MLE), yang memaksimalkan fungsi likelihood berdasarkan distribusi Poisson. Dalam praktiknya, estimasi parameter sering menggunakan algoritma Iterative Proportional Fitting (IPF), yang menyesuaikan frekuensi yang diharapkan agar sesuai dengan margin tabel kontingensi sambil memenuhi struktur model.

13.4.1. Proses Estimasi Parameter

Untuk model log-linear tiga arah, seperti model saturated:

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]

Parameter diestimasi dengan memenuhi pembatasan sum-to-zero untuk memastikan identifikasi model:

- Efek utama: \(\sum_i \lambda_i^A = 0\), \(\sum_j \lambda_j^B = 0\), \(\sum_k \lambda_k^C = 0\).

- Interaksi dua arah: \(\sum_i \lambda_{ij}^{AB} = \sum_j \lambda_{ij}^{AB} = 0\), dan serupa untuk \(\lambda_{ik}^{AC}\) dan \(\lambda_{jk}^{BC}\).

- Interaksi tiga arah: \(\sum_i \lambda_{ijk}^{ABC} = \sum_j \lambda_{ijk}^{ABC} = \sum_k \lambda_{ijk}^{ABC} = 0\).

Pembatasan ini memastikan bahwa parameter memiliki interpretasi relatif terhadap rata-rata atau baseline. IPF bekerja secara iteratif untuk menghasilkan frekuensi yang diharapkan (\(\mu_{ijk}\)) yang konsisten dengan margin tabel (misalnya, total baris, kolom, atau lapisan) dan struktur model. Dalam model saturated, IPF menghasilkan \(\mu_{ijk} = n_{ijk}\), karena semua efek dan interaksi dimasukkan, memberikan kecocokan sempurna.

13.4.2. Interpretasi Parameter

Berikut adalah interpretasi untuk parameter dalam model log linear :

  • Intersep (\(\lambda\)): Mewakili logaritma frekuensi dasar rata-rata, yang mencerminkan skala keseluruhan dari data.

  • Efek Utama (\(\lambda_i^A\), \(\lambda_j^B\), \(\lambda_k^C\)): Menunjukkan kontribusi relatif dari setiap level variabel terhadap frekuensi yang diharapkan. Misalnya, \(\lambda_1^A\) positif untuk “Pria” menunjukkan bahwa kategori “Pria” memiliki frekuensi yang lebih tinggi dibandingkan baseline (setelah constraint).

  • Interaksi Dua Arah (\(\lambda_{ij}^{AB}\), \(\lambda_{ik}^{AC}\), \(\lambda_{jk}^{BC}\)): Mengukur asosiasi antara dua variabel. Nilai \(\lambda_{ij}^{AB} > 0\) menunjukkan bahwa kombinasi level \(i\) dari \(A\) dan \(j\) dari \(B\) memiliki frekuensi yang lebih tinggi dari yang diharapkan jika variabel independen.

  • Interaksi Tiga Arah (\(\lambda_{ijk}^{ABC}\)): Menunjukkan apakah asosiasi antara dua variabel (misalnya, \(A\) dan \(B\)) bervariasi tergantung pada level variabel ketiga (\(C\)). Nilai \(\lambda_{ijk}^{ABC} \neq 0\) mengindikasikan adanya interaksi tiga arah yang kompleks.

13.4.3. Interpretasi Odds Ratio

Dalam model log-linear, parameter interaksi dua arah dapat digunakan untuk menghitung odds ratio, yang mengukur kekuatan asosiasi antara dua variabel. Untuk tabel kontingensi 2x2 dengan variabel \(A\) (baris) dan \(B\) (kolom), odds ratio dapat dihitung dari parameter interaksi \(\lambda_{ij}^{AB}\). Misalnya, untuk tabel 2x2:

\[ \text{Odds Ratio} = \exp(4 \cdot \lambda_{11}^{AB}) \]

Ini berasal dari perbandingan log frekuensi yang diharapkan untuk kombinasi kategori tertentu. Untuk tabel tiga arah, odds ratio dapat dihitung untuk pasangan variabel tertentu dengan mengkondisikan pada level variabel ketiga. Misalnya, untuk variabel JenisKelamin dan Merokok pada level tertentu dari Penyakit:

\[ \text{Odds Ratio}_{AB|C=k} = \exp(4 \cdot \lambda_{ij}^{AB}) \]

- Jika \(\text{Odds Ratio} = 1\) (atau \(\lambda_{ij}^{AB} = 0\)), maka tidak ada asosiasi antara variabel \(A\) dan \(B\).

- Jika \(\text{Odds Ratio} > 1\), maka ada asosiasi positif, artinya kombinasi kategori tertentu lebih mungkin terjadi.

- Jika \(\text{Odds Ratio} < 1\), maka ada asosiasi negatif, artinya kombinasi kategori tertentu kurang mungkin terjadi.

13.5. Perbandingan Model

Perbandingan model dalam analisis log-linear bertujuan untuk menemukan model yang paling sesuai dengan data, dengan menyeimbangkan kecocokan (goodness-of-fit) dan parsimoni (kesederhanaan). Model log-linear yang berbeda (misalnya, independen, dua arah, atau saturated) memiliki jumlah parameter dan degrees of freedom yang berbeda, sehingga perbandingan dilakukan menggunakan metode statistik seperti Likelihood Ratio Test (LRT).

Likelihood Ratio Test (LRT):

Likelihood Ratio Test (LRT) adalah metode utama untuk membandingkan dua model log-linear yang bersarang (nested), yaitu model yang lebih sederhana merupakan subset dari model yang lebih kompleks. LRT menguji apakah penambahan parameter (misalnya, interaksi dua arah atau tiga arah) secara signifikan meningkatkan kecocokan model dengan data.

Hipotesis:

H₀ : Model yang lebih sederhana cukup untuk menjelaskan data, artinya parameter tambahan dalam model yang lebih kompleks sama dengan nol.

H₁ : Model yang lebih kompleks lebih cocok, artinya setidaknya salah satu parameter tambahan tidak sama dengan nol.

Statistik Uji:

Statistik LRT dihitung sebagai perbedaan deviance antara model yang lebih sederhana dan model yang lebih kompleks: \[ \Delta G^2 = G^2_{\text{sederhana}} - G^2_{\text{kompleks}} \] Di mana deviance untuk setiap model adalah: \[ G^2 = 2 \sum_{ijk} n_{ijk} \log\left(\frac{n_{ijk}}{\hat{\mu}_{ijk}}\right) \] dengan \(n_{ijk}\) adalah frekuensi yang diamati dan \(\hat{\mu}_{ijk}\) adalah frekuensi yang diharapkan.

Statistik \(\Delta G^2\) mengikuti distribusi chi-square (\(\chi^2\)) dengan degrees of freedom: \[ \Delta \text{df} = \text{df}_{\text{sederhana}} - \text{df}_{\text{kompleks}} \]Keputusan Uji:

Hitung p-value dari \(\Delta G^2\) berdasarkan distribusi \(\chi^2\) dengan \(\Delta \text{df}\).

  • Jika p-value < \(\alpha\) (misalnya, 0.05), tolak H₀ dan simpulkan bahwa model yang lebih kompleks lebih cocok.

  • Jika p-value \(\geq \alpha\), gagal tolak H₀, menunjukkan bahwa model yang lebih sederhana cukup.

13.6. Studi Kasus

Sebuah rumah sakit di kota besar melakukan studi untuk memahami faktor risiko penyakit jantung pada pasiennya. Peneliti mengumpulkan data dari 350 pasien, mencatat tiga variabel utama: usia (Muda: <40 tahun, Tua: ≥40 tahun), status merokok (Merokok, Tidak Merokok), dan penyakit jantung (Ada, Tidak Ada). Peneliti menduga bahwa pasien yang lebih tua dan perokok memiliki risiko lebih tinggi terkena penyakit jantung, tetapi mereka juga ingin mengeksplorasi apakah hubungan antara merokok dan penyakit jantung bervariasi berdasarkan kelompok usia. Dengan menggunakan model log-linear, peneliti akan menguji berbagai model (independen, dua arah, dan saturated) untuk menemukan model yang paling sesuai dengan data.

Penjelasan Data dan Variabel

Data terdiri dari tiga variabel kategorik :

Usia

  • Muda (<40 tahun)

  • Tua (≥40 tahun) -

Status Merokok:

  • Merokok

  • Tidak Merokok

Penyakit Jantung:

  • Ada

  • Tidak Ada

Tabel kontingensi tiga arah dibuat untuk menyajikan frekuensi pasien berdasarkan kombinasi kategori usia, status merokok, dan penyakit jantung. Data fiktif dibuat untuk merepresentasikan hasil pengamatan dari 350 pasien.

# Membuat data fiktif
data <- expand.grid(Usia = c("Muda", "Tua"),
                    Merokok = c("Merokok", "Tidak_Merokok"),
                    Penyakit_Jantung = c("Ada", "Tidak_Ada"))
data$Frekuensi <- c(10, 30, 20, 70, 25, 35, 60, 100)

# Mengonversi ke tabel kontingensi
table_data <- xtabs(Frekuensi ~ Usia + Merokok + Penyakit_Jantung, data = data)
print(table_data)
## , , Penyakit_Jantung = Ada
## 
##       Merokok
## Usia   Merokok Tidak_Merokok
##   Muda      10            20
##   Tua       30            70
## 
## , , Penyakit_Jantung = Tidak_Ada
## 
##       Merokok
## Usia   Merokok Tidak_Merokok
##   Muda      25            60
##   Tua       35           100

Tabel kontingensi tiga arah menunjukkan frekuensi pasien untuk setiap kombinasi kategori. Misalnya, ada 10 pasien muda yang merokok dan memiliki penyakit jantung, serta 100 pasien tua yang tidak merokok dan tidak memiliki penyakit jantung.

Statistika Deskriptif

Sebelum melakukan pemodelan log-linear, tabel kontingensi divisualisasikan untuk memberikan gambaran awal tentang hubungan antar variabel :

# Menampilkan tabel kontingensi per lapisan Penyakit Jantung
ftable(table_data, row.vars = "Usia", col.vars = c("Merokok", "Penyakit_Jantung"))
##      Merokok          Merokok           Tidak_Merokok          
##      Penyakit_Jantung     Ada Tidak_Ada           Ada Tidak_Ada
## Usia                                                           
## Muda                       10        25            20        60
## Tua                        30        35            70       100

Tabel ini menunjukkan distribusi frekuensi untuk Usia dan Merokok pada setiap level Penyakit Jantung. Dari tabel, terlihat bahwa pasien tua yang merokok cenderung memiliki frekuensi lebih tinggi untuk Penyakit Jantung = Ada dibandingkan pasien muda yang merokok, menunjukkan kemungkinan adanya asosiasi.

Estimasi Model Log-Linear

Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) dengan algoritma Iterative Proportional Fitting (IPF) dan pembatasan sum-to-zero. Tiga model log-linear diestimasi untuk data ini:

  1. Model Independen: Hanya memasukkan efek utama

    \(\log(\mu_{ijk}) = \lambda + \lambda_i^{\text{Usia}} + \lambda_j^{\text{Merokok}} + \lambda_k^{\text{Penyakit}}\)

    library(MASS)
    model_indep <- loglm(~ Usia + Merokok + Penyakit_Jantung, data = table_data)
    summary(model_indep)
    ## Formula:
    ## ~Usia + Merokok + Penyakit_Jantung
    ## attr(,"variables")
    ## list(Usia, Merokok, Penyakit_Jantung)
    ## attr(,"factors")
    ##                  Usia Merokok Penyakit_Jantung
    ## Usia                1       0                0
    ## Merokok             0       1                0
    ## Penyakit_Jantung    0       0                1
    ## attr(,"term.labels")
    ## [1] "Usia"             "Merokok"          "Penyakit_Jantung"
    ## attr(,"order")
    ## [1] 1 1 1
    ## attr(,"intercept")
    ## [1] 1
    ## attr(,"response")
    ## [1] 0
    ## attr(,".Environment")
    ## <environment: R_GlobalEnv>
    ## 
    ## Statistics:
    ##                        X^2 df   P(> X^2)
    ## Likelihood Ratio 10.162971  4 0.03777013
    ## Pearson           9.773568  4 0.04441961
  2. Model Dua Arah: Memasukkan semua interaksi dua arah

    \(\log(\mu_{ijk}) = \lambda + \lambda_i^{\text{Usia}} + \lambda_j^{\text{Merokok}} + \lambda_k^{\text{Penyakit}} + \lambda_{ij}^{\text{Usia:Merokok}} + \lambda_{ik}^{\text{Usia:Penyakit}} + \lambda_{jk}^{\text{Merokok:Penyakit}}\)

    model_two_way <- loglm(~ Usia*Merokok + Usia*Penyakit_Jantung + Merokok*Penyakit_Jantung, data = table_data)
    summary(model_two_way)
    ## Formula:
    ## ~Usia * Merokok + Usia * Penyakit_Jantung + Merokok * Penyakit_Jantung
    ## attr(,"variables")
    ## list(Usia, Merokok, Penyakit_Jantung)
    ## attr(,"factors")
    ##                  Usia Merokok Penyakit_Jantung Usia:Merokok
    ## Usia                1       0                0            1
    ## Merokok             0       1                0            1
    ## Penyakit_Jantung    0       0                1            0
    ##                  Usia:Penyakit_Jantung Merokok:Penyakit_Jantung
    ## Usia                                 1                        0
    ## Merokok                              0                        1
    ## Penyakit_Jantung                     1                        1
    ## attr(,"term.labels")
    ## [1] "Usia"                     "Merokok"                 
    ## [3] "Penyakit_Jantung"         "Usia:Merokok"            
    ## [5] "Usia:Penyakit_Jantung"    "Merokok:Penyakit_Jantung"
    ## attr(,"order")
    ## [1] 1 1 1 2 2 2
    ## attr(,"intercept")
    ## [1] 1
    ## attr(,"response")
    ## [1] 0
    ## attr(,".Environment")
    ## <environment: R_GlobalEnv>
    ## 
    ## Statistics:
    ##                          X^2 df  P(> X^2)
    ## Likelihood Ratio 0.001394363  1 0.9702130
    ## Pearson          0.001393728  1 0.9702198
  3. Model Saturated: Memasukkan semua efek dan interaksi, termasuk interaksi tiga arah

    \(\log(\mu_{ijk}) = \lambda + \lambda_i^{\text{Usia}} + \lambda_j^{\text{Merokok}} + \lambda_k^{\text{Penyakit}} + \lambda_{ij}^{\text{Usia:Merokok}} + \lambda_{ik}^{\text{Usia:Penyakit}} + \lambda_{jk}^{\text{Merokok:Penyakit}} + \lambda_{ijk}^{\text{Usia:Merokok:Penyakit}}\)

    library(MASS)
    model_saturated <- loglm(~ Usia*Merokok*Penyakit_Jantung, data = table_data)
    summary(model_saturated)
    ## Formula:
    ## ~Usia * Merokok * Penyakit_Jantung
    ## attr(,"variables")
    ## list(Usia, Merokok, Penyakit_Jantung)
    ## attr(,"factors")
    ##                  Usia Merokok Penyakit_Jantung Usia:Merokok
    ## Usia                1       0                0            1
    ## Merokok             0       1                0            1
    ## Penyakit_Jantung    0       0                1            0
    ##                  Usia:Penyakit_Jantung Merokok:Penyakit_Jantung
    ## Usia                                 1                        0
    ## Merokok                              0                        1
    ## Penyakit_Jantung                     1                        1
    ##                  Usia:Merokok:Penyakit_Jantung
    ## Usia                                         1
    ## Merokok                                      1
    ## Penyakit_Jantung                             1
    ## attr(,"term.labels")
    ## [1] "Usia"                          "Merokok"                      
    ## [3] "Penyakit_Jantung"              "Usia:Merokok"                 
    ## [5] "Usia:Penyakit_Jantung"         "Merokok:Penyakit_Jantung"     
    ## [7] "Usia:Merokok:Penyakit_Jantung"
    ## attr(,"order")
    ## [1] 1 1 1 2 2 2 3
    ## attr(,"intercept")
    ## [1] 1
    ## attr(,"response")
    ## [1] 0
    ## attr(,".Environment")
    ## <environment: R_GlobalEnv>
    ## 
    ## Statistics:
    ##                  X^2 df P(> X^2)
    ## Likelihood Ratio   0  0        1
    ## Pearson            0  0        1
Perbandingan Model

Untuk menentukan model log-linear yang paling sesuai dengan data, dilakukan perbandingan tiga model hierarkis menggunakan Uji Likelihood Ratio Test (LRT). Uji dilakukan pada taraf signifikansi \(\alpha = 0.05\).

UJI LRT 1 : MODEL INDEPENDEN vs MODEL DUA ARAH

Hipotesis

\(H_0\): Model Independen cocok dengan data (tidak perlu interaksi dua arah)

\(H_1\): Model Dua Arah lebih cocok (interaksi dua arah diperlukan)

Statistik Uji

anova(model_indep, model_two_way)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  ~Usia + Merokok + Penyakit_Jantung 
## Model 2:
##  ~Usia * Merokok + Usia * Penyakit_Jantung + Merokok * Penyakit_Jantung 
## 
##               Deviance df   Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   10.162971264  4                                      
## Model 2    0.001394363  1 10.161576900         3        0.01724
## Saturated  0.000000000  0  0.001394363         1        0.97021

Diperoleh pvalue = 0.01724

Kriteria Uji

Tolak H0 jika pvalue < \(\alpha = 0.05\)

Kesimpulan

Penambahan interaksi dua arah secara signifikan meningkatkan kecocokan model. Artinya, Model Dua Arah lebih baik dibandingkan Model Independen.

UJI LRT 2 : MODEL DUA ARAH vs MODEL SATURASI

Hipotesis

\(H_0\): Model Dua Arah sudah cukup (tidak perlu interaksi tiga arah)

\(H_1\): Model Saturasi lebih baik (interaksi tiga arah diperlukan)

Statistik Uji

anova(model_two_way, model_saturated)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  ~Usia * Merokok + Usia * Penyakit_Jantung + Merokok * Penyakit_Jantung 
## Model 2:
##  ~Usia * Merokok * Penyakit_Jantung 
## 
##              Deviance df  Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   0.001394363  1                                     
## Model 2   0.000000000  0 0.001394363         1        0.97021
## Saturated 0.000000000  0 0.000000000         0        1.00000

Diperoleh pvalue = 0.97021

Kriteria Uji

Tolak H0 jika pvalue < \(\alpha = 0.05\)

Kesimpulan

Penambahan interaksi tiga arah tidak memberikan peningkatan kecocokan model yang signifikan. Artinya, Model Dua Arah sudah cukup, tidak perlu menggunakan model saturasi.

Interpretasi Parameter
# Ekstrak parameter dari model dua arah
params <- coef(model_two_way)
print(params)
## $`(Intercept)`
## [1] 3.552939
## 
## $Usia
##       Muda        Tua 
## -0.3996075  0.3996075 
## 
## $Merokok
##       Merokok Tidak_Merokok 
##    -0.4324967     0.4324967 
## 
## $Penyakit_Jantung
##       Ada Tidak_Ada 
## -0.315411  0.315411 
## 
## $Usia.Merokok
##       Merokok
## Usia       Merokok Tidak_Merokok
##   Muda  0.04193322   -0.04193322
##   Tua  -0.04193322    0.04193322
## 
## $Usia.Penyakit_Jantung
##       Penyakit_Jantung
## Usia         Ada Tidak_Ada
##   Muda -0.187053  0.187053
##   Tua   0.187053 -0.187053
## 
## $Merokok.Penyakit_Jantung
##                Penyakit_Jantung
## Merokok                 Ada   Tidak_Ada
##   Merokok        0.04914159 -0.04914159
##   Tidak_Merokok -0.04914159  0.04914159

Efek Utama

Efek utama mencerminkan kontribusi relatif setiap level variabel terhadap log-frekuensi yang diharapkan, setelah mengendalikan variabel lain.

  1. Intersep (\(\lambda = 3.552939\))
    • Intersep adalah logaritma frekuensi rata-rata di seluruh tabel kontingensi, mewakili skala dasar data. Nilai \(\exp(3.552939) \approx 34.95\) menunjukkan frekuensi rata-rata per sel jika semua variabel pada level referensi.
  2. Usia (\(\lambda_i^{\text{Usia}}\))
    • Muda: \(\lambda_1^{\text{Usia}} = -0.3996075\). Nilai negatif menunjukkan bahwa pasien muda memiliki frekuensi lebih rendah dibandingkan rata-rata (\(\exp(-0.3996075) \approx 0.671\), frekuensi 67.1% dari rata-rata).
    • Tua: \(\lambda_2^{\text{Usia}} = 0.3996075\). Nilai positif menunjukkan bahwa pasien tua memiliki frekuensi lebih tinggi (\(\exp(0.3996075) \approx 1.491\), frekuensi 149.1% dari rata-rata).
    • Interpretasi: Pasien tua lebih sering muncul dalam data dibandingkan pasien muda, mungkin karena populasi rumah sakit didominasi oleh pasien yang lebih tua.
  3. Merokok (\(\lambda_j^{\text{Merokok}}\))
    • Merokok: \(\lambda_1^{\text{Merokok}} = -0.4324967\). Nilai negatif menunjukkan frekuensi perokok lebih rendah (\(\exp(-0.4324967) \approx 0.649\), 64.9% dari rata-rata).
    • Tidak Merokok: \(\lambda_2^{\text{Merokok}} = 0.4324967\). Nilai positif menunjukkan frekuensi tidak merokok lebih tinggi (\(\exp(0.4324967) \approx 1.541\), 154.1% dari rata-rata).
    • Interpretasi: Pasien yang tidak merokok lebih umum dalam data, mungkin mencerminkan tren penurunan merokok di populasi.
  4. Penyakit Jantung (\(\lambda_k^{\text{Penyakit}}\))
    • Ada: \(\lambda_1^{\text{Penyakit}} = -0.315411\). Nilai negatif menunjukkan frekuensi penyakit jantung lebih rendah (\(\exp(-0.315411) \approx 0.729\), 72.9% dari rata-rata).
    • Tidak Ada: \(\lambda_2^{\text{Penyakit}} = 0.315411\). Nilai positif menunjukkan frekuensi tidak ada penyakit lebih tinggi (\(\exp(0.315411) \approx 1.371\), 137.1% dari rata-rata).
    • Interpretasi: Lebih banyak pasien yang tidak memiliki penyakit jantung, konsisten dengan fakta bahwa penyakit jantung adalah kondisi spesifik yang tidak dialami semua pasien.

Interaksi Dua Arah

Interaksi dua arah mengukur asosiasi antara dua variabel, setelah mengendalikan efek utama dan interaksi lain.

  1. Usia:Merokok (\(\lambda_{ij}^{\text{Usia:Merokok}}\)):
    • Muda, Merokok: \(\lambda_{11}^{\text{Usia:Merokok}} = 0.04193322\). Nilai positif kecil menunjukkan bahwa kombinasi pasien muda yang merokok sedikit lebih sering terjadi dari yang diharapkan jika usia dan merokok independen (\(\exp(0.04193322) \approx 1.043\), 104.3% dari frekuensi yang diharapkan).
    • Tua, Tidak Merokok: \(\lambda_{22}^{\text{Usia:Merokok}} = 0.04193322\). Kombinasi ini juga sedikit lebih sering (\(\exp(0.04193322) \approx 1.043\)).
    • Muda, Tidak Merokok dan Tua, Merokok: Nilai negatif (\(-0.04193322\)) menunjukkan kombinasi ini lebih jarang (\(\exp(-0.04193322) \approx 0.959\), 95.9% dari yang diharapkan).
    • Interpretasi: Asosiasi antara usia dan status merokok lemah. Pasien muda cenderung sedikit lebih sering merokok, dan pasien tua cenderung sedikit lebih sering tidak merokok, tetapi efek ini sangat kecil.
  2. Usia:Penyakit_Jantung (\(\lambda_{ik}^{\text{Usia:Penyakit}}\)):
    • Tua, Ada: \(\lambda_{21}^{\text{Usia:Penyakit}} = 0.187053\). Nilai positif menunjukkan bahwa pasien tua dengan penyakit jantung lebih sering terjadi (\(\exp(0.187053) \approx 1.206\), 120.6% dari yang diharapkan).
    • Muda, Tidak Ada: \(\lambda_{12}^{\text{Usia:Penyakit}} = 0.187053\). Kombinasi ini juga lebih sering (\(\exp(0.187053) \approx 1.206\)).
    • Muda, Ada dan Tua, Tidak Ada: Nilai negatif (\(-0.187053\)) menunjukkan kombinasi ini lebih jarang (\(\exp(-0.187053) \approx 0.829\), 82.9% dari yang diharapkan).
    • Interpretasi: Ada asosiasi moderat antara usia dan penyakit jantung. Pasien tua lebih mungkin memiliki penyakit jantung, sedangkan pasien muda lebih mungkin tidak memiliki penyakit jantung.
  3. Merokok:Penyakit_Jantung (\(\lambda_{jk}^{\text{Merokok:Penyakit}}\)):
    • Merokok, Ada: \(\lambda_{11}^{\text{Merokok:Penyakit}} = 0.04914159\). Nilai positif kecil menunjukkan bahwa perokok dengan penyakit jantung sedikit lebih sering (\(\exp(0.04914159) \approx 1.050\), 105.0% dari yang diharapkan).
    • Tidak Merokok, Tidak Ada: \(\lambda_{22}^{\text{Merokok:Penyakit}} = 0.04914159\). Kombinasi ini juga sedikit lebih sering (\(\exp(0.04914159) \approx 1.050\)).
    • Merokok, Tidak Ada dan Tidak Merokok, Ada: Nilai negatif (\(-0.04914159\)) menunjukkan kombinasi ini lebih jarang (\(\exp(-0.04914159) \approx 0.952\), 95.2% dari yang diharapkan).
    • Interpretasi: Asosiasi antara merokok dan penyakit jantung juga lemah. Perokok sedikit lebih mungkin memiliki penyakit jantung, tetapi efeknya tidak kuat.
Interpretasi Odds Ratio

Log-odds ratio dihitung untuk mengukur kekuatan asosiasi antara Merokok:Penyakit_Jantung dan Usia:Penyakit_Jantung, menggunakan parameter interaksi. Untuk tabel 2x2, log-odds ratio diberikan oleh:

\[ \log(\text{OR}) = 4 \cdot \lambda_{11} \]

# Log-odds ratio untuk Merokok:Penyakit_Jantung
lambda_merokok_penyakit <- params$Merokok.Penyakit_Jantung["Merokok", "Ada"]
logOR_merokok <- 4 * lambda_merokok_penyakit
odds_ratio_merokok <- exp(logOR_merokok)
cat("Log-Odds Ratio (Merokok:Penyakit_Jantung):", logOR_merokok, "\n")
## Log-Odds Ratio (Merokok:Penyakit_Jantung): 0.1965663
cat("Odds Ratio (Merokok:Penyakit_Jantung):", odds_ratio_merokok, "\n")
## Odds Ratio (Merokok:Penyakit_Jantung): 1.217216

Untuk Merokok:Penyakit_Jantung, log-odds ratio = \(4 \cdot 0.04914159 \approx 0.1966\).

Odds ratio = \(\exp(0.1966) \approx 1.217\). Ini menunjukkan bahwa peluang seseorang yang merokok memiliki penyakit jantung adalah 1.217 kali lebih tinggi dibandingkan seseorang yang tidak merokok, rata-rata di semua kelompok usia.

# Log-odds ratio untuk Usia:Penyakit_Jantung
lambda_usia_penyakit <- params$Usia.Penyakit_Jantung["Tua", "Ada"]
logOR_usia <- 4 * lambda_usia_penyakit
odds_ratio_usia <- exp(logOR_usia)
cat("Log-Odds Ratio (Usia:Penyakit_Jantung):", logOR_usia, "\n")
## Log-Odds Ratio (Usia:Penyakit_Jantung): 0.7482121
cat("Odds Ratio (Usia:Penyakit_Jantung):", odds_ratio_usia, "\n")
## Odds Ratio (Usia:Penyakit_Jantung): 2.113219

Untuk Usia:Penyakit_Jantung, log-odds ratio = \(4 \cdot 0.187053 \approx 0.7482\).

Odds ratio = \(\exp(0.7482) \approx 2.113\), menunjukkan bahwa pasien tua memiliki peluang 2.113 kali lebih tinggi untuk penyakit jantung dibandingkan pasien muda.

Implikasi Praktis

- Usia sebagai Faktor Risiko Utama : Odds ratio ≈ 2.113 untuk Usia:Penyakit_Jantung menunjukkan bahwa usia adalah prediktor kuat penyakit jantung. Rumah sakit harus memprioritaskan skrining untuk pasien berusia ≥40 tahun.

- Merokok sebagai Faktor Risiko Sekunder : Odds ratio ≈ 1.217 untuk Merokok:Penyakit_Jantung menunjukkan asosiasi lemah. Meskipun perokok memiliki risiko lebih tinggi, efeknya tidak signifikan dalam data ini, mungkin karena faktor lain (misalnya, diet, genetik) berperan.

- Interaksi Lemah : Interaksi Usia:Merokok memiliki efek minimal, menunjukkan bahwa hubungan antara merokok dan usia tidak terlalu memengaruhi frekuensi.

- Rekomendasi : Fokus pada pencegahan penyakit jantung untuk pasien tua, dengan perhatian tambahan pada perokok. Penelitian lanjutan dapat mengeksplorasi faktor risiko lain untuk memperkuat temuan.

Kesimpulan

Parameter model dua arah menunjukkan bahwa usia adalah faktor risiko utama penyakit jantung, dengan pasien tua memiliki peluang 2.113 kali lebih tinggi untuk penyakit ini dibandingkan pasien muda. Merokok memiliki asosiasi lemah (odds ratio ≈ 1.217), dan interaksi antar variabel tidak menunjukkan efek kuat. Log-odds ratio memberikan ukuran kuantitatif yang konsisten dengan parameter interaksi, memperkuat interpretasi asosiasi. Model log-linear efektif untuk menganalisis data kategorik, memberikan wawasan penting untuk pengambilan keputusan di bidang kesehatan.