Regresi Logistik

Regresi logistik adalah teknik analisis data yang menggunakan matematika untuk menemukan hubungan antara dua faktor data. Kemudian menggunakan hubungan ini untuk memprediksi nilai dari salah satu faktor tersebut berdasarkan faktor yang lain. Prediksi biasanya memiliki jumlah hasil yang terbatas, seperti ya atau tidak.

Misalnya, Anda ingin menebak apakah pengunjung situs web akan mengeklik tombol checkout di keranjang belanja mereka atau tidak. Analisis regresi logistik melihat perilaku pengunjung di masa lalu, seperti waktu yang dihabiskan di situs web dan jumlah item di keranjang. Analisis regresi logistik menentukan bahwa, di masa lalu, jika pengunjung menghabiskan lebih dari lima menit di situs web dan menambahkan lebih dari tiga item ke keranjang, pengunjung akan mengeklik tombol checkout. Dengan menggunakan informasi ini, fungsi regresi logistik dapat memprediksi perilaku pengunjung baru di situs web.

Fungsi logistik (juga dikenal sebagai fungsi sigmoid atau fungsi inverse logit) adalah inti dari regresi logistik. Fungsi logistik:

\[f(x)=\frac{1}{1+e^{-x}}\]

Rumus lain untuk fungsi logistik:

\[g(x)=\frac{e^{x}}{e^{x}+1}\]

Anda dapat dengan mudah memperolehnya \(g(x)\) dari \(f(x)\):

\[\frac{1}{1+e^{-x}}= (\frac{1}{1+e^{-x}}) * (\frac{e^{x}}{e^{x}}) =\frac{e^{x}}{e^{x}+1}\]

Multinomial Regresi Logistik

Regresi logistik multinomial adalah jenis regresi logistik yang digunakan saat variabel terikat memiliki skala polikhotomus atau multinomial. Metode ini cocok untuk variabel terikat berskala nominal dengan tiga kategori. Model dan karakteristik untuk variabel terikat dengan beberapa level disebut dengan model regresi logistik Polytomous (Kleinbaum dan Klein, 2010).

Variabel yang digunakan dalam regresi logistik multinomial bisa berskala nominal atau ordinal. Nominal mengindikasikan kategori yang berbeda, sementara ordinal memiliki tingkatan. Jika variabel terikat berskala nominal, model regresi logistik multinomial dapat digunakan. Namun, jika variabel berskala ordinal, baik regresi logistik multinomial maupun regresi logistik ordinal bisa digunakan.

Adapun model regresi logistik dengan p variabel prediktor dituliskan dalam rumus matematis berikut ini.

\[\pi(x)=\frac{\ \ \exp(\beta_0+\beta_1\ x_1+\beta_2\ x_2+L+\beta_p\ x_p\ )}{1+\exp(\beta_0+\beta_1\ x_1+\beta_2\ x_2+L+\beta_p\ x_p\ )\ }\] Dengan menggunakan transformasi logit akan didapatkan dua fungsi logit sebagai berikut.

\[g_1\ (x)=ln[\frac{(P(Y=1|x))}{(P(Y=0|x))}]=β_{10}+β_{11} x_1+K+β_{1p} x_p=x'β_1 \] \[g_2\ (x)=ln[\frac{(P(Y=2|x))}{(P(Y=0|x))}]=β_{20}+β_{21} x_1+K+β_{2p} x_p=x'β_2 \]

Metodologi Penelitian

Adapun langkah-langkah yang dilakukan untuk melakukan analisis regresi logistik, yaitu sebagai berikut.

  1. Melakukan uji asumsi regresi logistik multinomial.

  2. Mengimport package dan mengimport dataset.

  3. Melakukan eksplorasi data berupa statistic deskriptif, plot distribusi, korelasi antarvariabel dan mendeteksi outliers.

  4. Melakukan data preprocessing untuk mengatasi outliers.

  5. Melakukan analisis regresi logistik multinomial dengan package ‘nnet’.

  6. Menarik kesimpulan.

Deskripsi dan Sumber Data

Data kategori kelulusan mahasiswa digunakan untuk mengetahui kualitas akreditasi pendidikan, diukur dari persentase kelulusan mahasiswa, dan strategi perguruan tinggi untuk mempertahankan mahasiswa. Sebagai sarana dalam mewujudkan peningkatan kualitas lulusan maka diperlukan sistem yang dapat memprediksi kelulusan mahasiswa berdasarkan kategori waktu kelulusan. Metode regresi logistik multinomial dianggap sebagai salah satu metode yang tepat karena kategori kelulusan terdiri dari tiga kategori. Peneliti mengumpulkan total 300 data akademik mahasiswa tahun 2012-2018 pada Program Studi Teknik Informatika Universitas Islam Negeri Maulana Malik Ibrahim Malang.

Data berasal dari skripsi berjudul “Prediksi Kategori Kelulusan Mahasiswa Menggunakan Metode Regresi Logistrik Multinomial”. Data kategori kelulusan merupakan data numerik yang berisi variabel-variabel sebagai berikut.

1. Jenis Kelamin : Terdiri dari 2 yaitu Laki-Laki (1) dan Perempuan (2)

2. Jalur Masuk : Terdiri dari Prestasi (1) dan Non Prestasi (2)

3. IP : Data IP mulai dari semester 1 hingga semester 6.

4. Lama Studi : Terdiri dari 3 kategori, yaitu Cepat (1), Tepat (2), dan Lambat (3)

Analisis Multinomial Regresi Logistik

Asumsi Multinomial Regresi Logistik

Beberapa asumsi yang harus dipenuhi dalam multinomial regresi logistik antara lain:

  1. Tidak membutuhkan hubungan linear antara variabel independen dengan variabel dependen

  2. Variabel independen tidak memerlukan asumsi multivariate normality

  3. Asumsi homoskedastisitas tidak diperlukan

  4. Variabel bebas tidak perlu diubah ke dalam bentuk metrik (interval atau skala ratio)

  5. Variabel dependen harus bersifat dikotomi (2 kategori)

  6. Variabel independen tidak harus memiliki keragaman yang sama antar kelompok variabel

  7. Kategori dalam variabel independen harus teripsah satu sama lain atau bersifat eksklusif

  8. Sampel yang diperlukan dalam jumlah relatif besar

  9. Tidak ada outlier

Berdasarkan dari beberapa asumsi yang disebutkan data penelitian kami memenuhi asumsi yang diperlukan kecuali asumsi outlier, sehingga analisis lebih lanjut untuk menangani outlier dapat dilakukan.

Import Packages & Import Dataset

