KELOMPOK 6 - Student Placement Salary Analysis

Anggota Kelompok :

  1. Adrian Wijaya Kusuma - 3338240043
  2. Rajwa Rizki Kurniawan - 3338240024
  3. Rizky Putra Hendrawan - 3338240033

IMPORT LIBRARY

library(gridExtra)
library(tidyverse)
## ── 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
library(skimr)
library(GGally)
library(corrplot)
## corrplot 0.95 loaded
library(ggplot2)
library(naniar)
## 
## Attaching package: 'naniar'
## 
## The following object is masked from 'package:skimr':
## 
##     n_complete
library(car)
## 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
library(glmnet)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Loaded glmnet 5.0

INPUT DATA

data <- read.csv("D:\\Download\\student_placement_salary_elite_v2.csv")

# Melihat dimensi data
dim(data)
## [1] 9000   20
# Struktur data
str(data)
## '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 ...

LATAR BELAKANG

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.

SUMBER DATASET

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.

JUMLAH OBSERVASI

Dataset Student Placement and Salary Dataset terdiri dari 9.000 observasi

dim(data)
## [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.

JUMLAH VARIABEL

Dataset Student Placement and Salary Dataset terdiri atas 9.000 observasi dan 26 variabel.

library(knitr)
library(kableExtra)
## 
## 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")
Deskripsi Variabel Student Placement and Salary Dataset
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.

TUJUAN ANALISIS

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.

EXPLORATORY DATA ANALYSIS

STATISTIK DESKRIPTIF

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.

# Variabel numerik
num_data <- data %>%
  select(where(is.numeric))

summary(num_data)
##       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

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

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.

DISTRIBUSI PLACEMENT

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

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

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.

MATRIKS KORELASI

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.

KORELASI DENGAN SALARY

sort(
  cor_matrix[, "salary_lpa"],
  decreasing = TRUE
)
##          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

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.

MISSING VALUE

Pemeriksaan missing value dilakukan untuk mengidentifikasi adanya data yang hilang pada setiap variabel

# Jumlah missing tiap variabel
colSums(is.na(data))
##          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
round(
  colSums(is.na(data)) / nrow(data) * 100,
  2
)
##          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
vis_miss(data)

Berdasarkan hasil pemeriksaan missing value, seluruh variabel dalam dataset memiliki nilai 0, yang berarti tidak terdapat data yang hilang pada setiap variabel.

OUTLIER

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)

Menghitung Jumlah Outlier dengan IQR

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.

Presentase Outlier

round(
  sapply(num_data, count_outlier) /
  nrow(data) * 100,
  2
)
##                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 ENGGINERING

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.

PLACEMENT READINESS SCORE

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")

SKILL TO EXPERIENCE RATIO

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.

ACADEMIC PERFORMANCE SCORE

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.

FEATURE SELECTION

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.

SELEKSI MANUAL (DOMAIN KNOWLEDGE)

#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)

FILTER METHOD

# 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.

EMBEDDED METHOD (LASSO)

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:
print(selected_vars$Variabel)
## [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

FEATURE EXTRACTION

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

SCREE PLOT

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.

PCA LOADING

# Menampilkan loading untuk 3 PC pertama
pca_result$rotation
##                                 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.

Cummulative Variance Plot

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