Appearance
数据科学基础
概念
数据科学是"从数据里得出可行动结论"的整套方法。它是三门东西的交集:
| 成分 | 提供什么 | 缺了会怎样 |
|---|---|---|
| 统计学 | 从样本推断总体的推理框架 | 结论没有误差范围,只是猜测 |
| 计算 | 处理与建模的工具 | 只能处理能放进脑子的小数据 |
| 领域知识 | 判断"什么指标有意义" | 算出一堆正确但没用的数字 |
数据的基本生命周期是一条闭环:
| 阶段 | 做什么 |
|---|---|
| 采集 | 把原始记录收上来 |
| 清洗 | 处理缺失、异常、重复、口径不一 |
| 探索 | 描述统计与可视化,先摸清形状 |
| 建模 | 选方法、定参数、做验证 |
| 部署 | 把结论变成可用的流程 |
| 监控 | 上线后持续比对,发现数据漂移再回到清洗 |
其中"清洗"通常最耗时间,也最容易被跳过。 上一章人工智能基础说"模型是学出来的";但模型只能从数据里学,脏数据喂进去,学出来的就是脏规律。
本章只做一件事:把"数据会骗人"这件事,用能算的数说清楚。
原理
一、数据清洗:先修数据,再谈分析
四类最常见的毛病:
| 问题 | 表现 | 常用处置 |
|---|---|---|
| 缺失 | 字段为空 | 删行、用均值或中位数填充、或用模型预测填充 |
| 异常 | 个别值远离其余 | 先查是录入错误还是真实现象,再决定留、删或单独分析 |
| 重复 | 同一条记录出现多次 | 按主键或全部字段去重 |
| 单位与类型不一致 | 米与厘米混写、数字被存成文本 | 统一单位、统一类型后重算 |
处置异常值的第一原则是"先问来源":传感器跳变、手工录入错误可以删;真实的极端事件(比如一次极端降水)删掉反而会掩盖信息。
二、描述统计:两个坐标轴
任何一组数都可以用两个问题刻画:中心在哪、散得多开。
集中趋势:
| 指标 | 定义 | 特点 |
|---|---|---|
| 均值 | 全部求和再除以个数 | 用到了每个数,受极端值影响大 |
| 中位数 | 排序后取中间 | 只看位置,抗极端值 |
| 众数 | 出现次数最多的值 | 适用于类别型数据 |
离散程度:
| 指标 | 定义 | 特点 |
|---|---|---|
| 极差 | 最大值减最小值 | 只用两个数,很脆 |
| 总体方差 | 除以 | |
| 样本方差 | 除以 | |
| 标准差 | 方差的平方根 | 与被测数据同量纲 |
| 四分位距 | 只看中间一半,抗极端值 |
为什么样本方差要除以
由四分位距可以给出一个常用的离群判定规则——箱线图规则,满足下式之一即判为离群:
注意四分位数本身有三种以上公认口径(取中位数再取中点、线性插值等),同一组数据在不同软件里可能算出略不相同的
三、标准化与归一化
不同量纲的变量放在一起比较前要拉到同一尺度:
| 方法 | 公式 | 结果范围 | 适用 |
|---|---|---|---|
| z 分数(标准化) | 一般落在 | 假设大致对称、无强离群 | |
| min-max(归一化) | 严格落在 | 需要固定边界,但会被单个离群值压扁 |
二者不是同义词,选错会有实际后果。 min-max 的最小值与最大值都由数据的两个极端决定,一个离群值就能把其余所有点挤进很窄的一段;z 分数受离群影响也存在,但不会被单个点整体压扁。
四、可视化:图形要匹配变量类型
图形不是装饰,是编码:把数据映射到位置、长度、面积、颜色这些视觉通道上。
| 想表达 | 用什么图 | 视觉通道 |
|---|---|---|
| 比较类别大小 | 条形图 | 长度(最准确) |
| 看随时间的变化 | 折线图 | 位置 |
| 看分布形状 | 直方图、箱线图 | 位置与面积 |
| 看两个变量的关系 | 散点图 | 位置 |
| 看构成占比 | 堆叠图或饼图 | 面积(最不准确,谨慎) |
为什么长度比面积可靠? 人对长度的判别是线性的,对面积是平方关系——面积的细微差别很难看出来。所以饼图在项数一多就失效。
五、相关与因果:最容易犯的错误
皮尔逊相关系数衡量两个变量的线性相关程度:
三条必须记住的话:
只测线性。把 与 放在一起,可能是完美的抛物线关系,而 接近 0。 不等于没关系,只等于没有线性关系。- 相关不等于因果。两个变量同时变化,可能是第三个变量在背后推动,也可能是反过来。
第三个变量的经典陷阱是辛普森悖论:分组内每个组都是 A 更好,合并以后却是 B 更好。 原因是两组的分组构成不同——某一治疗方案更多地被用在轻症上,于是"总体治愈率"变成了人群构成的度量,而不是疗效的度量。
这就是为什么计量经济学要花大力气研究"控制变量"与因果识别:不控制混杂变量,再精确的算术也会给出相反的结论。
示例
python
import math
from statistics import mean, median, pstdev, stdev, variance
# 例 1:Anscombe 四组 —— 统计量全同、图形迥异
x1 = [10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5]
x4 = [8, 8, 8, 8, 8, 8, 8, 19, 8, 8, 8]
Y = [[8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68],
[9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74],
[7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73],
[6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89]]
def corr(a, b):
ma, mb = mean(a), mean(b)
cov = sum((p - ma) * (q - mb) for p, q in zip(a, b))
return cov / math.sqrt(sum((p - ma) ** 2 for p in a) * sum((q - mb) ** 2 for q in b))
for i, y in enumerate(Y, 1):
x = x1 if i < 4 else x4
k = corr(x, y) * math.sqrt(variance(y) / variance(x))
b = mean(y) - k * mean(x)
print(f"组{i}: mean_x={mean(x):.4f} var_x={variance(x):.2f} "
f"mean_y={mean(y):.4f} var_y={variance(y):.4f} r={corr(x, y):.4f} "
f"y={b:.4f}+{k:.4f}x")
# 例 2:均值 vs 中位数,以及离群值的破坏力
d1 = [2, 3, 3, 4, 5, 5, 6, 7, 100]
d2 = [2, 3, 3, 4, 5, 5, 6, 7]
print(f"含离群 mean={mean(d1):.4f} median={median(d1):.4f}")
print(f"去离群 mean={mean(d2):.4f} median={median(d2):.4f}")
s = [2, 4, 4, 4, 5, 5, 7, 9]
print(f"总体 sigma={pstdev(s):.4f} 样本 s={stdev(s):.4f} 比值 {stdev(s) / pstdev(s):.4f}")
def q(a, t):
a = sorted(a)
pos = t * (len(a) - 1)
lo = int(pos)
hi = min(lo + 1, len(a) - 1)
return a[lo] + (a[hi] - a[lo]) * (pos - lo)
o = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 100]
q1, q3 = q(o, 0.25), q(o, 0.75)
print(f"Q1={q1:.2f} Q3={q3:.2f} IQR={q3 - q1:.2f} 上界={q3 + 1.5 * (q3 - q1):.2f} "
f"离群={[v for v in o if v > q3 + 1.5 * (q3 - q1)]}")
# 例 3:标准化与归一化
z = [10, 20, 30]
m, sd = mean(z), pstdev(z)
print(f"z-score {[round((v - m) / sd, 4) for v in z]}")
print(f"min-max {[round((v - min(z)) / (max(z) - min(z)), 4) for v in z]}")
# 例 4:辛普森悖论 —— 分组内 A 全胜,合并后 B 胜
print(f"A: 轻症 {190 / 200:.2%} 重症 {400 / 800:.2%} 合计 {(190 + 400) / 1000:.2%}")
print(f"B: 轻症 {720 / 800:.2%} 重症 {80 / 200:.2%} 合计 {(720 + 80) / 1000:.2%}")组1: mean_x=9.0000 var_x=11.00 mean_y=7.5009 var_y=4.1273 r=0.8164 y=3.0001+0.5001x
组2: mean_x=9.0000 var_x=11.00 mean_y=7.5009 var_y=4.1276 r=0.8162 y=3.0009+0.5000x
组3: mean_x=9.0000 var_x=11.00 mean_y=7.5000 var_y=4.1226 r=0.8163 y=3.0025+0.4997x
组4: mean_x=9.0000 var_x=11.00 mean_y=7.5009 var_y=4.1232 r=0.8165 y=3.0017+0.4999x
含离群 mean=15.0000 median=5.0000
去离群 mean=4.3750 median=4.5000
总体 sigma=2.0000 样本 s=2.1381 比值 1.0690
Q1=7.50 Q3=12.50 IQR=5.00 上界=20.00 离群=[100]
z-score [-1.2247, 0.0, 1.2247]
min-max [0.0, 0.5, 1.0]
A: 轻症 95.00% 重症 50.00% 合计 59.00%
B: 轻症 90.00% 重症 40.00% 合计 80.00%例 1 是本章的核心。 四组数据的八个统计量几乎完全相同:均值
只看统计量,四组数据"一模一样";画出来才发现是四回事。这就是"先画图再看数"的理由。
例 2 说明均值的脆弱与中位数的稳健。 在一组本来很整齐的数据里塞进一个
同一组里,总体标准差
例 3 是尺度变换的对照。 同一组
例 4 是辛普森悖论。 治疗 A:轻症治愈
要点
要点与常见误区
- 均值和中位数不是可以互换的。数据有偏或含离群时,中位数更能代表"典型值";均值则受到每个点的影响,一个极端值就能改写结论。
- 样本方差除以
,总体方差除以 。小样本时两者差得可观,混用会让标准差系统性偏小。 - 四分位数有多种口径。同一组数据不同软件可能给出不同的
与 ,比较前先对齐口径。 - 标准化与归一化不是一回事。z 分数无固定边界但抗离群较好;min-max 边界固定但被单个极端值压扁。
- 统计量相同不代表数据相同。Anscombe 四组就是反例,先画图是成本最低的纠错手段。
- 相关不等于因果,而系数
只测线性。 接近 0 只说明没有线性关系,抛物线、周期关系都可能被漏掉。 - 辛普森悖论的方向是"反的":分组与合并的结论可以完全相反。所以报告结论时必须说明是按什么分组、是否做了分层。
- 图形选择先看变量类型。长度比面积可靠,所以条形图优于饼图;项数一多,饼图基本不能用。
- 清洗不是"把不好看的数删掉"。删之前先问来源:是录入错误、设备故障,还是真实现象?删掉真实的极端值等于伪造数据。
小结
- 数据科学 = 统计 + 计算 + 领域知识;生命周期中最耗时间的是清洗,最容易跳过的是画图。
- 描述统计两个坐标轴:中心(均值抗性差、中位数稳健)与离散(标准差、四分位距)。
- 尺度变换两选一:z 分数看"离均值几个标准差",min-max 看"在区间里的位置"。
- 图形是编码,把数据映射到视觉通道;长度比面积可靠。
- 相关与因果必须分开,并用分层检验来防辛普森悖论。
- 验算锚点:Anscombe 四组的均值
、方差 、 约 、回归约 ;离群把均值从 拉到 ;样本标准差与总体标准差之比 ;离群上界 ;z 分数 、min-max ;辛普森悖论 分组 A 全胜、合并 B 胜( vs )。 - 主线呼应:数据科学要落到机器上就变成矩阵与迭代,接上一章人工智能基础;推断的随机性基础来自概率论;空间数据的清洗与可视化另有专门工具,见地理信息系统;视觉通道的选择与设计同源。图表"看起来可信"也会影响判断,这一层与认知心理学的知觉规律相通。
下一篇:信息论 —— 数据能压缩到什么程度、信道能传多快,这两个问题有确定的上限。
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。