Data_Regresi_Logistik_ORI <- read_excel("D:/Data Regresi Logistik1.xlsx", 
    col_types = c("numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric"))

str(Data_Regresi_Logistik_ORI)
## tibble [300 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Jenis Kelamin: num [1:300] 1 2 1 2 1 2 1 1 1 1 ...
##  $ Jalur Masuk  : num [1:300] 1 2 2 2 2 1 2 2 2 2 ...
##  $ IP1          : num [1:300] 3.55 3.71 3.33 3.57 3.64 3.55 3.81 3.57 3.67 3.45 ...
##  $ IP2          : num [1:300] 3.15 3.6 3.42 3.59 3.04 3.31 3.8 3.2 3.66 3.4 ...
##  $ IP3          : num [1:300] 3.38 3.43 3 3.72 3.5 3.42 3.65 3.23 3.25 3.23 ...
##  $ IP4          : num [1:300] 3 3.55 3.27 3.69 3.38 3.59 3.79 3.36 3.56 3.02 ...
##  $ IP5          : num [1:300] 3.46 3.1 3.08 3.46 3.65 3.05 3.7 3.34 3.5 3.46 ...
##  $ IP6          : num [1:300] 3.7 3.38 3.3 3.73 3.76 3.34 3.66 3.58 3.71 2.95 ...
##  $ Lama Studi   : num [1:300] 1 3 3 2 1 3 2 3 3 1 ...

Exploratory Data Analysis

Statistik Deskriptif

Sebelum masuk lebih dalam tentang distribusi variabel numerik dan kategorik, korelasi antar variabel dan outlier kita harus memahami deskripsi statistik data kita terlebih dahulu

summary(Data_Regresi_Logistik_ORI)
##  Jenis Kelamin    Jalur Masuk         IP1             IP2       
##  Min.   :1.000   Min.   :1.000   Min.   :2.740   Min.   :2.240  
##  1st Qu.:1.000   1st Qu.:2.000   1st Qu.:3.390   1st Qu.:3.197  
##  Median :1.000   Median :2.000   Median :3.500   Median :3.365  
##  Mean   :1.457   Mean   :1.847   Mean   :3.492   Mean   :3.335  
##  3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:3.640   3rd Qu.:3.520  
##  Max.   :2.000   Max.   :2.000   Max.   :3.860   Max.   :3.920  
##       IP3             IP4             IP5             IP6       
##  Min.   :1.880   Min.   :1.310   Min.   :1.290   Min.   :2.120  
##  1st Qu.:3.240   1st Qu.:3.270   1st Qu.:3.095   1st Qu.:3.260  
##  Median :3.430   Median :3.480   Median :3.320   Median :3.510  
##  Mean   :3.392   Mean   :3.421   Mean   :3.279   Mean   :3.442  
##  3rd Qu.:3.600   3rd Qu.:3.650   3rd Qu.:3.540   3rd Qu.:3.700  
##  Max.   :3.960   Max.   :3.940   Max.   :3.960   Max.   :3.930  
##    Lama Studi   
##  Min.   :1.000  
##  1st Qu.:2.000  
##  Median :3.000  
##  Mean   :2.613  
##  3rd Qu.:3.000  
##  Max.   :3.000

Plot Distribusi Fitur Numerik

Dari ringkasan statistik ini, Anda dapat menarik beberapa informasi awal tentang distribusi dari setiap variabel dalam dataset. Setelah mengetahui statistik deskriptif kita dapat melihat plot distribusi untuk variabel numerik yaitu IP1. IP2, IP3, IP4, IP5, dan IP6.

par(mfrow = c(2, 3))
for (i in 1:6) {
  hist(Data_Regresi_Logistik_ORI[[paste0("IP", i)]], main = paste("IP", i))
}

Dapat diambil informasi bahwa fitur IP1 hingga IP6 tidak memiliki distribusi yang normal dilihat pada skewness atau kecondongan distribusi data nya. Untuk lebih detailnya kita dapat menguji normalitas pada data, tetapi kita tidak akan melakukannya saat ini.

Plot Distribusi Fitur Kategorik/Nominal

Setelah itu kita dapat melihat distribusi variabel kategorik yaitu pada kolom ‘Jenis Kelamin’ dan ‘Jalur Masuk’.

# Membuat pie chart untuk kolom Jenis Kelamin
pie_gender <- ggplot(Data_Regresi_Logistik_ORI, aes(x = "", fill = factor(`Jenis Kelamin`))) +
  geom_bar(width = 1) +
  coord_polar(theta = "y") +
  labs(title = "Pie Chart Jenis Kelamin", fill = "Jenis Kelamin") +
  theme_void()

# Membuat pie chart untuk kolom Jalur Masuk
pie_admission <- ggplot(Data_Regresi_Logistik_ORI, aes(x = "", fill = factor(`Jalur Masuk`))) +
  geom_bar(width = 1) +
  coord_polar(theta = "y") +
  labs(title = "Pie Chart Jalur Masuk", fill = "Jalur Masuk") +
  theme_void()

# Menampilkan kedua pie chart dalam satu run chunk
plot_grid(pie_gender, pie_admission, labels = "AUTO")

Plot Distribusi Label Kategorik/Nominal

Selain itu untuk variabel kategorik label kita dapat membuat pie-chart juga. Distribusi label sangat berpengaruh terhadap akurasi model, semakin seimbang distribusi antar kelas semakin baik akurasi modelnya.

count_lama_studi <- table(Data_Regresi_Logistik_ORI$`Lama Studi`)

df_count_lama_studi <- data.frame(Lama_Studi = as.numeric(names(count_lama_studi)), Count = as.numeric(count_lama_studi))

pie_chart <- ggplot(df_count_lama_studi, aes(x = "", y = Count, fill = factor(Lama_Studi))) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Pie Chart Lama Studi", fill = "Lama Studi") +
  theme_void()

print(pie_chart)

Korelasi Antar variabel

Setelah melihat distribusi variabel kategorik fitur dan label, kita dapat melihat korelasi antar variabel yang bertujuan untuk memahami hubungan antara variabel dan menentukan variabel yang saling berkorelasi.

cor_matrix <- cor(Data_Regresi_Logistik_ORI)
corrplot(cor_matrix, method = "color")

Untuk mempermudah mengambil informasi dari plot korelasi tersebut kita dapat melihat matriks korelasinya

