拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

原文链接:http://tecdat.cn/?p=17748

 

在数据科学学习之旅中,我经常处理日常工作中的时间序列数据集,并据此做出预测。

我将通过以下步骤:

探索性数据分析(EDA)

  • 问题定义(我们要解决什么)
  • 变量识别(我们拥有什么数据)
  • 单变量分析(了解数据集中的每个字段)
  • 多元分析(了解不同领域和目标之间的相互作用)
  • 缺失值处理
  • 离群值处理
  • 变量转换

预测建模

  • LSTM
  • XGBoost

问题定义

我们在两个不同的表中提供了商店的以下信息:

  • 商店:每个商店的ID
  • 销售:特定日期的营业额(我们的目标变量)
  • 客户:特定日期的客户数量
  • StateHoliday:假日
  • SchoolHoliday:学校假期
  • StoreType:4个不同的商店:a,b,c,d
  • CompetitionDistance:到最近的竞争对手商店的距离(以米为单位)
  • CompetitionOpenSince [月/年]:提供最近的竞争对手开放的大致年份和月份
  • 促销:当天促销与否
  • Promo2:Promo2是某些商店的连续和连续促销:0 =商店不参与,1 =商店正在参与
  • PromoInterval:描述促销启动的连续区间,并指定重新开始促销的月份。

