jellysquish/Dataset-EfficientDrivingTimeDeterminationSystem
import re import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder from google.colab import drive from sklearn.tree import export_text from sklearn.metrics import accuracy_score 1. Mount Google Drive drive.mount('/content/drive') 2. Baca file Excel file_path = '/content/drive/MyDrive/Colab Notebooks/AI_GACOR_Cleaned.xlsx' data = pd.read_excel(file_path) 3. Encode kolom 'Hari'… See the full description on the dataset page: https://huggingface.co/datasets/jellysquish/Dataset-EfficientDrivingTimeDeterminationSystem.
import re import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder from google.colab import drive from sklearn.tree import exporttext from sklearn.metrics import accuracyscore
1. Mount Google Drive
drive.mount('/content/drive')
2. Baca file Excel
filepath = '/content/drive/MyDrive/Colab Notebooks/AIGACORCleaned.xlsx' data = pd.readexcel(file_path)
3. Encode kolom 'Hari'
labelencoderhari = LabelEncoder() data['hariencoded'] = labelencoderhari.fittransform(data['Hari'])
4. Mapping wilayah ke format long dataframe
wilayahcols = ['Jakarta Barat', 'Jakarta Pusat', 'Jakarta Selatan', 'Jakarta Utara', 'Jakarta Timur'] statuscols = wilayahcols[:] kategoricols = ['KategoriAkhirJakbar', 'KategoriAkhirJakpus', 'KategoriAkhirJaksel', 'KategoriAkhirJakut', 'KategoriAkhirJaktim']
data_list = []
for i, wilayah in enumerate(wilayahcols): tempdf = data[['Hari', 'Waktu']].copy() tempdf['Wilayah'] = wilayah tempdf['Koefisien'] = data[statuscols[i]] tempdf['Kategori Akhir'] = data[kategoricols[i]] tempdf['Total Macet'] = data['Total Macet'] tempdf['Panjang Kemacetan'] = data['Panjang Kemacetan'] tempdf['Congestion'] = data['Congestion'] datalist.append(tempdf)
Gabung semua wilayah jadi satu dataset
datacombined = pd.concat(datalist, ignore_index=True)
Bersihkan whitespace & kapitalisasi di Kategori Akhir
datacombined['Kategori Akhir'] = datacombined['Kategori Akhir'].str.strip().str.title()
5. Tambahkan hariencoded ke datacombined
datacombined = datacombined.merge( data[['Hari', 'hariencoded']].dropduplicates(), on='Hari', how='left' )
print(data_combined.head(200))
6. Encode kolom kategori lainnya
labelencoderwilayah = LabelEncoder() datacombined['wilayahencoded'] = labelencoderwilayah.fittransform(datacombined['Wilayah'])
labelencoderkategori = LabelEncoder() datacombined['kategoriencoded'] = labelencoderkategori.fittransform(datacombined['Kategori Akhir'])
Urutan kelas yang diharapkan
expectedclasses = ['Lancar', 'Moderate', 'Macet'] if not all(labelencoderkategori.classes == expectedclasses): labelencoderkategori = LabelEncoder() labelencoderkategori.fit(expectedclasses) # Force order datacombined['kategoriencoded'] = labelencoderkategori.transform(data_combined['Kategori Akhir'])
7. Definisi fitur dan latih model
X = datacombined[[ 'hariencoded', 'Waktu', 'wilayahencoded', 'Koefisien', 'Total Macet', 'Panjang Kemacetan', 'Congestion' ]] y = datacombined['kategori_encoded']
model = DecisionTreeClassifier(max_depth=5) model.fit(X, y)
Cek akurasi
ypred = model.predict(X) print(f"Akurasi model: {accuracyscore(y, y_pred):.2f}")
8. Fungsi prediksi
def prediksikemacetan(hari, jam, wilayah, Koefisien, TotalMacet, PanjangKemacetan, Congestion): hariencoded = labelencoderhari.transform([hari])[0] wilayahencoded = labelencoder_wilayah.transform([wilayah])[0]
inputdf = pd.DataFrame([[hariencoded, jam, wilayahencoded, Koefisien, TotalMacet, Panjang_Kemacetan, Congestion]], columns=X.columns)
prediksiencoded = model.predict(inputdf)[0] proba = model.predictproba(inputdf)[0]
prediksilabel = labelencoderkategori.inversetransform([prediksi_encoded])[0]
print("\nConfidence Level:") for idx, cls in enumerate(labelencoderkategori.classes_): print(f"{cls}: {proba[idx]:.2%}")
return prediksi_label
9. Contoh penggunaan fungsi prediksi
print("\nContoh Prediksi:") try:
hasil = prediksikemacetan('Selasa', 16, 'Jakarta Selatan', 34.6, 149, 94, 83) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Kamis', 11, 'Jakarta Selatan', 3, 7, 5.7, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Jumat', 11, 'Jakarta Selatan', 27.6, 91, 71.1, 50) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Jumat', 19, 'Jakarta Selatan', 44.4, 12, 6.7, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Sabtu', 10, 'Jakarta Selatan', 18, 6, 2.4, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Minggu', 11, 'Jakarta Selatan', 18.6, 15, 5.2, 14) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil)
hasil = prediksikemacetan('Rabu', 14, 'Jakarta Barat', 25.7, 136, 94.5, 69) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Selasa', 15, 'Jakarta Barat', 25, 89, 48.9, 53) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Selasa', 19, 'Jakarta Barat', 23.7, 200, 120.3, 113) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Kamis', 11, 'Jakarta Barat', 1.7, 7, 5.7, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Senin', 8, 'Jakarta Barat', 18.4, 7, 2.7, 24) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Minggu', 11, 'Jakarta Barat', 9, 15, 5.2, 14) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil)
hasil = prediksikemacetan('Selasa', 15, 'Jakarta Pusat', 48.7, 89, 48.9, 53) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Selasa', 19, 'Jakarta Pusat', 31.8, 200, 120.3, 113) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Senin', 10, 'Jakarta Pusat', 24.2, 20, 13.2, 22) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Kamis', 11, 'Jakarta Pusat', 21.8, 7, 5.7, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Jumat', 14, 'Jakarta Pusat', 32.8, 5, 1.6, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Sabtu', 10, 'Jakarta Pusat', 15.5, 6, 2.4, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil)
hasil = prediksikemacetan('Rabu', 14, 'Jakarta Timur', 26.8, 136, 94.5, 69) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Selasa', 16, 'Jakarta Timur', 37.5, 149, 94, 83) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Kamis', 11, 'Jakarta Timur', 3.1, 7, 5.7, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Jumat', 19, 'Jakarta Timur', 37.5, 12, 6.7, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Sabtu', 10, 'Jakarta Timur', 15.5, 6, 2.4, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Minggu', 12, 'Jakarta Timur', 26.3, 20, 13.2, 22) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil)
hasil = prediksikemacetan('Rabu', 14, 'Jakarta Utara', 31.7, 136, 94.5, 69) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Selasa', 16, 'Jakarta Utara', 35.8, 149, 94, 83) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Kamis', 11, 'Jakarta Utara', 21.8, 7, 5.7, 16) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Jumat', 12, 'Jakarta Utara', 19, 5, 2.5, 0) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Sabtu', 10, 'Jakarta Utara', 15.5, 6, 2.4, 21) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil) hasil = prediksikemacetan('Minggu', 8, 'Jakarta Utara', 26.3, 7, 2.7, 24) #hari , jam, wilayah, koefisien, Totalmacet, PanjangKemacetan, Congestion print("Hasil Prediksi:", hasil)
except ValueError as e: print(e)
10. Export rules tree dengan label asli
harimapping = dict(zip(labelencoderhari.transform(labelencoderhari.classes), labelencoderhari.classes)) wilayahmapping = dict(zip(labelencoderwilayah.transform(labelencoderwilayah.classes), labelencoderwilayah.classes)) kategorimapping = dict(zip(labelencoderkategori.transform(labelencoderkategori.classes), labelencoderkategori.classes_))
featurenamesencoded = X.columns.tolist()
def replaceencodedwithlabels(rulestext, harimap, wilayahmap, kategorimap): # Ganti hariencoded for idx, hari in harimap.items(): rulestext = rulestext.replace(f'hariencoded == {idx}', f'Hari == "{hari}"') rulestext = rulestext.replace(f'hariencoded <= {idx}', f'Hari <= "{hari}"') rulestext = rulestext.replace(f'hariencoded > {idx}', f'Hari > "{hari}"')
# Ganti wilayahencoded for idx, wilayah in wilayahmap.items(): rulestext = rulestext.replace(f'wilayahencoded == {idx}', f'Wilayah == "{wilayah}"') rulestext = rulestext.replace(f'wilayahencoded <= {idx}', f'Wilayah <= "{wilayah}"') rulestext = rulestext.replace(f'wilayah_encoded > {idx}', f'Wilayah > "{wilayah}"')
# Ganti class encoded for idx, kategori in kategorimap.items(): rulestext = rules_text.replace(f'class: {idx}', f'class: {kategori}')
return rules_text
treerules = exporttext(model, featurenames=featurenamesencoded) treerulesreadable = replaceencodedwithlabels(treerules, harimapping, wilayahmapping, kategorimapping)
print("\nAturan Decision Tree (Dengan Label Asli):\n") print(treerulesreadable)
11. Analisis Feature Importance
importances = model.featureimportances feature_names = X.columns
Buat DataFrame
featureimportancedf = pd.DataFrame({ 'Feature': feature_names, 'Importance': importances })
Urutkan dari yang paling penting
featureimportancedf = featureimportancedf.sortvalues(by='Importance', ascending=False).resetindex(drop=True)
Tambahkan nomor urut
featureimportancedf.index = featureimportancedf.index + 1 featureimportancedf.index.name = 'No'
Reset index agar No menjadi kolom
featureimportancedf.reset_index(inplace=True)
8. Tampilkan hasil dalam format mudah dibaca
print("Feature Importance (Terurut):") for idx, row in featureimportancedf.iterrows(): print(f"{row['No']}. {row['Feature']:<20} : {row['Importance']:.6f}")
