Bank Loan Report Analysis Using SQL
- Ankur Shukla
- Sep 25, 2024
- 2 min read
This project focused on analyzing bank loan data to understand loan performance, identify trends, and assess risks using SQL. By transforming raw data into actionable insights, it aids in improving lending strategies and managing risk effectively.
KPI’s:
SQL Analysis & Key Metrics: The core analysis was performed using SQL, with queries designed to extract insights and calculate key performance indicators. Here’s a detailed look at the SQL queries used and the insights they provided:
Total Loan Applications
SELECT COUNT(id) AS Total_Applications FROM bank_loan_dataMTD Loan Applications
SELECT COUNT(id) AS Total_Applications FROM bank_loan_dataWHERE MONTH(issue_date) = 12PMTD Loan Applications
SELECT COUNT(id) AS Total_Applications FROM bank_loan_dataWHERE MONTH(issue_date) = 11Total Funded Amount
SELECT SUM(loan_amount) AS Total_Funded_Amount FROM bank_loan_dataMTD Total Funded Amount
SELECT SUM(loan_amount) AS Total_Funded_Amount FROM bank_loan_dataWHERE MONTH(issue_date) = 12PMTD Total Funded Amount
SELECT SUM(loan_amount) AS Total_Funded_Amount FROM bank_loan_dataWHERE MONTH(issue_date) = 11Total Amount Received
SELECT SUM(total_payment) AS Total_Amount_Collected FROM bank_loan_dataMTD Total Amount Received
SELECT SUM(total_payment) AS Total_Amount_Collected FROM bank_loan_dataWHERE MONTH(issue_date) = 12PMTD Total Amount Received
SELECT SUM(total_payment) AS Total_Amount_Collected FROM bank_loan_dataWHERE MONTH(issue_date) = 11Average Interest Rate
SELECT AVG(int_rate)*100 AS Avg_Int_Rate FROM bank_loan_dataMTD Average Interest
SELECT AVG(int_rate)*100 AS MTD_Avg_Int_Rate FROM bank_loan_dataWHERE MONTH(issue_date) = 12PMTD Average Interest
SELECT AVG(int_rate)*100 AS PMTD_Avg_Int_Rate FROM bank_loan_dataWHERE MONTH(issue_date) = 11Avg DTI
SELECT AVG(dti)*100 AS Avg_DTI FROM bank_loan_dataMTD Avg DTI
SELECT AVG(dti)*100 AS MTD_Avg_DTI FROM bank_loan_dataWHERE MONTH(issue_date) = 12PMTD Avg DTI
SELECT AVG(dti)*100 AS PMTD_Avg_DTI FROM bank_loan_dataWHERE MONTH(issue_date) = 11GOOD LOAN ISSUED
Good Loan Percentage
SELECT (COUNT(CASE WHEN loan_status = 'Fully Paid' OR loan_status = 'Current' THEN id END) * 100.0) / COUNT(id) AS Good_Loan_PercentageFROM bank_loan_dataGood Loan Applications
SELECT COUNT(id) AS Good_Loan_Applications FROM bank_loan_dataWHERE loan_status = 'Fully Paid' OR loan_status = 'Current'Good Loan Funded Amount
SELECT SUM(loan_amount) AS Good_Loan_Funded_amount FROM bank_loan_dataWHERE loan_status = 'Fully Paid' OR loan_status = 'Current'
Good Loan Amount Received
SELECT SUM(total_payment) AS Good_Loan_amount_received FROM bank_loan_dataWHERE loan_status = 'Fully Paid' OR loan_status = 'Current'
BAD LOAN ISSUED
Bad Loan Percentage
SELECT (COUNT(CASE WHEN loan_status = 'Charged Off' THEN id END) * 100.0) / COUNT(id) AS Bad_Loan_PercentageFROM bank_loan_dataBad Loan Applications
SELECT COUNT(id) AS Bad_Loan_Applications FROM bank_loan_dataWHERE loan_status = 'Charged Off'Bad Loan Funded Amount
SELECT SUM(loan_amount) AS Bad_Loan_Funded_amount FROM bank_loan_dataWHERE loan_status = 'Charged Off'Bad Loan Amount Received
SELECT SUM(total_payment) AS Bad_Loan_amount_received FROM bank_loan_dataWHERE loan_status = 'Charged Off'
LOAN STATUS
SELECT loan_status, COUNT(id) AS LoanCount, SUM(total_payment) AS Total_Amount_Received, SUM(loan_amount) AS Total_Funded_Amount, AVG(int_rate * 100) AS Interest_Rate, AVG(dti * 100) AS DTI FROM bank_loan_data GROUP BY loan_status
SELECT
loan_status, SUM(total_payment) AS MTD_Total_Amount_Received, SUM(loan_amount) AS MTD_Total_Funded_AmountFROM bank_loan_dataWHERE MONTH(issue_date) = 12GROUP BY loan_status
B. BANK LOAN REPORT | OVERVIEW
Segmented Insights: Further segmentation by state, loan purpose, term, and employment length provided more granular insights into loan performance across different borrower demographics.
MONTH
SELECT MONTH(issue_date) AS Month_Munber, DATENAME(MONTH, issue_date) AS Month_name, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY MONTH(issue_date), DATENAME(MONTH, issue_date)ORDER BY MONTH(issue_date)STATE
SELECT address_state AS State, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY address_stateORDER BY address_state
TERM
SELECT term AS Term, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY termORDER BY term
EMPLOYEE LENGTH
SELECT emp_length AS Employee_Length, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY emp_lengthORDER BY emp_lengthPURPOSE
SELECT purpose AS PURPOSE, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY purposeORDER BY purpose
HOME OWNERSHIP
SELECT home_ownership AS Home_Ownership, COUNT(id) AS Total_Loan_Applications, SUM(loan_amount) AS Total_Funded_Amount, SUM(total_payment) AS Total_Amount_ReceivedFROM bank_loan_dataGROUP BY home_ownershipORDER BY home_ownershipReporting & Visualization: The SQL findings were structured to facilitate easy visualization, making complex data simple to interpret. This clear presentation of data supports informed decision-making.

































Comments