数据探索与理解:数据来源分析、数据质量评估、数据分布探索

大家好,我是你们的老朋友。今天咱们聊聊数据挖掘里最容易被忽视、却又最要命的一步——数据探索与理解。

说实话,我见过太多团队,拿到数据就急着建模。结果呢?模型跑出来效果差,回头一查,数据源有问题,质量一塌糊涂。嗯,这就像盖房子不打地基,迟早要塌。

我个人习惯,拿到任何数据任务,前30%的时间都花在数据探索上。别嫌慢,这步做好了,后面建模会顺很多。

数据来源分析:搞清楚数据从哪来

数据来源分析,说白了就是问三个问题:

  • 数据是谁产生的? 用户行为?传感器?业务系统?
  • 数据怎么采集的? API接口?日志文件?数据库导出?
  • 数据有没有被加工过? 原始数据还是ETL后的?

我在项目中遇到过一件事。有一次做用户画像,数据团队给了我一堆"用户活跃度"字段。我一看,数值特别规整,全是整数。后来一查才知道,这是他们自己算的评分,不是原始数据。你想想看,用加工过的数据再去加工,误差会放大多少倍?

⚠️ 我曾经踩过的坑: 千万别轻信数据提供方的"这个数据没问题"。一定要亲自验证数据来源。我吃过一次亏,对方说数据是实时采集的,结果实际上是T+1的离线数据,导致模型上线后预测结果完全滞后。

数据来源分析,我建议你画一张数据血缘图。不用太复杂,就画清楚:原始数据→ETL过程→存储位置→字段含义。这张图能帮你省掉后面80%的排查时间。

数据质量评估:别让脏数据毁了模型

数据质量评估,我一般从四个维度入手:

维度 检查内容 常见问题
完整性 缺失值比例 字段空值、整行缺失
准确性 数据是否在合理范围 年龄200岁、负数的销售额
一致性 不同来源数据是否矛盾 用户性别在A表是男,B表是女
时效性 数据是否及时更新 昨天的数据今天还没入库

举个例子。我之前做电商销售预测,发现某个商品的销量突然暴涨。一开始以为是爆款,后来一查,是数据采集系统出了bug,把同一个订单重复记录了三次。这就是准确性问题,如果不发现,模型会以为这个商品有巨大潜力,结果备货备了一堆,全砸手里了。

我的经验之谈: 数据质量评估不是一次性工作。每次数据更新,都要重新检查。我习惯写一个自动化脚本,每天跑一遍质量检查,发现问题立刻报警。

检查缺失值时,别只看比例。还要看缺失模式。是随机缺失?还是跟某个特征相关?比如用户收入字段经常缺失,可能高收入人群不愿意填。这种非随机缺失,处理方式完全不同。

数据分布探索:摸清数据的脾气

数据分布探索,说白了就是看看数据长什么样。我一般分三步走:

第一步:单变量分析

每个字段单独看。数值型字段看均值、中位数、标准差、最大值、最小值。分类型字段看频数分布。

这里有个小技巧:数值型字段一定要画直方图。我见过太多人只看统计量,结果被平均值骗了。比如用户消费金额,平均值是500,但直方图一看,其实是双峰分布——一部分人花100,一部分人花1000。平均值500根本代表不了任何人。

# 我常用的快速探索代码
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data.csv')

# 数值型字段概览
print(df.describe())

# 画直方图
df['amount'].hist(bins=50)
plt.show()

# 检查异常值
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['amount'] < Q1 - 1.5*IQR) | (df['amount'] > Q3 + 1.5*IQR)]
print(f"异常值数量: {len(outliers)}")

第二步:双变量分析

看两个字段之间的关系。数值对数值,画散点图。数值对分类,画箱线图。分类对分类,画堆叠柱状图。

为什么会这样?因为很多业务问题,本质上是变量之间的关系问题。比如"广告投入和销售额的关系",散点图一看就明白是线性还是非线性。

💡 一个小建议: 双变量分析时,别忘了计算相关系数。但记住,相关系数只衡量线性关系。我遇到过两个变量相关系数接近0,但散点图一看是完美的U型关系。所以,一定要看图

第三步:多变量分析

这一步更高级一些。可以用PCA降维后可视化,或者用热力图看所有字段的相关系数矩阵。

我个人习惯,先做热力图。一眼就能看出哪些字段高度相关。高度相关的字段,建模时要注意多重共线性问题。

# 相关系数热力图
import seaborn as sns

corr_matrix = df.corr()
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()

数据探索的避坑指南

做了这么多年数据挖掘,我总结了几条血泪教训:

  • 不要只看汇总统计量。 平均值、中位数这些数字会骗人。一定要可视化。
  • 注意数据的时间跨度。 如果数据只覆盖了促销期间,那模型学到的全是促销模式,平时根本用不了。
  • 检查数据是否平衡。 分类问题中,正负样本比例严重失衡的话,模型会偷懒——全预测成多数类,准确率还很高,但毫无意义。
  • 别忘了业务背景。 数据分布异常,有时候不是数据问题,而是业务逻辑。比如"双十一"当天的销量暴增,这不是异常值,是正常业务波动。
⚠️ 我曾经犯过的错: 有一次做信用评分模型,我发现某个字段有大量0值,以为是缺失值,直接删掉了。后来业务同事告诉我,这个字段为0代表"该用户没有信用卡",这是有效信息,不是缺失。从那以后,我每次处理数据前,都会先跟业务方聊一聊字段含义。

总结一下

数据探索与理解,说白了就是跟数据交朋友。你得知道它从哪来、质量怎么样、脾气如何。这个过程没有捷径,但做好了,后面的建模工作会轻松很多。

记住一句话:垃圾进,垃圾出。数据探索花的时间,最终都会在模型效果上体现出来。

下一章,咱们聊聊数据预处理。到时候我会分享一些处理缺失值和异常值的实战技巧,敬请期待。