数据分析师的“水晶球”:时间序列分析
<p>很多刚入行的小伙伴问我:“<em>我想预测下个月公司的销售额,或者预测一下明天的股价,该学什么?</em>”</p><p>我的回答通常只有六个字:<strong>时间序列分析</strong>。</p>
<p>如果在数据分析的世界里有一种魔法能让你“预知未来”,那一定就是它。</p>
<h1 id="1-什么是时间序列">1. 什么是时间序列?</h1>
<p>别被名词吓到了。简单来说,<strong>时间序列(Time Series)就是按时间顺序排列的一组数据</strong>。</p>
<p>比如:</p>
<ul>
<li>你手机里每天的步数记录;</li>
<li>某只股票每天的收盘价;</li>
<li>或者是你家楼下便利店每个月的营业额。</li>
</ul>
<p>这些数据都有一个共同点:<strong>有一个时间轴,且数据随着时间变化。</strong></p>
<p>我们做<strong>时间序列分析</strong>的<strong>核心目的</strong>,就是要从过去的<strong>“历史数据”</strong>中找出规律,然后把这个规律延长到<strong>“未来”</strong>,这就是<strong>预测</strong>。</p>
<h1 id="2-像剥洋葱一样拆解数据时间序列的四大成分">2. 像剥洋葱一样拆解数据:时间序列的四大成分</h1>
<p>初学者最容易犯的错误是直接把数据丢进模型里跑。</p>
<p>作为一名老手,我要告诉你:<strong>看到数据,先拆解。</strong></p>
<p>通常,任何一个随时间变化的数据(比如一家奶茶店的日销量),都可以被拆分为<strong>四个部分</strong>。</p>
<h2 id="21-长期趋势--大势所趋">2.1. 长期趋势--“大势所趋”</h2>
<p>这是数据在长时间内的主要运动方向。</p>
<ul>
<li><strong>例子</strong>:这家奶茶店开了三年,随着品牌知名度提升,整体销量每年都在涨。这就是<strong>趋势</strong>。</li>
<li><strong>地位</strong>:它是总变动的老大,决定了长期的方向。</li>
</ul>
<h2 id="22-季节变动--春夏秋冬的轮回">2.2. 季节变动--“春夏秋冬的轮回”</h2>
<p>数据受季节、节假日等固定周期影响而出现的波动。</p>
<ul>
<li><strong>例子</strong>:夏天天气热,冰饮卖得疯快;冬天冷,销量自然下滑;每到周末销量就比周一高。这种随着时间固定重复的波动,就是<strong>季节性</strong>。</li>
<li><strong>地位</strong>:它是总变动的老二,非常规律,预测起来最准。</li>
</ul>
<h2 id="23-循环变动--难以捉摸的周期">2.3. 循环变动--“难以捉摸的周期”</h2>
<p>这是一些周期较长、不固定的波动,通常和宏观经济有关。</p>
<ul>
<li><strong>例子</strong>:由于经济危机,大家钱包紧了,奶茶喝得少了。等经济复苏,又喝多了。</li>
<li><strong>注意</strong>:这部分原因复杂,周期不固定,我们在基础预测中通常<strong>不做重点考虑</strong>。</li>
</ul>
<h2 id="24-不规则变动--老天爷的心情">2.4. 不规则变动--“老天爷的心情”</h2>
<p>这是随机的、不可控的波动。</p>
<ul>
<li><strong>例子</strong>:某天突然下暴雨,没人出门,销量暴跌;或者某天网红来打卡,销量暴涨。</li>
<li><strong>注意</strong>:这是“噪音”,在预测中我们很难捕捉它,通常假设它为0或忽略。</li>
</ul>
<blockquote>
<p><strong>(重点):</strong><br>
在实际的时间序列预测中,我们主要抓 <strong>“长期趋势” 和 “季节变动”</strong>。</p>
<p>抓住了这两条大鱼,预测的准确度通常能达到80%以上。</p>
<p>至于循环变动和不规则变动,因为占比小且太复杂,我们往往选择战略性忽略。</p>
</blockquote>
<h1 id="3-手把手教你用python拆解时间序列">3. 手把手教你:用Python拆解时间序列</h1>
<p>光说不练假把式。下面我们用<code>Python</code>代码模拟一组奶茶店的销售数据,并演示如何把这四个成分“拆”出来。</p>
<p>首先,构造“虚假”的奶茶店数据。</p>
<pre><code class="language-python"># === 第一步:构造数据 ===
# 假设我们有过去3年(36个月)的月度销售数据
dates = pd.date_range(start='2021-01-01', periods=36, freq='ME')
# 1. 制造【长期趋势】:每个月销量基础增加 10 杯
trend = np.linspace(100, 460, 36)
# 2. 制造【季节变动】:模拟每年夏天高、冬天低 (用正弦波模拟)
# 这里的逻辑是制造一个周期性的波浪
seasonality = 50 * np.sin(np.linspace(0, 3 * 2 * np.pi, 36))
# 3. 制造【不规则变动/噪音】:随机波动
noise = np.random.normal(0, 20, 36)
# 4. 合成总销量
total_sales = trend + seasonality + noise
# 创建 DataFrame
df = pd.DataFrame({'Date': dates, 'Sales': total_sales})
df.set_index('Date', inplace=True)
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202512/83005-20251228173024134-1151312580.png" alt="" loading="lazy"></p>
<p>然后,使用 <code>statsmodels</code> 库进行分解,它能帮我们一键拆解数据。</p>
<pre><code class="language-python">from statsmodels.tsa.seasonal import seasonal_decompose
# === 第二步:数据分解 ===
# model='additive' 表示加法模型(销量 = 趋势 + 季节 + 噪音)
# 如果波动幅度随着趋势变大而变大,通常用乘法模型 (multiplicative)
decomposition = seasonal_decompose(df['Sales'], model='additive')
# === 第三步:绘图展示 ===
fig = decomposition.plot()
fig.set_size_inches(12, 10) # 设置画布大小
plt.show()
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202512/83005-20251228173024162-1245756239.png" alt="" loading="lazy"></p>
<p>从上面四个子图可以看出:</p>
<ol>
<li><strong>Observed (原始数据)</strong>:你看到的真实销量曲线,上蹿下跳。</li>
<li><strong>Trend (趋势)</strong>:一条稳步向上的直线。这告诉老板:<em>放心,虽然每个月有波动,但咱们店整体是越做越好的!</em></li>
<li><strong>Seasonal (季节性)</strong>:非常有规律的波浪线。这告诉店长:<em>每年6-8月要多备货,12-1月可以安排员工轮休。</em></li>
<li><strong>Resid (残差/不规则项)</strong>:围绕0上下跳动的杂乱点。这是我们无法预测的随机事件。</li>
</ol>
<h1 id="4-分析师的内功不仅仅是代码">4. 分析师的内功:不仅仅是代码</h1>
<p>学会了上面的代码,你已经入门了。但作为过来人,我想告诉你,工具和算法虽然层出不穷,但<strong>分析思路</strong>才是万变不离其宗的。</p>
<p>首先,关注<strong>数据的平稳性</strong>,这是时间序列分析的门槛。</p>
<p>简单说,大部分复杂的统计模型(如ARIMA)都假设数据的性质(均值、方差)不随时间变化。</p>
<p>然而现实数据(如股价、销量)往往是不平稳的(有上涨趋势),因此如果你发现数据一直在涨,可以试着做<strong>差分</strong>(用今天的数减去昨天的数)。</p>
<p><strong>差分</strong>后的数据往往就平稳了,更容易放入模型去训练。</p>
<p>其次,结合<strong>业务场景</strong>,不要死记硬背模型,还要看场景。</p>
<p>比如:</p>
<ol>
<li><strong>场景A:电商大促预测(双11)</strong>
<ul>
<li><strong>特点</strong>:有极强的季节性(每年11月暴涨)。</li>
<li><strong>策略</strong>:重点分析<strong>季节变动</strong>。如果只看趋势,你会被双11的数据吓死,或者在双11备货不足。</li>
<li><strong>热点关联</strong>:就像分析“淄博烧烤”或“哈尔滨旅游”,必须考虑节假日这个强季节因子。</li>
</ul>
</li>
<li><strong>场景B:股票价格预测</strong>
<ul>
<li><strong>特点</strong>:不规则变动(噪音)极大,甚至噪音掩盖了趋势。</li>
<li><strong>策略</strong>:这种时候,简单的分解模型往往失效。需要引入更多外部变量(新闻、政策),或者使用更高级的深度学习模型。</li>
</ul>
</li>
<li><strong>场景C:服务器流量监控</strong>
<ul>
<li><strong>特点</strong>:白天高、深夜低,周末低、工作日高。</li>
<li><strong>策略</strong>:这是最标准的周期性数据,非常适合用来做异常检测(比如某天深夜流量突然暴涨,肯定是有黑客攻击或系统Bug,因为这违背了季节性规律)。</li>
</ul>
</li>
</ol>
<h1 id="5-总结与建议">5. 总结与建议</h1>
<p><strong>时间序列分析</strong>并没有想象中那么神秘。它的本质就是:<strong>承认历史会重演,但也接纳未来的不确定性。</strong></p>
<p>对于刚入行的朋友,我的建议是:</p>
<ol>
<li><strong>理解四大成分</strong>(趋势、季节、循环、噪音)是基础中的基础。</li>
<li><strong>抓住主要矛盾</strong>:在做预测时,优先搞定趋势和季节性。</li>
<li><strong>多动手尝试</strong>:比如把上面的<code>Python</code>代码跑一遍,尝试修改一下数据,看看结果有什么变化。</li>
</ol>
<p>未来的分析方法虽然会越来越多,AI也会越来越强,但这种 <strong>“透过现象(原始数据)看本质(趋势与规律)”</strong> 的分析思维,将是我们职业生涯中永恒不变的宝贵财富。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19412367
頁:
[1]