From 31ff5f870cd9f08d1a6b842e3bd8f1e59db7e7b0 Mon Sep 17 00:00:00 2001 From: Zhaqian Rouf Alfauzi Date: Sun, 9 Feb 2025 06:50:36 +0700 Subject: [PATCH] [lock] v1 SR Klasifikasi Done --- .../Controllers/ClassificationController.php | 1 + app/Http/Controllers/DashboardController.php | 64 +++ app/Http/Controllers/TestDataController.php | 48 ++- resources/views/layouts/sidebar.blade.php | 292 +++++++++++++ .../views/pages/admin/add-admin.blade.php | 3 +- .../views/pages/admin/class-result.blade.php | 333 +++------------ .../views/pages/admin/dashboard.blade.php | 400 ++++++++---------- .../views/pages/admin/exam-data.blade.php | 86 ++-- .../views/pages/admin/train-data.blade.php | 51 ++- .../views/partial/sidebar-admin.blade.php | 4 +- routes/web.php | 8 +- 11 files changed, 709 insertions(+), 581 deletions(-) create mode 100644 app/Http/Controllers/DashboardController.php diff --git a/app/Http/Controllers/ClassificationController.php b/app/Http/Controllers/ClassificationController.php index 8f6b101..820fd06 100644 --- a/app/Http/Controllers/ClassificationController.php +++ b/app/Http/Controllers/ClassificationController.php @@ -7,6 +7,7 @@ use App\Imports\SantrisImport; use App\Exports\SantrisExport; use App\Models\Riwayat; +use App\Models\TestData; use App\Models\TrainData; use Maatwebsite\Excel\Facades\Excel; diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..60954ff --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,64 @@ +count(); + + // Ambil data berdasarkan tahun angkatan + $tahunAngkatan = TestData::select('tahun_angkatan') + ->distinct() + ->orderBy('tahun_angkatan', 'asc') + ->pluck('tahun_angkatan') + ->toArray(); + + + $tahunAngkatanTable = TestData::selectRaw('tahun_angkatan, + COUNT(*) as total, + COALESCE(SUM(CASE WHEN predicted_status = "Tercapai" THEN 1 ELSE 0 END), 0) as tepat') + ->groupBy('tahun_angkatan') + ->orderBy('tahun_angkatan', 'asc') + ->get(); + + + + // Data untuk grafik jenis kelamin berdasarkan tahun angkatan + $genderData = TestData::selectRaw('tahun_angkatan, + SUM(CASE WHEN jenis_kelamin = "Laki-laki" THEN 1 ELSE 0 END) as laki, + SUM(CASE WHEN jenis_kelamin = "Perempuan" THEN 1 ELSE 0 END) as perempuan') + ->groupBy('tahun_angkatan') + ->orderBy('tahun_angkatan', 'asc') + ->get(); + + // Data untuk grafik asal daerah berdasarkan tahun angkatan + $regionData = TestData::selectRaw('tahun_angkatan, + SUM(CASE WHEN asal_daerah = "Dalam Provinsi" THEN 1 ELSE 0 END) as dalam, + SUM(CASE WHEN asal_daerah = "Luar Provinsi" THEN 1 ELSE 0 END) as luar') + ->groupBy('tahun_angkatan') + ->orderBy('tahun_angkatan', 'asc') + ->get(); + + return view('pages.admin.dashboard', compact( + 'totalSantri', + 'totalTepatWaktu', + 'tahunAngkatan', + 'tahunAngkatanTable', + 'genderData', + 'regionData' + )); + } +} diff --git a/app/Http/Controllers/TestDataController.php b/app/Http/Controllers/TestDataController.php index 8ea8557..29f109b 100644 --- a/app/Http/Controllers/TestDataController.php +++ b/app/Http/Controllers/TestDataController.php @@ -16,17 +16,17 @@ public function showTestData(Request $request) $totalTrainData = TrainData::count(); $limit = round(($percentage / 100) * $totalTrainData); - // **Hapus semua data di TestData secara aman** + // **Hapus semua data uji sebelum insert baru** TestData::query()->delete(); - // **Ambil data latih sesuai persentase** + // **Ambil data latih acak sesuai persentase** $trainData = TrainData::inRandomOrder()->limit($limit)->get(); - // **Gunakan array untuk menyimpan NIS unik** + // **Gunakan array untuk memastikan NIS unik** $existingNIS = []; foreach ($trainData as $data) { - if (!in_array($data->nis, $existingNIS)) { // Cek jika NIS belum ada + if (!in_array($data->nis, $existingNIS)) { TestData::create([ 'nama' => $data->nama, 'jenis_kelamin' => $data->jenis_kelamin, @@ -39,11 +39,11 @@ public function showTestData(Request $request) 'created_at' => now(), 'updated_at' => now(), ]); - $existingNIS[] = $data->nis; // Tambahkan ke array + $existingNIS[] = $data->nis; } } - // **Jalankan klasifikasi otomatis setelah data dipilih** + // **Jalankan klasifikasi otomatis** $this->classifyData(); // **Ambil kembali data uji** @@ -52,15 +52,15 @@ public function showTestData(Request $request) // **Hitung akurasi berdasarkan prediksi** $correctPredictions = TestData::whereColumn('status', 'predicted_status')->count(); - $accuracy = ($totalTestData > 0) ? ($correctPredictions / $totalTestData) * 100 : 0; + $accuracy = ($totalTestData > 0) ? ($correctPredictions / max(1, $totalTestData)) * 100 : 0; - // **Hitung probabilitas berdasarkan status prediksi** + // **Hitung probabilitas status prediksi** $probStatus = [ 'Tepat' => TestData::where('predicted_status', 'Tercapai')->count() * 100 / max(1, $totalTestData), 'Terlambat' => TestData::where('predicted_status', 'Tidak Tercapai')->count() * 100 / max(1, $totalTestData), ]; - // **Hitung probabilitas berdasarkan jenis kelamin** + // **Probabilitas berdasarkan jenis kelamin** $probGender = TestData::groupBy('jenis_kelamin') ->selectRaw("jenis_kelamin, COUNT(*) * 100 / $totalTestData as probability") ->pluck('probability', 'jenis_kelamin') @@ -71,7 +71,7 @@ public function showTestData(Request $request) 'Perempuan' => $probGender['Perempuan'] ?? 0, ]; - // **Hitung probabilitas berdasarkan asal daerah** + // **Probabilitas berdasarkan asal daerah** $probRegion = TestData::groupBy('asal_daerah') ->selectRaw("asal_daerah, COUNT(*) * 100 / $totalTestData as probability") ->pluck('probability', 'asal_daerah') @@ -82,19 +82,35 @@ public function showTestData(Request $request) 'Luar Provinsi' => $probRegion['Luar Provinsi'] ?? 0, ]; + // **Hitung peluang tepat waktu berdasarkan kategori** + $peluangGender = TestData::groupBy('jenis_kelamin') + ->selectRaw("jenis_kelamin, SUM(CASE WHEN predicted_status = 'Tercapai' THEN 1 ELSE 0 END) * 100 / COUNT(*) as peluang") + ->pluck('peluang', 'jenis_kelamin') + ->toArray(); + + $peluangRegion = TestData::groupBy('asal_daerah') + ->selectRaw("asal_daerah, SUM(CASE WHEN predicted_status = 'Tercapai' THEN 1 ELSE 0 END) * 100 / COUNT(*) as peluang") + ->pluck('peluang', 'asal_daerah') + ->toArray(); + return view('pages.admin.exam-data', compact( 'testData', 'totalTestData', 'accuracy', 'probStatus', 'probGender', - 'probRegion' + 'probRegion', + 'peluangGender', + 'peluangRegion' )); } + public function showClassify() + { + $classifiedData = TestData::whereNotNull('predicted_status')->get(); - - + return view('pages.admin.class-result', compact('classifiedData')); + } private function classifyData() { @@ -136,4 +152,10 @@ private function classifyData() "Predicted Labels" => $predictedLabels, ]); } + + public function resetData() + { + TestData::query()->delete(); + return back()->with('success', 'Data uji telah direset.'); + } } diff --git a/resources/views/layouts/sidebar.blade.php b/resources/views/layouts/sidebar.blade.php index e69de29..c6309f3 100644 --- a/resources/views/layouts/sidebar.blade.php +++ b/resources/views/layouts/sidebar.blade.php @@ -0,0 +1,292 @@ +@extends('layouts.app-admin') +Dashboard Admin | SR Klasifikasi +@section('content') +
+
+
+

Halo {{ ucwords($user->role) }} 👋

+ +
+ + +
+
+ @if(session('success')) +
+ {{ session('success') }} +
+ @endif +
+
+
+
+
+
Santri | Jumlah
+
+
+ +
+
+
400
+
+
+
+
+
+
+
+
+
Tepat Waktu | Jumlah
+
+
+ +
+
+
400
+
+
+
+
+
+ +
+
+
+
Klasifikasi
+ +
+ + + +
+
+
+ +
+
+
+
Jenis Kelamin
+
+
+
+ + + +
+
+
+
+
Asal Daerah
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
Tanggal Hari Ini
+
+
+ +
+
+
Loading... +
+
+
+
+
+
+ + +
+
+
+
Waktu Saat Ini
+
+
+ +
+
+
Loading... +
+
+
+
+
+
+
+
+
+
+
+
+ + +@endsection \ No newline at end of file diff --git a/resources/views/pages/admin/add-admin.blade.php b/resources/views/pages/admin/add-admin.blade.php index e532464..2109f1e 100644 --- a/resources/views/pages/admin/add-admin.blade.php +++ b/resources/views/pages/admin/add-admin.blade.php @@ -6,7 +6,8 @@

Tambah Admin

-