diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 2e0459f..38bb929 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -79,7 +79,7 @@ public function register(Request $request) 'email' => 'required|email|unique:users,email', 'password' => 'required|min:6', 'jenis_kelamin' => 'required|in:Laki-laki,Perempuan', - 'asal_daerah' => 'required|in:dalamProvinsi,luarProvinsi', + 'asal_daerah' => 'required|in:Dalam Provinsi,Luar Provinsi', ]); // Buat user baru diff --git a/app/Http/Controllers/ClassificationController.php b/app/Http/Controllers/ClassificationController.php index 820fd06..ca2230f 100644 --- a/app/Http/Controllers/ClassificationController.php +++ b/app/Http/Controllers/ClassificationController.php @@ -83,14 +83,6 @@ public function classificationResult() return view('pages.admin.class-result'); // Pastikan view ini telah dibuat } - - - - public function showExamData() - { - // Tambahkan logika untuk mengolah dan menampilkan hasil klasifikasi - // Misalnya, menjalankan algoritma atau mengambil data dari model - - return view('pages.admin.exam-data'); // Pastikan view ini telah dibuat - } } + + diff --git a/app/Http/Controllers/SantriController.php b/app/Http/Controllers/SantriController.php index fafb01c..c898716 100644 --- a/app/Http/Controllers/SantriController.php +++ b/app/Http/Controllers/SantriController.php @@ -59,7 +59,7 @@ public function updateProfile(Request $request) $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $user->id, - 'asal_daerah' => 'required|in:dalamProvinsi,luarProvinsi', + 'asal_daerah' => 'required|in:Dalam Provinsi,Luar Provinsi', 'password' => 'nullable|min:6|same:password_confirmation', ], [ 'password.same' => 'Konfirmasi password tidak cocok.', diff --git a/app/Http/Controllers/TestDataController.php b/app/Http/Controllers/TestDataController.php index 29f109b..221e3cd 100644 --- a/app/Http/Controllers/TestDataController.php +++ b/app/Http/Controllers/TestDataController.php @@ -12,15 +12,16 @@ class TestDataController extends Controller { public function showTestData(Request $request) { - $percentage = $request->input('percentage', 100); + $trainPercentage = $request->input('train_percentage', 80); // Default 80% + $testPercentage = 100 - $trainPercentage; $totalTrainData = TrainData::count(); - $limit = round(($percentage / 100) * $totalTrainData); - + $trainLimit = round(($trainPercentage / 100) * $totalTrainData); + $testLimit = round(($testPercentage / 100) * $totalTrainData); // **Hapus semua data uji sebelum insert baru** TestData::query()->delete(); // **Ambil data latih acak sesuai persentase** - $trainData = TrainData::inRandomOrder()->limit($limit)->get(); + $trainData = TrainData::inRandomOrder()->limit($trainLimit)->get(); // **Gunakan array untuk memastikan NIS unik** $existingNIS = []; @@ -44,64 +45,193 @@ public function showTestData(Request $request) } // **Jalankan klasifikasi otomatis** - $this->classifyData(); + // Ganti pemanggilan classifyData() seperti ini + $this->classifyData($request); - // **Ambil kembali data uji** - $testData = TestData::all(); + + $testData = TestData::limit($testLimit)->get(); $totalTestData = $testData->count(); - // **Hitung akurasi berdasarkan prediksi** - $correctPredictions = TestData::whereColumn('status', 'predicted_status')->count(); + + // **Hitung Akurasi** + $correctPredictions = $testData->filter(function ($item) { + return $item->status === $item->predicted_status; + })->count(); + $accuracy = ($totalTestData > 0) ? ($correctPredictions / max(1, $totalTestData)) * 100 : 0; + // **Hitung True Positive, False Positive, dan False Negative** + $TP = $testData->filter(function ($item) { + return $item->status === 'Tercapai' && $item->predicted_status === 'Tercapai'; + })->count(); + + $FP = $testData->filter(function ($item) { + return $item->status === 'Tidak Tercapai' && $item->predicted_status === 'Tercapai'; + })->count(); + + $FN = $testData->filter(function ($item) { + return $item->status === 'Tercapai' && $item->predicted_status === 'Tidak Tercapai'; + })->count(); + + // **Hitung Precision dan Recall** + $precision = ($TP + $FP) > 0 ? ($TP / ($TP + $FP)) * 100 : 0; + $recall = ($TP + $FN) > 0 ? ($TP / ($TP + $FN)) * 100 : 0; + // **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), + 'Tepat' => $testData->filter(function ($item) { + return $item->predicted_status === 'Tercapai'; + })->count() * 100 / max(1, $totalTestData), + 'Terlambat' => $testData->filter(function ($item) { + return $item->predicted_status === 'Tidak Tercapai'; + })->count() * 100 / max(1, $totalTestData), ]; // **Probabilitas berdasarkan jenis kelamin** - $probGender = TestData::groupBy('jenis_kelamin') - ->selectRaw("jenis_kelamin, COUNT(*) * 100 / $totalTestData as probability") - ->pluck('probability', 'jenis_kelamin') - ->toArray(); + $probGender = $testData->groupBy('jenis_kelamin')->map(function ($group) use ($totalTestData) { + return [ + 'probability' => ($group->count() * 100) / max(1, $totalTestData), + 'count' => $group->count() + ]; + })->toArray(); $probGender = [ 'Laki-laki' => $probGender['Laki-laki'] ?? 0, 'Perempuan' => $probGender['Perempuan'] ?? 0, ]; + + // Hitung total jumlah "Tercapai" dan "Tidak Tercapai" untuk masing-masing kategori + $totalTercapai = $testData->where('status', 'Tercapai')->count(); + $totalTidakTercapai = $testData->where('status', 'Tidak Tercapai')->count(); + + $probKelamin = [ + 'Tercapai' => [ + 'Laki-laki' => [ + 'probability' => $totalTercapai > 0 ? $testData->where('status', 'Tercapai')->where('jenis_kelamin', 'Laki-laki')->count() / $totalTercapai : 0, + 'count' => $testData->where('status', 'Tercapai')->where('jenis_kelamin', 'Laki-laki')->count(), + ], + 'Perempuan' => [ + 'probability' => $totalTercapai > 0 ? $testData->where('status', 'Tercapai')->where('jenis_kelamin', 'Perempuan')->count() / $totalTercapai : 0, + 'count' => $testData->where('status', 'Tercapai')->where('jenis_kelamin', 'Perempuan')->count(), + ], + ], + 'Tidak Tercapai' => [ + 'Laki-laki' => [ + 'probability' => $totalTidakTercapai > 0 ? $testData->where('status', 'Tidak Tercapai')->where('jenis_kelamin', 'Laki-laki')->count() / $totalTidakTercapai : 0, + 'count' => $testData->where('status', 'Tidak Tercapai')->where('jenis_kelamin', 'Laki-laki')->count(), + ], + 'Perempuan' => [ + 'probability' => $totalTidakTercapai > 0 ? $testData->where('status', 'Tidak Tercapai')->where('jenis_kelamin', 'Perempuan')->count() / $totalTidakTercapai : 0, + 'count' => $testData->where('status', 'Tidak Tercapai')->where('jenis_kelamin', 'Perempuan')->count(), + ], + ], + ]; + + // **Probabilitas berdasarkan asal daerah** - $probRegion = TestData::groupBy('asal_daerah') - ->selectRaw("asal_daerah, COUNT(*) * 100 / $totalTestData as probability") - ->pluck('probability', 'asal_daerah') - ->toArray(); + $probRegion = $testData->groupBy('asal_daerah')->map(function ($group) use ($totalTestData) { + return [ + 'probability' => ($group->count() * 100) / max(1, $totalTestData), + 'count' => $group->count() + ]; + })->toArray(); + $probRegion = [ 'Dalam Provinsi' => $probRegion['Dalam Provinsi'] ?? 0, '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(); + $probProvinsi = [ + 'Tercapai' => [ + 'Dalam Provinsi' => [ + 'probability' => $totalTercapai > 0 ? $testData->where('status', 'Tercapai')->where('asal_daerah', 'Dalam Provinsi')->count() / $totalTercapai : 0, + 'count' => $testData->where('status', 'Tercapai')->where('asal_daerah', 'Dalam Provinsi')->count(), + ], + 'Luar Provinsi' => [ + 'probability' => $totalTercapai > 0 ? $testData->where('status', 'Tercapai')->where('asal_daerah', 'Luar Provinsi')->count() / $totalTercapai : 0, + 'count' => $testData->where('status', 'Tercapai')->where('asal_daerah', 'Luar Provinsi')->count(), + ], + ], + 'Tidak Tercapai' => [ + 'Dalam Provinsi' => [ + 'probability' => $totalTidakTercapai > 0 ? $testData->where('status', 'Tidak Tercapai')->where('asal_daerah', 'Dalam Provinsi')->count() / $totalTidakTercapai : 0, + 'count' => $testData->where('status', 'Tidak Tercapai')->where('asal_daerah', 'Dalam Provinsi')->count(), + ], + 'Luar Provinsi' => [ + 'probability' => $totalTidakTercapai > 0 ? $testData->where('status', 'Tidak Tercapai')->where('asal_daerah', 'Luar Provinsi')->count() / $totalTidakTercapai : 0, + 'count' => $testData->where('status', 'Tidak Tercapai')->where('asal_daerah', 'Luar Provinsi')->count(), + ], + ], + ]; - $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(); + // **Hitung peluang tepat waktu berdasarkan jenis kelamin** + $peluangGender = $testData->groupBy('jenis_kelamin')->map(function ($group) { + $total = $group->count(); + $tercapai = $group->filter(function ($item) { + return $item->predicted_status === 'Tercapai'; + })->count(); - return view('pages.admin.exam-data', compact( + return [ + 'peluang' => ($tercapai * 100) / max(1, $total), + 'count' => $total + ]; + })->toArray(); + + // **Hitung peluang tepat waktu berdasarkan asal daerah** + $peluangRegion = $testData->groupBy('asal_daerah')->map(function ($group) { + $total = $group->count(); + $tercapai = $group->filter(function ($item) { + return $item->predicted_status === 'Tercapai'; + })->count(); + + return [ + 'peluang' => ($tercapai * 100) / max(1, $total), + 'count' => $total + ]; + })->toArray(); + + $probNumerik = [ + 'alquran' => [ + 'Tercapai' => $this->calculateMeanStdDev('alquran', 'Tercapai', $testData), + 'Tidak Tercapai' => $this->calculateMeanStdDev('alquran', 'Tidak Tercapai', $testData), + ], + 'alhadis' => [ + 'Tercapai' => $this->calculateMeanStdDev('alhadis', 'Tercapai', $testData), + 'Tidak Tercapai' => $this->calculateMeanStdDev('alhadis', 'Tidak Tercapai', $testData), + ], + 'tahun_angkatan' => [ + 'Tercapai' => $this->calculateMeanStdDev('tahun_angkatan', 'Tercapai', $testData), + 'Tidak Tercapai' => $this->calculateMeanStdDev('tahun_angkatan', 'Tidak Tercapai', $testData), + ], + ]; + + + + + return view('pages.admin.test-data', compact( 'testData', 'totalTestData', + 'totalTrainData', + 'trainPercentage', + 'testPercentage', 'accuracy', 'probStatus', 'probGender', 'probRegion', 'peluangGender', - 'peluangRegion' + 'peluangRegion', + 'precision', + 'recall', + 'probNumerik', + 'probKelamin', + 'totalTercapai', + 'totalTidakTercapai', + 'probProvinsi', + 'testLimit', + 'trainLimit', + )); } @@ -111,22 +241,31 @@ public function showClassify() return view('pages.admin.class-result', compact('classifiedData')); } - - private function classifyData() + private function classifyData(Request $request) { - if (TestData::count() == 0) { + $trainPercentage = $request->input('train_percentage', 80); // Default 80% + $testPercentage = 100 - $trainPercentage; + $totalTrainData = TrainData::count(); + $trainLimit = round(($trainPercentage / 100) * $totalTrainData); + $testLimit = round(($testPercentage / 100) * $totalTrainData); + + // Ambil data uji sesuai limit yang dihitung + $testData = TestData::limit($testLimit)->get(); + $totalTestData = $testData->count(); + + if ($totalTestData == 0) { return; } // Ambil data latih untuk model - $trainSamples = TrainData::all()->map(function ($item) { + $trainSamples = TrainData::limit($trainLimit)->get()->map(function ($item) { return [$item->alquran, $item->alhadis]; // Fitur })->toArray(); - $trainLabels = TrainData::pluck('status')->values()->toArray(); + $trainLabels = TrainData::limit($trainLimit)->pluck('status')->values()->toArray(); // Ambil data uji - $testSamples = TestData::all()->map(function ($item) { + $testSamples = $testData->map(function ($item) { return [$item->alquran, $item->alhadis]; // Fitur })->toArray(); @@ -140,7 +279,6 @@ private function classifyData() $predictedLabels = $classifier->predict($testSamples); // Simpan hasil prediksi - $testData = TestData::all(); foreach ($testData as $index => $data) { $data->predicted_status = $predictedLabels[$index] ?? 'Belum Diklasifikasi'; $data->save(); @@ -153,9 +291,41 @@ private function classifyData() ]); } + public function resetData() { TestData::query()->delete(); return back()->with('success', 'Data uji telah direset.'); } + + private function calculateMeanStdDev($column, $status, $testData) + { + // Filter data sesuai status dan ambil nilai kolom yang diminta + $data = $testData->where('status', $status)->pluck($column); + + $count = $data->count(); + $mean = $count > 0 ? $data->average() : 0; + + // Hitung standar deviasi + $std_dev = $count > 1 ? sqrt($data->map(fn($x) => pow($x - $mean, 2))->sum() / ($count - 1)) : 0; + + return [ + 'mean' => $mean, + 'std_dev' => $std_dev + ]; + } + + + public function setPercentage(Request $request) + { + // Mengambil persentase dari input pengguna atau default 80% + $trainPercentage = $request->input('train_percentage', 80); // Default 80% + $testPercentage = 100 - $trainPercentage; + + // Redirect ke halaman test-data dengan persentase yang telah dipilih + return redirect()->route('testData.show', [ + 'train_percentage' => $trainPercentage, + 'test_percentage' => $testPercentage, + ]); + } } diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 5543836..60b7412 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -16,7 +16,7 @@ public function up(): void $table->string('password'); $table->enum('role', ['admin', 'santri'])->default('santri'); $table->enum('jenis_kelamin', ['Laki-laki', 'Perempuan'])->nullable(); - $table->enum('asal_daerah', ['dalamProvinsi', 'luarProvinsi'])->nullable(); + $table->enum('asal_daerah', ['Dalam Provinsi', 'Luar Provinsi'])->nullable(); $table->timestamps(); }); } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index f830bf1..347e798 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -36,7 +36,7 @@ public function run() 'password' => Hash::make('123456'), // password: 123456 'role' => 'santri', 'jenis_kelamin' => 'Laki-laki', - 'asal_daerah' => 'dalamProvinsi', + 'asal_daerah' => 'Dalam Provinsi', ]); } } diff --git a/resources/views/pages/admin/add-santri.blade.php b/resources/views/pages/admin/add-santri.blade.php index 1fc3c60..7879a7f 100644 --- a/resources/views/pages/admin/add-santri.blade.php +++ b/resources/views/pages/admin/add-santri.blade.php @@ -45,7 +45,13 @@ {{ $index + 1 }} {{ $santri->name }} {{ $santri->email }} - {{ $santri->asal_daerah == 'dalamProvinsi' ? 'Dalam Daerah' : 'Luar Provinsi' }} + @if ($santri->asal_daerah === 'dalamProvinsi') + Dalam Provinsi + @elseif ($santri->asal_daerah === 'luarProvinsi') + Luar Provinsi + @else + {{ $santri->asal_daerah }} + @endif {{ $santri->jenis_kelamin }} diff --git a/resources/views/pages/admin/exam-data.blade.php b/resources/views/pages/admin/exam-data.blade.php deleted file mode 100644 index 5b502aa..0000000 --- a/resources/views/pages/admin/exam-data.blade.php +++ /dev/null @@ -1,382 +0,0 @@ -@extends('layouts.app-admin') -Data Uji | SR Klasifikasi - -@section('content') - - -
-
-
-

