用Python預(yù)測2020年雙十一交易額
你好,我是林驥。
去年雙十一的時候,我曾利用算法預(yù)測過阿里巴巴 2019 年雙十一交易額,并做了復(fù)盤總結(jié)(本文結(jié)尾處有當時預(yù)測和復(fù)盤的文章鏈接)。
今年的雙十一,規(guī)則發(fā)生了很大的變化,從 10 月 21 日就開始預(yù)售,11 月 1 日到 3 日啟動第一波銷售。面對越來越復(fù)雜的規(guī)則,許多消費者都感覺「智商不夠用了」,而那些沒時間研究規(guī)則的人,將付出更高的價格,形成一種「價格歧視」,這就是經(jīng)典的商業(yè)策略。
另外,市場環(huán)境也發(fā)生了很大的變化,疫情對雙十一的影響到底有多大?是正向的影響還是負向的影響?各種不確定性的因素交織在一起,無疑會大大增加預(yù)測的難度。
本文將不去探究這些細節(jié),而是基于一種機器學(xué)習(xí)的算法,對 2020 年雙十一交易額進行預(yù)測。重點在于學(xué)習(xí)和運用 Python,去解決實際的問題,并舉一反三,在實戰(zhàn)中鍛煉數(shù)據(jù)分析的思維和應(yīng)用的能力。
1. 安裝和導(dǎo)入模塊
首先,我們確認安裝好了 Python 中的 scikit-learn 模塊:
pip?install?sklearn
要測試模塊是否正確安裝,可以在 Jupyter Lab 中運行以下代碼:
import?sklearn?as?sk
#?查看版本
sk.__version__
如果該模塊正確安裝,就會輸出版本號。
2. 構(gòu)造和定義數(shù)據(jù)
其次,我們構(gòu)造 2009 - 2019 每年的交易額數(shù)據(jù)框,并定義相應(yīng)的變量,為下一步調(diào)用算法做好準備。
import?numpy?as?np
import?pandas?as?pd
#?生成數(shù)據(jù)
year?=?np.array(range(2009,?2020))
data?=?[0.52,9.36,52,191,350,571,912,1207,1682,2135,2684]
df?=?pd.DataFrame({'年份':?year,?'交易額':?data})
#?x?年份
x?=?np.array(df.iloc[:,?0]).reshape(-1,?1)
#?y?交易額
y?=?np.array(df.iloc[:,?1])
#?z?預(yù)測的年份
z?=?[[2020]]
3. 調(diào)用算法和預(yù)測
然后,我們調(diào)用 sklearn 中的多項式回歸算法,其中 degree=2 代表利用「二次多項式」進行擬合。
from?sklearn.pipeline?import?Pipeline
from?sklearn.preprocessing?import?PolynomialFeatures
from?sklearn.preprocessing?import?StandardScaler
from?sklearn.linear_model?import?LinearRegression
#?用管道的方式調(diào)用多項式回歸算法
poly_reg?=?Pipeline([
????('ploy',?PolynomialFeatures(degree=2)),
????('std_scaler',?StandardScaler()),
????('lin_reg',?LinearRegression())
])
poly_reg.fit(x,?y)
#?調(diào)用算法進行預(yù)測
predict?=?poly_reg.predict(z)
#?輸出預(yù)測結(jié)果
print('預(yù)測2020年雙十一交易額為?%.0f?億元'?%?predict[0])
print('算法評分為?%.6f'?%?poly_reg.score(x,?y))
輸出結(jié)果為:
預(yù)測2020年雙十一交易額為 3280 億元?
算法評分為 0.999632
4. 預(yù)測數(shù)據(jù)可視化
下面用 matplotlib 畫一張圖,以便更加直觀地展現(xiàn)預(yù)測的結(jié)果:
import?matplotlib.pyplot?as?plt
#?設(shè)置圖像大小
fig,?ax?=?plt.subplots(figsize=(9,?6))
#?設(shè)置正常顯示中文標簽
plt.rcParams['font.sans-serif']?=?['SimHei']
#?繪制散點圖
ax.scatter(x,?y,?color='#00589F',?s=100)
ax.scatter(z,?predict,?color='#F68F00',?marker='*',?s=260)
#?設(shè)置標簽字體大小
ax.tick_params(labelsize=16)
#?隱藏邊框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_color('#999999')
ax.spines['left'].set_color('#999999')
#?繪制預(yù)測線
x2?=?np.concatenate([x,?z])
y2?=?poly_reg.predict(x2)
ax.plot(x2,?y2,?'--',?c='#999999')
ax.set_title('\n預(yù)測2020年雙十一交易額為%.0f億元\n'%predict[0],?fontsize=26,?loc='left')
plt.show()

5. 最后的話
以上是基于歷史數(shù)據(jù)進行預(yù)測的結(jié)果,其中包含 11 月 1 日到 3 日,以及 11 月 11 日,合計四天的總交易額,沒有考慮市場環(huán)境的變化。
吳軍在《浪潮之巔》中說:
幾乎所有好的投資人,都不再對資本市場做預(yù)測,而是不斷根據(jù)市場變化做出反應(yīng)并進行調(diào)整。巴菲特如此,索羅斯也是如此。
我們必須承認各種不確定性,并且利用數(shù)據(jù)和信息去消除它們。對于變化,我們不能過多相信過去經(jīng)驗得到的正統(tǒng)的預(yù)測結(jié)果,而是要主動地運用控制論的原理,動態(tài)地調(diào)整我們的工作狀態(tài)和目標。
雖然數(shù)據(jù)是動態(tài)變化的,但背后的算法是基本不變的,分析思維也是基本不變的。
所以,重新審視我們的目標,應(yīng)該不是未卜先知,而是運用科學(xué)的方法和思維,在擁抱變化的同時,借助數(shù)據(jù)和信息,盡量消除不確定性,動態(tài)調(diào)整應(yīng)對的策略。
往期推薦

長按下方的二維碼,關(guān)注林驥的公眾號,更多干貨早知道。
歡迎加入我的免費知識星球,我每天都會在星球內(nèi)分享讀書筆記和思考感悟,點擊左下角的閱讀原文即可加入。
