Cara Kerja Model Machine Learning
Prediksi Lama Pembayaran Invoice

Dokumen ini menjelaskan—dengan bahasa yang bisa dipahami non-teknis—apa yang dilakukan model ML di aplikasi Finance Kreasi: data apa yang dipakai, bagaimana tiga algoritma regresi bekerja, dan bagaimana hasilnya muncul di layar BOD dan Finance.

Tipe: Regresi Target: lama bayar (hari) Model terbaik: XGBoost R² uji: 0,617 MAE: 6,64 hari Metodologi: CRISP-DM
Ingin tahu cara model belajar? Halaman terpisah membahas proses learning ketiga algoritma dengan matematika (KaTeX), diagram, dan contoh hitung langkah-demi-langkah memakai data invoice ini. → Buka: Proses Learning Model

01Ringkasan satu paragraf

Setiap invoice yang diterbitkan PT Kreasi Pandawa Sakti pada akhirnya dibayar klien dalam jumlah hari yang berbeda-beda. Model ini mempelajari pola pembayaran dari ratusan invoice lama, lalu untuk invoice yang belum lunas ia memperkirakan berapa hari lagi kira-kira invoice itu dibayar. Jika perkiraannya melebihi termin (jatuh tempo yang disepakati), invoice ditandai Berisiko telat. Bagian Keuangan memakai ini untuk memprioritaskan penagihan; BOD memakai versi agregatnya untuk menilai risiko arus kas.

Bukan sistem yang menentukan pembayaran. Ini hanya perkiraan/estimasi berbasis pola historis—membantu manusia memutuskan urutan prioritas, bukan menggantikannya.

02Di mana hasilnya terlihat di aplikasi

Beranda BOD — gambaran besar

KPI “Piutang Berisiko Telat” + panel “Risiko Penagihan (Prediksi ML)”: total invoice yang diprediksi telat dan nilai outstanding-nya.

39invoice diprediksi telat
Rp 1,36 Moutstanding berisiko

AR Aging (Finance) — per invoice

Tabel piutang dapat kolom “Estimasi lunas” dan “Risiko (ML)”, jadi tiap invoice bisa diurutkan menurut risikonya.

Contoh baris:
Inv KPS-2026-014 · est. 31 hari Berisiko telat
Inv KPS-2026-002 · est. 12 hari Sesuai termin

Keduanya memakai model yang sama—bedanya hanya tingkat zoom: Finance melihat per invoice untuk bertindak, BOD melihat totalnya untuk menilai kesehatan kas.

03Data & field yang dipakai

Model tidak “tahu” apa pun selain angka/atribut yang kita beri. Berikut field nyata dari aplikasi (objek Invoice) yang dikirim ke model saat memprediksi:

Field modelAsal di aplikasiArtiPengaruh
klienNama klien invoiceIdentitas klien (mis. Energizer, Ichi Tan)Tertinggi
top_daysTermin (jatuh tempo − tgl invoice)Lama termin pembayaran yang disepakatiTinggi
totalNilai TOTAL invoice (Rp)Besar tagihanSedang
bulan, kuartal, yearTanggal invoiceMusim/periode penerbitanRendah–sedang
ada_poAda PO atau tidakPenanda jalur dokumenRendah
ada_ceAda nomor CE atau tidakPenanda jalur dokumenRendah
Anti-kebocoran data (data leakage). Field yang baru diketahui setelah invoice dibayar—seperti tanggal pembayaran, saldo, AR, dan Inv. Aging— sengaja TIDAK dipakai. Kalau dipakai, model jadi “mencontek” dan terlihat akurat di latihan tapi gagal di dunia nyata.

Yang diprediksi (target) adalah lama pembayaran dalam hari:

y = Tanggal Pembayaran − Tanggal Invoice   (dalam hari)

Catatan: kolom Inv. Aging di spreadsheet asli tidak dipakai sebagai target karena tidak konsisten (kosong di 2025–2026, tercampur nilai aneh di berkas lama). Target dihitung ulang dari kedua tanggal agar bersih.

04Alur kerja end-to-end (kerangka CRISP-DM)

