Ordinal Logistic Regression

1. Persiapan Data

library(tidyverse)
## Warning: package 'dplyr' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Load dataset
df_MAR <- read.csv("C:/Users/Alfathrindra Agastyo/Documents/Semester 4/Analisis Multivariat/Tugas/data_ordinal_new.csv")

# Lihat data
View(df_MAR)
Data yang digunakan dalam analisis ini berasal dari survei tingkat kepuasan pelanggan terhadap beberapa faktor seperti pendapatan, harga, jumlah produk yang dibeli, dan total pembelian. Langkah awal adalah membaca data dari file CSV dan melakukan pemeriksaan awal untuk memahami struktur dataset.

2. Transformasi Variabel Target Menjadi Faktor Ordinal

# Transformasi kolom Tingkat.Kepuasan menjadi faktor ordinal
df_MAR <- df_MAR %>%
  mutate(
    Tingkat.Kepuasan = factor(Tingkat.Kepuasan, 
                      levels = c("1", "2", "3"),  # 1 = Tidak Puas, 2 = Cukup Puas, 3 = Sangat Puas
                      ordered = TRUE)  # Variabel ordinal
  )

# Cek struktur data
str(df_MAR)
## 'data.frame':    20 obs. of  9 variables:
##  $ ID.Pelanggan    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Nama            : chr  "Arif" "Dian" "Dinda" "Fajar" ...
##  $ Jenis.Kelamin   : int  1 2 2 1 2 1 1 2 2 2 ...
##  $ Pendapatan      : int  6 12 9 4 12 8 9 11 8 17 ...
##  $ Produk          : chr  "A" "D" "D" "A" ...
##  $ Harga           : int  1 2 2 1 2 1 1 3 3 3 ...
##  $ Jumlah          : int  4 4 3 2 4 4 5 3 2 5 ...
##  $ Total           : int  4 8 6 2 8 4 5 9 6 15 ...
##  $ Tingkat.Kepuasan: Ord.factor w/ 3 levels "1"<"2"<"3": 2 2 3 3 2 3 1 3 1 1 ...

Dalam analisis ini, variabel Tingkat.Kepuasan diubah menjadi faktor ordinal karena kategorinya memiliki urutan yang logis dari “Tidak Puas” ke “Sangat Puas”. Ini penting karena model ordinal logistic regression memanfaatkan informasi tentang urutan ini dalam proses estimasi.

3. Ordinal Logistic Regression dengan Satu Variabel Independen

library(MASS)
## Warning: package 'MASS' was built under R version 4.4.3
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
# Model regresi ordinal dengan satu IV
fit_basic <- polr(Tingkat.Kepuasan ~ Pendapatan, data = df_MAR, method = "logistic")

# Output ringkasan model
summary(fit_basic)
## 
## Re-fitting to get Hessian
## Call:
## polr(formula = Tingkat.Kepuasan ~ Pendapatan, data = df_MAR, 
##     method = "logistic")
## 
## Coefficients:
##               Value Std. Error t value
## Pendapatan -0.07339     0.1329 -0.5523
## 
## Intercepts:
##     Value   Std. Error t value
## 1|2 -1.2609  1.2581    -1.0022
## 2|3 -0.2235  1.2272    -0.1822
## 
## Residual Deviance: 42.91573 
## AIC: 48.91573

Model pertama dibangun dengan menggunakan Pendapatan sebagai satu-satunya variabel independen untuk memprediksi Tingkat.Kepuasan. Hasil dari model ini memberikan estimasi koefisien log-odds yang menunjukkan hubungan antara pendapatan dengan kemungkinan berada pada tingkat kepuasan yang lebih tinggi.

4. Tabel Output Model Rapi

library(broom)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
# Output rapi dengan broom
tidy(fit_basic, conf.int = TRUE) %>%
  kable() %>%
  kable_styling("basic", full_width = FALSE)
## 
## Re-fitting to get Hessian
term estimate std.error statistic conf.low conf.high coef.type
Pendapatan -0.0733906 0.1328721 -0.5523403 -0.3471607 0.1931749 coefficient
1&#124;2 -1.2608894 1.2580814 -1.0022319 NA NA scale
2&#124;3 -0.2235486 1.2271952 -0.1821622 NA NA scale

Output model disajikan dalam bentuk tabel yang lebih rapi menggunakan fungsi tidy() dari paket broom, dilengkapi dengan interval kepercayaan. Tabel ini memudahkan interpretasi koefisien serta signifikansi dari variabel Pendapatan.

5. Ordinal Logistic Regression dengan Beberapa Variabel Independen

# Model regresi ordinal penuh
fit_full <- polr(Tingkat.Kepuasan ~ Pendapatan + Harga + Jumlah + Total, data = df_MAR, method = "logistic")

# Output ringkasan model
summary(fit_full)
## 
## Re-fitting to get Hessian
## Call:
## polr(formula = Tingkat.Kepuasan ~ Pendapatan + Harga + Jumlah + 
##     Total, data = df_MAR, method = "logistic")
## 
## Coefficients:
##              Value Std. Error t value
## Pendapatan  0.1880     0.2780  0.6760
## Harga      -2.3505     2.6786 -0.8775
## Jumlah     -0.7940     1.3653 -0.5815
## Total       0.1806     0.6858  0.2633
## 
## Intercepts:
##     Value   Std. Error t value
## 1|2 -4.9442  5.5027    -0.8985
## 2|3 -3.7844  5.4668    -0.6922
## 
## Residual Deviance: 40.16584 
## AIC: 52.16584

