[CAUSAL-001] · Databricks · Live
Credit Limit Intervention Analysis
Area · Causal Inference
Stack · DoWhy · EconML · Causal Forest
Dataset · UCI Credit Card Default (Taiwan)
Live
Overview
Architecture
GitHub
The Hypothesis
Risk teams commonly assume that reducing the credit limit of customers with a history of late payments lowers their risk of future default. Less exposure, less risk — the reasoning seems straightforward.
This project tests that assumption using causal inference, not just correlation. Built with DoWhy and EconML to separate correlation from causation — and to challenge a common assumption in credit risk management.
What the Data Shows
Controlling for 22 confounders — payment history, bill amounts, demographics — the analysis finds the opposite of the common assumption. A one standard deviation increase in credit limit (approximately NT$130,000) decreases the probability of default by 1.19 percentage points.
This is consistent with published research on the same dataset, which found a similar effect using a different estimation method. The likely mechanism is that a higher credit limit reduces utilization ratio, which reduces financial pressure and, in turn, default risk.
The effect is not uniform across customers. Segmenting by individual treatment effect reveals that customers with lower existing limits and higher baseline risk benefit the most from a limit increase, while a small subgroup shows the opposite pattern — for them, increasing the limit is associated with higher default risk.
Key Terms
ATE
Average Treatment Effect — the average causal impact of the treatment across the full population.
CATE
Conditional Average Treatment Effect — the causal impact estimated for a specific customer or segment, which can differ from the average.
Backdoor criterion
The condition under which controlling for a set of confounders is sufficient to identify a causal effect from observational data.
Refutation test
A robustness check that perturbs the model in a known way to confirm the estimated effect behaves as a real causal effect should.
Pipeline Overview
Fig. 1 · Naive correlation → causal graph → identification → effect estimation → refutation → heterogeneous effects.
Key Decisions
Causal question is declared, not discovered
Unlike the churn and RAG projects in this hub, this pipeline cannot fully automate itself from a new dataset. Treatment, outcome, and confounders require domain knowledge, made explicit in causal_config.py. Automating causal assumptions would risk producing confident but wrong conclusions.
Naive correlation reported first
The EDA step deliberately calculates the raw correlation between treatment and outcome before any adjustment, making the value of causal inference visible.
Effect reported at business scale
A raw ATE per one-unit change in a currency variable is not interpretable when that variable ranges in the hundreds of thousands. The pipeline reports the effect per meaningful increment and per standard deviation, matching how a finding would be communicated to a risk committee.
Refutation is not optional
Every causal estimate goes through three robustness checks: adding a random confounder, replacing the treatment with a placebo, and re-estimating on a data subset. A causal claim without refutation testing is a hypothesis that has not been stressed.
Heterogeneity as the main output
An average effect can hide the fact that a subgroup responds in the opposite direction. The Causal Forest step exists specifically to surface that nuance, enabling a segmented recommendation instead of a blanket policy change.
Repository
causal-001-credit-limit-intervention/
├── README.md
├── requirements.txt
├── .gitignore
├── config/
│ └── causal_config.py
├── src/
│ ├── __init__.py
│ ├── causal_eda.py
│ ├── causal_graph.py
│ ├── identification.py
│ ├── effect_estimation.py
│ ├── refutation.py
│ └── heterogeneous_effects.py
├── data/
│ ├── UCI_Credit_Card.csv
│ └── causal_clean.parquet
├── outputs/
│ ├── causal_graph.png
│ ├── cate_distribution.png
│ └── segment_effects.png
└── notebooks/
└── quickstart.ipynb
Stack: DoWhy, EconML, pandas. Python 3.13. Uses the Default of Credit Card Clients dataset (Taiwan), publicly available on Kaggle / UCI Machine Learning Repository.