作为数据工程师你真正需要的数学
Source: Dev.to
(请提供需要翻译的正文内容,我才能为您完成简体中文翻译。)
Introduction
让我们直面显而易见的问题。
“要成为数据工程师,我必须擅长数学吗?”
我听学生和转行者问过这个问题上百次。答案可能会让你惊讶:
你需要的数学比想象的少——但绝不是零。
数据工程不是数据科学。你不会推导梯度下降公式或证明统计定理。但你每天都会遇到数学概念,往往甚至没有意识到。
本文将准确说明你需要掌握的内容——让你成为更好的工程师的实用数学,而不需要学术上的繁重负担。
直截了当地说,关键在于:
| Concept | How Often You’ll Use It |
|---|---|
| Set Theory | Daily |
| Boolean Logic | Daily |
| Basic Statistics | Weekly |
| Aggregations & Arithmetic | Daily |
| Probability Basics | Occasionally |
| Linear Algebra | Rarely |
| Calculus | Almost never |
如果你在学校里对高级数学感到吃力,不要因此止步。大多数数据工程的数学在你看到实际应用后会变得直观。
集合论
你编写的每个 SQL 查询都是集合论的实际运用。如果你理解集合,就能理解 SQL。这就是它的根本所在。
集合是由不同元素组成的集合。
Set A = {1, 2, 3, 4, 5}
Set B = {4, 5, 6, 7, 8}
这些直接映射到 SQL:
| 集合操作 | SQL 等价 | 结果 |
|---|---|---|
| 并集 | UNION | A 或 B 中的所有元素 |
| 交集 | INNER JOIN | A 和 B 都 包含的元素 |
| 差集 | EXCEPT / LEFT JOIN | A 中 但不在 B 的元素 |
| 笛卡尔积 | CROSS JOIN | A 和 B 的所有组合 |
示例查询
-- 并集:合并两个集合
SELECT customer_id FROM online_orders
UNION
SELECT customer_id FROM store_orders;
-- 交集:查找共同元素
SELECT a.customer_id
FROM online_orders a
INNER JOIN store_orders b ON a.customer_id = b.customer_id;
-- 差集:查找仅在第一个集合中的元素
SELECT customer_id FROM online_orders
EXCEPT
SELECT customer_id FROM store_orders;
将连接可视化为维恩图会大有帮助:
- INNER JOIN – 仅重叠部分
- LEFT JOIN – 左侧全部加上重叠部分
- RIGHT JOIN – 右侧全部加上重叠部分
- FULL OUTER JOIN – 所有内容
如果你掌握了集合论,SQL 就会变得直观。
Source: …
布尔逻辑
每个 WHERE 子句、IF 语句和 CASE 表达式都是布尔逻辑。
| 运算符 | 含义 | 示例 |
|---|---|---|
AND | 必须同时为真 | status = 'active' AND age > 18 |
OR | 至少有一个为真 | country = 'US' OR country = 'CA' |
NOT | 取反条件 | NOT status = 'deleted' |
真值表概览
| 表达式 | 结果 |
|---|---|
TRUE AND NULL | NULL |
FALSE AND NULL | FALSE |
TRUE OR NULL | TRUE |
FALSE OR NULL | NULL |
NOT NULL | NULL |
NULL = NULL | NULL(而非 TRUE) |
提示:
WHERE column = NULL永远不起作用。请使用WHERE column IS NULL。
德·摩根定律
NOT (A AND B) = (NOT A) OR (NOT B)NOT (A OR B) = (NOT A) AND (NOT B)
实际示例
-- 两条语句等价
WHERE NOT (status = 'active' AND region = 'EU')
WHERE status != 'active' OR region != 'EU'
理解德·摩根定律有助于调试那些未按预期工作的过滤条件。
描述性统计
您不需要统计学学位,但必须了解几种描述性度量。
| 指标 | 它告诉你什么 | SQL |
|---|---|---|
| 均值 | 平均值 | AVG(column) |
| 中位数 | 中间值 | 取决于数据库(例如 PERCENTILE_CONT(0.5)) |
| 众数 | 出现频率最高的值 | GROUP BY … ORDER BY COUNT(*) DESC LIMIT 1 |
| 极差 | 最大值 – 最小值 | MAX(col) - MIN(col) |
| 方差 | 数据的离散程度 | VAR(column) |
| 标准差 | 以原始单位表示的离散程度 | STDDEV(column) |
何时使用哪种指标
- 均值 – 一般的平均值,但对异常值敏感。
- 中位数 – 对偏斜分布更合适(例如工资、价格)。
- 众数 – 最适用于分类数据。
示例
如果工资为 {50k, 55k, 60k, 65k, 500k}:
| 统计量 | 值 | 解释 |
|---|---|---|
| 均值 | 146k | 误导(异常值把它拉高) |
| 中位数 | 60k | 更能代表典型工资 |
百分位数(PostgreSQL 示例)
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY response_time) AS median,
PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY response_time) AS p99
FROM api_logs;
P25、P50(中位数)、P75 和 P99 等百分位数在性能指标中很常见。
聚合
您将不断编写聚合函数。要熟记它们。
| 函数 | 目的 |
|---|---|
COUNT | 行数 |
SUM | 值的总和 |
AVG | 平均值 |
MIN | 最小值 |
MAX | 最大值 |
COUNT(DISTINCT) | 唯一值 |
分组
GROUP BY 将您的数据划分为集合,然后对每个集合应用聚合。
SELECT
region,
COUNT(*) AS order_count,
SUM(amount) AS total_revenue,
AVG(amount) AS avg_order_value
FROM orders
GROUP BY region;
可以这样理解: “对每个地区,计算这些指标。”
窗口函数
窗口函数允许您在保留单行记录的同时进行聚合。
SELECT
order_id,
customer_id,
amount,
SUM(amount) OVER (PARTITION BY customer_id) AS customer_total,
AVG(amount) OVER (PARTITION BY customer_id) AS customer_avg
FROM orders;
PARTITION BY 再次体现集合论——您正在定义子集。
概率基础
您不需要深入的概率理论,但掌握一些基础概念会有帮助。
| Concept | Definition |
|---|---|
| Probability | 事件发生的可能性,范围从 0 到 1 |
| Independent Events | 一个事件不影响另一个事件 |
| Conditional Probability | 在已知其他事件发生的前提下的概率 |
典型的数据工程应用:
- 数据质量检查:“有多少比例的记录存在缺失值?”
- 抽样:“这个样本是否具有代表性?”
- A/B 测试:“这个结果是否具有统计显著性?”
示例:列中 NULL 值的概率
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(
SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END)::decimal
/ COUNT(*), 4
) AS null_probability
FROM customers;
数值类型及其陷阱
了解数字的存储方式可以避免代价高昂的错误。
| 类型 | 用例 | 注意事项 |
|---|---|---|
INTEGER | 计数、ID | 超出上限会溢出 |
FLOAT | 科学数据 | 精度误差 |
这就是你作为一名合格数据工程师所需的实用数学。掌握这些概念后,你会发现 SQL 和数据管道不再那么令人生畏。
DECIMAL
金钱,精确数值
更慢,需要更多存储
-- This might not equal 0.3
SELECT 0.1 + 0.2;
-- Result: 0.30000000000000004
对于金融数据,始终使用 DECIMAL。
-- Integer division truncates
SELECT 5 / 2; -- Returns 2, not 2.5
-- Cast to get decimals
SELECT 5::decimal / 2; -- Returns 2.5
我经常使用的模式
-- 1️⃣ Category percentages
SELECT
category,
COUNT(*) AS count,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS percentage
FROM products
GROUP BY category;
-- 2️⃣ Year‑over‑year growth
SELECT
year,
revenue,
LAG(revenue) OVER (ORDER BY year) AS prev_year,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY year))
/ LAG(revenue) OVER (ORDER BY year), 2
) AS yoy_growth
FROM annual_revenue;
-- 3️⃣ Running total
SELECT
date,
amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM transactions;
-- 4️⃣ 7‑day moving average
SELECT
date,
value,
AVG(value) OVER (
ORDER BY date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS seven_day_avg
FROM daily_metrics;
作为数据工程师,你可以降级
| 主题 | 为什么可以跳过 |
|---|---|
| 微积分 | 留给数据科学家 |
| 线性代数 | 只在机器学习工程中需要 |
| 高级统计 | 超出描述性统计,非必需 |
| 证明与定理 | 你在构建,而不是证明 |
如果以后转向机器学习工程,请重新审视这些内容。对于核心数据工程而言,它们并非必需。
学习数据工程数学的最佳方式 – 通过 SQL
- 选取公开数据集 – Kaggle 上有很多。
- 提出问题 – “按地区划分的订单中位值是多少?”
- 编写查询 – 运用上述概念。
- 验证结果 – 它们是否合乎逻辑?
当数学与真实问题相结合时,就会变得直观。
必掌握的核心概念
- 集合论 – 理解它,SQL 就变得有意义。
- 布尔逻辑 – 每个过滤条件都依赖它。
- 描述性统计 – 均值、中位数、百分位数。
- 聚合 – 你的日常工具。
- 精度 – 了解你的数据类型。
你不必热爱数学。只需要对它保持足够的尊重,以确保基础正确。理论只能带你走这么远。
接下来是什么?
在下一篇文章中我们将把所有内容串联起来:
- 构建你的第一个数据管道——从概念到可运行代码
- 数据工程揭秘:它是什么以及为何重要
- 管道、ETL 与数据仓库:数据工程的基因
- 行业工具:驱动现代数据工程的力量
- 作为数据工程师真正需要的数学(此处)
- 构建你的第一个管道:从概念到执行
- 规划你的路径:加速学习的课程与资源
觉得有帮助吗? 对这些概念的应用有疑问吗?请在评论区留言。