print(cor_matrix)
##               Jenis Kelamin  Jalur Masuk          IP1         IP2         IP3
## Jenis Kelamin    1.00000000 -0.092738903 -0.069356282  0.08040608  0.12649773
## Jalur Masuk     -0.09273890  1.000000000 -0.007946167 -0.03429825 -0.05505378
## IP1             -0.06935628 -0.007946167  1.000000000  0.49451538  0.23237196
## IP2              0.08040608 -0.034298249  0.494515376  1.00000000  0.41810121
## IP3              0.12649773 -0.055053777  0.232371955  0.41810121  1.00000000
## IP4              0.09858893 -0.054511167  0.252825683  0.31907295  0.60750708
## IP5              0.06173762 -0.057675582  0.220424932  0.29410009  0.63179850
## IP6              0.18753489 -0.062148661  0.319544569  0.36558503  0.61990801
## Lama Studi       0.01042325  0.151205431 -0.160319462 -0.16455901 -0.32148371
##                       IP4         IP5         IP6  Lama Studi
## Jenis Kelamin  0.09858893  0.06173762  0.18753489  0.01042325
## Jalur Masuk   -0.05451117 -0.05767558 -0.06214866  0.15120543
## IP1            0.25282568  0.22042493  0.31954457 -0.16031946
## IP2            0.31907295  0.29410009  0.36558503 -0.16455901
## IP3            0.60750708  0.63179850  0.61990801 -0.32148371
## IP4            1.00000000  0.65415099  0.58986133 -0.34590452
## IP5            0.65415099  1.00000000  0.58615464 -0.40997412
## IP6            0.58986133  0.58615464  1.00000000 -0.24863779
## Lama Studi    -0.34590452 -0.40997412 -0.24863779  1.00000000

Terdapat korelasi negatif sedang antara IP5 dan lama studi, menunjukkan bahwa mahasiswa dengan IP5 yang lebih tinggi cenderung menyelesaikan studi mereka lebih cepat. hal ini ditandai dengan warna yang mendekati oranye.

pairs(Data_Regresi_Logistik_ORI)

Deteksi Outlier

Selanjutnya kita dapat melihat adakah outlier atau tidak pada data numerik. Dalam model prediktif, outlier dapat memengaruhi keakuratan dan kestabilan model. Model yang dilatih dengan data yang mengandung outlier mungkin menjadi kurang akurat dalam memprediksi nilai baru.

boxplot_data <- Data_Regresi_Logistik_ORI[, c("IP1", "IP2", "IP3", "IP4", "IP5", "IP6")]
boxplot(boxplot_data)

Berdasarkan dari pengamatan boxplot diatas fitur IP4 dan IP5 memiliki outlier jauh sedangkan fitur lainnya memiliki outlier sedang.

Data Preprocessing

Mengatasi Outlier

