查看全课大纲(第 4 / 35 节)

数据统计、相似度与数据探索

约 12 分钟

小象实战讲义 · 特征工程精讲与实践

在上一节,我们了解了数据与特征的基本概念。本节我们将深入数据的内部,学习如何用数学语言描述和度量数据。掌握数据的统计特性、相似度计算以及探索性数据分析(EDA)的思维,是后续进行有效特征工程的基础。

💡 核心导读

  • 数据的基本统计信息:学习均值、中位数、众数、分位数、方差等核心统计量,理解它们如何刻画数据的中心趋势与离散程度。
  • 数据相似度与度量:掌握如何计算样本间的距离(如曼哈顿距离、欧式距离),量化数据对象之间的相似或不相似程度。
  • 数据探索与理解:认识探索性数据分析(EDA)的重要性,并了解自动化生成数据探索报告的工具。

数据的基本统计信息

当我们开始分析数据时,首先需要了解数据的“样子”。数据的统计信息可以帮助我们获得数据的总体印象,更好地理解数据的分布,例如用户群体的性别、地域、年龄分布等。这些信息主要通过一些统计度量来刻画。

中心趋势度量

均值(Mean):指一组数的算术平均值,计算公式为所有数值求和后除以总数量。它刻画了数据的总体平均状态。此外还有按权重加权的加权平均值,用于不同样本重要性不同的场合。 Mean=1n∑i=1nxi\text{Mean} = \frac{1}{n}\sum_{i=1}^{n} x_i

中位数(Median):将数据从小到大排序后,处在中间位置的那个数。如果数据个数为偶数,则取中间两个数的平均值。中位数相比均值更加稳定,不易受到极端值(离群点)的影响。例如,某公司员工的平均月薪可能被少数高薪员工“拉高”,而中位数则更能代表普通员工的薪资水平。

众数(Mode):指一组数据中出现次数最多的取值。它主要用于类别型数据(如汽车品牌、颜色),刻画了最常见的类别。

离散程度与分位数

分位数(Quantiles):当我们把数据从小到大排列时,处在百分之 k 位置上的那个数值,称为 k 分位数。它表示有百分之 k 的数据不大于该值。

  • 下四分位数(Q1, 25分位数):有25%的数据小于或等于它。
  • 上四分位数(Q3, 75分位数):有75%的数据小于或等于它。
  • 四分位距(IQR):IQR = Q3 - Q1,用于衡量数据中间50%部分的离散程度。

方差(Variance)与标准差(Standard Deviation):方差刻画了数据围绕其均值的波动状况。标准差是方差的平方根,其量纲与原始数据相同。 Variance=1n∑i=1n(xi−xˉ)2\text{Variance} = \frac{1}{n}\sum_{i=1}^{n} (x_i - \bar{x})^2

箱线图:统计信息的可视化

箱线图(Box Plot,又称盒须图)是一种强大的可视化工具,它将上述多个统计量整合在一张图中。

  • 箱体:由Q1、中位数、Q3构成,箱体的高度(IQR)反映了中间50%数据的集中程度。
  • 须线:通常延伸至最小非异常值和最大非异常值(一般为 Q1 - 1.5IQR 和 Q3 + 1.5IQR)。
  • 异常值:落在须线之外的点,通常被视为异常值。

通过箱线图,我们可以直观判断数据的偏态(箱子偏向一侧)、尾重(须线长短)以及数据的集中程度(箱子越窄,数据越集中)。

让我们通过一个简单的Python示例来计算一组数据的统计量并理解其含义。

import numpy as np
import pandas as pd

# 构造一组示例数据:某次考试的学生成绩
scores = [2, 4, 4, 4, 5, 5, 7, 9]

# 计算基本统计量
mean_score = np.mean(scores)
median_score = np.median(scores)
# pandas的mode返回一个Series,取第一个众数
mode_score = pd.Series(scores).mode().iloc[0]
variance_score = np.var(scores, ddof=0)  # 总体方差
q1 = np.percentile(scores, 25)
q3 = np.percentile(scores, 75)

print(f"均值: {mean_score}")
print(f"中位数: {median_score}")
print(f"众数: {mode_score}")
print(f"方差: {variance_score:.2f}")
print(f"Q1 (25分位数): {q1}")
print(f"Q3 (75分位数): {q3}")
均值: 5.0
中位数: 4.5
众数: 4
方差: 4.00
Q1 (25分位数): 4.0
Q3 (75分位数): 5.5

从输出可以看出,这组成绩的均值是5.0,高于中位数4.5,说明右侧存在拉高均值的尾部(高分 7 和 9 拉高了均值),分布略呈右偏。众数为4,是最常见的分数。方差为4.0,量化了分数的波动情况。Q1和Q3分别为4.0和5.5,意味着中间50%的学生成绩集中在4到5.5分这个较窄的区间内。

数据相似度与度量

在特征工程和机器学习中,我们经常需要度量两个数据对象(样本)的相似或不相似程度。这有助于我们进行聚类、最近邻搜索等任务。

相似性(Similarity):度量两个对象的相似程度,值越高越相似,通常取值范围在[0,1]之间。例如,我们口语中说“有五成相似”,对应的相似度就是0.5。

