作者:林骥
去年双十一的时候,我曾复盘过阿里巴巴 2019 年双十一交易额。
今年的双十一,规则发生了很大的变化,从 10 月 21 日就开始预售,11 月 1 日到 3 日启动第一波销售。面对越来越复杂的规则,许多消费者都感觉「智商不够用了」,而那些没时间研究规则的人,将付出更高的价格,形成一种「价格歧视」,这就是经典的商业策略。
另外,市场环境也发生了很大的变化,疫情对双十一的影响到底有多大?是正向的影响还是负向的影响?各种不确定性的因素交织在一起,无疑会大大增加预测的难度。
本文将不去探究这些细节,而是基于一种机器学习的算法,对 2020 年双十一交易额进行预测。重点在于学习和运用 Python,去解决实际的问题,并举一反三,在实战中锻炼数据分析的思维和应用的能力。
1. 安装和导入模块
首先,我们确认安装好了 Python 中的 scikit-learn 模块:
pip install sklearn
要测试模块是否正确安装,可以在 Jupyter Lab 中运行以下代码:
import sklearn as sk
# 查看版本
sk.__version__
如果该模块正确安装,就会输出版本号。
2. 构造和定义数据
其次,我们构造 2009 - 2019 每年的交易额数据框,并定义相应的变量,为下一步调用算法做好准备。
import numpy as np
import pandas as pd
# 生成数据
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 预测的年份
z = [[2020]]
3. 调用算法和预测
然后,我们调用 sklearn 中的多项式回归算法,其中 degree=2 代表利用「二次多项式」进行拟合。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
# 用管道的方式调用多项式回归算法
poly_reg = Pipeline([
('ploy', PolynomialFeatures(degree=2)),
('std_scaler', StandardScaler()),
('lin_reg', LinearRegression())
])
poly_reg.fit(x, y)
# 调用算法进行预测
predict = poly_reg.predict(z)
# 输出预测结果
print('预测2020年双十一交易额为 %.0f 亿元' % predict[0])
print('算法评分为 %.6f' % poly_reg.score(x, y))
输出结果为:
预测2020年双十一交易额为 3280 亿元 算法评分为 0.999632
4. 预测数据可视化
下面用 matplotlib 画一张图,以便更加直观地展现预测的结果:
import matplotlib.pyplot as plt
# 设置图像大小
fig, ax = plt.subplots(figsize=(9, 6))
# 设置正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 绘制散点图
ax.scatter(x, y, color='#00589F', s=100)
ax.scatter(z, predict, color='#F68F00', marker='*', s=260)
# 设置标签字体大小
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')
# 绘制预测线
x2 = np.concatenate([x, z])
y2 = poly_reg.predict(x2)
ax.plot(x2, y2, '--', c='#999999')
ax.set_title('\n预测2020年双十一交易额为%.0f亿元\n'%predict[0], fontsize=26, loc='left')
plt.show()
5. 最后的话
以上是基于历史数据进行预测的结果,其中包含 11 月 1 日到 3 日,以及 11 月 11 日,合计四天的总交易额,没有考虑市场环境的变化。
吴军在《浪潮之巅》中说:
几乎所有好的投资人,都不再对资本市场做预测,而是不断根据市场变化做出反应并进行调整。巴菲特如此,索罗斯也是如此。 我们必须承认各种不确定性,并且利用数据和信息去消除它们。对于变化,我们不能过多相信过去经验得到的正统的预测结果,而是要主动地运用控制论的原理,动态地调整我们的工作状态和目标。
虽然数据是动态变化的,但背后的算法是基本不变的,分析思维也是基本不变的。
所以,重新审视我们的目标,应该不是未卜先知,而是运用科学的方法和思维,在拥抱变化的同时,借助数据和信息,尽量消除不确定性,动态调整应对的策略。