很多剛入行的小夥伴問我:“我想預測下個月公司的銷售額,或者預測一下明天的股價,該學什麼?”
我的回答通常只有六個字:時間序列分析。
如果在數據分析的世界裏有一種魔法能讓你“預知未來”,那一定就是它。
1. 什麼是時間序列?
別被名詞嚇到了。簡單來説,時間序列(Time Series)就是按時間順序排列的一組數據。
比如:
- 你手機裏每天的步數記錄;
- 某隻股票每天的收盤價;
- 或者是你家樓下便利店每個月的營業額。
這些數據都有一個共同點:有一個時間軸,且數據隨着時間變化。
我們做時間序列分析的核心目的,就是要從過去的“歷史數據”中找出規律,然後把這個規律延長到“未來”,這就是預測。
2. 像剝洋葱一樣拆解數據:時間序列的四大成分
初學者最容易犯的錯誤是直接把數據丟進模型裏跑。
作為一名老手,我要告訴你:看到數據,先拆解。
通常,任何一個隨時間變化的數據(比如一家奶茶店的日銷量),都可以被拆分為四個部分。
2.1. 長期趨勢--“大勢所趨”
這是數據在長時間內的主要運動方向。
- 例子:這家奶茶店開了三年,隨着品牌知名度提升,整體銷量每年都在漲。這就是趨勢。
- 地位:它是總變動的老大,決定了長期的方向。
2.2. 季節變動--“春夏秋冬的輪迴”
數據受季節、節假日等固定週期影響而出現的波動。
- 例子:夏天天氣熱,冰飲賣得瘋快;冬天冷,銷量自然下滑;每到週末銷量就比周一高。這種隨着時間固定重複的波動,就是季節性。
- 地位:它是總變動的老二,非常規律,預測起來最準。
2.3. 循環變動--“難以捉摸的週期”
這是一些週期較長、不固定的波動,通常和宏觀經濟有關。
- 例子:由於經濟危機,大家錢包緊了,奶茶喝得少了。等經濟復甦,又喝多了。
- 注意:這部分原因複雜,週期不固定,我們在基礎預測中通常不做重點考慮。
2.4. 不規則變動--“老天爺的心情”
這是隨機的、不可控的波動。
- 例子:某天突然下暴雨,沒人出門,銷量暴跌;或者某天網紅來打卡,銷量暴漲。
- 注意:這是“噪音”,在預測中我們很難捕捉它,通常假設它為0或忽略。
(重點):
在實際的時間序列預測中,我們主要抓 “長期趨勢” 和 “季節變動”。抓住了這兩條大魚,預測的準確度通常能達到80%以上。
至於循環變動和不規則變動,因為佔比小且太複雜,我們往往選擇戰略性忽略。
3. 手把手教你:用Python拆解時間序列
光説不練假把式。下面我們用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)
然後,使用 statsmodels 庫進行分解,它能幫我們一鍵拆解數據。
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()
從上面四個子圖可以看出:
- Observed (原始數據):你看到的真實銷量曲線,上躥下跳。
- Trend (趨勢):一條穩步向上的直線。這告訴老闆:放心,雖然每個月有波動,但咱們店整體是越做越好的!
- Seasonal (季節性):非常有規律的波浪線。這告訴店長:每年6-8月要多備貨,12-1月可以安排員工輪休。
- Resid (殘差/不規則項):圍繞0上下跳動的雜亂點。這是我們無法預測的隨機事件。
4. 分析師的內功:不僅僅是代碼
學會了上面的代碼,你已經入門了。但作為過來人,我想告訴你,工具和算法雖然層出不窮,但分析思路才是萬變不離其宗的。
首先,關注數據的平穩性,這是時間序列分析的門檻。
簡單説,大部分複雜的統計模型(如ARIMA)都假設數據的性質(均值、方差)不隨時間變化。
然而現實數據(如股價、銷量)往往是不平穩的(有上漲趨勢),因此如果你發現數據一直在漲,可以試着做差分(用今天的數減去昨天的數)。
差分後的數據往往就平穩了,更容易放入模型去訓練。
其次,結合業務場景,不要死記硬背模型,還要看場景。
比如:
- 場景A:電商大促預測(雙11)
- 特點:有極強的季節性(每年11月暴漲)。
- 策略:重點分析季節變動。如果只看趨勢,你會被雙11的數據嚇死,或者在雙11備貨不足。
- 熱點關聯:就像分析“淄博燒烤”或“哈爾濱旅遊”,必須考慮節假日這個強季節因子。
- 場景B:股票價格預測
- 特點:不規則變動(噪音)極大,甚至噪音掩蓋了趨勢。
- 策略:這種時候,簡單的分解模型往往失效。需要引入更多外部變量(新聞、政策),或者使用更高級的深度學習模型。
- 場景C:服務器流量監控
- 特點:白天高、深夜低,週末低、工作日高。
- 策略:這是最標準的週期性數據,非常適合用來做異常檢測(比如某天深夜流量突然暴漲,肯定是有黑客攻擊或系統Bug,因為這違背了季節性規律)。
5. 總結與建議
時間序列分析並沒有想象中那麼神秘。它的本質就是:承認歷史會重演,但也接納未來的不確定性。
對於剛入行的朋友,我的建議是:
- 理解四大成分(趨勢、季節、循環、噪音)是基礎中的基礎。
- 抓住主要矛盾:在做預測時,優先搞定趨勢和季節性。
- 多動手嘗試:比如把上面的
Python代碼跑一遍,嘗試修改一下數據,看看結果有什麼變化。
未來的分析方法雖然會越來越多,AI也會越來越強,但這種 “透過現象(原始數據)看本質(趨勢與規律)” 的分析思維,將是我們職業生涯中永恆不變的寶貴財富。