第4章 数据探索与可视化:初步了解数据分布
做数据分级分类,第一步不是选模型,而是摸清数据的"脾气"。数据探索说白了,就是跟数据打个照面,看看它长什么样、有什么规律、有没有异常。我个人习惯,任何项目开头必须先做这步,否则后面建模就是闭着眼开车。你想想看,连数据长啥样都不知道,怎么给它分级?
4.1 为什么数据探索是建模的第一步?
数据分布直接影响模型选型。正态分布的数据,线性模型就能搞定。偏态严重的,得做变换。长尾分布的,可能要分桶。我在项目中遇到过不少次这种情况——看上去漂亮的数据集,一画图发现分布严重偏态,要是直接上模型,结果肯定翻车。
数据探索的核心目标有三个:
- 看清形态——数据是正态、偏态还是双峰?
- 发现异常——有没有离群点或错误值?
- 指导选型——该用统计模型还是树模型?
记住一个原则:先探索,后建模。跳过这一步,后面所有工作都可能白费。
4.2 描述性统计:快速掌握数据全貌
描述性统计是数据探索的起点。几个核心指标,就能告诉你数据的基本状况。我个人习惯,拿到数据先算这五个数,心里有个底。
| 指标 | 作用 | 注意事项 |
|---|---|---|
| 均值 | 反映数据集中趋势 | 受异常值影响大,别单独看 |
| 中位数 | 反映数据中间位置 | 对异常值不敏感,更稳健 |
| 标准差 | 反映数据离散程度 | 单位与原始数据相同 |
| 四分位数 | 反映数据分布区间 | 可识别偏态和异常值 |
| 极差 | 最大值与最小值之差 | 对异常值极其敏感 |
这里有个小技巧:对比均值和中位数。如果两者接近,数据大致对称。如果均值远大于中位数,数据右偏;反之左偏。这个判断比看图表还快。
实操建议:用pandas的df.describe()可以一次性输出这些指标,省时省力。
4.3 可视化工具:让数据说话
指标只能告诉你"有什么",可视化才能告诉你"为什么"。我常用三种图,基本覆盖了90%的探索场景。
直方图——看分布形态
直方图能直观展示数据的频数分布。bins数量很关键,太少会丢失细节,太多会引入噪声。我个人一般从30开始调,根据数据量上下浮动。
箱线图——看异常值
箱线图一目了然。上边缘、下边缘、中位数、四分位距,异常点直接标出来。我在风控项目中,就是用箱线图快速定位了交易金额的异常峰值。
散点图——看变量关系
两个变量之间有没有线性关系?有没有聚类趋势?散点图是首选。对于高维数据,可以先用PCA降维再画。
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('user_data.csv')
# 直方图 — 看年龄分布
plt.figure(figsize=(8, 4))
plt.hist(df['age'], bins=30, color='#3498db', edgecolor='white')
plt.title('年龄分布直方图')
plt.xlabel('年龄')
plt.ylabel('频数')
plt.show()
# 箱线图 — 看消费金额异常
plt.figure(figsize=(6, 4))
plt.boxplot(df['amount'], vert=False)
plt.title('消费金额箱线图')
plt.xlabel('金额')
plt.show()
避坑指南:我曾经直接用了默认bins=10,结果双峰分布被合并成单峰,差点误导了后续分级策略。一定记得调bins,多试几个值对比。
4.4 分布分析:识别数据形态
数据分布形态直接影响模型选型和特征工程。常见的有这几种:
- 正态分布——对称、钟形,适合线性模型和统计检验
- 偏态分布——左偏或右偏,需要log变换或Box-Cox变换
- 长尾分布——极端值多,需要截断或分桶处理
- 双峰分布——数据来自两个群体,需要分层分析
为什么会这样?数据本身的结构决定了分布形态。比如用户消费金额,大部分是普通用户,小部分是高端用户,自然形成右偏。这时候如果强行用均值做阈值,普通用户全被归为低等级,不合理。
核心原则:分布形态决定处理方式。正态分布直接建模,偏态分布做变换,长尾分布考虑分桶,双峰分布先分层。
4.5 异常值检测:别让少数派带偏了
异常值是数据中的"刺头"。不处理的话,模型会被它们牵着鼻子走。但处理方式要看业务场景,异常值不一定都是噪声——在欺诈检测中,异常就是信号。
常用的检测方法:
- 3σ原则:超出均值±3倍标准差的数据视为异常,适合近似正态分布
- IQR法则:超出Q1-1.5IQR或Q3+1.5IQR视为异常,对偏态分布更鲁棒
- 箱线图可视化:直观看到异常点的数量和位置
我曾经吃过一个亏:在用户分级项目中,数据里有一批测试账号的消费记录,金额异常高。我没有做异常检测就直接建模,结果模型把测试账号全部分到了最高等级,上线后才发现。从那以后,异常检测成了我 pipeline 中不可跳过的一步。
处理方式分两种:业务异常直接剔除,信号异常保留并单独标记。怎么区分?跟业务方聊,别自己拍脑袋。
4.6 实践案例:从探索到洞察
说一个电商用户分级的真实案例。
当时我拿到一批用户消费数据,总共有20万条。先跑描述性统计:均值500,中位数只有200,差距很大。直觉告诉我,数据右偏严重。
画直方图一看,果然——大部分用户消费集中在0-300元区间,峰值在150元左右,尾部拖着一条长长的尾巴,一直延伸到5000元以上。再画箱线图,发现超过1000元的数据都被标记为异常。
这个发现直接影响了分级策略:如果用金额做阈值,90%的用户会被分到最低等级,完全失去区分度。最后我们改用分位数做分段——0-50%为普通用户,50-90%为银牌用户,90-99%为金牌用户,前1%为钻石用户。这样分级合理,业务方也满意。
所以你看,数据探索不是走过场。它直接决定了你后续的所有决策。