## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ 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
## corrplot 0.95 loaded
##
## Attaching package: 'naniar'
##
## The following object is masked from 'package:skimr':
##
## n_complete
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
##
## Loaded glmnet 5.0
data <- read.csv("D:\\Download\\student_placement_salary_elite_v2.csv")
# Melihat dimensi data
dim(data)## [1] 9000 20
## 'data.frame': 9000 obs. of 20 variables:
## $ student_id : chr "S0" "S1" "S2" "S3" ...
## $ cgpa : num 6.87 6.52 5.33 6.04 6.78 9.57 8.85 8.78 6.78 7.59 ...
## $ branch : chr "Civil" "Civil" "IT" "Civil" ...
## $ college_tier : int 1 2 1 3 2 1 3 1 3 2 ...
## $ python_skill : int 1 1 1 1 0 1 1 0 1 1 ...
## $ dsa_skill : int 1 0 1 0 1 0 1 0 0 0 ...
## $ ml_skill : int 0 0 1 1 0 0 0 0 0 1 ...
## $ web_dev_skill : int 0 1 0 0 1 0 0 0 0 1 ...
## $ coding_score : num 15.6 13.9 9.8 39.5 7.5 66.9 10.8 93 35.3 25.2 ...
## $ communication_score: num 4.3 5.8 8.1 9.6 9.9 8 4.2 8.8 5.8 7 ...
## $ aptitude_score : num 92 62 66.4 83.6 86.3 75.5 78.2 78 49.9 58.1 ...
## $ internships : int 1 1 0 0 0 0 0 2 1 0 ...
## $ projects : int 3 6 5 6 3 3 4 4 6 1 ...
## $ backlogs : int 0 0 1 0 0 0 2 0 0 0 ...
## $ resume_score : num 62.6 77.5 76 74.3 66.8 45.2 50.1 65.6 63.6 60.8 ...
## $ skill_score : int 2 2 3 2 2 1 2 0 1 3 ...
## $ placed : int 1 1 1 1 1 1 0 1 1 1 ...
## $ company_type : chr "MNC" "MNC" "MNC" "MNC" ...
## $ job_role : chr "Software Engineer" "Data Scientist" "Software Engineer" "Software Engineer" ...
## $ salary_lpa : num 63.5 75.2 80.4 72.1 67 ...
Keberhasilan mahasiswa dalam memperoleh pekerjaan setelah lulus menjadi salah satu indikator kesiapan mereka untuk memasuki dunia kerja. Selain prestasi akademik, peluang memperoleh pekerjaan juga dipengaruhi oleh berbagai faktor seperti keterampilan teknis, kemampuan komunikasi, pengalaman magang, pengalaman proyek, dan kualitas resume. Oleh karena itu, diperlukan analisis untuk memahami faktor-faktor yang berperan dalam keberhasilan placement mahasiswa.
Dataset yang digunakan dalam penelitian ini merupakan dataset simulasi yang dirancang menyerupai kondisi nyata proses rekrutmen kerja. Dataset mencakup informasi mengenai profil akademik, keterampilan teknis, pengalaman, status placement, dan gaji mahasiswa. Dengan karakteristik tersebut, dataset ini dapat digunakan untuk melakukan Exploratory Data Analysis (EDA) dan feature engineering guna mengidentifikasi faktor-faktor yang memengaruhi keberhasilan placement serta mendukung pengembangan model machine learning pada tahap selanjutnya.
Dataset yang digunakan dalam project ini adalah Student Placement and Salary Dataset yang diperoleh dari platform Kaggle. Dataset ini dirancang untuk merepresentasikan kondisi nyata proses placement mahasiswa dengan mempertimbangkan berbagai faktor yang memengaruhi peluang memperoleh pekerjaan dan tingkat gaji yang diterima.
Dataset memuat informasi mengenai aspek akademik, keterampilan teknis, pengalaman, serta hasil placement mahasiswa, seperti CGPA, kemampuan pemrograman, kemampuan komunikasi, jumlah magang, jumlah proyek, kualitas resume, status placement, dan salary. Dengan karakteristik tersebut, dataset ini relevan digunakan untuk melakukan Exploratory Data Analysis (EDA) dan feature engineering guna mengidentifikasi faktor-faktor yang berpengaruh terhadap keberhasilan placement mahasiswa.
Dataset Student Placement and Salary Dataset terdiri dari 9.000 observasi
## [1] 9000 20
di mana setiap observasi merepresentasikan satu mahasiswa. Jumlah data yang cukup besar ini memungkinkan analisis dilakukan secara lebih representatif sehingga pola dan karakteristik data dapat diamati.
Dataset Student Placement and Salary Dataset terdiri atas 9.000 observasi dan 26 variabel.
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
variabel <- data.frame(
"No" = 1:20,
"Nama Variabel" = c(
"student_id",
"cgpa",
"branch",
"college_tier",
"python_skill",
"dsa_skill",
"ml_skill",
"web_dev_skill",
"coding_score",
"communication_score",
"aptitude_score",
"internships",
"projects",
"backlogs",
"resume_score",
"skill_score",
"placed",
"company_type",
"job_role",
"salary_lpa"
),
"Tipe Data" = c(
"Karakter",
"Numerik",
"Karakter",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Numerik",
"Karakter",
"Karakter",
"Numerik"
),
"Keterangan" = c(
"ID unik setiap mahasiswa",
"Indeks Prestasi Kumulatif (CGPA)",
"Jurusan atau program studi mahasiswa",
"Kategori kualitas perguruan tinggi",
"Skor kemampuan Python",
"Skor kemampuan Data Structures and Algorithms (DSA)",
"Skor kemampuan Machine Learning",
"Skor kemampuan Web Development",
"Skor kemampuan coding",
"Skor kemampuan komunikasi",
"Skor kemampuan aptitude atau penalaran",
"Jumlah pengalaman magang",
"Jumlah proyek yang pernah dikerjakan",
"Jumlah mata kuliah yang harus diulang",
"Skor kualitas resume",
"Skor gabungan kemampuan teknis",
"Status placement (1 = diterima kerja, 0 = tidak diterima)",
"Jenis perusahaan yang menerima mahasiswa",
"Posisi pekerjaan yang diperoleh",
"Gaji yang diperoleh (LPA)"
),
check.names = FALSE
)
kable(
variabel,
caption = "Deskripsi Variabel Student Placement and Salary Dataset",
align = "c"
) %>%
kable_styling(full_width = FALSE) %>%
row_spec(0, align = "c")| No | Nama Variabel | Tipe Data | Keterangan |
|---|---|---|---|
| 1 | student_id | Karakter | ID unik setiap mahasiswa |
| 2 | cgpa | Numerik | Indeks Prestasi Kumulatif (CGPA) |
| 3 | branch | Karakter | Jurusan atau program studi mahasiswa |
| 4 | college_tier | Numerik | Kategori kualitas perguruan tinggi |
| 5 | python_skill | Numerik | Skor kemampuan Python |
| 6 | dsa_skill | Numerik | Skor kemampuan Data Structures and Algorithms (DSA) |
| 7 | ml_skill | Numerik | Skor kemampuan Machine Learning |
| 8 | web_dev_skill | Numerik | Skor kemampuan Web Development |
| 9 | coding_score | Numerik | Skor kemampuan coding |
| 10 | communication_score | Numerik | Skor kemampuan komunikasi |
| 11 | aptitude_score | Numerik | Skor kemampuan aptitude atau penalaran |
| 12 | internships | Numerik | Jumlah pengalaman magang |
| 13 | projects | Numerik | Jumlah proyek yang pernah dikerjakan |
| 14 | backlogs | Numerik | Jumlah mata kuliah yang harus diulang |
| 15 | resume_score | Numerik | Skor kualitas resume |
| 16 | skill_score | Numerik | Skor gabungan kemampuan teknis |
| 17 | placed | Numerik | Status placement (1 = diterima kerja, 0 = tidak diterima) |
| 18 | company_type | Karakter | Jenis perusahaan yang menerima mahasiswa |
| 19 | job_role | Karakter | Posisi pekerjaan yang diperoleh |
| 20 | salary_lpa | Numerik | Gaji yang diperoleh (LPA) |
Secara keseluruhan, dataset ini terdiri atas 17 variabel numerik dan 3 variabel kategorikal, yaitu student_id, branch, company_type, dan job_role. Variabel numerik mencakup informasi akademik, keterampilan teknis, pengalaman, kualitas resume, status placement, serta gaji mahasiswa.
Analisis ini bertujuan untuk memperoleh pemahaman yang lebih mendalam mengenai karakteristik mahasiswa berdasarkan aspek akademik, keterampilan, pengalaman, serta hasil placement yang diperoleh. Tahap awal analisis dilakukan melalui Exploratory Data Analysis (EDA) untuk mengkaji distribusi data, hubungan antarvariabel, serta mendeteksi keberadaan missing value dan outlier yang dapat memengaruhi kualitas data.
Selanjutnya, dilakukan proses feature engineering untuk menghasilkan fitur-fitur baru yang mampu merepresentasikan informasi penting secara lebih efektif. Analisis juga dilanjutkan dengan feature selection guna menentukan variabel yang paling relevan dan mengurangi variabel yang kurang berkontribusi terhadap analisis. Selain itu, diterapkan Principal Component Analysis (PCA) sebagai metode reduksi dimensi untuk menyederhanakan struktur data dengan tetap mempertahankan sebagian besar informasi yang terkandung di dalamnya.
Statistika deskriptif dilakukan untuk memberikan gambaran umum mengenai karakteristik setiap variabel dalam dataset. Analisis ini mencakup ukuran pemusatan dan penyebaran data, seperti nilai minimum, maksimum, rata-rata, median, dan kuartil, sehingga dapat membantu memahami pola distribusi data secara keseluruhan.
## cgpa college_tier python_skill dsa_skill
## Min. : 5.000 Min. :1.000 Min. :0.0000 Min. :0.0000
## 1st Qu.: 6.258 1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:0.0000
## Median : 7.500 Median :2.000 Median :1.0000 Median :1.0000
## Mean : 7.507 Mean :2.012 Mean :0.6501 Mean :0.5556
## 3rd Qu.: 8.750 3rd Qu.:3.000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :10.000 Max. :3.000 Max. :1.0000 Max. :1.0000
## ml_skill web_dev_skill coding_score communication_score
## Min. :0.0000 Min. :0.0000 Min. : 0.00 Min. : 4.000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.: 24.90 1st Qu.: 5.500
## Median :0.0000 Median :0.0000 Median : 49.60 Median : 7.000
## Mean :0.2998 Mean :0.3934 Mean : 49.78 Mean : 6.991
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.: 74.62 3rd Qu.: 8.500
## Max. :1.0000 Max. :1.0000 Max. :100.00 Max. :10.000
## aptitude_score internships projects backlogs
## Min. : 40.00 Min. :0.000 Min. :1.000 Min. :0.0000
## 1st Qu.: 54.80 1st Qu.:0.000 1st Qu.:2.000 1st Qu.:0.0000
## Median : 70.30 Median :1.000 Median :4.000 Median :0.0000
## Mean : 70.13 Mean :1.032 Mean :3.501 Mean :0.4213
## 3rd Qu.: 85.40 3rd Qu.:2.000 3rd Qu.:5.000 3rd Qu.:1.0000
## Max. :100.00 Max. :3.000 Max. :6.000 Max. :3.0000
## resume_score skill_score placed salary_lpa
## Min. : 16.50 Min. :0.000 Min. :0.0000 Min. : 0.00
## 1st Qu.: 55.90 1st Qu.:1.000 1st Qu.:1.0000 1st Qu.: 43.43
## Median : 67.40 Median :2.000 Median :1.0000 Median : 60.10
## Mean : 67.79 Mean :1.899 Mean :0.8558 Mean : 55.41
## 3rd Qu.: 79.00 3rd Qu.:3.000 3rd Qu.:1.0000 3rd Qu.: 75.38
## Max. :132.10 Max. :4.000 Max. :1.0000 Max. :129.43
# Statistik lebih lengkap
data.frame(
Mean = sapply(num_data, mean, na.rm = TRUE),
SD = sapply(num_data, sd, na.rm = TRUE),
Min = sapply(num_data, min, na.rm = TRUE),
Max = sapply(num_data, max, na.rm = TRUE)
)Berdasarkan hasil statistika deskriptif, nilai CGPA mahasiswa berada pada rentang 5 hingga 10 dengan rata-rata sebesar 7,51. Nilai tersebut menunjukkan bahwa secara umum mahasiswa dalam dataset memiliki capaian akademik yang cukup baik. Selain itu, rata-rata coding score sebesar 49,78 dan aptitude score sebesar 70,13 mengindikasikan bahwa kemampuan teknis dan penalaran mahasiswa berada pada tingkat yang cukup beragam.
Dari aspek pengalaman, mahasiswa memiliki rata-rata 1,03 pengalaman magang dan 3,50 proyek yang telah dikerjakan. Kondisi ini menunjukkan bahwa pengalaman mahasiswa lebih banyak diperoleh melalui keterlibatan dalam proyek dibandingkan kegiatan magang. Sementara itu, jumlah mata kuliah yang harus diulang tergolong rendah dengan rata-rata sebesar 0,42 dan nilai maksimum sebanyak 3 mata kuliah.
Pada aspek keterampilan dan kesiapan kerja, skill score memiliki rata-rata sebesar 1,90 dari nilai maksimum 4, yang menunjukkan bahwa sebagian besar mahasiswa menguasai satu hingga dua keterampilan teknis utama. Selain itu, resume score memiliki rata-rata sebesar 67,79 dengan rentang nilai yang cukup lebar, sehingga mencerminkan adanya variasi kualitas resume antar mahasiswa.
Berdasarkan variabel target, proporsi mahasiswa yang berhasil memperoleh placement mencapai sekitar 85,58%. Adapun rata-rata salary_lpa yang diperoleh mahasiswa sebesar 55,41 LPA dengan nilai maksimum mencapai 129,43 LPA. Hasil tersebut menunjukkan bahwa mayoritas mahasiswa dalam dataset berhasil memperoleh pekerjaan, meskipun tingkat gaji yang diterima bervariasi cukup besar.
Visualisasi data digunakan untuk membantu memahami pola, distribusi, dan karakteristik data secara lebih jelas. Melalui grafik yang disajikan, informasi yang terkandung dalam dataset dapat diinterpretasikan dengan lebih mudah sehingga mendukung proses eksplorasi data sebelum dilakukan analisis lanjutan.
Histogram digunakan untuk memvisualisasikan distribusi data pada setiap variabel numerik.
num_data %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(value)) +
geom_histogram(bins = 30,
fill = "purple",
color = "black") +
facet_wrap(~name,
scales = "free",
ncol = 3)Berdasarkan histogram pada Gambar X, terlihat bahwa setiap variabel memiliki pola distribusi yang berbeda. Variabel cgpa, coding_score, dan aptitude_score cenderung tersebar merata pada rentang nilainya, menunjukkan adanya variasi kemampuan akademik dan teknis di antara mahasiswa. Variabel resume_score membentuk pola yang mendekati distribusi normal dengan konsentrasi nilai berada di sekitar rentang 60–80.
Variabel yang bersifat biner seperti python_skill, dsa_skill, ml_skill, web_dev_skill, dan placed hanya memiliki dua kategori nilai, yaitu 0 dan 1. Pada variabel placed, mayoritas observasi berada pada nilai 1, yang menunjukkan bahwa sebagian besar mahasiswa dalam dataset berhasil memperoleh placement. Sementara itu, variabel college_tier, internships, projects, dan skill_score merupakan variabel diskrit dengan distribusi yang menunjukkan variasi tingkat pengalaman dan keterampilan mahasiswa.
Selain itu, variabel backlogs didominasi oleh nilai 0, yang mengindikasikan bahwa sebagian besar mahasiswa tidak memiliki mata kuliah yang harus diulang. Pada variabel salary_lpa, sebagian besar data terkonsentrasi pada rentang menengah, namun terdapat beberapa nilai yang relatif tinggi sehingga distribusinya sedikit menceng ke kanan (right-skewed). Secara umum, visualisasi ini menunjukkan bahwa dataset memiliki keragaman karakteristik yang cukup baik untuk digunakan dalam analisis lebih lanjut.
Variabel target yang menunjukkan status keberhasilan mahasiswa dalam memperoleh pekerjaan.
ggplot(data,
aes(x = factor(placed))) +
geom_bar(fill = "purple") +
labs(
title = "Distribusi Placement",
x = "Placement",
y = "Frekuensi"
)placement_df <- data.frame(
Status = c("Tidak Placement", "Placement"),
Jumlah = table(data$placed)
)Berdasarkan grafik distribusi placement, terlihat bahwa jumlah mahasiswa yang berhasil memperoleh pekerjaan (placement = 1) jauh lebih banyak dibandingkan mahasiswa yang tidak memperoleh pekerjaan (placement = 0). Hal ini menunjukkan bahwa sebagian besar mahasiswa dalam dataset memiliki status placement yang positif. Temuan ini juga sejalan dengan hasil statistika deskriptif yang menunjukkan bahwa sekitar 85,58% mahasiswa berhasil memperoleh placement. Dengan demikian, dataset cenderung didominasi oleh mahasiswa yang berhasil mendapatkan pekerjaan setelah menyelesaikan studi.
Scatter plot digunakan untuk memvisualisasikan hubungan antara CGPA dan salary_lpa. Melalui grafik ini, dapat diamati pola keterkaitan antara performa akademik mahasiswa dan gaji yang diperoleh setelah placement.
resume_salary <- ggplot(data,
aes(x = resume_score,
y = salary_lpa)) +
geom_point(color = "blue",
alpha = 0.5) +
geom_smooth(method = "lm",
se = FALSE,
color = "black") +
labs(
title = "Resume Score vs Salary",
x = "Resume Score",
y = "Salary (LPA)"
) +
theme_minimal()
resume_salary## `geom_smooth()` using formula = 'y ~ x'
Scatter plot menunjukkan adanya kecenderungan hubungan positif antara resume score dan salary yang diperoleh mahasiswa. Semakin tinggi kualitas resume, semakin tinggi pula kecenderungan gaji yang diterima setelah placement.
cgpa_salary <- ggplot(data,
aes(x = cgpa,
y = salary_lpa)) +
geom_point(color = "red",
alpha = 0.5) +
geom_smooth(method = "lm",
se = FALSE,
color = "black") +
labs(
title = "CGPA vs Salary",
x = "CGPA",
y = "Salary (LPA)"
) +
theme_minimal()
cgpa_salary## `geom_smooth()` using formula = 'y ~ x'
Scatter plot menunjukkan adanya kecenderungan hubungan positif antara CGPA dan salary. Meskipun demikian, sebaran titik yang cukup luas mengindikasikan bahwa pengaruh CGPA terhadap salary tidak terlalu kuat dan masih terdapat faktor lain yang turut memengaruhi besaran gaji mahasiswa.
Analisis korelasi digunakan untuk mengetahui hubungan antarvariabel numerik dalam dataset. Melalui analisis ini, dapat diamati kekuatan dan arah hubungan antarvariabel sehingga membantu dalam mengidentifikasi faktor-faktor yang berkaitan dengan placement dan salary mahasiswa.
cor_matrix <- cor(
num_data,
use = "complete.obs"
)
corrplot(
cor_matrix,
method = "color",
type = "upper",
tl.cex = 0.8
)Berdasarkan heatmap korelasi, sebagian besar variabel menunjukkan hubungan yang lemah hingga sedang. Beberapa hubungan positif yang cukup kuat terlihat antara salary_lpa dengan skill_score (0,57) dan resume_score (0,52), yang menunjukkan bahwa mahasiswa dengan keterampilan dan kualitas resume yang lebih baik cenderung memperoleh gaji yang lebih tinggi. Selain itu, placed juga memiliki korelasi positif dengan resume_score (0,39), yang mengindikasikan bahwa kualitas resume berperan dalam meningkatkan peluang memperoleh pekerjaan.
Sementara itu, variabel backlogs memiliki korelasi negatif terhadap placed (-0,30) dan salary_lpa (-0,22). Hal ini menunjukkan bahwa semakin banyak mata kuliah yang harus diulang, semakin rendah peluang mahasiswa untuk memperoleh pekerjaan maupun gaji yang tinggi. Secara umum, hasil korelasi menunjukkan bahwa faktor keterampilan, kualitas resume, dan pengalaman memiliki hubungan yang lebih kuat terhadap keberhasilan placement dibandingkan faktor akademik seperti CGPA.
## salary_lpa placed skill_score resume_score
## 1.00000000 0.82201150 0.56995230 0.51988903
## dsa_skill web_dev_skill python_skill ml_skill
## 0.29664161 0.29009652 0.28874405 0.25392296
## coding_score internships projects communication_score
## 0.21384205 0.17714193 0.13088947 0.11336976
## cgpa aptitude_score college_tier backlogs
## 0.09770465 0.05409111 -0.16619879 -0.21714231
Analisis korelasi terhadap variabel salary_lpa dilakukan untuk mengidentifikasi faktor-faktor yang memiliki hubungan dengan besaran gaji yang diperoleh mahasiswa setelah placement. Berdasarkan hasil perhitungan, variabel yang memiliki korelasi positif paling tinggi adalah placed (0,822), diikuti oleh skill_score (0,570), total_skill (0,570), dan resume_score (0,520). Hasil ini menunjukkan bahwa mahasiswa yang berhasil memperoleh placement, memiliki keterampilan yang lebih baik, serta memiliki kualitas resume yang tinggi cenderung memperoleh gaji yang lebih besar.
Selain itu, variabel hasil feature engineering seperti placement_readiness (0,453) dan skill_experience_ratio (0,278) juga menunjukkan hubungan positif dengan salary, yang mengindikasikan bahwa kombinasi antara kemampuan teknis, pengalaman, dan kesiapan kerja turut berkontribusi terhadap peningkatan gaji.
Temuan ini menunjukkan bahwa keberhasilan karier mahasiswa tidak hanya ditentukan oleh prestasi akademik, tetapi juga dipengaruhi oleh keterampilan teknis, pengalaman, serta kualitas resume yang dimiliki. Dengan demikian, pengembangan kompetensi praktis dan pengalaman kerja menjadi faktor penting dalam meningkatkan peluang memperoleh gaji yang lebih tinggi setelah lulus.
Identifikasi multikolinearitas dilakukan untuk mendeteksi adanya hubungan yang terlalu kuat antarvariabel independen. Keberadaan multikolinearitas dapat memengaruhi kualitas model dan interpretasi hasil analisis, sehingga perlu dilakukan pengujian sebelum proses analisis lebih lanjut.
model <- lm(
salary_lpa ~
cgpa +
skill_score +
coding_score +
communication_score +
aptitude_score +
internships +
projects +
resume_score,
data = data
)
vif(model)## cgpa skill_score coding_score communication_score
## 1.000437 11.717623 1.000739 4.117269
## aptitude_score internships projects resume_score
## 1.000825 12.204053 9.681156 34.404161
Hasil pengujian multikolinearitas menggunakan Variance Inflation Factor (VIF) menunjukkan bahwa beberapa variabel memiliki nilai VIF yang cukup tinggi. Variabel cgpa, coding_score, aptitude_score, dan communication_score memiliki nilai VIF di bawah 5 sehingga tidak mengindikasikan adanya masalah multikolinearitas. Variabel projects memiliki nilai VIF sebesar 9,68 yang masih mendekati batas toleransi umum, sedangkan skill_score (11,72), internships (12,20), dan terutama resume_score (34,40) menunjukkan adanya multikolinearitas yang cukup kuat dengan variabel lainnya.
Pemeriksaan missing value dilakukan untuk mengidentifikasi adanya data yang hilang pada setiap variabel
## student_id cgpa branch college_tier
## 0 0 0 0
## python_skill dsa_skill ml_skill web_dev_skill
## 0 0 0 0
## coding_score communication_score aptitude_score internships
## 0 0 0 0
## projects backlogs resume_score skill_score
## 0 0 0 0
## placed company_type job_role salary_lpa
## 0 0 0 0
## student_id cgpa branch college_tier
## 0 0 0 0
## python_skill dsa_skill ml_skill web_dev_skill
## 0 0 0 0
## coding_score communication_score aptitude_score internships
## 0 0 0 0
## projects backlogs resume_score skill_score
## 0 0 0 0
## placed company_type job_role salary_lpa
## 0 0 0 0
Berdasarkan hasil pemeriksaan missing value, seluruh variabel dalam dataset memiliki nilai 0, yang berarti tidak terdapat data yang hilang pada setiap variabel.
Pemeriksaan outlier dilakukan untuk mengidentifikasi data yang memiliki nilai ekstrem dibandingkan observasi lainnya.
num_data <- data %>%
select(where(is.numeric))
num_data %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(y = value)) +
geom_boxplot(fill = "purple") +
facet_wrap(~name,
scales = "free",
ncol = 6)count_outlier <- function(x){
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower <- Q1 - 1.5*IQR
upper <- Q3 + 1.5*IQR
sum(x < lower | x > upper,
na.rm = TRUE)
}
sapply(num_data, count_outlier)## cgpa college_tier python_skill dsa_skill
## 0 0 0 0
## ml_skill web_dev_skill coding_score communication_score
## 0 0 0 0
## aptitude_score internships projects backlogs
## 0 0 0 274
## resume_score skill_score placed salary_lpa
## 47 0 1298 5
Identifikasi outlier menggunakan metode Interquartile Range (IQR) menunjukkan bahwa sebagian besar variabel tidak memiliki pencilan. Namun, terdapat beberapa variabel yang mengandung outlier, yaitu backlogs sebanyak 274 observasi, resume_score sebanyak 47 observasi, dan salary_lpa sebanyak 5 observasi. Jumlah pencilan terbesar ditemukan pada variabel backlogs, yang menunjukkan adanya sejumlah mahasiswa dengan jumlah mata kuliah yang harus diulang jauh lebih tinggi dibandingkan mayoritas mahasiswa lainnya.
## cgpa college_tier python_skill dsa_skill
## 0.00 0.00 0.00 0.00
## ml_skill web_dev_skill coding_score communication_score
## 0.00 0.00 0.00 0.00
## aptitude_score internships projects backlogs
## 0.00 0.00 0.00 3.04
## resume_score skill_score placed salary_lpa
## 0.52 0.00 14.42 0.06
Berdasarkan hasil identifikasi outlier, sebagian besar variabel tidak memiliki pencilan dengan persentase sebesar 0%. Variabel resume_score memiliki persentase outlier sebesar 0,52%, sedangkan salary_lpa hanya sebesar 0,06%, sehingga jumlah pencilan pada kedua variabel tersebut relatif kecil dan tidak diperkirakan memberikan pengaruh yang signifikan terhadap analisis. Sementara itu, variabel backlogs memiliki persentase outlier sebesar 3,04%, yang menunjukkan adanya sejumlah mahasiswa dengan jumlah mata kuliah yang harus diulang lebih tinggi dibandingkan mayoritas mahasiswa lainnya.
Feature engineering merupakan proses pembuatan variabel baru berdasarkan informasi yang telah tersedia pada dataset dengan tujuan meningkatkan kualitas representasi data. Proses ini dilakukan untuk menghasilkan fitur yang lebih informatif, menggabungkan beberapa variabel yang saling berkaitan, serta membantu mengungkap pola yang mungkin tidak terlihat secara langsung pada variabel asli. Pada penelitian ini, dilakukan pembuatan beberapa fitur baru yang diharapkan dapat memberikan gambaran yang lebih komprehensif mengenai kemampuan, pengalaman, dan kesiapan mahasiswa dalam memperoleh pekerjaan.
Mengukur kesiapan mahasiswa memasuki dunia kerja.
Semakin tinggi Placement Readiness Score, semakin siap mahasiswa menghadapi proses rekrutmen.
data <- data %>%
mutate(
placement_readiness =
resume_score +
coding_score +
communication_score
)
ready_df <- data.frame(
Komponen = c(
"Resume Score",
"Coding Score",
"Communication Score"
),
Rata_rata = c(
mean(data$resume_score),
mean(data$coding_score),
mean(data$communication_score)
)
)
ggplot(ready_df,
aes(Komponen,
Rata_rata,
fill = Komponen)) +
geom_col() +
geom_text(
aes(label = round(Rata_rata,1)),
vjust = -0.3
) +
theme_minimal() +
theme(legend.position = "none")Mengukur apakah pengalaman mahasiswa lebih didominasi oleh proyek atau magang.
data$total_skill <-
data$python_skill +
data$dsa_skill +
data$ml_skill +
data$web_dev_skill
data$skill_experience_ratio <-
data$total_skill /
(data$projects + data$internships + 1)
ggplot(data,
aes(x = factor(placed),
y = skill_experience_ratio,
fill = factor(placed))) +
geom_boxplot() +
labs(
title = "Skill-to-Experience Ratio Berdasarkan Status Placement",
x = "Status Placement",
y = "Skill-to-Experience Ratio"
) +
theme_minimal() +
theme(
legend.position = "none"
)Berdasarkan boxplot, median Skill-to-Experience Ratio pada mahasiswa yang memperoleh placement (status = 1) terlihat sedikit lebih tinggi dibandingkan mahasiswa yang tidak memperoleh placement (status = 0). Hal ini menunjukkan bahwa mahasiswa yang berhasil memperoleh pekerjaan cenderung memiliki keseimbangan skill dan pengalaman yang lebih baik, atau memiliki kemampuan teknis yang relatif lebih tinggi dibandingkan pengalaman yang dimiliki.
Mengukur kualitas akademik mahasiswa dengan mempertimbangkan nilai CGPA dan mata kuliah yang belum lulus .
data$academic_performance <-
data$cgpa / (data$backlogs + 1)
ggplot(data,
aes(x = academic_performance,
fill = factor(placed))) +
geom_density(alpha = 0.5) +
labs(
title = "Distribusi Academic Performance",
x = "Academic Performance",
y = "Density",
fill = "Placement"
) +
theme_minimal()Kurva biru yang mewakili mahasiswa yang memperoleh placement cenderung berada di sebelah kanan, sedangkan kurva merah lebih banyak berada di sebelah kiri. Hal ini menunjukkan bahwa mahasiswa yang berhasil memperoleh pekerjaan umumnya memiliki Academic Performance yang lebih tinggi dibandingkan mahasiswa yang tidak memperoleh pekerjaan.
Sebelum melakukan reduksi dimensi dengan PCA, diperlukan untuk
memilih fitur yang relevan. Pada tahap feature engineering, telah dibuat
beberapa variabel baru (placement_readiness,
skill_experience_ratio, dan
academic_performance) yang merupakan kombinasi linear dari
variabel asli. Jika kita memasukkan variabel asli sekaligus variabel
baru hasil kombinasi ke dalam PCA, hal ini akan menyebabkan redundansi
informasi (multikolinearitas sempurna). Oleh karena itu, kita hanya
memilih fitur-fitur final yang paling informatif dan membuang komponen
penyusun tunggalnya.
#1. Penanganan Missing Value
data_clean<-data %>%
drop_na()
#2. Seleksi fitur numerik untuk PCA
features_for_pca<-data_clean %>%
select(cgpa,
aptitude_score,
projects,
internships,
placement_readiness,
skill_experience_ratio,
academic_performance)
# 3. Mengecek matriks korelasi fitur yang telah diseleksi
cor_selected <- cor(features_for_pca)
corrplot(
cor_selected,
method = "number",
type = "upper",
tl.cex = 0.8,
col = colorRampPalette(c("white", "lavender", "purple"))(100)
)Berdasarkan hasil domain knowledge, variabel-variabel asli yang
menjadi komponen pembentukan fitur baru seperti
resume_score, coding_score,
communication_score, python_skill,
dsa_skill, ml_skill,
web_dev_skill, backlogs, dan
skill_score dieliminasi. Karena variabel-variabel tersebut
telah direpresentasikan lebih informatif oleh fitur terbaru
(placement_readiness, skill_experience_ratio,
academic_performance), jika tidak dieliminasi maka akan
menghasilkan multikolinearitas sempurna yang dapat merusak stabilitas
PCA
Tujuh fitur yang dipertahankan adalah : cgpa,
aptitude_score, projects,
internships, placement_readiness,
skill_experience_ratio, dan
academic_performanceAlasan pemilihan karena berdasarkan
matriks korelasi antar ketujuh fitur menunjukkan nilai korelasi yang
rendah. Hal tersebut mengonfirmasi bahwa fitur yang dipilih relatif
bebas satu sama lain dan layaj digunakan sebagai input PCA
Seleksi fitur sebelumnya masih dilakukan secara manual berdasarkan pertimbangan multikolinearitas dan domain knowledge. Kemudian akan dilakukan proses seleksi dengan dua metode berbasis data : Filter Method (Korelasi) dan Embedded Method (LASSO Regression)
# Korelasi setiap fitur terhadap target (salary_lpa)
cor_target <- cor(features_for_pca, data_clean$salary_lpa)
cor_target_df <- data.frame(
Variabel = rownames(cor_target),
Korelasi = round(cor_target[, 1], 4)
) %>% arrange(desc(abs(Korelasi)))
print(cor_target_df)## Variabel Korelasi
## placement_readiness placement_readiness 0.4530
## skill_experience_ratio skill_experience_ratio 0.2783
## academic_performance academic_performance 0.2108
## internships internships 0.1771
## projects projects 0.1309
## cgpa cgpa 0.0977
## aptitude_score aptitude_score 0.0541
# Visualisasi
ggplot(cor_target_df, aes(x = reorder(Variabel, abs(Korelasi)),
y = abs(Korelasi), fill = abs(Korelasi))) +
geom_col() +
coord_flip() +
scale_fill_gradient(low = "lavender", high = "purple") +
labs(title = "Filter Method: Korelasi Absolut Fitur vs Salary",
x = "Variabel", y = "|Korelasi|") +
theme_minimal() +
theme(legend.position = "none")| Variabel | Korelasi dengan salary_lpa |
|---|---|
| placement_readiness | 0,4530 |
| skill_experience_ratio | 0,2783 |
| academic_performance | 0,2108 |
| internships | 0,1771 |
| projects | 0,1309 |
| cgpa | 0,0977 |
| aptitude_score | 0,0541 |
Berdasarkan hasil, placement_readiness adalah variabel
paling informatif, mencerminkan bahwa kesiapan kerja diukur dari
gabungan resume, coding, dan komunikasi sebagai prediktor terkuat gaji
mahasiswa. aptitude_score dan cgpa memiliki
korelasi rendah, yang mengidinkasikan kedua variabel tersebut kurang
relevan untuk prediksi salary.
x_lasso<-as.matrix(features_for_pca)
y_lasso<-data_clean$salary_lpa
# Cross Validation untuk Lambda terbaik
set.seed(123)
cv_lasso<-cv.glmnet(x_lasso,y_lasso,alpha=1)
plot(cv_lasso)# Model LASSO final
lasso_model <- glmnet(x_lasso, y_lasso, alpha = 1,
lambda = cv_lasso$lambda.min)
# Koefisien LASSO
coef_lasso <- coef(lasso_model)
coef_df <- data.frame(
Variabel = rownames(coef_lasso),
Koefisien = round(as.vector(coef_lasso), 5)
) %>% filter(Variabel != "(Intercept)")
print(coef_df)## Variabel Koefisien
## 1 cgpa -0.17402
## 2 aptitude_score 0.08723
## 3 projects 4.68697
## 4 internships 6.75883
## 5 placement_readiness 0.26418
## 6 skill_experience_ratio 47.02520
## 7 academic_performance 2.57274
# Variabel yang terpilih (koefisien != 0)
selected_vars <- coef_df %>% filter(Koefisien != 0)
cat("Variabel terpilih oleh LASSO:\n")## Variabel terpilih oleh LASSO:
## [1] "cgpa" "aptitude_score" "projects"
## [4] "internships" "placement_readiness" "skill_experience_ratio"
## [7] "academic_performance"
LASSO mempertahankan semua 7 variabel. Menunjukkan bahwa setelah reduksi multikolinearitas pada tahap feature engineering, ketujuh variabel masih memiliki kontribusi terhadap salary. skill_experience_ratio memiliki koefisien terbesar, yang artinya rasio tersebut memiliki pengaruh tersebar pada kenaikan salary secara model
Karena setiap variabel memiliki skala dan satuan yang berbeda, wajib untuk dilakukan standardisasi
# Menjalankan PCA
pca_result <- prcomp(features_for_pca, scale. = TRUE)
# Menampilkan ringkasan hasil PCA (Proporsi Varians)
summary(pca_result)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.3007 1.2324 1.0370 1.0001 0.9520 0.69292 0.57225
## Proportion of Variance 0.2417 0.2170 0.1536 0.1429 0.1295 0.06859 0.04678
## Cumulative Proportion 0.2417 0.4586 0.6123 0.7552 0.8846 0.95322 1.00000
Hasil PCA tersebar merata, mengindikasikan bahwa ketujuh variabel bersifat relatif ortogonal dan mandiri. Masing-masing membawa informasi yang unik dan tidak banyak tumpang tindih.
Dua komponen pertama hanya bisa menjelaskan 45,86% dari total variansi data. Dengan artian, jika analisis hanya dibatasi pada dua dimensi, lebih dari 1/2 informasi asli data akan hilang. Dibutuhkan setidaknya 5 komponen pertama untuk mencapai cakupan variansi yang memadai. Menandakan bahwa data mahasiswa ini tidak ada satu atau dua faktor dominan yang mendominasi keragaman data, melainkan informasi tersebar merata
Penggunaan Scree Plot adalah untuk melihat berapa banyak Principal Component (PC) yang cukup dominan dalam menjelaskan varians keseluruhan data
# Mengambil nilai eigen/varians tiap PC
pca_vars <- pca_result$sdev^2
prop_vars <- pca_vars / sum(pca_vars)
df_scree <- data.frame(
PC = paste0("PC", 1:length(prop_vars)),
Variance = prop_vars
)
# Plot Scree Plot
ggplot(df_scree, aes(x = factor(PC, levels = PC), y = Variance, group = 1)) +
geom_line(color = "purple", size = 1) +
geom_point(color = "purple", size = 3) +
labs(
title = "Scree Plot: Proporsi Varians Terjelaskan",
x = "Principal Component",
y = "Proporsi Varians"
) +
theme_minimal()## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Scree plot menunjukkan penurunan variansi yang berlangsung secara landai dan bertahap dari PC1 hingga PC7, tanpa terdapat titik elbow yang tajam dan jelas bagaimana idealnya diharapkan dalam analisis PCA. Hal tersebut mengonfirmasi kembali bahwa ketujuh variabel ini bersifat mandiri satu sama lain, dimana masing-masing variabel membawa informasi yang tidak banyak tumpang tindih dengan variabel lainnya.
## PC1 PC2 PC3 PC4
## cgpa 0.065429272 -0.70373214 -0.02044647 0.006234347
## aptitude_score -0.001299787 0.01094866 0.06444642 -0.996065184
## projects 0.572582476 0.04060762 0.43995163 0.014209726
## internships 0.398075539 0.06387028 -0.61301149 -0.005083777
## placement_readiness 0.395896854 0.04243878 -0.54594350 -0.074234051
## skill_experience_ratio -0.590357055 -0.04386438 -0.35728879 -0.039097773
## academic_performance 0.064395054 -0.70369573 -0.01945487 -0.023413487
## PC5 PC6 PC7
## cgpa 0.010559480 -0.7070024805 0.007690871
## aptitude_score 0.055050799 -0.0207244345 0.010915741
## projects -0.368019149 0.0008301122 0.584210742
## internships 0.542575294 0.0035007170 0.408958824
## placement_readiness -0.630256707 -0.0039633431 -0.375047205
## skill_experience_ratio -0.412034690 -0.0006977617 0.592112720
## academic_performance 0.005979946 0.7068867316 0.003782488
Loading factor menunjukkan kontribusi masing-masing variabel terhadap setiap principal component.
Variabel dengan nilai loading terbesar (positif maupun negatif) dianggap sebagai variabel yang paling berpengaruh dalam membentuk komponen tersebut.
library(ggplot2)
# Varians tiap komponen
var_explained <- pca_result$sdev^2 / sum(pca_result$sdev^2)
# Varians kumulatif
cum_var <- cumsum(var_explained)
df_cum <- data.frame(
PC = 1:length(cum_var),
CumulativeVariance = cum_var * 100
)
ggplot(df_cum,
aes(x = PC,
y = CumulativeVariance)) +
geom_line(linewidth = 1.2,
color = "purple") +
geom_point(size = 3,
color = "purple") +
geom_hline(yintercept = 80,
linetype = "dashed",
color = "red") +
geom_hline(yintercept = 90,
linetype = "dashed",
color = "blue") +
scale_x_continuous(breaks = 1:nrow(df_cum)) +
labs(
title = "Cumulative Variance Explained",
x = "Number of Principal Components",
y = "Cumulative Variance (%)"
) +
theme_minimal()Grafik cummulative variance menunjukkan bahwa dua komponen utama hanya mampu menjelaskan 45,86% variasi data. Nilai tersebut masih terbilang relatif rendah sehingga informasi yang dipertahankan belum cukup representatif. Variansi kumulatif baru mencapai 88,46% setelah memasukkan lima komponen utama. Hal tersebut mengindikasikan bahwa informasi dalam dataset tersebar dalam beberapa dimensi dan tidak terkonsentrasi pada satu atau dua komponen saja