Model selanjutnya memperluas analisis dengan memasukkan beberapa variabel independen, yaitu Pendapatan, Harga, Jumlah, dan Total. Model ini memungkinkan kita melihat kontribusi masing-masing variabel terhadap perubahan tingkat kepuasan pelanggan.

6. Tabel Output Model Full

# Tabel rapi
tidy(fit_full, conf.int = TRUE) %>%
  kable() %>%
  kable_styling("basic", full_width = FALSE)
## 
## Re-fitting to get Hessian
term estimate std.error statistic conf.low conf.high coef.type
Pendapatan 0.1879535 0.2780431 0.6759867 -0.355011 0.8737004 coefficient
Harga -2.3504600 2.6786379 -0.8774833 -9.036944 2.5877785 coefficient
Jumlah -0.7939513 1.3653201 -0.5815130 -3.993932 1.8149592 coefficient
Total 0.1805629 0.6857825 0.2632947 -1.151074 1.7607908 coefficient
1&#124;2 -4.9442352 5.5027443 -0.8985035 NA NA scale
2&#124;3 -3.7843864 5.4668345 -0.6922446 NA NA scale

Tabel hasil dari model penuh memperlihatkan estimasi koefisien, error standar, nilai statistik uji, dan p-value untuk masing-masing prediktor. Dari sini dapat dianalisis variabel mana yang memiliki pengaruh paling signifikan terhadap tingkat kepuasan pelanggan.

7. Interpretasi Koefisien dalam Odds Ratio

# Koefisien dalam bentuk Odds Ratio
exp(coef(fit_full))
## Pendapatan      Harga     Jumlah      Total 
##  1.2067773  0.0953253  0.4520550  1.1978915
# Tabel odds ratio rapi
tidy(fit_full, conf.int = TRUE, exponentiate = TRUE) %>%
  kable() %>%
  kable_styling("basic", full_width = FALSE)
## 
## Re-fitting to get Hessian
term estimate std.error statistic conf.low conf.high coef.type
Pendapatan 1.2067773 0.2780431 0.6759867 0.7011658 2.395760 coefficient
Harga 0.0953253 2.6786379 -0.8774833 0.0001189 13.300192 coefficient
Jumlah 0.4520550 1.3653201 -0.5815130 0.0184271 6.140826 coefficient
Total 1.1978915 0.6857825 0.2632947 0.3162970 5.817036 coefficient
1&#124;2 0.0071244 5.5027443 -0.8985035 NA NA scale
2&#124;3 0.0227228 5.4668345 -0.6922446 NA NA scale

Untuk mempermudah interpretasi, koefisien log-odds dikonversi menjadi Odds Ratio. Odds Ratio menunjukkan seberapa besar peluang untuk pindah ke kategori kepuasan yang lebih tinggi akibat perubahan satu unit pada variabel prediktor. Odds Ratio lebih dari 1 mengindikasikan efek positif, sedangkan kurang dari 1 menunjukkan efek negatif terhadap tingkat kepuasan.

8. Analisis Efek Marginal

library(marginaleffects)
## Warning: package 'marginaleffects' was built under R version 4.4.3
# Marginal Effects untuk Pendapatan
mfx_Pendapatan <- avg_comparisons(fit_full, variables = "Pendapatan", type = "probs")
## 
## Re-fitting to get Hessian
mfx_Pendapatan
## 
##  Group Estimate Std. Error      z Pr(>|z|)   S   2.5 % 97.5 %
##      1 -0.03605     0.0497 -0.726    0.468 1.1 -0.1334 0.0613
##      2 -0.00402     0.0110 -0.366    0.714 0.5 -0.0255 0.0175
##      3  0.04006     0.0585  0.685    0.493 1.0 -0.0745 0.1546
## 
## Term: Pendapatan
## Type:  probs 
## Comparison: +1
# Marginal Effects untuk Total
mfx_Harga <- avg_comparisons(fit_full, variables = "Total", type = "probs")
## 
## Re-fitting to get Hessian
mfx_Harga
## 
##  Group Estimate Std. Error      z Pr(>|z|)   S   2.5 % 97.5 %
##      1 -0.03466     0.1282 -0.270    0.787 0.3 -0.2859 0.2165
##      2 -0.00381     0.0198 -0.193    0.847 0.2 -0.0426 0.0349
##      3  0.03847     0.1469  0.262    0.793 0.3 -0.2494 0.3264
## 
## Term: Total
## Type:  probs 
## Comparison: +1

Analisis efek marginal dilakukan untuk mengukur perubahan rata-rata probabilitas pada setiap kategori tingkat kepuasan akibat perubahan kecil pada masing-masing variabel. Misalnya, perubahan pada Pendapatan atau Total pembelian dapat mempengaruhi probabilitas seorang pelanggan merasa “Sangat Puas” dibandingkan “Tidak Puas”. Ini memberikan interpretasi praktis terhadap hasil model.

Kesimpulan

Berdasarkan hasil analisis ordinal logistic regression, dapat disimpulkan bahwa faktor-faktor seperti pendapatan, harga, jumlah pembelian, dan total pembelian berkontribusi dalam menentukan tingkat kepuasan pelanggan. Model menunjukkan bahwa beberapa variabel berpengaruh secara signifikan terhadap probabilitas peningkatan tingkat kepuasan. Odds Ratio dan efek marginal memberikan informasi tambahan yang berguna untuk strategi pengambilan keputusan dalam meningkatkan kepuasan pelanggan.