Data Uji

-
- - - - -
-
-
-
Jumlah Data
-
-
-
- - -
-
-
-
- @csrf - -
-
-
-
-
-
- - -
-
-
-
- -

{{ number_format($accuracy, 2) }}%

-
Akurasi Model
-

Total data diuji: {{ $totalTestData }}

-
-
- -
-
- -

{{ $totalTestData }}

-
Data yang di Uji
-

Diambil dari {{ request('percentage', 100) }}% data latih

-
-
-
-
- -
- -
-
-

Probabilitas Status

-
-
- -
- -
-
-
-
- -
-
{{ number_format($probStatus['Tepat'] ?? 0, 2) }}%
-
Tepat
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
{{ number_format($probStatus['Terlambat'] ?? 0, 2) }}%
-
Terlambat
-
-
-
-
-
-
-
-
-
-
-
- - - -
-
-
-

Probabilitas Lain

-
-
-
- -
-
-
-
Asal Daerah -
-
-
- - - - - - - - - - - - - - - - - - - - -
KategoriJumlahPeluang Tepat Waktu
Dalam Provinsi{{ number_format($probRegion['Dalam Provinsi'] ?? 0, 2) }}%{{ number_format($peluangRegion['Dalam Provinsi'] ?? 0, 2) }}%
Luar Provinsi{{ number_format($probRegion['Luar Provinsi'] ?? 0, 2) }}%{{ number_format($peluangRegion['Luar Provinsi'] ?? 0, 2) }}%
-
-
-
- - -
-
-
-
Jenis - Kelamin -
-
-
- - - - - - - - - - - - - - - - - - - - -
KategoriJumlahPeluang Tepat Waktu
Laki Laki{{ number_format($probGender['Laki-laki'] ?? 0, 2) }}%{{ number_format($peluangGender['Laki-laki'] ?? 0, 2) }}%
Perempuan{{ number_format($probGender['Perempuan'] ?? 0, 2) }}%{{ number_format($peluangGender['Perempuan'] ?? 0, 2) }}%
-
-
-
-
-
- - -
-
-
-
Hasil Uji
-
- - - - - - - - - - - - - - - - @foreach ($testData as $item) - - - - - - - - - - - - @endforeach - -
NamaJenis KelaminNISAsal DaerahTahun AngkatanCapaian HadisCapaian Al Qur'anStatus AktualStatus Prediksi
{{ $item->nama }}{{ $item->jenis_kelamin }}{{ $item->nis }}@if ($item->asal_daerah === 'dalamProvinsi') - Dalam Provinsi - @elseif ($item->asal_daerah === 'luarProvinsi') - Luar Provinsi - @else - {{ $item->asal_daerah }} - @endif{{ $item->tahun_angkatan }}{{ $item->alhadis }}{{ $item->alquran }}{{ $item->status }} - @if ($item->predicted_status == 'Tercapai') - Tepat - @else - Terlambat - @endif -
-
-
-
-
-
-
- - - - - - - - - -@endsection \ No newline at end of file diff --git a/resources/views/pages/admin/test-data.blade.php b/resources/views/pages/admin/test-data.blade.php new file mode 100644 index 0000000..60bf81e --- /dev/null +++ b/resources/views/pages/admin/test-data.blade.php @@ -0,0 +1,682 @@ +@extends('layouts.app-admin') +Data Uji | SR Klasifikasi + +@section('content') + + +
+
+
+

