Kasus Regresi Logistik Ordinal

1️⃣ Pendahuluan

Regresi logistik ordinal adalah metode yang digunakan saat variabel dependen memiliki lebih dari dua kategori yang berurutan (ordinal). Cara kerja regresi logistik yaitu dengan menghitung kemungkinan seseorang atau sesuatu berada di atas atau di bawah kategori tertentu, lalu dihitung peluang setiap tingkatnya.

Salah satu contoh kasus yang dapat dianalisis menggunakan regresi logistik ordinal adalah tingkat kepuasan pasien terhadap rumah sakit. Tingkat kepuasan merupakan salah satu indikator penting dalam mengevaluasi kualitas layanan rumah sakit, sehingga kita dapat menganalisis faktor-faktor yang memengaruhi tingkat kepuasan pasien menggunakan metode regresi logistik ordinal, dengan memanfaatkan data yang mencakup variabel waktu tunggu, usia pasien, jenis kelamin, lama rawat inap, kualitas interaksi dokter, dan kualitas fasilitas rumah sakit.

2️⃣ Data

Data yang digunakan untuk analisis ini merupakan data sintetis.

# Membaca dan Menyiapkan Data
data_rs <- read.csv("kepuasan_pasien_rs.csv")

str(data_rs)
## 'data.frame':    100 obs. of  7 variables:
##  $ waktu_tunggu    : int  43 33 19 12 25 43 23 27 15 15 ...
##  $ usia            : int  67 74 42 43 56 54 63 59 41 46 ...
##  $ jenis_kelamin   : chr  "L" "L" "L" "P" ...
##  $ lama_rawat      : int  7 9 9 3 3 3 4 8 6 8 ...
##  $ interaksi_dokter: int  4 1 8 3 7 2 2 7 6 3 ...
##  $ fasilitas       : int  4 8 2 3 1 1 3 5 3 1 ...
##  $ kepuasan        : int  1 2 2 2 2 1 2 3 3 1 ...
head(data_rs)
##   waktu_tunggu usia jenis_kelamin lama_rawat interaksi_dokter fasilitas
## 1           43   67             L          7                4         4
## 2           33   74             L          9                1         8
## 3           19   42             L          9                8         2
## 4           12   43             P          3                3         3
## 5           25   56             L          3                7         1
## 6           43   54             L          3                2         1
##   kepuasan
## 1        1
## 2        2
## 3        2
## 4        2
## 5        2
## 6        1

Terlihat bahwa terdapat 7 kolom atau variabel dengan detail sebagai berikut:

  • waktu_tunggu: Waktu tunggu sebelum ditangani dokter (dalam menit)

  • usia: Usia pasien (dalam tahun)

  • jenis_kelamin: Jenis kelamin pasien (L = laki-laki, P = perempuan)

  • lama_rawat: Jumlah hari pasien dirawat inap

  • interaksi_dokter: Skor seberapa baik dokter menjelaskan kondisi pasien (skala 1–10)

  • fasilitas: Skor kualitas fasilitas medis & kamar (skala 1–10)

  • kepuasan: Tingkat kepuasan pasien terhadap layanan (kategori ordinal 1–4)

3️⃣ Persiapan Data

Untuk pengolahan data lebih mendalam, variabel kepuasan perlu diubah yang awalnya berupa nilai numerik 1–4, menjadi faktor ordinal berurutan, dengan label yang lebih memiliki tingkatan seperti berikut:

  • 1 → Tidak Puas

  • 2 → Cukup Puas

  • 3 → Puas

  • 4 → Sangat Puas

# Mengubah variabel kepuasan menjadi faktor ordinal
data_rs$kepuasan <- factor(data_rs$kepuasan,
                           levels = c(1, 2, 3, 4),
                           labels = c("Tidak Puas", "Cukup Puas", "Puas", "Sangat Puas"),
                           ordered = TRUE)
summary(data_rs)
##   waktu_tunggu        usia       jenis_kelamin        lama_rawat  
##  Min.   : 5.00   Min.   :20.00   Length:100         Min.   :1.00  
##  1st Qu.:13.00   1st Qu.:34.00   Class :character   1st Qu.:3.00  
##  Median :24.50   Median :51.00   Mode  :character   Median :4.50  
##  Mean   :23.79   Mean   :48.69                      Mean   :4.78  
##  3rd Qu.:32.25   3rd Qu.:61.00                      3rd Qu.:7.00  
##  Max.   :44.00   Max.   :74.00                      Max.   :9.00  
##  interaksi_dokter   fasilitas            kepuasan 
##  Min.   : 1.00    Min.   : 1.00   Tidak Puas :26  
##  1st Qu.: 3.75    1st Qu.: 3.00   Cukup Puas :24  
##  Median : 5.50    Median : 5.00   Puas       :25  
##  Mean   : 5.71    Mean   : 5.53   Sangat Puas:25  
##  3rd Qu.: 8.00    3rd Qu.: 8.25                   
##  Max.   :10.00    Max.   :10.00

