Back to All Projects
Financial Risk Analytics

🏦 Credit Risk & Loan Portfolio Analysis

A 4-page prescriptive risk intelligence system built with Power BI & DAX — covering portfolio overview, default drivers, risk segmentation & strategic actions
32.6K

Total Customers

₹312.4M

Total Loan Amount

21.8%

Overall Default Rate

₹77M

Total Default Amount

248

High-Risk Customers

17.06%

Avg Loan-to-Income

Launch Live Dashboard Explore GitHub Repo Download EDA Report (PDF)
📸 Dashboard Gallery (Click any image to zoom)

The Insight That Changed Everything

The analysis revealed that low-income borrowers taking large loans create a compounding risk — a default rate exceeding 70% in that single segment alone. Yet this group was being approved at nearly the same rate as safer segments.

The risk wasn't just high LTI or low income in isolation — it was their intersection. Identifying this compound risk profile became the foundation for every strategic recommendation in the report.

🎯 Highest Risk Segment Identified

This segment contributes the maximum to total default exposure

Loan PurposeDebt Consolidation
LTI BandAbove 40%
Income BandLow Income
Age Band25–34
Home OwnershipRent
₹54.2M
Default Amount (70.4% of Total)
38.62%
Default Rate (vs 21.82% overall)
🔍 Key Data-Driven Insights

Live Alerts & Early Warning Signals

⚙️ Code & Technical Implementation
-- Default rate by income segment and loan burden
SELECT
    IncomeLevel,
    LTIBand,
    COUNT(*) AS TotalCustomers,
    SUM(CASE WHEN LoanStatus = 'Default' THEN 1 ELSE 0 END) AS Defaults,
    ROUND(
        SUM(CASE WHEN LoanStatus = 'Default' THEN 1.0 ELSE 0 END) / COUNT(*) * 100, 2
    ) AS DefaultRate,
    SUM(LoanAmount) AS TotalExposure
FROM LoanPortfolio
GROUP BY IncomeLevel, LTIBand
ORDER BY DefaultRate DESC;

-- Highest risk segment isolation
SELECT *
FROM LoanPortfolio
WHERE
    HomeOwnership = 'RENT'
    AND IncomeLevel   = 'Low'
    AND LoanPurpose   = 'Debt Consolidation'
    AND LTI           > 0.40
    AND Age BETWEEN 25 AND 34;
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Default rate heatmap – income vs LTI band
pivot = df.pivot_table(
    values='DefaultFlag',
    index='IncomeLevel',
    columns='LTIBand',
    aggfunc='mean'
) * 100

sns.heatmap(pivot, annot=True, fmt='.1f',
            cmap='RdYlGn_r', linewidths=0.5)
plt.title('Default Rate % – Income vs LTI Band')
plt.tight_layout()
plt.show()

# Portfolio loss bridge
categories = ['Total Loan', 'Default Loss', 'Net Value']
values     = [312, -77, 235]
colors     = ['#06BEC4', '#E66C37', '#06BEC4']
plt.bar(categories, values, color=colors)
plt.title('Portfolio Loss Bridge (₹M)')
plt.show()
// Default Rate %
Default Rate % =
DIVIDE(
    CALCULATE(COUNTROWS(Loans), Loans[Status] = "Default"),
    COUNTROWS(Loans)
) * 100

// Composite Risk Score per customer
Risk Score =
VAR LTIRisk    = IF(Loans[LTI] > 0.40, 0.35, IF(Loans[LTI] > 0.30, 0.20, 0))
VAR IncomeRisk = IF(Loans[IncomeLevel] = "Low", 0.30, IF(Loans[IncomeLevel] = "Medium", 0.15, 0))
VAR TenureRisk = IF(Loans[EmpYears] <= 5, 0.20, 0)
VAR OwnerRisk  = IF(Loans[HomeOwnership] = "RENT", 0.15, 0)
RETURN
    LTIRisk + IncomeRisk + TenureRisk + OwnerRisk

// Default Exposure % of Total
Default Exposure % =
DIVIDE(
    CALCULATE(SUM(Loans[LoanAmount]), Loans[Status] = "Default"),
    SUM(Loans[LoanAmount])
) * 100
🎯 Strategic Recommendations

1 Implement Strict LTI Controls

Reject or manually review all loans with Loan-to-Income ratio above 40%. Cap approval at LTI 30% for low-income applicants.

Reduce high-burden defaults

2 Limit High-Risk Loan Exposure

Apply stricter approval criteria and lower limits for Debt Consolidation loans, especially for renters under 35.

Lower purpose-driven exposure

3 Enhanced Screening for Renters

Introduce additional verification, larger down payment requirements, or co-applicant mandates for the rent + low-income profile.

Mitigate highest-risk segment
🛠️ Tools & Tech Stack
📚 Full Project Resources