3.1 趋势的表现形式:线性、指数、S 形


3.1 趋势的表现形式:线性、指数、S 形

本节摘要:趋势并非只有"上升的线"这一种形态。本节系统化地介绍四类趋势——线性、指数、S 形、分段——用代码合成各自的样本,并讨论如何根据业务直觉挑选最合适的形态。

学习目标速览

阅读完本节,你应当能够:

  1. 区分线性、指数、S 形、分段四种趋势形态。
  2. 用 numpy 合成各自的样本并画图对比。
  3. 根据业务场景初步判断"哪种趋势形态最合适"。

本节回到 1.2 节那个 SaaS 反例:早期指数、S 形饱和、后期选错形态会让预测误差 5 个数量级。读完后你能为业务数据选对趋势形态,而不是机械套线性外推。

一、为什么形态选择至关重要

回到 1.2 节的反例:某 SaaS 公司 2018–2020 年早期用户数 100 → 1000 → 8000 增长。用线性外推预测 2024 年用户数 = 2018 + 6 × 增长率 = 2 万;但实际已经接近 50 万——误差 25 倍。

错就错在"线性"假设。早期 SaaS 增长是指数(每个用户带来 N 个新用户的病毒系数),到一定规模后会饱和(S 形),再用指数外推就会离谱地高估。选对趋势形态,比挑一个花哨的模型更重要

二、四种典型形态

import numpy as np import matplotlib.pyplot as plt n = 100 t = np.arange(n) # 1) 线性:每期 +常数 linear = 50 + 0.8 * t # 2) 指数:每期 × 固定增长率 exp = 50 * np.exp(0.04 * t) # 3) S 形 / Logistic:早期慢、中期快、后期饱和 sigmoid = 1000 / (1 + np.exp(-0.1 * (t - 50))) # 4) 分段线性:在 t=50 处突然改变斜率 piecewise = 0.5 * t + (t >= 50) * (5 * (t - 50)) fig, axes = plt.subplots(2, 2, figsize=(10, 6)) for ax, y, title in zip(axes.ravel(), [linear, exp, sigmoid, piecewise], ["线性", "指数", "S 形", "分段线性"]): ax.plot(t, y) ax.set_title(title) plt.tight_layout()

从图上可以直观看到:

  • 线性:斜率恒定。适合"年增长 5%"这种稳定的业务指标。
  • 指数:增长率恒定。适合"复利"、"病毒式传播"、产品早期渗透。
  • S 形:早期慢、中期快、后期饱和。适合"产品从尝鲜到成熟"、"行业从新兴到饱和"。
  • 分段:在某个时间点切换斜率。适合"政策变更"、"产品重大发布"等造成结构性突变的场景。

三、用业务场景反推形态

业务场景 最可能形态 原因
城市 GDP(成熟城市) 线性或 S 形 总量已大,增长趋稳
新兴 APP 用户 指数或 S 形 早期有病毒系数
工业产能 分段(受投资周期影响) 重大投资带来阶跃
季节性疾病的就诊数趋势 S 形(疫情扩散形态) 指数到饱和
累计装机量 S 形 天然有上限

四、把形态写进模型

不同形态的数学表达,决定了下游用什么模型拟合:

形态 拟合工具 工程实现
线性 普通最小二乘 np.polyfit(t, y, 1) 或 statsmodels OLS
指数 对数线性回归 np.polyfit(t, np.log(y), 1) 再 exp
S 形 非线性最小二乘拟合 Logistic scipy.optimize.curve_fit
分段 线性回归 + 变点检测 Prophet changepoint_prior_scale、PELT 算法

💡 关键直觉:分段线性是最稳的工程默认。它不要求你选对"完美形态",只要求识别出变点。Prophet 默认就是分段线性 + 季节性 Fourier 项 + 误差项的组合,对业务数据非常友好。

五、一个反例:选错形态的代价

回到开头那个 SaaS 案例。如果用线性外推,2018 → 2024 年用户数预测为 2 万;用指数外推,预测为 12 亿(明显离谱);用 S 形外推,预测 50 万(接近实际)。三种数学形态,预测结果相差 5 个数量级。这就是为什么趋势形态不是"模型细节",而是"模型地基"。

本节要点回顾

  • 四类形态:线性、指数、S 形、分段。
  • 业务直觉映射:成熟业务 → 线性 / S 形;新兴业务 → 指数 / S 形;政策敏感 → 分段。
  • 工程实现:线性 / 对数线性 / 非线性最小二乘 / 变点检测。
  • 选错代价:可能造成 5 个数量级的预测误差。
  • 下一节线索:3.2 进入"识别"环节——三种工具(移动平均、LOESS、回归)各适合什么场景。

侦探笔记:5 种趋势形态的快速判别

实操中遇到的 90% 的趋势,都能归到这 5 种形态之一:

  1. 零趋势(平稳):均值围绕常数波动,斜率为 0。ACF 快速衰减。
  2. 线性趋势:均值随时间匀速变化。线性回归斜率显著非零。
  3. 指数趋势:均值随时间指数变化(年增长 30% 之类)。取对数后变线性。
  4. S 形趋势:先慢后快再慢,典型如产品采用曲线。Logistic 拟合。
  5. 分段趋势:在不同时间段斜率不同(产品上线 → 增长 → 平稳 → 衰减)。分段线性或断点回归。

判别流程

from statsmodels.tsa.stattools import adfuller import numpy as np y = series.values # 1. ADF 检验:p>0.05 → 有趋势 adf_p = adfuller(y)[1] # 2. 差分后再 ADF,p<0.05 → 一阶差分可平稳化 adf_d1 = adfuller(np.diff(y))[1] # 3. 差分次数 = d(ARIMA 的 d)

反例

很多教程把"趋势"默认设为线性。但现实中 S 形、分段、指数趋势更常见。识别错了形态,模型会系统性地高估或低估未来值。

侦探笔记:判别顺序

实操中遇到趋势,按这个顺序判别:

  1. 先判别是否平稳(ADF 检验):p > 0.05 → 有趋势,继续下一步;p ≤ 0.05 → 零趋势,跳到第 4 步
  2. 看斜率:画散点 + 线性回归。如果斜率显著非零,是线性趋势
  3. 看斜率变化:如果斜率本身在变,是多项式/S 形/分段趋势
  4. 看周期性叠加:零趋势 + 强周期 → 周期型时间序列(不是趋势问题)

反例

"长期上升"不一定是趋势。如果只是周期性波动的"上升段",不是趋势;只是事件驱动的"一段暴涨",也不是趋势。判别趋势一定要用 ADF + 回归 + 视觉综合判别,单一指标不可靠。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U