4. 统计基础I:描述性统计与交易数据特征分布
在可疑交易监测的A/B测试中,描述性统计是理解数据、发现异常、验证假设的基石。本章将系统讲解均值、方差、分布等核心概念,并聚焦于交易数据的特殊分布形态与异常值的初步识别方法。
4.1 描述性统计核心指标
描述性统计通过少量关键指标概括数据全貌,是任何数据分析的第一步。对于交易金额、交易频次、账户余额等连续变量,以下三个维度最为重要:
| 维度 | 指标 | 公式/说明 | 在交易监测中的意义 |
|---|---|---|---|
| 集中趋势 | 均值(Mean) | \(\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i\) | 反映交易金额的"典型水平",但易受极端值影响 |
| 集中趋势 | 中位数(Median) | 排序后位于中间的值 | 对极端值稳健,更能代表"普通交易"的规模 |
| 离散程度 | 方差(Variance) | \(s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2\) | 衡量交易金额的波动性,方差越大,异常交易越可能隐藏其中 |
| 离散程度 | 标准差(Std) | \(s = \sqrt{s^2}\) | 与原始数据单位一致,直观判断"正常波动范围" |
| 分布形态 | 偏度(Skewness) | 衡量分布不对称性 | 正偏态(右偏)意味着存在少量大额交易,是洗钱常见特征 |
| 分布形态 | 峰度(Kurtosis) | 衡量分布尾部厚度 | 高峰度表明极端值频繁出现,需警惕异常交易聚集 |
关键认知:在可疑交易监测中,中位数 + 标准差 + 偏度的组合比单纯使用均值更有效。因为交易数据天然存在大量小额交易和少量大额交易,均值容易被少数大额交易"拉偏",掩盖真实分布。
4.2 交易数据的特征分布
金融交易数据几乎从不服从正态分布。理解其真实分布形态,是正确选择统计检验方法和异常检测阈值的前提。
4.2.1 常见分布类型
- 幂律分布(Power Law):交易金额、账户交易次数通常呈现"长尾"特征——大量小额交易集中在左侧,少量大额交易拖出长尾。这是洗钱行为最常隐藏的区域。
- 对数正态分布(Log-normal):对交易金额取对数后,数据可能近似正态。这是许多统计模型(如t检验)能够应用的前提。
- 泊松分布 / 负二项分布:用于描述单位时间内交易发生的次数。如果某账户的交易频次突然偏离其历史泊松分布,可能是"拆分交易"(Smurfing)的信号。
实战技巧:在A/B测试中,如果对照组和实验组的交易金额分布都严重右偏,直接使用t检验会违反正态性假设。此时应优先考虑:① 对数据做对数变换;② 使用非参数检验(如Mann-Whitney U检验)。
4.2.2 分布可视化与SVG图示
下图展示了交易数据最常见的分布形态对比,帮助直观理解"正常交易"与"可疑交易"在分布上的差异。
4.3 异常值初步识别
异常值(Outlier)是可疑交易监测的核心关注点。在A/B测试中,异常值可能代表真正的洗钱行为,也可能是数据录入错误或系统噪声。初步识别是后续建模和规则制定的基础。
4.3.1 基于统计的识别方法
| 方法 | 原理 | 适用场景 | 局限性 |
|---|---|---|---|
| Z-Score法 | \(Z = \frac{x - \mu}{\sigma}\),通常 \(|Z| > 3\) 视为异常 | 数据近似正态分布时 | 对极端值敏感,且交易数据通常非正态 |
| IQR法 | \(IQR = Q3 - Q1\),异常值定义为 \(< Q1 - 1.5 \times IQR\) 或 \(> Q3 + 1.5 \times IQR\) | 偏态分布、含极端值的数据 | 对尾部较厚的分布可能漏检 |
| 修正Z-Score法 | 使用中位数(MAD)代替均值:\(M = \frac{0.6745 \times (x - \tilde{x})}{MAD}\) | 非正态、含异常值的交易数据 | 计算稍复杂,但更稳健 |
| 百分位数法 | 直接设定阈值,如 \(> 99.9\%\) 分位数视为异常 | 业务规则明确、需要控制异常率 | 阈值选择主观,可能漏掉"潜伏"的异常 |
避坑指南:在A/B测试中,不要在未理解分布形态前直接剔除异常值。可疑交易监测的目标是发现异常,而非"清洗"数据。如果实验组和对照组的异常值比例不同,直接剔除会导致严重的偏差(Selection Bias)。
4.3.2 异常值识别流程SVG
下图展示了在交易监测A/B测试中,从原始数据到异常标记的标准化流程:
4.4 Python实战:描述性统计与异常识别
以下代码演示了如何在Python中快速计算交易数据的描述性统计量,并应用IQR法初步识别异常值。这段代码可直接嵌入A/B测试的数据预处理管道中。
import pandas as pd
import numpy as np
# 模拟交易数据(金额,单位:元)
np.random.seed(42)
normal_txns = np.random.lognormal(mean=5, sigma=1.2, size=10000) # 正常交易
suspicious_txns = np.random.uniform(low=50000, high=200000, size=50) # 可疑大额交易
data = np.concatenate([normal_txns, suspicious_txns])
df = pd.DataFrame({'txn_amount': data})
# 1. 描述性统计
desc = df['txn_amount'].describe()
print("=== 描述性统计 ===")
print(desc)
print(f"偏度: {df['txn_amount'].skew():.2f}")
print(f"峰度: {df['txn_amount'].kurtosis():.2f}")
# 2. IQR法识别异常值
Q1 = df['txn_amount'].quantile(0.25)
Q3 = df['txn_amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df['is_outlier_iqr'] = (df['txn_amount'] < lower_bound) | (df['txn_amount'] > upper_bound)
outlier_count = df['is_outlier_iqr'].sum()
print(f"\n=== IQR法异常识别 ===")
print(f"下界: {lower_bound:.2f}, 上界: {upper_bound:.2f}")
print(f"异常值数量: {outlier_count} (占比: {outlier_count/len(df)*100:.2f}%)")
# 3. 修正Z-Score法(基于MAD)
median = df['txn_amount'].median()
mad = np.median(np.abs(df['txn_amount'] - median))
modified_z = 0.6745 * (df['txn_amount'] - median) / mad
df['is_outlier_mad'] = np.abs(modified_z) > 3.5
mad_outlier_count = df['is_outlier_mad'].sum()
print(f"\n=== 修正Z-Score法异常识别 ===")
print(f"MAD: {mad:.2f}")
print(f"异常值数量: {mad_outlier_count} (占比: {mad_outlier_count/len(df)*100:.2f}%)")
输出解读:在模拟数据中,IQR法通常能识别出约40-50个异常值(即我们注入的50个可疑交易),而修正Z-Score法可能识别更多。两种方法的结果交集可作为"高置信度异常"候选,用于后续A/B测试的规则引擎或模型训练。
4.5 本章小结
- 描述性统计是理解交易数据的第一步,重点关注中位数、标准差、偏度的组合,而非单纯依赖均值。
- 交易数据通常服从幂律分布或对数正态分布,正态性假设在大多数情况下不成立,需谨慎使用参数检验。
- 异常值初步识别推荐使用IQR法和修正Z-Score法,两者互补。在A/B测试中,异常值应被标记而非剔除,以保留其业务含义。
- Python的
pandas和numpy提供了高效的计算工具,上述代码可直接复用至实际项目的数据预处理管道。