4️⃣ Eksplorasi Data

# Distribusi tingkat kepuasan
ggplot(data_rs, aes(x = kepuasan)) +
  geom_bar(fill = "skyblue") +
  geom_text(
    aes(label = after_stat(count)), 
    stat = "count",
    vjust = -0.3, 
    size = 3.5,
    color = "darkblue"
  ) +
  labs(
    title = "Distribusi Tingkat Kepuasan Pasien",
    x = "Tingkat Kepuasan",
    y = "Jumlah Pasien"
  ) +
  ylim(0, max(table(data_rs$kepuasan)) * 1.1)

Grafik distribusi di atas menunjukkan jumlah pasien pada masing-masing tingkat kepuasan.

  • Kategori “Tidak Puas” memiliki jumlah pasien terbanyak sebanyak 26 orang, menunjukkan banyak pasien yang merasa kurang puas terhadap layanan rumah sakit.
  • Kategori “Puas” dan “Sangat Puas” memiliki jumlah pasien yang sama sebanyak 25 orang, menempati posisi kedua terbanyak.
  • Kategori “Cukup Puas” memiliki jumlah paling sedikit sebanyak 24 orang, yang menunjukkan bahwa pasien cenderung menilai layanan secara (puas atau sangat tidak puas), bukan netral.

Distribusi ini memberikan gambaran awal bahwa terdapat tantangan dalam kualitas layanan rumah sakit, karena banyak pasien merasa tidak puas. Hal ini mendasari kebutuhan untuk mengeksplorasi faktor-faktor penyebab rendahnya kepuasan pasien melalui analisis lanjutan dengan regresi logistik ordinal.

5️⃣ Pemodelan Regresi Logistik Ordinal

Model 1: Waktu Tunggu dan Interaksi Dokter

Model pertama menggabungkan dua variabel prediktor: waktu_tunggu (waktu tunggu pasien) dan interaksi_dokter (interaksi antara pasien dan dokter). Model ini diterapkan untuk melihat pengaruh waktu tunggu dan interaksi dokter terhadap tingkat kepuasan pasien.

# Model 1: waktu_tunggu + interaksi_dokter
model1 <- polr(kepuasan ~ waktu_tunggu + interaksi_dokter, data = data_rs, Hess = TRUE)
summary(model1)
## Call:
## polr(formula = kepuasan ~ waktu_tunggu + interaksi_dokter, data = data_rs, 
##     Hess = TRUE)
## 
## Coefficients:
##                    Value Std. Error t value
## waktu_tunggu     -0.1271    0.02172  -5.852
## interaksi_dokter  0.3845    0.08110   4.741
## 
## Intercepts:
##                       Value   Std. Error t value
## Tidak Puas|Cukup Puas -2.3523  0.6250    -3.7636
## Cukup Puas|Puas       -0.8565  0.5851    -1.4638
## Puas|Sangat Puas       0.7310  0.5771     1.2667
## 
## Residual Deviance: 219.4754 
## AIC: 229.4754

Model 2: Menambahkan Usia

Model kedua menambahkan variabel usia ke dalam model, yang diperkirakan dapat memengaruhi persepsi pasien terhadap kualitas layanan rumah sakit.

# Model 2: + usia
model2 <- polr(kepuasan ~ waktu_tunggu + interaksi_dokter + usia, data = data_rs, Hess = TRUE)
summary(model2)
## Call:
## polr(formula = kepuasan ~ waktu_tunggu + interaksi_dokter + usia, 
##     data = data_rs, Hess = TRUE)
## 
## Coefficients:
##                     Value Std. Error t value
## waktu_tunggu     -0.15194    0.02449  -6.205
## interaksi_dokter  0.47876    0.09033   5.300
## usia              0.09127    0.01628   5.604
## 
## Intercepts:
##                       Value   Std. Error t value
## Tidak Puas|Cukup Puas  1.5505  0.9167     1.6914
## Cukup Puas|Puas        3.4824  0.9702     3.5894
## Puas|Sangat Puas       5.6708  1.0930     5.1883
## 
## Residual Deviance: 180.8184 
## AIC: 192.8184

Model 3: Menambahkan Jenis Kelamin

Model ketiga menambahkan variabel jenis_kelamin untuk mengeksplorasi adanya perbedaan kepuasan berdasarkan jenis kelamin.

