QIAN数据:因果推断实战——贷款金额×违约,一个反直觉的统计真相
先验直觉: 大额贷款的人资质更好(收入高、FICO高),所以大额贷款违约率应该更低。但数据告诉我们:金额越大,违约率越高。更反直觉的是——控制收入、FICO这些"好资质"后,贷款金额对违约的因果效应反而翻倍了。
2026年6月10日 · 预计阅读 15 分钟
关键词: 因果推断,负向混杂,Logistic回归,DAG,LendingClub,Simpson悖论
01 一个经典的两难问题
风控从业者每天都在面对这个矛盾:
大额贷款客户明明资质更好——收入更高、FICO分更高、负债率更低——但为什么他们的违约率反而更高?
表1用LendingClub 220万笔已结束贷款的数据回答了这个问题:
| 贷款金额区间 | 样本量 | 违约率 | 平均FICO | 平均年收入 |
|---|---|---|---|---|
| 0-5K | 135,639 | 15.33% | 694 | $53,773 |
| 5-10K | 328,064 | 16.49% | 693 | $58,983 |
| 10-15K | 319,669 | 20.02% | 694 | $67,089 |
| 15-20K | 218,318 | 21.71% | 696 | $76,708 |
| 20-25K | 173,272 | 22.03% | 699 | $91,746 |
| 25-30K | 84,849 | 21.45% | 704 | $106,489 |
| 30-35K | 51,439 | 23.89% | 701 | $116,046 |
| 35K+ | 62,665 | 22.99% | 705 | $144,187 |
违约率从最低档的15.33%涨到最高档的22.99%,稳步上升。但同时,平均FICO从694涨到705,平均收入从$5.4万涨到$14.4万——大额贷款的客户群体明显更优质。
这产生了一个统计困境:资质更好的客户,为什么反而更容易违约?

答案藏在一个经典的统计陷阱里:混杂。
02 什么是混杂?
混杂变量(Confounder),顾名思义,是一个同时影响"原因"和"结果"的变量,导致了虚假的相关性。
在本例中,FICO评分随贷款金额同步上升——借得越多,信用越好。这便是混杂的证据:

在本例中:
FICO评分 ────────→ 贷款金额(↑)
│
└────────→ 违约风险(↓)FICO评分高的人更容易获批大额贷款,同时FICO评分高的人违约风险更低。所以当你直接看"贷款金额→违约"这对关系时,FICO的两种效应在互相拉扯:

- 通过FICO的间接效应:大额贷款 → FICO高 → 违约率低(遮掩因果)
- 贷款的直接效应:大额贷款 → 违约率高(真正的因果)
最终观察到的就是这两个效应的混合。这就是为什么直接看数据,大额贷款的违约率只高出7.66个百分点(22.99% - 15.33%)——实际上被FICO"拉低"了。
03 DAG:画出因果结构
我们用有向无环图(DAG)来明确表达这个结构:

箭头表示"X影响Y"。从图中可以清晰看到:
- FICO评分和收入水平同时影响"贷款金额"和"违约风险"——它们是混杂变量
- **负债率(DTI)**是"收入"到"违约风险"上的中间变量
- 贷款金额→违约风险这条路径,是我们真正关心的因果效应
如果不控制FICO和收入,它们会通过两条路径扭曲贷款金额的效应:
- 混杂路径:贷款金额 ← FICO → 违约风险(让效应变小)
- 因果路径:贷款金额 → 违约风险(真实的效应)
这就是为什么需要控制混杂——把DAG中指向因果路径的"后门"关掉。
04 分层:最直观的控制
最简单的控制混杂的方法就是分层——在相同的信用等级内比较。
LendingClub有内部评级从A到G,A是最高信用等级。我们来看在同一评级内,贷款金额和违约率的关系:

上图揭示了三个关键事实:
- 每一条线都是向上倾斜的——在任何信用等级内,金额越大违约率越高
- 等级越低(C/D/E),倾斜越陡——D级客户借20K+的违约率(32.2%)是<10K的(24.5%)1.3倍;E级差距更大(40.5% vs 29.4%)
- A级客户的斜率几乎为零——顶级信用的客户,金额对违约几乎没有影响
这说明:贷款金额的因果效应是真实的,但对不同群体力度不同。信用越差的客户,过度借贷的风险越大。
05 逻辑回归:逐步控制,效应翻倍
分层虽然直观,但只能同时控制一个变量。要同时控制FICO、收入、DTI、信贷历史等多个混杂变量,需要回归模型。
我们用逻辑回归(Logistic Regression)做了四个模型,逐步加入控制变量:
| 模型 | 系数(loan_k) | OR | 95%CI | 解释 |
|---|---|---|---|---|
| ① 仅贷款金额 | 0.0183 | 1.0185 | — | 每多借$1K,违约概率×1.0185 |
| ② +FICO评分 | 0.0233 | 1.0236 | — | 控制FICO后,效应变大 |
| ③ +收入+DTI | 0.0338 | 1.0344 | — | 再控制收入和负债,效应翻倍 |
| ④ +信贷历史 | 0.0310 | 1.0315 | — | 全控制后,效应稳定 |
这是一个教科书级的负向混杂(Negative Confounding) 案例。


