Pearson r 等于 0.8543,p 约 3.24e-105,Spearman 0.8869,两个都指向强同向。 p 值极小只说明「这么强的相关不太可能是巧合」,不说明「相关本身有多强」。 按广告费分四档,日均销售额从 24.40 涨到 53.78 万——但相关不等于因果。
上一篇算完了销售额自己的形状。这一篇换问题:广告费和销售额之间到底是什么关系。 工具是第 7 章的相关分析,外加一张分组表——两种说法,给两种人看。
一、配对数据才能算相关
365 天,每天一组:广告费 8.15 到 24.98 万,销售额 17.29 到 80.88 万。 一对一配对是前提。行数对不上、日期错位一天,算出来的 r 就是垃圾。 现实里最常见的错位是「广告费按投放日记账、销售额按下单日记账」,两个口径差一天,r 就往下掉。
所以在算之前先对一遍日期:两列是不是同一天、有没有缺日、有没有重复日。这一步比算 r 本身重要。
二、两个相关系数一起看
Pearson 是 0.8543,Spearman 是 0.8869。 Pearson 看两点贴直线有多紧,Spearman 只看名次顺序对不对得上。 两个都过 0.85,说明关系既贴直线、名次也一致,不是被几个极端值撑起来的。
如果两个差得远(比如 Pearson 0.9、Spearman 0.4),就得怀疑有极端值或者关系不是直线。 Spearman 稍高一点,说明这次的关系单调性比线性还稳一点——广告费高的日子,销售额基本都在高位。
三、p 值到底在说什么
p 约 3.24e-105,得写到小数点后一百多位才有数。 它回答的是:如果两者其实毫无关系,看到这么强的相关有多难。难到几乎不可能, 所以「无关」这个假设被否掉。 但它不回答「相关有多强」。强度看 r,不看 p。两个数各管一件事,别拿一个当另一个用。
样本一大,p 必然很小。 365 行数据里,r 只有 0.1 也可能给出极小的 p。所以只报 p 不报 r,等于没说。
四、相关能说到哪一步为止
能说的是:广告多的时候,销售额一般也高。 不能说的是:多投广告就能多卖。这是因果,相关给不出。 现实里更常见的是反过来——卖得好的月份才有钱加投广告。方向正好相反,r 一样高。
这次数据是造的,造的时候写进了「广告按 2.2 倍拉动销售」。所以这个 r 是设计出来的,不是发现的。 真想定因果,得做对照实验:同期留一批不投的店当参照,两组比。观察数据永远只能给相关。
五、换个说法:分组看
| 广告档 | 日均销售额(万) | 天数 |
|---|---|---|
| 低 | 24.40 | 76 |
| 较低 | 33.67 | 83 |
| 较高 | 42.62 | 86 |
| 高 | 53.78 | 120 |
最高档日均 53.78 万,最低档 24.40 万,差 29.38 万,接近 2.2 倍。 分组比一个 r 更好懂:它给的是「多花一万能多卖多少」的量级,老板一听就明白。 但分组也有陷阱:四档的天数不一样,高投入那档有 120 天,最低那档只有 76 天。 样本不均,均值的可信度也不均。
相关系数适合汇报给懂统计的人,分组表适合汇报给老板。两个都准备,别只挑一个。
六、动手 Demo:销售收入与广告费相关性
先算 Pearson 和 Spearman 两个系数,再把广告费切成四档看均值。 两个说法讲的是同一件事,一个给数据看,一个给人看。
import pandas as pd
from scipy import stats
df = pd.read_excel("销售数据_clean.xlsx")
x = df["广告费"].values
y = df["销售额"].values
r, p = stats.pearsonr(x, y)
rs, _ = stats.spearmanr(x, y)
print("Pearson %.4f,p = %.2e" % (r, p))
print("Spearman %.4f" % rs)
df["广告档"] = pd.cut(df["广告费"], bins=[0, 12, 16, 20, 30],
labels=["低", "较低", "较高", "高"])
gg = df.groupby("广告档", observed=True)["销售额"].agg(["mean", "count"])
print(gg.to_string())
print("最高比最低多 %.2f 万,%.1f 倍"
% (gg["mean"].iloc[-1] - gg["mean"].iloc[0],
gg["mean"].iloc[-1] / gg["mean"].iloc[0]))
实跑输出:
--------------------------------------------------------------------
销售收入与广告费相关性
--------------------------------------------------------------------
① 两列数先摆出来
--------------------------------------------------------------------
365 天,每天一组:广告费 8.15 到 24.98 万,销售额 17.29 到 80.88 万。
一对一的配对数据,才能算相关。数量对不上、时间错位,算出来的 r 没意义。
② 算相关系数
--------------------------------------------------------------------
Pearson 相关系数 r = 0.8543,p 约等于 3.24e-105。
Spearman 秩相关 0.8869。
两个数都在 0.85 以上,同向关系很稳。
Pearson 0.8543、Spearman 0.8869,差这么点很正常。
前者看两点贴直线多紧,后者只看名次顺序对不对得上。两个都高才敢下结论。
③ 相关系数能说到哪一步
--------------------------------------------------------------------
r = 0.85 能说的是:广告多的时候销售额一般也高。
不能说的是:多投广告就能多卖。这是因果,相关给不出。
真实场景里更常见的是反过来:卖得好的月份才有钱加投广告。方向正好相反。
这次的数据是造的,造的时候就写进了「广告拉动销售」这条规则。
所以 r 高是设计出来的,不是发现的。这句话必须说清楚。
! 真实数据里想定因果,得做对照实验:同期留一批不投的店做参照。
④ 换个角度:分组看
--------------------------------------------------------------------
| 广告档 | 日均销售额 | 天数 |
|---|---:|---:|
| 低 | 24.40 | 76 |
| 较低 | 33.67 | 83 |
| 较高 | 42.62 | 86 |
| 高 | 53.78 | 120 |
最高档比最低档日均多卖 29.38 万,接近 2.2 倍。
分组比一个相关系数更好懂:它给的是「多花一万能多卖多少」的量级。
! 相关系数适合汇报给懂统计的人,分组表适合汇报给老板。两个都准备。
pearsonr 返回两个值:相关系数和 p 值。只要 r 不要 p 也行,但两个都打出来更完整。
pd.cut 是按区间切,bins 给边界、labels 给名字。边界是左开右闭,20 落在「高」那一档。
observed=True 不能省。不加它,没有样本的空档也会留一行,均值是 NaN。
30 秒实验
- 把
bins改成三等分,看四档变三档后差距是不是更大。 - 把 Spearman 换成 Kendall,看第三个系数落在哪。
- 想一想:如果销售额那列乘以 100(单位从万元改成百元),r 会变吗?
常见误区
- 拿 p 值当相关强度:p 小只说明不太可能是巧合,强度要看 r。
- r 高就说因果:可能是反向因果,也可能是第三个变量同时推着两边。
- 不看配对就硬算:行数对齐但日期错位,r 照样能算出一个漂亮的数。
- 分组不看样本量:某档只有三天,均值没意义,得连天数一起报。
自测三问(点开对答案)
1. Pearson 和 Spearman 差在哪? —— Pearson 看数值贴直线多紧,Spearman 只看名次顺序。两个都高才敢说关系稳。 2. p 约 3.24e-105 能说明什么? —— 说明「两者无关」这个假设几乎不可能成立。它不说明相关有多强,强度看 r。 3. 为什么这次的 r 是设计出来的? —— 造数据时写死了广告按 2.2 倍拉动销售,相关是人为造出来的结果,不是发现。关系找到了,也划清了能说到哪。下一篇再往前一步:用这个关系去预测。
- ☐ (本篇完,下一篇 10.6 销售收入预测与评分)