Data mentah5 berkas rekap invoice 2019–2026 · 854 baris
Bersihkanambil yang lunas, buang pencilan → 446 baris
Bentuk fitur12 fitur (lihat bagian 03)
Latih 3 modelMLR · RF · XGBoost
Pilih terbaikXGBoost (R² 0,617)
Sajikanendpoint → BOD & AR

CRISP-DM (Cross-Industry Standard Process for Data Mining) adalah kerangka baku enam tahap: pemahaman bisnis → pemahaman data → persiapan data → pemodelan → evaluasi → penerapan. Seluruh proses memakai random_state = 42 agar hasilnya bisa diulang persis.

05Tiga algoritma — bagaimana masing-masing berpikir

Ketiganya menjawab pertanyaan yang sama (“berapa hari?”) tapi dengan cara berbeda. Kita membandingkan dari yang paling sederhana ke paling canggih.

A

Multiple Linear Regression (MLR)

Ide: menarik satu “garis lurus” (bidang) terbaik melalui data. Setiap fitur diberi bobot (koefisien); prediksi = penjumlahan berbobot semua fitur.

ŷ = β₀ + β₁·(top_days) + β₂·(total) + … + βₙ·(fitur ke-n)

Mesin mencari nilai β yang membuat total selisih kuadrat (prediksi − aktual) paling kecil (least squares). Dalam proyek ini dipakai sebagai pembanding dasar: kalau model canggih tidak bisa mengalahkan garis lurus, berarti tidak ada gunanya.

Kelebihan

Sederhana, cepat, mudah dijelaskan (tiap fitur punya bobot jelas).

Kelemahan

Menganggap hubungan selalu lurus. Pola nyata (klien × termin) tidak linear → kurang akurat.
B

Random Forest Regression

Ide: membangun banyak pohon keputusan (di proyek ini 300 pohon), tiap pohon menebak dari sebagian data & sebagian fitur secara acak. Hasil akhir = rata-rata tebakan semua pohon. Ibarat menanyakan 300 staf berpengalaman lalu mengambil rata-ratanya—lebih stabil daripada satu pendapat.

Satu pohon membuat aturan bercabang seperti: “jika klien = Energizer dan termin > 30 → cenderung lama”. Karena tiap pohon melihat data berbeda, kesalahan acak saling meredam (teknik bagging).

Kelebihan

Menangkap pola tidak linear & interaksi antar fitur; tahan terhadap overfitting.

Kelemahan

Lebih lambat & “kotak hitam”; rata-rata bisa menumpulkan kasus ekstrem.
C

XGBoost Regression ★ (model terpilih)

Ide: juga memakai pohon, tapi dibangun bertahap dan saling memperbaiki (gradient boosting). Pohon pertama menebak kasar, pohon berikutnya fokus memperbaiki kesalahan pohon sebelumnya, begitu seterusnya (400 pohon). Ada pula regularisasi untuk mencegah model menghafal data.

Berbeda dari Random Forest yang merata-ratakan pohon sederajat, XGBoost menyusun pohon secara berurutan—tiap pohon adalah koreksi atas sisa kesalahan. Ini membuatnya biasanya paling akurat untuk data tabel seperti milik kita.

Kelebihan

Paling akurat di proyek ini; menangani pola rumit; regularisasi mengurangi overfitting.

Kelemahan

Paling banyak parameter untuk disetel; perlu hati-hati agar tidak overfit.

Parameter dipakai: n_estimators=400, learning_rate=0,05, max_depth=6, subsample=0,8, colsample_bytree=0,8, reg_lambda=1,0.

06Pelatihan & evaluasi

Dari 854 invoice tergabung, diambil yang berstatus lunas dengan lama bayar valid lalu dibuang pencilannya → 446 baris bersih. Data dibagi 80% latih (356) : 20% uji (90). Tiap model juga diuji dengan validasi silang 5-lipatan (data latih dibagi 5, dilatih-diuji bergantian) supaya hasilnya tidak kebetulan.

Metrik penilaian

  • MAE — rata-rata selisih absolut (berapa hari rata-rata meleset). Makin kecil makin baik.
  • RMSE — akar rata-rata kuadrat selisih (menghukum meleset besar). Makin kecil makin baik.
  • — seberapa besar keragaman yang berhasil dijelaskan model (0–1). Makin mendekati 1 makin baik.