Terdapat beberapa cara untuk mengatasi outlier dalam penelitian ini yaitu transformasi, winsorization dan menghapus nilai outlier

  1. Transformasi log

    Data_Regresi_Logistik_ORI$log_IP1 <- log(Data_Regresi_Logistik_ORI$IP1)
    Data_Regresi_Logistik_ORI$log_IP2 <- log(Data_Regresi_Logistik_ORI$IP2)
    Data_Regresi_Logistik_ORI$log_IP3 <- log(Data_Regresi_Logistik_ORI$IP3)
    Data_Regresi_Logistik_ORI$log_IP4 <- log(Data_Regresi_Logistik_ORI$IP4)
    Data_Regresi_Logistik_ORI$log_IP5 <- log(Data_Regresi_Logistik_ORI$IP5)
    Data_Regresi_Logistik_ORI$log_IP6 <- log(Data_Regresi_Logistik_ORI$IP6)
    
    Data_Regresi_Logistik_ORI[, c("log_IP1", "log_IP2", "log_IP3", "log_IP4", "log_IP5", "log_IP6")]
    ## # A tibble: 300 × 6
    ##    log_IP1 log_IP2 log_IP3 log_IP4 log_IP5 log_IP6
    ##      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
    ##  1    1.27    1.15    1.22    1.10    1.24    1.31
    ##  2    1.31    1.28    1.23    1.27    1.13    1.22
    ##  3    1.20    1.23    1.10    1.18    1.12    1.19
    ##  4    1.27    1.28    1.31    1.31    1.24    1.32
    ##  5    1.29    1.11    1.25    1.22    1.29    1.32
    ##  6    1.27    1.20    1.23    1.28    1.12    1.21
    ##  7    1.34    1.34    1.29    1.33    1.31    1.30
    ##  8    1.27    1.16    1.17    1.21    1.21    1.28
    ##  9    1.30    1.30    1.18    1.27    1.25    1.31
    ## 10    1.24    1.22    1.17    1.11    1.24    1.08
    ## # ℹ 290 more rows
    boxplot(Data_Regresi_Logistik_ORI[, c("log_IP1", "log_IP2", "log_IP3", "log_IP4", "log_IP5", "log_IP6")])

  2. Transformasi sqrt

    Data_Regresi_Logistik_ORI$sqrt_IP1 <- sqrt(Data_Regresi_Logistik_ORI$IP1)
    Data_Regresi_Logistik_ORI$sqrt_IP2 <- sqrt(Data_Regresi_Logistik_ORI$IP2)
    Data_Regresi_Logistik_ORI$sqrt_IP3 <- sqrt(Data_Regresi_Logistik_ORI$IP3)
    Data_Regresi_Logistik_ORI$sqrt_IP4 <- sqrt(Data_Regresi_Logistik_ORI$IP4)
    Data_Regresi_Logistik_ORI$sqrt_IP5 <- sqrt(Data_Regresi_Logistik_ORI$IP5)
    Data_Regresi_Logistik_ORI$sqrt_IP6 <- sqrt(Data_Regresi_Logistik_ORI$IP6)
    
    Data_Regresi_Logistik_ORI[, c("sqrt_IP1", "sqrt_IP2", "sqrt_IP3", "sqrt_IP4", "sqrt_IP5", "sqrt_IP6")]
    ## # A tibble: 300 × 6
    ##    sqrt_IP1 sqrt_IP2 sqrt_IP3 sqrt_IP4 sqrt_IP5 sqrt_IP6
    ##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
    ##  1     1.88     1.77     1.84     1.73     1.86     1.92
    ##  2     1.93     1.90     1.85     1.88     1.76     1.84
    ##  3     1.82     1.85     1.73     1.81     1.75     1.82
    ##  4     1.89     1.89     1.93     1.92     1.86     1.93
    ##  5     1.91     1.74     1.87     1.84     1.91     1.94
    ##  6     1.88     1.82     1.85     1.89     1.75     1.83
    ##  7     1.95     1.95     1.91     1.95     1.92     1.91
    ##  8     1.89     1.79     1.80     1.83     1.83     1.89
    ##  9     1.92     1.91     1.80     1.89     1.87     1.93
    ## 10     1.86     1.84     1.80     1.74     1.86     1.72
    ## # ℹ 290 more rows
    boxplot(Data_Regresi_Logistik_ORI[, c("sqrt_IP1", "sqrt_IP2", "sqrt_IP3", "sqrt_IP4", "sqrt_IP5", "sqrt_IP6")])

  3. Transformasi Yeo-Johnson

    kolom_IP <- c("IP1", "IP2", "IP3", "IP4", "IP5", "IP6")
    
    
    for (kolom in kolom_IP) {
      nama_kolom_baru <- paste("yeojohnson_", kolom, sep = "")
      Data_Regresi_Logistik_ORI[[nama_kolom_baru]] <- yjPower(Data_Regresi_Logistik_ORI[[kolom]], lambda = 0.5)
    }
    
    
    Data_Regresi_Logistik_ORI[, c("yeojohnson_IP1", "yeojohnson_IP2", "yeojohnson_IP3", "yeojohnson_IP4", "yeojohnson_IP5", "yeojohnson_IP6")]
    ## # A tibble: 300 × 6
    ##    yeojohnson_IP1 yeojohnson_IP2 yeojohnson_IP3 yeojohnson_IP4 yeojohnson_IP5
    ##             <dbl>          <dbl>          <dbl>          <dbl>          <dbl>
    ##  1           2.27           2.07           2.19           2              2.22
    ##  2           2.34           2.29           2.21           2.27           2.05
    ##  3           2.16           2.20           2              2.13           2.04
    ##  4           2.28           2.28           2.35           2.33           2.22
    ##  5           2.31           2.02           2.24           2.19           2.31
    ##  6           2.27           2.15           2.20           2.28           2.02
    ##  7           2.39           2.38           2.31           2.38           2.34
    ##  8           2.28           2.10           2.11           2.18           2.17
    ##  9           2.32           2.32           2.12           2.27           2.24
    ## 10           2.22           2.20           2.11           2.01           2.22
    ## # ℹ 290 more rows
    ## # ℹ 1 more variable: yeojohnson_IP6 <dbl>
    boxplot(Data_Regresi_Logistik_ORI[, c("yeojohnson_IP1", "yeojohnson_IP2", "yeojohnson_IP3", "yeojohnson_IP4", "yeojohnson_IP5", "yeojohnson_IP6")])

  4. Winsorization

    kolom_IP <- c("IP1", "IP2", "IP3", "IP4", "IP5", "IP6")
    
    for (kolom in kolom_IP) {
      nama_kolom_baru <- paste("winsorized_", kolom, sep = "")
      Data_Regresi_Logistik_ORI[[nama_kolom_baru]] <- Winsorize(Data_Regresi_Logistik_ORI[[kolom]], probs = c(0.05, 0.95))
    }
    
    head(Data_Regresi_Logistik_ORI[, paste("winsorized_", kolom_IP, sep = "")])
    ## # A tibble: 6 × 6
    ##   winsorized_IP1 winsorized_IP2 winsorized_IP3 winsorized_IP4 winsorized_IP5
    ##            <dbl>          <dbl>          <dbl>          <dbl>          <dbl>
    ## 1           3.55           3.15           3.38           3              3.46
    ## 2           3.71           3.6            3.43           3.55           3.1 
    ## 3           3.33           3.42           3              3.27           3.08
    ## 4           3.57           3.59           3.72           3.69           3.46
    ## 5           3.64           3.04           3.5            3.38           3.65
    ## 6           3.55           3.31           3.42           3.59           3.05
    ## # ℹ 1 more variable: winsorized_IP6 <dbl>
    boxplot(Data_Regresi_Logistik_ORI[, paste("winsorized_", kolom_IP, sep = "")])

  5. Hapus nilai Outlier

    remove_outliers <- function(df, columns) {
      for (col in columns) {
        Q1 <- quantile(df[[col]], 0.25)
        Q3 <- quantile(df[[col]], 0.75)
        IQR <- Q3 - Q1
        lower_bound <- Q1 - 1.5 * IQR
        upper_bound <- Q3 + 1.5 * IQR
    
        df <- df %>%
          filter(df[[col]] >= lower_bound & df[[col]] <= upper_bound)
      }
      return(df)
    }
    
    columns_to_check <- c("IP1", "IP2", "IP3", "IP4", "IP5", "IP6")
    
    Data_Regresi_Logistik_ORI_no_outliers <- remove_outliers(Data_Regresi_Logistik_ORI, columns_to_check)
    str(Data_Regresi_Logistik_ORI_no_outliers)
    ## tibble [262 × 33] (S3: tbl_df/tbl/data.frame)
    ##  $ Jenis Kelamin : num [1:262] 1 2 1 2 1 2 1 1 1 1 ...
    ##  $ Jalur Masuk   : num [1:262] 1 2 2 2 2 1 2 2 2 2 ...
    ##  $ IP1           : num [1:262] 3.55 3.71 3.33 3.57 3.64 3.55 3.81 3.57 3.67 3.45 ...
    ##  $ IP2           : num [1:262] 3.15 3.6 3.42 3.59 3.04 3.31 3.8 3.2 3.66 3.4 ...
    ##  $ IP3           : num [1:262] 3.38 3.43 3 3.72 3.5 3.42 3.65 3.23 3.25 3.23 ...
    ##  $ IP4           : num [1:262] 3 3.55 3.27 3.69 3.38 3.59 3.79 3.36 3.56 3.02 ...
    ##  $ IP5           : num [1:262] 3.46 3.1 3.08 3.46 3.65 3.05 3.7 3.34 3.5 3.46 ...
    ##  $ IP6           : num [1:262] 3.7 3.38 3.3 3.73 3.76 3.34 3.66 3.58 3.71 2.95 ...
    ##  $ Lama Studi    : num [1:262] 1 3 3 2 1 3 2 3 3 1 ...
    ##  $ log_IP1       : num [1:262] 1.27 1.31 1.2 1.27 1.29 ...
    ##  $ log_IP2       : num [1:262] 1.15 1.28 1.23 1.28 1.11 ...
    ##  $ log_IP3       : num [1:262] 1.22 1.23 1.1 1.31 1.25 ...
    ##  $ log_IP4       : num [1:262] 1.1 1.27 1.18 1.31 1.22 ...
    ##  $ log_IP5       : num [1:262] 1.24 1.13 1.12 1.24 1.29 ...
    ##  $ log_IP6       : num [1:262] 1.31 1.22 1.19 1.32 1.32 ...
    ##  $ sqrt_IP1      : num [1:262] 1.88 1.93 1.82 1.89 1.91 ...
    ##  $ sqrt_IP2      : num [1:262] 1.77 1.9 1.85 1.89 1.74 ...
    ##  $ sqrt_IP3      : num [1:262] 1.84 1.85 1.73 1.93 1.87 ...
    ##  $ sqrt_IP4      : num [1:262] 1.73 1.88 1.81 1.92 1.84 ...
    ##  $ sqrt_IP5      : num [1:262] 1.86 1.76 1.75 1.86 1.91 ...
    ##  $ sqrt_IP6      : num [1:262] 1.92 1.84 1.82 1.93 1.94 ...
    ##  $ yeojohnson_IP1: num [1:262] 2.27 2.34 2.16 2.28 2.31 ...
    ##  $ yeojohnson_IP2: num [1:262] 2.07 2.29 2.2 2.28 2.02 ...
    ##  $ yeojohnson_IP3: num [1:262] 2.19 2.21 2 2.35 2.24 ...
    ##  $ yeojohnson_IP4: num [1:262] 2 2.27 2.13 2.33 2.19 ...
    ##  $ yeojohnson_IP5: num [1:262] 2.22 2.05 2.04 2.22 2.31 ...
    ##  $ yeojohnson_IP6: num [1:262] 2.34 2.19 2.15 2.35 2.36 ...
    ##  $ winsorized_IP1: num [1:262] 3.55 3.71 3.33 3.57 3.64 3.55 3.79 3.57 3.67 3.45 ...
    ##  $ winsorized_IP2: num [1:262] 3.15 3.6 3.42 3.59 3.04 3.31 3.71 3.2 3.66 3.4 ...
    ##  $ winsorized_IP3: num [1:262] 3.38 3.43 3 3.72 3.5 3.42 3.65 3.23 3.25 3.23 ...
    ##  $ winsorized_IP4: num [1:262] 3 3.55 3.27 3.69 3.38 3.59 3.79 3.36 3.56 3.02 ...
    ##  $ winsorized_IP5: num [1:262] 3.46 3.1 3.08 3.46 3.65 3.05 3.7 3.34 3.5 3.46 ...
    ##  $ winsorized_IP6: num [1:262] 3.7 3.38 3.3 3.73 3.76 3.34 3.66 3.58 3.71 2.95 ...

