卡方检验(Chi-Square Test)是一类基于卡方分布的假设检验方法,常用于检验两个离散变量是否存在关联(独立性检验)、理论分布与观测分布是否一致(适配度检验)、以及在金融风控、医学研究、社会科学调查等领域广泛应用。下面将从理论概念、常见类型及其应用场景、Python 实现等方面对卡方检验做一个系统介绍。
1. 卡方检验概述
卡方检验的统计量通常记作 χ 2 \chi^2 χ2,满足卡方分布(Chi-Square Distribution)。通过计算样本数据与理论假设(或期望频数)的偏离程度,卡方检验可用于判断离散型变量之间是否独立、以及实际观测值与理论期望值之间是否存在显著差异。
在卡方检验中,最常见的有以下两种场景:
-
卡方独立性检验(Chi-Square Test of Independence):
- 检验两个分类变量(离散型变量)之间是否存在统计学上的关联。
- 常见于列联表分析(Contingency Table),又称卡方列联表分析。
- 例如,研究“性别”与“是否违约”之间是否有显著关系。
-
卡方适配度检验(Chi-Square Goodness-of-Fit Test):
- 检验一组观测值与某一理论分布(或期望比率)是否匹配。
- 例如,某金融机构认为借款人违约率应当符合“某理论比例”,但实际统计发现违约率存在偏差,需要验证差异是否显著。
卡方分布简介
- 定义:若随机变量
Z
i
∼
N
(
0
,
1
)
Z_i \sim N(0, 1)
Zi∼N(0,1)(独立同分布的标准正态分布),则
X = ∑ i = 1 k Z i 2 X = \sum_{i=1}^{k} Z_i^2 X=i=1∑kZi2
服从自由度为 k k k 的卡方分布,记作 χ 2 ( k ) \chi^2(k) χ2(k)。 - 性质:卡方分布是一种偏度较大的分布,随自由度增加,它逐渐变得更接近正态分布。
2. 卡方独立性检验(Chi-Square Test of Independence)
2.1 适用场景
- 用于判定两个离散型变量是否存在统计学上的显著关联;
- 数据通常以**列联表(Contingency Table)**表示,例如:
事件A_发生 | 事件A_不发生 | 总计 | |
---|---|---|---|
事件B_发生 | n11 | n12 | n1. |
事件B_不发生 | n21 | n22 | n2. |
总计 | n.1 | n.2 | n… |
这里 n 11 , n 12 , n 21 , n 22 n11, n12, n21, n22 n11,n12,n21,n22 表示观测频数。
2.2 原假设与备择假设
- 原假设 H 0 H_0 H0:两个变量相互独立,即无显著关联;
- 备择假设 H 1 H_1 H1:两个变量存在依赖关系,即存在显著关联。
2.3 检验统计量
卡方独立性检验的统计量通常构造如下:
-
计算列联表中每个单元格的观测频数 O i j O_{ij} Oij 和 期望频数 E i j E_{ij} Eij。
- 期望频数常用“独立性假设”下的估计:
E i j = ( 行合计 ) × ( 列合计 ) 样本总量 E_{ij} = \frac{(\text{行合计}) \times (\text{列合计})}{\text{样本总量}} Eij=样本总量(行合计)×(列合计)
- 期望频数常用“独立性假设”下的估计:
-
卡方统计量:
χ 2 = ∑ i , j ( O i j − E i j ) 2 E i j \chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} χ2=i,j∑Eij(Oij−Eij)2 -
自由度(degree of freedom, df):
d f = ( r − 1 ) × ( c − 1 ) df = (r - 1) \times (c - 1) df=(r−1)×(c−1)
其中 r r r 是行数、 c c c 是列数。 -
根据卡方分布表或 p 值进行决策。
2.4 决策原则
- 给定显著性水平 α \alpha α(常见取 0.05),若计算的 χ 2 \chi^2 χ2 统计量对应的 p 值 < α < \alpha <α,则拒绝原假设(认为两变量有关联)。
3. 卡方适配度检验(Chi-Square Goodness-of-Fit Test)
3.1 适用场景
- 用于检验某个观测频数分布是否与理论分布或期望比例一致;
- 例如:
- 骰子投掷6种结果的观测比率是否与“均匀分布”匹配;
- 某金融风控模型预测客户违约率为 5%,但实际观测违约率不同,需要检验差异是否显著。
3.2 原假设与备择假设
- 原假设 H 0 H_0 H0:观测分布与理论分布无显著差异,或者说观测数据符合理论分布;
- 备择假设 H 1 H_1 H1:观测分布与理论分布存在显著差异。
3.3 检验统计量
-
设有 k k k 种类型的结果, O i O_i Oi 表示观测频数, E i E_i Ei 表示理论频数。
-
卡方统计量:
χ 2 = ∑ i = 1 k ( O i − E i ) 2 E i \chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i} χ2=i=1∑kEi(Oi−Ei)2 -
自由度:
d f = k − 1 − (被估计的分布参数数目) df = k - 1 - \text{(被估计的分布参数数目)} df=k−1−(被估计的分布参数数目)- 如果理论分布中参数(如均值、方差等)是由数据估计得到的,需要相应地减少自由度。
-
与卡方分布进行比较或计算 p 值,做出决策:若 χ 2 \chi^2 χ2 较大或 p 值 < α \alpha α,拒绝原假设。
4. Python 中的卡方检验
Python 的 scipy
库中为卡方检验提供了常用的函数,如:
scipy.stats.chi2_contingency
:适用于独立性检验和R×C 列联表的分析;scipy.stats.chisquare
:适用于适配度检验(一维频数对比),也可用于单行或单列的列联分析。
4.1 独立性检验示例(chi2_contingency)
import numpy as np
from scipy.stats import chi2_contingency
# 1. 构造列联表数据
# 假设我们想研究“是否逾期”与“性别”之间是否相关
# 行:性别 (Male / Female)
# 列:是否逾期 (Overdue / NotOverdue)
contingency_table = np.array([
[30, 70], # 男性: 逾期=30, 未逾期=70
[20, 80] # 女性: 逾期=20, 未逾期=80
])
# 2. 进行卡方独立性检验
chi2, p_value, dof, expected = chi2_contingency(contingency_table)
print("Chi-square statistic:", chi2)
print("p-value:", p_value)
print("Degrees of freedom:", dof)
print("Expected frequencies:\n", expected)
- 输入:
contingency_table
是 2×2 的列联表。 - 输出:
chi2
:卡方检验统计量;p_value
:显著性水平下的 p 值;dof
:自由度;expected
:理论频数(若变量独立的话)。
如果 p_value < 0.05
(例如),可拒绝原假设,认为性别与逾期存在显著关联。
4.2 适配度检验示例(chisquare)
import numpy as np
from scipy.stats import chisquare
# 1. 观测频数
observed = np.array([50, 30, 20]) # 某三类情况的观测频数
# 2. 理论频数(期望频数)
expected = np.array([45, 35, 20]) # 理论上或经验上预估的频数
# 3. 卡方适配度检验
chi2_stat, p_value = chisquare(f_obs=observed, f_exp=expected)
print("Chi-square statistic:", chi2_stat)
print("p-value:", p_value)
- 若
p_value < 0.05
,说明观测频数与期望频数差异显著,拒绝“匹配”假设。
5. 卡方检验在金融风控中的应用
5.1 特征筛选(变量分箱与卡方分箱)
在评分卡建模中,常见做法是对连续变量进行分箱(将取值范围分成多个区间)。为了衡量分箱后“是否能区分好违约和非违约人群”,会使用卡方分箱(Chi-square Binning):
- 初始时将每个取值或小区间视为独立箱;
- 计算卡方值并合并最相似的箱,直到满足预设箱数或卡方阈值。
- 最终得到分箱区间,提升特征区分度。
5.2 贷款违约率差异分析
- 假设要分析不同性别/年龄段/职业与贷款违约之间的关联;
- 将性别或年龄段(离散区间)与违约情况构成列联表,做卡方独立性检验;
- 若卡方值显著,说明该特征与违约有关,可考虑纳入评分卡或风险模型。
5.3 风险分布对比(适配度检验)
- 在压力测试或模型监控中,金融机构假设市场波动下的损失分布应符合某风险模型的预测;
- 通过收集实际损失数据并与理论分布做卡方适配度检验,可判断模型在当前市场环境下是否仍然有效。
6. 注意事项与常见误区
-
期望频数过小:
- 若在列联表某些格子的期望频数(expected frequency)过小(< 5),卡方检验结果可能不稳定;
- 可考虑合并某些行/列,或使用其他检验(如确切概率检验、Fisher’s Exact Test)。
-
使用场景:
- 卡方检验主要适用于分类(离散)变量;
- 连续型变量需要先分箱或离散化,否则无法直接进行卡方检验。
-
自相关或配对数据:
- 卡方检验假设样本独立。若数据存在配对、重复测量等,需要用更合适的方法。
-
检验结果的解释:
- 拒绝原假设,并不表示两变量具有因果关系,只代表在统计意义上有关联。
- 需要结合业务逻辑或额外实验来判断因果性。
-
多重检验问题:
- 在大规模变量筛选(如评分卡建模中),频繁使用卡方检验,会造成多重比较问题,需要调整显著性阈值(如Bonferroni校正)或综合指标选择特征。
7. 总结
- 卡方检验是一类基于卡方分布的假设检验方法,广泛用于两个离散变量的独立性检验、观测分布与理论分布的适配度检验等场景。
- 在 金融风控 与 评分卡建模 中,常用于:
- 特征筛选(卡方分箱);
- 差异分析(人口统计特征与违约行为的相关性);
- 模型监控(实际分布与模型预测分布是否相符)。
- 使用 Python 中的
scipy.stats.chi2_contingency
和chisquare
可以方便地进行卡方独立性检验和适配度检验。 - 检验结果需注意期望频数是否足够大,并正确解读统计结果。卡方检验只能说明是否存在显著性差异或关联,而不代表因果关系。
如果在实际业务中需要大量进行卡方检验(例如对多种特征变量),建议:
- 结合 业务理解 判断变量是否具备潜在关联;
- 关注 期望频数 分布;
- 处理 多重检验 所带来的 Type I error 风险;
- 与 其他指标(如 IV 值、信息增益、WOE 等)结合综合评价。