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}\]
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 \]
Adapun langkah-langkah yang dilakukan untuk melakukan analisis regresi logistik, yaitu sebagai berikut.
Melakukan uji asumsi regresi logistik multinomial.
Mengimport package dan mengimport dataset.
Melakukan eksplorasi data berupa statistic deskriptif, plot distribusi, korelasi antarvariabel dan mendeteksi outliers.
Melakukan data preprocessing untuk mengatasi outliers.
Melakukan analisis regresi logistik multinomial dengan package ‘nnet’.
Menarik kesimpulan.
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)
Beberapa asumsi yang harus dipenuhi dalam multinomial regresi logistik antara lain:
Tidak membutuhkan hubungan linear antara variabel independen dengan variabel dependen
Variabel independen tidak memerlukan asumsi multivariate normality
Asumsi homoskedastisitas tidak diperlukan
Variabel bebas tidak perlu diubah ke dalam bentuk metrik (interval atau skala ratio)
Variabel dependen harus bersifat dikotomi (2 kategori)
Variabel independen tidak harus memiliki keragaman yang sama antar kelompok variabel
Kategori dalam variabel independen harus teripsah satu sama lain atau bersifat eksklusif
Sampel yang diperlukan dalam jumlah relatif besar
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.
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 ...
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
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.
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")
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)
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)
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.
Terdapat beberapa cara untuk mengatasi outlier dalam penelitian ini yaitu transformasi, winsorization dan menghapus nilai outlier
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")])
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")])
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")])
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 = "")])
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 ...
Untuk lebih memahami bagaimana multinomial logistic regression bekerja dalam matematika, mari kita breakdown satu per satu
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)\).
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} \]
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.
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:
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.6949153Multinomial 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.6949153Kemungkinan 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:
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.
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.
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.
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.
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.
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"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:
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.
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.
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.
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.
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.
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.
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.