Advanced15 columnsUp to 10,000 rows Fictional data

Loan Applications dataset

Loan applications with income, credit score, loan size and term, and whether each was approved.

Made the moment you click and sent straight to you. Nothing is saved on our server.

About this dataset

Applications to a fictional lender: who applied (age, education, employment), what they asked for (purpose, amount, term), their credit score and existing loans, and whether the loan was approved.

Approval was decided by a hidden scoring rule plus some randomness, the way real decisions mix rules with judgement. Your job is to discover the rule from the data. It rewards feature engineering: the raw columns help, but the EMI-to-income ratio you can work out yourself helps a lot more.

Good for practising: Classification, Feature engineering, Logistic regression, Model evaluation.

What's built into the data

The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:

  • Credit score and the EMI-to-income ratio are the two biggest drivers: a higher score helps, a heavier EMI hurts.
  • The EMI is not in the file. Work it out at 11% a year over the loan term and compare it with income.
  • Each existing loan lowers the odds; salaried applicants do a little better than others.
  • Loan sizes and terms depend on the purpose: home loans are the largest and longest, personal loans the smallest.

Columns

ColumnTypeDescription
application_idID (text)Application number.
applied_onDateDate of application.
ageWhole numberApplicant's age.
genderCategoryMale or Female.
marital_statusCategoryMarried, Single or Divorced.
educationCategoryHighest qualification.
employment_typeCategorySalaried, Self-employed, Business owner or Contract.
annual_incomeAmount (₹)Yearly income in rupees.
loan_purposeCategoryHome, Car, Personal, Education or Business.
loan_amountAmount (₹)Amount requested in rupees.
loan_term_monthsWhole numberRepayment period in months.
credit_scoreWhole numberCredit score, 300 to 900.
existing_loansWhole numberNumber of loans already running.
city_tierWhole number1 = metro, 2 = large city, 3 = smaller town.
approvedCategoryYes or No.

Preview: the first 8 rows

A sample with seed 2026. Your download will have different values but the same columns and patterns.

application_idapplied_onagegendermarital_statuseducationemployment_typeannual_incomeloan_purposeloan_amountloan_term_monthscredit_scoreexisting_loanscity_tierapproved
APP0000012024-06-1436FemaleDivorcedGraduateSelf-employed545000Personal3600001261601No
APP0000022024-06-2635MaleMarriedPostgraduateSalaried428000Personal1900003668103Yes
APP0000032024-09-1021FemaleMarriedPostgraduateSalaried1076000Car11300004870712No
APP0000042025-04-0234FemaleMarriedGraduateBusiness owner881000Personal3500003663722No
APP0000052025-04-0939FemaleSingleGraduateBusiness owner658000Car3300006063131No
APP0000062025-05-1221MaleMarriedHigher SecondarySalaried491000Personal4800002470221No
APP0000072025-06-1335MaleMarriedGraduateSalaried892000Personal3900002463711No
APP0000082025-12-1926FemaleMarriedGraduateSelf-employed681000Car4400002468821No

Practice exercises

  1. Compute each applicant's EMI (11% a year, the given term) and EMI ÷ monthly income. Plot approval rate against it.
  2. Train a logistic regression with and without your EMI-ratio feature. How much does it improve the model?
  3. Plot approval rate by credit-score band (300–600, 600–700, 700–750, 750+).
  4. Train a decision tree and read its first few splits. Do they match the patterns listed above?
  5. Use a train/test split and report a confusion matrix and ROC-AUC, not only accuracy.

Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.

Load it straight into Python

You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:

import pandas as pd

url = "https://beeprotonai.info/resources/datasets/loan-applications/download/?rows=1000&seed=42"
df = pd.read_csv(url, parse_dates=["applied_on"])
df.head()

For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < loan-applications-1000-rows-seed42.sql or mysql -u root -p practice < loan-applications-1000-rows-seed42.sql (use your file's name). It creates a table called loan_applications and fills it.

About the data

Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).

Lessons that go with it

More datasets

See all 14 datasets →