A loan can perform well for six months, deteriorate in month seven, and default in month eight. A single “Default = Yes” label hides that progression. Time-based analysis tracks outcomes against elapsed time so lenders can see when risk emerges, not just whether a default eventually occurs. section 4.2.2
Two complementary views serve different decisions:
- Vintage analysis groups loans by origination cohort and plots cumulative default rates against months on book. Steeper curves flag faster default accumulation for investigation. section 4.2.2
- Survival analysis follows individual loans’ time to default. It also accounts for right-censored loans whose observed history ends before a default is known. section 4.2.2
Listing 4.1 Vintage analysis
import pandas as pd
import matplotlib.pyplot as plt
# Step 1: Load the CSV, using "Vintage" as the index
df_loaded = pd.read_csv("vintage_data.csv", index_col="Vintage")
# Step 2: Plot each vintage as a line
plt.figure(figsize=(9,6))
months = range(1, 17) # for 16 months on book
for vintage in df_loaded.index:
# Convert each row to numeric in case of missing cells
row_values = pd.to_numeric(df_loaded.loc[vintage], errors='coerce')
plt.plot(months, row_values, marker='o', label=vintage)
plt.title("Vintage Analysis: Cumulative Default Rates")
plt.xlabel("Months on Book")
plt.ylabel("Cumulative Default Rate (%)")
plt.xticks(months)
plt.grid(True)
plt.legend(loc='upper left')
plt.show()
The Python listing loads cohort data and plots cumulative default rates by month, making differences in loan seasoning visible. section 4.2.2
Define the default window for the product before comparing results; a credit-card or personal-loan threshold might be 90 days past due. Review month-by-month signals for early intervention and use the timing of defaults to inform loss provisioning. section 4.2.2