Hasil perbandingan (data uji)

ModelR² (CV)R² (Uji)RMSE (hari)MAE (hari)
Multiple Linear Regression0,2590,49111,928,29
Random Forest0,4520,56710,997,29
XGBoost ★0,4950,61710,346,64

Urutannya konsisten di validasi silang maupun data uji: XGBoost > Random Forest > Linear. MAE 6,64 hari berarti rata-rata prediksi meleset sekitar seminggu—cukup untuk membantu menyusun prioritas penagihan.

07Faktor yang paling berpengaruh

Setelah model terbaik dipilih, kita ukur fitur mana yang paling menentukan (feature importance):

PeringkatFiturBobot
1klien = PT. Ichi Tan Indonesia0,153
2klien = PT. Energizer Indonesia0,106
3klien = PT. Bital Asia0,097
4klien = PT. Wavin Trading Indonesia0,088
5top_days (termin pembayaran)0,075

Kesimpulan: identitas klien adalah penentu terkuat—tiap klien punya kebiasaan & birokrasi bayar yang berbeda—diikuti termin (TOP). Karena itu Finance bisa memperkirakan prioritas penagihan berdasarkan klien + termin sejak invoice diterbitkan.

08Bagaimana model disajikan ke aplikasi

Model dilatih dengan Python lalu disimpan sebagai berkas. Ia dijalankan oleh sebuah layanan terpisah (sidecar) yang dipanggil aplikasi utama (Go) lewat HTTP.

Aplikasi (Go)kumpulkan invoice belum lunas
Kirim sekaligusPOST /predict/payment-days/batch
Sidecar (Python)jalankan model XGBoost
Balas estimasihari per invoice
Tampilkankartu BOD & kolom AR

Pemakaian per peran:

  • AR Aging (Finance): tiap invoice diberi estimasi hari + flag berisiko bila estimasi > termin.
  • Beranda BOD: estimasi semua invoice dijumlahkan menjadi “berapa banyak & berapa rupiah piutang yang diprediksi telat”.
Aman bila ML mati. Panggilan ke sidecar dibatasi 3 detik dan punya fallback: kalau layanan ML tidak tersedia, aplikasi tetap berjalan—kolom/kartu estimasi cukup disembunyikan, tidak ada error dan halaman tidak macet.

09Keterbatasan & catatan jujur

  • Estimasi, bukan kepastian. Rata-rata meleset ±7 hari (MAE). Berguna untuk mengurutkan prioritas, bukan menjanjikan tanggal pasti.
  • Data didominasi 2019–2024. Banyak invoice 2025–2026 belum lunas sehingga belum punya tanggal bayar—porsi data terbarunya kecil.
  • Angka di aplikasi bisa beda tipis dari contoh laporan. Saat live, aplikasi memberi model field yang tersedia (klien, total, termin; field uang/PO memakai nilai default), sehingga estimasinya sedikit berbeda dari contoh yang memakai field uang lengkap.
  • Model ini ≠ forecast cashflow. Grafik perkiraan kas 8 minggu di Beranda BOD adalah model lain dan terpisah dari prediksi lama-bayar ini.

Pengembangan lanjutan

  • Menambah data 2025–2026 yang sudah lunas agar model makin mutakhir.
  • Menambah fitur riwayat perilaku bayar klien (rata-rata keterlambatan sebelumnya).
  • Membaca isi dokumen PO otomatis (OCR) sebagai sumber fitur tambahan.

10Glosarium singkat

IstilahArti
RegresiMemprediksi angka kontinu (di sini: jumlah hari), bukan kategori.
Fitur (feature)Atribut input yang dipakai model (klien, termin, nilai, dll.).
TargetYang diprediksi: lama pembayaran (hari).
TOP / terminTerm of Payment—jangka waktu jatuh tempo yang disepakati.
OverfittingModel menghafal data latih sehingga gagal di data baru.
Data leakageMemakai informasi yang baru ada setelah kejadian → model “mencontek”.
Validasi silangMembagi data berulang untuk menguji kestabilan model.
SidecarLayanan kecil terpisah yang menjalankan model dan dipanggil aplikasi utama.