散点图每个点是一个观测,看两个量有没有一起动。 相关系数 0.573 属于中等偏上——有关系,但谈不上「一个高另一个必然高」。 面积图的纵轴必须从 0 起。截断之后面积比例全错,比柱形图截断更离谱。
前面几张图都是「一维」的:比较多少、看分布、看占比。这一篇开始看「两维」。 语文和数学的相关是 0.573,这个数得会说清它意味着什么。
一、散点:两个量的关系
十个点,每个点是一个学生:横轴语文、纵轴数学。 相关系数 0.573。相关的强弱看数:0.8 以上强,0.5 到 0.8 中等,0.3 以下算没关系。 0.573 落在中等偏上——有关系,但谈不上「一个高另一个必然高」。
这话很重要:0.573 意味着还有一半以上的变化,是语文解释不了的。
二、相关不等于因果
语文和数学正相关,可能因为「学习时间」同时推高了这两科。 也可能因为「阅读能力」帮了语文,也帮了数学的应用题。 相关只说「一起动」,不说「谁导致谁」。这句话能挡掉很多错误结论。
要论证因果,得有对照实验或更严格的方法,光靠一张散点图不够。
三、点的大小和颜色也能带信息
ax.scatter(x, y, s=大小, c=颜色, cmap='viridis'),第三维能塞进图里。
这里用英语分数当第三维:分数高点大一点、颜色深一点。
第三维不要超过一个。大小、颜色、形状一起上,读者一个都记不住。
点数超过几千就该换密度图或热力图,散点会糊成一团黑。
四、面积图:看累积
ax.stackplot(x, y1, y2) 把两条线之间的面积填满,堆起来的总高度是两项之和。
六月主营 162000、其他 64800,堆到 226800。
面积图的纵轴必须从 0 起。截断之后面积比例全错,比柱形图截断更离谱。
因为面积是「长乘宽」,纵轴一截,宽和高的比例同时变形。
五、动手 Demo:散点图与面积图
先画语文对数学的散点图并算相关系数,再用点的大小带第三维。 最后画一张两项堆叠的面积图。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
YW = [88, 92, 75, 85, 90, 68, 95, 72, 83, 79]
SX = [92, 95, 68, 88, 73, 82, 91, 65, 86, 90]
YY = [85, 90, 80, 79, 95, 71, 88, 60, 84, 87]
R = np.corrcoef(YW, SX)[0, 1]
print("相关系数 %.3f" % R)
fig, ax = plt.subplots(figsize=(5, 4))
ax.scatter(YW, SX, s=[v / 2 for v in YY], c=YY, cmap="viridis")
ax.set_xlabel("语文")
ax.set_ylabel("数学")
ax.set_title("语文 vs 数学(大小深浅=英语)")
fig.tight_layout()
fig.savefig("scatter.png")
M = [128000, 116000, 143000, 151000, 138000, 162000]
fig, ax = plt.subplots(figsize=(6, 4))
ax.stackplot(range(6), [M, [m * 0.4 for m in M]], labels=["主营", "其他"])
ax.legend(loc="upper left")
ax.set_ylim(0, 240000)
fig.tight_layout()
fig.savefig("stack.png")
print("六月堆到 %d" % (M[-1] + M[-1] * 0.4))
实跑输出:
--------------------------------------------------------------------
散点图与面积图
--------------------------------------------------------------------
① 散点:两个量的关系
--------------------------------------------------------------------
十个点,每个点是一个学生。相关系数 0.573。
相关的强弱看数:0.8 以上强,0.5 到 0.8 中等,0.3 以下基本算没关系。
这次 0.573,落在中等偏上——有关系,但谈不上「一个高另一个必然高」。
! 相关不等于因果。两个都高,可能是第三件事(比如学习时间)同时推高了它们。
② 点大小和颜色也能带信息
--------------------------------------------------------------------
s 管点的大小,c 管颜色,cmap 管配色。这里用英语分数当第三维。
第三维不要超过一个。点的大小加颜色加形状一起上,读者一个都记不住。
! 散点图的点数超过几千就该换密度图或热力图。点会糊成一团。
③ 面积图:看累积
--------------------------------------------------------------------
stackplot 把两条线之间的面积填满,堆起来的总高度是两项之和。
六月主营 162000、其他 64800,堆到 226800。
! 面积图的纵轴必须从 0 起。截断之后面积比例全错,比柱形图截断更离谱。
④ 三种图的分工
--------------------------------------------------------------------
| 图 | 回答什么问题 |
|---|---|
| 散点图 | 这两个量有关系吗,关系强不强 |
| 面积图 | 总量怎么累积起来的,各部分占多少 |
| 折线图 | 单个量怎么随时间变 |
散点看「关系」,面积看「累积」,折线看「走势」。三个问题不一样。
np.corrcoef 返回的是矩阵,[0, 1] 才是「第一维和第二维」的那一个数。
取错了会拿到 1.0,因为对角线上是自己和自己的相关,必然是 1。
30 秒实验
- 把 corrcoef 的 [0, 1] 改成 [0, 0],看拿到什么数。
- 把 scatter 的 s 参数去掉,看点大小变成什么样。
- 想一想:相关系数 0.573 意味着「语文好数学就好」吗?
常见误区
- 把相关说成因果:两个一起动,不等于一个引起另一个。
- 相关系数取错下标:拿到对角线上的 1.0,还以为完全相关。
- 散点图点数太多:几千个点糊成一团,什么也看不出来。
- 面积图截断纵轴:面积比例全错,比柱形图截断更严重。
自测三问(点开对答案)
1. 相关系数 0.573 怎么解读? —— 中等偏上的正相关:语文高的数学倾向于也高,但还远不到「一个高另一个必然高」。 2. 为什么散点图只能说明相关,说明不了因果? —— 它只显示两个量一起动,可能是第三个因素同时影响了它们,也可能是反过来。 3. 面积图的纵轴为什么必须从 0 起? —— 面积是长乘宽,纵轴一截断,高度和宽度的比例同时改变,面积大小就完全不能比了。两维看完了。下一篇上点重的:热力图把第三维交给颜色,箱形图一次给五个数。
- ☐ (本篇完,下一篇 5.10 热力图与箱形图)