PT Muhamad garasi kpc
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, confusion_matrix import warnings warnings.filterwarnings('ignore')
class CreditProblemAnalyzer: def init(self): self.scaler = StandardScaler() self.model = None self.feature_columns = 'jumlah_kredit', 'tenor_bulan', 'bunga_per_tahun', 'keterlambatan_pembayaran', 'jumlah_tunggakan', 'usia_debitur', 'penghasilan_bulanan', 'status_pernikahan', 'jumlah_tanggungan', 'lama_bekerja_tahun'
def prepare_data(self, data):
"""Menyiapkan data untuk analisis"""
# Normalisasi fitur numerik
numeric_features = ['jumlah_kredit', 'tenor_bulan', 'bunga_per_tahun',
'keterlambatan_pembayaran', 'jumlah_tunggakan',
'usia_debitur', 'penghasilan_bulanan', 'jumlah_tanggungan',
'lama_bekerja_tahun']
data_scaled = data.copy()
data_scaled[numeric_features] = self.scaler.fit_transform(data[numeric_features])
return data_scaled
def train_model(self, X_train, y_train):
"""Melatih model klasifikasi"""
self.model = GradientBoostingClassifier(
n_estimators=100,
learning_rate=0.1,
max_depth=5,
random_state=42
)
self.model.fit(X_train, y_train)
def predict_risk_level(self, customer_data):
"""Memprediksi tingkat risiko kredit"""
if self.model is None:
raise ValueError("Model belum dilatih!")
prediction = self.model.predict(customer_data)
probability = self.model.predict_proba(customer_data)
risk_levels = {0: "Rendah", 1: "Sedang", 2: "Tinggi"}
results = []
for i, (pred, prob) in enumerate(zip(prediction, probability)):
result = {
'customer_id': i,
'risk_level': risk_levels.get(pred, "Tidak Diketahui"),
'confidence': max(prob),
'probabilities': {
'rendah': prob[0],
'sedang': prob[1] if len(prob) > 1 else 0,
'tinggi': prob[2] if len(prob) > 2 else 0
}
}
results.append(result)
return results
def recommend_solution(self, risk_level, customer_profile):
"""Memberikan rekomendasi solusi berdasarkan tingkat risiko"""
recommendations = {
"Rendah": [
"Restrukturisasi ringan dengan perpanjangan tenor",
"Penurunan suku bunga sementara",
"Program pembayaran bertahap"
],
"Sedang": [
"Restrukturisasi moderat dengan penyesuaian angsuran",
"Konsolidasi utang dengan kredit baru",
"Program pengampunan denda sebagian"
],
"Tinggi": [
"Negosiasi pelunasan dengan diskon",
"Konversi menjadi kredit jangka panjang",
"Program penyelesaian khusus dengan jaminan tambahan"
]
}
return recommendations.get(risk_level, ["Konsultasi langsung dengan ahli kredit"])
Contoh penggunaan
def main(): # Data contoh (dalam praktik nyata, ini akan datang dari database) sample_data = pd.DataFrame({ 'jumlah_kredit': 50000000, 100000000, 75000000, 30000000, 'tenor_bulan': 24, 36, 18, 12, 'bunga_per_tahun': 12, 15, 10, 18, 'keterlambatan_pembayaran': 2, 5, 1, 8, 'jumlah_tunggakan': 1, 3, 0, 4, 'usia_debitur': 35, 45, 28, 52, 'penghasilan_bulanan': 8000000, 15000000, 5000000, 12000000, 'status_pernikahan': 1, 1, 0, 1, # 1: Menikah, 0: Single 'jumlah_tanggungan': 2, 3, 0, 1, 'lama_bekerja_tahun': 5, 10, 2, 15 })
analyzer = CreditProblemAnalyzer()
processed_data = analyzer.prepare_data(sample_data)
print("=== Analisis Kredit Bermasalah ===")
print(f"Data yang dianalisis: {len(sample_data)} nasabah")
print("\nFitur yang digunakan:")
for feature in analyzer.feature_columns:
print(f"- {feature}")
if name == "main": main() { "id_registrasi": "REG-10293847", "identitas_kendaraan": { "nomor_registrasi": "BE 1234 ABC", "nomor_rangka": "MHKA1B2C3DE456789", "nomor_mesin": "K15G-987654", "merek": "Honda", "tipe": "CB150R", "jenis": "Sepeda Motor", "model": "Solo", "tahun_pembuatan": 2022, "silinder": "150 cc", "warna": "Hitam", "bahan_bakar": "Bensin" }, "identitas_pemilik": { "nik": "1801xxxxxxxxxxxx", "
{ "id_registrasi": "REG-10293847", "identitas_kendaraan": { "nomor_registrasi": "BE 1234 ABC", "nomor_rangka": "MHKA1B2C3DE456789", "nomor_mesin": "K15G-987654", "merek": "Honda", "tipe": "CB150R", "jenis": "Sepeda Motor", "model": "Solo", "tahun_pembuatan": 2022, "silinder": "150 cc", "warna": "Hitam", "bahan_bakar": "Bensin" }, "identitas_pemilik": { "nik": "1801xxxxxxxxxxxx", "nama_lengkap": "Jefri Arisandi", "alamat": "Gedong Tataan, Pesawaran, Lampung", "nomor_telepon": "081234567890" }, "status_pajak": { "nilai_jual_kendaraan_bermotor": 22000000, "pajak_pokok": 250000, "swdkllj": 35000, "total_pajak_tahunan": 285000, "tanggal_jatuh_tempo": "2027-05-15", "status_pembayaran": "LUNAS", "blokir_status": "TIDAK BLOKIR" }, "riwayat_registrasi": [ { "tanggal_transaksi": "2026-05-15", "jenis_layanan": "Pajak Tahunan", "lokasi_samsat": "SAMSAT Pesawaran", "status": "Selesai" } ] }
tanggal_jatuh_tempo": "2027-05-15", "status_pembayaran": "LUNAS", "blokir_status": "TIDAK BLOKIR" }, "riwayat_registrasi": [ { "tanggal_transaksi": "2026-05-15", "jenis_layanan": "Pajak Tahunan", "lokasi_samsat": "SAMSAT Pesawaran", "status": "Selesai"
tanggal_jatuh_tempo": "2027-05-15", "status_pembayaran": "LUNAS", "blokir_status": "TIDAK BLOKIR" }, "riwayat_registrasi": [ { "tanggal_transaksi": "2026-05-15", "jenis_layanan": "Pajak Tahunan", "lokasi_samsat": "SAMSAT Pesawaran", "status": "Selesai"