372 lines
17 KiB
PHP
372 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class PreprocessingService
|
|
{
|
|
/**
|
|
* Helper privat untuk mencari nilai terbanyak (Modus/Kelas Mayoritas)
|
|
* dari tabel data training secara otomatis.
|
|
*/
|
|
private function getKelasMayoritas($kolom, $defaultFallback)
|
|
{
|
|
try {
|
|
// Asumsi nama tabel data training adalah 'data_training'
|
|
$modus = DB::table('data_training')
|
|
->select($kolom, DB::raw('COUNT(*) as total'))
|
|
->whereNotNull($kolom)
|
|
->where($kolom, '!=', '')
|
|
->groupBy($kolom)
|
|
->orderBy('total', 'DESC')
|
|
->first();
|
|
|
|
return $modus ? $modus->$kolom : $defaultFallback;
|
|
} catch (\Exception $e) {
|
|
return $defaultFallback;
|
|
}
|
|
}
|
|
|
|
public function kategoriNilai($nilai)
|
|
{
|
|
if (is_string($nilai) && !is_numeric(trim($nilai))) {
|
|
return trim($nilai);
|
|
}
|
|
|
|
$nilai = (float) $nilai;
|
|
|
|
if ($nilai >= 90) return 'Tinggi';
|
|
if ($nilai >= 75) return 'Sedang';
|
|
|
|
return 'Rendah';
|
|
}
|
|
|
|
/**
|
|
* Penanganan dan Pengelompokan / Normalisasi Mata Pelajaran Favorit
|
|
*/
|
|
public function kategoriMapelFavorit($mapel)
|
|
{
|
|
if (empty($mapel)) {
|
|
return $this->getKelasMayoritas('mapel_favorit', 'Matematika');
|
|
}
|
|
|
|
$mapelClean = trim($mapel);
|
|
|
|
$kategoriStandar = [
|
|
'Matematika', 'Bahasa Inggris', 'Biologi',
|
|
'Fisika', 'Ekonomi', 'Sejarah'
|
|
];
|
|
|
|
foreach ($kategoriStandar as $kat) {
|
|
if (strcasecmp($mapelClean, $kat) === 0) {
|
|
return $kat;
|
|
}
|
|
}
|
|
|
|
$mapelRaw = strtolower($mapelClean);
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'mat') || str_contains($mapelRaw, 'hitung') ||
|
|
str_contains($mapelRaw, 'kalkulus') || str_contains($mapelRaw, 'angka')
|
|
) {
|
|
return 'Matematika';
|
|
}
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'inggris') || str_contains($mapelRaw, 'english') ||
|
|
str_contains($mapelRaw, 'bing') || str_contains($mapelRaw, 'bahasa asing')
|
|
) {
|
|
return 'Bahasa Inggris';
|
|
}
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'bio') || str_contains($mapelRaw, 'tumbuhan') ||
|
|
str_contains($mapelRaw, 'hewan') || str_contains($mapelRaw, 'anatomi')
|
|
) {
|
|
return 'Biologi';
|
|
}
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'fis') || str_contains($mapelRaw, 'mekanika') ||
|
|
str_contains($mapelRaw, 'listrik')
|
|
) {
|
|
return 'Fisika';
|
|
}
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'eko') || str_contains($mapelRaw, 'akuntansi') ||
|
|
str_contains($mapelRaw, 'keuangan') || str_contains($mapelRaw, 'bisnis')
|
|
) {
|
|
return 'Ekonomi';
|
|
}
|
|
|
|
if (
|
|
str_contains($mapelRaw, 'sej') || str_contains($mapelRaw, 'sosio') ||
|
|
str_contains($mapelRaw, 'sejarah') || str_contains($mapelRaw, 'ips')
|
|
) {
|
|
return 'Sejarah';
|
|
}
|
|
|
|
return $this->getKelasMayoritas('mapel_favorit', 'Matematika');
|
|
}
|
|
|
|
public function kategoriMinat($minat)
|
|
{
|
|
if (empty($minat)) {
|
|
return $this->getKelasMayoritas('minat', 'Teknologi Info & Pemrograman');
|
|
}
|
|
|
|
$minatClean = trim($minat);
|
|
|
|
$kategoriStandar = [
|
|
'Budidaya Tanaman', 'Kimia Pangan', 'Budidaya Ternak',
|
|
'Teknologi Info & Pemrograman', 'Energi & Tek Mesin',
|
|
'Bahasa & Komunikasi', 'Bisnis', 'Kesehatan'
|
|
];
|
|
|
|
foreach ($kategoriStandar as $kat) {
|
|
if (strcasecmp($minatClean, $kat) === 0) {
|
|
return $kat;
|
|
}
|
|
}
|
|
|
|
$minatRaw = strtolower($minatClean);
|
|
|
|
// 1. Teknologi Informasi & Pemrograman (JTI Polije)
|
|
if (
|
|
str_contains($minatRaw, 'coding') || str_contains($minatRaw, 'jaringan') ||
|
|
str_contains($minatRaw, 'rekayasa perangkat lunak') || str_contains($minatRaw, 'rpl') ||
|
|
str_contains($minatRaw, 'pemrograman') || str_contains($minatRaw, 'cyber') ||
|
|
str_contains($minatRaw, 'komputer') || str_contains($minatRaw, 'informatika') ||
|
|
str_contains($minatRaw, 'info & pemrog') || str_contains($minatRaw, 'olah data') ||
|
|
str_contains($minatRaw, 'data') || str_contains($minatRaw, 'game') ||
|
|
str_contains($minatRaw, 'web') || str_contains($minatRaw, 'aplikasi') ||
|
|
str_contains($minatRaw, 'software') || str_contains($minatRaw, 'developer')
|
|
) {
|
|
return 'Teknologi Info & Pemrograman';
|
|
}
|
|
|
|
// 2. Bahasa, Media & Komunikasi
|
|
if (
|
|
str_contains($minatRaw, 'masyarakat') || str_contains($minatRaw, 'bahasa') ||
|
|
str_contains($minatRaw, 'wisata') || str_contains($minatRaw, 'media') ||
|
|
str_contains($minatRaw, 'komunikasi') || str_contains($minatRaw, 'konten') ||
|
|
str_contains($minatRaw, 'content') || str_contains($minatRaw, 'kreator') ||
|
|
str_contains($minatRaw, 'creator') || str_contains($minatRaw, 'youtube') ||
|
|
str_contains($minatRaw, 'desain') || str_contains($minatRaw, 'nulis') ||
|
|
str_contains($minatRaw, 'editing') || str_contains($minatRaw, 'video') ||
|
|
str_contains($minatRaw, 'foto')
|
|
) {
|
|
return 'Bahasa & Komunikasi';
|
|
}
|
|
|
|
// 3. Bisnis & Manajemen Agribisnis
|
|
if (
|
|
str_contains($minatRaw, 'akuntansi') || str_contains($minatRaw, 'admin') ||
|
|
str_contains($minatRaw, 'manajemen') || str_contains($minatRaw, 'industri') ||
|
|
str_contains($minatRaw, 'keuangan') || str_contains($minatRaw, 'investasi') ||
|
|
str_contains($minatRaw, 'bisnis') || str_contains($minatRaw, 'dagang') ||
|
|
str_contains($minatRaw, 'jual') || str_contains($minatRaw, 'pemasaran') ||
|
|
str_contains($minatRaw, 'marketing') || str_contains($minatRaw, 'wirausaha')
|
|
) {
|
|
return 'Bisnis';
|
|
}
|
|
|
|
// 4. Budidaya Tanaman / Pertanian
|
|
if (
|
|
str_contains($minatRaw, 'tani') || str_contains($minatRaw, 'kebun') ||
|
|
str_contains($minatRaw, 'agronomi') || str_contains($minatRaw, 'benih') ||
|
|
str_contains($minatRaw, 'tanaman') || str_contains($minatRaw, 'budidaya tanaman') ||
|
|
str_contains($minatRaw, 'hortikultura') || str_contains($minatRaw, 'lahan')
|
|
) {
|
|
return 'Budidaya Tanaman';
|
|
}
|
|
|
|
// 5. Kimia Pangan & Teknologi Pertanian
|
|
if (
|
|
str_contains($minatRaw, 'kimia') || str_contains($minatRaw, 'pangan') ||
|
|
str_contains($minatRaw, 'proses') || str_contains($minatRaw, 'olah makanan') ||
|
|
str_contains($minatRaw, 'kuliner') || str_contains($minatRaw, 'gizi pangan')
|
|
) {
|
|
return 'Kimia Pangan';
|
|
}
|
|
|
|
// 6. Budidaya Ternak / Peternakan
|
|
if (
|
|
str_contains($minatRaw, 'ternak') || str_contains($minatRaw, 'hewan') ||
|
|
str_contains($minatRaw, 'pakan') || str_contains($minatRaw, 'unggas') ||
|
|
str_contains($minatRaw, 'budidaya ternak') || str_contains($minatRaw, 'pelihara')
|
|
) {
|
|
return 'Budidaya Ternak';
|
|
}
|
|
|
|
// 7. Energi & Teknik Mesin
|
|
if (
|
|
str_contains($minatRaw, 'mesin') || str_contains($minatRaw, 'otomotif') ||
|
|
str_contains($minatRaw, 'listrik') || str_contains($minatRaw, 'energi') ||
|
|
str_contains($minatRaw, 'tek mesin') || str_contains($minatRaw, 'robot')
|
|
) {
|
|
return 'Energi & Tek Mesin';
|
|
}
|
|
|
|
// 8. Kesehatan
|
|
if (
|
|
str_contains($minatRaw, 'medis') || str_contains($minatRaw, 'gizi') ||
|
|
str_contains($minatRaw, 'sehat') || str_contains($minatRaw, 'klinik') ||
|
|
str_contains($minatRaw, 'obat') || str_contains($minatRaw, 'rawat') ||
|
|
str_contains($minatRaw, 'rekam medis')
|
|
) {
|
|
return 'Kesehatan';
|
|
}
|
|
|
|
return $this->getKelasMayoritas('minat', 'Teknologi Info & Pemrograman');
|
|
}
|
|
|
|
public function kategoriCitaCita($cita)
|
|
{
|
|
if (empty($cita)) {
|
|
return $this->getKelasMayoritas('cita_cita', 'IT');
|
|
}
|
|
|
|
$citaClean = trim($cita);
|
|
|
|
$kategoriStandar = [
|
|
'Ahli Agronomi', 'Peternak', 'Pengusaha', 'Ahli Gizi',
|
|
'Manager Rantai Pasok', 'Manajer', 'Quality Control',
|
|
'Petani Modern', 'Teknisi', 'Bahasa & Pariwisata', 'IT'
|
|
];
|
|
|
|
foreach ($kategoriStandar as $kat) {
|
|
if (strcasecmp($citaClean, $kat) === 0) {
|
|
return $kat;
|
|
}
|
|
}
|
|
|
|
$citaRaw = strtolower($citaClean);
|
|
|
|
if (str_contains($citaRaw, 'agronomi') || str_contains($citaRaw, 'ahli agronomi')) return 'Ahli Agronomi';
|
|
if (str_contains($citaRaw, 'farm') || str_contains($citaRaw, 'ternak') || str_contains($citaRaw, 'peternak')) return 'Peternak';
|
|
if (str_contains($citaRaw, 'akuntan') || str_contains($citaRaw, 'pajak') || str_contains($citaRaw, 'bisnis') || str_contains($citaRaw, 'pengusaha') || str_contains($citaRaw, 'wirausaha') || str_contains($citaRaw, 'ceo') || str_contains($citaRaw, 'founder') || str_contains($citaRaw, 'pembisnis')) return 'Pengusaha';
|
|
if (str_contains($citaRaw, 'gizi') || str_contains($citaRaw, 'medis') || str_contains($citaRaw, 'rumah sakit') || str_contains($citaRaw, 'kesehatan') || str_contains($citaRaw, 'dokter') || str_contains($citaRaw, 'perawat')) return 'Ahli Gizi';
|
|
if (str_contains($citaRaw, 'rantai pasok') || str_contains($citaRaw, 'supply chain') || str_contains($citaRaw, 'manager rantai pasok') || str_contains($citaRaw, 'logistik')) return 'Manager Rantai Pasok';
|
|
if (str_contains($citaRaw, 'manajer') || str_contains($citaRaw, 'manager') || str_contains($citaRaw, 'pimpinan') || str_contains($citaRaw, 'bos')) return 'Manajer';
|
|
if (str_contains($citaRaw, 'quality control') || str_contains($citaRaw, 'qc') || str_contains($citaRaw, 'tester')) return 'Quality Control';
|
|
if (str_contains($citaRaw, 'petani modern') || str_contains($citaRaw, 'tani') || str_contains($citaRaw, 'kebun')) return 'Petani Modern';
|
|
|
|
if (
|
|
str_contains($citaRaw, 'software') || str_contains($citaRaw, 'data engineer') ||
|
|
str_contains($citaRaw, 'network engineer') || str_contains($citaRaw, 'programmer') ||
|
|
preg_match('/\bit\b/i', $citaRaw) || str_contains($citaRaw, 'developer') ||
|
|
str_contains($citaRaw, 'teknisi informatika') || str_contains($citaRaw, 'analis') ||
|
|
str_contains($citaRaw, 'analyst') || str_contains($citaRaw, 'data') ||
|
|
str_contains($citaRaw, 'gamer') || str_contains($citaRaw, 'hacker')
|
|
) return 'IT';
|
|
|
|
if (
|
|
str_contains($citaRaw, 'translator') || str_contains($citaRaw, 'penerjemah') ||
|
|
str_contains($citaRaw, 'tour') || str_contains($citaRaw, 'tour guide') ||
|
|
str_contains($citaRaw, 'pemandu') || str_contains($citaRaw, 'wisata') ||
|
|
str_contains($citaRaw, 'bahasa') || str_contains($citaRaw, 'diplomat') ||
|
|
str_contains($citaRaw, 'content') || str_contains($citaRaw, 'creator') ||
|
|
str_contains($citaRaw, 'kreator') || str_contains($citaRaw, 'youtuber') ||
|
|
str_contains($citaRaw, 'guru') || str_contains($citaRaw, 'dosen') ||
|
|
str_contains($citaRaw, 'pengajar') || str_contains($citaRaw, 'pendidik') || str_contains($citaRaw, 'penyanyi')
|
|
) return 'Bahasa & Pariwisata';
|
|
|
|
if (
|
|
str_contains($citaRaw, 'mekanik') || str_contains($citaRaw, 'mesin') ||
|
|
str_contains($citaRaw, 'teknisi') || str_contains($citaRaw, 'engineer') ||
|
|
str_contains($citaRaw, 'rekayasa') || str_contains($citaRaw, 'otomotif')
|
|
) return 'Teknisi';
|
|
|
|
return $this->getKelasMayoritas('cita_cita', 'IT');
|
|
}
|
|
|
|
public function kategoriPreferensi($preferensi)
|
|
{
|
|
if (empty($preferensi)) {
|
|
return $this->getKelasMayoritas('preferensi_studi', 'Komputer & Informatika');
|
|
}
|
|
|
|
$preferensiClean = trim($preferensi);
|
|
|
|
$kategoriStandar = [
|
|
'Pertanian & Hortikultura', 'Komputer & Informatika', 'Ekonomi & Agribisnis',
|
|
'Bahasa & Komunikasi', 'Kesehatan & Gizi', 'Bisnis & Manajemen',
|
|
'Ilmu Peternakan', 'Rekayasa Otomotif', 'Sains & Teknologi'
|
|
];
|
|
|
|
foreach ($kategoriStandar as $kat) {
|
|
if (strcasecmp($preferensiClean, $kat) === 0) {
|
|
return $kat;
|
|
}
|
|
}
|
|
|
|
$preferensiRaw = strtolower($preferensiClean);
|
|
|
|
if (
|
|
str_contains($preferensiRaw, 'komputer') || str_contains($preferensiRaw, 'informatika') ||
|
|
str_contains($preferensiRaw, 'sistem informasi') || str_contains($preferensiRaw, 'software') ||
|
|
str_contains($preferensiRaw, 'data') || str_contains($preferensiRaw, 'mining') ||
|
|
str_contains($preferensiRaw, 'it') || str_contains($preferensiRaw, 'digital') ||
|
|
str_contains($preferensiRaw, 'aplikasi') || str_contains($preferensiRaw, 'pemrograman') ||
|
|
str_contains($preferensiRaw, 'matematika')
|
|
) return 'Komputer & Informatika';
|
|
|
|
if (
|
|
str_contains($preferensiRaw, 'bahasa') || str_contains($preferensiRaw, 'komunikasi') ||
|
|
str_contains($preferensiRaw, 'pariwisata') || str_contains($preferensiRaw, 'hubungan internasional') ||
|
|
str_contains($preferensiRaw, 'media') || str_contains($preferensiRaw, 'desain') ||
|
|
str_contains($preferensiRaw, 'konten') || str_contains($preferensiRaw, 'content') || str_contains($preferensiRaw, 'kesenian')
|
|
) return 'Bahasa & Komunikasi';
|
|
|
|
if (str_contains($preferensiRaw, 'pertanian') || str_contains($preferensiRaw, 'hortikultura') || str_contains($preferensiRaw, 'tanaman') || str_contains($preferensiRaw, 'agronomi')) return 'Pertanian & Hortikultura';
|
|
if (str_contains($preferensiRaw, 'peternakan') || str_contains($preferensiRaw, 'ternak') || str_contains($preferensiRaw, 'hewan')) return 'Ilmu Peternakan';
|
|
if (str_contains($preferensiRaw, 'ekonomi') || str_contains($preferensiRaw, 'agribisnis') || str_contains($preferensiRaw, 'perbankan')) return 'Ekonomi & Agribisnis';
|
|
if (str_contains($preferensiRaw, 'kesehatan') || str_contains($preferensiRaw, 'gizi') || str_contains($preferensiRaw, 'keperawatan') || str_contains($preferensiRaw, 'kedokteran') || str_contains($preferensiRaw, 'biologi') || str_contains($preferensiRaw, 'farmasi')) return 'Kesehatan & Gizi';
|
|
if (str_contains($preferensiRaw, 'rekayasa') || str_contains($preferensiRaw, 'otomotif') || str_contains($preferensiRaw, 'mesin') || str_contains($preferensiRaw, 'elektro')) return 'Rekayasa Otomotif';
|
|
if (str_contains($preferensiRaw, 'bisnis') || str_contains($preferensiRaw, 'manajemen') || str_contains($preferensiRaw, 'pemasaran') || str_contains($preferensiRaw, 'penjualan') || str_contains($preferensiRaw, 'jual') || str_contains($preferensiRaw, 'akuntansi') || str_contains($preferensiRaw, 'ilmu manajemen')) return 'Bisnis & Manajemen';
|
|
if (str_contains($preferensiRaw, 'sains') || str_contains($preferensiRaw, 'teknologi') || str_contains($preferensiRaw, 'ilmu fisika') || str_contains($preferensiRaw, 'fisika') || str_contains($preferensiRaw, 'ilmu kimia') || str_contains($preferensiRaw, 'kimia')) return 'Sains & Teknologi';
|
|
|
|
return $this->getKelasMayoritas('preferensi_studi', 'Komputer & Informatika');
|
|
}
|
|
|
|
public function preprocess($row)
|
|
{
|
|
$isObject = is_object($row);
|
|
|
|
$nilai = $isObject
|
|
? ($row->nilai_raw ?? $row->nilai ?? 0)
|
|
: ($row['nilai_raw'] ?? $row['nilai'] ?? 0);
|
|
|
|
$mapelFavorit = $isObject
|
|
? ($row->mapel_favorit_raw ?? $row->mapel_favorit ?? '')
|
|
: ($row['mapel_favorit_raw'] ?? $row['mapel_favorit'] ?? '');
|
|
|
|
$minat = $isObject
|
|
? ($row->minat_raw ?? $row->minat ?? '')
|
|
: ($row['minat_raw'] ?? $row['minat'] ?? '');
|
|
|
|
$citaCita = $isObject
|
|
? ($row->cita_cita_raw ?? $row->cita_cita ?? '')
|
|
: ($row['cita_cita_raw'] ?? $row['cita_cita'] ?? '');
|
|
|
|
$preferensiStudi = $isObject
|
|
? ($row->preferensi_studi_raw ?? $row->preferensi_studi ?? '')
|
|
: ($row['preferensi_studi_raw'] ?? $row['preferensi_studi'] ?? '');
|
|
|
|
$jurusan = $isObject
|
|
? ($row->jurusan ?? 'Tidak Diketahui')
|
|
: ($row['jurusan'] ?? 'Tidak Diketahui');
|
|
|
|
return [
|
|
'nilai' => $this->kategoriNilai($nilai),
|
|
'mapel_favorit' => $this->kategoriMapelFavorit($mapelFavorit),
|
|
'minat' => $this->kategoriMinat($minat),
|
|
'cita_cita' => $this->kategoriCitaCita($citaCita),
|
|
'preferensi_studi' => $this->kategoriPreferensi($preferensiStudi),
|
|
'jurusan' => trim($jurusan)
|
|
];
|
|
}
|
|
} |