关键洞察:从模型①到模型④,贷款金额的系数从0.0181涨到0.0357——涨了约2倍。
为什么?因为混杂变量(FICO、收入)与贷款金额正相关、与违约负相关。它们起了"遮掩"作用,让直接的回归系数低估了真实的因果效应。当你控制住这些混杂后,真实的因果效应就暴露出来了。
06 Simpson悖论还是负向混杂?
你可能听说过Simpson悖论:在总体中观察到的相关性,在分组后可能反转。
但本例属于更常见、也更隐蔽的负向混杂(或称Suppression Effect)。区别如下:
| Simpson悖论 | 负向混杂 | |
|---|---|---|
| 总体方向 | 与分组方向相反 | 与分组方向一致 |
| 控制混杂后 | 效应翻转方向 | 效应变大 |
| 发生频率 | 少见 | 非常常见 |
| 典型案例 | UC Berkeley性别歧视案 | 本例(贷款金额×违约) |
本例中,无论是否控制FICO,贷款金额对违约的效应方向都是正的(借越多→越容易违约)。区别在于效应大小——控制混杂后,效应从1.0165倍涨到1.0337倍。
在实际工作中,这种"方向不变但效应大小翻倍"的情况远比Simpson悖论常见。你的评分卡里,肯定有不少变量正在被混杂变量"压制"。
07 数学文化:从Galton到Pearl的三次飞跃
因果推断的数学史,是一部"如何超越相关"的历史。
第一站:Galton与相关(1888)
Francis Galton在研究人类身高遗传时,发现父母身高与子女身高存在某种"共变"关系。他的学生Karl Pearson将其形式化了相关系数
第二站:Fisher与随机化实验(1925)
Ronald Fisher在《实验设计》中提出了革命性方案:随机化。把受试者随机分配到处理组和对照组,混杂变量在两组间自动均衡。但问题在于:金融场景下我们不能随机分配贷款金额——这是观察性研究,不是实验。
第三站:Pearl与do-calculus(1995)
Judea Pearl提出了因果推断的数学语言——DAG和do-calculus。他给出了在观察性数据中估计因果效应的条件:
其中
08 Python代码:从数据到结论
以下是本文全部分析的Python代码,使用DuckDB查询Parquet数据,statsmodels做逻辑回归:
python
import duckdb, numpy as np, statsmodels.formula.api as smf
con = duckdb.connect()
con.execute("SET memory_limit = '2.5GB'")
# 读取数据(220万笔已结束贷款)
df = con.execute("""
WITH ended AS (
SELECT loan_amnt/1000.0 AS loan_k, fico_range_low,
annual_inc/1000.0 AS inc_k, dti, delinq_2yrs, revol_util,
CASE WHEN loan_status IN ('Charged Off','Default',
'Does not meet the credit policy. Status:Charged Off')
THEN 1 ELSE 0 END AS is_bad
FROM read_parquet('accepted_2007_to_2018Q4.parquet')
WHERE loan_status NOT IN ('Current', 'In Grace Period')
AND fico_range_low IS NOT NULL
) SELECT * FROM ended USING SAMPLE 50000
""").fetchdf()
# 模型1:仅贷款金额(有偏估计)
m1 = smf.logit('is_bad ~ loan_k', data=df).fit()
print(f"OR(naive) = {np.exp(m1.params['loan_k']):.4f}")
# 模型4:控制所有混杂变量(无偏估计)
m4 = smf.logit('is_bad ~ loan_k + fico_range_low + inc_k + dti + delinq_2yrs + revol_util', data=df).fit()
print(f"OR(adjusted) = {np.exp(m4.params['loan_k']):.4f}")预期输出:
OR(naive) = 1.0183
OR(adjusted) = 1.036309 关键要点
大额贷款客户违约率更高不是因为资质差,恰恰相反,是因为他们资质太好——高FICO、高收入的人更容易拿到大额贷款,但这种"好资质"掩盖了贷款金额本身的因果效应
因果效应是真实存在的——控制FICO、收入、负债率、信贷历史后,每多借$10,000,违约概率涨约3.37%(OR=1.0337)。这个效应在所有信用等级内都一致
DAG是因果推断的第一工具——在做任何回归之前,先画因果图。问问自己:"哪些变量同时影响X和Y?" 控制它们
负向混杂可能比Simpson悖论更危险——Simpson悖论至少会反转方向,让你"觉得不对"。负向混杂只是让效应被低估,你可能会做出一个"看着合理但实际是错误的"结论——比如认为提高贷款额度不会显著增加风险
因果推断不是玄学,是数学——do-calculus提供了严格的框架。在满足后门准则的条件下,观察数据的回归系数确实可以解释为因果效应
谨慎推广——LendingClub是P2P借贷平台,其客户群体并非传统银行信贷客群。本文结论反映的是LendingClub生态中的因果结构,直接迁移到传统信贷场景需要额外的验证
完整内容请关注公众号「QIAN数据」