利用所有这些信息,我们预测未来6周的销售量。

 

  1.  
    # 让我们导入EDA所需的库:
  2.  
     
  3.  
    import numpy as np # 线性代数
  4.  
    import pandas as pd # 数据处理,CSV文件I / O导入(例如pd.read_csv)
  5.  
    import matplotlib.pyplot as plt
  6.  
    import seaborn as sns
  7.  
    from datetime import datetime
  8.  
    plt.style.use("ggplot") # 绘图
  9.  
     
  10.  
     
  11.  
    #导入训练和测试文件:
  12.  
    train_df = pd.read_csv("../Data/train.csv")
  13.  
    test_df = pd.read_csv("../Data/test.csv")
  14.  
     
  15.  
     
  16.  
    #文件中有多少数据:
  17.  
    print("在训练集中,我们有", train_df.shape[0], "个观察值和", train_df.shape[1], 列/变量。")
  18.  
    print("在测试集中,我们有", test_df.shape[0], "个观察值和", test_df.shape[1], "列/变量。")
  19.  
    print("在商店集中,我们有", store_df.shape[0], "个观察值和", store_df.shape[1], "列/变量。")
  20.  
     

在训练集中,我们有1017209个观察值和9列/变量。
在测试集中,我们有41088个观测值和8列/变量。
在商店集中,我们有1115个观察值和10列/变量。

首先让我们清理  训练数据集。

 

  1.  
    #查看数据
  2.  
    train_df.head().append(train_df.tail()) #显示前5行。

 

  1.  
    train_df.isnull().all()
  2.  
    Out[5]:
  3.  
     
  4.  
    Store False
  5.  
    DayOfWeek False
  6.  
    Date False
  7.  
    Sales False
  8.  
    Customers False
  9.  
    Open False
  10.  
    Promo False
  11.  
    StateHoliday False
  12.  
    SchoolHoliday False
  13.  
    dtype: bool

让我们从第一个变量开始->  销售量

  1.  
     
  2.  
     
  3.  
    opened_sales = (train_df[(train_df.Open == 1) #如果商店开业
  4.  
    opened_sales.Sales.describe()
  5.  
    Out[6]:
  6.  
     
  7.  
    count 422307.000000
  8.  
    mean 6951.782199
  9.  
    std 3101.768685
  10.  
    min 133.000000
  11.  
    25% 4853.000000
  12.  
    50% 6367.000000
  13.  
    75% 8355.000000
  14.  
    max 41551.000000
  15.  
    Name: Sales, dtype: float64
  16.  
     
  17.  
     
  18.  
    <matplotlib.axes._subplots.AxesSubplot at 0x7f7c38fa6588>

 

看一下顾客变量

  1.  
    In [9]:
  2.  
     
  3.  
    train_df.Customers.describe()
  4.  
    Out[9]:
  5.  
     
  6.  
    count 1.017209e+06
  7.  
    mean 6.331459e+02
  8.  
    std 4.644117e+02
  9.  
    min 0.000000e+00
  10.  
    25% 4.050000e+02
  11.  
    50% 6.090000e+02
  12.  
    75% 8.370000e+02
  13.  
    max 7.388000e+03
  14.  
    Name: Customers, dtype: float64
  15.  
     
  16.  
    <matplotlib.axes._subplots.AxesSubplot at 0x7f7c3565d240>

 
train_df[(train_df.Customers > 6000)]

 

我们看一下假期 变量。

 
train_df.StateHoliday.value_counts()
 
  1.  
    0 855087
  2.  
    0 131072
  3.  
    a 20260
  4.  
    b 6690
  5.  
    c 4100
  6.  
    Name: StateHoliday, dtype: int64

 

train_df.StateHoliday_cat.count()

 

1017209

 

train_df.tail()

 
  1.  
     
  2.  
    train_df.isnull().all() #检查缺失
  3.  
    Out[18]:
  4.  
     
  5.  
    Store False
  6.  
    DayOfWeek False
  7.  
    Date False
  8.  
    Sales False
  9.  
    Customers False
  10.  
    Open False
  11.  
    Promo False
  12.  
    SchoolHoliday False
  13.  
    StateHoliday_cat False
  14.  
    dtype: bool

让我们继续进行商店分析

 

store_df.head().append(store_df.tail())

 

  1.  
    #缺失数据:
  2.  
     
  3.  
     
  4.  
    Store 0.000000
  5.  
    StoreType 0.000000
  6.  
    Assortment 0.000000
  7.  
    CompetitionDistance 0.269058
  8.  
    CompetitionOpenSinceMonth 31.748879
  9.  
    CompetitionOpenSinceYear 31.748879
  10.  
    Promo2 0.000000
  11.  
    Promo2SinceWeek 48.789238
  12.  
    Promo2SinceYear 48.789238
  13.  
    PromoInterval 48.789238
  14.  
    dtype: float64
  15.  
    In [21]:
  16.  
     

让我们从缺失的数据开始。第一个是 CompetitionDistance

  1.  
     
  2.  
    store_df.CompetitionDistance.plot.box()

让我看看异常值,因此我们可以在均值和中位数之间进行选择来填充NaN
 

 

缺少数据,因为商店没有竞争。 因此,我建议用零填充缺失的值。
  1.  
     
  2.  
    store_df["CompetitionOpenSinceMonth"].fillna(0, inplace = True)

让我们看一下促销活动。

 

store_df.groupby(by = "Promo2", axis = 0).count() 

 

如果未进行促销,则应将“促销”中的NaN替换为零 

我们合并商店数据和训练集数据,然后继续进行分析。

第一,让我们按销售量、客户等比较商店。

 

  1.  
    f, ax = plt.subplots(2, 3, figsize = (20,10))
  2.  
     
  3.  
    plt.subplots_adjust(hspace = 0.3)
  4.  
    plt.show()

 

从图中可以看出,StoreType A拥有最多的商店,销售和客户。但是,StoreType D的平均每位客户平均支出最高。只有17家商店的StoreType B拥有最多的平均顾客。

 

我们逐年查看趋势。

 

  1.  
    sns.factorplot(data = train_store_df,
  2.  
    # 我们可以看到季节性,但看不到趋势。 该销售额每年保持不变
  3.  
     
  4.  
     
  5.  
    <seaborn.axisgrid.FacetGrid at 0x7f7c350e0c50>


 

我们看一下相关图。

  1.  
    "CompetitionOpenSinceMonth", "CompetitionOpenSinceYear", "Promo2
  2.  
     
  3.  
    <matplotlib.axes._subplots.AxesSubplot at 0x7f7c33d79c18>

 

 

 

我们可以得到相关性:

  • 客户与销售(0.82)
  • 促销与销售(0,82)
  • 平均顾客销量 vs促销(0,28)
  • 商店类别 vs 平均顾客销量 (0,44)

我的分析结论:

  • 商店类别 A拥有最多的销售和顾客。
  • 商店类别 B的每位客户平均销售额最低。因此,我认为客户只为小商品而来。
  • 商店类别 D的购物车数量最多。
  • 促销仅在工作日进行。
  • 客户倾向于在星期一(促销)和星期日(没有促销)购买更多商品。
  • 我看不到任何年度趋势。仅季节性模式。

最受欢迎的见解

1.在python中使用lstm和pytorch进行时间序列预测

2.python中利用长短期记忆模型lstm进行时间序列预测分析

3.使用r语言进行时间序列(arima,指数平滑)分析

4.r语言多元copula-garch-模型时间序列预测

5.r语言copulas和金融时间序列案例

6.使用r语言随机波动模型sv处理时间序列中的随机波动

7.r语言时间序列tar阈值自回归模型

8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

9.python3用arima模型进行时间序列预测

posted @ 2020-11-13 12:38  拓端tecdat  阅读(1081)  评论(0编辑  收藏  举报