MIF_E31230302/app/Services/PreprocessingService.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)
];
}
}