4、数据探索性分析(EDA):描述性统计、数据分布、相关性分析,为报告找“故事”

拿到一份数据,别急着建模。我见过太多人上来就跑模型,结果跑出来一堆垃圾。为什么?因为你不了解你的数据。

EDA 就是干这个的。它帮你回答三个问题:数据长什么样?数据里有什么规律?哪些变量之间有故事?

说白了,EDA 是给报告找“素材”的阶段。你后面写的所有结论、所有洞察,都从这里来。

4.1 描述性统计:先摸清数据的“家底”

描述性统计是最基础的一步。我习惯先看几个核心指标:均值、中位数、标准差、最小值、最大值、四分位数。

举个例子,你分析用户年龄。均值是 35 岁,但中位数是 28 岁。这说明什么?说明数据被少数高龄用户拉高了。嗯,这里要注意,均值对异常值很敏感。

核心指标速查表

指标 含义 什么时候用
均值 数据的算术平均 数据分布对称时
中位数 排序后中间位置的值 数据有偏或含异常值时
标准差 数据离散程度 衡量波动性
四分位距 Q3 - Q1 识别异常值

我在项目中遇到过一件事。某次分析销售数据,均值 120 万,但中位数只有 45 万。一查,原来有个大客户贡献了 800 万。如果不看中位数,你会误以为所有客户都很有钱。报告写出来就闹笑话了。

我的习惯:每次拿到数据,先跑一个 df.describe()。花 30 秒扫一眼,心里就有数了。

4.2 数据分布:数据到底长什么样?

描述性统计告诉你数字,但分布告诉你形状。你想想看,同样是均值 50,可能是正态分布,也可能是双峰分布。背后的业务含义完全不同。

我常用的分布分析方法:

  • 直方图:看整体形状,有没有偏态、双峰
  • 箱线图:看异常值、四分位范围
  • 密度图:平滑版本,适合对比多组数据

举个例子,分析用户活跃时长。直方图显示有两个峰:一个在 10 分钟,一个在 60 分钟。这说明什么?说明你的用户分两类:轻度用户和重度用户。这就是一个很好的报告切入点。

我曾经踩过的坑:只看直方图,没注意样本量。100 个样本和 10000 个样本的直方图,可信度完全不一样。小样本时别过度解读形状。

还有一个常见问题:数据是否符合正态分布?很多统计方法假设正态性。你可以用 Q-Q 图或 Shapiro-Wilk 检验来判断。但说实话,在真实项目中,完美正态的数据很少。别太纠结,只要不是严重偏态就行。

4.3 相关性分析:变量之间的“暧昧关系”

相关性分析是 EDA 的重头戏。它帮你找到变量之间的关联,为报告提供“故事线”。

我习惯用皮尔逊相关系数。范围在 -1 到 1 之间。绝对值越大,相关性越强。正负号表示方向。

相关系数解读指南

相关系数范围 相关强度 报告怎么写
0.8 - 1.0 极强 高度相关,需注意共线性
0.5 - 0.8 中等 有明显关联,值得深挖
0.3 - 0.5 较弱 有一定趋势,但别过度解读
0 - 0.3 极弱或无 基本没关系

但注意,相关性不等于因果。我见过有人把“冰淇淋销量”和“溺水人数”的相关性写成因果关系。你想想看,这合理吗?其实是夏天到了,两个都增加而已。

在报告中,我建议这样写:

  • “数据显示,A 和 B 存在中等正相关(r=0.62)。”
  • “进一步分析发现,当 A 增加时,B 也呈现上升趋势。”
  • “但需注意,这并不代表 A 导致 B,可能存在其他影响因素。”

我的技巧:用热力图展示相关性矩阵。一眼就能看出哪些变量抱团,哪些是孤岛。报告里放一张热力图,比写十行文字都管用。

4.4 为报告找“故事”:从数据到洞察

EDA 的最终目的,是为报告找故事。你发现了异常值、找到了分布特征、看到了相关性——这些都是素材。但怎么把它们串成一个有说服力的故事?

我总结了一个三步法:

  1. 发现异常:数据里有什么“不对劲”的地方?比如某个指标突然飙升、某个群体表现异常。
  2. 追溯原因:为什么会出现这个异常?跟哪些变量有关?有没有业务逻辑支撑?
  3. 形成结论:这个发现对业务意味着什么?应该采取什么行动?

举个例子。某次分析用户流失数据,我发现流失用户的平均登录次数是 3 次,而留存用户是 15 次。这个差异很明显。进一步分析发现,流失用户中有 70% 在注册后 7 天内没有完成核心操作。故事就出来了:“注册后 7 天是关键窗口期,未完成核心操作的用户流失风险极高。”

你看,这就是一个完整的“故事”。有数据支撑,有业务含义,有行动建议。

我曾经犯过的错:找到一堆相关性,但没想清楚业务逻辑。报告写出来,老板问“所以呢?”我答不上来。记住,EDA 是为业务服务的,不是炫技。

4.5 EDA 知识体系总览

下面这张图,是我自己总结的 EDA 核心框架。每次做分析前,我都会过一遍。

EDA 知识体系总览 描述性统计 数据分布 相关性分析 均值/中位数 标准差/方差 四分位数 极值/范围 直方图 箱线图 密度图 Q-Q 图 皮尔逊系数 斯皮尔曼 热力图 散点图矩阵 输出:数据洞察 + 报告素材 核心原则 • 先看整体,再看局部 • 先看分布,再看关系 • 先看数据,再下结论 • 先找异常,再讲故事

这张图把 EDA 的核心内容串起来了。从左到右,从描述性统计到数据分布,再到相关性分析。每一步都有对应的工具和方法。最终输出的是数据洞察和报告素材。

我个人习惯,每次做 EDA 都按这个框架走一遍。不会漏掉关键步骤,也不会跑偏。

4.6 实战:用 Python 快速完成 EDA

理论说完了,来点实际的。下面是我常用的 EDA 代码模板。你直接复制就能用。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 加载数据
df = pd.read_csv('your_data.csv')

# 2. 描述性统计
print("=== 描述性统计 ===")
print(df.describe())
print("\n=== 缺失值检查 ===")
print(df.isnull().sum())

# 3. 数据分布
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['age'].hist(ax=axes[0], bins=30, color='skyblue', edgecolor='black')
axes[0].set_title('Age Distribution')
df.boxplot(column='age', ax=axes[1])
axes[1].set_title('Age Boxplot')
plt.tight_layout()
plt.show()

# 4. 相关性分析
print("\n=== 相关性矩阵 ===")
corr = df.corr()
print(corr)

# 热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Correlation Heatmap')
plt.show()

我的建议:把这段代码保存成 eda_template.py。每次新项目,先跑一遍。5 分钟就能对数据有个全面了解。

代码跑完后,你会得到三样东西:描述性统计表、分布图、相关性热力图。这三样东西,就是报告的核心素材。

嗯,到这里,EDA 的核心内容就讲完了。记住,EDA 不是一次性工作。你可能会反复做几次,每次发现新的东西。别急,慢慢来。数据会告诉你故事的。