第三章 描述性审计分析:统计指标与数据分布、数据可视化、审计画像与异常波动识别

各位好,我是老张。在金融审计这个行当摸爬滚打十几年,我越来越觉得:审计分析的第一步,不是急着上模型,而是先把数据“看明白”。

什么叫看明白?就是拿到一堆流水、一堆账目,你得知道它长什么样、有没有离谱的值、整体趋势是平稳还是剧烈波动。说白了,这就是描述性审计分析的核心——用统计指标和数据可视化,给数据画一张“全身照”。

今天这一章,我就把我在项目里常用的三板斧分享给你:统计指标怎么选、可视化怎么做、审计画像和异常波动怎么识别。

核心逻辑:描述性分析不是终点,而是审计发现的起点。你只有先摸清数据的“脾气”,才能判断哪些地方需要深挖。

描述性审计分析知识体系 描述性审计分析 统计指标 均值、中位数、标准差 偏度、峰度、分位数 数据可视化 Matplotlib / Seaborn 直方图、箱线图、折线图 审计画像与异常 客户画像、交易画像 波动识别、阈值预警 应用场景:资金流水异常检测 · 费用合规审查 · 客户风险分层

3.1 统计指标:给数据做一次“体检”

我个人习惯,拿到数据第一件事就是跑 df.describe()。别笑,这个简单的函数能告诉你很多信息。

举个例子,有一次我审计一家贸易公司的应收账款,一看描述统计:均值500万,中位数只有80万。嗯,这里要注意——均值远大于中位数,说明数据右偏,存在几个大额异常客户。后来一查,果然有笔3000万的应收挂了三年没收回。

我的经验:审计中重点关注这几个指标——

  • 均值 vs 中位数:差距越大,数据越“偏”,越可能有异常值
  • 标准差:如果某个科目的标准差突然变大,说明波动加剧,需要深挖
  • 四分位数:Q3 - Q1 的间距(IQR)能帮你快速定位离群点

你想想看,如果一家公司每个月的销售费用都在100万左右,突然某个月飙到500万,这正常吗?肯定不正常。但光看均值是看不出来的,你得看分布。

3.2 数据可视化:一张图胜过千行数据

说实话,我最怕看密密麻麻的数字表格。眼睛累不说,还容易漏掉关键信息。所以我的习惯是:先画图,再分析。

在Python里,我常用Matplotlib和Seaborn这两个库。Matplotlib是基础,Seaborn是它的“美化版”,画出来的图更漂亮,也更适合做审计报告。

3.2.1 直方图 + 核密度图:看数据长什么样

import matplotlib.pyplot as plt
import seaborn as sns

# 假设 df 是审计数据集,'amount' 是交易金额列
plt.figure(figsize=(10, 6))
sns.histplot(df['amount'], bins=50, kde=True, color='steelblue')
plt.title('交易金额分布直方图')
plt.xlabel('金额(万元)')
plt.ylabel('频次')
plt.show()

这张图能告诉你什么?如果金额集中在某个区间,说明业务模式稳定;如果出现“长尾”,说明存在大额异常交易。我在一个项目中就靠这张图,发现了一笔金额是正常交易10倍的“特殊处理费”。

3.2.2 箱线图:快速定位离群点

plt.figure(figsize=(8, 6))
sns.boxplot(x='department', y='amount', data=df, palette='Set2')
plt.title('各部门费用支出箱线图')
plt.xticks(rotation=45)
plt.show()

箱线图的好处是直观。你一眼就能看到哪些部门、哪些交易超出了正常范围。我曾经用箱线图发现某分公司连续三个月的差旅费都“飘”在箱体外面,后来一查,是有人虚报出差。

避坑指南:我曾经犯过一个错误——直接用默认参数画箱线图,结果因为数据量太大,图被压缩得看不清。后来我学会了调整 showfliers=False 先看主体,再单独分析异常点。

3.2.3 折线图 + 滚动统计:看趋势和波动