Data Uji

+
+ + + +
+
+
+
+ +
+
Data Latih
+

{{ $trainPercentage }}%

+
+
+
+
+
+
+
+ +
+
Data Uji
+

{{ $testPercentage }}%

+
+
+
+
+
+ + + +{{-- +
+
+
+
Jumlah Data
+
+
+
+ + +
+
+
+
+ @csrf + +
+
+
+
+
+
--}} + + +
+
+
+
+

Jumlah Data

+
+
+
+
+ +

{{$totalTestData}}

+ +
Data yang di Uji
+

Diambil dari sejumlah {{ $totalTrainData }} dengan presentase {{ $testPercentage }}% data latih

+
+
+
+
+ +
+ +
+
+

Probabilitas Kelas

+
+
+ +
+ +
+
+
+
+ +
+
{{ number_format($probStatus['Tepat'] ?? 0, 2) }}%
+
Tepat
+ Sejumlah {{ $totalTercapai }} dari {{ $totalTestData }} data +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
{{ number_format($probStatus['Terlambat'] ?? 0, 2) }}%
+
Terlambat
+ Sejumlah {{ $totalTidakTercapai }} dari {{ $totalTestData }} data +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+

Probabilitas Atribut Numerik

+
+
+ +
+ +
+
+
+ + + +
+
Capaian Al-Qur'an
+

