MIF_E31210809/app/Http/Controllers/AlgoritmaController.php

507 lines
28 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Confidence;
use App\Models\EclatCalculation;
use App\Models\EclatResult;
use App\Models\EclatResultDetail;
use App\Models\Itemset1;
use App\Models\Itemset2;
use App\Models\Itemset3;
use App\Models\Proses;
use App\Models\Transaksi;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class AlgoritmaController extends Controller
{
public function index()
{
return view('layouts.pages.algoritma');
}
public function filter(Request $request)
{
$tanggal_dari = $request->input('tanggal_dari');
$tanggal_sampai = $request->input('tanggal_sampai');
$min_support = $request->input('min_support');
$min_confidance = $request->input('min_confidance');
$proses = Proses::create([
'start' => $tanggal_dari,
'end' => $tanggal_sampai,
'min_support' => $min_support,
'min_confidence' => $min_confidance,
]);
$transaksi = Transaksi::whereBetween('tanggal', [$tanggal_dari, $tanggal_sampai])->get();
$totalTransactions = $transaksi->count();
$itemsets = $this->generateItemsets($transaksi);
// Convert transactions to vertical format
$verticalData = $this->convertToVerticalFormat($transaksi);
// dd($itemsets);
list($itemset1, $itemset2, $itemset3) = $this->calculateEclat($proses->id, $transaksi, $itemsets, $min_support, $min_confidance, $totalTransactions);
return view('layouts.pages.algoritma', compact('totalTransactions', 'verticalData', 'itemset1', 'itemset2', 'itemset3'));
}
private function generateItemsets($transaksi)
{
$itemsets = [];
foreach ($transaksi as $trans) {
$items = array_unique(array_map('trim', explode(',', $trans->obat)));
foreach ($items as $item) {
$normalizedItem = strtolower(str_replace(' ', '', $item));
if (!isset($itemsets[$normalizedItem])) {
$itemsets[$normalizedItem] = [];
}
$itemsets[$normalizedItem][] = $trans->id;
}
}
return $itemsets;
}
private function convertToVerticalFormat($transaksi)
{
$verticalData = [];
foreach ($transaksi as $trans) {
$items = explode(',', $trans->obat);
foreach ($items as $item) {
if (!isset($verticalData[$item])) {
$verticalData[$item] = array_fill_keys($transaksi->pluck('id')->toArray(), 0);
}
$verticalData[$item][$trans->id] = 1;
}
}
return $verticalData;
}
private function calculateEclat($prosesid, $transaksi, $itemsets, $min_support, $min_confidance, $totalTransactions)
{
$min_support_count = $min_support / $totalTransactions;
$itemset1 = [];
$itemset2 = [];
$itemset3 = [];
$confidenceResults2 = [];
$confidenceResults3 = [];
// Calculate 1-itemsets
foreach ($itemsets as $item => $transactions) {
$support = count($transactions);
$supportValue = $support / $totalTransactions;
$itemset1[] = [
'item' => $item,
'support' => $supportValue,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos',
'proses_id' => $prosesid,
];
$itemset1Model = new Itemset1();
$itemset1Model->saveItemsets([
'atribut' => $item,
'support' => $supportValue,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos',
'proses_id' => $prosesid,
]);
}
$filteredItemset1 = array_filter($itemset1, function ($itemset) {
return $itemset['keterangan'] == 'Lolos';
});
// Calculate 2-itemsets
foreach ($itemset1 as $item1) {
if ($item1['keterangan'] == 'Lolos') {
foreach ($itemset1 as $item2) {
if ($item2['keterangan'] == 'Lolos' && $item1['item'] != $item2['item']) {
$sortedItems = array_merge(array($item1['item']), array($item2['item']));
sort($sortedItems);
$itemSetKey = implode(',', $sortedItems);
if (!isset($itemset2[$itemSetKey])) {
$support = 0;
foreach ($transaksi as $trans) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans->obat));
if (in_array($item1['item'], $items) && in_array($item2['item'], $items)) {
$support++;
}
}
$supportValue = $support / $totalTransactions;
$jumlah = $support;
$itemset2[$itemSetKey] = [
'item1' => $sortedItems[0],
'item2' => $sortedItems[1],
'support' => $supportValue,
'jumlah' => $jumlah,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos'
];
$itemset2Model = new Itemset2();
$createdItemset2 = $itemset2Model->saveItemsets([
'atribut' => "{$itemSetKey}",
'support' => $supportValue,
'jumlah' => $jumlah,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos',
'proses_id' => $prosesid
]);
if (is_null($createdItemset2->id)) {
throw new Exception('Itemset2 ID is null after creation');
}
// $filteredItemset2 = array_filter($itemset2, function ($itemset) {
// return $itemset['keterangan'] == 'Lolos';
// });
if ($supportValue >= $min_support_count) {
$countA = count($itemsets[$sortedItems[0]]);
$countB = count($itemsets[$sortedItems[1]]);
$confidenceAB = $support / $countA;
$confidenceBA = $support / $countB;
$supportA2 = $countA / $totalTransactions;
$supportB2 = $countB / $totalTransactions;
$liftAB = $supportValue / ($supportA2 * $supportB2);
$liftBA = $supportValue / ($supportB2 * $supportA2);
$confidenceKeys2 = [];
$confidenceResults2[] = [
'item1' => $sortedItems[0],
'item2' => $sortedItems[1],
'support' => $supportValue,
'confidence' => "{$support} / {$countA} = {$confidenceAB}",
'lift' => "{$supportValue} / {$supportA2} * {$supportB2} = {$liftAB}",
'korelasi' => $liftAB > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAB > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults2[] = [
'item1' => $sortedItems[1],
'item2' => $sortedItems[0],
'support' => $supportValue,
'confidence' => "{$support} / {$countB} = {$confidenceBA}",
'lift' => "{$supportValue} / {$supportB2} * {$supportA2} = {$liftBA}",
'korelasi' => $liftBA > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceBA > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem2[] = [
'item1' => $sortedItems[1],
'item2' => $sortedItems[0],
'support' => $supportValue,
'confidence' => "{$support} / {$countB} = {$confidenceBA}",
'lift' => "{$supportValue} / {$supportB2} * {$supportA2} = {$liftBA}",
'korelasi' => $liftBA > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceBA > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem2[] = [
'item1' => $sortedItems[0],
'item2' => $sortedItems[1],
'support' => $supportValue,
'confidence' => "{$support} / {$countA} = {$confidenceAB}",
'lift' => "{$supportValue} / {$supportA2} * {$supportB2} = {$liftAB}",
'korelasi' => $liftAB > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAB > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
// $filteredItemset2 = array_filter($itemset2, function ($itemset) {
// return $itemset['keterangan'] == 'Lolos';
// });
// dd($itemset2, $filteredItemset2, $confidenceResults2, $filteredItemset2);
$uniqueConfidenceResults2 = [];
foreach ($confidenceResults2 as $result) {
$key = $result['item1'];
if (!isset($confidenceKeys2[$key])) {
$confidenceKeys2[$key] = true;
$uniqueConfidenceResults2[] = $result;
}
}
foreach ($uniqueConfidenceResults2 as $confidence2Result) {
$confidence = new Confidence();
$confidence->items = "{$confidence2Result['item1']},{$confidence2Result['item2']}";
$confidence->confidence = $confidence2Result['confidence'];
$confidence->lift_ratio = $confidence2Result['lift'];
$confidence->itemset = '2-item';
$confidence->proses_id = $prosesid;
$confidence->keterangan = $confidence2Result['keterangan'];
$confidence->korelasi = $confidence2Result['korelasi'];
$confidence->save();
}
$confidenceResults2 = [];
}
}
}
}
}
}
// Calculate 3-itemsets (using filtered itemset2 for efficiency)
$filteredItemset2 = array_filter($itemset2, function ($itemset) {
return $itemset['keterangan'] == 'Lolos';
});
$filteredConfidenceItemset2 = array_filter($confidenceResultsitem2, function ($itemset) {
return $itemset['keterangan'] == 'Lolos';
});
foreach ($filteredItemset2 as $itemset2Key => $itemset2Value) {
$items2 = explode(',', $itemset2Key);
foreach ($itemset1 as $item1) {
if ($item1['keterangan'] == 'Lolos' && !in_array($item1['item'], $items2)) {
$sortedItems = array_merge($items2, array($item1['item']));
sort($sortedItems);
$itemSetKey = implode(',', $sortedItems);
if (!isset($itemset3[$itemSetKey])) {
$support = 0;
foreach ($transaksi as $trans) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans->obat));
if (in_array($sortedItems[0], $items) && in_array($sortedItems[1], $items) && in_array($sortedItems[2], $items)) {
$support++;
}
}
$supportValue = $support / $totalTransactions;
$jumlah = $support;
$itemset3[$itemSetKey] = [
'item1' => $sortedItems[0],
'item2' => $sortedItems[1],
'item3' => $sortedItems[2],
'support' => $supportValue,
'jumlah' => $jumlah,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos',
];
$itemset3Model = new Itemset3();
$createdItemset3 = $itemset3Model->saveItemsets([
'atribut' => "{$itemSetKey}",
'support' => $supportValue,
'jumlah' => $jumlah,
'keterangan' => $supportValue >= $min_support_count ? 'Lolos' : 'Tidak Lolos',
'proses_id' => $prosesid
]);
if ($supportValue >= $min_support_count) {
// Convert Eloquent collection to array
$transaksiArray = $transaksi->toArray();
// Calculate total counts for confidence
$totalAB = $totalBC = $totalAC = 0;
foreach ($transaksiArray as $trans) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans['obat']));
if (in_array($sortedItems[0], $items) && in_array($sortedItems[1], $items)) {
$totalAB++;
}
if (in_array($sortedItems[1], $items) && in_array($sortedItems[2], $items)) {
$totalBC++;
}
if (in_array($sortedItems[0], $items) && in_array($sortedItems[2], $items)) {
$totalAC++;
}
}
// Calculate support for individual pairs
$supportAB = $totalAB / $totalTransactions;
$supportBC = $totalBC / $totalTransactions;
$supportAC = $totalAC / $totalTransactions;
// Calculate confidence
$confidenceAB_C = ($totalAB != 0) ? $support / $totalAB : 0;
$confidenceBC_A = ($totalBC != 0) ? $support / $totalBC : 0;
$confidenceAC_B = ($totalAC != 0) ? $support / $totalAC : 0;
// Calculate lift
$supportA = count(array_filter($transaksiArray, function ($trans) use ($sortedItems) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans['obat']));
return in_array($sortedItems[0], $items);
})) / $totalTransactions;
$supportB = count(array_filter($transaksiArray, function ($trans) use ($sortedItems) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans['obat']));
return in_array($sortedItems[1], $items);
})) / $totalTransactions;
$supportC = count(array_filter($transaksiArray, function ($trans) use ($sortedItems) {
$items = array_map(function ($item) {
return strtolower(str_replace(' ', '', $item));
}, explode(',', $trans['obat']));
return in_array($sortedItems[2], $items);
})) / $totalTransactions;
$liftAB_C = ($supportAB != 0 && $supportC != 0) ? $supportValue / ($supportAB * $supportC) : 0;
$liftBC_A = ($supportBC != 0 && $supportA != 0) ? $supportValue / ($supportBC * $supportA) : 0;
$liftAC_B = ($supportAC != 0 && $supportB != 0) ? $supportValue / ($supportAC * $supportB) : 0;
// Create unique key for each confidence result
$confidenceKeys = [];
$confidenceResults3[] = [
'items' => "{$sortedItems[0]}, {$sortedItems[1]} -> {$sortedItems[2]}",
'confidence' => "{$support} / {$totalAB} = {$confidenceAB_C}",
'lift' => "{$supportValue} / ({$supportAB} * {$supportC}) = {$liftAB_C}",
'korelasi' => $liftAB_C > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAB_C > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults3[] = [
'items' => "{$sortedItems[1]}, {$sortedItems[2]} -> {$sortedItems[0]}",
'confidence' => "{$support} / {$totalBC} = {$confidenceBC_A}",
'lift' => "{$supportValue} / ({$supportBC} * {$supportA}) = {$liftBC_A}",
'korelasi' => $liftBC_A > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceBC_A > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults3[] = [
'items' => "{$sortedItems[0]}, {$sortedItems[2]} -> {$sortedItems[1]}",
'confidence' => "{$support} / {$totalAC} = {$confidenceAC_B}",
'lift' => "{$supportValue} / ({$supportAC} * {$supportB}) = {$liftAC_B}",
'korelasi' => $liftAC_B > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAC_B > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults3[] = [
'items' => "{$sortedItems[0]} -> {$sortedItems[1]}, {$sortedItems[2]}",
'confidence' => count($itemsets[$sortedItems[0]]) != 0 ? $support / count($itemsets[$sortedItems[0]]) : 0,
'lift' => "{$supportValue} / ({$supportA} * {$supportBC})",
'korelasi' => ($supportA != 0 && $supportBC != 0) ? ($supportValue / ($supportA * $supportBC)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[0]]) != 0 ? ($support / count($itemsets[$sortedItems[0]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults3[] = [
'items' => "{$sortedItems[1]} -> {$sortedItems[0]}, {$sortedItems[2]}",
'confidence' => count($itemsets[$sortedItems[1]]) != 0 ? $support / count($itemsets[$sortedItems[1]]) : 0,
'lift' => "{$supportValue} / ({$supportB} * {$supportAC})",
'korelasi' => ($supportB != 0 && $supportAC != 0) ? ($supportValue / ($supportB * $supportAC)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[1]]) != 0 ? ($support / count($itemsets[$sortedItems[1]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResults3[] = [
'items' => "{$sortedItems[2]} -> {$sortedItems[0]}, {$sortedItems[1]}",
'confidence' => count($itemsets[$sortedItems[2]]) != 0 ? $support / count($itemsets[$sortedItems[2]]) : 0,
'lift' => "{$supportValue} / ({$supportC} * {$supportAB})",
'korelasi' => ($supportC != 0 && $supportAB != 0) ? ($supportValue / ($supportC * $supportAB)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[2]]) != 0 ? ($support / count($itemsets[$sortedItems[2]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[0]}, {$sortedItems[1]} -> {$sortedItems[2]}",
'confidence' => "{$support} / {$totalAB} = {$confidenceAB_C}",
'lift' => "{$supportValue} / ({$supportAB} * {$supportC}) = {$liftAB_C}",
'korelasi' => $liftAB_C > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAB_C > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[1]}, {$sortedItems[2]} -> {$sortedItems[0]}",
'confidence' => "{$support} / {$totalBC} = {$confidenceBC_A}",
'lift' => "{$supportValue} / ({$supportBC} * {$supportA}) = {$liftBC_A}",
'korelasi' => $liftBC_A > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceBC_A > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[0]}, {$sortedItems[2]} -> {$sortedItems[1]}",
'confidence' => "{$support} / {$totalAC} = {$confidenceAC_B}",
'lift' => "{$supportValue} / ({$supportAC} * {$supportB}) = {$liftAC_B}",
'korelasi' => $liftAC_B > 1 ? 'Korelasi Positif' : 'Korelasi Negatif',
'keterangan' => $confidenceAC_B > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[0]} -> {$sortedItems[1]}, {$sortedItems[2]}",
'confidence' => count($itemsets[$sortedItems[0]]) != 0 ? $support / count($itemsets[$sortedItems[0]]) : 0,
'lift' => "{$supportValue} / ({$supportA} * {$supportBC})",
'korelasi' => ($supportA != 0 && $supportBC != 0) ? ($supportValue / ($supportA * $supportBC)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[0]]) != 0 ? ($support / count($itemsets[$sortedItems[0]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[1]} -> {$sortedItems[0]}, {$sortedItems[2]}",
'confidence' => count($itemsets[$sortedItems[1]]) != 0 ? $support / count($itemsets[$sortedItems[1]]) : 0,
'lift' => "{$supportValue} / ({$supportB} * {$supportAC})",
'korelasi' => ($supportB != 0 && $supportAC != 0) ? ($supportValue / ($supportB * $supportAC)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[1]]) != 0 ? ($support / count($itemsets[$sortedItems[1]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
$confidenceResultsitem3[] = [
'items' => "{$sortedItems[2]} -> {$sortedItems[0]}, {$sortedItems[1]}",
'confidence' => count($itemsets[$sortedItems[2]]) != 0 ? $support / count($itemsets[$sortedItems[2]]) : 0,
'lift' => "{$supportValue} / ({$supportC} * {$supportAB})",
'korelasi' => ($supportC != 0 && $supportAB != 0) ? ($supportValue / ($supportC * $supportAB)) > 1 ? 'Korelasi Positif' : 'Korelasi Negatif' : 'Tidak Diketahui',
'keterangan' => (count($itemsets[$sortedItems[2]]) != 0 ? ($support / count($itemsets[$sortedItems[2]])) : 0) > $min_confidance ? 'Lolos' : 'Tidak Lolos'
];
// Filter duplicate data from confidenceResults3
$uniqueConfidenceResults3 = [];
foreach ($confidenceResults3 as $result) {
$key = $result['items'];
if (!isset($confidenceKeys[$key])) {
$confidenceKeys[$key] = true;
$uniqueConfidenceResults3[] = $result;
}
}
foreach ($uniqueConfidenceResults3 as $confidenceResult) {
$confidence = new Confidence();
$confidence->items = $confidenceResult['items'];
$confidence->confidence = $confidenceResult['confidence'];
$confidence->lift_ratio = $confidenceResult['lift'];
$confidence->keterangan = $confidenceResult['keterangan'];
$confidence->itemset = '3-item';
$confidence->proses_id = $prosesid;
$confidence->korelasi = $confidenceResult['korelasi'];
$confidence->save();
}
// Kosongkan array confidenceResults3 setelah disimpan untuk menghindari duplikasi
$confidenceResults3 = [];
}
}
}
}
}
$filteredItemset3 = array_filter($itemset3, function ($item) {
return $item['keterangan'] == 'Lolos';
});
$filteredConfidenceItemset3 = array_filter($confidenceResultsitem3, function ($itemset) {
return $itemset['keterangan'] == 'Lolos';
});
dd($totalTransactions, $itemset1, $filteredItemset1, $itemset2, $filteredItemset2, $itemset3, $filteredItemset3, $filteredConfidenceItemset2, $confidenceResultsitem3, $filteredConfidenceItemset3);
dd($confidenceResults2, $confidenceResults3);
return [$itemset1, $itemset2, $itemset3];
}
}