Model card
A points-based logistic scorecard trained on features engineered from raw transactions. Every number on this page is produced by npm run model:train and checked in with the artifact.
ROC curve
True vs false positive rate across every score threshold.
Calibration
When the model says 80%, about 80% repay. Dot size is the number of customers.
Scores by actual outcome
Held-out customers. The default policy approves 53% with a 7.3% default rate, vs 39% among those declined.
Default rate by grade
Should rise steadily from A to E. It does.
| Grade | Customers | Defaulted |
|---|---|---|
| A | 166 | 2.4% |
| B | 183 | 9.8% |
| C | 234 | 22.6% |
| D | 172 | 38.4% |
| E | 72 | 58.3% |
Feature weights
Standardised logistic coefficients. Blue raises the score, red lowers it.
What each data source is worth
Drop in AUC when the source is removed from every test customer.
- Bank account−0.040
- Utility bills−0.034
- Mobile account−0.010
- Mobile wallet−0.003
- Repayment history+0.002
Bank account and utility bills carry the most signal. Utility bills — which 88% of applicants have, banked or not — cost 0.034 AUC to remove. Mobile wallet and repayment history add little once the rest is known.
Fairness audit
Region is never a model input. It is held back and used only to test for disparate outcomes at the default approve cut-off.
| Region | Customers | Avg score | Approval rate | Adverse impact ratio | Approved if repaid (TPR) | Approved if defaulted (FPR) | Thin files |
|---|---|---|---|---|---|---|---|
| North | 157 | 672 | 55% | 0.95 OK | 64% | 21% | 8% |
| Central | 326 | 660 | 51% | 0.89 OK | 61% | 15% | 6% |
| South | 176 | 672 | 57% | 1.00 OK | 67% | 24% | 5% |
| West | 168 | 669 | 50% | 0.87 OK | 61% | 11% | 11% |
Adverse impact ratio is each region's approval rate divided by the highest; the common four-fifths rule flags anything under 0.80. Gaps that remain track thin-file share — fewer connected sources — which is exactly where connecting more data helps.
Training data
4,000 simulated customers · 1,377,742 raw records · as of 2026-09-30 · seed “credai-v2”
| Segment | Share | Repaid |
|---|---|---|
| Salaried employee | 25% | 95% |
| Ride-hailing & delivery | 20% | 68% |
| Small shop owner | 15% | 85% |
| Freelancer | 12% | 84% |
| Student or first job | 14% | 58% |
| Over-extended household | 16% | 48% |
- Each customer gets hidden traits — payment discipline, income stability, liquidity, tenure — drawn around a segment profile.
- The traits drive raw events: payroll or gig payouts, rent and spending, bills paid early or late, top-ups, wallet transfers that bounce when the balance is short.
- The repayment outcome is drawn separately from the traits. The model never sees traits or outcomes — only features computed from the raw events, the same way it would from a real API.
- Source coverage varies by segment (utility bills 88%, mobile account 100%, mobile wallet 89%, bank account 65%, repayment history 41%).
Metrics describe performance on simulated behaviour. Before lending, retrain and validate on real outcomes with the same pipeline.