Pearson 的 r 是 0.9603,Spearman 的秩相关是 0.9223,两者都在 0.9 以上。 r 的绝对值说明一起变有多紧,符号说明方向。0 只代表没有直线关系。 抽出 6 月重算 r 会升到 0.9955——但那个月是真实发生的,不能删。
上一篇比的是两组数,这一篇比的是两个变量在同一个月份上的配对关系。 数据是十二个月的广告投入和销售额,单位万元,两列一一对应。
一、相关系数是个什么东西
把每个月看成一个点:横轴广告投入,纵轴销售额,十二个点。 Pearson 的 r 衡量这十二个点「贴着一条直线有多紧」。 r = 0.9603,p 约等于 0.000001。紧得几乎没有悬念。
r 的绝对值说明紧不紧,符号说明方向。正数同向,负数反向。
二、r 的三个盲区
第一,它只看直线。一个完美的 U 形关系,r 可能接近 0。 第二,它怕异常值。一个跑偏的点就能把 r 拉下来一大截。 第三,它不告诉你因果,甚至不告诉你「谁先动」。
这三条决定了:算完 r 必须回头看散点图。数字对不对,图上一眼就知道。
三、换个相关系数再看看
Spearman 先给数据排名次,再算名次的相关系数。 这次是 0.9223,比 Pearson 略低,但结论一致。 它的好处是抗异常值:一个离谱的点最多排到第一或最后,不会把整条线拽歪。
代价是丢掉「差多少」的信息,只剩「谁前谁后」。两个都跑,一致才敢写。
四、一起变不等于谁引起谁
广告多的月份销售额高。这有两种解释: 一是广告带来了销售;二是旺季本来就要多投广告,两者都是结果。 这一次的数据分不出是哪一种。相关性永远分不出因果,这是它的天花板。
要分因果,得做对照实验:同期留一批不投广告的店,比它们的销售额变化。 还要提防第三个变量:比如「节假日」既拉高客流,也拉高广告预算。
五、那个不听话的月份
6 月广告投了 11 万,比 5 月的 10 万还多,销售额却从 125 万掉到 113 万。 把它抽掉重算,样本从 12 个变成 11 个,r 从 0.9603 升到 0.9955。 一个点拉动了 0.0352。这就是「一个总数概括不了一张表」。
但那个月是真实发生的,不能因为「不合群」就删掉。删了就是造假。
六、动手 Demo:相关性分析:一起变不等于谁引起谁
十二个月的广告投入对销售额,先算 Pearson,再算 Spearman。 最后抽掉 6 月重算一次,看一个反常点能拉动多少。
from scipy import stats
AD = [8, 7, 9, 9, 10, 11, 11, 11, 10, 12, 14, 16]
S25 = [108, 96, 118, 112, 125, 113, 142, 138, 129, 145, 168, 192]
r, p = stats.pearsonr(AD, S25)
rs, ps = stats.spearmanr(AD, S25)
print("Pearson r = %.4f,p = %.6f" % (r, p))
print("Spearman = %.4f,p = %.6f" % (rs, ps))
k = 5
r2, _ = stats.pearsonr(AD[:k] + AD[k + 1:], S25[:k] + S25[k + 1:])
print("抽掉 %d 月:r = %.4f,比原来高 %.4f" % (k + 1, r2, r2 - r))
print("6 月广告 %d 万,销售额 %d 万" % (AD[k], S25[k]))
print("5 月广告 %d 万,销售额 %d 万" % (AD[k - 1], S25[k - 1]))
实跑输出:
--------------------------------------------------------------------
相关性分析:一起变不等于谁引起谁
--------------------------------------------------------------------
① 相关系数怎么算
--------------------------------------------------------------------
广告投入和销售额,十二个月配对数据。
广告投入:[8, 7, 9, 9, 10, 11, 11, 11, 10, 12, 14, 16] 万元
销售额:[108, 96, 118, 112, 125, 113, 142, 138, 129, 145, 168, 192] 万元
Pearson 相关系数 r = 0.9603,p = 0.000001。
r 的绝对值说明一起变有多紧,符号说明方向。正数同向,负数反向。
! r 的范围是 -1 到 1。0 表示没有线性关系,但可能有曲线关系——r 只看直线。
② 换个相关系数再看看
--------------------------------------------------------------------
Spearman 秩相关 = 0.9223。
它先把数据换成名次再算,抗异常值能力强一些。
两个数都在 0.9 以上,说明这份数据里的同向关系很硬。
! Pearson 怕异常值,Spearman 怕丢失细节。两个都跑一遍,结论一致才敢写。
③ 一起变不等于谁引起谁
--------------------------------------------------------------------
广告多的月份销售额高,有两种可能:投广告带来了销售,或者旺季本来就要多投广告。
这一次的数据分不出是哪一种——相关性永远分不出因果。
要分因果,得做对照实验:同期找一批不投广告的店,比它们的销售额。
! 「相关不等于因果」不是一句口号。下次看到「X 越高 Y 越高」,先问有没有第三个变量。
④ 那个不听话的月份
--------------------------------------------------------------------
6 月 广告投了 11 万元,比 5 月的 10 万元还多,销售额却从 125 掉到 113。
把它抽掉重算,样本从 12 个变成 11 个,r 从 0.9603 升到 0.9955。
一个点拉动 0.0352,这就是「一个总数概括不了一张表」。
而且抽掉的那个月是真实发生的,不能因为「不合群」就删掉——删了就是造假。
! 所以流程是:先算 r,再画散点,最后解释那几个跑偏的点。三步都不能省。
stats.pearsonr 一次返回两个值:相关系数和 p 值。p 检验的是「总体相关系数为 0」这个假设。
p 小只说明「相关不为 0」,不说明「相关很强」。强不强看 r 本身。
抽掉 6 月用的是切片拼接,AD[:k] + AD[k+1:] 就是「除了第 k 个以外的全部」。
30 秒实验
- 把 6 月的广告改成 3 万,看 r 是升还是降,想清楚为什么。
- 把销售额改成「每月的平方」,再看 Pearson 和 Spearman 差多少。
- 想一想:如果 r 是 -0.9,该怎么说?和 0.9 的强度一样吗?
常见误区
- 把 r 当因果:广告多、销售高,也可能都是旺季的结果。
- 以为 r 等于 0 就是没关系:可能有很强的曲线关系,只是不是直线。
- 看到 r 高就不看散点:一个总数会把异常点全盖住。
- 把「不合群」的点删掉:那是真实数据,删了结论就假了。
自测三问(点开对答案)
1. r = 0.96 说明了什么、没说明什么? —— 说明十二个点很贴着一条上升的直线;没说明谁引起谁,也没说明有没有例外。 2. Spearman 和 Pearson 最大的区别? —— Spearman 先排名次再算,抗异常值强;Pearson 直接用原值,保留「差多少」的信息。 3. 为什么抽掉 6 月能让 r 变高,却不能这么干? —— 那个月是真实发生的。为了让结论好看而删数据,就是造假。最后一篇收尾:把时间作为一个维度,看趋势和季节。
- ☐ (本篇完,下一篇 7.6 时间序列分析:趋势与季节)