不相似性(Dissimilarity)或距离(Distance):度量两个对象的差异程度,值越小越相似,最小值为0(完全相同),无上界。

数据对象通常可以表示为一个向量(例如,表格中的一行)。给定两个 dd 维向量 x=(x1,x2,...,xd)\mathbf{x} = (x_1, x_2, ..., x_d) 和 y=(y1,y2,...,yd)\mathbf{y} = (y_1, y_2, ..., y_d),最常用的距离度量是 闵可夫斯基距离(Minkowski Distance):

dist(x,y)=(∑i=1d∣xi−yi∣h)1/h\text{dist}(\mathbf{x}, \mathbf{y}) = \left( \sum_{i=1}^{d} |x_i - y_i|^h \right)^{1/h}

其中 hh 是一个参数,该距离也称为 LhL_h 范数。

  • 当 h=1h=1 时,称为 曼哈顿距离(Manhattan Distance) 或 L1 距离。dist=∑i=1d∣xi−yi∣\text{dist} = \sum_{i=1}^{d} |x_i - y_i|
  • 当 h=2h=2 时,称为 欧几里得距离(Euclidean Distance) 或 L2 距离。dist=∑i=1d(xi−yi)2\text{dist} = \sqrt{\sum_{i=1}^{d} (x_i - y_i)^2}
import numpy as np

# 定义两个三维数据点(向量)
point_a = np.array([1, 2, 3])
point_b = np.array([4, 5, 6])

# 计算曼哈顿距离 (L1)
manhattan_dist = np.sum(np.abs(point_a - point_b))
print(f"曼哈顿距离: {manhattan_dist}")

# 计算欧几里得距离 (L2)
euclidean_dist = np.sqrt(np.sum((point_a - point_b) ** 2))
print(f"欧几里得距离: {euclidean_dist:.2f}")
曼哈顿距离: 9
欧几里得距离: 5.20

数据探索与数据理解

在进行数据建模和特征工程之前,我们必须对业务场景和数据本身有深入的理解。这个过程称为 探索性数据分析(Exploratory Data Analysis, EDA)。

EDA 是数据科学和机器学习建模前期至关重要的一环。它并不侧重于应用复杂的模型和算法,而是更偏重于:

  1. 定义数据的本质:理解每个字段的含义、类型。
  2. 描述数据的形态:通过统计量和可视化了解数据的分布、缺失、异常情况。
  3. 解释数据的相关性:探索特征之间、特征与目标变量之间的关系。

通过 EDA,我们能为后续的特征处理、模型选择等工作奠定坚实的基础,明确哪些数据重要、哪些需要处理、如何处理。

传统上,EDA 需要手动使用 pandas 等工具进行大量的统计分析。现在,有一些优秀的工具可以自动化生成全面的数据探索报告,极大提升效率。在本课程后续的实战环节,我们将使用 pandas_profiling 工具,一键为泰坦尼克数据集和链家租房数据集生成详细的 HTML 分析报告,快速洞察数据全貌。

📝 动手练一练

  1. 概念辨析:均值和中位数都是刻画数据“中心”的统计量。请设想一个实际场景(如收入、房价、应用响应时间),说明在什么情况下使用中位数比均值更能反映数据的典型情况?
👉 点击查看参考答案

当数据中存在少数极端值(离群点)时,中位数比均值更能反映数据的典型情况。例如,在统计一个社区居民的年收入时,如果大部分居民收入在10-20万元,但有一位亿万富翁,那么平均收入会被显著拉高,无法代表大多数人的收入水平。此时,中位数能更好地反映“典型”居民的收入。

  1. 动手计算:给定一组数据 [10, 20, 20, 30, 40],请手动计算其均值、中位数、众数以及 Q1(25分位数)和 Q3(75分位数)。
👉 点击查看参考答案
  • 均值: (10+20+20+30+40)/5 = 24.0
  • 中位数: 数据已排序,中间位置(第3个)的值为 20。
  • 众数: 出现次数最多的值是 20。
  • Q1 (25分位数): 手算常用 (n+1) 位置法:位置为 0.25*(5+1)=1.5,介于第1和第2个数之间,取平均。(10+20)/2 = 15.0。
  • Q3 (75分位数): 位置为 0.75*(5+1)=4.5,介于第4和第5个数之间,取平均。(30+40)/2 = 35.0。
  • 注意:不同工具对分位数的插值约定不同,例如 numpy 的 percentile 默认按线性插值计算,对本组数据会得到 Q1=20、Q3=30。分位数没有唯一“标准答案”,关键是了解自己所用工具的约定,并在同一次分析中保持一致。

本章小结

本节我们学习了用数学工具来理解和描述数据,这是特征工程乃至整个机器学习流程的基石。

📋 行动清单

  • 掌握核心统计量:对于任何新接触的数据集,尝试用 Python 计算其均值、中位数、分位数、方差,并思考这些数字背后的业务含义。
  • 理解距离度量:明确曼哈顿距离和欧式距离的计算方式及其适用场景(例如,曼哈顿距离更适合网格状路径的度量)。
  • 建立 EDA 思维:养成在动手建模前,先对数据进行系统性探索的习惯,利用工具快速生成数据报告,形成对数据的初步洞察。

—— 小象教研组