📈 第4章 数据图形化
📄 一句话概括

多元图形就是一张图上同时出现三个以上的变量。 位置、大小、颜色、分面,是四种能把变量塞进去的通道。 这四种通道的精度差得很远:位置最准,面积和颜色最糊。选错通道,图就白画。 散点图是最小的多元图形——两个变量、一堆观察值。它是用来提假设的,不是用来下结论的。

📝 本章和前面几章的关系

上一篇讲比较的规矩,这一篇讲容量:一张纸上到底能装几个变量,各用什么通道装。 书里到这里,掌门人还是不满意。 原因不在图画得不好,在后面 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 秒实验

  1. 把 R 里最后一个数从 5.1 改成 3.0,r 会掉到多少?这说明 r 对离群点多敏感?
  2. 把八个城市按「南方/北方」分成两组分面画,两张图里的 r 会不会比 0.997 低?这叫什么现象?
  3. 想一想:如果只能给掌门人一张图,你会选气泡图还是四张分面图?理由是什么。

常见误区

  1. 拿 r 当因果证据:r 高只说明一起动。方向可能反,也可能有第三变量。
  2. 用颜色当序数:深浅色看着有序,实际很难读出「差多少」,只适合分档。
  3. 分面切得太碎:每格只剩两三个点,图就没法比较了。分面之前先看每格有多少观察值。
  4. 图越复杂越专业:三层嵌套的图读者根本不解,信息再多也传不出去。
自测三问(点开对答案) 1. 四种编码通道按精度排序是什么? —— 位置和分面最高,长度次之,角度、面积、颜色明度最低。 2. 气泡图用大小编码第三个变量,代价是什么? —— 人对面积不敏感,只能看出大致分级,读不出精确差异。 3. 散点图在分析流程里该放在哪一步? —— 提假设那一步。它告诉你「这两个数一起动」,接着要靠实验验证。

图能装的变量到顶了,掌门人还是不满意。下一篇讲图形真正的作用:帮你想清楚问题。

相关笔记