# 计算滚动均值和滚动标准差
df['rolling_mean'] = df['amount'].rolling(window=30).mean()
df['rolling_std'] = df['amount'].rolling(window=30).std()

plt.figure(figsize=(12, 6))
plt.plot(df['date'], df['amount'], alpha=0.5, label='原始数据')
plt.plot(df['date'], df['rolling_mean'], color='red', label='30日滚动均值')
plt.fill_between(df['date'], 
                 df['rolling_mean'] - 2*df['rolling_std'],
                 df['rolling_mean'] + 2*df['rolling_std'],
                 alpha=0.2, color='gray', label='±2倍标准差')
plt.title('交易金额趋势与波动区间')
plt.legend()
plt.show()

这张图是我做审计时的“杀手锏”。为什么?因为它能直观地告诉你:哪些时间点的交易超出了正常波动范围。超出2倍标准差的点,我会标记为“黄色预警”;超出3倍标准差的,直接“红色预警”。

3.3 审计画像:给客户和交易“画个像”

审计画像这个概念,说白了就是给每个审计对象(客户、账户、交易)打标签、建档案。我习惯从三个维度来画:

画像维度 关键指标 审计意义
交易画像 交易频次、金额均值、金额波动、交易时间 识别异常交易模式(如深夜大额转账)
客户画像 交易对手数量、合作时长、历史违规记录 评估客户风险等级
账户画像 余额波动、资金流入流出比、关联账户数 发现洗钱、资金池等风险

举个例子。我曾经给一家银行的信用卡数据做画像,发现有个客户每个月都在固定日期、固定金额(1999元)消费,而且消费地点全是同一家珠宝店。这正常吗?不正常。后来一查,是套现行为。

核心思路:审计画像不是一次性工作,而是持续更新的。我建议每季度更新一次画像,对比前后变化,异常往往就藏在“变化”里。

3.4 异常波动识别:从“正常”中找出“不正常”

异常波动识别,是描述性审计分析的“终极目标”。你前面做了那么多统计、画了那么多图,最终都是为了回答一个问题:哪些数据点“不对劲”?

我常用的方法有三种:

  1. 基于统计阈值:比如前面提到的±2倍标准差、IQR法则(Q1-1.5IQR, Q3+1.5IQR)
  2. 基于时间序列:用滚动均值和滚动标准差,识别趋势突变点
  3. 基于业务规则:比如单笔交易超过100万、同一对手连续交易超过10次等

嗯,这里要特别强调一下:统计方法只是工具,最终判断还得靠业务经验。我记得有一次,系统标记了一个“异常”——某客户单日交易额突然增长了5倍。我一看,原来是双十一促销活动。所以,别盲目相信算法,要结合业务背景。

我的小技巧:做异常识别时,我会把结果分成三个等级——

  • Level 1(关注):超出正常范围,但幅度不大,记录观察
  • Level 2(预警):明显异常,需要人工复核
  • Level 3(紧急):严重异常,立即上报

这样分级处理,既不会漏掉风险,也不会被海量预警淹没。

3.5 实战案例:某企业费用报销异常检测

最后,我分享一个真实案例。去年我审计一家制造企业,拿到全年的费用报销数据。我按今天讲的流程走了一遍:

  1. 统计指标:发现差旅费均值5000元,中位数只有2000元,明显右偏
  2. 可视化:画箱线图,发现销售部有3笔报销超过5万元,远超其他部门
  3. 审计画像:给这3笔报销打上“高额异常”标签,关联报销人、审批人信息
  4. 异常识别:发现这3笔报销的审批人都是同一个人,且报销时间集中在月底

结果呢?是某位销售经理和财务人员合伙虚报费用。如果没有描述性分析,这些异常可能就淹没在几千条数据里了。

好了,这一章的内容就到这里。记住:描述性审计分析不是花架子,它是你发现问题的“第一双眼睛”。用好统计指标、画好可视化图、建好审计画像,你就能在数据海洋里快速锁定目标。


公众号:蓝海资料掘金营,微信deep3321