第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%为钻石用户。这样分级合理,业务方也满意。

所以你看,数据探索不是走过场。它直接决定了你后续的所有决策。

数据探索与可视化知识体系 原始数据 加载与概览 描述性统计 均值/中位数/标准差 可视化分析 直方图/箱线图/散点图 分布诊断 正态/偏态/长尾/双峰 异常检测 3σ / IQR / 业务规则 数据洞察 特征工程 / 模型选型 从原始数据到数据洞察,每一步都不可或缺 探索的质量,决定了模型的上限