# Model 3: + jenis_kelamin
model3 <- polr(kepuasan ~ waktu_tunggu + interaksi_dokter + usia + jenis_kelamin, data = data_rs, Hess = TRUE)
summary(model3)
## Call:
## polr(formula = kepuasan ~ waktu_tunggu + interaksi_dokter + usia + 
##     jenis_kelamin, data = data_rs, Hess = TRUE)
## 
## Coefficients:
##                    Value Std. Error t value
## waktu_tunggu     -0.1486    0.02455  -6.052
## interaksi_dokter  0.4959    0.09183   5.400
## usia              0.0945    0.01664   5.681
## jenis_kelaminP    0.7229    0.44062   1.641
## 
## Intercepts:
##                       Value   Std. Error t value
## Tidak Puas|Cukup Puas  2.2153  1.0167     2.1789
## Cukup Puas|Puas        4.2180  1.0856     3.8855
## Puas|Sangat Puas       6.4420  1.2120     5.3152
## 
## Residual Deviance: 178.0937 
## AIC: 192.0937

Model 4: Menambahkan Lama Rawat Inap

Model 4 menambahkan variabel lama_rawat (durasi rawat inap pasien). Variabel ini memberikan informasi tambahan tentang seberapa lama pasien berada di rumah sakit dan bagaimana hal ini mempengaruhi kepuasan pasien.

# Model 4: + lama_rawat
model4 <- polr(kepuasan ~ waktu_tunggu + interaksi_dokter + usia + jenis_kelamin + lama_rawat, data = data_rs, Hess = TRUE)
summary(model4)
## Call:
## polr(formula = kepuasan ~ waktu_tunggu + interaksi_dokter + usia + 
##     jenis_kelamin + lama_rawat, data = data_rs, Hess = TRUE)
## 
## Coefficients:
##                     Value Std. Error t value
## waktu_tunggu     -0.15089    0.02474  -6.100
## interaksi_dokter  0.49389    0.09207   5.364
## usia              0.09642    0.01701   5.668
## jenis_kelaminP    0.71303    0.44152   1.615
## lama_rawat       -0.09752    0.08320  -1.172
## 
## Intercepts:
##                       Value   Std. Error t value
## Tidak Puas|Cukup Puas  1.7470  1.0856     1.6093
## Cukup Puas|Puas        3.7556  1.1481     3.2712
## Puas|Sangat Puas       6.0421  1.2591     4.7988
## 
## Residual Deviance: 176.7043 
## AIC: 192.7043

6️⃣ Evaluasi Model dengan AIC & Log-Likelihood

Setelah membangun empat model, selanjutnya adala melakukan evaluasi pada setiap model menggunakan dua indikator penting yaitu, AIC (Akaike Information Criterion) dan Log-likelihood.

  • AIC digunakan untuk memilih model terbaik dengan mempertimbangkan kompleksitas model. Model dengan AIC yang lebih rendah dianggap lebih baik.

  • Log-likelihood menunjukkan seberapa baik model sesuai dengan data yang ada. Nilai yang lebih tinggi menunjukkan model yang lebih baik.

Berikut adalah hasil AIC dan Log-likelihood untuk setiap model:

# Evaluasi Model dengan AIC & Log-Likelihood
cat("AIC Model 1:", AIC(model1), "\n")
## AIC Model 1: 229.4754
cat("AIC Model 2:", AIC(model2), "\n")
## AIC Model 2: 192.8184
cat("AIC Model 3:", AIC(model3), "\n")
## AIC Model 3: 192.0937
cat("AIC Model 4:", AIC(model4), "\n")
## AIC Model 4: 192.7043
cat("Log-likelihood Model 1:", logLik(model1), "\n")
## Log-likelihood Model 1: -109.7377
cat("Log-likelihood Model 2:", logLik(model2), "\n")
## Log-likelihood Model 2: -90.40922
cat("Log-likelihood Model 3:", logLik(model3), "\n")
## Log-likelihood Model 3: -89.04687
cat("Log-likelihood Model 4:", logLik(model4), "\n")
## Log-likelihood Model 4: -88.35216

Dari hasil AIC dan log-likelihood yang dihitung, Model 4 menunjukkan hasil terbaik dengan nilai AIC terendah dan log-likehood yang tertinggi diantara keempat model

7️⃣ Interpretasi Model Terbaik (Model 4)

Dari keempat model, Model 4 memiliki nilai AIC dan Log-likelihood terbaik, sehingga dipilih model ini untuk interpretasi lebih mendalam.

Signifikansi Koefisien

Pada model 4 ini, diperlihatkan nilai koefisien untuk setiap variabel yang terlibat dan menguji signifikansinya.