Mean

+
+
+

Tercapai

+

{{ number_format($probNumerik['alquran']['Tercapai']['mean'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['alquran']['Tidak Tercapai']['mean'], 2) }}

+
+
+
+

Standar Deviasi

+
+
+

Tercapai

+

{{ number_format($probNumerik['alquran']['Tercapai']['std_dev'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['alquran']['Tidak Tercapai']['std_dev'], 2) }}

+
+
+
+
+ + +
+
+
+ + + +
+
Capaian Al-Hadis
+

Mean

+
+
+

Tercapai

+

{{ number_format($probNumerik['alhadis']['Tercapai']['mean'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['alhadis']['Tidak Tercapai']['mean'], 2) }}

+
+
+
+

Standar Deviasi

+
+
+

Tercapai

+

{{ number_format($probNumerik['alhadis']['Tercapai']['std_dev'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['alhadis']['Tidak Tercapai']['std_dev'], 2) }}

+
+
+
+
+ + +
+
+
+ + + +
+
Tahun Angkatan
+

Mean

+
+
+

Tercapai

+

{{ number_format($probNumerik['tahun_angkatan']['Tercapai']['mean'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['tahun_angkatan']['Tidak Tercapai']['mean'], 2) }}

+
+
+
+

Standar Deviasi

+
+
+

Tercapai

+

{{ number_format($probNumerik['tahun_angkatan']['Tercapai']['std_dev'], 2) }}

+
+
+

Tidak Tercapai

+

{{ number_format($probNumerik['tahun_angkatan']['Tidak Tercapai']['std_dev'], 2) }}

+
+
+
+
+
+
+ + + +
+
+
+

Probabilitas Atribut Kategorik

+
+
+
+ +
+
+
+
Jenis + Kelamin +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
StatusLaki-lakiPerempuan
Tercapai{{ number_format($probKelamin['Tercapai']['Laki-laki']['probability'] * 100, 2) }}% ({{ $probKelamin['Tercapai']['Laki-laki']['count'] }}/{{ $totalTercapai }}){{ number_format($probKelamin['Tercapai']['Perempuan']['probability'] * 100, 2) }}% ({{ $probKelamin['Tercapai']['Perempuan']['count'] }}/{{ $totalTercapai }})
Tidak Tercapai{{ number_format($probKelamin['Tidak Tercapai']['Laki-laki']['probability'] * 100, 2) }}% ({{ $probKelamin['Tidak Tercapai']['Laki-laki']['count'] }}/{{ $totalTidakTercapai }}){{ number_format($probKelamin['Tidak Tercapai']['Perempuan']['probability'] * 100, 2) }}% ({{ $probKelamin['Tidak Tercapai']['Perempuan']['count'] }}/{{ $totalTidakTercapai }})
+
+
+
+ + +
+
+
+
Asal Daerah +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
StatusDalam ProvinsiLuar Provinsi
Tercapai{{ number_format($probProvinsi['Tercapai']['Dalam Provinsi']['probability'] * 100, 2) }}% ({{ $probProvinsi['Tercapai']['Dalam Provinsi']['count'] }}/{{ $totalTercapai }}){{ number_format($probProvinsi['Tercapai']['Luar Provinsi']['probability'] * 100, 2) }}% ({{ $probProvinsi['Tercapai']['Luar Provinsi']['count'] }}/{{ $totalTercapai }})
Tidak Tercapai{{ number_format($probProvinsi['Tidak Tercapai']['Dalam Provinsi']['probability'] * 100, 2) }}% ({{ $probProvinsi['Tidak Tercapai']['Dalam Provinsi']['count'] }}/{{ $totalTidakTercapai }}){{ number_format($probProvinsi['Tidak Tercapai']['Luar Provinsi']['probability'] * 100, 2) }}% ({{ $probProvinsi['Tidak Tercapai']['Luar Provinsi']['count'] }}/{{ $totalTidakTercapai }})
+
+
+
+
+
+ +
+
+
+

Peluang

+
+
+
+ +
+
+
+
Asal Daerah +
+
+
+ + + + + + + + + + + + + + + + + + + + +
KategoriJumlahPeluang Tepat Waktu
Dalam Provinsi{{ number_format($probRegion['Dalam Provinsi']['probability'] ?? 0, 2) }}%{{ number_format($peluangRegion['Dalam Provinsi']['peluang'] ?? 0, 2) }}%
Luar Provinsi{{ number_format($probRegion['Luar Provinsi']['probability'] ?? 0, 2) }}%{{ number_format($peluangRegion['Luar Provinsi']['peluang'] ?? 0, 2) }}%
+
+
+
+ + +
+
+
+
Jenis + Kelamin +
+
+
+ + + + + + + + + + + + + + + + + + + + +
KategoriJumlahPeluang Tepat Waktu
Laki Laki{{ number_format($probGender['Laki-laki']['probability'] ?? 0, 2) }}%{{ number_format($peluangGender['Laki-laki']['peluang'] ?? 0, 2) }}%
Perempuan{{ number_format($probGender['Perempuan']['probability'] ?? 0, 2) }}%{{ number_format($peluangGender['Perempuan']['peluang'] ?? 0, 2) }}%
+
+
+
+
+
+ + +
+
+
+

Hasil Klasifikasi

+
+
+
+
+
+
Hasil
+ + +
+ +
+ + + + + + + + + + + + + + + + @foreach ($testData as $item) + + + + + + + + + + + + @endforeach + +
NamaJenis KelaminNISAsal DaerahTahun AngkatanCapaian HadisCapaian Al Qur'anStatus AktualStatus Prediksi
{{ $item->nama }}{{ $item->jenis_kelamin }}{{ $item->nis }} + @if ($item->asal_daerah === 'dalamProvinsi') + Dalam Provinsi + @elseif ($item->asal_daerah === 'luarProvinsi') + Luar Provinsi + @else + {{ $item->asal_daerah }} + @endif + {{ $item->tahun_angkatan }}{{ $item->alhadis }}{{ $item->alquran }}{{ $item->status }} + @if ($item->predicted_status == 'Tercapai') + Tepat + @else + Terlambat + @endif +
+
+ +
+
+
+ +
+
+
+

Conffusion Matrix

+
+
+
+ +
+
+ +

{{ number_format($accuracy, 2) }}%

+
Akurasi Model
+
+
+ + +
+
+ +

{{ number_format($precision, 2) }}%

+
Precision
+
+
+ + +
+
+ +

{{ number_format($recall, 2) }}%

+
Recall
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + +@endsection \ No newline at end of file diff --git a/resources/views/pages/admin/train-data.blade.php b/resources/views/pages/admin/train-data.blade.php index 03339f2..b867117 100644 --- a/resources/views/pages/admin/train-data.blade.php +++ b/resources/views/pages/admin/train-data.blade.php @@ -25,6 +25,9 @@ }); @endif + + +
@@ -62,6 +65,38 @@ class="btn btn-warning w-100 d-flex align-items-center justify-content-center ga
+ + +
+
+
+
Bagi Data
+
+
+
+ + +
+
+
+
+
+
+
diff --git a/resources/views/pages/auth/register.blade.php b/resources/views/pages/auth/register.blade.php index b0dae8c..2d7a26c 100644 --- a/resources/views/pages/auth/register.blade.php +++ b/resources/views/pages/auth/register.blade.php @@ -94,8 +94,8 @@
Pilih Asal Daerah Anda
diff --git a/resources/views/pages/santri/profil.blade.php b/resources/views/pages/santri/profil.blade.php index 40d4e98..4731c20 100644 --- a/resources/views/pages/santri/profil.blade.php +++ b/resources/views/pages/santri/profil.blade.php @@ -64,9 +64,9 @@
diff --git a/routes/web.php b/routes/web.php index badfeb5..1023c95 100644 --- a/routes/web.php +++ b/routes/web.php @@ -84,6 +84,7 @@ ->name('trainData.delete'); Route::post('/admin/trainData/reset', [ClassificationController::class, 'resetTrainData']) ->name('trainData.reset'); + Route::get('/trainData/setPercentage', [TestDataController::class, 'setPercentage'])->name('trainData.setPercentage'); // Exam Data........................... Route::get('/admin/testData', [TestDataController::class, 'showTestData'])->name('testData.show'); Route::post('/admin/testData/classify', [TestDataController::class, 'classifyData'])->name('testData.classify');