Berdasarkan hasil penanganan outlier dengan berbagai metode kami dapat menyimpulkan bahwa metode Winsorization dan metode penghapusan outlier merupakan metode yang cukup baik dalam menghadapi outlier. OIeh karena itu kedua teknik tersebut akan digunakan untuk perbandingan pemodelan. Kita dapat membuat dataframe untuk teknik winsorization dan hapus outlier untuk mempermudah pemodelan.

Data_Regresi_Logistik_winsorization <- tibble(
  Jenis_Kelamin = Data_Regresi_Logistik_ORI$`Jenis Kelamin`,
  Jalur_Masuk = Data_Regresi_Logistik_ORI$`Jalur Masuk`,
  winsorized_IP1 = Data_Regresi_Logistik_ORI$winsorized_IP1,
  winsorized_IP2 = Data_Regresi_Logistik_ORI$winsorized_IP2,
  winsorized_IP3 = Data_Regresi_Logistik_ORI$winsorized_IP3,
  winsorized_IP4 = Data_Regresi_Logistik_ORI$winsorized_IP4,
  winsorized_IP5 = Data_Regresi_Logistik_ORI$winsorized_IP5,
  winsorized_IP6 = Data_Regresi_Logistik_ORI$winsorized_IP6,
  Lama_Studi = Data_Regresi_Logistik_ORI$`Lama Studi`
)

str(Data_Regresi_Logistik_winsorization)
## tibble [300 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Jenis_Kelamin : num [1:300] 1 2 1 2 1 2 1 1 1 1 ...
##  $ Jalur_Masuk   : num [1:300] 1 2 2 2 2 1 2 2 2 2 ...
##  $ winsorized_IP1: num [1:300] 3.55 3.71 3.33 3.57 3.64 3.55 3.79 3.57 3.67 3.45 ...
##  $ winsorized_IP2: num [1:300] 3.15 3.6 3.42 3.59 3.04 3.31 3.71 3.2 3.66 3.4 ...
##  $ winsorized_IP3: num [1:300] 3.38 3.43 3 3.72 3.5 3.42 3.65 3.23 3.25 3.23 ...
##  $ winsorized_IP4: num [1:300] 3 3.55 3.27 3.69 3.38 3.59 3.79 3.36 3.56 3.02 ...
##  $ winsorized_IP5: num [1:300] 3.46 3.1 3.08 3.46 3.65 3.05 3.7 3.34 3.5 3.46 ...
##  $ winsorized_IP6: num [1:300] 3.7 3.38 3.3 3.73 3.76 3.34 3.66 3.58 3.71 2.95 ...
##  $ Lama_Studi    : num [1:300] 1 3 3 2 1 3 2 3 3 1 ...
Data_Regresi_Logistik_nooutlier <- tibble(
  Jenis_Kelamin = Data_Regresi_Logistik_ORI$`Jenis Kelamin`,
  Jalur_Masuk = Data_Regresi_Logistik_ORI$`Jalur Masuk`,
  IP1 = Data_Regresi_Logistik_ORI$IP1,
  IP2 = Data_Regresi_Logistik_ORI$IP2,
  IP3 = Data_Regresi_Logistik_ORI$IP3,
  IP4 = Data_Regresi_Logistik_ORI$IP4,
  IP5 = Data_Regresi_Logistik_ORI$IP5,
  IP6 = Data_Regresi_Logistik_ORI$IP6,
  Lama_Studi = Data_Regresi_Logistik_ORI$`Lama Studi`
)

str(Data_Regresi_Logistik_nooutlier)
## tibble [300 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Jenis_Kelamin: num [1:300] 1 2 1 2 1 2 1 1 1 1 ...
##  $ Jalur_Masuk  : num [1:300] 1 2 2 2 2 1 2 2 2 2 ...
##  $ IP1          : num [1:300] 3.55 3.71 3.33 3.57 3.64 3.55 3.81 3.57 3.67 3.45 ...
##  $ IP2          : num [1:300] 3.15 3.6 3.42 3.59 3.04 3.31 3.8 3.2 3.66 3.4 ...
##  $ IP3          : num [1:300] 3.38 3.43 3 3.72 3.5 3.42 3.65 3.23 3.25 3.23 ...
##  $ IP4          : num [1:300] 3 3.55 3.27 3.69 3.38 3.59 3.79 3.36 3.56 3.02 ...
##  $ IP5          : num [1:300] 3.46 3.1 3.08 3.46 3.65 3.05 3.7 3.34 3.5 3.46 ...
##  $ IP6          : num [1:300] 3.7 3.38 3.3 3.73 3.76 3.34 3.66 3.58 3.71 2.95 ...
##  $ Lama_Studi   : num [1:300] 1 3 3 2 1 3 2 3 3 1 ...

