多元图形就是一张图上同时出现三个以上的变量。 位置、大小、颜色、分面,是四种能把变量塞进去的通道。 这四种通道的精度差得很远:位置最准,面积和颜色最糊。选错通道,图就白画。 散点图是最小的多元图形——两个变量、一堆观察值。它是用来提假设的,不是用来下结论的。
上一篇讲比较的规矩,这一篇讲容量:一张纸上到底能装几个变量,各用什么通道装。 书里到这里,掌门人还是不满意。 原因不在图画得不好,在后面 4.6 会讲——图只说出了「是什么」,没说「该做什么」。
一、什么叫多元图形
一个变量画成一根柱子,两个变量画成散点,三个以上就叫多元图形。 「多元」不是画得花,是同一张图上能同时回答好几个问题。 比如气泡图:谁的转化率高、谁的客单价高、谁的量大。 多元图形的价值在于省掉了「翻页」这个动作。三张单变量图并排放,读者要自己在脑子里合成; 一张多元图,合成这一步画图的人替你做了。
二、编码通道的精度排序
| 通道 | 能编码的量 | 精度 | 什么时候用 |
|---|---|---|---|
| 位置(x、y) | 两个连续变量 | 最高 | 首选,能用就用 |
| 长度 | 一个数量 | 高 | 条形图,比大小 |
| 角度/面积 | 一个占比或数量 | 低 | 只适合粗略分级 |
| 颜色明度 | 一个有序列 | 低 | 配合位置用 |
| 分面 | 一个分类变量 | 最高 | 装不下时拆图 |
这张表的用法很直接:要精确比较,就用位置和长度;只想分个档,才用面积和颜色。 饼图之所以被批评,就是因为它在用角度(精度低)去承担精确比较的任务。
三、散点图:两个变量的最小多元图形
八个城市,每个城市有「页面停留时长」和「转化率」两个数,画成散点,相关系数算出来是 0.997。 0.997 这个数很扎眼。它说明这八个点在一条直线上排得几乎整整齐齐。 但扎眼的数最容易骗人。r 高只说明「一起动」,不说明「谁让谁动」。
更麻烦的是:r 高也可能只是因为这八个城市是挑出来的。换一批城市,这个 0.997 未必还在。
四、把第三个变量塞进去的三种办法
大小:气泡图。好处是不占额外位置,坏处是面积估不准,最多分三四档。 颜色:一个分类变量分成几组,或者一个有序列做成深浅。超过六种颜色就开始分不清,色弱的人更难。 分面:按分类变量拆成几张小图,每张图里只放一组。精度最高,代价是占地方。
三种办法的取舍只有一句话:要精度就用分面,要省地方就用大小和颜色,别指望省了地方还能读准数。
五、掌门人为什么还是不满意
到这一步,图已经能同时看三个变量了,比开头那三份强得多。掌门人看了还是那句话:所以呢? 原因在于,多元图形回答的是「数据长什么样」,掌门人要的是「我该动哪个旋钮」。 图形能做的最后一件事,是把「哪个旋钮值得试」提出来——这就是散点图找原因、而不是下结论的用法。
再往下就得靠实验了:把假设变成一个能对比的改动,跑一段时间,看数变不变。这是第 2 章那套东西。
六、动手 Demo:散点图:用它找原因,不是找结论
八个城市的停留时长与转化率,算相关系数,看这堆点排得多整齐。 算完再拿一组毫不相干的数做对照:冰棍销量与溺水人数,r 一样能高到 0.99 以上。
import math
T = [42, 55, 61, 48, 70, 66, 38, 74] # 停留时长(秒)
R = [2.9, 3.6, 4.1, 3.2, 4.8, 4.4, 2.6, 5.1] # 转化率(%)
def corr(xs, ys):
n = len(xs)
mx = sum(xs) / float(n)
my = sum(ys) / float(n)
cov = sum((xs[i] - mx) * (ys[i] - my) for i in range(n))
sx = math.sqrt(sum((x - mx) ** 2 for x in xs))
sy = math.sqrt(sum((y - my) ** 2 for y in ys))
return cov / (sx * sy)
print("停留时长 vs 转化率:r = %.3f" % corr(T, R))
print("r 落在 -1 到 1 之间,越接近 1 越像一条向上的直线")
ICE = [12, 18, 25, 33, 41, 48] # 冰棍销量(万支)
DROWN = [3, 5, 7, 10, 12, 14] # 溺水人数(十人)
print()
print("冰棍销量 vs 溺水人数:r = %.4f" % corr(ICE, DROWN))
print("两组数毫不相干,r 照样贴着 1 走")
print("真正让两者同时上涨的是第三个变量:气温")
实跑输出:
--------------------------------------------------------------------
散点图:用它找原因,不是找结论
--------------------------------------------------------------------
① 两组数摆成散点
--------------------------------------------------------------------
新军队做了个改版:把商品详情页的商品图放大。
八个城市改版后,页面停留时长(秒)和转化率(%)如下。
② 相关系数
--------------------------------------------------------------------
皮尔逊相关系数 r = 0.997
r 接近 1 说明两个数一起往一个方向动;这里是 1.00,算是强正相关。
散点图存成 PNG:21531 字节
③ 相关不等于因果
--------------------------------------------------------------------
r = 1.00 只说明「停留久的城市转化也高」,不说明「停得久所以买」。
也可能是第三个原因:这两个城市本来就更认这个品牌,所以既愿意多逛也愿意买。
散点图的作用是提出假设,验证假设还得靠第 2 章那套实验。
④ 散点图最容易被误读的三处
--------------------------------------------------------------------
| 误读 | 真相 |
|---|---|
| 点连成一条线,就是因果关系 | 只是同时变化,方向可能是反的,也可能有第三变量 |
| 点很散,就是没关系 | 可能是非线性关系(比如倒 U 形),散点图能看出来,r 看不出来 |
| 离群点应该删掉 | 离群点往往是故事的主角,删之前先问它为什么在那儿 |
r = 0.997 说明这八个城市「停留久的转化也高」。 它没说「停得久所以买」——也可能是第三个原因,比如这些城市本来就更认这个品牌, 所以既愿意多逛也愿意买。 冰棍那一组更扎眼:两组数彼此毫无关系,r 却贴着 1 走。 它存在的唯一目的,就是提醒你 r 高既不等于有关系,更不等于有因果。
30 秒实验
- 把 R 里最后一个数从 5.1 改成 3.0,r 会掉到多少?这说明 r 对离群点多敏感?
- 把八个城市按「南方/北方」分成两组分面画,两张图里的 r 会不会比 0.997 低?这叫什么现象?
- 想一想:如果只能给掌门人一张图,你会选气泡图还是四张分面图?理由是什么。
常见误区
- 拿 r 当因果证据:r 高只说明一起动。方向可能反,也可能有第三变量。
- 用颜色当序数:深浅色看着有序,实际很难读出「差多少」,只适合分档。
- 分面切得太碎:每格只剩两三个点,图就没法比较了。分面之前先看每格有多少观察值。
- 图越复杂越专业:三层嵌套的图读者根本不解,信息再多也传不出去。
自测三问(点开对答案)
1. 四种编码通道按精度排序是什么? —— 位置和分面最高,长度次之,角度、面积、颜色明度最低。 2. 气泡图用大小编码第三个变量,代价是什么? —— 人对面积不敏感,只能看出大致分级,读不出精确差异。 3. 散点图在分析流程里该放在哪一步? —— 提假设那一步。它告诉你「这两个数一起动」,接着要靠实验验证。图能装的变量到顶了,掌门人还是不满意。下一篇讲图形真正的作用:帮你想清楚问题。
- ☐ (本篇完,下一篇 4.6 让图形帮你思考)