coef_summary <- coef(summary(model4))
print(coef_summary)
##                            Value Std. Error   t value
## waktu_tunggu          -0.1508858 0.02473733 -6.099518
## interaksi_dokter       0.4938923 0.09206975  5.364328
## usia                   0.0964240 0.01701145  5.668183
## jenis_kelaminP         0.7130310 0.44152280  1.614936
## lama_rawat            -0.0975168 0.08319822 -1.172102
## Tidak Puas|Cukup Puas  1.7469745 1.08556817  1.609272
## Cukup Puas|Puas        3.7555831 1.14807064  3.271213
## Puas|Sangat Puas       6.0420559 1.25906583  4.798840

Dari hasil tersebut, dapat dilihat bahwa:

  • waktu_tunggu memiliki koefisien negatif yang signifikan, menunjukkan bahwa semakin lama waktu tunggu, semakin rendah tingkat kepuasan pasien.

  • interaksi_dokter memiliki koefisien positif yang signifikan, menunjukkan bahwa interaksi yang baik dengan dokter meningkatkan kepuasan pasien.

  • usia juga berpengaruh positif terhadap kepuasan, artinya pasien yang lebih tua cenderung lebih puas.

  • jenis_kelamin dan lama_rawat tidak terlalu signifikan dalam model ini.

Odds Ratio dan Confidence Interval

Untuk memahami pengaruh setiap variabel, perhitungan Odds Ratio dan interval kepercayaan digunakan.

# Odds Ratio dan Confidence Interval
odds_ratio <- exp(coef(model4))
conf_int <- exp(confint(model4))  # Profiling CI
## Waiting for profiling to be done...
# Gabung ke dalam satu tabel
hasil <- data.frame(Odds_Ratio = round(odds_ratio, 2),
                    CI_lower = round(conf_int[,1], 2),
                    CI_upper = round(conf_int[,2], 2))
print(hasil)
##                  Odds_Ratio CI_lower CI_upper
## waktu_tunggu           0.86     0.82     0.90
## interaksi_dokter       1.64     1.38     1.98
## usia                   1.10     1.07     1.14
## jenis_kelaminP         2.04     0.86     4.91
## lama_rawat             0.91     0.77     1.07

Hasil Odds Ratio menunjukkan:

  • Setiap penambahan satu unit waktu tunggu mengurangi kepuasan pasien dengan faktor 0.86.

  • Interaksi yang baik dengan dokter meningkatkan peluang kepuasan pasien dengan faktor 1.64.

  • Setiap penambahan usia meningkatkan peluang kepuasan pasien dengan faktor 1.10.

8️⃣ Evaluasi Akurasi Prediksi

Untuk mengevaluasi kinerja model, dilakukan evaluasi untuk melihat akurasi prediksi dengan membandingkan prediksi model dengan data aktual.

# Evaluasi Akurasi Prediksi
prediksi <- predict(model4, data_rs, type = "class")
tabulasi <- table(Prediksi = prediksi, Aktual = data_rs$kepuasan)
print(tabulasi)
##              Aktual
## Prediksi      Tidak Puas Cukup Puas Puas Sangat Puas
##   Tidak Puas          20          5    3           0
##   Cukup Puas           5          8    6           0
##   Puas                 1         10   12           4
##   Sangat Puas          0          1    4          21
akurasi <- mean(as.character(prediksi) == as.character(data_rs$kepuasan))
cat("Akurasi Model:", round(akurasi * 100, 2), "%\n")
## Akurasi Model: 61 %

Dari hasil evaluasi prediksi, model memiliki akurasi 61%, yang menunjukkan bahwa model cukup baik dalam memprediksi kepuasan pasien berdasarkan variabel yang ada.

9️⃣ Kesimpulan

Berdasarkan hasil analisis regresi logistik ordinal, dapat ditarik kesimpulan sebagai berikut:

  1. Waktu tunggu dan interaksi dokter adalah faktor signifikan yang mempengaruhi tingkat kepuasan pasien. Semakin lama waktu tunggu dan semakin baik interaksi dengan dokter, semakin besar pasien memberikan penilaian lebih tinggi terhadap layanan.

  2. Usia pasien juga berpengaruh terhadap kepuasan pasien, dengan semakin bertambahnya usia, semakin besar pasien merasa puas.

  3. Jenis kelamin tidak menunjukkan pengaruh signifikan pada tingkat kepuasan pasien dalam model ini.

  4. Lama rawat inap tidak memiliki pengaruh signifikan terhadap kepuasan pasien, meskipun nilai koefisiennya negatif, menunjukkan bahwa semakin lama pasien dirawat, semakin kecil kemungkinan mereka merasa puas.

Secara keseluruhan, model yang dihasilkan memiliki akurasi prediksi sebesar 61%, yang menunjukkan bahwa ada peluang untuk perbaikan lebih lanjut dalam model ini.