Multinomial Logistic Regression From Scratch

Untuk lebih memahami bagaimana multinomial logistic regression bekerja dalam matematika, mari kita breakdown satu per satu

  1. Fungsi Softmax

    Fungsi softmax digunakan untuk menghitung probabilitas masing-masing kelas. Misalkan kita memiliki 𝐾 kelas, dan kita ingin memprediksi probabilitas bahwa suatu pengamatan 𝑖 termasuk dalam kelas 𝑘 (di mana 𝑘∈{1,2,…,𝐾}).

    softmax <- function(z) {
      exp_z <- exp(z)
      return(exp_z / sum(exp_z))
    }

\[ P(y_i = k \mid \mathbf{x}_i) = \frac{\exp(z_k)}{\sum_{j=1}^{K} \exp(z_j)} \]

Dimana :

- \((P(y_i = k \mid \mathbf{x}_i))\) adalah probabilitas bahwa pengamatan \((i)\) termasuk dalam kelas \((k)\) diberikan fitur \((\mathbf{x}_i)\). - \((z_k = \mathbf{x}_i^\top \mathbf{\beta}_k)\) adalah skor atau logit untuk kelas \((k)\). - \((K)\) adalah jumlah total kelas. - \((\mathbf{x}_i)\) adalah vektor fitur untuk pengamatan \((i)\). - \((\mathbf{\beta}_k)\) adalah vektor koefisien untuk kelas \((k)\).

  1. Fungsi Inisialisasi Parameter

    initialize_parameters <- function(n_features, n_classes) {
      return(matrix(rnorm(n_features * n_classes), nrow = n_features, ncol = n_classes))
    }

    Dalam konteks regresi logistik multinomial, matriks parameter 𝑊 berukura 𝑛features × 𝑛classes​, di mana 𝑛features adalah jumlah fitur dan 𝑛classes​ adalah jumlah kelas. Setiap elemen

    𝑤𝑖𝑗​ dari matriks ini diinisialisasi dengan nilai acak yang diambil dari distribusi normal standar (𝑁(0,1).

    \[ \mathbf{W} = \begin{bmatrix} w_{11} & w_{12} & \cdots & w_{1n_{\text{classes}}} \\ w_{21} & w_{22} & \cdots & w_{2n_{\text{classes}}} \\ \vdots & \vdots & \ddots & \vdots \\ w_{n_{\text{features}}1} & w_{n_{\text{features}}2} & \cdots & w_{n_{\text{features}}n_{\text{classes}}} \end{bmatrix} \]

  2. Fungsi Prediksi

    predict_multinomial <- function(parameters, X) {
      return(softmax(X %*% parameters))
    }

    Fungsi ‘predict_multinomial’ menggunakan matriks parameter dan fitur untuk memprediksi probabilitas kelas dalam model regresi logistik multinomial. Dengan menggunakan softmax, probabilitas kelas dapat dihitung berdasarkan skor atau logit yang dihasilkan oleh kombinasi linear dari fitur dan matriks parameter.

  3. Fungsi training dengan Gradient Descent dan regularisasi L2

    Fungsi ‘train_multinomial_regularized’ digunakan untuk melatih model regresi logistik multinomial dengan menggunakan algoritma gradient descent dengan regularisasi L2. Persamaan loss yang dimodifikasi termasuk komponen regularisasi L2 untuk mencegah overfitting.

    train_multinomial_regularized <- function(X, y, learning_rate = 0.005, epochs = 1000, lambda = 0.01) {
      n_samples <- nrow(X)
      n_features <- ncol(X)
      n_classes <- nlevels(y)
      y <- as.matrix(model.matrix(~y - 1))
      parameters <- initialize_parameters(n_features, n_classes)
    
      for (i in 1:epochs) {
        scores <- predict_multinomial(parameters, X)
        loss <- -sum(y * log(scores)) / n_samples + lambda * sum(parameters^2) / 2
        gradient <- t(X) %*% (scores - y) / n_samples + lambda * parameters
    
        # Backpropagation
        # Lakukan penyesuaian bobot dan bias menggunakan gradient
        parameters <- parameters - learning_rate * gradient
    
        if (i %% 100 == 0) {
          cat("Epoch", i, "Loss:", loss, "\n")
        }
      }
    
      return(parameters)
    }

    \[ Loss = -\frac{1}{N} \sum_{i=1}^{N} \sum_{k=1}^{K} y_{ik} \log(\hat{y}_{ik}) + \frac{\lambda}{2} \sum_{i=1}^{n_{\text{features}}} \sum_{j=1}^{n_{\text{classes}}} w_{ij}^2 \]

    Dimana :

    • N adalah jumlah sampel data.

    • 𝐾 adalah jumlah kelas.

    • 𝑦𝑖𝑘 adalah probabilitas kelas yang benar untuk sampel 𝑖 dan kelas 𝑘.

    • 𝑦^𝑖𝑘​ adalah probabilitas yang diprediksi oleh model untuk sampel 𝑖 dan kelas 𝑘.

    • 𝜆 adalah parameter regularisasi.

    • 𝑤𝑖𝑗​ adalah parameter model untuk fitur 𝑖 dan kelas 𝑗.

Setelah kita mengetahui konteks matematika di dalam multinomial logistic regression kita dapat menggunakan algoritma tersebut untuk melakukan prediksi. Sebelum itu kami melakukan beberapa penyesuaian pada data sebelum pemodelan seperti:

  • One - Hot Encoding

  • Train - Test Split

Setelah melakukan penyesuaian ini kami melanjutkan ke pemodelan dengan 2 metode berbeda yaitu:

  1. Multinomial Logistic Regression from Scratch using Winsorization Method

    X_categorical <- Data_Regresi_Logistik_winsorization[, c("Jenis_Kelamin", "Jalur_Masuk")]
    X_categorical <- model.matrix(~ . - 1, data = X_categorical)
    X_numeric <- Data_Regresi_Logistik_winsorization[, c("winsorized_IP1", "winsorized_IP2", "winsorized_IP3", "winsorized_IP4", "winsorized_IP5", "winsorized_IP6")]
    X <- cbind(X_categorical, X_numeric)
    y <- as.factor(Data_Regresi_Logistik_winsorization$Lama_Studi)
    # Membagi data menjadi data latih dan data uji
    set.seed(123)
    train_indices <- createDataPartition(y, p = 0.8, list = FALSE)
    X_train <- X[train_indices, ]
    y_train <- y[train_indices]
    X_test <- X[-train_indices, ]
    y_test <- y[-train_indices]
    
    # Training model
    parameters <- train_multinomial_regularized(as.matrix(X_train), y_train)
    ## Epoch 100 Loss: 12.23161 
    ## Epoch 200 Loss: 19.5958 
    ## Epoch 300 Loss: 27.36343 
    ## Epoch 400 Loss: 35.38293 
    ## Epoch 500 Loss: 43.57818 
    ## Epoch 600 Loss: 51.90581 
    ## Epoch 700 Loss: 60.3391 
    ## Epoch 800 Loss: 68.86059 
    ## Epoch 900 Loss: 77.45832 
    ## Epoch 1000 Loss: 86.12374
    # Prediksi untuk data uji
    y_pred <- predict_multinomial(parameters, as.matrix(X_test))
    
    # Fungsi evaluasi akurasi
    evaluate_accuracy <- function(y_true, y_pred) {
      correct_predictions <- sum(y_true == y_pred)
      total_predictions <- length(y_true)
      accuracy <- correct_predictions / total_predictions
      return(accuracy)
    }
    
    # Mendapatkan kelas prediksi dengan probabilitas tertinggi
    y_pred_class <- apply(y_pred, 1, which.max)
    
    # Evaluasi akurasi
    accuracy <- evaluate_accuracy(y_test, y_pred_class)
    accuracy
    ## [1] 0.6949153
  2. Multinomial Logistic Regression from Scratch using Delete Outliers Method

    X_categorical <- Data_Regresi_Logistik_nooutlier[, c("Jenis_Kelamin", "Jalur_Masuk")]
    X_categorical <- model.matrix(~ . - 1, data = X_categorical)
    X_numeric <- Data_Regresi_Logistik_nooutlier[, c("IP1", "IP2", "IP3", "IP4", "IP5", "IP6")]
    X <- cbind(X_categorical, X_numeric)
    y <- as.factor(Data_Regresi_Logistik_nooutlier$Lama_Studi)
    # Membagi data menjadi data latih dan data uji
    set.seed(123)
    train_indices <- createDataPartition(y, p = 0.8, list = FALSE)
    X_train <- X[train_indices, ]
    y_train <- y[train_indices]
    X_test <- X[-train_indices, ]
    y_test <- y[-train_indices]
    
    # Training model
    parameters <- train_multinomial_regularized(as.matrix(X_train), y_train)
    ## Epoch 100 Loss: 12.38065 
    ## Epoch 200 Loss: 19.90745 
    ## Epoch 300 Loss: 27.8395 
    ## Epoch 400 Loss: 36.00469 
    ## Epoch 500 Loss: 44.32348 
    ## Epoch 600 Loss: 52.75617 
    ## Epoch 700 Loss: 61.28151 
    ## Epoch 800 Loss: 69.88703 
    ## Epoch 900 Loss: 78.56468 
    ## Epoch 1000 Loss: 87.30861
    # Prediksi untuk data uji
    y_pred <- predict_multinomial(parameters, as.matrix(X_test))
    
    # Fungsi evaluasi akurasi
    evaluate_accuracy <- function(y_true, y_pred) {
      correct_predictions <- sum(y_true == y_pred)
      total_predictions <- length(y_true)
      accuracy <- correct_predictions / total_predictions
      return(accuracy)
    }
    
    # Mendapatkan kelas prediksi dengan probabilitas tertinggi
    y_pred_class <- apply(y_pred, 1, which.max)
    
    # Evaluasi akurasi
    accuracy <- evaluate_accuracy(y_test, y_pred_class)
    accuracy
    ## [1] 0.6949153

Kemungkinan besar, kedua teknik preprocessing yang kami lakukan, yaitu Winsorization dan penghapusan outlier, tidak memberikan dampak yang signifikan pada akurasi model. Ini bisa disebabkan oleh beberapa faktor:

  1. Pengaruh Outlier yang Terbatas: Outlier mungkin tidak memiliki pengaruh yang signifikan pada model. Terkadang, outlier hanya memiliki dampak kecil pada statistik keseluruhan dan tidak mempengaruhi model secara signifikan.

  2. Fitur yang Tidak Sensitif terhadap Outlier: Fitur-fitur dalam data mungkin tidak sensitif terhadap outlier. Dengan kata lain, nilai outlier pada fitur-fitur tersebut tidak secara signifikan mempengaruhi prediksi model.

  3. Penyesuaian Parameter: Regularisasi L2 yang terapkan selama pelatihan model juga dapat membantu dalam menangani overfitting yang mungkin disebabkan oleh keberadaan outlier. Regularisasi ini dapat membantu dalam mencegah parameter model menjadi terlalu besar, yang dapat terjadi ketika terdapat outlier dalam data.

  4. Ukuran Sampel: Ukuran sampel yang relatif kecil dalam set data mungkin membuat efek dari teknik preprocessing tidak terlalu terlihat dalam hasil akhir.

Akurasi dapat memberikan gambaran umum tentang kinerja model, itu tidak selalu memberikan gambaran lengkap. Perlu mempertimbangkan metrik evaluasi lainnya dan melakukan validasi silang untuk mendapatkan pemahaman yang lebih baik tentang kinerja model.

Multinomial Logistic Regression Using ‘nnet’ Packages

Selain menggunakan algoritma yang dibuat sendiri, kami juga menggunakan algoritma yang telah dibuat seperti packages nnet yang menyediakan fungsi multinom() untuk melakukan multinomial logistic regression.

  1. Multinomial Logistic Regression nnet using Winsorization Method

    Data_Regresi_Logistik_winsorization$Lama_Studi <- as.factor(Data_Regresi_Logistik_winsorization$Lama_Studi)
    
    set.seed(42)
    sample_size <- floor(0.8 * nrow(Data_Regresi_Logistik_winsorization))
    train_indices <- sample(seq_len(nrow(Data_Regresi_Logistik_winsorization)), size = sample_size)
    
    
    train_data <- Data_Regresi_Logistik_winsorization[train_indices, ]
    test_data <- Data_Regresi_Logistik_winsorization[-train_indices, ]
    
    model <- multinom(Lama_Studi ~ Jenis_Kelamin + Jalur_Masuk + winsorized_IP1 + winsorized_IP2 + winsorized_IP3 + winsorized_IP4 + winsorized_IP5 + winsorized_IP6, data = train_data)
    ## # weights:  30 (18 variable)
    ## initial  value 263.666949 
    ## iter  10 value 132.084519
    ## iter  20 value 125.024719
    ## iter  30 value 125.022099
    ## final  value 125.021964 
    ## converged
    predicted_classes <- predict(model, test_data)
    predicted_classes
    ##  [1] 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 2 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 2 3
    ## [39] 3 3 2 3 3 3 2 3 3 3 2 3 3 3 3 3 3 3 3 2 2 2
    ## Levels: 1 2 3
    comparison_df <- data.frame(
      Actual = test_data$Lama_Studi,
      Predicted = predicted_classes
    )
    
    confusion_matrix <- table(Predicted = predicted_classes, Actual = test_data$Lama_Studi)
    
    
    accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
    print(paste("Accuracy:", accuracy))
    ## [1] "Accuracy: 0.866666666666667"
  2. Multinomial Logistic Regression nnet using Delete Outliers Method

    Data_Regresi_Logistik_nooutlier$Lama_Studi <- as.factor(Data_Regresi_Logistik_nooutlier$Lama_Studi)
    
    set.seed(42)
    sample_size <- floor(0.8 * nrow(Data_Regresi_Logistik_nooutlier))
    train_indices <- sample(seq_len(nrow(Data_Regresi_Logistik_nooutlier)), size = sample_size)
    
    
    train_data <- Data_Regresi_Logistik_nooutlier[train_indices, ]
    test_data <- Data_Regresi_Logistik_nooutlier[-train_indices, ]
    
    model <- multinom(Lama_Studi ~ Jenis_Kelamin + Jalur_Masuk + IP1 + IP2 + IP3 + IP4 + IP5 + IP6, data = train_data)
    ## # weights:  30 (18 variable)
    ## initial  value 263.666949 
    ## iter  10 value 132.743205
    ## iter  20 value 126.783983
    ## iter  30 value 126.780444
    ## final  value 126.780423 
    ## converged
    predicted_classes <- predict(model, test_data)
    predicted_classes
    ##  [1] 3 3 2 3 3 3 3 3 3 3 2 1 3 3 3 3 2 3 3 2 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 2 3
    ## [39] 3 3 2 3 3 3 2 3 3 3 2 3 3 3 3 3 3 3 3 2 2 2
    ## Levels: 1 2 3
    comparison_df <- data.frame(
      Actual = test_data$Lama_Studi,
      Predicted = predicted_classes
    )
    
    confusion_matrix <- table(Predicted = predicted_classes, Actual = test_data$Lama_Studi)
    
    
    accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
    print(paste("Accuracy:", accuracy))
    ## [1] "Accuracy: 0.85"

    Dapat terlihat bahwa sejauh ini akurasi terbaik didapatkan dari teknik Winsorization dengan menggunakan analisis package ‘nnet’ dengan nilai akurasi 86,6%.

    Perbedaan dalam hasil akurasi antara model yang kami buat sendiri dan model yang diimplementasikan menggunakan algoritma nnet::multinom mungkin disebabkan oleh beberapa faktor:

    1. Penyetelan Parameter: Algoritma nnet::multinom memiliki parameter bawaan yang telah ditetapkan secara default. Perbedaan dalam penyetelan parameter, seperti tingkat pembelajaran, jumlah iterasi, dan metode optimasi, dapat mempengaruhi kinerja model secara signifikan.

    2. Fitur-fitur Preprocessing: Model yang dibuat sendiri mungkin menggunakan teknik preprocessing atau pemrosesan data yang berbeda dibandingkan dengan model nnet::multinom. Perbedaan dalam cara menangani fitur kategorikal, normalisasi, atau penghapusan outlier dapat memengaruhi hasil akhir.

    3. Penanganan Data yang Berbeda: Algoritma nnet::multinom mungkin memiliki cara yang berbeda dalam menangani data yang tidak seimbang atau data yang memiliki banyak nilai yang hilang.

    4. Algoritma Optimasi yang Berbeda: Algoritma optimasi yang digunakan oleh nnet::multinom mungkin berbeda dengan algoritma optimasi yang gunakan. Perbedaan ini dapat mempengaruhi cara model menyesuaikan parameter dan mencapai konvergensi.

    5. Kompleksitas Model: Model yang buat sendiri mungkin memiliki arsitektur yang berbeda atau tingkat kompleksitas yang berbeda dibandingkan dengan model nnet::multinom. Ini bisa berarti bahwa model lebih atau kurang mampu menangkap pola dalam data.

Kesimpulan

Berdasarkan analisis yang telah dilakukan, dapat diperoleh kesimpulan sebagai berikut.
1. Berdasarkan plot distribusi normal, terlihat bahwa variabel IP 1 hingga IP 6 memiliki kurva yang tidak berbentuk seperti lonceng, sehingga data tidak berdistribusi normal.
2. Berdasarkan output korelasi, terlihat bahwa terdapat korelasi negatif sedang antara IP5 dan lama studi.
3. Berdasarkan boxplot, terlihat bahwa IP 4 dan IP 5 memiliki outliers jauh, sedangkan variabel lainnya memiliki outliers sedang.
4. Dengan uji asumsi regresi logistik multinomial, dihasilkan bahwa model regresi tidak memenuhi asumsi regresi logistik multinomial. Akan tetapi, setelah dilakukan metode winsorization dan menghapus outliers, asumsi regresi logistik multinomial sudah terpenuhi.
5. Berdasarkan analisis regresi logistik multinomial menggunakan metode Winsorization, didapatkan nilai akurasi sebesar 86,6%. Sedangkan analisis regresi logistik multinomial menggunakan metode penghapusan outliers, didapatkan nilai akurasi sebesar 85%. Sehingga metode terbaik merupakan metode Winsorization.

Referensi

Amazon Web Services. 2023. “Apa itu regresi logistic?”. https://aws.amazon.com/id/what-is/logistic-regression/. Diakses pada Senin, 20 Mei 2024.

Subekti, P. (2013) Model Regresi Logistik Multinomial.

Tampil, Y., Komaliq, H., & Langi, Y. (2017). Analisis Regresi Logistik Untuk Menentukan Faktor-Faktor Yang Mempengaruhi Indeks Prestasi Kumulatif (IPK) Mahasiswa FMIPA Universitas Sam Ratulangi Manado. d’CARTESIAN: Jurnal Matematika dan Aplikasi, 6(2), 56-62.