1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 10家不同商店50种不同商品销售量预测数据

10家不同商店50种不同商品销售量预测数据

时间:2019-10-24 19:56:03

相关推荐

10家不同商店50种不同商品销售量预测数据

预测10家商店未来三个月50种商品的销售量

一.前言

目前拥有10家店50种商品过去5年内的销售量,尝试通过建立ARIMAL,回归,GBDT模型来预测未来一年的销量

时间序列提供了预测未来价值的机会。 基于以前的价值观,可以使用时间序列来预测经济,天气和能力规划的趋势。 时间序列数据的具体属性意味着通常需要专门的统计方法。

数据分析前提几个问题

50种商品在过去5年的销售量表现状况如何?10家商店在过去5年的销售量表现状况如何?50种商品销售量与时间的联系如何?通过10家商店50种商品过去5年的销售量来预测未来三个月50种商品的销售量,表现如何?

二.数据分析与探索

导入相应的库和数据,并进行初观察

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport statsmodels.api as smimport gcimport lightgbm as lgbfrom xgboost import XGBRegressorfrom sklearn.metrics import r2_scorefrom sklearn.linear_model import LinearRegressionfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingRegressorfrom sklearn.model_selection import TimeSeriesSplit, KFold, GridSearchCV, train_test_splitfrom statsmodels.tsa.seasonal import seasonal_decomposefrom statsmodels.tsa.stattools import adfullerimport warningswarnings.filterwarnings('always')warnings.filterwarnings('ignore')%matplotlib inline

df = pd.read_csv("/home/kesci/input/data9269/train.csv")df_pred = pd.read_csv("/home/kesci/input/data9269/test.csv")df["year_month"] = df["date"].str[: -3]df["date"] = pd.to_datetime(df["date"])df["year"] = df["date"].dt.yeardf["month"] = df["date"].dt.monthdf["week"] = df["date"].dt.weekday_namedf["store"] = df["store"].apply(lambda x: "store {}".format(x))df["item"] = df["item"].apply(lambda x: "item {}".format(x))

50种商品在过去5年的销售量表现状况

plt.figure(figsize=(16, 6))plt.title("Product Sales Volume")sns.set(style="whitegrid")df.groupby("item")["sales"].sum().plot(kind="bar");

10家商店在过去5年的销售量表现状况

plt.figure(figsize=(16, 6))plt.title("Store Sales Volume")df.groupby("store")["sales"].sum().plot(kind="bar");

50种商品销售量与时间的联系

def plot_salesvolume(store, item, col):data = df.query("store == store and item == item")y = data.groupby(col)["sales"].sum()plt.figure(figsize=(14, 4))plt.xticks(rotation=90)plt.title("Product {} Sales Volume at Store {}".format(store, item))sns.lineplot(y.index, y)

销量与月份的关联性

plot_salesvolume(4, 7, "year_month")

销量与年份的关联性

plot_salesvolume(np.random.randint(1, 11), np.random.randint(1, 11), "year")

销量与月份的关联性

plot_salesvolume(np.random.randint(1, 11), np.random.randint(1, 11), "month")

销量与星期X的关联性

plot_salesvolume(np.random.randint(1, 11), np.random.randint(1, 11), "week")

三.建模与预测

数据清洗

week = pd.get_dummies(df.week)df = pd.concat([df, week], axis=1)feature_column = ['store', 'item', 'month', 'week']X = pd.DataFrame()y = df['sales']for i in feature_column:append_list = pd.get_dummies(df[i])X = pd.concat([X, append_list], axis =1)

时间序列

y_r.index = df["date"]

def test_stationarity(timeseries):#Determing rolling statisticsrolmean = y_r.rolling(12).mean().bfill()rolstd = y_r.rolling(12).std().bfill()#Plot rolling statistics:plt.figure(figsize=(16,6))orig = plt.plot(timeseries, color='blue',label='Original')mean = plt.plot(rolmean, color='red', label='Rolling Mean')std = plt.plot(rolstd, color='black', label = 'Rolling Std')plt.legend(loc='best')plt.title('Rolling Mean & Standard Deviation')plt.show(block=False)

test_stationarity(y_r)

y_r.rolling(3).mean().bfill().plot(figsize=(16,6));

先尝试用随机森林分类建模预测及观察特征

plt.figure(figsize=(16, 6))sns.distplot(df['sales']);

cut_list = []for i in range(5):cut_list.append(np.percentile(df['sales'], i*25))print(cut_list)y_ = pd.cut(df['sales'], cut_list).astype(str)

time: 341 µs

X_train, X_test, y_train, y_test = train_test_split(X, y_, test_size=0.2, random_state=40)clf = RandomForestClassifier().fit(X_train, y_train)print("train score: {:.4f}".format(clf.score(X_train, y_train)))print("test score: {:.4f}".format(clf.score(X_test, y_test)))

train score: 0.8424test score: 0.7471time: 43.3 s

