3、探索性数据分析(EDA):描述性统计、数据分布可视化(直方图、箱线图)、相关性分析(热力图)

大家好,我是你们的老朋友。今天咱们聊聊探索性数据分析,也就是EDA。

说实话,我面试过不少候选人,很多人一上来就撸模型,结果数据长什么样都没搞清楚。这其实是个大坑。我个人习惯,拿到任何数据集,第一件事就是做EDA。说白了,就是先跟数据“聊聊天”,摸摸它的脾气秉性。

3.1 描述性统计:给数据“体检”

描述性统计,就是给数据做个体检报告。你想想看,一个陌生人站你面前,你总得先知道身高体重、年龄性别吧?数据也一样。

核心指标就这几类:

  • 集中趋势:均值、中位数、众数。均值容易被极端值带偏,中位数更稳健。我在项目中遇到过,用户收入数据里有个别富豪,均值直接翻倍,这时候看中位数才靠谱。
  • 离散程度:标准差、方差、极差、四分位距。标准差越大,数据越“散”。
  • 分布形态:偏度、峰度。偏度看左右是否对称,峰度看数据是“尖”还是“平”。

避坑指南: 我曾经接手过一个风控项目,特征“月消费金额”的均值是5000,标准差却高达8000。一查才发现,数据里混入了几个刷单的异常值。如果不做描述性统计,直接建模,模型会被这几个点带歪。

代码实现很简单,用Pandas的describe()方法就能一键生成:

import pandas as pd

df = pd.read_csv('user_data.csv')
print(df.describe())  # 自动输出均值、标准差、四分位数等
print(df.describe(include='object'))  # 分类变量的统计

3.2 数据分布可视化:直方图与箱线图

光看数字不够直观,得画图。我最常用的两个图:直方图和箱线图。

3.2.1 直方图:看数据的“长相”

直方图把数据分成若干区间,看每个区间有多少样本。它能告诉你:数据是正态分布?偏态分布?还是双峰分布?

举个例子,电商平台的订单金额,通常是右偏的——大部分订单金额小,偶尔有几个大单。如果直方图显示双峰,那可能意味着有两类不同的用户群体。

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(10, 6))
sns.histplot(df['amount'], bins=30, kde=True)  # kde=True 叠加密度曲线
plt.title('订单金额分布')
plt.xlabel('金额')
plt.ylabel('频数')
plt.show()

小技巧: bins的数量别太多也别太少。我一般先设30,再根据数据量调整。数据量大可以多分几组,数据量少就少分点。

3.2.2 箱线图:一眼看出异常值

箱线图是检测异常值的神器。它展示了最小值、下四分位数、中位数、上四分位数、最大值。超出“触须”范围的点,就是潜在的异常值。

嗯,这里要注意:箱线图的“异常值”不一定都要删除。我曾经在用户行为分析中,发现箱线图显示“登录次数”有大量异常值。一查,原来是VIP用户的正常行为。所以,异常值要结合业务判断。

plt.figure(figsize=(8, 6))
sns.boxplot(x=df['amount'])
plt.title('订单金额箱线图')
plt.show()

3.3 相关性分析:热力图

相关性分析,说白了就是看变量之间有没有“暧昧关系”。正相关、负相关、还是不相关?

最常用的指标是皮尔逊相关系数,取值范围[-1, 1]。0.8以上算强相关,0.3以下算弱相关。但要注意:相关不等于因果。我见过有人把“冰淇淋销量”和“溺水人数”的高相关,误认为因果关系——其实是因为夏天到了,两个都增加。

热力图能把相关性矩阵可视化,颜色越深,相关性越强。

import numpy as np

# 计算相关系数矩阵
corr_matrix = df.corr()

# 画热力图
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm', 
            linewidths=0.5, square=True)
plt.title('特征相关性热力图')
plt.show()

警告: 如果两个特征的相关性超过0.9,就要小心多重共线性了。我曾经在房价预测项目中,发现“房间数”和“面积”相关性高达0.95,最后建模时只保留了一个。否则模型会不稳定,系数解释起来也怪怪的。

3.4 实战中的EDA流程

我一般按这个顺序来:

  1. 先看整体df.info()df.describe(),了解数据类型、缺失值、基本统计量。
  2. 单变量分析:每个特征画直方图或箱线图,看分布和异常值。
  3. 双变量分析:数值型用散点图或热力图,分类型用柱状图或交叉表。
  4. 多变量分析:用pairplot或分面网格,看多个变量之间的关系。

举个例子,我之前做电商用户画像,先看描述性统计发现“购买频次”均值是3.2,但中位数只有1。画直方图一看,果然是右偏分布——大部分用户只买过一次。再画箱线图,发现有几个用户买了上百次,是黄牛。最后用热力图发现,“购买频次”和“客单价”呈弱负相关,说明高频用户反而买便宜货。

这些发现,直接指导了后续的特征工程和模型选择。所以说,EDA不是走过场,而是整个项目的基石。

总结一下: 描述性统计让你心里有数,直方图和箱线图让你看清分布,热力图帮你发现变量关系。这三板斧用好了,数据挖掘就成功了一半。

好了,今天就聊到这儿。下一章咱们讲数据预处理,到时候见。