best_rf = pd.DataFrame({})i = 0for n_estimator in np.arange(1, 52, 10):for min_samples_leaf in np.arange(1, 10, 2):clf = RandomForestClassifier(n_jobs=-1,n_estimators=n_estimator,min_samples_leaf=min_samples_leaf)clf.fit(X_train, y_train)train_score = clf.score(X_train, y_train)test_score = clf.score(X_test, y_test)print("train score: {:.4f}".format(train_score))print("test score: {:.4f}".format(test_score))best_rf.loc[i, 'n_estimator'] = n_estimatorbest_rf.loc[i, 'min_samples_leaf'] = min_samples_leafbest_rf.loc[i, 'train_score'] = train_scorebest_rf.loc[i, 'test_score'] = test_scorei += 1

time: 439 µs

best_rf[['train_score', 'test_score']].plot(figsize=(16, 6));

time: 399 ms

model_rf = RandomForestClassifier(n_jobs=-1,n_estimators=51,min_samples_leaf=3) #建立RandomForestClassifiermodel_rf.fit(X_train, y_train) # 训练交叉检验模型print("train score: {:.4f}".format(model_rf.score(X_train, y_train)))print("test score: {:.4f}".format(model_rf.score(X_test, y_test)))

train score: 0.8316test score: 0.7854time: 3min 8s

影响销量的特征

pd.Series(model_rf .feature_importances_, X.columns).sort_values(ascending=False).plot.bar(figsize=(16, 6));

time: 1.58 s

使用DecisionTreeRegressor建模,预测销量

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)dt_Regressor = DecisionTreeRegressor().fit(X_train, y_train)print("train score: {:.4f}".format(dt_Regressor.score(X_train, y_train)))print("test score: {:.4f}".format(dt_Regressor.score(X_test, y_test)))

# #设置参数矩阵:param_grid = [{'min_samples_split': np.arange(2, 5)}]dt_sv = GridSearchCV(DecisionTreeRegressor(), param_grid, cv=5)dt_sv.fit(X, y)

print("best param:{0}\nbest score:{1}".format(dt_sv.best_params_, r2_score(dt_sv.predict(X), y)))dtr_best = dt_sv.best_estimator_

best param:{'min_samples_split': 4}best score:0.8842986156506648

plt.style.use("ggplot") # 应用ggplot自带样式库plt.figure(figsize=(16, 6)) # 建立画布对象plt.plot(np.arange(X.shape[0]), y, label='True') # 画出原始变量的曲线plt.plot(np.arange(X.shape[0]), dt_Regressor.predict(X), label='Predicted.') # 画出预测变量曲线plt.legend(loc=0) # 设置图例位置plt.show() # 展示图像

time: 3.97 s

使用线性回归建模,预测销量

plt.scatter(x= df["year"].values, y = y, alpha = 0.2)

<matplotlib.collections.PathCollection at 0x7ffb17cb47b8>

lr = LinearRegression().fit(pd.DataFrame(df["year"]), y)

将两个模型合并,预测销量

X_dt = pd.Series(dtr_best.predict(X))X_lr = pd.Series(lr.predict(pd.DataFrame(df["year"])))XX = pd.concat([X_lr, X_dt], axis=1)XX_train, XX_test, yy_train, yy_test = train_test_split(XX, y, test_size=0.2, random_state=1)

直接用GradientBoostingRegressor融合两个模型

final_model = GradientBoostingRegressor().fit(XX_train, yy_train)print(r2_score(y, final_model.predict(XX)))

0.9394880975999979

model_gbr = GradientBoostingRegressor() # 建立GradientBoostingRegressor回归对象parameters = {'loss': ['ls', 'lad'],'min_samples_leaf': [2, 3, 4],'alpha': [0.3, 0.6, 0.9]} # 定义要优化的参数信息model_final = GridSearchCV(estimator=model_gbr, param_grid=parameters, cv=5) # 建立交叉检验模型对象model_final.fit(XX, y) # 训练交叉检验模型print ('Best score is:', model_final.best_score_) # 获得交叉检验模型得出的最优得分print ('Best parameter is:', model_final.best_params_) # 获得交叉检验模型得出的最优参数

plt.style.use("ggplot") # 应用ggplot自带样式库plt.figure(figsize=(16, 6)) # 建立画布对象plt.plot(np.arange(XX.shape[0]), y, label='true y') # 画出原始变量的曲线plt.plot(np.arange(XX.shape[0]), final_model.predict(XX), label='predicted y') # 画出预测变量曲线plt.legend(loc=0) # 设置图例位置plt.show() # 展示图像

三.总结和评估

50种商品在过去5年的总销售量才30W-160W之间,15号产品销量最好,5号产品销量最差10家店铺在过去5年的总销售量才300W-620W之间,2号店销量最好,7号店销量最差产品的销量逐年递增,呈周期性波动;每年7月销量最好,1月销量最差;周末销量最好,周一销量最差通过10家商店50种商品过去5年的销售量来预测未来三个月50种商品的销售量,开始先用决策树训练离散数据,用回归训练连续数据,直接训练速度和方差都较大, 将两个模型融合后 r2_score由80%提升到93,9%

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。